Merge "Change the background color of blank areas in diff"
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index 6968e83..fc4b00a 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -1223,12 +1223,13 @@
high CPU usage, memory pressure, persistent cache bloat, and other problems.
+
The following operations are allowed even when a change is at the limit:
+
* Abandon
* Submit
* Submit by push with `%submit`
* Auto-close by pushing directly to the branch
* Fix with link:rest-api-changes.html#fix-input[`expect_merged_as`]
-+
+
By default 1000.
[[change.move]]change.move::
diff --git a/java/com/google/gerrit/httpd/SetThreadNameFilter.java b/java/com/google/gerrit/httpd/SetThreadNameFilter.java
new file mode 100644
index 0000000..c7d977d
--- /dev/null
+++ b/java/com/google/gerrit/httpd/SetThreadNameFilter.java
@@ -0,0 +1,91 @@
+// Copyright (C) 2020 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.httpd;
+
+import com.google.gerrit.server.CurrentUser;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.google.inject.servlet.ServletModule;
+import java.io.IOException;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+@Singleton
+public class SetThreadNameFilter implements Filter {
+ private static final int MAX_PATH_LENGTH = 120;
+
+ public static Module module() {
+ return new ServletModule() {
+ @Override
+ protected void configureServlets() {
+ filter("/*").through(SetThreadNameFilter.class);
+ }
+ };
+ }
+
+ private final Provider<CurrentUser> user;
+
+ @Inject
+ public SetThreadNameFilter(Provider<CurrentUser> user) {
+ this.user = user;
+ }
+
+ @Override
+ public void init(FilterConfig filterConfig) {}
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ Thread current = Thread.currentThread();
+ String old = current.getName();
+ try {
+ current.setName(computeName((HttpServletRequest) request));
+ chain.doFilter(request, response);
+ } finally {
+ current.setName(old);
+ }
+ }
+
+ private String computeName(HttpServletRequest req) {
+ StringBuilder s = new StringBuilder();
+ s.append("HTTP ");
+ s.append(req.getMethod());
+ s.append(" ");
+ s.append(req.getRequestURI());
+ String query = req.getQueryString();
+ if (query != null) {
+ s.append("?").append(query);
+ }
+ if (s.length() > MAX_PATH_LENGTH) {
+ s.delete(MAX_PATH_LENGTH, s.length());
+ }
+ s.append(" (");
+ s.append(user.get().getUserName().orElse("N/A"));
+ s.append(" from ");
+ s.append(req.getRemoteAddr());
+ s.append(")");
+ return s.toString();
+ }
+
+ @Override
+ public void destroy() {}
+}
diff --git a/java/com/google/gerrit/httpd/init/WebAppInitializer.java b/java/com/google/gerrit/httpd/init/WebAppInitializer.java
index 3da968e..769396e 100644
--- a/java/com/google/gerrit/httpd/init/WebAppInitializer.java
+++ b/java/com/google/gerrit/httpd/init/WebAppInitializer.java
@@ -31,6 +31,7 @@
import com.google.gerrit.httpd.RequestContextFilter;
import com.google.gerrit.httpd.RequestMetricsFilter;
import com.google.gerrit.httpd.RequireSslFilter;
+import com.google.gerrit.httpd.SetThreadNameFilter;
import com.google.gerrit.httpd.WebModule;
import com.google.gerrit.httpd.WebSshGlueModule;
import com.google.gerrit.httpd.auth.oauth.OAuthModule;
@@ -385,6 +386,7 @@
modules.add(sysInjector.getInstance(GerritAuthModule.class));
modules.add(sysInjector.getInstance(GitOverHttpModule.class));
modules.add(RequestCleanupFilter.module());
+ modules.add(SetThreadNameFilter.module());
modules.add(AllRequestFilter.module());
modules.add(sysInjector.getInstance(WebModule.class));
modules.add(sysInjector.getInstance(RequireSslFilter.Module.class));
diff --git a/java/com/google/gerrit/pgm/Daemon.java b/java/com/google/gerrit/pgm/Daemon.java
index d8beb76..2e9ef2f 100644
--- a/java/com/google/gerrit/pgm/Daemon.java
+++ b/java/com/google/gerrit/pgm/Daemon.java
@@ -35,6 +35,7 @@
import com.google.gerrit.httpd.RequestContextFilter;
import com.google.gerrit.httpd.RequestMetricsFilter;
import com.google.gerrit.httpd.RequireSslFilter;
+import com.google.gerrit.httpd.SetThreadNameFilter;
import com.google.gerrit.httpd.WebModule;
import com.google.gerrit.httpd.WebSshGlueModule;
import com.google.gerrit.httpd.auth.oauth.OAuthModule;
@@ -549,6 +550,7 @@
}
modules.add(RequestCleanupFilter.module());
modules.add(AllRequestFilter.module());
+ modules.add(SetThreadNameFilter.module());
modules.add(sysInjector.getInstance(WebModule.class));
modules.add(sysInjector.getInstance(RequireSslFilter.Module.class));
modules.add(new HttpPluginModule());
diff --git a/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/java/com/google/gerrit/server/edit/ChangeEditUtil.java
index 926e0d5..710916e 100644
--- a/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ b/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -169,7 +169,10 @@
RevCommit squashed = squashEdit(rw, oi, edit.getEditCommit(), basePatchSet);
PatchSet.Id psId = ChangeUtil.nextPatchSetId(repo, change.currentPatchSetId());
- PatchSetInserter inserter = patchSetInserterFactory.create(notes, psId, squashed);
+ PatchSetInserter inserter =
+ patchSetInserterFactory
+ .create(notes, psId, squashed)
+ .setSendEmail(!change.isWorkInProgress());
StringBuilder message =
new StringBuilder("Patch Set ").append(inserter.getPatchSetId().get()).append(": ");
diff --git a/java/com/google/gerrit/testing/TestCommentHelper.java b/java/com/google/gerrit/testing/TestCommentHelper.java
index b72cca7..deda355 100644
--- a/java/com/google/gerrit/testing/TestCommentHelper.java
+++ b/java/com/google/gerrit/testing/TestCommentHelper.java
@@ -16,14 +16,21 @@
import static java.util.stream.Collectors.toList;
+import com.google.common.collect.ImmutableList;
import com.google.gerrit.extensions.api.GerritApi;
import com.google.gerrit.extensions.api.changes.DraftInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
import com.google.gerrit.extensions.client.Comment;
import com.google.gerrit.extensions.client.Comment.Range;
import com.google.gerrit.extensions.client.Side;
import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.FixSuggestionInfo;
import com.google.inject.Inject;
+import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
/** Test helper for dealing with comments/drafts. */
public class TestCommentHelper {
@@ -44,7 +51,7 @@
}
public void addDraft(String changeId, String revId, DraftInput in) throws Exception {
- gApi.changes().id(changeId).revision(revId).createDraft(in).get();
+ gApi.changes().id(changeId).revision(revId).createDraft(in);
}
public Collection<CommentInfo> getPublishedComments(String changeId) throws Exception {
@@ -104,4 +111,34 @@
range.endCharacter = 5;
return range;
}
+
+ public static RobotCommentInput createRobotCommentInputWithMandatoryFields(String path) {
+ RobotCommentInput in = new RobotCommentInput();
+ in.robotId = "happyRobot";
+ in.robotRunId = "1";
+ in.line = 1;
+ in.message = "nit: trailing whitespace";
+ in.path = path;
+ return in;
+ }
+
+ public static RobotCommentInput createRobotCommentInput(
+ String path, FixSuggestionInfo... fixSuggestionInfos) {
+ RobotCommentInput in = TestCommentHelper.createRobotCommentInputWithMandatoryFields(path);
+ in.url = "http://www.happy-robot.com";
+ in.properties = new HashMap<>();
+ in.properties.put("key1", "value1");
+ in.properties.put("key2", "value2");
+ in.fixSuggestions = Arrays.asList(fixSuggestionInfos);
+ return in;
+ }
+
+ public void addRobotComment(String targetChangeId, RobotCommentInput robotCommentInput)
+ throws Exception {
+ ReviewInput reviewInput = new ReviewInput();
+ reviewInput.robotComments =
+ Collections.singletonMap(robotCommentInput.path, ImmutableList.of(robotCommentInput));
+ reviewInput.message = "robot comment test";
+ gApi.changes().id(targetChangeId).current().review(reviewInput);
+ }
}
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java
index abf0279..c35ded6 100644
--- a/javatests/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RobotCommentsIT.java
@@ -28,7 +28,6 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.config.GerritConfig;
-import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.api.changes.ReviewInput.RobotCommentInput;
import com.google.gerrit.extensions.client.Comment;
import com.google.gerrit.extensions.common.ChangeInfo;
@@ -45,9 +44,10 @@
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.testing.BinaryResultSubject;
+import com.google.gerrit.testing.TestCommentHelper;
+import com.google.inject.Inject;
import java.util.Arrays;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -57,6 +57,8 @@
import org.junit.Test;
public class RobotCommentsIT extends AbstractDaemonTest {
+ @Inject private TestCommentHelper testCommentHelper;
+
private static final String PLAIN_TEXT_CONTENT_TYPE = "text/plain";
private static final String FILE_NAME = "file_to_fix.txt";
@@ -86,7 +88,8 @@
fixReplacementInfo = createFixReplacementInfo();
fixSuggestionInfo = createFixSuggestionInfo(fixReplacementInfo);
- withFixRobotCommentInput = createRobotCommentInput(fixSuggestionInfo);
+ withFixRobotCommentInput =
+ TestCommentHelper.createRobotCommentInput(FILE_NAME, fixSuggestionInfo);
}
@Test
@@ -100,8 +103,8 @@
@Test
public void addedRobotCommentsCanBeRetrieved() throws Exception {
- RobotCommentInput in = createRobotCommentInput();
- addRobotComment(changeId, in);
+ RobotCommentInput in = TestCommentHelper.createRobotCommentInput(FILE_NAME);
+ testCommentHelper.addRobotComment(changeId, in);
Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).current().robotComments();
@@ -112,13 +115,13 @@
@Test
public void addedRobotCommentsCanBeRetrievedByChange() throws Exception {
- RobotCommentInput in = createRobotCommentInput();
- addRobotComment(changeId, in);
+ RobotCommentInput in = TestCommentHelper.createRobotCommentInput(FILE_NAME);
+ testCommentHelper.addRobotComment(changeId, in);
pushFactory.create(admin.newIdent(), testRepo, changeId).to("refs/for/master");
- RobotCommentInput in2 = createRobotCommentInput();
- addRobotComment(changeId, in2);
+ RobotCommentInput in2 = TestCommentHelper.createRobotCommentInput(FILE_NAME);
+ testCommentHelper.addRobotComment(changeId, in2);
Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).robotComments();
@@ -133,8 +136,8 @@
@Test
public void robotCommentsCanBeRetrievedAsList() throws Exception {
- RobotCommentInput robotCommentInput = createRobotCommentInput();
- addRobotComment(changeId, robotCommentInput);
+ RobotCommentInput robotCommentInput = TestCommentHelper.createRobotCommentInput(FILE_NAME);
+ testCommentHelper.addRobotComment(changeId, robotCommentInput);
List<RobotCommentInfo> robotCommentInfos =
gApi.changes().id(changeId).current().robotCommentsAsList();
@@ -146,8 +149,8 @@
@Test
public void specificRobotCommentCanBeRetrieved() throws Exception {
- RobotCommentInput robotCommentInput = createRobotCommentInput();
- addRobotComment(changeId, robotCommentInput);
+ RobotCommentInput robotCommentInput = TestCommentHelper.createRobotCommentInput(FILE_NAME);
+ testCommentHelper.addRobotComment(changeId, robotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
RobotCommentInfo robotCommentInfo = Iterables.getOnlyElement(robotCommentInfos);
@@ -159,8 +162,8 @@
@Test
public void robotCommentWithoutOptionalFieldsCanBeAdded() throws Exception {
- RobotCommentInput in = createRobotCommentInputWithMandatoryFields();
- addRobotComment(changeId, in);
+ RobotCommentInput in = TestCommentHelper.createRobotCommentInputWithMandatoryFields(FILE_NAME);
+ testCommentHelper.addRobotComment(changeId, in);
Map<String, List<RobotCommentInfo>> out = gApi.changes().id(changeId).current().robotComments();
assertThat(out).hasSize(1);
@@ -169,14 +172,15 @@
}
@Test
- public void hugeRobotCommentIsRejected() throws Exception {
+ public void hugeRobotCommentIsRejected() {
int defaultSizeLimit = 1024 * 1024;
int sizeOfRest = 451;
fixReplacementInfo.replacement = getStringFor(defaultSizeLimit - sizeOfRest + 1);
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown).hasMessageThat().contains("limit");
}
@@ -186,7 +190,7 @@
int sizeOfRest = 451;
fixReplacementInfo.replacement = getStringFor(defaultSizeLimit - sizeOfRest);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThat(robotCommentInfos).hasSize(1);
@@ -194,13 +198,14 @@
@Test
@GerritConfig(name = "change.robotCommentSizeLimit", value = "10k")
- public void maximumAllowedSizeOfRobotCommentCanBeAdjusted() throws Exception {
+ public void maximumAllowedSizeOfRobotCommentCanBeAdjusted() {
int sizeLimit = 10 * 1024;
fixReplacementInfo.replacement = getStringFor(sizeLimit);
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown).hasMessageThat().contains("limit");
}
@@ -210,7 +215,7 @@
int defaultSizeLimit = 1024 * 1024;
fixReplacementInfo.replacement = getStringFor(defaultSizeLimit);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThat(robotCommentInfos).hasSize(1);
@@ -223,7 +228,7 @@
int defaultSizeLimit = 1024 * 1024;
fixReplacementInfo.replacement = getStringFor(defaultSizeLimit);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThat(robotCommentInfos).hasSize(1);
@@ -231,7 +236,7 @@
@Test
public void addedFixSuggestionCanBeRetrieved() throws Exception {
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().isNotNull();
@@ -239,7 +244,7 @@
@Test
public void fixIdIsGeneratedForFixSuggestion() throws Exception {
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().fixId().isNotEmpty();
@@ -252,7 +257,7 @@
@Test
public void descriptionOfFixSuggestionIsAcceptedAsIs() throws Exception {
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThatList(robotCommentInfos)
@@ -263,12 +268,13 @@
}
@Test
- public void descriptionOfFixSuggestionIsMandatory() throws Exception {
+ public void descriptionOfFixSuggestionIsMandatory() {
fixSuggestionInfo.description = null;
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown)
.hasMessageThat()
.contains(
@@ -279,7 +285,7 @@
@Test
public void addedFixReplacementCanBeRetrieved() throws Exception {
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThatList(robotCommentInfos)
@@ -290,12 +296,13 @@
}
@Test
- public void fixReplacementsAreMandatory() throws Exception {
+ public void fixReplacementsAreMandatory() {
fixSuggestionInfo.replacements = Collections.emptyList();
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown)
.hasMessageThat()
.contains(
@@ -307,7 +314,7 @@
@Test
public void pathOfFixReplacementIsAcceptedAsIs() throws Exception {
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
@@ -320,12 +327,13 @@
}
@Test
- public void pathOfFixReplacementIsMandatory() throws Exception {
+ public void pathOfFixReplacementIsMandatory() {
fixReplacementInfo.path = null;
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown)
.hasMessageThat()
.contains(
@@ -336,7 +344,7 @@
@Test
public void rangeOfFixReplacementIsAcceptedAsIs() throws Exception {
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
@@ -349,12 +357,13 @@
}
@Test
- public void rangeOfFixReplacementIsMandatory() throws Exception {
+ public void rangeOfFixReplacementIsMandatory() {
fixReplacementInfo.range = null;
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown)
.hasMessageThat()
.contains(
@@ -364,17 +373,17 @@
}
@Test
- public void rangeOfFixReplacementNeedsToBeValid() throws Exception {
+ public void rangeOfFixReplacementNeedsToBeValid() {
fixReplacementInfo.range = createRange(13, 9, 5, 10);
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown).hasMessageThat().contains("Range (13:9 - 5:10)");
}
@Test
- public void rangesOfFixReplacementsOfSameFixSuggestionForSameFileMayNotOverlap()
- throws Exception {
+ public void rangesOfFixReplacementsOfSameFixSuggestionForSameFileMayNotOverlap() {
FixReplacementInfo fixReplacementInfo1 = new FixReplacementInfo();
fixReplacementInfo1.path = FILE_NAME;
fixReplacementInfo1.range = createRange(2, 0, 3, 1);
@@ -391,7 +400,8 @@
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown).hasMessageThat().contains("overlap");
}
@@ -412,7 +422,7 @@
createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThatList(robotCommentInfos).onlyElement().fixSuggestions().hasSize(1);
@@ -436,7 +446,7 @@
withFixRobotCommentInput.fixSuggestions =
ImmutableList.of(fixSuggestionInfo1, fixSuggestionInfo2);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThatList(robotCommentInfos).onlyElement().fixSuggestions().hasSize(2);
@@ -463,7 +473,7 @@
createFixSuggestionInfo(fixReplacementInfo2, fixReplacementInfo1, fixReplacementInfo3);
withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
assertThatList(robotCommentInfos).onlyElement().onlyFixSuggestion().replacements().hasSize(3);
@@ -471,7 +481,7 @@
@Test
public void replacementStringOfFixReplacementIsAcceptedAsIs() throws Exception {
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
@@ -484,12 +494,13 @@
}
@Test
- public void replacementStringOfFixReplacementIsMandatory() throws Exception {
+ public void replacementStringOfFixReplacementIsMandatory() {
fixReplacementInfo.replacement = null;
BadRequestException thrown =
assertThrows(
- BadRequestException.class, () -> addRobotComment(changeId, withFixRobotCommentInput));
+ BadRequestException.class,
+ () -> testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput));
assertThat(thrown)
.hasMessageThat()
.contains(
@@ -505,7 +516,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -528,7 +539,7 @@
fixReplacementInfo.replacement = "Modified content\n5";
fixReplacementInfo.range = createRange(3, 2, 5, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
String fixId = Iterables.getOnlyElement(fixIds);
@@ -560,7 +571,7 @@
createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
String fixId = Iterables.getOnlyElement(fixIds);
@@ -590,10 +601,12 @@
fixReplacementInfo2.replacement = "Some other modified content\n";
FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
- RobotCommentInput robotCommentInput1 = createRobotCommentInput(fixSuggestionInfo1);
- RobotCommentInput robotCommentInput2 = createRobotCommentInput(fixSuggestionInfo2);
- addRobotComment(changeId, robotCommentInput1);
- addRobotComment(changeId, robotCommentInput2);
+ RobotCommentInput robotCommentInput1 =
+ TestCommentHelper.createRobotCommentInput(FILE_NAME, fixSuggestionInfo1);
+ RobotCommentInput robotCommentInput2 =
+ TestCommentHelper.createRobotCommentInput(FILE_NAME, fixSuggestionInfo2);
+ testCommentHelper.addRobotComment(changeId, robotCommentInput1);
+ testCommentHelper.addRobotComment(changeId, robotCommentInput2);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -623,10 +636,12 @@
fixReplacementInfo2.replacement = "Some other modified content\n";
FixSuggestionInfo fixSuggestionInfo2 = createFixSuggestionInfo(fixReplacementInfo2);
- RobotCommentInput robotCommentInput1 = createRobotCommentInput(fixSuggestionInfo1);
- RobotCommentInput robotCommentInput2 = createRobotCommentInput(fixSuggestionInfo2);
- addRobotComment(changeId, robotCommentInput1);
- addRobotComment(changeId, robotCommentInput2);
+ RobotCommentInput robotCommentInput1 =
+ TestCommentHelper.createRobotCommentInput(FILE_NAME, fixSuggestionInfo1);
+ RobotCommentInput robotCommentInput2 =
+ TestCommentHelper.createRobotCommentInput(FILE_NAME, fixSuggestionInfo2);
+ testCommentHelper.addRobotComment(changeId, robotCommentInput1);
+ testCommentHelper.addRobotComment(changeId, robotCommentInput2);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -655,7 +670,7 @@
withFixRobotCommentInput.fixSuggestions =
ImmutableList.of(fixSuggestionInfo1, fixSuggestionInfo2);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -677,7 +692,7 @@
fixReplacementInfo.range = createRange(2, 0, 3, 0);
fixReplacementInfo.replacement = "Modified content\n";
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
String fixId = Iterables.getOnlyElement(fixIds);
@@ -707,7 +722,7 @@
createFixSuggestionInfo(fixReplacementInfo1, fixReplacementInfo2);
withFixRobotCommentInput.fixSuggestions = ImmutableList.of(fixSuggestionInfo);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
String fixId = Iterables.getOnlyElement(fixIds);
@@ -734,7 +749,7 @@
fixReplacementInfo.range = createRange(1, 0, 2, 0);
fixReplacementInfo.replacement = "Modified content\n";
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
String fixId = Iterables.getOnlyElement(fixIds);
@@ -750,7 +765,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
// Remember patch set and add another one.
@@ -776,7 +791,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
// Remember patch set and add another one.
@@ -811,7 +826,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -833,7 +848,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -851,7 +866,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -874,7 +889,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -892,7 +907,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -915,7 +930,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -938,7 +953,7 @@
fixReplacementInfo.replacement = "Modified content";
fixReplacementInfo.range = createRange(3, 1, 3, 3);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -957,7 +972,8 @@
.create(admin.newIdent(), testRepo, SUBJECT, FILE_NAME, "new content", r1.getChangeId())
.to("refs/for/master");
- addRobotComment(r2.getChangeId(), createRobotCommentInputWithMandatoryFields());
+ testCommentHelper.addRobotComment(
+ r2.getChangeId(), TestCommentHelper.createRobotCommentInputWithMandatoryFields(FILE_NAME));
try (AutoCloseable ignored = disableNoteDb()) {
ChangeInfo result = Iterables.getOnlyElement(query(r2.getChangeId()));
@@ -971,7 +987,7 @@
@Test
public void getFixPreviewWithNonexistingFixId() throws Exception {
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
assertThrows(
ResourceNotFoundException.class,
@@ -986,7 +1002,7 @@
fixReplacementInfo.range = createRange(1, 0, 2, 0);
fixReplacementInfo.replacement = "Modified content\n";
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
String fixId = Iterables.getOnlyElement(fixIds);
@@ -1010,9 +1026,10 @@
fixSuggestionInfo = createFixSuggestionInfo(fixReplacementInfoFile1, fixReplacementInfoFile2);
- withFixRobotCommentInput = createRobotCommentInput(fixSuggestionInfo);
+ withFixRobotCommentInput =
+ TestCommentHelper.createRobotCommentInput(FILE_NAME, fixSuggestionInfo);
- addRobotComment(changeId, withFixRobotCommentInput);
+ testCommentHelper.addRobotComment(changeId, withFixRobotCommentInput);
List<RobotCommentInfo> robotCommentInfos = getRobotComments();
List<String> fixIds = getFixIds(robotCommentInfos);
@@ -1105,27 +1122,6 @@
assertThat(diff2).content().element(2).linesOfB().isNull();
}
- private static RobotCommentInput createRobotCommentInputWithMandatoryFields() {
- RobotCommentInput in = new RobotCommentInput();
- in.robotId = "happyRobot";
- in.robotRunId = "1";
- in.line = 1;
- in.message = "nit: trailing whitespace";
- in.path = FILE_NAME;
- return in;
- }
-
- private static RobotCommentInput createRobotCommentInput(
- FixSuggestionInfo... fixSuggestionInfos) {
- RobotCommentInput in = createRobotCommentInputWithMandatoryFields();
- in.url = "http://www.happy-robot.com";
- in.properties = new HashMap<>();
- in.properties.put("key1", "value1");
- in.properties.put("key2", "value2");
- in.fixSuggestions = Arrays.asList(fixSuggestionInfos);
- return in;
- }
-
private static FixSuggestionInfo createFixSuggestionInfo(
FixReplacementInfo... fixReplacementInfos) {
FixSuggestionInfo newFixSuggestionInfo = new FixSuggestionInfo();
@@ -1153,15 +1149,6 @@
return range;
}
- private void addRobotComment(String targetChangeId, RobotCommentInput robotCommentInput)
- throws Exception {
- ReviewInput reviewInput = new ReviewInput();
- reviewInput.robotComments =
- Collections.singletonMap(robotCommentInput.path, ImmutableList.of(robotCommentInput));
- reviewInput.message = "robot comment test";
- gApi.changes().id(targetChangeId).current().review(reviewInput);
- }
-
private List<RobotCommentInfo> getRobotComments() throws RestApiException {
return gApi.changes().id(changeId).current().robotCommentsAsList();
}
diff --git a/javatests/com/google/gerrit/acceptance/edit/ChangeEditIT.java b/javatests/com/google/gerrit/acceptance/edit/ChangeEditIT.java
index 2883d8c..e72bf06 100644
--- a/javatests/com/google/gerrit/acceptance/edit/ChangeEditIT.java
+++ b/javatests/com/google/gerrit/acceptance/edit/ChangeEditIT.java
@@ -142,8 +142,11 @@
public void publishEdit() throws Exception {
createArbitraryEditFor(changeId);
+ AddReviewerInput in = new AddReviewerInput();
+ in.reviewer = user.email();
+ gApi.changes().id(changeId).addReviewer(in);
+
PublishChangeEditInput publishInput = new PublishChangeEditInput();
- publishInput.notify = NotifyHandling.NONE;
gApi.changes().id(changeId).edit().publish(publishInput);
assertThat(getEdit(changeId)).isAbsent();
@@ -160,8 +163,10 @@
assertThat(info.messages).isNotEmpty();
assertThat(Iterables.getLast(info.messages).tag)
.isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_PATCH_SET);
+ assertThat(sender.getMessages()).isNotEmpty();
// Move the change to WIP, repeat, and verify.
+ sender.clear();
gApi.changes().id(changeId).setWorkInProgress();
createEmptyEditFor(changeId);
gApi.changes().id(changeId).edit().modifyFile(FILE_NAME, RawInputUtil.create(CONTENT_NEW2));
@@ -170,6 +175,7 @@
assertThat(info.messages).isNotEmpty();
assertThat(Iterables.getLast(info.messages).tag)
.isEqualTo(ChangeMessagesUtil.TAG_UPLOADED_WIP_PATCH_SET);
+ assertThat(sender.getMessages()).isEmpty();
}
@Test
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
index c67a842..53acdeb 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
@@ -63,7 +63,7 @@
case V7_4:
return "blacktop/elasticsearch:7.4.2";
case V7_5:
- return "blacktop/elasticsearch:7.5.1";
+ return "blacktop/elasticsearch:7.5.2";
}
throw new IllegalStateException("No tests for version: " + version.name());
}
diff --git a/polygerrit-ui/README.md b/polygerrit-ui/README.md
index e645972..a35bd6f 100644
--- a/polygerrit-ui/README.md
+++ b/polygerrit-ui/README.md
@@ -109,7 +109,7 @@
For daily development you typically only want to run and debug individual tests.
Run the local [Go proxy server](#go-server) and navigate for example to
-<http://localhost:8081/elements/change/gr-account-entry/gr-account-entry_test.html>.
+<http://localhost:8081/elements/shared/gr-account-entry/gr-account-entry_test.html>.
Check "Disable cache" in the "Network" tab of Chrome's dev tools, so code
changes are picked up on "reload".
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
index e719154..508c3a2 100644
--- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
@@ -271,7 +271,12 @@
// API to work as expected.
const groupId = decodeURIComponent(e.detail.value.id)
.replace(/\+/g, ' ');
- this.set(['permission', 'value', 'rules', groupId], {});
+ // We cannot use "this.set(...)" here, because groupId may contain dots,
+ // and dots in property path names are totally unsupported by Polymer.
+ // Apparently Polymer picks up this change anyway, otherwise we should
+ // have looked at using MutableData:
+ // https://polymer-library.polymer-project.org/2.0/docs/devguide/data-system#mutable-data
+ this.permission.value.rules[groupId] = {};
// Purposely don't recompute sorted array so that the newly added rule
// is the last item of the array.
@@ -292,7 +297,8 @@
Polymer.dom.flush();
const value = this._rules[this._rules.length - 1].value;
value.added = true;
- this.set(['permission', 'value', 'rules', groupId], value);
+ // See comment above for why we cannot use "this.set(...)" here.
+ this.permission.value.rules[groupId] = value;
this.dispatchEvent(
new CustomEvent('access-modified', {bubbles: true, composed: true}));
}
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
index 7919b28..9928b9e 100644
--- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
@@ -312,11 +312,11 @@
element.name = 'Priority';
element.section = 'refs/*';
element.groups = {};
- element.$.groupAutocomplete.text = 'ldap/tests tests';
+ element.$.groupAutocomplete.text = 'ldap/tests te.st';
const e = {
detail: {
value: {
- id: 'ldap:CN=test+test',
+ id: 'ldap:CN=test+te.st',
},
},
};
@@ -325,11 +325,11 @@
assert.equal(Object.keys(element._groupsWithRules).length, 2);
element._handleAddRuleItem(e);
flushAsynchronousOperations();
- assert.deepEqual(element.groups, {'ldap:CN=test test': {
- name: 'ldap/tests tests'}});
+ assert.deepEqual(element.groups, {'ldap:CN=test te.st': {
+ name: 'ldap/tests te.st'}});
assert.equal(element._rules.length, 3);
assert.equal(Object.keys(element._groupsWithRules).length, 3);
- assert.deepEqual(element.permission.value.rules['ldap:CN=test test'],
+ assert.deepEqual(element.permission.value.rules['ldap:CN=test te.st'],
{action: 'ALLOW', min: -2, max: 2, added: true});
// New rule should be removed if cancel from editing.
element.editing = false;
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
index a4ed899..c0a603e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
@@ -1166,6 +1166,14 @@
}
}
+ _handleRevertSubmissionDialogConfirm() {
+ const el = this.$.confirmRevertSubmissionDialog;
+ this.$.overlay.close();
+ el.hidden = true;
+ this._fireAction('/revert_submission', this.actions.revert_submission,
+ false, {message: el.message});
+ }
+
_handleAbandonDialogConfirm() {
const el = this.$.confirmAbandonDialog;
this.$.overlay.close();
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index 471560d..02b017b 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -135,15 +135,15 @@
line-height: var(--line-height-mono);
margin-right: var(--spacing-l);
margin-bottom: var(--spacing-l);
- /* Account for border and padding */
- max-width: calc(72ch + 2px + 2*var(--spacing-m));
+ /* Account for border and padding and rounding errors. */
+ max-width: calc(72ch + 2px + 2*var(--spacing-m) + 0.4px);
}
.commitMessage gr-linked-text {
word-break: break-word;
}
#commitMessageEditor {
- /* Account for border and padding */
- min-width: calc(72ch + 2px + 2*var(--spacing-m));
+ /* Account for border and padding and rounding errors. */
+ min-width: calc(72ch + 2px + 2*var(--spacing-m) + 0.4px);
}
.editCommitMessage {
margin-top: var(--spacing-l);
@@ -190,10 +190,6 @@
height: 0;
margin-bottom: var(--spacing-l);
}
- #commitMessage.collapsed {
- max-height: 36em;
- overflow: hidden;
- }
#relatedChanges.collapsed {
margin-bottom: var(--spacing-l);
max-height: var(--relation-chain-max-height, 2em);
@@ -449,12 +445,13 @@
</div>
<div
id="commitMessage"
- class$="commitMessage [[_computeCommitClass(_commitCollapsed, _latestCommitMessage)]]">
+ class="commitMessage">
<gr-editable-content id="commitMessageEditor"
editing="[[_editingCommitMessage]]"
content="{{_latestCommitMessage}}"
storage-key="[[_computeCommitMessageKey(_change._number, _change.current_revision)]]"
- remove-zero-width-space>
+ remove-zero-width-space
+ collapsed$="[[_computeCommitMessageCollapsed(_commitCollapsed, _commitCollapsible)]]">
<gr-linked-text pre
content="[[_latestCommitMessage]]"
config="[[_projectConfig.commentlinks]]"
@@ -477,7 +474,7 @@
<div
id="commitCollapseToggle"
class="collapseToggleContainer"
- hidden$="[[_computeCommitToggleHidden(_latestCommitMessage)]]">
+ hidden$="[[!_commitCollapsible]]">
<gr-button
link
id="commitCollapseToggleButton"
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index 10f575b..7536c2c 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -184,7 +184,8 @@
_hideEditCommitMessage: {
type: Boolean,
computed: '_computeHideEditCommitMessage(_loggedIn, ' +
- '_editingCommitMessage, _change, _editMode)',
+ '_editingCommitMessage, _change, _editMode, _commitCollapsed, ' +
+ '_commitCollapsible)',
},
_diffAgainst: String,
/** @type {?string} */
@@ -243,10 +244,16 @@
computed:
'_computeChangeStatusChips(_change, _mergeable, _submitEnabled)',
},
+ /** If false, then the "Show more" button was used to expand. */
_commitCollapsed: {
type: Boolean,
value: true,
},
+ /** Is the "Show more/less" button visible? */
+ _commitCollapsible: {
+ type: Boolean,
+ computed: '_computeCommitCollapsible(_latestCommitMessage)',
+ },
_relatedChangesCollapsed: {
type: Boolean,
value: true,
@@ -543,10 +550,12 @@
return this.changeStatuses(change, options);
}
- _computeHideEditCommitMessage(loggedIn, editing, change, editMode) {
+ _computeHideEditCommitMessage(
+ loggedIn, editing, change, editMode, collapsed, collapsible) {
if (!loggedIn || editing ||
(change && change.status === this.ChangeStatus.MERGED) ||
- editMode) {
+ editMode ||
+ (collapsed && collapsible)) {
return true;
}
@@ -1589,9 +1598,8 @@
return 'Change ' + changeNum;
}
- _computeCommitClass(collapsed, commitMessage) {
- if (this._computeCommitToggleHidden(commitMessage)) { return ''; }
- return collapsed ? 'collapsed' : '';
+ _computeCommitMessageCollapsed(collapsed, collapsible) {
+ return collapsible && collapsed;
}
_computeRelatedChangesClass(collapsed) {
@@ -1628,9 +1636,9 @@
}
}
- _computeCommitToggleHidden(commitMessage) {
- if (!commitMessage) { return true; }
- return commitMessage.split('\n').length < MIN_LINES_FOR_COMMIT_COLLAPSE;
+ _computeCommitCollapsible(commitMessage) {
+ if (!commitMessage) { return false; }
+ return commitMessage.split('\n').length >= MIN_LINES_FOR_COMMIT_COLLAPSE;
}
_getOffsetHeight(element) {
@@ -1658,8 +1666,6 @@
// bottom margin.
const EXTRA_HEIGHT = 30;
let newHeight;
- const hasCommitToggle =
- !this._computeCommitToggleHidden(this._latestCommitMessage);
if (window.matchMedia(`(max-width: ${BREAKPOINT_RELATED_SMALL})`)
.matches) {
@@ -1678,7 +1684,7 @@
MINIMUM_RELATED_MAX_HEIGHT);
newHeight = medRelatedHeight;
} else {
- if (hasCommitToggle) {
+ if (this._commitCollapsible) {
// Make sure the content is lined up if both areas have buttons. If
// the commit message is not collapsed, instead use the change info
// height.
@@ -1701,7 +1707,7 @@
stylesToUpdate['--relation-chain-max-height'] = newHeight + 'px';
// Update the max-height of the relation chain to this new height.
- if (hasCommitToggle) {
+ if (this._commitCollapsible) {
stylesToUpdate['--related-change-btn-top-padding'] = remainder + 'px';
}
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
index 9c23d0e..1ef79cf 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
@@ -1238,14 +1238,16 @@
});
test('commitCollapseToggle functions', () => {
- element._latestCommitMessage = _.times(31, String).join('\n');
+ element._latestCommitMessage = _.times(35, String).join('\n');
assert.isTrue(element._commitCollapsed);
+ assert.isTrue(element._commitCollapsible);
assert.isTrue(
- element.$.commitMessage.classList.contains('collapsed'));
+ element.$.commitMessageEditor.hasAttribute('collapsed'));
MockInteractions.tap(element.$.commitCollapseToggleButton);
assert.isFalse(element._commitCollapsed);
+ assert.isTrue(element._commitCollapsible);
assert.isFalse(
- element.$.commitMessage.classList.contains('collapsed'));
+ element.$.commitMessageEditor.hasAttribute('collapsed'));
});
});
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
index ef22188..5d32e9b 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
@@ -815,10 +815,9 @@
// for each line from the start.
let lastEl;
for (const threadEl of addedThreadEls) {
- const lineNumString = threadEl.getAttribute('line-num') || 'FILE';
const commentSide = threadEl.getAttribute('comment-side');
- const lineEl = this.$.diffBuilder.getLineElByNumber(
- lineNumString, commentSide);
+ const lineEl = this._getLineElement(threadEl,
+ commentSide);
const contentText = this.$.diffBuilder.getContentByLineEl(lineEl);
const contentEl = contentText.parentElement;
const threadGroupEl = this._getOrCreateThreadGroup(
@@ -844,6 +843,18 @@
});
}
+ _getLineElement(threadEl, commentSide) {
+ const lineNumString = threadEl.getAttribute('line-num') || 'FILE';
+ const lineEl = this.$.diffBuilder.getLineElByNumber(
+ lineNumString, commentSide);
+ if (lineEl) {
+ return lineEl;
+ }
+ // It is possible to add comment to non-existing line via API
+ threadEl.invalidLineNumber = true;
+ return this.$.diffBuilder.getLineElByNumber('FILE', commentSide);
+ }
+
_unobserveIncrementalNodes() {
if (this._incrementalNodeObserver) {
Polymer.dom(this).unobserveNodes(this._incrementalNodeObserver);
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.html b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.html
index cce1d19..7bc93b5 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.html
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.html
@@ -16,6 +16,8 @@
-->
<link rel="import" href="/bower_components/polymer/polymer.html">
+<link rel="import" href="/bower_components/iron-icon/iron-icon.html">
+<link rel="import" href="../../shared/gr-icons/gr-icons.html">
<link rel="import" href="../../../behaviors/fire-behavior/fire-behavior.html">
<link rel="import" href="../../../behaviors/gr-path-list-behavior/gr-path-list-behavior.html">
<link rel="import" href="../../../styles/shared-styles.html">
@@ -78,6 +80,18 @@
margin-left: var(--spacing-m);
font-style: italic;
}
+ .invalidLineNumber {
+ padding: var(--spacing-m);
+ }
+ .invalidLineNumberText {
+ color: var(--error-text-color);
+ }
+ .invalidLineNumberIcon {
+ color: var(--error-text-color);
+ vertical-align: top;
+ margin-right: var(--spacing-s);
+ }
+
</style>
<template is="dom-if" if="[[showFilePath]]">
<div class="pathInfo">
@@ -86,6 +100,11 @@
</div>
</template>
<div id="container" class$="[[_computeHostClass(unresolved, isRobotComment)]]">
+ <template is="dom-if" if="[[invalidLineNumber]]">
+ <div class="invalidLineNumber">
+ <span class="invalidLineNumberText"><iron-icon icon="gr-icons:error" class="invalidLineNumberIcon"></iron-icon>This comment thread is attached to non-existing line [[lineNum]].</span>
+ </div>
+ </template>
<template id="commentList" is="dom-repeat" items="[[_orderedComments]]"
as="comment">
<gr-comment
diff --git a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.js b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.js
index d8a56f8..00ff03a 100644
--- a/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.js
+++ b/polygerrit-ui/app/elements/shared/gr-comment-thread/gr-comment-thread.js
@@ -124,6 +124,11 @@
type: Boolean,
value: false,
},
+ /** It is possible to add comment to non-existing line via API */
+ invalidLineNumber: {
+ type: Number,
+ reflectToAttribute: true,
+ },
/** Necessary only if showFilePath is true or when used with gr-diff */
lineNum: {
type: Number,
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
index 69c280b..627f948 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-content/gr-editable-content.html
@@ -38,6 +38,10 @@
box-shadow: var(--elevation-level-1);
padding: var(--spacing-m);
}
+ :host([collapsed]) .viewer {
+ max-height: 36em;
+ overflow: hidden;
+ }
.editor iron-autogrow-textarea {
background-color: var(--view-background-color);
width: 100%;
diff --git a/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.html b/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.html
index 743923b..5ecae00 100644
--- a/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.html
+++ b/polygerrit-ui/app/elements/shared/gr-icons/gr-icons.html
@@ -54,6 +54,8 @@
<g id="info"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"></path></g>
<!-- This SVG is a copy from material.io https://material.io/icons/#ic_hourglass_full-->
<g id="hourglass"><path d="M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6z"/><path d="M0 0h24v24H0V0z" fill="none"/></g>
+ <!-- This SVG is a copy from iron-icons https://github.com/PolymerElements/iron-icons/blob/master/iron-icons.js -->
+ <g id="error"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"></path></g>
<!-- This is a custom PolyGerrit SVG -->
<g id="side-by-side"><path d="M17.1578947,10.8888889 L2.84210526,10.8888889 C2.37894737,10.8888889 2,11.2888889 2,11.7777778 L2,17.1111111 C2,17.6 2.37894737,18 2.84210526,18 L17.1578947,18 C17.6210526,18 18,17.6 18,17.1111111 L18,11.7777778 C18,11.2888889 17.6210526,10.8888889 17.1578947,10.8888889 Z M17.1578947,2 L2.84210526,2 C2.37894737,2 2,2.4 2,2.88888889 L2,8.22222222 C2,8.71111111 2.37894737,9.11111111 2.84210526,9.11111111 L17.1578947,9.11111111 C17.6210526,9.11111111 18,8.71111111 18,8.22222222 L18,2.88888889 C18,2.4 17.6210526,2 17.1578947,2 Z M16.1973628,2 L2.78874238,2 C2.35493407,2 2,2.4 2,2.88888889 L2,8.22222222 C2,8.71111111 2.35493407,9.11111111 2.78874238,9.11111111 L16.1973628,9.11111111 C16.6311711,9.11111111 16.9861052,8.71111111 16.9861052,8.22222222 L16.9861052,2.88888889 C16.9861052,2.4 16.6311711,2 16.1973628,2 Z" id="Shape" transform="scale(1.2) translate(10.000000, 10.000000) rotate(-90.000000) translate(-10.000000, -10.000000)"/></g>
<!-- This is a custom PolyGerrit SVG -->
diff --git a/polygerrit-ui/app/styles/themes/app-theme.html b/polygerrit-ui/app/styles/themes/app-theme.html
index eff3d80..1378f33 100644
--- a/polygerrit-ui/app/styles/themes/app-theme.html
+++ b/polygerrit-ui/app/styles/themes/app-theme.html
@@ -59,15 +59,17 @@
--view-background-color: var(--background-color-primary);
/* unique background colors */
--assignee-highlight-color: #fcfad6;
- --comment-background-color: #fcfad6;
- --robot-comment-background-color: #e8f0fe;
--edit-mode-background-color: #ebf5fb;
--emphasis-color: #fff9c4;
--hover-background-color: rgba(161, 194, 250, 0.2);
--primary-button-background-color: #2a66d9;
--selection-background-color: rgba(161, 194, 250, 0.1);
--tooltip-background-color: #333;
- --unresolved-comment-background-color: #fcfaa6;
+ /* comment background colors */
+ --comment-background-color: #fef7f0;
+ --robot-comment-background-color: #e8f0fe;
+ --unresolved-comment-background-color: #e8eaed;
+ /* vote background colors */
--vote-color-approved: #9fcc6b;
--vote-color-disliked: #f7c4cb;
--vote-color-neutral: #ebf5fb;
diff --git a/polygerrit-ui/app/styles/themes/dark-theme.html b/polygerrit-ui/app/styles/themes/dark-theme.html
index b515179..56452cb 100644
--- a/polygerrit-ui/app/styles/themes/dark-theme.html
+++ b/polygerrit-ui/app/styles/themes/dark-theme.html
@@ -49,15 +49,17 @@
/* empty, because inheriting from app-theme is just fine
/* unique background colors */
--assignee-highlight-color: #3a361c;
- --comment-background-color: #0b162b;
- --robot-comment-background-color: rgba(232, 234, 237, 0.08);
--edit-mode-background-color: #5c0a36;
--emphasis-color: #383f4a;
--hover-background-color: rgba(161, 194, 250, 0.2);
--primary-button-background-color: var(--link-color);
--selection-background-color: rgba(161, 194, 250, 0.1);
--tooltip-background-color: #111;
- --unresolved-comment-background-color: #385a9a;
+ /* comment background colors */
+ --comment-background-color: #303134;
+ --robot-comment-background-color: #4B5058;
+ --unresolved-comment-background-color: #545146;
+ /* vote background colors */
--vote-color-approved: #7fb66b;
--vote-color-disliked: #bf6874;
--vote-color-neutral: #597280;
diff --git a/tools/bzl/asciidoc.bzl b/tools/bzl/asciidoc.bzl
index f3c4646..1e7ec96 100644
--- a/tools/bzl/asciidoc.bzl
+++ b/tools/bzl/asciidoc.bzl
@@ -1,7 +1,7 @@
def documentation_attributes():
return [
"toc2",
- 'newline="\\n"',
+ "newline=\"\\n\"",
'asterisk="*"',
'plus="+"',
'caret="^"',
diff --git a/tools/nongoogle.bzl b/tools/nongoogle.bzl
index 3af4a28..acf01fa 100644
--- a/tools/nongoogle.bzl
+++ b/tools/nongoogle.bzl
@@ -102,8 +102,8 @@
# and httpasyncclient as necessary.
maven_jar(
name = "elasticsearch-rest-client",
- artifact = "org.elasticsearch.client:elasticsearch-rest-client:7.5.1",
- sha1 = "094c155906dc94146fc5adc344ea2c676d487cf2",
+ artifact = "org.elasticsearch.client:elasticsearch-rest-client:7.5.2",
+ sha1 = "e11393f600a425b7f62e6f653e19a9e53556fd79",
)
maven_jar(