Merge branch 'stable-2.11' into stable-2.12
* stable-2.11: Update 2.11.8 release notes Prevent NPE in the SshLog Clear the input box after cancelling add reviewer action ReviewCommand: Don't add message twice on abandon or restore Set version to 2.11.8 Release notes for Gerrit 2.11.8 Fix keyboard shortcuts for non-US keyboards Update commons-collections to 3.2.2 Change-Id: Ieef066a51f72556958be6850276361f4ab526fec
This commit is contained in:
43
ReleaseNotes/ReleaseNotes-2.11.8.txt
Normal file
43
ReleaseNotes/ReleaseNotes-2.11.8.txt
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
Release notes for Gerrit 2.11.8
|
||||||
|
===============================
|
||||||
|
|
||||||
|
Gerrit 2.11.8 is now available:
|
||||||
|
|
||||||
|
link:https://gerrit-releases.storage.googleapis.com/gerrit-2.11.8.war[
|
||||||
|
https://gerrit-releases.storage.googleapis.com/gerrit-2.11.8.war]
|
||||||
|
|
||||||
|
There are no schema changes from link:ReleaseNotes-2.11.7.html[2.11.7].
|
||||||
|
|
||||||
|
Bug Fixes
|
||||||
|
---------
|
||||||
|
|
||||||
|
* Upgrade Apache commons-collections to version 3.2.2.
|
||||||
|
+
|
||||||
|
Includes a fix for a link:https://issues.apache.org/jira/browse/COLLECTIONS-580[
|
||||||
|
remote code execution exploit].
|
||||||
|
|
||||||
|
* link:https://code.google.com/p/gerrit/issues/detail?id=1207[Issue 1207]:
|
||||||
|
Fix keyboard shortcuts for non-US keyboards on side-by-side diff screen.
|
||||||
|
+
|
||||||
|
The forward/backward navigation keys `[` and `]` only worked on keyboards where
|
||||||
|
these characters could be typed without using any modifier key (like CTRL, ALT,
|
||||||
|
etc.).
|
||||||
|
+
|
||||||
|
Note that the problem still exists on the unified diff screen.
|
||||||
|
|
||||||
|
* link:https://code.google.com/p/gerrit/issues/detail?id=3919[Issue 3919]:
|
||||||
|
Explicitly set parent project to 'All-Projects' when a project is created
|
||||||
|
without giving the parent.
|
||||||
|
|
||||||
|
* Don't add message twice on abandon or restore via ssh review command.
|
||||||
|
+
|
||||||
|
When abandoning or reviewing a change via the ssh `review` command, and
|
||||||
|
providing a message with the `--message` option, the message was added to
|
||||||
|
the change twice.
|
||||||
|
|
||||||
|
* Clear the input box after cancelling add reviewer action.
|
||||||
|
+
|
||||||
|
When the action was cancelled, the content of the input box was still
|
||||||
|
there when opening it again.
|
||||||
|
|
||||||
|
* Fix internal server error when aborting ssh command.
|
@@ -10,6 +10,7 @@ Version 2.12.x
|
|||||||
[[2_11]]
|
[[2_11]]
|
||||||
Version 2.11.x
|
Version 2.11.x
|
||||||
--------------
|
--------------
|
||||||
|
* link:ReleaseNotes-2.11.8.html[2.11.8]
|
||||||
* link:ReleaseNotes-2.11.7.html[2.11.7]
|
* link:ReleaseNotes-2.11.7.html[2.11.7]
|
||||||
* link:ReleaseNotes-2.11.6.html[2.11.6]
|
* link:ReleaseNotes-2.11.6.html[2.11.6]
|
||||||
* link:ReleaseNotes-2.11.5.html[2.11.5]
|
* link:ReleaseNotes-2.11.5.html[2.11.5]
|
||||||
|
@@ -0,0 +1,89 @@
|
|||||||
|
// Copyright (C) 2016 The Android Open Source Project
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package com.google.gerrit.acceptance.ssh;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static com.google.common.truth.Truth.assert_;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.gerrit.acceptance.AbstractDaemonTest;
|
||||||
|
import com.google.gerrit.acceptance.NoHttpd;
|
||||||
|
import com.google.gerrit.acceptance.PushOneCommit.Result;
|
||||||
|
import com.google.gerrit.extensions.common.ChangeInfo;
|
||||||
|
import com.google.gerrit.extensions.common.ChangeMessageInfo;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
@NoHttpd
|
||||||
|
public class AbandonRestoreIT extends AbstractDaemonTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void withMessage() throws Exception {
|
||||||
|
Result result = createChange();
|
||||||
|
String commit = result.getCommit().name();
|
||||||
|
executeCmd(commit, "abandon", "'abandon it'");
|
||||||
|
executeCmd(commit, "restore", "'restore it'");
|
||||||
|
assertChangeMessages(result.getChangeId(), ImmutableList.of(
|
||||||
|
"Uploaded patch set 1.",
|
||||||
|
"Abandoned\n\nabandon it",
|
||||||
|
"Restored\n\nrestore it"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void withoutMessage() throws Exception {
|
||||||
|
Result result = createChange();
|
||||||
|
String commit = result.getCommit().name();
|
||||||
|
executeCmd(commit, "abandon", null);
|
||||||
|
executeCmd(commit, "restore", null);
|
||||||
|
assertChangeMessages(result.getChangeId(), ImmutableList.of(
|
||||||
|
"Uploaded patch set 1.",
|
||||||
|
"Abandoned",
|
||||||
|
"Restored"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void executeCmd(String commit, String op, String message)
|
||||||
|
throws Exception {
|
||||||
|
StringBuilder command = new StringBuilder("gerrit review ")
|
||||||
|
.append(commit)
|
||||||
|
.append(" --")
|
||||||
|
.append(op);
|
||||||
|
if (message != null) {
|
||||||
|
command.append(" --message ").append(message);
|
||||||
|
}
|
||||||
|
String response = sshSession.exec(command.toString());
|
||||||
|
assert_()
|
||||||
|
.withFailureMessage(sshSession.getError())
|
||||||
|
.that(sshSession.hasError())
|
||||||
|
.isFalse();
|
||||||
|
assertThat(response.toLowerCase(Locale.US)).doesNotContain("error");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertChangeMessages(String changeId, List<String> expected)
|
||||||
|
throws Exception {
|
||||||
|
ChangeInfo c = get(changeId);
|
||||||
|
Iterable<ChangeMessageInfo> messages = c.messages;
|
||||||
|
assertThat(messages).isNotNull();
|
||||||
|
assertThat(messages).hasSize(expected.size());
|
||||||
|
List<String> actual = new ArrayList<>();
|
||||||
|
for (ChangeMessageInfo info : messages) {
|
||||||
|
actual.add(info.message);
|
||||||
|
}
|
||||||
|
assertThat(actual).containsExactlyElementsIn(expected);
|
||||||
|
}
|
||||||
|
}
|
@@ -134,6 +134,7 @@ public class Reviewers extends Composite {
|
|||||||
openForm.setVisible(true);
|
openForm.setVisible(true);
|
||||||
UIObject.setVisible(form, false);
|
UIObject.setVisible(form, false);
|
||||||
suggestBox.setFocus(false);
|
suggestBox.setFocus(false);
|
||||||
|
suggestBox.setText("");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addReviewer(final String reviewer, boolean confirmed) {
|
private void addReviewer(final String reviewer, boolean confirmed) {
|
||||||
|
@@ -152,6 +152,9 @@ class SshLog implements LifecycleListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Multimap<String, ?> extractParameters(DispatchCommand dcmd) {
|
private Multimap<String, ?> extractParameters(DispatchCommand dcmd) {
|
||||||
|
if (dcmd == null) {
|
||||||
|
return ArrayListMultimap.create(0, 0);
|
||||||
|
}
|
||||||
String[] cmdArgs = dcmd.getArguments();
|
String[] cmdArgs = dcmd.getArguments();
|
||||||
String paramName = null;
|
String paramName = null;
|
||||||
int argPos = 0;
|
int argPos = 0;
|
||||||
@@ -269,6 +272,9 @@ class SshLog implements LifecycleListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String extractWhat(DispatchCommand dcmd) {
|
private String extractWhat(DispatchCommand dcmd) {
|
||||||
|
if (dcmd == null) {
|
||||||
|
return "Command was already destroyed";
|
||||||
|
}
|
||||||
StringBuilder commandName = new StringBuilder(dcmd.getCommandName());
|
StringBuilder commandName = new StringBuilder(dcmd.getCommandName());
|
||||||
String[] args = dcmd.getArguments();
|
String[] args = dcmd.getArguments();
|
||||||
for (int i = 1; i < args.length; i++) {
|
for (int i = 1; i < args.length; i++) {
|
||||||
|
@@ -264,9 +264,6 @@ public class ReviewCommand extends SshCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void reviewPatchSet(final PatchSet patchSet) throws Exception {
|
private void reviewPatchSet(final PatchSet patchSet) throws Exception {
|
||||||
if (changeComment == null) {
|
|
||||||
changeComment = "";
|
|
||||||
}
|
|
||||||
if (notify == null) {
|
if (notify == null) {
|
||||||
notify = NotifyHandling.ALL;
|
notify = NotifyHandling.ALL;
|
||||||
}
|
}
|
||||||
@@ -285,22 +282,20 @@ public class ReviewCommand extends SshCommand {
|
|||||||
}
|
}
|
||||||
review.labels.putAll(customLabels);
|
review.labels.putAll(customLabels);
|
||||||
|
|
||||||
// If review labels are being applied, the comment will be included
|
// We don't need to add the review comment when abandoning/restoring.
|
||||||
// on the review note. We don't need to add it again on the abandon
|
if (abandonChange || restoreChange) {
|
||||||
// or restore comment.
|
review.message = null;
|
||||||
if (!review.labels.isEmpty() && (abandonChange || restoreChange)) {
|
|
||||||
changeComment = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (abandonChange) {
|
if (abandonChange) {
|
||||||
AbandonInput input = new AbandonInput();
|
AbandonInput input = new AbandonInput();
|
||||||
input.message = changeComment;
|
input.message = Strings.emptyToNull(changeComment);
|
||||||
applyReview(patchSet, review);
|
applyReview(patchSet, review);
|
||||||
changeApi(patchSet).abandon(input);
|
changeApi(patchSet).abandon(input);
|
||||||
} else if (restoreChange) {
|
} else if (restoreChange) {
|
||||||
RestoreInput input = new RestoreInput();
|
RestoreInput input = new RestoreInput();
|
||||||
input.message = changeComment;
|
input.message = Strings.emptyToNull(changeComment);
|
||||||
changeApi(patchSet).restore(input);
|
changeApi(patchSet).restore(input);
|
||||||
applyReview(patchSet, review);
|
applyReview(patchSet, review);
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user