Convert remaining submit strategies to BatchUpdate

Reuse the helper operations from the previous commit, so these are
simple and straightforward.

Change-Id: If7914f035905b2052c1c76f0c71daf8162be0e04
This commit is contained in:
Dave Borowitz
2016-01-11 12:20:40 -05:00
parent a5dea82286
commit c8e8c19bcb
2 changed files with 72 additions and 39 deletions

View File

@@ -14,9 +14,16 @@
package com.google.gerrit.server.git.strategy;
import static com.google.gerrit.server.git.strategy.MarkCleanMergesOp.anyChangeId;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.server.git.BatchUpdate;
import com.google.gerrit.server.git.BatchUpdate.RepoContext;
import com.google.gerrit.server.git.CodeReviewCommit;
import com.google.gerrit.server.git.IntegrationException;
import com.google.gerrit.server.git.MergeTip;
import com.google.gerrit.server.git.UpdateException;
import java.util.Collection;
import java.util.List;
@@ -27,24 +34,46 @@ public class FastForwardOnly extends SubmitStrategy {
}
@Override
public MergeTip run(final CodeReviewCommit branchTip,
final Collection<CodeReviewCommit> toMerge) throws IntegrationException {
public MergeTip run(CodeReviewCommit branchTip,
Collection<CodeReviewCommit> toMerge) throws IntegrationException {
List<CodeReviewCommit> sorted =
args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
MergeTip mergeTip = new MergeTip(branchTip, toMerge);
List<CodeReviewCommit> sorted = args.mergeUtil.reduceToMinimalMerge(
args.mergeSorter, toMerge);
final CodeReviewCommit newMergeTipCommit =
args.mergeUtil.getFirstFastForward(branchTip, args.rw, sorted);
mergeTip.moveTipTo(newMergeTipCommit, newMergeTipCommit);
try (BatchUpdate u = args.newBatchUpdate(TimeUtil.nowTs())) {
CodeReviewCommit newTipCommit =
args.mergeUtil.getFirstFastForward(branchTip, args.rw, sorted);
if (!newTipCommit.equals(branchTip)) {
u.addOp(newTipCommit.change().getId(),
new FastForwardOp(mergeTip, newTipCommit));
}
while (!sorted.isEmpty()) {
CodeReviewCommit n = sorted.remove(0);
u.addOp(n.change().getId(), new NotFastForwardOp(n));
}
u.addOp(anyChangeId(toMerge), new MarkCleanMergesOp(args, mergeTip));
while (!sorted.isEmpty()) {
final CodeReviewCommit n = sorted.remove(0);
n.setStatusCode(CommitMergeStatus.NOT_FAST_FORWARD);
u.execute();
} catch (RestApiException | UpdateException e) {
if (e.getCause() instanceof IntegrationException) {
throw new IntegrationException(e.getCause().getMessage(), e);
}
throw new IntegrationException(
"Cannot fast-forward into " + args.destBranch);
}
return mergeTip;
}
private static class NotFastForwardOp extends BatchUpdate.Op {
private final CodeReviewCommit toMerge;
private NotFastForwardOp(CodeReviewCommit toMerge) {
this.toMerge = toMerge;
}
args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag,
newMergeTipCommit, args.alreadyAccepted);
return mergeTip;
@Override
public void updateRepo(RepoContext ctx) {
toMerge.setStatusCode(CommitMergeStatus.NOT_FAST_FORWARD);
}
}
static boolean dryRun(SubmitDryRun.Arguments args,

View File

@@ -14,11 +14,15 @@
package com.google.gerrit.server.git.strategy;
import static com.google.gerrit.server.git.strategy.MarkCleanMergesOp.anyChangeId;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.server.git.BatchUpdate;
import com.google.gerrit.server.git.CodeReviewCommit;
import com.google.gerrit.server.git.IntegrationException;
import com.google.gerrit.server.git.MergeTip;
import org.eclipse.jgit.lib.PersonIdent;
import com.google.gerrit.server.git.UpdateException;
import java.util.Collection;
import java.util.List;
@@ -31,30 +35,30 @@ public class MergeAlways extends SubmitStrategy {
@Override
public MergeTip run(CodeReviewCommit branchTip,
Collection<CodeReviewCommit> toMerge) throws IntegrationException {
List<CodeReviewCommit> sorted = args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
MergeTip mergeTip;
if (branchTip == null) {
// The branch is unborn. Take a fast-forward resolution to
// create the branch.
mergeTip = new MergeTip(sorted.get(0), toMerge);
sorted.remove(0);
} else {
mergeTip = new MergeTip(branchTip, toMerge);
}
while (!sorted.isEmpty()) {
CodeReviewCommit mergedFrom = sorted.remove(0);
PersonIdent caller = args.caller.newCommitterIdent(
args.serverIdent.getWhen(), args.serverIdent.getTimeZone());
CodeReviewCommit newTip =
args.mergeUtil.mergeOneCommit(caller, args.serverIdent,
args.repo, args.rw, args.inserter, args.canMergeFlag,
args.destBranch, mergeTip.getCurrentTip(), mergedFrom);
mergeTip.moveTipTo(newTip, mergedFrom);
}
args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag,
mergeTip.getCurrentTip(), args.alreadyAccepted);
List<CodeReviewCommit> sorted =
args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
MergeTip mergeTip = new MergeTip(branchTip, toMerge);
try (BatchUpdate u = args.newBatchUpdate(TimeUtil.nowTs())) {
if (branchTip == null) {
// The branch is unborn. Take a fast-forward resolution to
// create the branch.
CodeReviewCommit first = sorted.remove(0);
u.addOp(first.change().getId(), new FastForwardOp(mergeTip, first));
}
while (!sorted.isEmpty()) {
CodeReviewCommit n = sorted.remove(0);
u.addOp(n.change().getId(), new MergeOneOp(args, mergeTip, n));
}
u.addOp(anyChangeId(toMerge), new MarkCleanMergesOp(args, mergeTip));
u.execute();
} catch (RestApiException | UpdateException e) {
if (e.getCause() instanceof IntegrationException) {
throw new IntegrationException(e.getCause().getMessage(), e);
}
throw new IntegrationException(
"Cannot merge into " + args.destBranch);
}
return mergeTip;
}