From 2830c29fabdfbfce346284fcf44128bb2dc32932 Mon Sep 17 00:00:00 2001 From: David Ostrovsky Date: Fri, 1 Aug 2014 02:24:31 +0200 Subject: [PATCH] InlineEdit: Add DELETE /changes//edit/path%2fto%2ffile REST endpoint Allow to delete file from change edit. Change-Id: I62ea1f3df02a2872ed51456f44fa961dfe518b37 --- Documentation/rest-api-changes.txt | 22 +++++++++++++ .../gerrit/acceptance/edit/ChangeEditIT.java | 16 ++++++++++ .../gerrit/server/change/ChangeEdits.java | 32 ++++++++++++++++++- .../google/gerrit/server/change/Module.java | 1 + 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt index c499eaade9..0635a7fdf7 100644 --- a/Documentation/rest-api-changes.txt +++ b/Documentation/rest-api-changes.txt @@ -1247,6 +1247,28 @@ response "`204 No Content`" is returned. HTTP/1.1 204 No Content ---- +[[delete-edit-file]] +=== Delete file in Change Edit +-- +'DELETE /changes/link:#change-id[\{change-id\}]/edit/path%2fto%2ffile' +-- + +Deletes a file from a change edit. This deletes the file from the repository +completely. This is not the same as reverting or restoring a file to its +previous contents. + +.Request +---- + DELETE /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/edit/foo HTTP/1.0 +---- + +When change edit doesn't exist for this change yet it is created. + +.Response +---- + HTTP/1.1 204 No Content +---- + [[reviewer-endpoints]] == Reviewer Endpoints diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java index 8814a9eb6e..80a7119249 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/edit/ChangeEditIT.java @@ -262,6 +262,22 @@ public class ChangeEditIT extends AbstractDaemonTest { } } + @Test + public void deleteExistingFileRest() throws Exception { + assertEquals(RefUpdate.Result.NEW, + modifier.createEdit( + change, + ps)); + assertEquals(SC_NO_CONTENT, session.delete(urlEditFile()).getStatusCode()); + Optional edit = editUtil.byChange(change); + try { + fileUtil.getContent(edit.get().getChange().getProject(), + edit.get().getRevision().get(), FILE_NAME); + fail("ResourceNotFoundException expected"); + } catch (ResourceNotFoundException rnfe) { + } + } + @Test public void restoreDeletedFileInEdit() throws Exception { assertEquals(RefUpdate.Result.NEW, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java index c8439e8437..4d673b94eb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeEdits.java @@ -23,7 +23,6 @@ import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.restapi.AcceptsCreate; import com.google.gerrit.extensions.restapi.AcceptsPost; import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.ChildCollection; import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.IdString; @@ -280,4 +279,35 @@ public class ChangeEdits implements return Response.none(); } } + + /** + * Handler to delete a file. + *

+ * This deletes the file from the repository completely. This is not the same + * as reverting or restoring a file to its previous contents. + */ + @Singleton + static class DeleteContent implements + RestModifyView { + public static class Input { + } + + private final ChangeEditModifier editModifier; + + @Inject + DeleteContent(ChangeEditModifier editModifier) { + this.editModifier = editModifier; + } + + @Override + public Response apply(ChangeEditResource rsrc, DeleteContent.Input input) + throws AuthException, ResourceConflictException { + try { + editModifier.deleteFile(rsrc.getChangeEdit(), rsrc.getPath()); + } catch(InvalidChangeOperationException | IOException e) { + throw new ResourceConflictException(e.getMessage()); + } + return Response.none(); + } + } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java index 68c735cec3..61808fc6a1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Module.java @@ -103,6 +103,7 @@ public class Module extends RestApiModule { child(CHANGE_KIND, "edit").to(ChangeEdits.class); put(CHANGE_EDIT_KIND, "/").to(ChangeEdits.Put.class); + delete(CHANGE_EDIT_KIND).to(ChangeEdits.DeleteContent.class); install(new FactoryModule() { @Override