Fix /mergeable test to include accepted commits Merge tests were failing due to a bug introduced into the Mergeable implementation by 3a2a2471b581c454a6a157034d3d0039f2c13cde. Merge strategies must be passed the current set of branch heads, otherwise it appears as though the parents are not ready to submit and are still pending code review. Change-Id: I888f6507f8c68d114539d68314bcc4a38a36fc31
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java index b220879..006733f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
@@ -14,6 +14,7 @@ package com.google.gerrit.server.change; +import com.google.common.collect.Sets; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ResourceConflictException; @@ -36,6 +37,7 @@ import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -46,7 +48,10 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.Collection; import java.util.Collections; +import java.util.Map; +import java.util.Set; public class Mergeable implements RestReadView<RevisionResource> { private static final Logger log = LoggerFactory.getLogger(Mergeable.class); @@ -92,9 +97,11 @@ Repository git = gitManager.openRepository(change.getProject()); try { - Ref ref = git.getRef(change.getDest().get()); + Map<String, Ref> refs = git.getAllRefs(); + Ref ref = refs.get(change.getDest().get()); if (isStale(change, ref)) { - result.mergeable = refresh(change, ps, result.submitType, git, ref); + result.mergeable = + refresh(change, ps, result.submitType, git, refs, ref); } } finally { git.close(); @@ -117,6 +124,7 @@ PatchSet ps, String submitType, Repository git, + Map<String, Ref> refs, Ref ref) throws IOException, OrmException { Project.SubmitType type; try { @@ -156,6 +164,8 @@ mergeable = true; // Assume yes on new branch. } else { CodeReviewCommit tip = parse(rw, ref.getObjectId()); + Set<RevCommit> accepted = alreadyAccepted(rw, refs.values()); + accepted.add(tip); mergeable = submitStrategyFactory.create( type, db.get(), @@ -163,7 +173,7 @@ rw, null /*inserter*/, canMerge, - Collections.<RevCommit> emptySet(), + accepted, change.getDest()).dryRun(tip, rev); } @@ -189,6 +199,22 @@ } } + private static Set<RevCommit> alreadyAccepted(RevWalk rw, Collection<Ref> refs) + throws MissingObjectException, IOException { + Set<RevCommit> accepted = Sets.newHashSet(); + for (Ref r : refs) { + if (r.getName().startsWith(Constants.R_HEADS) + || r.getName().startsWith(Constants.R_TAGS)) { + try { + accepted.add(rw.parseCommit(r.getObjectId())); + } catch (IncorrectObjectTypeException nonCommit) { + // Not a commit? Skip over it. + } + } + } + return accepted; + } + private static CodeReviewCommit parse(RevWalk rw, ObjectId id) throws MissingObjectException, IncorrectObjectTypeException, IOException { return (CodeReviewCommit) rw.parseCommit(id);