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:
@@ -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);
|
||||
|
@@ -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 =
|
||||
|
@@ -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 =
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user