Merge "Format with google-java-format"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
index b5f4046..40cb02a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
@@ -287,49 +287,52 @@
     for (String downstreamBranch : mdsMergeInput.dsBranchMap.keySet()) {
       // If there are existing downstream merges, update them
       // Otherwise, create them.
-      try {
-        boolean createDownstreams = true;
-        if (mdsMergeInput.obsoleteRevision != null) {
-          existingDownstream =
-              getExistingMergesOnBranch(
-                  mdsMergeInput.obsoleteRevision, mdsMergeInput.topic, downstreamBranch);
-          if (!existingDownstream.isEmpty()) {
-            log.debug(
-                "Attempting to update downstream merge of {} on branch {}",
-                mdsMergeInput.currentRevision,
-                downstreamBranch);
-            // existingDownstream should almost always be of length one, but
-            // it's possible to construct it so that it's not
-            for (Integer dsChangeNumber : existingDownstream) {
+      boolean createDownstreams = true;
+      if (mdsMergeInput.obsoleteRevision != null) {
+        existingDownstream =
+            getExistingMergesOnBranch(
+                mdsMergeInput.obsoleteRevision, mdsMergeInput.topic, downstreamBranch);
+        if (!existingDownstream.isEmpty()) {
+          log.debug(
+              "Attempting to update downstream merge of {} on branch {}",
+              mdsMergeInput.currentRevision,
+              downstreamBranch);
+          // existingDownstream should almost always be of length one, but
+          // it's possible to construct it so that it's not
+          for (Integer dsChangeNumber : existingDownstream) {
+            try {
               updateDownstreamMerge(
                   mdsMergeInput.currentRevision,
                   mdsMergeInput.subject,
                   dsChangeNumber,
                   mdsMergeInput.dsBranchMap.get(downstreamBranch));
               createDownstreams = false;
+            } catch (MergeConflictException e) {
+              failedMergeBranchMap.put(downstreamBranch, e.getMessage());
+              log.debug("Abandoning existing, obsolete {} due to merge conflict.", dsChangeNumber);
+              abandonChange(dsChangeNumber);
             }
           }
         }
-        if (createDownstreams) {
-          log.debug(
-              "Attempting to create downstream merge of {} on branch {}",
-              mdsMergeInput.currentRevision,
-              downstreamBranch);
-          SingleDownstreamMergeInput sdsMergeInput = new SingleDownstreamMergeInput();
-          sdsMergeInput.currentRevision = mdsMergeInput.currentRevision;
-          sdsMergeInput.changeNumber = mdsMergeInput.changeNumber;
-          sdsMergeInput.project = mdsMergeInput.project;
-          sdsMergeInput.topic = mdsMergeInput.topic;
-          sdsMergeInput.subject = mdsMergeInput.subject;
-          sdsMergeInput.downstreamBranch = downstreamBranch;
-          sdsMergeInput.doMerge = mdsMergeInput.dsBranchMap.get(downstreamBranch);
+      }
+      if (createDownstreams) {
+        log.debug(
+            "Attempting to create downstream merge of {} on branch {}",
+            mdsMergeInput.currentRevision,
+            downstreamBranch);
+        SingleDownstreamMergeInput sdsMergeInput = new SingleDownstreamMergeInput();
+        sdsMergeInput.currentRevision = mdsMergeInput.currentRevision;
+        sdsMergeInput.changeNumber = mdsMergeInput.changeNumber;
+        sdsMergeInput.project = mdsMergeInput.project;
+        sdsMergeInput.topic = mdsMergeInput.topic;
+        sdsMergeInput.subject = mdsMergeInput.subject;
+        sdsMergeInput.downstreamBranch = downstreamBranch;
+        sdsMergeInput.doMerge = mdsMergeInput.dsBranchMap.get(downstreamBranch);
+        try {
           createSingleDownstreamMerge(sdsMergeInput);
+        } catch (MergeConflictException e) {
+          failedMergeBranchMap.put(downstreamBranch, e.getMessage());
         }
-      } catch (MergeConflictException e) {
-        failedMergeBranchMap.put(downstreamBranch, e.getMessage());
-        log.debug("Abandoning downstream of {}", mdsMergeInput.changeNumber);
-        abandonDownstream(
-            gApi.changes().id(mdsMergeInput.changeNumber).info(), mdsMergeInput.currentRevision);
       }
     }
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreatorIT.java b/src/test/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreatorIT.java
index efaed66..cf42a56 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreatorIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreatorIT.java
@@ -70,23 +70,23 @@
     merge(result);
     List<ChangeInfo> sortedChanges = sortedChanges(changesInTopic);
 
-    ChangeInfo masterChangeInfo = sortedChanges.get(0);
-    ChangeApi masterChange = gApi.changes().id(masterChangeInfo._number);
-    assertThat(getVote(masterChange, "Code-Review").value).isEqualTo(2);
-    assertThat(getVote(masterChange, "Code-Review").tag).isEqualTo(null);
-    assertThat(masterChangeInfo.branch).isEqualTo("master");
-
-    ChangeInfo dsOneChangeInfo = sortedChanges.get(1);
+    ChangeInfo dsOneChangeInfo = sortedChanges.get(0);
     assertThat(dsOneChangeInfo.branch).isEqualTo("ds_one");
     ChangeApi dsOneChange = gApi.changes().id(dsOneChangeInfo._number);
     assertThat(getVote(dsOneChange, "Code-Review").value).isEqualTo(2);
     assertThat(getVote(dsOneChange, "Code-Review").tag).isEqualTo("autogenerated:Automerger");
 
-    ChangeInfo dsTwoChangeInfo = sortedChanges.get(2);
+    ChangeInfo dsTwoChangeInfo = sortedChanges.get(1);
     assertThat(dsTwoChangeInfo.branch).isEqualTo("ds_two");
     ChangeApi dsTwoChange = gApi.changes().id(dsTwoChangeInfo._number);
     assertThat(getVote(dsTwoChange, "Code-Review").value).isEqualTo(2);
     assertThat(getVote(dsTwoChange, "Code-Review").tag).isEqualTo("autogenerated:Automerger");
+
+    ChangeInfo masterChangeInfo = sortedChanges.get(2);
+    ChangeApi masterChange = gApi.changes().id(masterChangeInfo._number);
+    assertThat(getVote(masterChange, "Code-Review").value).isEqualTo(2);
+    assertThat(getVote(masterChange, "Code-Review").tag).isEqualTo(null);
+    assertThat(masterChangeInfo.branch).isEqualTo("master");
   }
 
   @Test
@@ -112,13 +112,7 @@
 
     List<ChangeInfo> sortedChanges = sortedChanges(changesInTopic);
 
-    ChangeInfo masterChangeInfo = sortedChanges.get(0);
-    ChangeApi masterChange = gApi.changes().id(masterChangeInfo._number);
-    assertThat(getVote(masterChange, "Code-Review").value).isEqualTo(0);
-    assertThat(getVote(masterChange, "Code-Review").tag).isEqualTo(null);
-    assertThat(masterChangeInfo.branch).isEqualTo("master");
-
-    ChangeInfo dsOneChangeInfo = sortedChanges.get(1);
+    ChangeInfo dsOneChangeInfo = sortedChanges.get(0);
     assertThat(dsOneChangeInfo.branch).isEqualTo("ds_one");
     ChangeApi dsOneChange = gApi.changes().id(dsOneChangeInfo._number);
     assertThat(getVote(dsOneChange, "Code-Review").value).isEqualTo(0);
@@ -128,7 +122,7 @@
     assertThat(dsOneChange.current().files().keySet()).contains("filename");
     assertThat(dsOneChange.current().files().get("filename").linesDeleted).isEqualTo(1);
 
-    ChangeInfo dsTwoChangeInfo = sortedChanges.get(2);
+    ChangeInfo dsTwoChangeInfo = sortedChanges.get(1);
     assertThat(dsTwoChangeInfo.branch).isEqualTo("ds_two");
     ChangeApi dsTwoChange = gApi.changes().id(dsTwoChangeInfo._number);
     assertThat(getVote(dsTwoChange, "Code-Review").value).isEqualTo(0);
@@ -137,6 +131,12 @@
     assertThat(dsTwoChange.get().subject).doesNotContain("skipped:");
     BinaryResult dsTwoContent = dsTwoChange.current().file("filename").content();
     assertThat(dsTwoContent.asString()).isEqualTo(content.asString());
+
+    ChangeInfo masterChangeInfo = sortedChanges.get(2);
+    ChangeApi masterChange = gApi.changes().id(masterChangeInfo._number);
+    assertThat(getVote(masterChange, "Code-Review").value).isEqualTo(0);
+    assertThat(getVote(masterChange, "Code-Review").tag).isEqualTo(null);
+    assertThat(masterChangeInfo.branch).isEqualTo("master");
   }
 
   @Test
@@ -160,13 +160,7 @@
 
     List<ChangeInfo> sortedChanges = sortedChanges(changesInTopic);
 
-    ChangeInfo masterChangeInfo = sortedChanges.get(0);
-    ChangeApi masterChange = gApi.changes().id(masterChangeInfo._number);
-    assertThat(getVote(masterChange, "Code-Review").value).isEqualTo(0);
-    assertThat(getVote(masterChange, "Code-Review").tag).isEqualTo(null);
-    assertThat(masterChangeInfo.branch).isEqualTo("master");
-
-    ChangeInfo dsOneChangeInfo = sortedChanges.get(1);
+    ChangeInfo dsOneChangeInfo = sortedChanges.get(0);
     assertThat(dsOneChangeInfo.branch).isEqualTo("ds_one");
     ChangeApi dsOneChange = gApi.changes().id(dsOneChangeInfo._number);
     assertThat(getVote(dsOneChange, "Code-Review").value).isEqualTo(0);
@@ -176,7 +170,7 @@
     assertThat(dsOneChange.current().files().keySet()).contains("filename");
     assertThat(dsOneChange.current().files().get("filename").linesDeleted).isEqualTo(1);
 
-    ChangeInfo dsTwoChangeInfo = sortedChanges.get(2);
+    ChangeInfo dsTwoChangeInfo = sortedChanges.get(1);
     assertThat(dsTwoChangeInfo.branch).isEqualTo("ds_two");
     ChangeApi dsTwoChange = gApi.changes().id(dsTwoChangeInfo._number);
     assertThat(getVote(dsTwoChange, "Code-Review").value).isEqualTo(0);
@@ -185,6 +179,12 @@
     assertThat(dsTwoChange.get().subject).contains("skipped:");
     assertThat(dsTwoChange.current().files().keySet()).contains("filename");
     assertThat(dsTwoChange.current().files().get("filename").linesDeleted).isEqualTo(1);
+
+    ChangeInfo masterChangeInfo = sortedChanges.get(2);
+    ChangeApi masterChange = gApi.changes().id(masterChangeInfo._number);
+    assertThat(getVote(masterChange, "Code-Review").value).isEqualTo(0);
+    assertThat(getVote(masterChange, "Code-Review").tag).isEqualTo(null);
+    assertThat(masterChangeInfo.branch).isEqualTo("master");
   }
 
   @Test
@@ -225,18 +225,18 @@
     assertThat(changesInTopic).hasSize(2);
     List<ChangeInfo> sortedChanges = sortedChanges(changesInTopic);
 
-    ChangeInfo masterChangeInfo = sortedChanges.get(0);
-    ChangeApi masterChange = gApi.changes().id(masterChangeInfo._number);
-    assertThat(getVote(masterChange, "Code-Review").value).isEqualTo(-2);
-    assertThat(getVote(masterChange, "Code-Review").tag).isEqualTo("autogenerated:MergeConflict");
-    assertThat(masterChangeInfo.branch).isEqualTo("master");
-
-    ChangeInfo dsTwoChangeInfo = sortedChanges.get(1);
+    ChangeInfo dsTwoChangeInfo = sortedChanges.get(0);
     assertThat(dsTwoChangeInfo.branch).isEqualTo("ds_two");
     ChangeApi dsTwoChange = gApi.changes().id(dsTwoChangeInfo._number);
     // This is -2 because the -2 vote from master propagated to ds_two
     assertThat(getVote(dsTwoChange, "Code-Review").value).isEqualTo(-2);
     assertThat(getVote(dsTwoChange, "Code-Review").tag).isEqualTo("autogenerated:Automerger");
+
+    ChangeInfo masterChangeInfo = sortedChanges.get(1);
+    ChangeApi masterChange = gApi.changes().id(masterChangeInfo._number);
+    assertThat(getVote(masterChange, "Code-Review").value).isEqualTo(-2);
+    assertThat(getVote(masterChange, "Code-Review").tag).isEqualTo("autogenerated:MergeConflict");
+    assertThat(masterChangeInfo.branch).isEqualTo("master");
   }
 
   @Test
@@ -399,7 +399,7 @@
         new Comparator<ChangeInfo>() {
           @Override
           public int compare(ChangeInfo c1, ChangeInfo c2) {
-            return c1._number - c2._number;
+            return c1.branch.compareTo(c2.branch);
           }
         });
     return listCopy;