Fix merge with an already existing Change-Id The merge failed when another review had the same Change-Id (if the review was abandoned or on another branch for instance). Change-Id: If324e309744d6386267f4a44b948291edf3e6ebb
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java index e9779f5..4b293a6 100644 --- a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java +++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
@@ -17,6 +17,7 @@ import com.google.common.collect.Lists; import com.google.gerrit.common.ChangeListener; import com.google.gerrit.extensions.api.GerritApi; +import com.google.gerrit.extensions.api.changes.ChangeApi; import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.common.ListChangesOption; import com.google.gerrit.extensions.events.LifecycleListener; @@ -157,12 +158,12 @@ related.addAll(api.changes().query("status: open AND topic: " + change.topic) .withOption(ListChangesOption.CURRENT_REVISION).get()); } else { - related.add(api.changes().id(change.id).get(EnumSet.of(ListChangesOption.CURRENT_REVISION))); + ChangeApi changeApi = api.changes().id(change.project, change.branch, change.id); + related.add(changeApi.get(EnumSet.of(ListChangesOption.CURRENT_REVISION))); } boolean submittable = true; boolean mergeable = true; for (final ChangeInfo info : related) { - api.changes().id(change.id).get(EnumSet.of(ListChangesOption.CURRENT_REVISION)); if (!info.mergeable) { mergeable = false; }
diff --git a/test.rb b/test.rb index 37296f2..ec3f2b3 100755 --- a/test.rb +++ b/test.rb
@@ -72,6 +72,18 @@ check_status(commit2, 'MERGED') end + def test_two_reviews_with_same_changed_id + commit1 = create_review(PROJECT1, "review1 on #{PROJECT1}") + change_id = read_change_id(PROJECT1) + abandon_review(commit1) + # Reuse Change-Id of abandoned review + commit2 = create_review(PROJECT2, "review2 on #{PROJECT2}", nil, change_id) + + approve_review(commit2) + + check_status(commit2, 'MERGED') + end + private def project_dir(project_name) @@ -92,8 +104,17 @@ end end - def create_review(project_name, message, topic = nil) + def read_change_id(project_name, commit_id = "HEAD") + change_id = execute(["cd #{project_dir(project_name)}", + "git show #{commit_id} | grep Change-Id | sed 's/^.*Change-Id: \\([Ia-f0-9]*\\)$/\\1/'" + ].join(" && ")) + refute(change_id.empty?, "missing change-id") + change_id + end + + def create_review(project_name, message, topic = nil, change_id = nil) topic_suffix = "/#{topic}" if topic + message = "#{message}\n\nChange-Id: #{change_id}" if change_id execute(["cd #{project_dir(project_name)}", "echo 0 >> a", %Q(git commit -m "#{message}" .), @@ -108,6 +129,10 @@ execute("#{GERRIT_SSH} gerrit review --verified 1 --code-review 2 #{commit_id}") end + def abandon_review(commit_id) + execute("#{GERRIT_SSH} gerrit review --abandon #{commit_id}") + end + def check_status(commit_id, expected_status) reviews = gerrit_query("commit:#{commit_id}") assert_equal(1, reviews.size, "missing review with commit #{commit_id}")