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 c79b19865a..bbb91b2c70 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 @@ -278,4 +278,24 @@ public class ChangeIT extends AbstractDaemonTest { revision(r).review(ReviewInput.recommend()); assertTrue(get(r.getChangeId()).reviewed); } + + @Test + public void topic() throws Exception { + PushOneCommit.Result r = createChange(); + assertEquals("", gApi.changes() + .id(r.getChangeId()) + .topic()); + gApi.changes() + .id(r.getChangeId()) + .topic("mytopic"); + assertEquals("mytopic", gApi.changes() + .id(r.getChangeId()) + .topic()); + gApi.changes() + .id(r.getChangeId()) + .topic(""); + assertEquals("", gApi.changes() + .id(r.getChangeId()) + .topic()); + } } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java index 3382b765df..c3ade5f878 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java @@ -37,6 +37,9 @@ public interface ChangeApi { ChangeApi revert() throws RestApiException; ChangeApi revert(RevertInput in) throws RestApiException; + String topic() throws RestApiException; + void topic(String topic) throws RestApiException; + void addReviewer(AddReviewerInput in) throws RestApiException; void addReviewer(String in) throws RestApiException; @@ -102,6 +105,16 @@ public interface ChangeApi { throw new NotImplementedException(); } + @Override + public String topic() throws RestApiException { + throw new NotImplementedException(); + } + + @Override + public void topic(String topic) throws RestApiException { + throw new NotImplementedException(); + } + @Override public void addReviewer(AddReviewerInput in) throws RestApiException { throw new NotImplementedException(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java index 5f90d34259..02c47f430c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java @@ -29,7 +29,9 @@ import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.server.change.Abandon; import com.google.gerrit.server.change.ChangeJson; import com.google.gerrit.server.change.ChangeResource; +import com.google.gerrit.server.change.GetTopic; import com.google.gerrit.server.change.PostReviewers; +import com.google.gerrit.server.change.PutTopic; import com.google.gerrit.server.change.Restore; import com.google.gerrit.server.change.Revert; import com.google.gerrit.server.change.Revisions; @@ -53,6 +55,8 @@ class ChangeApiImpl extends ChangeApi.NotImplemented implements ChangeApi { private final Abandon abandon; private final Revert revert; private final Restore restore; + private final GetTopic getTopic; + private final PutTopic putTopic; private final Provider postReviewers; private final Provider changeJson; @@ -63,6 +67,8 @@ class ChangeApiImpl extends ChangeApi.NotImplemented implements ChangeApi { Abandon abandon, Revert revert, Restore restore, + GetTopic getTopic, + PutTopic putTopic, Provider postReviewers, Provider changeJson, @Assisted ChangeResource change) { @@ -72,6 +78,8 @@ class ChangeApiImpl extends ChangeApi.NotImplemented implements ChangeApi { this.revisionApi = revisionApi; this.abandon = abandon; this.restore = restore; + this.getTopic = getTopic; + this.putTopic = putTopic; this.postReviewers = postReviewers; this.changeJson = changeJson; this.change = change; @@ -144,6 +152,22 @@ class ChangeApiImpl extends ChangeApi.NotImplemented implements ChangeApi { } } + @Override + public String topic() throws RestApiException { + return getTopic.apply(change); + } + + @Override + public void topic(String topic) throws RestApiException { + PutTopic.Input in = new PutTopic.Input(); + in.topic = topic; + try { + putTopic.apply(change, in); + } catch (OrmException | IOException e) { + throw new RestApiException("Cannot set topic", e); + } + } + @Override public void addReviewer(String reviewer) throws RestApiException { AddReviewerInput in = new AddReviewerInput(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java index 3a2f7e70ee..074658893b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java @@ -19,7 +19,7 @@ import com.google.gerrit.extensions.restapi.RestReadView; import com.google.inject.Singleton; @Singleton -class GetTopic implements RestReadView { +public class GetTopic implements RestReadView { @Override public String apply(ChangeResource rsrc) { return Strings.nullToEmpty(rsrc.getChange().getTopic()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java index 9676762ee4..3e014444b8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java @@ -42,7 +42,7 @@ import com.google.inject.Singleton; import java.io.IOException; @Singleton -class PutTopic implements RestModifyView, +public class PutTopic implements RestModifyView, UiAction { private final Provider dbProvider; private final ChangeIndexer indexer; @@ -50,9 +50,9 @@ class PutTopic implements RestModifyView, private final ChangeUpdate.Factory updateFactory; private final ChangeMessagesUtil cmUtil; - static class Input { + public static class Input { @DefaultInput - String topic; + public String topic; } @Inject