Package org.eclipse.egit.ui.internal.history.command

Source Code of org.eclipse.egit.ui.internal.history.command.AbstractRebaseHistoryCommandHandler

/*******************************************************************************
* Copyright (c) 2010, 2013 SAP AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Christian Halstrick (SAP AG) - initial implementation
*    Mathias Kinzler (SAP AG) - initial implementation
*    Robin Rosenberg - Adoption for the history menu
*    Tobias Pfeifer - Extracted from RebaseCurrentHandler
*******************************************************************************/

package org.eclipse.egit.ui.internal.history.command;

import java.io.IOException;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.egit.core.op.RebaseOperation;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.commands.shared.AbstractRebaseCommandHandler;
import org.eclipse.jgit.lib.BranchConfig;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectIdRef;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Ref.Storage;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.jgit.revplot.PlotCommit;
import org.eclipse.osgi.util.NLS;

/**
* Common class for rebase commands in the HistoryView
*/
public abstract class AbstractRebaseHistoryCommandHandler extends
    AbstractHistoryCommandHandler {

  @Override
  public boolean isEnabled() {
    final Repository repository = getRepository(getPage());
    if (repository == null)
      return false;
    return repository.getRepositoryState().equals(RepositoryState.SAFE);
  }

  public Object execute(ExecutionEvent event) throws ExecutionException {

    PlotCommit commit = (PlotCommit) getSelection(event).getFirstElement();
    final Repository repository = getRepository(event);
    if (repository == null)
      return null;

    String currentBranch = getCurrentBranch(repository);
    final Ref ref = getRef(commit, repository, currentBranch);

    String jobname = NLS.bind(
        UIText.RebaseCurrentRefCommand_RebasingCurrentJobName,
        currentBranch, ref.getName());
    AbstractRebaseCommandHandler rebaseCurrentRef = new AbstractRebaseCommandHandler(
        jobname, UIText.RebaseCurrentRefCommand_RebaseCanceledMessage) {
      @Override
      protected RebaseOperation createRebaseOperation(
          Repository repository2) throws ExecutionException {
        return AbstractRebaseHistoryCommandHandler.this
            .createRebaseOperation(
            repository2, ref);
      }
    };
    rebaseCurrentRef.execute(repository);
    return null;
  }

  /**
   * Factory method delegating creation of RebaseOperation to concrete
   * subclasses.
   *
   * @param repository
   * @param ref
   * @return the {@link RebaseOperation} to be executed
   */
  protected abstract RebaseOperation createRebaseOperation(
      Repository repository, Ref ref);

  /**
   * @param commit
   * @param repository
   * @param currentBranch
   * @return ref pointing to the given commit, prefers tracking branch if
   *         multiple refs are available
   */
  protected Ref getRef(PlotCommit commit, Repository repository,
      String currentBranch) {
    int count = commit.getRefCount();
    if (count == 0)
      return new ObjectIdRef.Unpeeled(Storage.LOOSE, commit.getName(), commit);
    else if (count == 1)
      return commit.getRef(0);
    else {
      BranchConfig branchConfig = new BranchConfig(repository.getConfig(), currentBranch);
      String trackingBranch = branchConfig.getTrackingBranch();
      Ref remoteRef = null;

      for (int i = 0; i < count; i++) {
        Ref ref = commit.getRef(i);
        if (trackingBranch != null && trackingBranch.equals(ref.getName()))
          return ref;
        if (ref.getName().startsWith(Constants.R_REMOTES))
          remoteRef = ref;
      }

      if (remoteRef != null)
        return remoteRef;
      else
        // We tried to pick a nice ref, just pick the first then
        return commit.getRef(0);
    }
  }

  /**
   * @param repository
   * @return the short name of the current branch that HEAD points to.
   * @throws ExecutionException
   */
  protected String getCurrentBranch(Repository repository)
      throws ExecutionException {
    try {
      return repository.getBranch();
    } catch (IOException e) {
      throw new ExecutionException(UIText.RebaseCurrentRefCommand_ErrorGettingCurrentBranchMessage, e);
    }
  }

}
TOP

Related Classes of org.eclipse.egit.ui.internal.history.command.AbstractRebaseHistoryCommandHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.