Merge "Enable apply fixes from old patchset to be applied on latest"
diff --git a/java/com/google/gerrit/acceptance/GerritServerRestSession.java b/java/com/google/gerrit/acceptance/GerritServerRestSession.java
index c2c77fe..9605f50 100644
--- a/java/com/google/gerrit/acceptance/GerritServerRestSession.java
+++ b/java/com/google/gerrit/acceptance/GerritServerRestSession.java
@@ -142,7 +142,8 @@
return execute(delete);
}
- private String getUrl(String endPoint) {
+ @Override
+ public String getUrl(String endPoint) {
return url + (account != null ? "/a" : "") + endPoint;
}
}
diff --git a/java/com/google/gerrit/acceptance/RestResponse.java b/java/com/google/gerrit/acceptance/RestResponse.java
index a9c14aa..a53c015 100644
--- a/java/com/google/gerrit/acceptance/RestResponse.java
+++ b/java/com/google/gerrit/acceptance/RestResponse.java
@@ -103,4 +103,9 @@
assertStatus(SC_MOVED_TEMPORARILY);
assertThat(URI.create(getHeader("Location")).getPath()).isEqualTo(path);
}
+
+ public void assertTemporaryRedirectUri(String uri) throws Exception {
+ assertStatus(SC_MOVED_TEMPORARILY);
+ assertThat(getHeader("Location")).isEqualTo(uri);
+ }
}
diff --git a/java/com/google/gerrit/acceptance/RestSession.java b/java/com/google/gerrit/acceptance/RestSession.java
index 0865e31..3fefd5b 100644
--- a/java/com/google/gerrit/acceptance/RestSession.java
+++ b/java/com/google/gerrit/acceptance/RestSession.java
@@ -52,4 +52,6 @@
RestResponse delete(String endPoint) throws Exception;
RestResponse deleteWithHeaders(String endPoint, Header... headers) throws Exception;
+
+ String getUrl(String endPoint);
}
diff --git a/java/com/google/gerrit/httpd/NumericChangeIdRedirectServlet.java b/java/com/google/gerrit/httpd/NumericChangeIdRedirectServlet.java
index 2c80c9b..ca937fd 100644
--- a/java/com/google/gerrit/httpd/NumericChangeIdRedirectServlet.java
+++ b/java/com/google/gerrit/httpd/NumericChangeIdRedirectServlet.java
@@ -16,6 +16,7 @@
import static com.google.common.collect.ImmutableList.toImmutableList;
+import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.entities.Change;
@@ -85,6 +86,7 @@
if (finalSegment != null) {
path += finalSegment;
}
- UrlModule.toGerrit(path, req, rsp);
+ String queryString = Strings.emptyToNull(req.getQueryString());
+ UrlModule.toGerrit(path + (queryString != null ? "?" + queryString : ""), req, rsp);
}
}
diff --git a/java/com/google/gerrit/httpd/UrlModule.java b/java/com/google/gerrit/httpd/UrlModule.java
index aedf8e9..f62fbe8 100644
--- a/java/com/google/gerrit/httpd/UrlModule.java
+++ b/java/com/google/gerrit/httpd/UrlModule.java
@@ -45,6 +45,9 @@
class UrlModule extends ServletModule {
private final AuthConfig authConfig;
+ private static final String CHANGE_NUMBER_REGEX = "(?:/c)?/([1-9][0-9]*)";
+ private static final String PATCH_SET_REGEX = "([1-9][0-9]*(\\.\\.[1-9][0-9]*)?)";
+
UrlModule(AuthConfig authConfig) {
this.authConfig = authConfig;
}
@@ -72,7 +75,12 @@
serveRegex("^/settings/?$").with(screen(PageLinks.SETTINGS));
serveRegex("^/register$").with(registerScreen(false));
serveRegex("^/register/(.+)$").with(registerScreen(true));
- serveRegex("^(?:/c)?/([1-9][0-9]*)/?.*$").with(NumericChangeIdRedirectServlet.class);
+ serveRegex("^" + CHANGE_NUMBER_REGEX + "(/" + PATCH_SET_REGEX + ")?/?$")
+ .with(NumericChangeIdRedirectServlet.class);
+ serveRegex("^" + CHANGE_NUMBER_REGEX + "/" + PATCH_SET_REGEX + "?/[^+]+$")
+ .with(NumericChangeIdRedirectServlet.class);
+ serveRegex("^" + CHANGE_NUMBER_REGEX + "/comment/\\w+/?$")
+ .with(NumericChangeIdRedirectServlet.class);
serveRegex("^/p/(.*)$").with(queryProjectNew());
serveRegex("^/r/(.+)/?$").with(DirectChangeByCommit.class);
diff --git a/java/com/google/gerrit/httpd/raw/StaticModule.java b/java/com/google/gerrit/httpd/raw/StaticModule.java
index b00294f..42e10d8 100644
--- a/java/com/google/gerrit/httpd/raw/StaticModule.java
+++ b/java/com/google/gerrit/httpd/raw/StaticModule.java
@@ -63,7 +63,17 @@
public class StaticModule extends ServletModule {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
- public static final String CHANGE_NUMBER_URI_REGEX = "^(?:/c)?/([1-9][0-9]*)/?.*";
+ // This constant is copied and NOT reused from UrlModule because of the need for
+ // StaticModule and UrlModule to be used in isolation. The requirement comes
+ // from the way Google includes these two classes in their setup.
+ private static final String CHANGE_NUMBER_REGEX = "(?:/c)?/([1-9][0-9]*)";
+ // Regex matching the direct links to comments using only the change number
+ // 1234/comment/abc_def
+ public static final String CHANGE_NUMBER_URI_REGEX =
+ "^"
+ + CHANGE_NUMBER_REGEX
+ + "(/[1-9][0-9]*(\\.\\.[1-9][0-9]*)?(/[^+]*)?)?(/comment/[^+]+)?/?$";
+
private static final Pattern CHANGE_NUMBER_URI_PATTERN = Pattern.compile(CHANGE_NUMBER_URI_REGEX);
/**
diff --git a/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java b/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
index 914bdd2..43270df 100644
--- a/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
+++ b/java/com/google/gerrit/server/account/GroupIncludeCacheImpl.java
@@ -23,11 +23,13 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.AccountGroup;
import com.google.gerrit.entities.InternalGroup;
+import com.google.gerrit.index.IndexConfig;
import com.google.gerrit.proto.Protos;
import com.google.gerrit.server.cache.CacheModule;
import com.google.gerrit.server.cache.proto.Cache.AllExternalGroupsProto;
@@ -44,9 +46,11 @@
import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Named;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
@@ -61,6 +65,8 @@
private static final String EXTERNAL_NAME = "groups_external";
private static final String PERSISTED_EXTERNAL_NAME = "groups_external_persisted";
+ private final IndexConfig indexConfig;
+
public static Module module() {
return new CacheModule() {
@Override
@@ -114,10 +120,12 @@
LoadingCache<Account.Id, ImmutableSet<AccountGroup.UUID>> groupsWithMember,
@Named(PARENT_GROUPS_NAME)
LoadingCache<AccountGroup.UUID, ImmutableSet<AccountGroup.UUID>> parentGroups,
- @Named(EXTERNAL_NAME) LoadingCache<String, ImmutableList<AccountGroup.UUID>> external) {
+ @Named(EXTERNAL_NAME) LoadingCache<String, ImmutableList<AccountGroup.UUID>> external,
+ IndexConfig indexConfig) {
this.groupsWithMember = groupsWithMember;
this.parentGroups = parentGroups;
this.external = external;
+ this.indexConfig = indexConfig;
}
@Override
@@ -144,7 +152,10 @@
public Collection<AccountGroup.UUID> parentGroupsOf(Set<AccountGroup.UUID> groupIds) {
try {
Set<AccountGroup.UUID> parents = new HashSet<>();
- parentGroups.getAll(groupIds).values().forEach(p -> parents.addAll(p));
+ for (List<AccountGroup.UUID> groupIdsBatch :
+ Lists.partition(new ArrayList<>(groupIds), indexConfig.maxTerms())) {
+ parentGroups.getAll(groupIdsBatch).values().forEach(p -> parents.addAll(p));
+ }
return parents;
} catch (ExecutionException e) {
logger.atWarning().withCause(e).log("Cannot load included groups");
diff --git a/javatests/com/google/gerrit/acceptance/rest/RestApiServletIT.java b/javatests/com/google/gerrit/acceptance/rest/RestApiServletIT.java
index 8011fb0..a54c7ca 100644
--- a/javatests/com/google/gerrit/acceptance/rest/RestApiServletIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/RestApiServletIT.java
@@ -454,12 +454,21 @@
ChangeData changeData = createChange().getChange();
int changeNumber = changeData.getId().get();
- String finalSegment = "any/Thing";
+ assertChangeNumberWithSuffixRedirected(changeNumber, "1..2");
+ assertChangeNumberWithSuffixRedirected(changeNumber, "2");
+ assertChangeNumberWithSuffixRedirected(changeNumber, "2/COMMIT_MSG");
+ assertChangeNumberWithSuffixRedirected(changeNumber, "2?foo=bar");
+ assertChangeNumberWithSuffixRedirected(changeNumber, "2/path/to/source/file/MyClass.java");
+ }
- String redirectUri = String.format("/c/%s/+/%d/%s", project.get(), changeNumber, finalSegment);
+ private void assertChangeNumberWithSuffixRedirected(int changeNumber, String suffix)
+ throws Exception {
+ String redirectUri =
+ anonymousRestSession.getUrl(
+ String.format("/c/%s/+/%d/%s", project.get(), changeNumber, suffix));
anonymousRestSession
- .get(String.format("/c/%d/%s", changeNumber, finalSegment))
- .assertTemporaryRedirect(redirectUri);
+ .get(String.format("/c/%d/%s", changeNumber, suffix))
+ .assertTemporaryRedirectUri(redirectUri);
}
@Test
@@ -467,12 +476,12 @@
int changeNumber = createChange().getChange().getId().get();
String commentId = "ff3303fd_8341647b";
- String redirectUri =
+ String redirectPath =
String.format("/c/%s/+/%d/comment/%s", project.get(), changeNumber, commentId);
anonymousRestSession
.get(String.format("/%s/comment/%s", changeNumber, commentId))
- .assertTemporaryRedirect(redirectUri);
+ .assertTemporaryRedirect(redirectPath);
}
@Test
diff --git a/javatests/com/google/gerrit/httpd/raw/StaticModuleTest.java b/javatests/com/google/gerrit/httpd/raw/StaticModuleTest.java
index 28ec30d..e973a26 100644
--- a/javatests/com/google/gerrit/httpd/raw/StaticModuleTest.java
+++ b/javatests/com/google/gerrit/httpd/raw/StaticModuleTest.java
@@ -15,19 +15,33 @@
package com.google.gerrit.httpd.raw;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.httpd.raw.StaticModule.PolyGerritFilter.isPolyGerritIndex;
-import com.google.common.collect.ImmutableList;
import org.junit.Test;
public class StaticModuleTest {
@Test
public void doNotMatchPolyGerritIndex() {
- ImmutableList.of(
- "/c/123456/anyString",
- "/123456/anyString",
- "/c/123456/comment/9ab75172_67d798e1",
- "/123456/comment/9ab75172_67d798e1")
- .forEach(url -> assertThat(StaticModule.PolyGerritFilter.isPolyGerritIndex(url)).isFalse());
+ assertThat(isPolyGerritIndex("/123456")).isFalse();
+ assertThat(isPolyGerritIndex("/123456/")).isFalse();
+ assertThat(isPolyGerritIndex("/123456/1")).isFalse();
+ assertThat(isPolyGerritIndex("/123456/1/")).isFalse();
+ assertThat(isPolyGerritIndex("/c/123456/comment/9ab75172_67d798e1")).isFalse();
+ assertThat(isPolyGerritIndex("/123456/comment/9ab75172_67d798e1")).isFalse();
+ assertThat(isPolyGerritIndex("/123456/comment/9ab75172_67d798e1/")).isFalse();
+ assertThat(isPolyGerritIndex("/123456/1..2")).isFalse();
+ assertThat(isPolyGerritIndex("/c/123456/1..2")).isFalse();
+ assertThat(isPolyGerritIndex("/c/2/1/COMMIT_MSG")).isFalse();
+ assertThat(isPolyGerritIndex("/c/2/1/path/to/source/file/MyClass.java")).isFalse();
+ }
+
+ @Test
+ public void matchPolyGerritIndex() {
+ assertThat(isPolyGerritIndex("/c/test/+/123456/anyString")).isTrue();
+ assertThat(isPolyGerritIndex("/c/test/+/123456/comment/9ab75172_67d798e1")).isTrue();
+ assertThat(isPolyGerritIndex("/c/321/+/123456/anyString")).isTrue();
+ assertThat(isPolyGerritIndex("/c/321/+/123456/comment/9ab75172_67d798e1")).isTrue();
+ assertThat(isPolyGerritIndex("/c/321/anyString")).isTrue();
}
}
diff --git a/plugins/codemirror-editor b/plugins/codemirror-editor
index 783adf7..e5e9ece 160000
--- a/plugins/codemirror-editor
+++ b/plugins/codemirror-editor
@@ -1 +1 @@
-Subproject commit 783adf7ddf19924d054a1596eec6dd3da9f4aafe
+Subproject commit e5e9ece112242397f000660c6cee8f5053ca5da5
diff --git a/plugins/package.json b/plugins/package.json
index 78f990d..3da1b7a 100644
--- a/plugins/package.json
+++ b/plugins/package.json
@@ -19,6 +19,7 @@
"@codemirror/lang-rust": "^6.0.1",
"@codemirror/lang-sass": "^6.0.2",
"@codemirror/lang-sql": "^6.7.0",
+ "@codemirror/lang-vue": "^0.1.3",
"@codemirror/lang-xml": "^6.1.0",
"@codemirror/lang-yaml": "^6.1.1",
"@codemirror/language": "^6.10.2",
diff --git a/plugins/yarn.lock b/plugins/yarn.lock
index 3391423..c6d2b18 100644
--- a/plugins/yarn.lock
+++ b/plugins/yarn.lock
@@ -222,7 +222,7 @@
"@lezer/highlight" "^1.0.0"
"@lezer/lr" "^1.0.0"
-"@codemirror/lang-vue@^0.1.1":
+"@codemirror/lang-vue@^0.1.1", "@codemirror/lang-vue@^0.1.3":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@codemirror/lang-vue/-/lang-vue-0.1.3.tgz#bf79b9152cc18b4903d64c1f67e186ae045c8a97"
integrity sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section.ts
index 91770ca..0799e03 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-section/gr-change-list-section.ts
@@ -172,7 +172,7 @@
}
override willUpdate(changedProperties: PropertyValues) {
- if (changedProperties.has('changeSection')) {
+ if (changedProperties.has('changeSection') && this.isLoggedIn) {
// In case the list of changes is updated due to auto reloading, we want
// to ensure the model removes any stale change that is not a part of the
// new section changes.
diff --git a/polygerrit-ui/app/models/checks/checks-util.ts b/polygerrit-ui/app/models/checks/checks-util.ts
index 51bfcd9..85a7be4 100644
--- a/polygerrit-ui/app/models/checks/checks-util.ts
+++ b/polygerrit-ui/app/models/checks/checks-util.ts
@@ -54,6 +54,8 @@
return {name: 'code'};
case LinkIcon.FILE_PRESENT:
return {name: 'file_present'};
+ case LinkIcon.VIEW_TIMELINE:
+ return {name: 'view_timeline'};
default:
// We don't throw an assertion error here, because plugins don't have to
// be written in TypeScript, so we may encounter arbitrary strings for
diff --git a/tools/nongoogle.bzl b/tools/nongoogle.bzl
index 91caf31..39697be 100644
--- a/tools/nongoogle.bzl
+++ b/tools/nongoogle.bzl
@@ -137,18 +137,18 @@
sha1 = "cb2f351bf4463751201f43bb99865235d5ba07ca",
)
- SSHD_VERS = "2.12.0"
+ SSHD_VERS = "2.14.0"
maven_jar(
name = "sshd-osgi",
artifact = "org.apache.sshd:sshd-osgi:" + SSHD_VERS,
- sha1 = "32b8de1cbb722ba75bdf9898e0c41d42af00ce57",
+ sha1 = "6ef66228a088f8ac1383b2ff28f3102f80ebc01a",
)
maven_jar(
name = "sshd-sftp",
artifact = "org.apache.sshd:sshd-sftp:" + SSHD_VERS,
- sha1 = "0f96f00a07b186ea62838a6a4122e8f4cad44df6",
+ sha1 = "c070ac920e72023ae9ab0a3f3a866bece284b470",
)
maven_jar(
@@ -166,7 +166,7 @@
maven_jar(
name = "sshd-mina",
artifact = "org.apache.sshd:sshd-mina:" + SSHD_VERS,
- sha1 = "8b202f7d4c0d7b714fd0c93a1352af52aa031149",
+ sha1 = "05e1293af53a196ac3c5a4b01dd88985e8672e9e",
)
maven_jar(