diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetail.java index d5865e624f..809d462cd6 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetail.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetail.java @@ -28,6 +28,7 @@ public class ChangeDetail { protected AccountInfoCache accounts; protected boolean allowsAnonymous; protected boolean canAbandon; + protected boolean canPublish; protected boolean canRestore; protected boolean canRevert; protected boolean canDeleteDraft; @@ -71,6 +72,14 @@ public class ChangeDetail { canAbandon = a; } + public boolean canPublish() { + return canPublish; + } + + public void setCanPublish(final boolean a) { + canPublish = a; + } + public boolean canRestore() { return canRestore; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java index ce55953206..e01380637c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java @@ -178,7 +178,7 @@ class PatchSetComplexDisclosurePanel extends ComplexDisclosurePanel implements O populateActions(detail); } } - if (detail.getPatchSet().isDraft()) { + if (detail.getPatchSet().isDraft() && changeDetail.canPublish()) { populatePublishAction(); } if (canDeletePatchSet(detail)) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java index 6529f0f4c6..41431ee5fa 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java @@ -122,6 +122,7 @@ public class ChangeDetailFactory extends Handler { detail.setAllowsAnonymous(control.forUser(anonymousUser).isVisible(db)); detail.setCanAbandon(change.getStatus() != Change.Status.DRAFT && change.getStatus().isOpen() && control.canAbandon()); + detail.setCanPublish(control.canPublish(db)); detail.setCanRestore(change.getStatus() == Change.Status.ABANDONED && control.canRestore()); detail.setCanDeleteDraft(change.getStatus() == Change.Status.DRAFT && control.isOwner()); detail.setStarred(control.getCurrentUser().getStarredChanges().contains( diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PublishAction.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PublishAction.java index e41d3ae669..bd0f40778a 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PublishAction.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PublishAction.java @@ -60,11 +60,11 @@ class PublishAction extends Handler { final ChangeControl changeControl = changeControlFactory.validateFor(changeId); - if (!changeControl.isOwner() && !changeControl.isVisible(db)) { + if (!changeControl.canPublish(db)) { throw new IllegalStateException("Cannot publish patchset"); } ChangeUtil.publishDraftPatchSet(db, patchSetId); return changeDetailFactory.create(changeId).call(); } -} \ No newline at end of file +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java index e229ac28ff..2195c9141f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java @@ -189,6 +189,10 @@ public class ChangeControl { ; } + public boolean canPublish(final ReviewDb db) throws OrmException { + return isOwner() && isVisible(db); + } + /** Can this user restore this change? */ public boolean canRestore() { return canAbandon(); // Anyone who can abandon the change can restore it back @@ -526,4 +530,4 @@ public class ChangeControl { } return list; } -} \ No newline at end of file +} diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java index f6bf0347f1..7fdaf9fa57 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java @@ -248,7 +248,7 @@ public class ReviewCommand extends BaseCommand { } if (publishPatchSet) { - if (changeControl.isOwner() && changeControl.isVisible(db)) { + if (changeControl.canPublish(db)) { ChangeUtil.publishDraftPatchSet(db, patchSetId); } else { throw error("Not permitted to publish draft patchset");