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 2f66b7db28..dbe828e39d 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 @@ -27,6 +27,7 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.RestApiException; import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Constants; import org.junit.Test; import java.io.IOException; @@ -110,4 +111,19 @@ public class ChangeIT extends AbstractDaemonTest { .id("p~master~" + r.getChangeId()) .addReviewer(in); } + + @Test + public void createEmptyChange() throws RestApiException { + ChangeInfo in = new ChangeInfo(); + in.branch = Constants.MASTER; + in.subject = "Create a change from the API"; + in.project = project.get(); + ChangeInfo info = gApi + .changes() + .create(in) + .get(); + assertEquals(in.project, info.project); + assertEquals(in.branch, info.branch); + assertEquals(in.subject, info.subject); + } } diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java index 76fd0f10cf..ecf0d9e120 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java @@ -28,6 +28,7 @@ public interface Changes { ChangeApi id(String triplet) throws RestApiException; ChangeApi id(String project, String branch, String id) throws RestApiException; + ChangeApi create(ChangeInfo in) throws RestApiException; /** * Shorthand for {@link #query(QueryParameter)} without any conditions (i.e. lists all changes). @@ -113,6 +114,11 @@ public interface Changes { throw new NotImplementedException(); } + @Override + public ChangeApi create(ChangeInfo in) throws RestApiException { + throw new NotImplementedException(); + } + @Override public List query() throws RestApiException { throw new NotImplementedException(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java index 27493dd894..976228fc6d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java @@ -18,22 +18,32 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.gerrit.extensions.api.changes.ChangeApi; import com.google.gerrit.extensions.api.changes.Changes; +import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.restapi.IdString; import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.gerrit.extensions.restapi.Url; +import com.google.gerrit.server.change.ChangeJson; import com.google.gerrit.server.change.ChangesCollection; +import com.google.gerrit.server.change.CreateChange; +import com.google.gerrit.server.project.InvalidChangeOperationException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import java.io.IOException; + class ChangesImpl extends Changes.NotImplemented implements Changes { private final ChangesCollection changes; private final ChangeApiImpl.Factory api; + private final CreateChange.Factory createChangeFactory; @Inject - ChangesImpl(ChangesCollection changes, ChangeApiImpl.Factory api) { + ChangesImpl(ChangesCollection changes, + ChangeApiImpl.Factory api, + CreateChange.Factory createChangeFactory) { this.changes = changes; this.api = api; + this.createChangeFactory = createChangeFactory; } @Override @@ -60,4 +70,16 @@ class ChangesImpl extends Changes.NotImplemented implements Changes { throw new RestApiException("Cannot parse change", e); } } + + @Override + public ChangeApi create(ChangeInfo in) throws RestApiException { + try { + ChangeJson.ChangeInfo out = createChangeFactory.create().apply( + TopLevelResource.INSTANCE, in).value(); + return api.create(changes.parse(TopLevelResource.INSTANCE, + IdString.fromUrl(out.changeId))); + } catch (OrmException | IOException | InvalidChangeOperationException e) { + throw new RestApiException("Cannot create change", e); + } + } }