Merge "Prevent new patchset notification emails for trivial rebase"
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
index e578aad..f16c677 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java
@@ -21,6 +21,7 @@
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.http.HttpStatus.SC_CONFLICT;
 import static org.apache.http.HttpStatus.SC_NOT_FOUND;
 import static org.apache.http.HttpStatus.SC_NO_CONTENT;
 import static org.apache.http.HttpStatus.SC_OK;
@@ -100,6 +101,7 @@
   private Change change;
   private String changeId;
   private Change change2;
+  private String changeId2;
   private PatchSet ps;
   private PatchSet ps2;
 
@@ -111,7 +113,7 @@
     amendChange(git, admin.getIdent(), changeId);
     change = getChange(changeId);
     assertThat(ps).isNotNull();
-    String changeId2 = newChange2(git, admin.getIdent());
+    changeId2 = newChange2(git, admin.getIdent());
     change2 = getChange(changeId2);
     assertThat(change2).isNotNull();
     ps2 = getCurrentPatchSet(changeId2);
@@ -232,6 +234,24 @@
   }
 
   @Test
+  public void rebaseEditWithConflictsRest_Conflict() throws Exception {
+    PatchSet current = getCurrentPatchSet(changeId2);
+    assertThat(modifier.createEdit(change2, current)).isEqualTo(RefUpdate.Result.NEW);
+    assertThat(
+        modifier.modifyFile(editUtil.byChange(change2).get(), FILE_NAME,
+            RestSession.newRawInput(CONTENT_NEW))).isEqualTo(RefUpdate.Result.FORCED);
+    ChangeEdit edit = editUtil.byChange(change2).get();
+    assertThat(edit.getBasePatchSet().getPatchSetId()).isEqualTo(
+        current.getPatchSetId());
+    PushOneCommit push =
+        pushFactory.create(db, admin.getIdent(), PushOneCommit.SUBJECT, FILE_NAME,
+            new String(CONTENT_NEW2), changeId2);
+    push.to(git, "refs/for/master").assertOkStatus();
+    RestResponse r = adminSession.post(urlRebase());
+    assertThat(r.getStatusCode()).isEqualTo(SC_CONFLICT);
+  }
+
+  @Test
   public void updateExistingFile() throws Exception {
     assertThat(modifier.createEdit(change, ps)).isEqualTo(RefUpdate.Result.NEW);
     Optional<ChangeEdit> edit = editUtil.byChange(change);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
index 71c54fe..87895e9 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
@@ -144,11 +144,13 @@
    * @param edit change edit that contains edit to rebase
    * @param current patch set to rebase the edit on
    * @throws AuthException
+   * @throws ResourceConflictException thrown if rebase fails due to merge conflicts
    * @throws InvalidChangeOperationException
    * @throws IOException
    */
   public void rebaseEdit(ChangeEdit edit, PatchSet current)
-      throws AuthException, InvalidChangeOperationException, IOException {
+      throws AuthException, ResourceConflictException,
+      InvalidChangeOperationException, IOException {
     if (!currentUser.get().isIdentifiedUser()) {
       throw new AuthException("Authentication required");
     }
@@ -202,7 +204,7 @@
           }
         } else {
           // TODO(davido): Allow to resolve conflicts inline
-          throw new InvalidChangeOperationException("merge conflict");
+          throw new ResourceConflictException("merge conflict");
         }
       } finally {
         rw.release();