Switch to using DRAFT status
Change-Id: I45f1309b136e791660d197a700778bfcb557f703
diff --git a/pom.xml b/pom.xml
index d5a58af..b051526 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
<version>1.0</version>
<properties>
<Gerrit-ApiType>plugin</Gerrit-ApiType>
- <Gerrit-ApiVersion>2.8-SNAPSHOT</Gerrit-ApiVersion>
+ <Gerrit-ApiVersion>2.9-SNAPSHOT</Gerrit-ApiVersion>
</properties>
<build>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/BaseAction.java b/src/main/java/com/googlesource/gerrit/plugins/wip/BaseAction.java
index 47c5f38..556954e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/BaseAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/BaseAction.java
@@ -14,19 +14,20 @@
package com.googlesource.gerrit.plugins.wip;
+import java.io.IOException;
import java.util.Collections;
import com.google.common.base.Strings;
+import com.google.common.util.concurrent.CheckedFuture;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.ChangeMessage;
-import com.google.gerrit.reviewdb.client.Change.Id;
import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.index.ChangeIndexer;
import com.google.gwtorm.server.AtomicUpdate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@@ -39,19 +40,22 @@
private final Provider<ReviewDb> dbProvider;
private final Provider<CurrentUser> userProvider;
+ private final ChangeIndexer indexer;
@Inject
BaseAction(Provider<ReviewDb> dbProvider,
- Provider<CurrentUser> userProvider) {
+ Provider<CurrentUser> userProvider,
+ ChangeIndexer indexer) {
this.dbProvider = dbProvider;
this.userProvider = userProvider;
+ this.indexer = indexer;
}
protected void changeStatus(Change change, Input input, final Status from,
- final Status to) throws OrmException,
- ResourceConflictException {
+ final Status to) throws OrmException, ResourceConflictException,
+ IOException {
ReviewDb db = dbProvider.get();
- Id changeId = change.getId();
+ Change.Id changeId = change.getId();
db.changes().beginTransaction(changeId);
try {
change = db.changes().atomicUpdate(
@@ -75,7 +79,11 @@
db.changeMessages().insert(Collections.singleton(
newMessage(input, change)));
- new ApprovalsUtil(db).syncChangeStatus(change);
+
+ CheckedFuture<?, IOException> indexFuture =
+ indexer.indexAsync(change.getId());
+ indexFuture.checkedGet();
+
db.commit();
} finally {
db.rollback();
@@ -84,16 +92,14 @@
private ChangeMessage newMessage(Input input,
Change change) throws OrmException {
- StringBuilder msg = new StringBuilder(
- "Change "
- + change.getId().get()
- + ": "
- + ((change.getStatus() == Status.WORKINPROGRESS)
- ? "Work In Progress"
- : "Ready For Review"));
- if (!Strings.nullToEmpty(input.message).trim().isEmpty()) {
- msg.append("\n\n");
- msg.append(input.message.trim());
+ StringBuilder buf = new StringBuilder(change.getStatus() == Status.DRAFT
+ ? "Work In Progress"
+ : "Ready For Review");
+
+ String msg = Strings.nullToEmpty(input.message).trim();
+ if (!msg.isEmpty()) {
+ buf.append("\n\n");
+ buf.append(msg);
}
ChangeMessage message = new ChangeMessage(
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/wip/HttpModule.java
index a3fea87..387c747 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/HttpModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/HttpModule.java
@@ -19,7 +19,7 @@
import com.google.gerrit.extensions.webui.WebUiPlugin;
import com.google.gerrit.httpd.plugins.HttpPluginModule;
-public class HttpModule extends HttpPluginModule {
+class HttpModule extends HttpPluginModule {
@Override
protected void configureServlets() {
DynamicSet.bind(binder(), WebUiPlugin.class)
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/Module.java b/src/main/java/com/googlesource/gerrit/plugins/wip/Module.java
index 6a02eb4..2a3d06d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/Module.java
@@ -15,10 +15,7 @@
package com.googlesource.gerrit.plugins.wip;
import static com.google.gerrit.server.change.RevisionResource.REVISION_KIND;
-import static com.googlesource.gerrit.plugins.wip.WorkInProgressCapability.WORK_IN_PROGRESS;
-import com.google.gerrit.extensions.annotations.Exports;
-import com.google.gerrit.extensions.config.CapabilityDefinition;
import com.google.gerrit.extensions.restapi.RestApiModule;
import com.google.inject.AbstractModule;
@@ -26,16 +23,13 @@
@Override
protected void configure() {
- bind(CapabilityDefinition.class)
- .annotatedWith(Exports.named(WORK_IN_PROGRESS))
- .to(WorkInProgressCapability.class);
install(new RestApiModule() {
@Override
protected void configure() {
post(REVISION_KIND, "set-wip")
- .to(WorkInProgressAction.class);
+ .to(WorkInProgress.class);
post(REVISION_KIND, "set-ready")
- .to(ReadyForReviewAction.class);
+ .to(ReadyForReview.class);
}
});
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReviewAction.java b/src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReview.java
similarity index 78%
rename from src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReviewAction.java
rename to src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReview.java
index be68997..be1c4da 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReviewAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/ReadyForReview.java
@@ -14,7 +14,8 @@
package com.googlesource.gerrit.plugins.wip;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
+import java.io.IOException;
+
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
@@ -25,26 +26,27 @@
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.index.ChangeIndexer;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
-@RequiresCapability(WorkInProgressCapability.WORK_IN_PROGRESS)
-class ReadyForReviewAction extends BaseAction implements
+class ReadyForReview extends BaseAction implements
UiAction<RevisionResource>,
RestModifyView<RevisionResource, BaseAction.Input> {
@Inject
- ReadyForReviewAction(Provider<ReviewDb> dbProvider,
- Provider<CurrentUser> userProvider) {
- super(dbProvider, userProvider);
+ ReadyForReview(Provider<ReviewDb> dbProvider,
+ Provider<CurrentUser> userProvider,
+ ChangeIndexer indexer) {
+ super(dbProvider, userProvider, indexer);
}
@Override
public Object apply(RevisionResource rsrc, Input input)
- throws ResourceConflictException, OrmException {
+ throws ResourceConflictException, OrmException, IOException {
Change change = rsrc.getChange();
- if (change.getStatus() != Status.WORKINPROGRESS) {
+ if (change.getStatus() != Status.DRAFT) {
throw new ResourceConflictException("change is " + status(change));
}
@@ -52,7 +54,7 @@
throw new ResourceConflictException("not current patch set");
}
- changeStatus(change, input, Status.WORKINPROGRESS, Status.NEW);
+ changeStatus(change, input, Status.DRAFT, Status.NEW);
return Response.none();
}
@@ -62,7 +64,8 @@
return new Description()
.setLabel("Ready")
.setTitle("Set Ready For Review")
- .setVisible(rsrc.getChange().getStatus() == Status.WORKINPROGRESS
+ .setVisible(rsrc.getControl().isOwner()
+ && rsrc.getChange().getStatus() == Status.DRAFT
&& rsrc.getPatchSet().getId().equals(current));
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/SetCommand.java b/src/main/java/com/googlesource/gerrit/plugins/wip/SetCommand.java
index 535c85a..276dbf8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/SetCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/SetCommand.java
@@ -23,15 +23,15 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.ChangesCollection;
import com.google.gerrit.server.change.RevisionResource;
-import com.google.gerrit.server.project.ChangeControl;
+import com.google.gerrit.server.index.ChangeIndexer;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.sshd.CommandMetaData;
@@ -41,9 +41,8 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
-@RequiresCapability(WorkInProgressCapability.WORK_IN_PROGRESS)
@CommandMetaData(name = "set", description = "Mark the change as WIP or Ready")
-public class SetCommand extends SshCommand {
+class SetCommand extends SshCommand {
private static final Logger log = LoggerFactory.getLogger(SetCommand.class);
private final Set<PatchSet> patchSets = new HashSet<PatchSet>();
@@ -82,13 +81,16 @@
private ReviewDb db;
@Inject
- private ChangeControl.Factory changeControlFactory;
+ private Provider<WorkInProgress> wipProvider;
@Inject
- private Provider<WorkInProgressAction> wipProvider;
+ private Provider<ReadyForReview> readyProvider;
@Inject
- private Provider<ReadyForReviewAction> readyProvider;
+ ChangeIndexer indexer;
+
+ @Inject
+ ChangesCollection changes;
@Override
protected void run() throws UnloggedFailure {
@@ -103,13 +105,8 @@
for (PatchSet patchSet : patchSets) {
try {
mark(patchSet);
- } catch (NoSuchChangeException e) {
- ok = false;
- writeError("no such change " + patchSet.getId().getParentKey().get());
- } catch (ResourceConflictException e) {
- writeError("error: " + e.getMessage() + "\n");
- ok = false;
- } catch (OrmException e) {
+ } catch (NoSuchChangeException | ResourceConflictException | IOException
+ | OrmException | ResourceNotFoundException e) {
ok = false;
writeError("fatal: internal server error while approving "
+ patchSet.getId() + "\n");
@@ -123,10 +120,11 @@
}
private void mark(PatchSet patchSet) throws NoSuchChangeException,
- ResourceConflictException, OrmException {
- RevisionResource rsrc = new RevisionResource(
- new ChangeResource(changeControlFactory
- .controlFor(patchSet.getId().getParentKey())), patchSet);
+ ResourceConflictException, OrmException, IOException,
+ ResourceNotFoundException {
+ RevisionResource rsrc =
+ new RevisionResource(changes.parse(patchSet.getId().getParentKey()),
+ patchSet);
BaseAction.Input input = new BaseAction.Input();
input.message = changeComment;
if (wipChange) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/SshModule.java b/src/main/java/com/googlesource/gerrit/plugins/wip/SshModule.java
index 7b21460..cbd39c1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/SshModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/SshModule.java
@@ -16,7 +16,7 @@
import com.google.gerrit.sshd.PluginCommandModule;
-public class SshModule extends PluginCommandModule {
+class SshModule extends PluginCommandModule {
@Override
protected void configureCommands() {
command(SetCommand.class);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgressAction.java b/src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgress.java
similarity index 79%
rename from src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgressAction.java
rename to src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgress.java
index e5601f0..41eda46 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgressAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/wip/WorkInProgress.java
@@ -14,7 +14,8 @@
package com.googlesource.gerrit.plugins.wip;
-import com.google.gerrit.extensions.annotations.RequiresCapability;
+import java.io.IOException;
+
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
@@ -25,24 +26,25 @@
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.change.RevisionResource;
+import com.google.gerrit.server.index.ChangeIndexer;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
-@RequiresCapability(WorkInProgressCapability.WORK_IN_PROGRESS)
-class WorkInProgressAction extends BaseAction implements
+class WorkInProgress extends BaseAction implements
UiAction<RevisionResource>,
RestModifyView<RevisionResource, BaseAction.Input> {
@Inject
- WorkInProgressAction(Provider<ReviewDb> dbProvider,
- Provider<CurrentUser> userProvider) {
- super(dbProvider, userProvider);
+ WorkInProgress(Provider<ReviewDb> dbProvider,
+ Provider<CurrentUser> userProvider,
+ ChangeIndexer indexer) {
+ super(dbProvider, userProvider, indexer);
}
@Override
public Object apply(RevisionResource rsrc, Input input)
- throws ResourceConflictException, OrmException {
+ throws ResourceConflictException, OrmException, IOException {
Change change = rsrc.getChange();
if (change.getStatus() != Status.NEW) {
throw new ResourceConflictException("change is " + status(change));
@@ -52,7 +54,7 @@
throw new ResourceConflictException("not current patch set");
}
- changeStatus(change, input, Status.NEW, Status.WORKINPROGRESS);
+ changeStatus(change, input, Status.NEW, Status.DRAFT);
return Response.none();
}
@@ -62,7 +64,8 @@
return new Description()
.setLabel("WIP")
.setTitle("Set Work In Progress")
- .setVisible(rsrc.getChange().getStatus() == Status.NEW
+ .setVisible(rsrc.getControl().isOwner()
+ && rsrc.getChange().getStatus() == Status.NEW
&& rsrc.getPatchSet().getId().equals(current));
}
}
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index a18fb93..e1de899 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -1,7 +1,7 @@
Gerrit Work in Progress plugin
==============================
-This plugin adds a new button that allows an authorized user to set a
+This plugin adds a new button that allows a change owner to set a
change to Work In Progress, and a button to change from WIP back
to a "Ready For Review" state.
@@ -12,10 +12,6 @@
In addition this plugin exposes this functionality as REST endpoints
and SSH command.
-It is intended to be used in combination with the new "Change Owners" group. The
-plugin owned capability "Work In Progress" can be granted to that group,
-so that only change owners can toggle the WIP state.
-
Work In Progress Workflow:
--------------------------