diff options
author | Edwin Kempin <ekempin@google.com> | 2018-03-23 21:21:18 +0000 |
---|---|---|
committer | Paladox <thomasmulhall410@yahoo.com> | 2018-03-23 21:41:22 +0000 |
commit | 18c918fcd50b1d3a56698cf8f27a2e446faf3bbe (patch) | |
tree | 885d0b73a4168711f7527be7363269dce2204e0d | |
parent | 0f9ae13ad2153ab018875db38f45d0531be01b5c (diff) |
Allow admins to toggle the WIP flag on all changes
Sometimes this can be useful, e.g. if one developers starts a WIP
change, goes to vacation and another developer makes the change ready.
At the moment the WIP flag cannot be removed by anyone else than the
change owner.
Change-Id: I4878f066b633b349dbfe927480ebb143539bf4d3
3 files changed, 55 insertions, 6 deletions
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 47adba1551..62c03a02d1 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 @@ -405,6 +405,17 @@ public class ChangeIT extends AbstractDaemonTest { } @Test + public void setWorkInProgressAllowedAsAdmin() throws Exception { + setApiUser(user); + String changeId = + gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id; + + setApiUser(admin); + gApi.changes().id(changeId).setWorkInProgress(); + assertThat(gApi.changes().id(changeId).get().workInProgress).isTrue(); + } + + @Test public void setReadyForReviewNotAllowedWithoutPermission() throws Exception { PushOneCommit.Result rready = createChange(); String changeId = rready.getChangeId(); @@ -417,6 +428,18 @@ public class ChangeIT extends AbstractDaemonTest { } @Test + public void setReadyForReviewAllowedAsAdmin() throws Exception { + setApiUser(user); + String changeId = + gApi.changes().create(new ChangeInput(project.get(), "master", "Test Change")).get().id; + gApi.changes().id(changeId).setWorkInProgress(); + + setApiUser(admin); + gApi.changes().id(changeId).setReadyForReview(); + assertThat(gApi.changes().id(changeId).get().workInProgress).isNull(); + } + + @Test public void hasReviewStarted() throws Exception { PushOneCommit.Result r = createWorkInProgressChange(); String changeId = r.getChangeId(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java index 3d258c3ba4..3c833761b3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetReadyForReview.java @@ -24,7 +24,11 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change.Status; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.ChangeUtil; +import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.change.WorkInProgressOp.Input; +import com.google.gerrit.server.permissions.GlobalPermission; +import com.google.gerrit.server.permissions.PermissionBackend; +import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.update.BatchUpdate; import com.google.gerrit.server.update.RetryHelper; import com.google.gerrit.server.update.RetryingRestModifyView; @@ -38,21 +42,30 @@ public class SetReadyForReview extends RetryingRestModifyView<ChangeResource, In implements UiAction<ChangeResource> { private final WorkInProgressOp.Factory opFactory; private final Provider<ReviewDb> db; + private final Provider<CurrentUser> self; + private final PermissionBackend permissionBackend; @Inject SetReadyForReview( - RetryHelper retryHelper, WorkInProgressOp.Factory opFactory, Provider<ReviewDb> db) { + RetryHelper retryHelper, + WorkInProgressOp.Factory opFactory, + Provider<ReviewDb> db, + Provider<CurrentUser> self, + PermissionBackend permissionBackend) { super(retryHelper); this.opFactory = opFactory; this.db = db; + this.self = self; + this.permissionBackend = permissionBackend; } @Override protected Response<?> applyImpl( BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input) - throws RestApiException, UpdateException { + throws RestApiException, UpdateException, PermissionBackendException { Change change = rsrc.getChange(); - if (!rsrc.isUserOwner()) { + if (!rsrc.isUserOwner() + && !permissionBackend.user(self).test(GlobalPermission.ADMINISTRATE_SERVER)) { throw new AuthException("not allowed to set ready for review"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetWorkInProgress.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetWorkInProgress.java index 565f67fd92..5dcb602597 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SetWorkInProgress.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SetWorkInProgress.java @@ -24,7 +24,11 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change.Status; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.ChangeUtil; +import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.change.WorkInProgressOp.Input; +import com.google.gerrit.server.permissions.GlobalPermission; +import com.google.gerrit.server.permissions.PermissionBackend; +import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gerrit.server.update.BatchUpdate; import com.google.gerrit.server.update.RetryHelper; import com.google.gerrit.server.update.RetryingRestModifyView; @@ -38,21 +42,30 @@ public class SetWorkInProgress extends RetryingRestModifyView<ChangeResource, In implements UiAction<ChangeResource> { private final WorkInProgressOp.Factory opFactory; private final Provider<ReviewDb> db; + private final Provider<CurrentUser> self; + private final PermissionBackend permissionBackend; @Inject SetWorkInProgress( - WorkInProgressOp.Factory opFactory, RetryHelper retryHelper, Provider<ReviewDb> db) { + WorkInProgressOp.Factory opFactory, + RetryHelper retryHelper, + Provider<ReviewDb> db, + Provider<CurrentUser> self, + PermissionBackend permissionBackend) { super(retryHelper); this.opFactory = opFactory; this.db = db; + this.self = self; + this.permissionBackend = permissionBackend; } @Override protected Response<?> applyImpl( BatchUpdate.Factory updateFactory, ChangeResource rsrc, Input input) - throws RestApiException, UpdateException { + throws RestApiException, UpdateException, PermissionBackendException { Change change = rsrc.getChange(); - if (!rsrc.isUserOwner()) { + if (!rsrc.isUserOwner() + && !permissionBackend.user(self).test(GlobalPermission.ADMINISTRATE_SERVER)) { throw new AuthException("not allowed to set work in progress"); } |