Merge pull request #2 from debanne/master

Fix merge with an already existing Change-Id
diff --git a/.travis.yml b/.travis.yml
index dfb6c36..15abc33 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -26,12 +26,13 @@
   - ant
   - export PATH=$PATH:$TRAVIS_BUILD_DIR/../../build/buck/bin
   - cd ..
-  - git clone https://gerrit.googlesource.com/gerrit
+  - git clone -b stable-2.10 https://gerrit.googlesource.com/gerrit
   - cd gerrit
   - ln -s $TRAVIS_BUILD_DIR plugins
   - travis_retry tools/download_all.py > download.log
 
 script:
+  - buck clean
   - buck build gerrit > buck.log
   - buck build plugins/automerge-plugin:automerge-plugin >> buck.log
 
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}")