Make submit strategies re-executeable

The RevWalk used for the MergeOp must not be reset without retaining
the CAN_MERGE flag. If the CAN_MERGE flag is removed from the RevWalk
follow-up submit strategies cannot succeed anymore.

Change-Id: Ic7ddd5efa2937749020f91dc75a4f4f1ff2bd67c
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
This commit is contained in:
Edwin Kempin
2012-09-25 15:52:35 +02:00
parent 7d9ae387f4
commit 0ee523efdf
4 changed files with 26 additions and 21 deletions

View File

@@ -133,8 +133,9 @@ public class CherryPick extends SubmitStrategy {
newMergeTip =
mergeOneCommit(args.db, args.identifiedUserFactory,
args.myIdent, args.repo, args.rw, args.inserter,
args.useContentMerge, args.destBranch, newMergeTip, n);
}
args.canMergeFlag, args.useContentMerge, args.destBranch,
newMergeTip, n);
}
final PatchSetApproval submitApproval =
markCleanMerges(args.db, args.rw, args.canMergeFlag,
newMergeTip, args.alreadyAccepted);

View File

@@ -37,8 +37,9 @@ public class MergeAlways extends SubmitStrategy {
while (!toMerge.isEmpty()) {
newMergeTip =
mergeOneCommit(args.db, args.identifiedUserFactory, args.myIdent,
args.repo, args.rw, args.inserter, args.useContentMerge,
args.destBranch, mergeTip, toMerge.remove(0));
args.repo, args.rw, args.inserter, args.canMergeFlag,
args.useContentMerge, args.destBranch, mergeTip,
toMerge.remove(0));
}
final PatchSetApproval submitApproval =

View File

@@ -40,8 +40,9 @@ public class MergeIfNecessary extends SubmitStrategy {
while (!toMerge.isEmpty()) {
newMergeTip =
mergeOneCommit(args.db, args.identifiedUserFactory, args.myIdent,
args.repo, args.rw, args.inserter, args.useContentMerge,
args.destBranch, mergeTip, toMerge.remove(0));
args.repo, args.rw, args.inserter, args.canMergeFlag,
args.useContentMerge, args.destBranch, mergeTip,
toMerge.remove(0));
}
final PatchSetApproval submitApproval =

View File

@@ -179,21 +179,23 @@ public class MergeUtil {
public static CodeReviewCommit mergeOneCommit(final ReviewDb reviewDb,
final IdentifiedUser.GenericFactory identifiedUserFactory,
final PersonIdent myIdent, final Repository repo, final RevWalk rw,
final ObjectInserter inserter, final boolean useContentMerge,
final Branch.NameKey destBranch, final CodeReviewCommit mergeTip,
final CodeReviewCommit n) throws MergeException {
final ObjectInserter inserter, final RevFlag canMergeFlag,
final boolean useContentMerge, final Branch.NameKey destBranch,
final CodeReviewCommit mergeTip, final CodeReviewCommit n)
throws MergeException {
final ThreeWayMerger m = newThreeWayMerger(repo, inserter, useContentMerge);
try {
if (m.merge(new AnyObjectId[] {mergeTip, n})) {
return writeMergeCommit(reviewDb, identifiedUserFactory, myIdent, rw,
inserter, destBranch, mergeTip, m.getResultTreeId(), n);
inserter, canMergeFlag, destBranch, mergeTip, m.getResultTreeId(), n);
} else {
failed(rw, mergeTip, n, CommitMergeStatus.PATH_CONFLICT);
failed(rw, canMergeFlag, mergeTip, n, CommitMergeStatus.PATH_CONFLICT);
}
} catch (IOException e) {
if (e.getMessage().startsWith("Multiple merge bases for")) {
try {
failed(rw, mergeTip, n, CommitMergeStatus.CRISS_CROSS_MERGE);
failed(rw, canMergeFlag, mergeTip, n,
CommitMergeStatus.CRISS_CROSS_MERGE);
} catch (IOException e2) {
throw new MergeException("Cannot merge " + n.name(), e);
}
@@ -205,10 +207,10 @@ public class MergeUtil {
}
private static CodeReviewCommit failed(final RevWalk rw,
final CodeReviewCommit mergeTip, final CodeReviewCommit n,
final CommitMergeStatus failure) throws MissingObjectException,
IncorrectObjectTypeException, IOException {
rw.reset();
final RevFlag canMergeFlag, final CodeReviewCommit mergeTip,
final CodeReviewCommit n, final CommitMergeStatus failure)
throws MissingObjectException, IncorrectObjectTypeException, IOException {
rw.resetRetain(canMergeFlag);
rw.markStart(n);
rw.markUninteresting(mergeTip);
CodeReviewCommit failed;
@@ -221,12 +223,12 @@ public class MergeUtil {
public static CodeReviewCommit writeMergeCommit(final ReviewDb reviewDb,
final IdentifiedUser.GenericFactory identifiedUserFactory,
final PersonIdent myIdent, final RevWalk rw,
final ObjectInserter inserter, final Branch.NameKey destBranch,
final CodeReviewCommit mergeTip, final ObjectId treeId,
final CodeReviewCommit n) throws IOException, MissingObjectException,
IncorrectObjectTypeException {
final ObjectInserter inserter, final RevFlag canMergeFlag,
final Branch.NameKey destBranch, final CodeReviewCommit mergeTip,
final ObjectId treeId, final CodeReviewCommit n) throws IOException,
MissingObjectException, IncorrectObjectTypeException {
final List<CodeReviewCommit> merged = new ArrayList<CodeReviewCommit>();
rw.reset();
rw.resetRetain(canMergeFlag);
rw.markStart(n);
rw.markUninteresting(mergeTip);
for (final RevCommit c : rw) {