Package org.eclipse.egit.ui.internal.commit

Source Code of org.eclipse.egit.ui.internal.commit.CommitJob

/*******************************************************************************
* Copyright (c) 2012-2014 Red Hat, Inc. Distributed under license by Red Hat, Inc.
* 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:
*    Andre Dietisheim - initial API and implementation
*    Mickael Istria - 441231 Use simple push wizard
*******************************************************************************/

package org.eclipse.egit.ui.internal.commit;

import java.io.IOException;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.egit.core.op.CommitOperation;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.JobFamilies;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.decorators.GitLightweightDecorator;
import org.eclipse.egit.ui.internal.dialogs.CommitMessageComponentStateManager;
import org.eclipse.egit.ui.internal.push.PushBranchWizard;
import org.eclipse.egit.ui.internal.push.PushOperationUI;
import org.eclipse.egit.ui.internal.push.SimpleConfigurePushDialog;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;

/**
* Executes a given commit operation on a given repository. Will also eventually
* show the commit that was performed and push the repository upstream.
*/
public class CommitJob extends Job {

  private CommitOperation commitOperation;

  private Repository repository;

  private boolean openCommitEditor;

  private boolean pushUpstream;

  /**
   * @param repository
   *            the repository to commit to
   * @param commitOperation
   *            the commit operation to use
   *
   */
  public CommitJob(final Repository repository,
      final CommitOperation commitOperation) {
    super(UIText.CommitAction_CommittingChanges);
    this.repository = repository;
    this.commitOperation = commitOperation;
  }

  /**
   * Sets this job to open the commit editor after committing.
   *
   * @param openCommitEditor
   * @return this job instance
   */
  public CommitJob setOpenCommitEditor(boolean openCommitEditor) {
    this.openCommitEditor = openCommitEditor;
    return this;
  }

  /**
   * Sets this job to push the changes upstream after successfully committing.
   * @param pushUpstream
   * @return this commit job instance
   */
  public CommitJob setPushUpstream(boolean pushUpstream) {
    this.pushUpstream = pushUpstream;
    return this;
  }

  @Override
  protected IStatus run(IProgressMonitor monitor) {
    RevCommit commit = null;
    try {
      commitOperation.execute(monitor);
      commit = commitOperation.getCommit();
      CommitMessageComponentStateManager.deleteState(repository);
      RepositoryMapping mapping = RepositoryMapping
          .findRepositoryMapping(repository);
      if (mapping != null)
        mapping.fireRepositoryChanged();
    } catch (CoreException e) {
      if (e.getCause() instanceof JGitInternalException)
        return Activator.createErrorStatus(e.getLocalizedMessage(),
            e.getCause());
      return Activator.createErrorStatus(
          UIText.CommitAction_CommittingFailed, e);
    } finally {
      GitLightweightDecorator.refresh();
    }

    if (commit != null) {
      if (openCommitEditor)
        openCommitEditor(commit);
      if (pushUpstream)
        pushUpstream(commit);
    }
    return Status.OK_STATUS;
  }

  private void openCommitEditor(final RevCommit newCommit) {
    PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {

      public void run() {
        CommitEditor.openQuiet(new RepositoryCommit(repository,
            newCommit));
      }
    });
  }

  private void pushUpstream(final RevCommit commit) {
    RemoteConfig config = SimpleConfigurePushDialog
        .getConfiguredRemote(repository);
    if (config == null) {
      final Display display = Display.getDefault();
      display.asyncExec(new Runnable() {

        public void run() {
          try {
            PushBranchWizard pushWizard = null;
            String fullBranch = repository.getFullBranch();
            if (fullBranch != null
                && fullBranch.startsWith(Constants.R_HEADS)) {
              Ref ref = repository.getRef(fullBranch);
              pushWizard = new PushBranchWizard(repository, ref);
            } else {
              pushWizard = new PushBranchWizard(repository,
                  commit.getId());
            }
            WizardDialog wizardDialog = new WizardDialog(display
                .getActiveShell(), pushWizard);
            wizardDialog.setHelpAvailable(true);
            wizardDialog.open();
          } catch (IOException e) {
            Activator.handleError(
                NLS.bind(UIText.CommitUI_pushFailedMessage, e),
                e, true);
          }
        }
      });
    } else {
      PushOperationUI op = new PushOperationUI(repository,
          config.getName(), false);
      op.start();
    }

  }

  @Override
  public boolean belongsTo(Object family) {
    if (JobFamilies.COMMIT.equals(family))
      return true;
    return super.belongsTo(family);
  }

}
TOP

Related Classes of org.eclipse.egit.ui.internal.commit.CommitJob

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.