diff --git a/Documentation/user-inline-edit.txt b/Documentation/user-inline-edit.txt index fff2501032..05932df124 100644 --- a/Documentation/user-inline-edit.txt +++ b/Documentation/user-inline-edit.txt @@ -59,6 +59,8 @@ screen editor for that file. To save edits, click the 'Save' button or press `CTRL-S`. To return to the change screen, click the 'Close' button. +Note that when editing the commit message, trailing blank lines will be stripped. + image::images/inline-edit-full-screen-editor.png[width=800, link="images/inline-edit-full-screen-editor.png"] If there are unsaved edits when the 'Close' button is pressed, a dialog will 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 625b33af0b..ed20e2400e 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 @@ -318,7 +318,7 @@ public class ChangeEditIT extends AbstractDaemonTest { Optional edit = editUtil.byChange(change); assertThat(edit.get().getEditCommit().getParentCount()).isEqualTo(0); - String msg = String.format("New commit message\n\nChange-Id: %s", + String msg = String.format("New commit message\n\nChange-Id: %s\n", change.getKey()); assertThat(modifier.modifyMessage(edit.get(), msg)) .isEqualTo(RefUpdate.Result.FORCED); @@ -345,8 +345,9 @@ public class ChangeEditIT extends AbstractDaemonTest { assertThat(modifier.createEdit(change, getCurrentPatchSet(changeId))) .isEqualTo(RefUpdate.Result.NEW); Optional edit = editUtil.byChange(change); - - String msg = String.format("New commit message\n\nChange-Id: %s", + assertUnchangedMessage(edit, edit.get().getEditCommit().getFullMessage()); + assertUnchangedMessage(edit, edit.get().getEditCommit().getFullMessage() + "\n\n"); + String msg = String.format("New commit message\n\nChange-Id: %s\n", change.getKey()); assertThat(modifier.modifyMessage(edit.get(), msg)).isEqualTo( RefUpdate.Result.FORCED); @@ -373,7 +374,7 @@ public class ChangeEditIT extends AbstractDaemonTest { .isEqualTo(SC_NOT_FOUND); EditMessage.Input in = new EditMessage.Input(); in.message = String.format("New commit message\n\n" + - CONTENT_NEW2_STR + "\n\nChange-Id: %s", + CONTENT_NEW2_STR + "\n\nChange-Id: %s\n", change.getKey()); assertThat(adminSession.put(urlEditMessage(), in).getStatusCode()) .isEqualTo(SC_NO_CONTENT); @@ -383,7 +384,7 @@ public class ChangeEditIT extends AbstractDaemonTest { Optional edit = editUtil.byChange(change); assertThat(edit.get().getEditCommit().getFullMessage()) .isEqualTo(in.message); - in.message = String.format("New commit message2\n\nChange-Id: %s", + in.message = String.format("New commit message2\n\nChange-Id: %s\n", change.getKey()); assertThat(adminSession.put(urlEditMessage(), in).getStatusCode()) .isEqualTo(SC_NO_CONTENT); @@ -712,6 +713,14 @@ public class ChangeEditIT extends AbstractDaemonTest { assertThat(approvals.get(0).value).isEqualTo(1); } + private void assertUnchangedMessage(Optional edit, String message) + throws Exception { + exception.expect(UnchangedCommitMessageException.class); + exception.expectMessage( + "New commit message cannot be same as existing commit message"); + modifier.modifyMessage(edit.get(), message); + } + @Test public void testHasEditPredicate() throws Exception { assertThat(modifier.createEdit(change, ps)).isEqualTo(RefUpdate.Result.NEW); diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java index 5da8b1ef37..4b6e7e4339 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/clippy/client/CopyableLabel.java @@ -274,6 +274,7 @@ public class CopyableLabel extends Composite implements HasText { try { t.setText(getText()); content.add(t); + t.setFocus(true); t.selectAll(); boolean ok = execCommand("copy"); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditScreen.java index 5cb3fbcbdc..a546c62524 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editor/EditScreen.java @@ -518,6 +518,13 @@ public class EditScreen extends Screen { if (!cm.isClean(generation)) { close.setEnabled(false); String text = cm.getValue(); + if (Patch.COMMIT_MSG.equals(path)) { + String trimmed = text.trim() + "\r"; + if (!trimmed.equals(text)) { + text = trimmed; + cm.setValue(text); + } + } final int g = cm.changeGeneration(false); ChangeEditApi.put(revision.getParentKey().get(), path, text, new GerritCallback() { diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java index 1c70468c22..cd1c7a3544 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java @@ -28,6 +28,7 @@ import com.google.gerrit.pgm.init.api.InitFlags; import com.google.gerrit.pgm.init.api.InstallPlugins; import com.google.gerrit.pgm.util.SiteProgram; import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.config.GerritServerConfigModule; import com.google.gerrit.server.config.SitePath; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.GitRepositoryManager; @@ -222,6 +223,7 @@ public class BaseInit extends SiteProgram { throw die(err); } + m.add(new GerritServerConfigModule()); m.add(new InitModule(standalone, initDb)); m.add(new AbstractModule() { @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java index d0c11e748a..e44c810c05 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java @@ -227,6 +227,7 @@ public class ChangeEditModifier { public RefUpdate.Result modifyMessage(ChangeEdit edit, String msg) throws AuthException, InvalidChangeOperationException, IOException, UnchangedCommitMessageException { + msg = msg.trim() + "\n"; checkState(!Strings.isNullOrEmpty(msg), "message cannot be null"); if (!currentUser.get().isIdentifiedUser()) { throw new AuthException("Authentication required"); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java index 6eb336d30d..d94df9c14c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java @@ -102,19 +102,19 @@ public class JarScanner implements PluginContentScanner { throw new InvalidPluginException("Cannot auto-register", err); } catch (RuntimeException err) { PluginLoader.log.warn(String.format( - "Plugin %s has invaild class file %s inside of %s", pluginName, + "Plugin %s has invalid class file %s inside of %s", pluginName, entry.getName(), jarFile.getName()), err); continue; } - if (def.isConcrete()) { - if (!Strings.isNullOrEmpty(def.annotationName)) { - rawMap.put(def.annotationName, def); + if (!Strings.isNullOrEmpty(def.annotationName)) { + if (def.isConcrete()) { + rawMap.put(def.annotationName, def); + } else { + PluginLoader.log.warn(String.format( + "Plugin %s tries to @%s(\"%s\") abstract class %s", pluginName, + def.annotationName, def.annotationValue, def.className)); } - } else { - PluginLoader.log.warn(String.format( - "Plugin %s tries to @%s(\"%s\") abstract class %s", pluginName, - def.annotationName, def.annotationValue, def.className)); } }