Add ready property to ReviewResult

This is particularly needed for transitioning PolyGerrit to use this new
API. We can use this property to determine immediately upon receiving a
response to posting a review whether we need to fall back to a second
API call to start review.

Bug: Issue 6760
Change-Id: Ib0ef5f5a0d454de4cd4b9496ab1cf81dba729a99
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index 8e9d498..8b4e529 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -6737,6 +6737,9 @@
 link:rest-api-changes.html#add-reviewer-result[AddReviewerResult]
 representing the outcome of adding as a reviewer.
 Absent if no reviewer additions were requested.
+|`ready`                  |optional|
+If true, the change was moved from WIP to ready for review as a result of this
+action. Not set if false.
 |============================
 
 [[reviewer-info]]
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
index ee23586..4dc8e51 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -510,7 +510,8 @@
     assertThat(r.getChange().change().isWorkInProgress()).isTrue();
 
     ReviewInput in = ReviewInput.noScore().setWorkInProgress(false);
-    gApi.changes().id(r.getChangeId()).revision("current").review(in);
+    ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
+    assertThat(result.ready).isTrue();
 
     ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
     assertThat(info.workInProgress).isNull();
@@ -523,7 +524,8 @@
     assertThat(r.getChange().change().isWorkInProgress()).isFalse();
 
     ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
-    gApi.changes().id(r.getChangeId()).revision("current").review(in);
+    ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
+    assertThat(result.ready).isNull();
 
     ChangeInfo info = gApi.changes().id(r.getChangeId()).get();
     assertThat(info.workInProgress).isTrue();
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java
index 761f260..ff88bbe 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewResult.java
@@ -31,6 +31,11 @@
    */
   @Nullable public Map<String, AddReviewerResult> reviewers;
 
+  /**
+   * Boolean indicating whether the change was moved out of WIP by this review. Either true or null.
+   */
+  @Nullable public Boolean ready;
+
   /** Error message for non-200 responses. */
   @Nullable public String error;
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
index 147654d..4efede5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
@@ -330,6 +330,10 @@
           output.error = ERROR_ONLY_OWNER_CAN_MODIFY_WORK_IN_PROGRESS;
           return Response.withStatusCode(SC_BAD_REQUEST, output);
         }
+        if (input.ready) {
+          output.ready = true;
+        }
+
         // Suppress notifications in WorkInProgressOp, we'll take care of
         // them in this endpoint.
         WorkInProgressOp.Input wipIn = new WorkInProgressOp.Input();