Merge changes Ib36ba8ba,Id988bce9

* changes:
  MergeOp: Always retain canMergeFlag on reset
  RebaseIfNecessary: Don't copy approvals
This commit is contained in:
Edwin Kempin
2016-02-01 08:20:06 +00:00
committed by Gerrit Code Review
5 changed files with 18 additions and 34 deletions

View File

@@ -135,6 +135,7 @@ public class MergeOp implements AutoCloseable {
rw.sort(RevSort.COMMIT_TIME_DESC, true); rw.sort(RevSort.COMMIT_TIME_DESC, true);
rw.setRetainBody(false); rw.setRetainBody(false);
canMergeFlag = rw.newFlag("CAN_MERGE"); canMergeFlag = rw.newFlag("CAN_MERGE");
rw.retainOnReset(canMergeFlag);
ins = repo.newObjectInserter(); ins = repo.newObjectInserter();
branches = Maps.newHashMapWithExpectedSize(1); branches = Maps.newHashMapWithExpectedSize(1);

View File

@@ -452,21 +452,20 @@ public class MergeUtil {
public CodeReviewCommit mergeOneCommit(PersonIdent author, public CodeReviewCommit mergeOneCommit(PersonIdent author,
PersonIdent committer, Repository repo, CodeReviewRevWalk rw, PersonIdent committer, Repository repo, CodeReviewRevWalk rw,
ObjectInserter inserter, RevFlag canMergeFlag, Branch.NameKey destBranch, ObjectInserter inserter, Branch.NameKey destBranch,
CodeReviewCommit mergeTip, CodeReviewCommit n) CodeReviewCommit mergeTip, CodeReviewCommit n)
throws IntegrationException { throws IntegrationException {
final ThreeWayMerger m = newThreeWayMerger(repo, inserter); final ThreeWayMerger m = newThreeWayMerger(repo, inserter);
try { try {
if (m.merge(new AnyObjectId[] {mergeTip, n})) { if (m.merge(new AnyObjectId[] {mergeTip, n})) {
return writeMergeCommit(author, committer, rw, inserter, canMergeFlag, return writeMergeCommit(author, committer, rw, inserter, destBranch,
destBranch, mergeTip, m.getResultTreeId(), n); mergeTip, m.getResultTreeId(), n);
} else { } else {
failed(rw, canMergeFlag, mergeTip, n, CommitMergeStatus.PATH_CONFLICT); failed(rw, mergeTip, n, CommitMergeStatus.PATH_CONFLICT);
} }
} catch (NoMergeBaseException e) { } catch (NoMergeBaseException e) {
try { try {
failed(rw, canMergeFlag, mergeTip, n, failed(rw, mergeTip, n, getCommitMergeStatus(e.getReason()));
getCommitMergeStatus(e.getReason()));
} catch (IOException e2) { } catch (IOException e2) {
throw new IntegrationException("Cannot merge " + n.name(), e); throw new IntegrationException("Cannot merge " + n.name(), e);
} }
@@ -489,10 +488,9 @@ public class MergeUtil {
} }
private static CodeReviewCommit failed(CodeReviewRevWalk rw, private static CodeReviewCommit failed(CodeReviewRevWalk rw,
RevFlag canMergeFlag, CodeReviewCommit mergeTip, CodeReviewCommit n, CodeReviewCommit mergeTip, CodeReviewCommit n, CommitMergeStatus failure)
CommitMergeStatus failure)
throws MissingObjectException, IncorrectObjectTypeException, IOException { throws MissingObjectException, IncorrectObjectTypeException, IOException {
rw.resetRetain(canMergeFlag); rw.reset();
rw.markStart(n); rw.markStart(n);
rw.markUninteresting(mergeTip); rw.markUninteresting(mergeTip);
CodeReviewCommit failed; CodeReviewCommit failed;
@@ -504,12 +502,11 @@ public class MergeUtil {
public CodeReviewCommit writeMergeCommit(PersonIdent author, public CodeReviewCommit writeMergeCommit(PersonIdent author,
PersonIdent committer, CodeReviewRevWalk rw, ObjectInserter inserter, PersonIdent committer, CodeReviewRevWalk rw, ObjectInserter inserter,
RevFlag canMergeFlag, Branch.NameKey destBranch, Branch.NameKey destBranch, CodeReviewCommit mergeTip, ObjectId treeId,
CodeReviewCommit mergeTip, ObjectId treeId, CodeReviewCommit n) CodeReviewCommit n) throws IOException, MissingObjectException,
throws IOException, MissingObjectException,
IncorrectObjectTypeException { IncorrectObjectTypeException {
final List<CodeReviewCommit> merged = new ArrayList<>(); final List<CodeReviewCommit> merged = new ArrayList<>();
rw.resetRetain(canMergeFlag); rw.reset();
rw.markStart(n); rw.markStart(n);
rw.markUninteresting(mergeTip); rw.markUninteresting(mergeTip);
CodeReviewCommit crc; CodeReviewCommit crc;

View File

@@ -187,9 +187,8 @@ public class CherryPick extends SubmitStrategy {
} else { } else {
PersonIdent myIdent = new PersonIdent(args.serverIdent, ctx.getWhen()); PersonIdent myIdent = new PersonIdent(args.serverIdent, ctx.getWhen());
CodeReviewCommit result = args.mergeUtil.mergeOneCommit(myIdent, CodeReviewCommit result = args.mergeUtil.mergeOneCommit(myIdent,
myIdent, args.repo, args.rw, args.inserter, myIdent, args.repo, args.rw, args.inserter, args.destBranch,
args.canMergeFlag, args.destBranch, mergeTip.getCurrentTip(), mergeTip.getCurrentTip(), toMerge);
toMerge);
mergeTip.moveTipTo(result, toMerge); mergeTip.moveTipTo(result, toMerge);
} }
args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag, args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag,

View File

@@ -42,8 +42,8 @@ class MergeOneOp extends SubmitStrategyOp {
// BatchUpdate how to produce CodeReviewRevWalks. // BatchUpdate how to produce CodeReviewRevWalks.
CodeReviewCommit merged = CodeReviewCommit merged =
args.mergeUtil.mergeOneCommit(caller, args.serverIdent, args.mergeUtil.mergeOneCommit(caller, args.serverIdent,
ctx.getRepository(), args.rw, ctx.getInserter(), args.canMergeFlag, ctx.getRepository(), args.rw, ctx.getInserter(), args.destBranch,
args.destBranch, args.mergeTip.getCurrentTip(), toMerge); args.mergeTip.getCurrentTip(), toMerge);
args.mergeTip.moveTipTo(merged, toMerge); args.mergeTip.moveTipTo(merged, toMerge);
} }
} }

View File

@@ -14,12 +14,10 @@
package com.google.gerrit.server.git.strategy; package com.google.gerrit.server.git.strategy;
import com.google.common.collect.Lists;
import com.google.gerrit.extensions.restapi.MergeConflictException; import com.google.gerrit.extensions.restapi.MergeConflictException;
import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.server.change.RebaseChangeOp; import com.google.gerrit.server.change.RebaseChangeOp;
import com.google.gerrit.server.git.BatchUpdate.ChangeContext; import com.google.gerrit.server.git.BatchUpdate.ChangeContext;
import com.google.gerrit.server.git.BatchUpdate.Context; import com.google.gerrit.server.git.BatchUpdate.Context;
@@ -125,7 +123,7 @@ public class RebaseIfNecessary extends SubmitStrategy {
rebaseOp = args.rebaseFactory.create( rebaseOp = args.rebaseFactory.create(
toMerge.getControl(), origPs, args.mergeTip.getCurrentTip().name()) toMerge.getControl(), origPs, args.mergeTip.getCurrentTip().name())
.setRunHooks(false) .setRunHooks(false)
// Bypass approval copier since we're going to copy all approvals // Bypass approval copier since SubmitStrategyOp copy all approvals
// later anyway. // later anyway.
.setCopyApprovals(false) .setCopyApprovals(false)
.setValidatePolicy(CommitValidators.Policy.NONE); .setValidatePolicy(CommitValidators.Policy.NONE);
@@ -155,18 +153,9 @@ public class RebaseIfNecessary extends SubmitStrategy {
} }
rebaseOp.updateChange(ctx); rebaseOp.updateChange(ctx);
PatchSet.Id newPatchSetId = rebaseOp.getPatchSetId();
List<PatchSetApproval> approvals = Lists.newArrayList();
// Copy approvals from original patch set.
for (PatchSetApproval a : args.approvalsUtil.byPatchSet(ctx.getDb(),
ctx.getControl(), toMerge.getPatchsetId())) {
approvals.add(new PatchSetApproval(newPatchSetId, a));
}
args.db.patchSetApprovals().insert(approvals);
ctx.getChange().setCurrentPatchSet( ctx.getChange().setCurrentPatchSet(
args.patchSetInfoFactory.get( args.patchSetInfoFactory.get(
args.rw, newCommit, newPatchSetId)); args.rw, newCommit, rebaseOp.getPatchSetId()));
newCommit.setControl(ctx.getControl()); newCommit.setControl(ctx.getControl());
return rebaseOp.getPatchSet(); return rebaseOp.getPatchSet();
} }
@@ -197,11 +186,9 @@ public class RebaseIfNecessary extends SubmitStrategy {
mergeTip.moveTipTo(toMerge, toMerge); mergeTip.moveTipTo(toMerge, toMerge);
acceptMergeTip(mergeTip); acceptMergeTip(mergeTip);
} else { } else {
// TODO(dborowitz): Can't use repo from ctx due to canMergeFlag.
CodeReviewCommit newTip = args.mergeUtil.mergeOneCommit( CodeReviewCommit newTip = args.mergeUtil.mergeOneCommit(
args.serverIdent, args.serverIdent, args.repo, args.rw, args.serverIdent, args.serverIdent, args.repo, args.rw,
args.inserter, args.canMergeFlag, args.destBranch, args.inserter, args.destBranch, mergeTip.getCurrentTip(), toMerge);
mergeTip.getCurrentTip(), toMerge);
mergeTip.moveTipTo(newTip, toMerge); mergeTip.moveTipTo(newTip, toMerge);
} }
args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag, args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag,