diff --git a/Documentation/user-inline-edit.txt b/Documentation/user-inline-edit.txt index 5ad6b39ffa..a89d0db232 100644 --- a/Documentation/user-inline-edit.txt +++ b/Documentation/user-inline-edit.txt @@ -44,10 +44,9 @@ image::images/inline-edit-enter-edit-mode-from-file-list.png[width=800, link="im While in edit mode, it is possible to add new files to the change by clicking the 'Add...' button at the top of the file list. -Files can be removed from the change, or restored, by clicking the icon to the -left of the file name. Reverting a file in the change is also supported and is -achieved in two steps: remove file from the change and restore the file in the -change. +File changes can be reverted or files can be removed from the change or +deleted files can be restored, by clicking the icons to the left of the file +name. To switch from edit mode back to review mode, click the 'Done Editing' button. 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 4007e3261b..82f8c5952f 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 @@ -455,6 +455,30 @@ public class ChangeEditIT extends AbstractDaemonTest { ObjectId.fromString(edit.get().getRevision().get()), FILE_NAME), CONTENT_OLD); } + @Test + public void revertChanges() throws Exception { + assertThat(modifier.createEdit(change2, ps2)).isEqualTo( + RefUpdate.Result.NEW); + Optional edit = editUtil.byChange(change2); + assertThat(modifier.restoreFile(edit.get(), FILE_NAME)).isEqualTo( + RefUpdate.Result.FORCED); + edit = editUtil.byChange(change2); + assertByteArray(fileUtil.getContent(projectCache.get(edit.get().getChange().getProject()), + ObjectId.fromString(edit.get().getRevision().get()), FILE_NAME), CONTENT_OLD); + assertThat( + modifier.modifyFile(editUtil.byChange(change2).get(), FILE_NAME, + RestSession.newRawInput(CONTENT_NEW))).isEqualTo(RefUpdate.Result.FORCED); + edit = editUtil.byChange(change2); + assertByteArray(fileUtil.getContent(projectCache.get(edit.get().getChange().getProject()), + ObjectId.fromString(edit.get().getRevision().get()), FILE_NAME), CONTENT_NEW); + assertThat(modifier.restoreFile(edit.get(), FILE_NAME)).isEqualTo( + RefUpdate.Result.FORCED); + edit = editUtil.byChange(change2); + assertByteArray(fileUtil.getContent(projectCache.get(edit.get().getChange().getProject()), + ObjectId.fromString(edit.get().getRevision().get()), FILE_NAME), CONTENT_OLD); + editUtil.delete(edit.get()); + } + @Test public void renameFileRest() throws Exception { assertThat(modifier.createEdit(change, ps)).isEqualTo(RefUpdate.Result.NEW); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java index 2947be8dad..9b9cf2e4d5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java @@ -87,7 +87,7 @@ public class FileTable extends FlowPanel { String deltaColumn2(); String inserted(); String deleted(); - String removeButton(); + String restoreDelete(); } public static enum Mode { @@ -548,7 +548,7 @@ public class FileTable extends FlowPanel { if (mode == Mode.REVIEW) { sb.openTh().setStyleName(R.css().reviewed()).closeTh(); } else { - sb.openTh().setStyleName(R.css().removeButton()).closeTh(); + sb.openTh().setStyleName(R.css().restoreDelete()).closeTh(); } sb.openTh().setStyleName(R.css().status()).closeTh(); sb.openTh().append(Util.C.patchTableColumnName()).closeTh(); @@ -592,20 +592,26 @@ public class FileTable extends FlowPanel { } private void columnDeleteRestore(SafeHtmlBuilder sb, FileInfo info) { - sb.openTd().setStyleName(R.css().removeButton()); + sb.openTd().setStyleName(R.css().restoreDelete()); if (hasUser) { if (!Patch.COMMIT_MSG.equals(info.path())) { boolean editable = isEditable(info); - sb.openElement("button") - .setAttribute("title", editable - ? Resources.C.removeFileInline() - : Resources.C.restoreFileInline()) - .setAttribute("onclick", (editable ? DELETE : RESTORE) - + "(event," + info._row() + ")") - .append(new ImageResourceRenderer().render(editable - ? Gerrit.RESOURCES.redNot() - : Gerrit.RESOURCES.editUndo())) + sb.openDiv() + .openElement("button") + .setAttribute("title", Resources.C.restoreFileInline()) + .setAttribute("onclick", RESTORE + "(event," + info._row() + ")") + .append(new ImageResourceRenderer().render( + Gerrit.RESOURCES.editUndo())) .closeElement("button"); + if (editable) { + sb.openElement("button") + .setAttribute("title", Resources.C.removeFileInline()) + .setAttribute("onclick", DELETE + "(event," + info._row() + ")") + .append(new ImageResourceRenderer().render( + Gerrit.RESOURCES.redNot())) + .closeElement("button"); + } + sb.closeDiv(); } } sb.closeTd(); @@ -786,7 +792,7 @@ public class FileTable extends FlowPanel { if (mode == Mode.REVIEW) { sb.openTh().setStyleName(R.css().reviewed()).closeTh(); } else { - sb.openTh().setStyleName(R.css().removeButton()).closeTh(); + sb.openTh().setStyleName(R.css().restoreDelete()).closeTh(); } sb.openTh().setStyleName(R.css().status()).closeTh(); sb.openTd().closeTd(); // path diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/file_table.css b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/file_table.css index 2803db38ab..f0101cb689 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/file_table.css +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/file_table.css @@ -13,14 +13,14 @@ * limitations under the License. */ -.pointer, .reviewed, .removeButton { +.pointer, .reviewed, .restoreDelete { padding: 0px; vertical-align: top; } .pointer { width: 12px; } -.reviewed, .removeButton { +.reviewed { height: 19px; width: 20px; } @@ -96,7 +96,11 @@ background-color: #d44; } -.removeButton button { +.restoreDelete div { + white-space: nowrap; +} + +.restoreDelete button { cursor: pointer; padding: 0; margin: 0 0 0 5px;