Merge "ChangeScreen: Allow to disable muting of common paths in file table"
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index c6215c9..40873fe 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -2172,7 +2172,8 @@
|Field Name ||Description
|`name` |optional|
The name of the project (not encoded). +
-If set, must match the project name in the URL.
+If set, must match the project name in the URL. +
+If name ends with `.git` the suffix will be automatically removed.
|`parent` |optional|
The name of the parent project. +
If not set, the `All-Projects` project will be the parent project.
diff --git a/Documentation/user-review-ui.txt b/Documentation/user-review-ui.txt
index 42c3e0d..ab1070a 100644
--- a/Documentation/user-review-ui.txt
+++ b/Documentation/user-review-ui.txt
@@ -599,10 +599,6 @@
each label on which the user is allowed to vote. Voting on non-current
patch sets is not possible.
-Typing "LGTM" (acronym for 'Looks Good To Me') in the summary comment
-text box automatically selects the highest possible score for the
-'Code-Review' label.
-
The inline draft comments that will be published are displayed in a
separate section so that they can be reviewed before publishing. There
are links to navigate to the inline comments which can be used if a
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
index 97d46dce..84c2674 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -163,7 +163,7 @@
}
}
- protected static Config wholeTopicEnabledConfig() {
+ protected static Config submitWholeTopicEnabledConfig() {
Config cfg = new Config();
cfg.setBoolean("change", null, "submitWholeTopic", true);
return cfg;
@@ -179,6 +179,10 @@
return cfg.getBoolean("change", "allowDrafts", true);
}
+ protected boolean isSubmitWholeTopicEnabled() {
+ return cfg.getBoolean("change", null, "submitWholeTopic", false);
+ }
+
private void beforeTest(Config cfg, boolean memory, boolean enableHttpd) throws Exception {
server = startServer(cfg, memory, enableHttpd);
server.getTestInjector().injectMembers(this);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
index d2e70c3..7de4712 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
@@ -44,6 +44,17 @@
.name);
}
+ @Test
+ public void createProjectFooWithGitSuffix() throws Exception {
+ String name = "foo";
+ assertThat(name).isEqualTo(
+ gApi.projects()
+ .name(name + ".git")
+ .create()
+ .get()
+ .name);
+ }
+
@Test(expected = RestApiException.class)
public void createProjectFooBar() throws Exception {
ProjectInput in = new ProjectInput();
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
index 94f965a..41918e3 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -17,6 +17,7 @@
import static com.google.common.collect.Iterables.getOnlyElement;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assert_;
+import static com.google.common.truth.TruthJUnit.assume;
import static com.google.gerrit.acceptance.GitUtil.cloneProject;
import static com.google.gerrit.extensions.client.ListChangesOption.CURRENT_REVISION;
import static com.google.gerrit.extensions.client.ListChangesOption.DETAILED_LABELS;
@@ -82,7 +83,7 @@
public abstract class AbstractSubmit extends AbstractDaemonTest {
@ConfigSuite.Config
public static Config submitWholeTopicEnabled() {
- return wholeTopicEnabledConfig();
+ return submitWholeTopicEnabledConfig();
}
private Map<String, String> mergeResults;
@@ -134,6 +135,21 @@
assertThat(getRemoteHead().getId()).isEqualTo(change.getCommitId());
}
+ @Test
+ public void submitWholeTopic() throws Exception {
+ assume().that(isSubmitWholeTopicEnabled()).isTrue();
+ Git git = createProject();
+ PushOneCommit.Result change1 =
+ createChange(git, "Change 1", "a.txt", "content", "test-topic");
+ PushOneCommit.Result change2 =
+ createChange(git, "Change 2", "b.txt", "content", "test-topic");
+ approve(change1.getChangeId());
+ approve(change2.getChangeId());
+ submit(change2.getChangeId());
+ change1.assertChange(Change.Status.MERGED, "test-topic", admin);
+ change2.assertChange(Change.Status.MERGED, "test-topic", admin);
+ }
+
protected Git createProject() throws JSchException, IOException,
GitAPIException {
return createProject(true);
@@ -183,6 +199,14 @@
return push.to(git, "refs/for/master");
}
+ protected PushOneCommit.Result createChange(Git git, String subject,
+ String fileName, String content, String topic)
+ throws GitAPIException, IOException {
+ PushOneCommit push =
+ pushFactory.create(db, admin.getIdent(), subject, fileName, content);
+ return push.to(git, "refs/for/master/" + topic);
+ }
+
protected void submit(String changeId) throws IOException {
submit(changeId, HttpStatus.SC_OK);
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
index ad8b3eb..311161a 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
@@ -78,7 +78,7 @@
ChangeInfo ci = newChangeInfo(ChangeStatus.DRAFT);
RestResponse r = adminSession.post("/changes/", ci);
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_METHOD_NOT_ALLOWED);
- assertThat(r.getEntityContent()).contains("cannot upload drafts");
+ assertThat(r.getEntityContent()).contains("draft workflow is disabled");
}
private ChangeInfo newChangeInfo(ChangeStatus status) {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DraftChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DraftChangeIT.java
index 609c9a9..a3809a9 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DraftChangeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/DraftChangeIT.java
@@ -103,7 +103,7 @@
public void createDraftChangeWhenDraftsNotAllowed() throws Exception {
assume().that(isAllowDrafts()).isFalse();
PushOneCommit.Result r = createDraftChange();
- r.assertErrorStatus("cannot upload drafts");
+ r.assertErrorStatus("draft workflow is disabled");
}
private PushOneCommit.Result createDraftChange() throws Exception {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
index a87e972..998c5ea 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -58,6 +58,17 @@
}
@Test
+ public void testCreateProjectApiWithGitSuffix() throws Exception {
+ final String newProjectName = "newProject";
+ ProjectInfo p = gApi.projects().name(newProjectName + ".git").create().get();
+ assertThat(p.name).isEqualTo(newProjectName);
+ ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+ assertThat(projectState).isNotNull();
+ assertProjectInfo(projectState.getProject(), p);
+ assertHead(newProjectName, "refs/heads/master");
+ }
+
+ @Test
public void testCreateProject() throws Exception {
final String newProjectName = "newProject";
RestResponse r = adminSession.put("/projects/" + newProjectName);
@@ -71,6 +82,19 @@
}
@Test
+ public void testCreateProjectWithGitSuffix() throws Exception {
+ final String newProjectName = "newProject";
+ RestResponse r = adminSession.put("/projects/" + newProjectName + ".git");
+ assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_CREATED);
+ ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class);
+ assertThat(p.name).isEqualTo(newProjectName);
+ ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+ assertThat(projectState).isNotNull();
+ assertProjectInfo(projectState.getProject(), p);
+ assertHead(newProjectName, "refs/heads/master");
+ }
+
+ @Test
public void testCreateProjectWithNameMismatch_BadRequest() throws Exception {
ProjectInput in = new ProjectInput();
in.name = "otherName";
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java
new file mode 100644
index 0000000..761e282
--- /dev/null
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetProjectIT.java
@@ -0,0 +1,51 @@
+// Copyright (C) 2015 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.rest.project;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.common.ProjectInfo;
+
+import org.apache.http.HttpStatus;
+import org.junit.Test;
+
+public class GetProjectIT extends AbstractDaemonTest {
+
+ @Test
+ public void getProject() throws Exception {
+ String name = project.get();
+ RestResponse r = adminSession.get("/projects/" + name);
+ assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
+ ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class);
+ assertThat(p.name).isEqualTo(name);
+ }
+
+ @Test
+ public void getProjectWithGitSuffix() throws Exception {
+ String name = project.get();
+ RestResponse r = adminSession.get("/projects/" + name + ".git");
+ assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
+ ProjectInfo p = newGson().fromJson(r.getReader(), ProjectInfo.class);
+ assertThat(p.name).isEqualTo(name);
+ }
+
+ @Test
+ public void getProjectNotExisting() throws Exception {
+ RestResponse r = adminSession.get("/projects/does-not-exist");
+ assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_NOT_FOUND);
+ }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
index dfce940..fbd3c29 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
@@ -22,6 +22,7 @@
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.client.Comment;
import com.google.gerrit.extensions.client.Side;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.server.notedb.NotesMigration;
@@ -44,83 +45,95 @@
return NotesMigration.allEnabledConfig();
}
+ private final Integer lines[] = {0, 1};
+
@Test
public void createDraft() throws Exception {
- PushOneCommit.Result r = createChange();
- String changeId = r.getChangeId();
- String revId = r.getCommit().getName();
- ReviewInput.CommentInput comment = newCommentInfo(
- "file1", Side.REVISION, 1, "comment 1");
- addDraft(changeId, revId, comment);
- Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
- assertThat(result).hasSize(1);
- CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
- assertCommentInfo(comment, actual);
+ for (Integer line : lines) {
+ PushOneCommit.Result r = createChange();
+ String changeId = r.getChangeId();
+ String revId = r.getCommit().getName();
+ ReviewInput.CommentInput comment = newCommentInfo(
+ "file1", Side.REVISION, line, "comment 1");
+ addDraft(changeId, revId, comment);
+ Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
+ assertThat(result).hasSize(1);
+ CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+ assertCommentInfo(comment, actual);
+ }
}
@Test
public void postComment() throws Exception {
- String file = "file";
- String contents = "contents";
- PushOneCommit push = pushFactory.create(db, admin.getIdent(),
- "first subject", file, contents);
- PushOneCommit.Result r = push.to(git, "refs/for/master");
- String changeId = r.getChangeId();
- String revId = r.getCommit().getName();
- ReviewInput input = new ReviewInput();
- ReviewInput.CommentInput comment = newCommentInfo(
- file, Side.REVISION, 1, "comment 1");
- input.comments = new HashMap<>();
- input.comments.put(comment.path, Lists.newArrayList(comment));
- revision(r).review(input);
- Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
- assertThat(result).isNotEmpty();
- CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
- assertCommentInfo(comment, actual);
+ for (Integer line : lines) {
+ String file = "file";
+ String contents = "contents " + line;
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(),
+ "first subject", file, contents);
+ PushOneCommit.Result r = push.to(git, "refs/for/master");
+ String changeId = r.getChangeId();
+ String revId = r.getCommit().getName();
+ ReviewInput input = new ReviewInput();
+ ReviewInput.CommentInput comment = newCommentInfo(
+ file, Side.REVISION, line, "comment 1");
+ input.comments = new HashMap<>();
+ input.comments.put(comment.path, Lists.newArrayList(comment));
+ revision(r).review(input);
+ Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+ assertThat(result).isNotEmpty();
+ CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+ assertCommentInfo(comment, actual);
+ }
}
@Test
public void putDraft() throws Exception {
- PushOneCommit.Result r = createChange();
- String changeId = r.getChangeId();
- String revId = r.getCommit().getName();
- ReviewInput.CommentInput comment = newCommentInfo(
- "file1", Side.REVISION, 1, "comment 1");
- addDraft(changeId, revId, comment);
- Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
- CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
- assertCommentInfo(comment, actual);
- String uuid = actual.id;
- comment.message = "updated comment 1";
- updateDraft(changeId, revId, comment, uuid);
- result = getDraftComments(changeId, revId);
- actual = Iterables.getOnlyElement(result.get(comment.path));
- assertCommentInfo(comment, actual);
+ for (Integer line : lines) {
+ PushOneCommit.Result r = createChange();
+ String changeId = r.getChangeId();
+ String revId = r.getCommit().getName();
+ ReviewInput.CommentInput comment = newCommentInfo(
+ "file1", Side.REVISION, line, "comment 1");
+ addDraft(changeId, revId, comment);
+ Map<String, List<CommentInfo>> result = getDraftComments(changeId, revId);
+ CommentInfo actual = Iterables.getOnlyElement(result.get(comment.path));
+ assertCommentInfo(comment, actual);
+ String uuid = actual.id;
+ comment.message = "updated comment 1";
+ updateDraft(changeId, revId, comment, uuid);
+ result = getDraftComments(changeId, revId);
+ actual = Iterables.getOnlyElement(result.get(comment.path));
+ assertCommentInfo(comment, actual);
+ }
}
@Test
public void getDraft() throws Exception {
- PushOneCommit.Result r = createChange();
- String changeId = r.getChangeId();
- String revId = r.getCommit().getName();
- ReviewInput.CommentInput comment = newCommentInfo(
- "file1", Side.REVISION, 1, "comment 1");
- CommentInfo returned = addDraft(changeId, revId, comment);
- CommentInfo actual = getDraftComment(changeId, revId, returned.id);
- assertCommentInfo(comment, actual);
+ for (Integer line : lines) {
+ PushOneCommit.Result r = createChange();
+ String changeId = r.getChangeId();
+ String revId = r.getCommit().getName();
+ ReviewInput.CommentInput comment = newCommentInfo(
+ "file1", Side.REVISION, line, "comment 1");
+ CommentInfo returned = addDraft(changeId, revId, comment);
+ CommentInfo actual = getDraftComment(changeId, revId, returned.id);
+ assertCommentInfo(comment, actual);
+ }
}
@Test
public void deleteDraft() throws Exception {
- PushOneCommit.Result r = createChange();
- String changeId = r.getChangeId();
- String revId = r.getCommit().getName();
- ReviewInput.CommentInput comment = newCommentInfo(
- "file1", Side.REVISION, 1, "comment 1");
- CommentInfo returned = addDraft(changeId, revId, comment);
- deleteDraft(changeId, revId, returned.id);
- Map<String, List<CommentInfo>> drafts = getDraftComments(changeId, revId);
- assertThat(drafts).isEmpty();
+ for (Integer line : lines) {
+ PushOneCommit.Result r = createChange();
+ String changeId = r.getChangeId();
+ String revId = r.getCommit().getName();
+ ReviewInput.CommentInput comment = newCommentInfo(
+ "file1", Side.REVISION, line, "comment 1");
+ CommentInfo returned = addDraft(changeId, revId, comment);
+ deleteDraft(changeId, revId, returned.id);
+ Map<String, List<CommentInfo>> drafts = getDraftComments(changeId, revId);
+ assertThat(drafts).isEmpty();
+ }
}
private CommentInfo addDraft(String changeId, String revId,
@@ -176,18 +189,40 @@
assertThat(actual.line).isEqualTo(expected.line);
assertThat(actual.message).isEqualTo(expected.message);
assertThat(actual.inReplyTo).isEqualTo(expected.inReplyTo);
+ assertCommentRange(expected.range, actual.range);
if (actual.side == null) {
assertThat(Side.REVISION).isEqualTo(expected.side);
}
}
+ private static void assertCommentRange(Comment.Range expected,
+ Comment.Range actual) {
+ if (expected == null) {
+ assertThat(actual).isNull();
+ } else {
+ assertThat(actual).isNotNull();
+ assertThat(actual.startLine).isEqualTo(expected.startLine);
+ assertThat(actual.startCharacter).isEqualTo(expected.startCharacter);
+ assertThat(actual.endLine).isEqualTo(expected.endLine);
+ assertThat(actual.endCharacter).isEqualTo(expected.endCharacter);
+ }
+ }
+
private ReviewInput.CommentInput newCommentInfo(String path,
Side side, int line, String message) {
ReviewInput.CommentInput input = new ReviewInput.CommentInput();
input.path = path;
input.side = side;
- input.line = line;
+ input.line = line != 0 ? line : null;
input.message = message;
+ if (line != 0) {
+ Comment.Range range = new Comment.Range();
+ range.startLine = 1;
+ range.startCharacter = 1;
+ range.endLine = 1;
+ range.endCharacter = 5;
+ input.range = range;
+ }
return input;
}
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
index 5eb936c..fd9f4bc 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
@@ -76,8 +76,6 @@
import java.util.TreeSet;
class ReplyBox extends Composite {
- private static final String CODE_REVIEW = "Code-Review";
-
interface Binder extends UiBinder<HTMLPanel, ReplyBox> {}
private static final Binder uiBinder = GWT.create(Binder.class);
@@ -92,7 +90,6 @@
private final String revision;
private ReviewInput in = ReviewInput.create();
private int labelHelpColumn;
- private Runnable lgtm;
@UiField Styles style;
@UiField TextArea message;
@@ -173,20 +170,6 @@
}}, 0);
}
- @UiHandler("message")
- void onMessageKey(KeyPressEvent event) {
- if (lgtm != null
- && event.getCharCode() == 'M'
- && message.getValue().equals("LGT")) {
- Scheduler.get().scheduleDeferred(new ScheduledCommand() {
- @Override
- public void execute() {
- lgtm.run();
- }
- });
- }
- }
-
@UiHandler("post")
void onPost(@SuppressWarnings("unused") ClickEvent e) {
postReview();
@@ -358,15 +341,6 @@
labelsTable.setWidget(row, 1 + i, b);
}
}
-
- if (CODE_REVIEW.equalsIgnoreCase(id) && !group.buttons.isEmpty()) {
- lgtm = new Runnable() {
- @Override
- public void run() {
- group.selectMax();
- }
- };
- }
}
private void renderCheckBox(int row, LabelAndValues lv) {
@@ -390,15 +364,6 @@
});
b.setStyleName(style.label_name());
labelsTable.setWidget(row, 0, b);
-
- if (CODE_REVIEW.equalsIgnoreCase(id)) {
- lgtm = new Runnable() {
- @Override
- public void run() {
- b.setValue(true, true);
- }
- };
- }
}
private static boolean isCheckBox(Set<Short> values) {
@@ -467,16 +432,6 @@
selected = b;
labelsTable.setText(row, labelHelpColumn, b.text);
}
-
- void selectMax() {
- for (int i = 0; i < buttons.size() - 1; i++) {
- buttons.get(i).setValue(false, false);
- }
-
- LabelRadioButton max = buttons.get(buttons.size() - 1);
- max.setValue(true, true);
- max.select();
- }
}
private class LabelRadioButton extends RadioButton implements
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java b/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java
index 2dc034b..d6b194b 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java
@@ -51,6 +51,7 @@
Modes.I.gas(),
Modes.I.gerrit_commit(),
Modes.I.gfm(),
+ Modes.I.go(),
Modes.I.groovy(),
Modes.I.haskell(),
Modes.I.htmlmixed(),
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java b/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java
index 2bd5b00..e511be5 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java
@@ -36,6 +36,7 @@
@Source("gas.js") @DoNotEmbed DataResource gas();
@Source("gerrit/commit.js") @DoNotEmbed DataResource gerrit_commit();
@Source("gfm.js") @DoNotEmbed DataResource gfm();
+ @Source("go.js") @DoNotEmbed DataResource go();
@Source("groovy.js") @DoNotEmbed DataResource groovy();
@Source("haskell.js") @DoNotEmbed DataResource haskell();
@Source("htmlmixed.js") @DoNotEmbed DataResource htmlmixed();
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
index 5055d47..5a0956d 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
@@ -767,10 +767,11 @@
b64 = new BinaryResult() {
@Override
public void writeTo(OutputStream out) throws IOException {
- OutputStream e = BaseEncoding.base64().encodingStream(
- new OutputStreamWriter(out, ISO_8859_1));
- src.writeTo(e);
- e.flush();
+ try (OutputStreamWriter w = new OutputStreamWriter(out, ISO_8859_1);
+ OutputStream e = BaseEncoding.base64().encodingStream(w)) {
+ src.writeTo(e);
+ e.flush();
+ }
}
};
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java
index 2c34711..3328a54 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/WarDistribution.java
@@ -49,8 +49,9 @@
String pluginJarName = new File(ze.getName()).getName();
String pluginName = pluginJarName.substring(0,
pluginJarName.length() - JAR.length());
- final InputStream in = zf.getInputStream(ze);
- processor.process(pluginName, in);
+ try (InputStream in = zf.getInputStream(ze)) {
+ processor.process(pluginName, in);
+ }
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
index 31b6384..febb782 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
@@ -136,7 +136,7 @@
}
if (!allowDrafts && input.status == ChangeStatus.DRAFT) {
- throw new MethodNotAllowedException("cannot upload drafts");
+ throw new MethodNotAllowedException("draft workflow is disabled");
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java
index d1742cc..b276aae 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java
@@ -15,6 +15,7 @@
package com.google.gerrit.server.change;
import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
@@ -57,7 +58,8 @@
@Override
public Response<?> apply(ChangeResource rsrc, Input input)
throws ResourceConflictException, AuthException,
- ResourceNotFoundException, OrmException, IOException {
+ ResourceNotFoundException, MethodNotAllowedException,
+ OrmException, IOException {
if (rsrc.getChange().getStatus() != Status.DRAFT) {
throw new ResourceConflictException("Change is not a draft");
}
@@ -67,7 +69,7 @@
}
if (!allowDrafts) {
- throw new ResourceConflictException("Draft workflow is disabled");
+ throw new MethodNotAllowedException("draft workflow is disabled");
}
try {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java
index 373ec27..f52435e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java
@@ -15,6 +15,7 @@
package com.google.gerrit.server.change;
import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
@@ -69,7 +70,8 @@
@Override
public Response<?> apply(RevisionResource rsrc, Input input)
throws AuthException, ResourceNotFoundException,
- ResourceConflictException, OrmException, IOException {
+ ResourceConflictException, MethodNotAllowedException,
+ OrmException, IOException {
PatchSet patchSet = rsrc.getPatchSet();
PatchSet.Id patchSetId = patchSet.getId();
Change change = rsrc.getChange();
@@ -79,7 +81,7 @@
}
if (!allowDrafts) {
- throw new ResourceConflictException("Draft workflow is disabled");
+ throw new MethodNotAllowedException("draft workflow is disabled");
}
if (!rsrc.getControl().canDeleteDraft(dbProvider.get())) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
index 47e7b65..cd54b78 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
@@ -358,7 +358,7 @@
new PatchLineComment.Key(
new Patch.Key(rsrc.getPatchSet().getId(), path),
ChangeUtil.messageUUID(db.get())),
- c.line,
+ c.line != null ? c.line : 0,
rsrc.getAccountId(),
parent, timestamp);
} else if (parent != null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index 604d995..fd424d5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -1268,13 +1268,17 @@
return;
}
- if (magicBranch.draft
- && (!receiveConfig.allowDrafts
- || projectControl.controlForRef("refs/drafts/" + ref)
- .isBlocked(Permission.PUSH))) {
- errors.put(Error.CODE_REVIEW, ref);
- reject(cmd, "cannot upload drafts");
- return;
+ if (magicBranch.draft) {
+ if (!receiveConfig.allowDrafts) {
+ errors.put(Error.CODE_REVIEW, ref);
+ reject(cmd, "draft workflow is disabled");
+ return;
+ } else if (projectControl.controlForRef("refs/drafts/" + ref)
+ .isBlocked(Permission.PUSH)) {
+ errors.put(Error.CODE_REVIEW, ref);
+ reject(cmd, "cannot upload drafts");
+ return;
+ }
}
if (!magicBranch.ctl.canUpload()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java
index 0c384b7..8b6da7b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReviewNoteMerger.java
@@ -43,6 +43,7 @@
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.ObjectLoader;
import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.lib.ObjectStream;
import org.eclipse.jgit.notes.Note;
import org.eclipse.jgit.notes.NoteMerger;
import org.eclipse.jgit.util.io.UnionInputStream;
@@ -67,12 +68,13 @@
ObjectLoader lo = reader.open(ours.getData());
byte[] sep = new byte[] {'\n'};
ObjectLoader lt = reader.open(theirs.getData());
- UnionInputStream union = new UnionInputStream(
- lo.openStream(),
- new ByteArrayInputStream(sep),
- lt.openStream());
- ObjectId noteData = inserter.insert(Constants.OBJ_BLOB,
- lo.getSize() + sep.length + lt.getSize(), union);
- return new Note(ours, noteData);
+ try (ObjectStream os = lo.openStream();
+ ByteArrayInputStream b = new ByteArrayInputStream(sep);
+ ObjectStream ts = lt.openStream();
+ UnionInputStream union = new UnionInputStream(os, b, ts)) {
+ ObjectId noteData = inserter.insert(Constants.OBJ_BLOB,
+ lo.getSize() + sep.length + lt.getSize(), union);
+ return new Note(ours, noteData);
+ }
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
index 2b73ff9..3d65fa7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
@@ -207,11 +207,11 @@
schema.submoduleSubscriptions().bySubmodule(updatedBranch).toList();
if (!subscribers.isEmpty()) {
- String msgbuf = msg;
- if (msgbuf == null) {
- // Initialize the message buffer
- msgbuf = "";
-
+ // Initialize the message buffer
+ StringBuilder sb = new StringBuilder();
+ if (msg != null) {
+ sb.append(msg);
+ } else {
// The first updatedBranch on a cascade event of automatic
// updates of repos is added to updatedSubscribers set so
// if we face a situation having
@@ -227,8 +227,8 @@
&& (c.getStatusCode() == CommitMergeStatus.CLEAN_MERGE
|| c.getStatusCode() == CommitMergeStatus.CLEAN_PICK
|| c.getStatusCode() == CommitMergeStatus.CLEAN_REBASE)) {
- msgbuf += "\n";
- msgbuf += c.getFullMessage();
+ sb.append("\n")
+ .append(c.getFullMessage());
}
}
}
@@ -246,7 +246,7 @@
Map<Branch.NameKey, String> paths = new HashMap<>(1);
paths.put(updatedBranch, s.getPath());
- updateGitlinks(s.getSuperProject(), myRw, modules, paths, msgbuf);
+ updateGitlinks(s.getSuperProject(), myRw, modules, paths, sb.toString());
}
} catch (SubmoduleException e) {
log.warn("Cannot update gitlinks for " + s + " due to " + e.getMessage());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentsInNotesUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentsInNotesUtil.java
index 652f37e..34ecbc0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentsInNotesUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/CommentsInNotesUtil.java
@@ -232,7 +232,9 @@
int startLine = RawParseUtils.parseBase10(note, ptr.value, ptr);
if (startLine == 0) {
- return null;
+ range.setEndLine(0);
+ ptr.value += 1;
+ return range;
}
if (note[ptr.value] == '\n') {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
index a1d8ea5..0b037fb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
@@ -253,12 +253,14 @@
public File get() {
if (!ready) {
synchronized (dataDir) {
- if (!dataDir.exists() && !dataDir.mkdirs()) {
- throw new ProvisionException(String.format(
- "Cannot create %s for plugin %s",
- dataDir.getAbsolutePath(), getName()));
+ if (!ready) {
+ if (!dataDir.exists() && !dataDir.mkdirs()) {
+ throw new ProvisionException(String.format(
+ "Cannot create %s for plugin %s",
+ dataDir.getAbsolutePath(), getName()));
+ }
+ ready = true;
}
- ready = true;
}
}
return dataDir;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java
index 519f4f2..2f0386f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectsCollection.java
@@ -31,6 +31,8 @@
import java.io.IOException;
+import org.eclipse.jgit.lib.Constants;
+
@Singleton
public class ProjectsCollection implements
RestCollection<TopLevelResource, ProjectResource>,
@@ -88,6 +90,9 @@
}
private ProjectResource _parse(String id) throws IOException {
+ if (id.endsWith(Constants.DOT_GIT_EXT)) {
+ id = id.substring(0, id.length() - Constants.DOT_GIT_EXT.length());
+ }
ProjectControl ctl;
try {
ctl = controlFactory.controlFor(
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
index c356a19..db17f80 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
@@ -812,7 +812,6 @@
noteString);
}
-
@Test
public void patchLineCommentMultipleOnePatchsetOneFileBothSides()
throws Exception {
@@ -1154,6 +1153,34 @@
}
@Test
+ public void fileComment() throws Exception {
+ Change c = newChange();
+ ChangeUpdate update = newUpdate(c, otherUser);
+ String uuid = "uuid";
+ String messageForBase = "comment for base";
+ Timestamp now = TimeUtil.nowTs();
+ PatchSet.Id psId = c.currentPatchSetId();
+
+ PatchLineComment commentForBase =
+ newPublishedPatchLineComment(psId, "filename", uuid,
+ null, 0, otherUser, null, now, messageForBase,
+ (short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234");
+ update.setPatchSetId(psId);
+ update.upsertComment(commentForBase);
+ update.commit();
+
+ ChangeNotes notes = newNotes(c);
+ Multimap<PatchSet.Id, PatchLineComment> commentsForBase =
+ notes.getBaseComments();
+ Multimap<PatchSet.Id, PatchLineComment> commentsForPs =
+ notes.getPatchSetComments();
+
+ assertTrue(commentsForPs.isEmpty());
+ assertEquals(commentForBase,
+ Iterables.getOnlyElement(commentsForBase.get(psId)));
+ }
+
+ @Test
public void patchLineCommentNoRange() throws Exception {
Change c = newChange();
ChangeUpdate update = newUpdate(c, otherUser);
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
index b484a3f..1cb442d 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
@@ -307,17 +307,17 @@
private List<String> readSshKey(final List<String> sshKeys)
throws UnsupportedEncodingException, IOException {
if (!sshKeys.isEmpty()) {
- String sshKey;
int idx = sshKeys.indexOf("-");
if (idx >= 0) {
- sshKey = "";
+ StringBuilder sshKey = new StringBuilder();
BufferedReader br =
new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line;
while ((line = br.readLine()) != null) {
- sshKey += line + "\n";
+ sshKey.append(line)
+ .append("\n");
}
- sshKeys.set(idx, sshKey);
+ sshKeys.set(idx, sshKey.toString());
}
}
return sshKeys;
diff --git a/lib/codemirror/cm.defs b/lib/codemirror/cm.defs
index cc0880e..db87b25 100644
--- a/lib/codemirror/cm.defs
+++ b/lib/codemirror/cm.defs
@@ -53,6 +53,7 @@
'erlang',
'gas',
'gfm',
+ 'go',
'groovy',
'haskell',
'htmlmixed',