Merge "Add 'CherryPickOf' field for a change"

This commit is contained in:
Martin Fick
2020-01-08 15:27:47 +00:00
committed by Gerrit Code Review
33 changed files with 413 additions and 12 deletions

View File

@@ -42,6 +42,7 @@ import com.google.gerrit.server.ReviewerSet;
import com.google.gerrit.server.change.ChangeInserter;
import com.google.gerrit.server.change.NotifyResolver;
import com.google.gerrit.server.change.PatchSetInserter;
import com.google.gerrit.server.change.SetCherryPickOp;
import com.google.gerrit.server.git.CodeReviewCommit;
import com.google.gerrit.server.git.CodeReviewCommit.CodeReviewRevWalk;
import com.google.gerrit.server.git.GitRepositoryManager;
@@ -102,6 +103,7 @@ public class CherryPickChange {
private final Provider<IdentifiedUser> user;
private final ChangeInserter.Factory changeInserterFactory;
private final PatchSetInserter.Factory patchSetInserterFactory;
private final SetCherryPickOp.Factory setCherryPickOfFactory;
private final MergeUtil.Factory mergeUtilFactory;
private final ChangeNotes.Factory changeNotesFactory;
private final ProjectCache projectCache;
@@ -118,6 +120,7 @@ public class CherryPickChange {
Provider<IdentifiedUser> user,
ChangeInserter.Factory changeInserterFactory,
PatchSetInserter.Factory patchSetInserterFactory,
SetCherryPickOp.Factory setCherryPickOfFactory,
MergeUtil.Factory mergeUtilFactory,
ChangeNotes.Factory changeNotesFactory,
ProjectCache projectCache,
@@ -131,6 +134,7 @@ public class CherryPickChange {
this.user = user;
this.changeInserterFactory = changeInserterFactory;
this.patchSetInserterFactory = patchSetInserterFactory;
this.setCherryPickOfFactory = setCherryPickOfFactory;
this.mergeUtilFactory = mergeUtilFactory;
this.changeNotesFactory = changeNotesFactory;
this.projectCache = projectCache;
@@ -368,7 +372,13 @@ public class CherryPickChange {
dest.project(),
destChanges.get(0).getId().get()));
}
changeId = insertPatchSet(bu, git, destChanges.get(0).notes(), cherryPickCommit);
changeId =
insertPatchSet(
bu,
git,
destChanges.get(0).notes(),
cherryPickCommit,
sourceChange.currentPatchSetId());
} else {
// Change key not found on destination branch. We can create a new
// change.
@@ -451,13 +461,22 @@ public class CherryPickChange {
}
private Change.Id insertPatchSet(
BatchUpdate bu, Repository git, ChangeNotes destNotes, CodeReviewCommit cherryPickCommit)
BatchUpdate bu,
Repository git,
ChangeNotes destNotes,
CodeReviewCommit cherryPickCommit,
PatchSet.Id sourcePatchSetId)
throws IOException {
Change destChange = destNotes.getChange();
PatchSet.Id psId = ChangeUtil.nextPatchSetId(git, destChange.currentPatchSetId());
PatchSetInserter inserter = patchSetInserterFactory.create(destNotes, psId, cherryPickCommit);
inserter.setMessage("Uploaded patch set " + inserter.getPatchSetId().get() + ".");
bu.addOp(destChange.getId(), inserter);
if (destChange.getCherryPickOf() == null
|| !destChange.getCherryPickOf().equals(sourcePatchSetId)) {
SetCherryPickOp cherryPickOfUpdater = setCherryPickOfFactory.create(sourcePatchSetId);
bu.addOp(destChange.getId(), cherryPickOfUpdater);
}
return destChange.getId();
}
@@ -477,6 +496,7 @@ public class CherryPickChange {
ChangeInserter ins = changeInserterFactory.create(changeId, cherryPickCommit, refName);
ins.setRevertOf(revertOf);
BranchNameKey sourceBranch = sourceChange == null ? null : sourceChange.getDest();
PatchSet.Id sourcePatchSetId = sourceChange == null ? null : sourceChange.currentPatchSetId();
ins.setMessage(
revertOf == null
? messageForDestinationChange(
@@ -484,6 +504,7 @@ public class CherryPickChange {
: "Uploaded patch set 1.") // For revert commits, the message should not include
// cherry-pick information.
.setTopic(topic)
.setCherryPickOf(sourcePatchSetId)
.setWorkInProgress(
(sourceChange != null && sourceChange.isWorkInProgress())
|| !cherryPickCommit.getFilesWithGitConflicts().isEmpty());

View File

@@ -40,6 +40,7 @@ import com.google.gerrit.server.change.PatchSetInserter;
import com.google.gerrit.server.change.RebaseChangeOp;
import com.google.gerrit.server.change.ReviewerResource;
import com.google.gerrit.server.change.SetAssigneeOp;
import com.google.gerrit.server.change.SetCherryPickOp;
import com.google.gerrit.server.change.SetHashtagsOp;
import com.google.gerrit.server.change.SetPrivateOp;
import com.google.gerrit.server.change.WorkInProgressOp;
@@ -201,6 +202,7 @@ public class Module extends RestApiModule {
factory(RebaseChangeOp.Factory.class);
factory(ReviewerResource.Factory.class);
factory(SetAssigneeOp.Factory.class);
factory(SetCherryPickOp.Factory.class);
factory(SetHashtagsOp.Factory.class);
factory(SetPrivateOp.Factory.class);
factory(WorkInProgressOp.Factory.class);