1 package com.proalpha.pds.gitutils.cherrypick;
3 import java.io.IOException;
4 import java.lang.reflect.InvocationTargetException;
5 import java.text.MessageFormat;
7 import org.eclipse.core.runtime.IProgressMonitor;
8 import org.eclipse.core.runtime.IStatus;
9 import org.eclipse.core.runtime.Status;
10 import org.eclipse.core.runtime.SubMonitor;
11 import org.eclipse.core.runtime.jobs.Job;
12 import org.eclipse.egit.core.EclipseGitProgressTransformer;
13 import org.eclipse.egit.ui.JobFamilies;
14 import org.eclipse.egit.ui.internal.staging.StagingView;
15 import org.eclipse.jface.dialogs.MessageDialog;
16 import org.eclipse.jgit.api.CherryPickResult.CherryPickStatus;
17 import org.eclipse.jgit.api.errors.GitAPIException;
18 import org.eclipse.jgit.lib.Constants;
19 import org.eclipse.jgit.lib.Repository;
20 import org.eclipse.swt.widgets.Display;
21 import org.eclipse.ui.PlatformUI;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
25 import com.proalpha.git.PaGit;
26 import com.proalpha.git.commands.PaIssueConveyanceCommand;
27 import com.proalpha.git.model.PaCherryPickResult;
28 import com.proalpha.git.util.PaBranchName;
29 import com.proalpha.git.util.PaCommitMsg;
30 import com.proalpha.git.util.PaRepository;
31 import com.proalpha.pds.gitutils.common.CheckoutOperation;
33 @SuppressWarnings(
"restriction")
36 private final Logger logger = LoggerFactory.getLogger(
CherryPickJob.class);
38 private int noOfCommits = 0;
41 super(MessageFormat.format(
"Cherry picking {0} commits", noOfCommits));
43 this.noOfCommits = noOfCommits;
47 protected IStatus run(IProgressMonitor monitor) {
49 PaIssueConveyanceCommand picCo =
CherryPick.getInstance().getCherryPickCommand();
51 PaCherryPickResult cpResult =
null;
52 CherryPickStatus cpStatus =
null;
54 final SubMonitor progress = SubMonitor.convert(monitor,
"pA CherryPick", this.noOfCommits + 2);
58 if (cherryPickSettings.getTargetBranchPoint().startsWith(Constants.DEFAULT_REMOTE_NAME))
59 coOp =
new CheckoutOperation(picCo.getRepository(), Constants.DEFAULT_REMOTE_NAME,
60 cherryPickSettings.getTargetBranchPoint(), PaBranchName.getShortBranchName(picCo.getTargetRef()),
61 cherryPickSettings.isUpdateTargetBranchPoint(),
65 coOp =
new CheckoutOperation(picCo.getRepository(), PaBranchName.getShortBranchName(picCo.getTargetRef()));
69 progress.setTaskName(
"Creating the target branch");
73 progress.setTaskName(
"Picking the commits");
75 .setProgressMonitor(
new EclipseGitProgressTransformer(progress.newChild(
this.noOfCommits)));
77 CherryPick.getInstance().setCherryPickResult(cpOp.getOperationResult());
79 cpResult =
CherryPick.getInstance().getCherryPickResult();
80 cpStatus =
CherryPick.getInstance().getCherryPickResult().getStatus();
82 if (cpStatus != CherryPickStatus.OK)
83 setConflictMessage(cherryPickSettings, cpResult);
86 PaRepository.disconnectRemote(
'_' + cherryPickSettings.getSourceRepoString());
88 }
catch (IOException | GitAPIException e) {
89 logger.error(
"Exception while disconnecting remote {}", picCo.getSourceRef(), e);
93 showResultDialog(monitor, picCo.getRepository(), cpResult);
94 }
catch (InvocationTargetException | GitAPIException e) {
95 Throwable cause = (e.getCause() ==
null) ? e : e.getCause();
96 String msg = cause.getMessage();
100 Display.getDefault().asyncExec(() -> MessageDialog.openError(
null,
"Cherry pick failed", msg));
105 if (
CherryPick.getInstance().getCherryPickResult() ==
null
106 ||
CherryPick.getInstance().getCherryPickResult() !=
null
107 &&
CherryPick.getInstance().getCherryPickResult().getStatus() == CherryPickStatus.OK)
112 return Status.OK_STATUS;
116 public boolean belongsTo(Object family) {
117 if (JobFamilies.CHERRY_PICK.equals(family))
119 return super.belongsTo(family);
122 private void setConflictMessage(
CherryPickSettings settings, PaCherryPickResult result) {
123 PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
124 StagingView view = (StagingView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
125 .findView(StagingView.VIEW_ID);
127 logger.debug(
"Commit failed: Initialize the commit msg of the git staging view.");
129 String msg = PaCommitMsg.getCherryPickMsg(settings.getTargetIssue(),
130 result.getOpenPicks().get(0).getFullMessage(), result.getOpenPicks().get(0).getId().name());
131 msg = msg + System.getProperty(
"line.separator");
132 msg = msg + System.getProperty(
"line.separator");
133 msg +=
"Conflict resolution: DO NOT EDIT THIS MESSAGE";
134 view.setCommitMessage(msg);
140 private void showResultDialog(IProgressMonitor monitor, Repository repository,
141 PaCherryPickResult cherryPickResult) {
142 PlatformUI.getWorkbench().getDisplay()
144 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), monitor, cherryPickResult)