Merge "Use NoteDb sequence seed for accounts sequence initialization"
diff --git a/Documentation/access-control.txt b/Documentation/access-control.txt
index 13e3a53..516cf13 100644
--- a/Documentation/access-control.txt
+++ b/Documentation/access-control.txt
@@ -1362,6 +1362,12 @@
command, but also to the web UI results pagination size.
+[[capability_readAs]]
+=== Read As
+
+Allow users to impersonate any user to see which refs they can read.
+
+
[[capability_runAs]]
=== Run As
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index 6362597..fc9d405 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -2979,7 +2979,7 @@
for production use. For compatibility information, please refer to the
link:https://www.gerritcodereview.com/elasticsearch.html[project homepage].
-When using Elasticsearch versions 2.4 and 5.6, the open and closed changes are
+When using Elasticsearch version 5.6, the open and closed changes are
indexed in a single index, separated into types `open_changes` and `closed_changes`
respectively. When using version 6.2 or later, the open and closed changes are
merged into the default `_doc` type. The latter is also used for the accounts and
@@ -3016,6 +3016,22 @@
+
Defaults to `30000 ms`.
+[[elasticsearch.numberOfShards]]elasticsearch.numberOfShards::
++
+Sets the number of shards to use per index. Refer to the
+link:https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html#getting-started-shards-and-replicas[
+Elasticsearch documentation] for details.
++
+Defaults to 5.
+
+[[elasticsearch.numberOfReplicas]]elasticsearch.numberOfReplicas::
++
+Sets the number of replicas to use per index. Refer to the
+link:https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html#getting-started-shards-and-replicas[
+Elasticsearch documentation] for details.
++
+Defaults to 1.
+
==== Elasticsearch Security
When security is enabled in Elasticsearch, the username and password must be provided.
@@ -3023,11 +3039,11 @@
For further information about Elasticsearch security, please refer to the documentation:
-* link:https://www.elastic.co/guide/en/elasticsearch/plugins/2.4/security.html[Elasticsearch 2.4]
* link:https://www.elastic.co/guide/en/x-pack/5.6/security-getting-started.html[Elasticsearch 5.6]
* link:https://www.elastic.co/guide/en/x-pack/6.2/security-getting-started.html[Elasticsearch 6.2]
* link:https://www.elastic.co/guide/en/elastic-stack-overview/6.3/security-getting-started.html[Elasticsearch 6.3]
* link:https://www.elastic.co/guide/en/elastic-stack-overview/6.4/security-getting-started.html[Elasticsearch 6.4]
+* link:https://www.elastic.co/guide/en/elastic-stack-overview/6.5/security-getting-started.html[Elasticsearch 6.5]
[[elasticsearch.username]]elasticsearch.username::
+
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt
index d7bd8b3..82a9527 100644
--- a/Documentation/dev-plugins.txt
+++ b/Documentation/dev-plugins.txt
@@ -2102,6 +2102,16 @@
`com.google.gerrit.server.git.ChangeReportFormatter` interface, a plugin
may change the formatting of the report.
+[[url-formatting]]
+== URL Formatting
+
+URLs to various parts of Gerrit are usually formed by adding suffixes to
+the canonical web URL.
+
+By implementing the
+`com.google.gerrit.server.config.UrlFormatter` interface, a plugin may
+change the format of the URL.
+
[[links-to-external-tools]]
== Links To External Tools
diff --git a/WORKSPACE b/WORKSPACE
index 8c8102b..6daa686 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -211,6 +211,12 @@
)
maven_jar(
+ name = "guava-failureaccess",
+ artifact = "com.google.guava:failureaccess:1.0.1",
+ sha1 = "1dcf1de382a0bf95a3d8b0849546c88bac1292c9",
+)
+
+maven_jar(
name = "j2objc",
artifact = "com.google.j2objc:j2objc-annotations:1.1",
sha1 = "ed28ded51a8b1c6b112568def5f4b455e6809019",
@@ -1016,8 +1022,8 @@
# and httpasyncclient as necessary.
maven_jar(
name = "elasticsearch-rest-client",
- artifact = "org.elasticsearch.client:elasticsearch-rest-client:6.5.0",
- sha1 = "241436d27cf65b84d17126dc7b6b947e8e2c173c",
+ artifact = "org.elasticsearch.client:elasticsearch-rest-client:6.5.1",
+ sha1 = "d87892e24ef361b9fff5435246b0f0b8f4561fe8",
)
JACKSON_VERSION = "2.9.7"
diff --git a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
index 7451351..362803f 100644
--- a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
+++ b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -38,7 +38,6 @@
import com.google.common.primitives.Chars;
import com.google.gerrit.acceptance.AcceptanceTestRequestScope.Context;
import com.google.gerrit.acceptance.testsuite.account.TestSshKeys;
-import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.AccessSection;
import com.google.gerrit.common.data.GroupDescription;
@@ -295,7 +294,6 @@
@Inject private AccountIndexer accountIndexer;
@Inject private Groups groups;
@Inject private GroupIndexer groupIndexer;
- @Inject private ProjectOperations projectOperations;
private ProjectResetter resetter;
private List<Repository> toClose;
@@ -552,44 +550,6 @@
return resourcePrefix + name;
}
- protected Project.NameKey createProject(String nameSuffix, Project.NameKey parent)
- throws Exception {
- // Default for createEmptyCommit should match TestProjectConfig.
- return projectOperations.newProject().parent(parent).create();
- }
-
- protected Project.NameKey createProject(
- String nameSuffix, Project.NameKey parent, boolean createEmptyCommit) throws Exception {
- // Default for createEmptyCommit should match TestProjectConfig.
- if (parent == null) {
- return projectOperations.newProject().createEmptyCommit(createEmptyCommit).create();
- }
- return projectOperations
- .newProject()
- .parent(parent)
- .createEmptyCommit(createEmptyCommit)
- .create();
- }
-
- protected Project.NameKey createProject(
- String nameSuffix, Project.NameKey parent, boolean createEmptyCommit, SubmitType submitType)
- throws Exception {
- if (parent == null) {
- return projectOperations
- .newProject()
- .createEmptyCommit(createEmptyCommit)
- .submitType(submitType)
- .create();
- }
- return projectOperations
- .newProject()
- .submitType(submitType)
- .parent(parent)
- .createEmptyCommit(createEmptyCommit)
- .parent(parent)
- .create();
- }
-
protected Project.NameKey createProjectOverAPI(
String nameSuffix, Project.NameKey parent, boolean createEmptyCommit, SubmitType submitType)
throws RestApiException {
diff --git a/java/com/google/gerrit/acceptance/GerritServer.java b/java/com/google/gerrit/acceptance/GerritServer.java
index 981ee6b..96a9053 100644
--- a/java/com/google/gerrit/acceptance/GerritServer.java
+++ b/java/com/google/gerrit/acceptance/GerritServer.java
@@ -228,6 +228,9 @@
// Silence non-critical messages from apache.http.
.put("org.apache.http", Level.WARN)
+
+ // Silence non-critical messages from Jetty.
+ .put("org.eclipse.jetty", Level.WARN)
.build();
private static boolean forceLocalDisk() {
diff --git a/java/com/google/gerrit/common/data/AccessSection.java b/java/com/google/gerrit/common/data/AccessSection.java
index c8d8d41..b3da199 100644
--- a/java/com/google/gerrit/common/data/AccessSection.java
+++ b/java/com/google/gerrit/common/data/AccessSection.java
@@ -37,7 +37,7 @@
super(refPattern);
}
- public List<Permission> getPermissions() {
+ public ImmutableList<Permission> getPermissions() {
return permissions == null ? ImmutableList.of() : ImmutableList.copyOf(permissions);
}
diff --git a/java/com/google/gerrit/common/data/LabelType.java b/java/com/google/gerrit/common/data/LabelType.java
index ff7d25b..be4c33c 100644
--- a/java/com/google/gerrit/common/data/LabelType.java
+++ b/java/com/google/gerrit/common/data/LabelType.java
@@ -94,8 +94,7 @@
protected String name;
- // String rather than LabelFunction for backwards compatibility with GWT JSON interface.
- protected String functionName;
+ protected LabelFunction function;
protected boolean copyMinScore;
protected boolean copyMaxScore;
@@ -123,7 +122,7 @@
values = sortValues(valueList);
defaultValue = 0;
- functionName = LabelFunction.MAX_WITH_BLOCK.getFunctionName();
+ function = LabelFunction.MAX_WITH_BLOCK;
maxNegative = Short.MIN_VALUE;
maxPositive = Short.MAX_VALUE;
@@ -160,15 +159,11 @@
}
public LabelFunction getFunction() {
- if (functionName == null) {
- return null;
- }
- return LabelFunction.parse(functionName)
- .orElseThrow(() -> new IllegalStateException("Unsupported functionName: " + functionName));
+ return function;
}
public void setFunction(@Nullable LabelFunction function) {
- this.functionName = function != null ? function.getFunctionName() : null;
+ this.function = function;
}
public boolean canOverride() {
diff --git a/java/com/google/gerrit/common/data/Permission.java b/java/com/google/gerrit/common/data/Permission.java
index a30d412..2e9c2d6 100644
--- a/java/com/google/gerrit/common/data/Permission.java
+++ b/java/com/google/gerrit/common/data/Permission.java
@@ -158,7 +158,7 @@
exclusiveGroup = newExclusiveGroup;
}
- public List<PermissionRule> getRules() {
+ public ImmutableList<PermissionRule> getRules() {
return rules == null ? ImmutableList.of() : ImmutableList.copyOf(rules);
}
diff --git a/java/com/google/gerrit/common/data/ProjectAccess.java b/java/com/google/gerrit/common/data/ProjectAccess.java
index ea17525..a40af22 100644
--- a/java/com/google/gerrit/common/data/ProjectAccess.java
+++ b/java/com/google/gerrit/common/data/ProjectAccess.java
@@ -14,6 +14,7 @@
package com.google.gerrit.common.data;
+import com.google.gerrit.extensions.common.WebLinkInfo;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import java.util.List;
@@ -31,7 +32,7 @@
protected LabelTypes labelTypes;
protected Map<String, String> capabilities;
protected Map<AccountGroup.UUID, GroupInfo> groupInfo;
- protected List<WebLinkInfoCommon> fileHistoryLinks;
+ protected List<WebLinkInfo> fileHistoryLinks;
public ProjectAccess() {}
@@ -132,11 +133,11 @@
groupInfo = m;
}
- public void setFileHistoryLinks(List<WebLinkInfoCommon> links) {
+ public void setFileHistoryLinks(List<WebLinkInfo> links) {
fileHistoryLinks = links;
}
- public List<WebLinkInfoCommon> getFileHistoryLinks() {
+ public List<WebLinkInfo> getFileHistoryLinks() {
return fileHistoryLinks;
}
}
diff --git a/java/com/google/gerrit/common/data/WebLinkInfoCommon.java b/java/com/google/gerrit/common/data/WebLinkInfoCommon.java
deleted file mode 100644
index dd0a70a..0000000
--- a/java/com/google/gerrit/common/data/WebLinkInfoCommon.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// 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.common.data;
-
-public class WebLinkInfoCommon {
- public WebLinkInfoCommon() {}
-
- public String name;
- public String imageUrl;
- public String url;
- public String target;
-}
diff --git a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
index 6da19cd..3b589b2 100644
--- a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -107,6 +107,7 @@
return content;
}
+ private final ElasticConfiguration config;
private final Schema<V> schema;
private final SitePaths sitePaths;
private final String indexNameRaw;
@@ -118,17 +119,18 @@
protected final ElasticQueryBuilder queryBuilder;
AbstractElasticIndex(
- ElasticConfiguration cfg,
+ ElasticConfiguration config,
SitePaths sitePaths,
Schema<V> schema,
ElasticRestClientProvider client,
String indexName,
String indexType) {
+ this.config = config;
this.sitePaths = sitePaths;
this.schema = schema;
this.gson = new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
this.queryBuilder = new ElasticQueryBuilder();
- this.indexName = cfg.getIndexName(indexName, schema.getVersion());
+ this.indexName = config.getIndexName(indexName, schema.getVersion());
this.indexNameRaw = indexName;
this.client = client;
this.type = client.adapter().getType(indexType);
@@ -199,7 +201,7 @@
protected abstract String getMappings();
private String getSettings() {
- return gson.toJson(ImmutableMap.of(SETTINGS, ElasticSetting.createSetting()));
+ return gson.toJson(ImmutableMap.of(SETTINGS, ElasticSetting.createSetting(config)));
}
protected abstract String getId(V v);
@@ -293,8 +295,11 @@
}
protected String getURI(String type, String request) throws UnsupportedEncodingException {
- String encodedType = URLEncoder.encode(type, UTF_8.toString());
String encodedIndexName = URLEncoder.encode(indexName, UTF_8.toString());
+ if (SEARCH.equals(request) && client.adapter().omitTypeFromSearch()) {
+ return encodedIndexName + "/" + request;
+ }
+ String encodedType = URLEncoder.encode(type, UTF_8.toString());
return encodedIndexName + "/" + encodedType + "/" + request;
}
diff --git a/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java b/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
index 8d29d21..6863238 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
@@ -40,9 +40,13 @@
static final String KEY_MAX_RETRY_TIMEOUT = "maxRetryTimeout";
static final String KEY_PREFIX = "prefix";
static final String KEY_SERVER = "server";
+ static final String KEY_NUMBER_OF_SHARDS = "numberOfShards";
+ static final String KEY_NUMBER_OF_REPLICAS = "numberOfReplicas";
static final String DEFAULT_PORT = "9200";
static final String DEFAULT_USERNAME = "elastic";
static final int DEFAULT_MAX_RETRY_TIMEOUT_MS = 30000;
+ static final int DEFAULT_NUMBER_OF_SHARDS = 5;
+ static final int DEFAULT_NUMBER_OF_REPLICAS = 1;
static final TimeUnit MAX_RETRY_TIMEOUT_UNIT = TimeUnit.MILLISECONDS;
private final Config cfg;
@@ -51,6 +55,8 @@
final String username;
final String password;
final int maxRetryTimeout;
+ final int numberOfShards;
+ final int numberOfReplicas;
final String prefix;
@Inject
@@ -71,6 +77,10 @@
DEFAULT_MAX_RETRY_TIMEOUT_MS,
MAX_RETRY_TIMEOUT_UNIT);
this.prefix = Strings.nullToEmpty(cfg.getString(SECTION_ELASTICSEARCH, null, KEY_PREFIX));
+ this.numberOfShards =
+ cfg.getInt(SECTION_ELASTICSEARCH, null, KEY_NUMBER_OF_SHARDS, DEFAULT_NUMBER_OF_SHARDS);
+ this.numberOfReplicas =
+ cfg.getInt(SECTION_ELASTICSEARCH, null, KEY_NUMBER_OF_REPLICAS, DEFAULT_NUMBER_OF_REPLICAS);
this.hosts = new ArrayList<>();
for (String server : cfg.getStringList(SECTION_ELASTICSEARCH, null, KEY_SERVER)) {
try {
diff --git a/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
index 65d2916..40c1bbb 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
@@ -21,6 +21,7 @@
private final boolean ignoreUnmapped;
private final boolean usePostV5Type;
+ private final boolean omitTypeFromSearch;
private final String searchFilteringName;
private final String indicesExistParam;
@@ -31,33 +32,16 @@
private final String versionDiscoveryUrl;
ElasticQueryAdapter(ElasticVersion version) {
- this.ignoreUnmapped = version == ElasticVersion.V2_4;
- this.usePostV5Type = version.isV6();
- this.versionDiscoveryUrl = version.isV6() ? "/%s*" : "/%s*/_aliases";
-
- switch (version) {
- case V5_6:
- case V6_2:
- case V6_3:
- case V6_4:
- case V6_5:
- this.searchFilteringName = "_source";
- this.indicesExistParam = "?allow_no_indices=false";
- this.exactFieldType = "keyword";
- this.stringFieldType = "text";
- this.indexProperty = "true";
- this.rawFieldsKey = "_source";
- break;
- case V2_4:
- default:
- this.searchFilteringName = "fields";
- this.indicesExistParam = "";
- this.exactFieldType = "string";
- this.stringFieldType = "string";
- this.indexProperty = "not_analyzed";
- this.rawFieldsKey = "fields";
- break;
- }
+ this.ignoreUnmapped = false;
+ this.usePostV5Type = version.isV6OrLater();
+ this.omitTypeFromSearch = version.isV7OrLater();
+ this.versionDiscoveryUrl = version.isV6OrLater() ? "/%s*" : "/%s*/_aliases";
+ this.searchFilteringName = "_source";
+ this.indicesExistParam = "?allow_no_indices=false";
+ this.exactFieldType = "keyword";
+ this.stringFieldType = "text";
+ this.indexProperty = "true";
+ this.rawFieldsKey = "_source";
}
void setIgnoreUnmapped(JsonObject properties) {
@@ -100,8 +84,12 @@
return usePostV5Type;
}
- String getType(String preV6Type) {
- return usePostV5Type() ? POST_V5_TYPE : preV6Type;
+ boolean omitTypeFromSearch() {
+ return omitTypeFromSearch;
+ }
+
+ String getType(String type) {
+ return usePostV5Type() ? POST_V5_TYPE : type;
}
String getVersionDiscoveryUrl(String name) {
diff --git a/java/com/google/gerrit/elasticsearch/ElasticSetting.java b/java/com/google/gerrit/elasticsearch/ElasticSetting.java
index 6fd234d..98c313c 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticSetting.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticSetting.java
@@ -22,33 +22,33 @@
private static final ImmutableMap<String, String> CUSTOM_CHAR_MAPPING =
ImmutableMap.of("\\u002E", "\\u0020", "\\u005F", "\\u0020");
- static SettingProperties createSetting() {
- ElasticSetting.Builder settings = new ElasticSetting.Builder();
- settings.addCharFilter();
- settings.addAnalyzer();
- return settings.build();
+ static SettingProperties createSetting(ElasticConfiguration config) {
+ return new ElasticSetting.Builder().addCharFilter().addAnalyzer().build(config);
}
static class Builder {
private final ImmutableMap.Builder<String, FieldProperties> fields =
new ImmutableMap.Builder<>();
- SettingProperties build() {
+ SettingProperties build(ElasticConfiguration config) {
SettingProperties properties = new SettingProperties();
properties.analysis = fields.build();
+ properties.numberOfShards = config.numberOfShards;
+ properties.numberOfReplicas = config.numberOfReplicas;
return properties;
}
- void addCharFilter() {
+ Builder addCharFilter() {
FieldProperties charMapping = new FieldProperties("mapping");
charMapping.mappings = getCustomCharMappings(CUSTOM_CHAR_MAPPING);
FieldProperties charFilter = new FieldProperties();
charFilter.customMapping = charMapping;
fields.put("char_filter", charFilter);
+ return this;
}
- void addAnalyzer() {
+ Builder addAnalyzer() {
FieldProperties customAnalyzer = new FieldProperties("custom");
customAnalyzer.tokenizer = "standard";
customAnalyzer.charFilter = new String[] {"custom_mapping"};
@@ -57,6 +57,7 @@
FieldProperties analyzer = new FieldProperties();
analyzer.customWithCharFilter = customAnalyzer;
fields.put("analyzer", analyzer);
+ return this;
}
private static String[] getCustomCharMappings(ImmutableMap<String, String> map) {
@@ -72,6 +73,8 @@
static class SettingProperties {
Map<String, FieldProperties> analysis;
+ Integer numberOfShards;
+ Integer numberOfReplicas;
}
static class FieldProperties {
diff --git a/java/com/google/gerrit/elasticsearch/ElasticVersion.java b/java/com/google/gerrit/elasticsearch/ElasticVersion.java
index 4c98df1..b69f8f9 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticVersion.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticVersion.java
@@ -18,12 +18,12 @@
import java.util.regex.Pattern;
public enum ElasticVersion {
- V2_4("2.4.*"),
V5_6("5.6.*"),
V6_2("6.2.*"),
V6_3("6.3.*"),
V6_4("6.4.*"),
- V6_5("6.5.*");
+ V6_5("6.5.*"),
+ V7_0("7.0.*");
private final String version;
private final Pattern pattern;
@@ -56,8 +56,16 @@
return Joiner.on(", ").join(ElasticVersion.values());
}
- public boolean isV6() {
- return version.startsWith("6.");
+ public boolean isV6OrLater() {
+ return isAtLeastVersion(6);
+ }
+
+ public boolean isV7OrLater() {
+ return isAtLeastVersion(7);
+ }
+
+ private boolean isAtLeastVersion(int v) {
+ return Integer.valueOf(version.split("\\.")[0]) >= v;
}
@Override
diff --git a/java/com/google/gerrit/extensions/client/MenuItem.java b/java/com/google/gerrit/extensions/client/MenuItem.java
index 8375bba..0c7dd88 100644
--- a/java/com/google/gerrit/extensions/client/MenuItem.java
+++ b/java/com/google/gerrit/extensions/client/MenuItem.java
@@ -22,11 +22,6 @@
public final String target;
public final String id;
- // Needed for GWT
- public MenuItem() {
- this(null, null, null, null);
- }
-
public MenuItem(String name, String url) {
this(name, url, "_blank");
}
diff --git a/java/com/google/gerrit/httpd/restapi/LogRedactUtil.java b/java/com/google/gerrit/httpd/restapi/LogRedactUtil.java
index 5a2a033..5a37b7b 100644
--- a/java/com/google/gerrit/httpd/restapi/LogRedactUtil.java
+++ b/java/com/google/gerrit/httpd/restapi/LogRedactUtil.java
@@ -12,8 +12,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-// WARNING: NoteDbUpdateManager cares about the package name RestApiServlet lives in.
-
package com.google.gerrit.httpd.restapi;
import static com.google.gerrit.httpd.restapi.RestApiServlet.XD_AUTHORIZATION;
diff --git a/java/com/google/gerrit/reviewdb/client/AccountGroup.java b/java/com/google/gerrit/reviewdb/client/AccountGroup.java
index c7dc420..5ec98fc 100644
--- a/java/com/google/gerrit/reviewdb/client/AccountGroup.java
+++ b/java/com/google/gerrit/reviewdb/client/AccountGroup.java
@@ -18,6 +18,7 @@
import com.google.gwtorm.client.IntKey;
import com.google.gwtorm.client.StringKey;
import java.sql.Timestamp;
+import java.time.Instant;
import java.util.Objects;
/** Named group of one or more accounts, typically used for access controls. */
@@ -26,12 +27,10 @@
* Time when the audit subsystem was implemented, used as the default value for {@link #createdOn}
* when one couldn't be determined from the audit log.
*/
- // Can't use Instant here because GWT. This is verified against a readable time in the tests,
- // which don't need to compile under GWT.
- private static final long AUDIT_CREATION_INSTANT_MS = 1244489460000L;
+ private static final Instant AUDIT_CREATION_INSTANT_MS = Instant.ofEpochMilli(1244489460000L);
public static Timestamp auditCreationInstantTs() {
- return new Timestamp(AUDIT_CREATION_INSTANT_MS);
+ return Timestamp.from(AUDIT_CREATION_INSTANT_MS);
}
/** Group name key */
diff --git a/java/com/google/gerrit/server/WebLinks.java b/java/com/google/gerrit/server/WebLinks.java
index 39a2328..589344c 100644
--- a/java/com/google/gerrit/server/WebLinks.java
+++ b/java/com/google/gerrit/server/WebLinks.java
@@ -19,7 +19,6 @@
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.common.data.WebLinkInfoCommon;
import com.google.gerrit.extensions.common.DiffWebLinkInfo;
import com.google.gerrit.extensions.common.WebLinkInfo;
import com.google.gerrit.extensions.registration.DynamicSet;
@@ -54,17 +53,6 @@
return true;
};
- private static final Predicate<WebLinkInfoCommon> INVALID_WEBLINK_COMMON =
- link -> {
- if (link == null) {
- return false;
- } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) {
- logger.atWarning().log("%s is missing name and/or url", link.getClass().getName());
- return false;
- }
- return true;
- };
-
private final DynamicSet<PatchSetWebLink> patchSetLinks;
private final DynamicSet<ParentWebLink> parentLinks;
private final DynamicSet<FileWebLink> fileLinks;
@@ -130,25 +118,13 @@
* @param file File name.
* @return Links for file history
*/
- public List<WebLinkInfoCommon> getFileHistoryLinks(String project, String revision, String file) {
+ public List<WebLinkInfo> getFileHistoryLinks(String project, String revision, String file) {
if (Patch.isMagic(file)) {
return Collections.emptyList();
}
return FluentIterable.from(fileHistoryLinks)
- .transform(
- webLink -> {
- WebLinkInfo info = webLink.getFileHistoryWebLink(project, revision, file);
- if (info == null) {
- return null;
- }
- WebLinkInfoCommon commonInfo = new WebLinkInfoCommon();
- commonInfo.name = info.name;
- commonInfo.imageUrl = info.imageUrl;
- commonInfo.url = info.url;
- commonInfo.target = info.target;
- return commonInfo;
- })
- .filter(INVALID_WEBLINK_COMMON)
+ .transform(webLink -> webLink.getFileHistoryWebLink(project, revision, file))
+ .filter(INVALID_WEBLINK)
.toList();
}
diff --git a/java/com/google/gerrit/server/change/ReviewerJson.java b/java/com/google/gerrit/server/change/ReviewerJson.java
index 6502569..ef2c926 100644
--- a/java/com/google/gerrit/server/change/ReviewerJson.java
+++ b/java/com/google/gerrit/server/change/ReviewerJson.java
@@ -23,6 +23,7 @@
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.extensions.api.changes.ReviewerInfo;
import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.mail.Address;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
@@ -77,12 +78,15 @@
if (cd == null || !cd.getId().equals(rsrc.getChangeId())) {
cd = changeDataFactory.create(db.get(), rsrc.getChangeResource().getNotes());
}
- ReviewerInfo info =
- format(
- new ReviewerInfo(rsrc.getReviewerUser().getAccountId().get()),
- rsrc.getReviewerUser().getAccountId(),
- cd);
- loader.put(info);
+ ReviewerInfo info;
+ if (rsrc.isByEmail()) {
+ Address address = rsrc.getReviewerByEmail();
+ info = ReviewerInfo.byEmail(address.getName(), address.getEmail());
+ } else {
+ Account.Id reviewerAccountId = rsrc.getReviewerUser().getAccountId();
+ info = format(new ReviewerInfo(reviewerAccountId.get()), reviewerAccountId, cd);
+ loader.put(info);
+ }
infos.add(info);
}
loader.fill();
@@ -94,19 +98,21 @@
return format(ImmutableList.<ReviewerResource>of(rsrc));
}
- public ReviewerInfo format(ReviewerInfo out, Account.Id reviewer, ChangeData cd)
+ public ReviewerInfo format(ReviewerInfo out, Account.Id reviewerAccountId, ChangeData cd)
throws OrmException, PermissionBackendException {
PatchSet.Id psId = cd.change().currentPatchSetId();
return format(
out,
- reviewer,
+ reviewerAccountId,
cd,
- approvalsUtil.byPatchSetUser(
- db.get(), cd.notes(), psId, new Account.Id(out._accountId), null, null));
+ approvalsUtil.byPatchSetUser(db.get(), cd.notes(), psId, reviewerAccountId, null, null));
}
public ReviewerInfo format(
- ReviewerInfo out, Account.Id reviewer, ChangeData cd, Iterable<PatchSetApproval> approvals)
+ ReviewerInfo out,
+ Account.Id reviewerAccountId,
+ ChangeData cd,
+ Iterable<PatchSetApproval> approvals)
throws OrmException, PermissionBackendException {
LabelTypes labelTypes = cd.getLabelTypes();
@@ -123,7 +129,7 @@
PatchSet ps = cd.currentPatchSet();
if (ps != null) {
PermissionBackend.ForChange perm =
- permissionBackend.absentUser(reviewer).database(db).change(cd);
+ permissionBackend.absentUser(reviewerAccountId).database(db).change(cd);
for (SubmitRecord rec : submitRuleEvaluator.evaluate(cd)) {
if (rec.labels == null) {
diff --git a/java/com/google/gerrit/server/config/DefaultUrlFormatter.java b/java/com/google/gerrit/server/config/DefaultUrlFormatter.java
index 70fb465..060ee3f 100644
--- a/java/com/google/gerrit/server/config/DefaultUrlFormatter.java
+++ b/java/com/google/gerrit/server/config/DefaultUrlFormatter.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.config;
+import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -27,7 +28,8 @@
public static class Module extends AbstractModule {
@Override
protected void configure() {
- bind(UrlFormatter.class).to(DefaultUrlFormatter.class);
+ DynamicItem.itemOf(binder(), UrlFormatter.class);
+ DynamicItem.bind(binder(), UrlFormatter.class).to(DefaultUrlFormatter.class);
}
}
diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
index c747533..a3b094a 100644
--- a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
+++ b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
@@ -1863,7 +1863,9 @@
private static String readHEAD(Repository repo) {
try {
- return repo.getFullBranch();
+ String head = repo.getFullBranch();
+ logger.atFine().log("HEAD = %s", head);
+ return head;
} catch (IOException e) {
logger.atSevere().withCause(e).log("Cannot read HEAD symref");
return null;
@@ -2725,10 +2727,13 @@
/** prints a warning if the new PS has the same tree as the previous commit. */
private void sameTreeWarning() throws IOException {
- RevCommit newCommit = receivePack.getRevWalk().parseCommit(newCommitId);
+ RevWalk rw = receivePack.getRevWalk();
+ RevCommit newCommit = rw.parseCommit(newCommitId);
RevCommit priorCommit = revisions.inverse().get(priorPatchSet);
if (newCommit.getTree().equals(priorCommit.getTree())) {
+ rw.parseBody(newCommit);
+ rw.parseBody(priorCommit);
boolean messageEq =
Objects.equals(newCommit.getFullMessage(), priorCommit.getFullMessage());
boolean parentsEq = parentsEqual(newCommit, priorCommit);
diff --git a/java/com/google/gerrit/server/restapi/project/GetAccess.java b/java/com/google/gerrit/server/restapi/project/GetAccess.java
index 8875d40..0f46535 100644
--- a/java/com/google/gerrit/server/restapi/project/GetAccess.java
+++ b/java/com/google/gerrit/server/restapi/project/GetAccess.java
@@ -30,13 +30,11 @@
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.RefConfigSection;
-import com.google.gerrit.common.data.WebLinkInfoCommon;
import com.google.gerrit.extensions.api.access.AccessSectionInfo;
import com.google.gerrit.extensions.api.access.PermissionInfo;
import com.google.gerrit.extensions.api.access.PermissionRuleInfo;
import com.google.gerrit.extensions.api.access.ProjectAccessInfo;
import com.google.gerrit.extensions.common.GroupInfo;
-import com.google.gerrit.extensions.common.WebLinkInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
@@ -149,13 +147,9 @@
// config may have a null revision if the repo doesn't have its own refs/meta/config.
if (config.getRevision() != null) {
- // WebLinks operates in terms of the data types used in the GWT UI. Once the GWT UI is
- // gone, WebLinks should be fixed to use the extension data types.
- for (WebLinkInfoCommon wl :
+ info.configWebLinks.addAll(
webLinks.getFileHistoryLinks(
- projectName.get(), config.getRevision().getName(), ProjectConfig.PROJECT_CONFIG)) {
- info.configWebLinks.add(new WebLinkInfo(wl.name, wl.imageUrl, wl.url, wl.target));
- }
+ projectName.get(), config.getRevision().getName(), ProjectConfig.PROJECT_CONFIG));
}
if (config.updateGroupNames(groupBackend)) {
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
index f2ee8e1..bb4b728 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -2010,36 +2010,6 @@
}
@Test
- public void implicitlyCcOnNonVotingReviewGwtStyle() throws Exception {
- testImplicitlyCcOnNonVotingReviewGwtStyle(user);
- }
-
- @Test
- public void implicitlyCcOnNonVotingReviewForUserWithoutUserNameGwtStyle() throws Exception {
- com.google.gerrit.acceptance.TestAccount accountWithoutUsername = accountCreator.create();
- assertThat(accountWithoutUsername.username).isNull();
- testImplicitlyCcOnNonVotingReviewGwtStyle(accountWithoutUsername);
- }
-
- private void testImplicitlyCcOnNonVotingReviewGwtStyle(
- com.google.gerrit.acceptance.TestAccount testAccount) throws Exception {
- PushOneCommit.Result r = createChange();
- setApiUser(testAccount);
- assertThat(getReviewerState(r.getChangeId(), testAccount.id)).isEmpty();
-
- // Exact request format made by GWT UI at ddc6b7160fe416fed9e7e3180489d44c82fd64f8.
- ReviewInput in = new ReviewInput();
- in.labels = ImmutableMap.of("Code-Review", (short) 0);
- in.drafts = DraftHandling.PUBLISH_ALL_REVISIONS;
- in.message = "comment";
- gApi.changes().id(r.getChangeId()).revision(r.getCommit().name()).review(in);
-
- // If we're not reading from NoteDb, then the CCed user will be returned in the REVIEWER state.
- assertThat(getReviewerState(r.getChangeId(), testAccount.id))
- .hasValue(notesMigration.readChanges() ? CC : REVIEWER);
- }
-
- @Test
public void implicitlyAddReviewerOnVotingReview() throws Exception {
PushOneCommit.Result r = createChange();
setApiUser(user);
diff --git a/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java b/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java
index 995f89b..aa1ad7b 100644
--- a/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/project/ProjectIT.java
@@ -31,6 +31,7 @@
import com.google.gerrit.acceptance.GitUtil;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.projects.BranchInput;
import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
@@ -73,6 +74,7 @@
private static final String JIRA_MATCH = "(jira\\\\s+#?)(\\\\d+)";
@Inject private DynamicSet<ProjectIndexedListener> projectIndexedListeners;
+ @Inject private ProjectOperations projectOperations;
@Inject
@IndexExecutor(BATCH)
@@ -429,7 +431,7 @@
@Test
public void reindexProject() throws Exception {
- createProject("child", project);
+ projectOperations.newProject().parent(project).create();
projectIndexedCounter.clear();
gApi.projects().name(allProjects.get()).index(false);
@@ -438,8 +440,8 @@
@Test
public void reindexProjectWithChildren() throws Exception {
- Project.NameKey middle = createProject("middle", project);
- Project.NameKey leave = createProject("leave", middle);
+ Project.NameKey middle = projectOperations.newProject().parent(project).create();
+ Project.NameKey leave = projectOperations.newProject().parent(middle).create();
projectIndexedCounter.clear();
gApi.projects().name(project.get()).index(true);
@@ -473,7 +475,7 @@
@Test
@GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
public void maxObjectSizeIsInheritedFromParentProject() throws Exception {
- Project.NameKey child = createProject(name("child"), project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
ConfigInfo info = setMaxObjectSize("100k");
assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
@@ -489,7 +491,7 @@
@Test
public void maxObjectSizeIsNotInheritedFromParentProject() throws Exception {
- Project.NameKey child = createProject(name("child"), project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
ConfigInfo info = setMaxObjectSize("100k");
assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
@@ -504,7 +506,7 @@
@Test
public void maxObjectSizeOverridesParentProjectWhenNotSetOnParent() throws Exception {
- Project.NameKey child = createProject(name("child"), project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
ConfigInfo info = setMaxObjectSize("0");
assertThat(info.maxObjectSizeLimit.value).isNull();
@@ -519,7 +521,7 @@
@Test
public void maxObjectSizeOverridesParentProjectWhenLower() throws Exception {
- Project.NameKey child = createProject(name("child"), project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
ConfigInfo info = setMaxObjectSize("200k");
assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
@@ -535,7 +537,7 @@
@Test
@GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
public void maxObjectSizeDoesNotOverrideParentProjectWhenHigher() throws Exception {
- Project.NameKey child = createProject(name("child"), project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
ConfigInfo info = setMaxObjectSize("100k");
assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
@@ -552,7 +554,7 @@
@Test
@GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
public void maxObjectSizeIsInheritedFromGlobalConfig() throws Exception {
- Project.NameKey child = createProject(name("child"), project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
ConfigInfo info = getConfig();
assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
@@ -577,7 +579,7 @@
@Test
@GerritConfig(name = "receive.maxObjectSizeLimit", value = "300k")
public void inheritedMaxObjectSizeOverridesGlobalConfigWhenLower() throws Exception {
- Project.NameKey child = createProject(name("child"), project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
ConfigInfo info = setMaxObjectSize("200k");
assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
@@ -594,7 +596,7 @@
@GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
@GerritConfig(name = "receive.inheritProjectMaxObjectSizeLimit", value = "true")
public void maxObjectSizeDoesNotOverrideGlobalConfigWhenHigher() throws Exception {
- Project.NameKey child = createProject(name("child"), project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
ConfigInfo info = setMaxObjectSize("300k");
assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
diff --git a/javatests/com/google/gerrit/acceptance/api/project/ProjectIndexerIT.java b/javatests/com/google/gerrit/acceptance/api/project/ProjectIndexerIT.java
index 6fde012..6b511f6 100644
--- a/javatests/com/google/gerrit/acceptance/api/project/ProjectIndexerIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/project/ProjectIndexerIT.java
@@ -19,6 +19,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.index.IndexConfig;
import com.google.gerrit.index.QueryOptions;
import com.google.gerrit.index.RefState;
@@ -45,6 +46,7 @@
@Inject private ProjectIndexCollection indexes;
@Inject private IndexConfig indexConfig;
@Inject private StalenessChecker stalenessChecker;
+ @Inject private ProjectOperations projectOperations;
private static final ImmutableSet<String> FIELDS =
ImmutableSet.of(ProjectField.NAME.getName(), ProjectField.REF_STATE.getName());
@@ -96,8 +98,8 @@
@Test
public void stalenessChecker_hierarchyChange_isStale() throws Exception {
- Project.NameKey p1 = createProject("p1", allProjects);
- Project.NameKey p2 = createProject("p2", allProjects);
+ Project.NameKey p1 = projectOperations.newProject().create();
+ Project.NameKey p2 = projectOperations.newProject().create();
try (ProjectConfigUpdate u = updateProject(project)) {
u.getConfig().getProject().setParentName(p1);
u.save();
diff --git a/javatests/com/google/gerrit/acceptance/api/project/SetParentIT.java b/javatests/com/google/gerrit/acceptance/api/project/SetParentIT.java
index 3295f1a..c21798c 100644
--- a/javatests/com/google/gerrit/acceptance/api/project/SetParentIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/project/SetParentIT.java
@@ -19,6 +19,7 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.GerritConfig;
import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -27,14 +28,17 @@
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllProjectsNameProvider;
import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.inject.Inject;
import org.junit.Test;
@NoHttpd
public class SetParentIT extends AbstractDaemonTest {
+ @Inject private ProjectOperations projectOperations;
+
@Test
public void setParentNotAllowed() throws Exception {
- String parent = createProject("parent", null, true).get();
+ String parent = projectOperations.newProject().create().get();
setApiUser(user);
exception.expect(AuthException.class);
gApi.projects().name(project.get()).parent(parent);
@@ -43,7 +47,7 @@
@Test
@GerritConfig(name = "receive.allowProjectOwnersToChangeParent", value = "true")
public void setParentNotAllowedForNonOwners() throws Exception {
- String parent = createProject("parent", null, true).get();
+ String parent = projectOperations.newProject().create().get();
setApiUser(user);
exception.expect(AuthException.class);
gApi.projects().name(project.get()).parent(parent);
@@ -52,7 +56,7 @@
@Test
@GerritConfig(name = "receive.allowProjectOwnersToChangeParent", value = "true")
public void setParentAllowedByAdminWhenAllowProjectOwnersEnabled() throws Exception {
- String parent = createProject("parent", null, true).get();
+ String parent = projectOperations.newProject().create().get();
gApi.projects().name(project.get()).parent(parent);
assertThat(gApi.projects().name(project.get()).parent()).isEqualTo(parent);
@@ -67,7 +71,7 @@
@Test
@GerritConfig(name = "receive.allowProjectOwnersToChangeParent", value = "true")
public void setParentAllowedForOwners() throws Exception {
- String parent = createProject("parent", null, true).get();
+ String parent = projectOperations.newProject().create().get();
setApiUser(user);
grant(project, "refs/*", Permission.OWNER, false, SystemGroupBackend.REGISTERED_USERS);
gApi.projects().name(project.get()).parent(parent);
@@ -76,7 +80,7 @@
@Test
public void setParent() throws Exception {
- String parent = createProject("parent", null, true).get();
+ String parent = projectOperations.newProject().create().get();
gApi.projects().name(project.get()).parent(parent);
assertThat(gApi.projects().name(project.get()).parent()).isEqualTo(parent);
@@ -104,7 +108,7 @@
@Test
public void setParentToOwnChildNotAllowed() throws Exception {
- String child = createProject("child", project, true).get();
+ String child = projectOperations.newProject().parent(project).create().get();
exception.expect(ResourceConflictException.class);
exception.expectMessage("cycle exists between");
gApi.projects().name(project.get()).parent(child);
@@ -112,8 +116,8 @@
@Test
public void setParentToGrandchildNotAllowed() throws Exception {
- Project.NameKey child = createProject("child", project, true);
- String grandchild = createProject("grandchild", child, true).get();
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
+ String grandchild = projectOperations.newProject().parent(child).create().get();
exception.expect(ResourceConflictException.class);
exception.expectMessage("cycle exists between");
gApi.projects().name(project.get()).parent(grandchild);
@@ -137,7 +141,7 @@
public void setParentForAllUsersMustBeAllProjects() throws Exception {
gApi.projects().name(allUsers.get()).parent(allProjects.get());
- String parent = createProject("parent", null, true).get();
+ String parent = projectOperations.newProject().create().get();
exception.expect(BadRequestException.class);
exception.expectMessage("All-Users must inherit from All-Projects");
diff --git a/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
index a5ff746..5e82f84 100644
--- a/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
+++ b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
@@ -220,6 +220,48 @@
@Test
@TestProjectInput(createEmptyCommit = false)
+ public void pushInitialCommitSeriesForMasterBranch() throws Exception {
+ RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create();
+ String id = GitUtil.getChangeId(testRepo, c).get();
+ testRepo.reset(c);
+
+ RevCommit c2 = testRepo.commit().parent(c).message("Second commit").insertChangeId().create();
+ String id2 = GitUtil.getChangeId(testRepo, c2).get();
+ testRepo.reset(c2);
+
+ String r = "refs/for/master";
+ PushResult pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+
+ ChangeInfo change = gApi.changes().id(id).info();
+ assertThat(change.branch).isEqualTo("master");
+ assertThat(change.status).isEqualTo(ChangeStatus.NEW);
+
+ ChangeInfo change2 = gApi.changes().id(id2).info();
+ assertThat(change2.branch).isEqualTo("master");
+ assertThat(change2.status).isEqualTo(ChangeStatus.NEW);
+
+ try (Repository repo = repoManager.openRepository(project)) {
+ assertThat(repo.resolve("master")).isNull();
+ }
+
+ gApi.changes().id(change.id).current().review(ReviewInput.approve());
+ gApi.changes().id(change.id).current().submit();
+
+ try (Repository repo = repoManager.openRepository(project)) {
+ assertThat(repo.resolve("master")).isEqualTo(c);
+ }
+
+ gApi.changes().id(change2.id).current().review(ReviewInput.approve());
+ gApi.changes().id(change2.id).current().submit();
+
+ try (Repository repo = repoManager.openRepository(project)) {
+ assertThat(repo.resolve("master")).isEqualTo(c2);
+ }
+ }
+
+ @Test
+ @TestProjectInput(createEmptyCommit = false)
public void validateConnected() throws Exception {
RevCommit c = testRepo.commit().message("Initial commit").insertChangeId().create();
testRepo.reset(c);
@@ -1422,14 +1464,7 @@
@Test
public void pushSameCommitTwice() throws Exception {
- try (ProjectConfigUpdate u = updateProject(project)) {
- u.getConfig()
- .getProject()
- .setBooleanConfig(
- BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
- InheritableBoolean.TRUE);
- u.save();
- }
+ enableCreateNewChangeForAllNotInTarget();
PushOneCommit push =
pushFactory.create(
@@ -1451,14 +1486,7 @@
@Test
public void pushSameCommitTwiceWhenIndexFailed() throws Exception {
- try (ProjectConfigUpdate u = updateProject(project)) {
- u.getConfig()
- .getProject()
- .setBooleanConfig(
- BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
- InheritableBoolean.TRUE);
- u.save();
- }
+ enableCreateNewChangeForAllNotInTarget();
PushOneCommit push =
pushFactory.create(
@@ -2314,6 +2342,113 @@
assertPushOk(pr, "refs/heads/permitted");
}
+ @Test
+ public void pushCommitsWithSameTreeNoChanges() throws Exception {
+ RevCommit c =
+ testRepo
+ .commit()
+ .message("Foo")
+ .parent(getHead(testRepo.getRepository()))
+ .insertChangeId()
+ .create();
+ testRepo.reset(c);
+
+ String r = "refs/for/master";
+ PushResult pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+
+ RevCommit amended = testRepo.amend(c).create();
+ testRepo.reset(amended);
+
+ pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+ assertThat(pr.getMessages())
+ .contains(
+ "warning: no changes between prior commit "
+ + c.abbreviate(7).name()
+ + " and new commit "
+ + amended.abbreviate(7).name());
+ }
+
+ @Test
+ public void pushCommitsWithSameTreeNoFilesChangedMessageUpdated() throws Exception {
+ RevCommit c =
+ testRepo
+ .commit()
+ .message("Foo")
+ .parent(getHead(testRepo.getRepository()))
+ .insertChangeId()
+ .create();
+ String id = GitUtil.getChangeId(testRepo, c).get();
+ testRepo.reset(c);
+
+ String r = "refs/for/master";
+ PushResult pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+
+ RevCommit amended =
+ testRepo.amend(c).message("Foo Bar").insertChangeId(id.substring(1)).create();
+ testRepo.reset(amended);
+
+ pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+ assertThat(pr.getMessages())
+ .contains(
+ "warning: " + amended.abbreviate(7).name() + ": no files changed, message updated");
+ }
+
+ @Test
+ public void pushCommitsWithSameTreeNoFilesChangedAuthorChanged() throws Exception {
+ RevCommit c =
+ testRepo
+ .commit()
+ .message("Foo")
+ .parent(getHead(testRepo.getRepository()))
+ .insertChangeId()
+ .create();
+ testRepo.reset(c);
+
+ String r = "refs/for/master";
+ PushResult pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+
+ RevCommit amended = testRepo.amend(c).author(user.getIdent()).create();
+ testRepo.reset(amended);
+
+ pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+ assertThat(pr.getMessages())
+ .contains(
+ "warning: " + amended.abbreviate(7).name() + ": no files changed, author changed");
+ }
+
+ @Test
+ public void pushCommitsWithSameTreeNoFilesChangedWasRebased() throws Exception {
+ RevCommit head = getHead(testRepo.getRepository());
+ RevCommit c = testRepo.commit().message("Foo").parent(head).insertChangeId().create();
+ testRepo.reset(c);
+
+ String r = "refs/for/master";
+ PushResult pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+
+ testRepo.reset(head);
+ RevCommit newBase = testRepo.commit().message("Base").parent(head).insertChangeId().create();
+ testRepo.reset(newBase);
+
+ pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+
+ testRepo.reset(c);
+ RevCommit amended = testRepo.amend(c).parent(newBase).create();
+ testRepo.reset(amended);
+
+ pr = pushHead(testRepo, r, false);
+ assertPushOk(pr, r);
+ assertThat(pr.getMessages())
+ .contains("warning: " + amended.abbreviate(7).name() + ": no files changed, was rebased");
+ }
+
private DraftInput newDraft(String path, int line, String message) {
DraftInput d = new DraftInput();
d.path = path;
diff --git a/javatests/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java b/javatests/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
index 28a45c3..58051bb 100644
--- a/javatests/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
+++ b/javatests/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
@@ -20,7 +20,6 @@
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
-import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.SubscribeSection;
import com.google.gerrit.extensions.client.SubmitType;
@@ -104,15 +103,14 @@
return cfg;
}
- protected Project.NameKey createProjectForPush(
- String name,
- @Nullable Project.NameKey parent,
- boolean createEmptyCommit,
- SubmitType submitType)
- throws Exception {
- Project.NameKey project = createProject(name, parent, createEmptyCommit, submitType);
+ protected void grantPush(Project.NameKey project) throws Exception {
grant(project, "refs/heads/*", Permission.PUSH);
grant(project, "refs/for/refs/heads/*", Permission.SUBMIT);
+ }
+
+ protected Project.NameKey createProjectForPush(SubmitType submitType) throws Exception {
+ Project.NameKey project = projectOperations.newProject().submitType(submitType).create();
+ grantPush(project);
return project;
}
@@ -120,8 +118,8 @@
@Before
public void setUp() throws Exception {
- superKey = createProjectForPush("super", null, true, getSubmitType());
- subKey = createProjectForPush("sub", null, true, getSubmitType());
+ superKey = createProjectForPush(getSubmitType());
+ subKey = createProjectForPush(getSubmitType());
superRepo = cloneProject(superKey);
subRepo = cloneProject(subKey);
}
diff --git a/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
index 8317ab1..72ba420 100644
--- a/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
+++ b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsIT.java
@@ -403,12 +403,15 @@
@Test
public void subscriptionInheritACL() throws Exception {
- Project.NameKey configKey = createProjectForPush("config-repo", null, true, getSubmitType());
+ Project.NameKey configKey = projectOperations.newProject().submitType(getSubmitType()).create();
+ grantPush(configKey);
Project.NameKey config2Key =
- createProjectForPush("config-repo2", configKey, true, getSubmitType());
+ projectOperations.newProject().parent(configKey).submitType(getSubmitType()).create();
+ grantPush(config2Key);
cloneProject(config2Key);
- subKey = createProjectForPush("subrepo", config2Key, true, getSubmitType());
+ subKey = projectOperations.newProject().parent(config2Key).submitType(getSubmitType()).create();
+ grantPush(subKey);
subRepo = cloneProject(subKey);
allowMatchingSubmoduleSubscription(configKey, "refs/heads/*", superKey, "refs/heads/*");
@@ -445,8 +448,7 @@
@Test
public void subscriptionDeepRelative() throws Exception {
- Project.NameKey nest =
- createProjectForPush("nested/subscribed-to-project", null, true, getSubmitType());
+ Project.NameKey nest = createProjectForPush(getSubmitType());
TestRepository<?> subRepo = cloneProject(nest);
// master is allowed to be subscribed to any superprojects branch:
allowMatchingSubmoduleSubscription(nest, "refs/heads/master", superKey, null);
@@ -511,8 +513,7 @@
TestTimeUtil.resetWithClockStep(1, SECONDS);
try {
- Project.NameKey proj2 =
- createProjectForPush("subscribed-to-project-2", null, true, getSubmitType());
+ Project.NameKey proj2 = createProjectForPush(getSubmitType());
TestRepository<?> subRepo2 = cloneProject(proj2);
allowMatchingSubmoduleSubscription(
@@ -559,8 +560,7 @@
// is afterwards.
TestTimeUtil.resetWithClockStep(1, SECONDS);
try {
- Project.NameKey proj2 =
- createProjectForPush("subscribed-to-project-2", null, true, getSubmitType());
+ Project.NameKey proj2 = createProjectForPush(getSubmitType());
TestRepository<InMemoryRepository> repo2 = cloneProject(proj2, user);
allowMatchingSubmoduleSubscription(
@@ -604,10 +604,8 @@
@Test
public void updateOnlyRelevantSubmodules() throws Exception {
- Project.NameKey subkey1 =
- createProjectForPush("subscribed-to-project-1", null, true, getSubmitType());
- Project.NameKey subkey2 =
- createProjectForPush("subscribed-to-project-2", null, true, getSubmitType());
+ Project.NameKey subkey1 = createProjectForPush(getSubmitType());
+ Project.NameKey subkey2 = createProjectForPush(getSubmitType());
TestRepository<?> subRepo1 = cloneProject(subkey1);
TestRepository<?> subRepo2 = cloneProject(subkey2);
diff --git a/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
index 9983c3a..82b9cd0 100644
--- a/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
+++ b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
@@ -21,7 +21,6 @@
import com.google.common.collect.ImmutableList;
import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.client.ChangeStatus;
@@ -31,7 +30,6 @@
import com.google.gerrit.reviewdb.client.Project.NameKey;
import com.google.gerrit.server.change.TestSubmitInput;
import com.google.gerrit.testing.ConfigSuite;
-import com.google.inject.Inject;
import java.util.ArrayDeque;
import java.util.Map;
import org.apache.commons.lang.RandomStringUtils;
@@ -71,8 +69,6 @@
return submitByRebaseIfNecessaryConfig();
}
- @Inject ProjectOperations projectOperations;
-
@Test
public void subscriptionUpdateOfManyChanges() throws Exception {
allowMatchingSubmoduleSubscription(subKey, "refs/heads/master", superKey, "refs/heads/master");
@@ -367,8 +363,20 @@
@Test
public void doNotUseFastForward() throws Exception {
// like setup, but without empty commit
- superKey = createProjectForPush("super-nc", null, false, getSubmitType());
- subKey = createProjectForPush("sub-nc", null, false, getSubmitType());
+ superKey =
+ projectOperations
+ .newProject()
+ .submitType(getSubmitType())
+ .createEmptyCommit(false)
+ .create();
+ grantPush(superKey);
+ subKey =
+ projectOperations
+ .newProject()
+ .submitType(getSubmitType())
+ .createEmptyCommit(false)
+ .create();
+ grantPush(subKey);
superRepo = cloneProject(superKey);
subRepo = cloneProject(subKey);
@@ -395,8 +403,20 @@
@Test
public void useFastForwardWhenNoSubmodule() throws Exception {
// like setup, but without empty commit
- superKey = createProjectForPush("super-nc", null, false, getSubmitType());
- subKey = createProjectForPush("sub-nc", null, false, getSubmitType());
+ superKey =
+ projectOperations
+ .newProject()
+ .submitType(getSubmitType())
+ .createEmptyCommit(false)
+ .create();
+ grantPush(superKey);
+ subKey =
+ projectOperations
+ .newProject()
+ .submitType(getSubmitType())
+ .createEmptyCommit(false)
+ .create();
+ grantPush(subKey);
superRepo = cloneProject(superKey);
subRepo = cloneProject(subKey);
@@ -493,7 +513,7 @@
@Test
public void nonSubmoduleInSameTopic() throws Exception {
- Project.NameKey standaloneKey = createProjectForPush("standalone", null, true, getSubmitType());
+ Project.NameKey standaloneKey = createProjectForPush(getSubmitType());
TestRepository<?> standAlone = cloneProject(standaloneKey);
allowMatchingSubmoduleSubscription(subKey, "refs/heads/master", superKey, "refs/heads/master");
@@ -533,9 +553,9 @@
@Test
public void recursiveSubmodules() throws Exception {
- Project.NameKey topKey = createProjectForPush("top-project", null, true, getSubmitType());
- Project.NameKey midKey = createProjectForPush("mid-project", null, true, getSubmitType());
- Project.NameKey botKey = createProjectForPush("bottom-project", null, true, getSubmitType());
+ Project.NameKey topKey = createProjectForPush(getSubmitType());
+ Project.NameKey midKey = createProjectForPush(getSubmitType());
+ Project.NameKey botKey = createProjectForPush(getSubmitType());
TestRepository<?> topRepo = cloneProject(topKey);
TestRepository<?> midRepo = cloneProject(midKey);
TestRepository<?> bottomRepo = cloneProject(botKey);
@@ -563,9 +583,9 @@
@Test
public void triangleSubmodules() throws Exception {
- Project.NameKey topKey = createProjectForPush("top-project", null, true, getSubmitType());
- Project.NameKey midKey = createProjectForPush("mid-project", null, true, getSubmitType());
- Project.NameKey botKey = createProjectForPush("bottom-project", null, true, getSubmitType());
+ Project.NameKey topKey = createProjectForPush(getSubmitType());
+ Project.NameKey midKey = createProjectForPush(getSubmitType());
+ Project.NameKey botKey = createProjectForPush(getSubmitType());
TestRepository<?> topRepo = cloneProject(topKey);
TestRepository<?> midRepo = cloneProject(midKey);
TestRepository<?> bottomRepo = cloneProject(botKey);
@@ -597,9 +617,9 @@
}
private String prepareBranchCircularSubscription() throws Exception {
- Project.NameKey topKey = createProjectForPush("top-project", null, true, getSubmitType());
- Project.NameKey midKey = createProjectForPush("mid-project", null, true, getSubmitType());
- Project.NameKey botKey = createProjectForPush("bottom-project", null, true, getSubmitType());
+ Project.NameKey topKey = createProjectForPush(getSubmitType());
+ Project.NameKey midKey = createProjectForPush(getSubmitType());
+ Project.NameKey botKey = createProjectForPush(getSubmitType());
TestRepository<?> topRepo = cloneProject(topKey);
TestRepository<?> midRepo = cloneProject(midKey);
TestRepository<?> bottomRepo = cloneProject(botKey);
@@ -662,8 +682,8 @@
@Test
public void projectNoSubscriptionWholeTopic() throws Exception {
- Project.NameKey keyA = createProjectForPush("project-a", null, true, getSubmitType());
- Project.NameKey keyB = createProjectForPush("project-b", null, true, getSubmitType());
+ Project.NameKey keyA = createProjectForPush(getSubmitType());
+ Project.NameKey keyB = createProjectForPush(getSubmitType());
TestRepository<?> repoA = cloneProject(keyA);
TestRepository<?> repoB = cloneProject(keyB);
@@ -733,8 +753,8 @@
@Test
public void twoProjectsMultipleBranchesWholeTopic() throws Exception {
- Project.NameKey keyA = createProjectForPush("project-a", null, true, getSubmitType());
- Project.NameKey keyB = createProjectForPush("project-b", null, true, getSubmitType());
+ Project.NameKey keyA = createProjectForPush(getSubmitType());
+ Project.NameKey keyB = createProjectForPush(getSubmitType());
TestRepository<?> repoA = cloneProject(keyA);
TestRepository<?> repoB = cloneProject(keyB);
// bootstrap the dev branch
@@ -782,9 +802,9 @@
public void retrySubmitAfterTornTopicOnLockFailure() throws Exception {
assume().that(notesMigration.disableChangeReviewDb()).isTrue();
- Project.NameKey subKey1 = createProjectForPush("sub1", null, true, getSubmitType());
+ Project.NameKey subKey1 = createProjectForPush(getSubmitType());
TestRepository<?> sub1 = cloneProject(subKey1);
- Project.NameKey subKey2 = createProjectForPush("sub2", null, true, getSubmitType());
+ Project.NameKey subKey2 = createProjectForPush(getSubmitType());
TestRepository<?> sub2 = cloneProject(subKey2);
allowMatchingSubmoduleSubscription(subKey1, "refs/heads/master", superKey, "refs/heads/master");
@@ -844,9 +864,9 @@
@Test
public void skipUpdatingBrokenGitlinkPointer() throws Exception {
- Project.NameKey subKey1 = createProjectForPush("sub1", null, true, getSubmitType());
+ Project.NameKey subKey1 = createProjectForPush(getSubmitType());
TestRepository<?> sub1 = cloneProject(subKey1);
- Project.NameKey subKey2 = createProjectForPush("sub2", null, true, getSubmitType());
+ Project.NameKey subKey2 = createProjectForPush(getSubmitType());
TestRepository<?> sub2 = cloneProject(subKey2);
allowMatchingSubmoduleSubscription(subKey1, "refs/heads/master", superKey, "refs/heads/master");
diff --git a/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java b/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
index 29a5bd0..bb7cff7 100644
--- a/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
+++ b/javatests/com/google/gerrit/acceptance/pgm/ElasticReindexIT.java
@@ -26,11 +26,6 @@
public class ElasticReindexIT extends AbstractReindexTests {
@ConfigSuite.Default
- public static Config elasticsearchV2() {
- return getConfig(ElasticVersion.V2_4);
- }
-
- @ConfigSuite.Config
public static Config elasticsearchV5() {
return getConfig(ElasticVersion.V5_6);
}
@@ -40,6 +35,11 @@
return getConfig(ElasticVersion.V6_5);
}
+ @ConfigSuite.Config
+ public static Config elasticsearchV7() {
+ return getConfig(ElasticVersion.V7_0);
+ }
+
@Override
public void configureIndex(Injector injector) throws Exception {
createAllIndexes(injector);
diff --git a/javatests/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java b/javatests/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java
index ae0483b..f9bc539 100644
--- a/javatests/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/account/WatchedProjectsIT.java
@@ -61,8 +61,8 @@
@Test
public void setAndDeleteWatchedProjects() throws Exception {
- String projectName1 = this.projectOperations.newProject().create().get();
- String projectName2 = this.projectOperations.newProject().create().get();
+ String projectName1 = projectOperations.newProject().create().get();
+ String projectName2 = projectOperations.newProject().create().get();
List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
@@ -95,7 +95,7 @@
@Test
public void setConflictingWatches() throws Exception {
- String projectName = this.projectOperations.newProject().create().get();
+ String projectName = projectOperations.newProject().create().get();
List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
@@ -119,7 +119,7 @@
@Test
public void setAndGetEmptyWatch() throws Exception {
- String projectName = this.projectOperations.newProject().create().get();
+ String projectName = projectOperations.newProject().create().get();
List<ProjectWatchInfo> projectsToWatch = new ArrayList<>();
diff --git a/javatests/com/google/gerrit/acceptance/rest/binding/ProjectsRestApiBindingsIT.java b/javatests/com/google/gerrit/acceptance/rest/binding/ProjectsRestApiBindingsIT.java
index 0c18dbb..c838cf9 100644
--- a/javatests/com/google/gerrit/acceptance/rest/binding/ProjectsRestApiBindingsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/binding/ProjectsRestApiBindingsIT.java
@@ -27,11 +27,13 @@
import com.google.gerrit.acceptance.GitUtil;
import com.google.gerrit.acceptance.rest.util.RestApiCallHelper;
import com.google.gerrit.acceptance.rest.util.RestCall;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.api.projects.BranchInput;
import com.google.gerrit.extensions.api.projects.TagInput;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.inject.Inject;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -156,6 +158,7 @@
ImmutableList.of(RestCall.get("/projects/%s/commits/%s/files/%s/content"));
private static final String FILENAME = "test.txt";
+ @Inject private ProjectOperations projectOperations;
@Test
public void projectEndpoints() throws Exception {
@@ -164,7 +167,7 @@
@Test
public void childProjectEndpoints() throws Exception {
- Project.NameKey childProject = createProject("test-child-repo", project);
+ Project.NameKey childProject = projectOperations.newProject().parent(project).create();
RestApiCallHelper.execute(
adminRestSession, CHILD_PROJECT_ENDPOINTS, project.get(), childProject.get());
}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
index 8b755e9..bab4c1d 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -38,8 +38,6 @@
import com.google.gerrit.acceptance.TestAccount;
import com.google.gerrit.acceptance.TestProjectInput;
import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
-import com.google.gerrit.acceptance.testsuite.project.TestProjectCreation;
-import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.changes.ChangeApi;
import com.google.gerrit.extensions.api.changes.SubmitInput;
@@ -67,7 +65,6 @@
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.IdentifiedUser;
@@ -389,9 +386,9 @@
String topic = "test-topic";
// Create test projects
- Project.NameKey keyA = createProjectForPush(null, getSubmitType());
+ Project.NameKey keyA = createProjectForPush(getSubmitType());
TestRepository<?> repoA = cloneProject(keyA);
- Project.NameKey keyB = createProjectForPush(null, getSubmitType());
+ Project.NameKey keyB = createProjectForPush(getSubmitType());
TestRepository<?> repoB = cloneProject(keyB);
// Create changes on project-a
@@ -425,7 +422,7 @@
String topic = "test-topic";
// Create test project
- Project.NameKey keyA = createProjectForPush(null, getSubmitType());
+ Project.NameKey keyA = createProjectForPush(getSubmitType());
TestRepository<?> repoA = cloneProject(keyA);
RevCommit initialHead = getRemoteHead(keyA, "master");
@@ -775,9 +772,9 @@
String topic = "test-topic";
// Create test projects
- Project.NameKey keyA = createProjectForPush(null, getSubmitType());
+ Project.NameKey keyA = createProjectForPush(getSubmitType());
TestRepository<?> repoA = cloneProject(keyA);
- Project.NameKey keyB = createProjectForPush(null, getSubmitType());
+ Project.NameKey keyB = createProjectForPush(getSubmitType());
TestRepository<?> repoB = cloneProject(keyB);
// Create changes on project-a
@@ -940,8 +937,8 @@
String topic = "test-topic";
- Project.NameKey keyA = createProjectForPush(null, getSubmitType());
- Project.NameKey keyB = createProjectForPush(null, getSubmitType());
+ Project.NameKey keyA = createProjectForPush(getSubmitType());
+ Project.NameKey keyB = createProjectForPush(getSubmitType());
TestRepository<?> repoA = cloneProject(keyA);
TestRepository<?> repoB = cloneProject(keyB);
@@ -1362,13 +1359,8 @@
}
// TODO(hanwen): the submodule tests have a similar method; maybe we could share code?
- protected Project.NameKey createProjectForPush(@Nullable NameKey parent, SubmitType submitType)
- throws Exception {
- TestProjectCreation.Builder b = projectOperations.newProject().submitType(submitType);
- if (parent != null) {
- b.parent(parent);
- }
- Project.NameKey project = b.create();
+ protected Project.NameKey createProjectForPush(SubmitType submitType) throws Exception {
+ Project.NameKey project = projectOperations.newProject().submitType(submitType).create();
grant(project, "refs/heads/*", Permission.PUSH);
grant(project, "refs/for/refs/heads/*", Permission.SUBMIT);
return project;
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
index ac0d0aa..164fe60 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ChangeOwnerIT.java
@@ -19,11 +19,13 @@
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.TestAccount;
import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.group.SystemGroupBackend;
+import com.google.inject.Inject;
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
import org.eclipse.jgit.junit.TestRepository;
import org.junit.Before;
@@ -32,6 +34,7 @@
public class ChangeOwnerIT extends AbstractDaemonTest {
private TestAccount user2;
+ @Inject private ProjectOperations projectOperations;
@Before
public void setUp() throws Exception {
@@ -63,7 +66,7 @@
public void testChangeOwner_OwnerACLGrantedOnParentProject() throws Exception {
setApiUser(admin);
grantApproveToChangeOwner(project);
- Project.NameKey child = createProject("child", project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
setApiUser(user);
TestRepository<InMemoryRepository> childRepo = cloneProject(child, user);
@@ -74,7 +77,7 @@
public void testChangeOwner_BlockedOnParentProject() throws Exception {
setApiUser(admin);
blockApproveForChangeOwner(project);
- Project.NameKey child = createProject("child", project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
setApiUser(user);
grantApproveToAll(child);
@@ -92,7 +95,7 @@
public void testChangeOwner_BlockedOnParentProjectAndExclusiveAllowOnChild() throws Exception {
setApiUser(admin);
blockApproveForChangeOwner(project);
- Project.NameKey child = createProject("child", project);
+ Project.NameKey child = projectOperations.newProject().parent(project).create();
setApiUser(user);
grantExclusiveApproveToAll(child);
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
index 257c88b..dc71c1f 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ChangeReviewersByEmailIT.java
@@ -22,8 +22,8 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.extensions.api.changes.AddReviewerInput;
import com.google.gerrit.extensions.api.changes.AddReviewerResult;
import com.google.gerrit.extensions.api.changes.ReviewInput;
@@ -35,11 +35,12 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.mail.Address;
import com.google.gerrit.testing.FakeEmailSender.Message;
+import com.google.gson.reflect.TypeToken;
+import java.lang.reflect.Type;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
-@NoHttpd
public class ChangeReviewersByEmailIT extends AbstractDaemonTest {
@Before
@@ -96,6 +97,34 @@
}
@Test
+ public void listReviewersByEmail() throws Exception {
+ assume().that(notesMigration.readChanges()).isTrue();
+ AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
+
+ for (ReviewerState state : ImmutableList.of(ReviewerState.CC, ReviewerState.REVIEWER)) {
+ PushOneCommit.Result r = createChange();
+
+ AddReviewerInput input = new AddReviewerInput();
+ input.reviewer = toRfcAddressString(acc);
+ input.state = state;
+ gApi.changes().id(r.getChangeId()).addReviewer(input);
+
+ RestResponse restResponse =
+ adminRestSession.get("/changes/" + r.getChangeId() + "/reviewers/");
+ restResponse.assertOK();
+ Type type = new TypeToken<List<ReviewerInfo>>() {}.getType();
+ List<ReviewerInfo> reviewers = newGson().fromJson(restResponse.getReader(), type);
+ restResponse.consume();
+
+ assertThat(reviewers).hasSize(1);
+ ReviewerInfo reviewerInfo = Iterables.getOnlyElement(reviewers);
+ assertThat(reviewerInfo._accountId).isNull();
+ assertThat(reviewerInfo.name).isEqualTo(acc.name);
+ assertThat(reviewerInfo.email).isEqualTo(acc.email);
+ }
+ }
+
+ @Test
public void removeByEmail() throws Exception {
assume().that(notesMigration.readChanges()).isTrue();
AccountInfo acc = new AccountInfo("Foo Bar", "foo.bar@gerritcodereview.com");
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java b/javatests/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java
index 22c19ac..c5ba5e4 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/ConfigChangeIT.java
@@ -22,7 +22,6 @@
import com.google.gerrit.acceptance.GitUtil;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.TestProjectInput;
-import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.api.projects.ProjectInput;
@@ -32,7 +31,6 @@
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.project.testing.Util;
-import com.google.inject.Inject;
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
@@ -45,8 +43,6 @@
import org.junit.Test;
public class ConfigChangeIT extends AbstractDaemonTest {
- @Inject private ProjectOperations projectOperations;
-
@Before
public void setUp() throws Exception {
try (ProjectConfigUpdate u = updateProject(project)) {
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java b/javatests/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java
index f91d31a..936feed 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/PrivateByDefaultIT.java
@@ -41,7 +41,7 @@
@Before
public void setUp() throws Exception {
project1 = projectOperations.newProject().create();
- project2 = createProject("project-2", project1);
+ project2 = projectOperations.newProject().parent(project1).create();
setPrivateByDefault(project1, InheritableBoolean.FALSE);
}
diff --git a/javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
index 13e7642e..d92cf30 100644
--- a/javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
@@ -135,9 +135,9 @@
@Test
public void submitChangesAcrossRepos() throws Exception {
- Project.NameKey p1 = this.projectOperations.newProject().create();
- Project.NameKey p2 = this.projectOperations.newProject().create();
- Project.NameKey p3 = this.projectOperations.newProject().create();
+ Project.NameKey p1 = projectOperations.newProject().create();
+ Project.NameKey p2 = projectOperations.newProject().create();
+ Project.NameKey p3 = projectOperations.newProject().create();
RevCommit initialHead2 = getRemoteHead(p2, "master");
RevCommit initialHead3 = getRemoteHead(p3, "master");
@@ -212,9 +212,9 @@
@Test
public void submitChangesAcrossReposBlocked() throws Exception {
- Project.NameKey p1 = this.projectOperations.newProject().create();
- Project.NameKey p2 = this.projectOperations.newProject().create();
- Project.NameKey p3 = this.projectOperations.newProject().create();
+ Project.NameKey p1 = projectOperations.newProject().create();
+ Project.NameKey p2 = projectOperations.newProject().create();
+ Project.NameKey p3 = projectOperations.newProject().create();
TestRepository<?> repo1 = cloneProject(p1);
TestRepository<?> repo2 = cloneProject(p2);
@@ -391,7 +391,7 @@
"3",
"a-topic-here");
- Project.NameKey p3 = this.projectOperations.newProject().create();
+ Project.NameKey p3 = projectOperations.newProject().create();
TestRepository<?> repo3 = cloneProject(p3);
RevCommit repo3Head = getRemoteHead(p3, "master");
PushOneCommit.Result change3b =
@@ -713,8 +713,8 @@
// (c2a) <= private
assume().that(isSubmitWholeTopicEnabled()).isTrue();
- Project.NameKey p1 = this.projectOperations.newProject().create();
- Project.NameKey p2 = this.projectOperations.newProject().create();
+ Project.NameKey p1 = projectOperations.newProject().create();
+ Project.NameKey p2 = projectOperations.newProject().create();
grantLabel("Code-Review", -2, 2, p1, "refs/heads/*", false, REGISTERED_USERS, false);
grant(p1, "refs/*", Permission.SUBMIT, false, REGISTERED_USERS);
@@ -767,7 +767,7 @@
@Test
public void testPreviewSubmitTgz() throws Exception {
- Project.NameKey p1 = this.projectOperations.newProject().create();
+ Project.NameKey p1 = projectOperations.newProject().create();
TestRepository<?> repo1 = cloneProject(p1);
PushOneCommit.Result change1 = createChange(repo1, "master", "test", "a.txt", "1", "topic");
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java b/javatests/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
index b7ee3f7..d736578 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
@@ -53,7 +53,7 @@
@Test
public void getGrandChildProject_NotFound() throws Exception {
Project.NameKey child = projectOperations.newProject().create();
- Project.NameKey grandChild = createProject("p1.1", child);
+ Project.NameKey grandChild = projectOperations.newProject().parent(child).create();
assertChildNotFound(allProjects, grandChild.get());
}
@@ -61,7 +61,7 @@
@Test
public void getGrandChildProjectWithRecursiveFlag() throws Exception {
Project.NameKey child = projectOperations.newProject().create();
- Project.NameKey grandChild = createProject("p1.1", child);
+ Project.NameKey grandChild = projectOperations.newProject().parent(child).create();
ProjectInfo grandChildInfo =
gApi.projects().name(allProjects.get()).child(grandChild.get()).get(true);
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
index 7089c43..a0bc450 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
@@ -44,8 +44,8 @@
@Test
public void listChildren() throws Exception {
Project.NameKey child1 = projectOperations.newProject().create();
- Project.NameKey child1_1 = createProject("p1.1", child1);
- Project.NameKey child1_2 = createProject("p1.2", child1);
+ Project.NameKey child1_1 = projectOperations.newProject().parent(child1).create();
+ Project.NameKey child1_2 = projectOperations.newProject().parent(child1).create();
assertThatNameList(gApi.projects().name(child1.get()).children()).isOrdered();
assertThatNameList(gApi.projects().name(child1.get()).children())
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
index 1d47408..7009e76 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
@@ -46,7 +46,7 @@
@Test
public void listProjects() throws Exception {
- Project.NameKey someProject = this.projectOperations.newProject().create();
+ Project.NameKey someProject = projectOperations.newProject().create();
assertThatNameList(gApi.projects().list().get())
.containsExactly(allProjects, allUsers, project, someProject);
assertThatNameList(gApi.projects().list().get()).isOrdered();
@@ -104,7 +104,6 @@
@Test
public void listProjectsWithPrefix() throws Exception {
- // Default for createEmptyCommit should match TestProjectConfig.
Project.NameKey someProject = projectOperations.newProject().name("listtest-p1").create();
Project.NameKey someOtherProject = projectOperations.newProject().name("listtest-p2").create();
projectOperations.newProject().name("other-prefix-project").create();
@@ -171,10 +170,8 @@
@Test
public void listProjectsWithTree() throws Exception {
- // Default for createEmptyCommit should match TestProjectConfig.
Project.NameKey someParentProject =
projectOperations.newProject().name("some-parent-project").create();
- // Default for createEmptyCommit should match TestProjectConfig.
Project.NameKey someChildProject =
projectOperations
.newProject()
@@ -199,8 +196,8 @@
@Test
public void listWithHiddenAndReadonlyProjects() throws Exception {
- Project.NameKey hidden = this.projectOperations.newProject().create();
- Project.NameKey readonly = this.projectOperations.newProject().create();
+ Project.NameKey hidden = projectOperations.newProject().create();
+ Project.NameKey readonly = projectOperations.newProject().create();
// Set project read-only
ConfigInput input = new ConfigInput();
diff --git a/javatests/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java b/javatests/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
index c78b47b..3e51260 100644
--- a/javatests/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
@@ -19,9 +19,11 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
import java.util.Arrays;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
@@ -29,6 +31,8 @@
import org.junit.Test;
public class ProjectLevelConfigIT extends AbstractDaemonTest {
+ @Inject private ProjectOperations projectOperations;
+
@Before
public void setUp() throws Exception {
fetch(testRepo, RefNames.REFS_CONFIG + ":refs/heads/config");
@@ -82,7 +86,7 @@
.to(RefNames.REFS_CONFIG)
.assertOkStatus();
- Project.NameKey childProject = createProject("child", project);
+ Project.NameKey childProject = projectOperations.newProject().parent(project).create();
TestRepository<?> childTestRepo = cloneProject(childProject);
fetch(childTestRepo, RefNames.REFS_CONFIG + ":refs/heads/config");
childTestRepo.reset("refs/heads/config");
@@ -137,7 +141,7 @@
.to(RefNames.REFS_CONFIG)
.assertOkStatus();
- Project.NameKey childProject = createProject("child", project);
+ Project.NameKey childProject = projectOperations.newProject().parent(project).create();
TestRepository<?> childTestRepo = cloneProject(childProject);
fetch(childTestRepo, RefNames.REFS_CONFIG + ":refs/heads/config");
childTestRepo.reset("refs/heads/config");
diff --git a/javatests/com/google/gerrit/acceptance/server/permissions/PermissionBackendConditionIT.java b/javatests/com/google/gerrit/acceptance/server/permissions/PermissionBackendConditionIT.java
index 2028a68..a72cd33 100644
--- a/javatests/com/google/gerrit/acceptance/server/permissions/PermissionBackendConditionIT.java
+++ b/javatests/com/google/gerrit/acceptance/server/permissions/PermissionBackendConditionIT.java
@@ -154,8 +154,7 @@
@Test
public void refPermissions_differentResourceAndSameUserDoesNotEqual2() throws Exception {
Branch.NameKey branch1 = new Branch.NameKey(project, "branch");
- Branch.NameKey branch2 =
- new Branch.NameKey(this.projectOperations.newProject().create(), "branch");
+ Branch.NameKey branch2 = new Branch.NameKey(projectOperations.newProject().create(), "branch");
BooleanCondition cond1 = pb.user(user()).ref(branch1).testCond(RefPermission.READ);
BooleanCondition cond2 = pb.user(user()).ref(branch2).testCond(RefPermission.READ);
diff --git a/javatests/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java b/javatests/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java
index 1e60071..4e88955 100644
--- a/javatests/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java
+++ b/javatests/com/google/gerrit/acceptance/ssh/ElasticIndexIT.java
@@ -25,11 +25,6 @@
public class ElasticIndexIT extends AbstractIndexTests {
@ConfigSuite.Default
- public static Config elasticsearchV2() {
- return getConfig(ElasticVersion.V2_4);
- }
-
- @ConfigSuite.Config
public static Config elasticsearchV5() {
return getConfig(ElasticVersion.V5_6);
}
@@ -39,6 +34,11 @@
return getConfig(ElasticVersion.V6_5);
}
+ @ConfigSuite.Config
+ public static Config elasticsearchV7() {
+ return getConfig(ElasticVersion.V7_0);
+ }
+
@Override
public void configureIndex(Injector injector) throws Exception {
createAllIndexes(injector);
diff --git a/javatests/com/google/gerrit/common/BUILD b/javatests/com/google/gerrit/common/BUILD
index 88ddcd5..29a23c3 100644
--- a/javatests/com/google/gerrit/common/BUILD
+++ b/javatests/com/google/gerrit/common/BUILD
@@ -2,10 +2,7 @@
junit_tests(
name = "server_tests",
- srcs = [
- "AutoValueTest.java",
- "VersionTest.java",
- ],
+ srcs = glob(["*.java"]),
tags = ["no_windows"],
deps = [
"//java/com/google/gerrit/common:server",
diff --git a/javatests/com/google/gerrit/common/data/AccessSectionTest.java b/javatests/com/google/gerrit/common/data/AccessSectionTest.java
index b12a9c2..faf9d6c 100644
--- a/javatests/com/google/gerrit/common/data/AccessSectionTest.java
+++ b/javatests/com/google/gerrit/common/data/AccessSectionTest.java
@@ -152,21 +152,6 @@
}
@Test
- public void cannotAddPermissionByModifyingListThatWasRetrievedFromAccessSection() {
- Permission submitPermission = new Permission(Permission.SUBMIT);
- accessSection.getPermissions().add(submitPermission);
- assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
-
- List<Permission> permissions = new ArrayList<>();
- permissions.add(new Permission(Permission.ABANDON));
- permissions.add(new Permission(Permission.REBASE));
- accessSection.setPermissions(permissions);
- assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
- accessSection.getPermissions().add(submitPermission);
- assertThat(accessSection.getPermission(Permission.SUBMIT)).isNull();
- }
-
- @Test
public void removePermission() {
Permission abandonPermission = new Permission(Permission.ABANDON);
Permission rebasePermission = new Permission(Permission.REBASE);
diff --git a/javatests/com/google/gerrit/common/data/BUILD b/javatests/com/google/gerrit/common/data/BUILD
new file mode 100644
index 0000000..776a5e0
--- /dev/null
+++ b/javatests/com/google/gerrit/common/data/BUILD
@@ -0,0 +1,13 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+
+junit_tests(
+ name = "data_tests",
+ srcs = glob(["*.java"]),
+ deps = [
+ "//java/com/google/gerrit/common:server",
+ "//java/com/google/gerrit/reviewdb:server",
+ "//java/com/google/gerrit/testing:gerrit-test-util",
+ "//lib:guava",
+ "//lib/truth",
+ ],
+)
diff --git a/javatests/com/google/gerrit/common/data/PermissionTest.java b/javatests/com/google/gerrit/common/data/PermissionTest.java
index 84fb2f0..23380e7 100644
--- a/javatests/com/google/gerrit/common/data/PermissionTest.java
+++ b/javatests/com/google/gerrit/common/data/PermissionTest.java
@@ -187,22 +187,6 @@
}
@Test
- public void cannotAddPermissionByModifyingListThatWasRetrievedFromAccessSection() {
- GroupReference groupReference1 = new GroupReference(new AccountGroup.UUID("uuid-1"), "group1");
- PermissionRule permissionRule1 = new PermissionRule(groupReference1);
- permission.getRules().add(permissionRule1);
- assertThat(permission.getRule(groupReference1)).isNull();
-
- List<PermissionRule> rules = new ArrayList<>();
- rules.add(new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-2"), "group2")));
- rules.add(new PermissionRule(new GroupReference(new AccountGroup.UUID("uuid-3"), "group3")));
- permission.setRules(rules);
- assertThat(permission.getRule(groupReference1)).isNull();
- permission.getRules().add(permissionRule1);
- assertThat(permission.getRule(groupReference1)).isNull();
- }
-
- @Test
public void getNonExistingRule() {
GroupReference groupReference = new GroupReference(new AccountGroup.UUID("uuid-1"), "group1");
assertThat(permission.getRule(groupReference)).isNull();
diff --git a/javatests/com/google/gerrit/elasticsearch/BUILD b/javatests/com/google/gerrit/elasticsearch/BUILD
index 51d45f2..20ef2fa 100644
--- a/javatests/com/google/gerrit/elasticsearch/BUILD
+++ b/javatests/com/google/gerrit/elasticsearch/BUILD
@@ -40,12 +40,12 @@
SUFFIX = "sTest.java"
-ELASTICSEARCH_TESTS = {i: "ElasticQuery" + i.capitalize() + SUFFIX for i in TYPES}
-
ELASTICSEARCH_TESTS_V5 = {i: "ElasticV5Query" + i.capitalize() + SUFFIX for i in TYPES}
ELASTICSEARCH_TESTS_V6 = {i: "ElasticV6Query" + i.capitalize() + SUFFIX for i in TYPES}
+ELASTICSEARCH_TESTS_V7 = {i: "ElasticV7Query" + i.capitalize() + SUFFIX for i in TYPES}
+
ELASTICSEARCH_TAGS = [
"docker",
"elastic",
@@ -53,14 +53,6 @@
]
[junit_tests(
- name = "elasticsearch_query_%ss_test" % name,
- size = "large",
- srcs = [src],
- tags = ELASTICSEARCH_TAGS,
- deps = ELASTICSEARCH_DEPS + [QUERY_TESTS_DEP % name],
-) for name, src in ELASTICSEARCH_TESTS.items()]
-
-[junit_tests(
name = "elasticsearch_query_%ss_test_V5" % name,
size = "large",
srcs = [src],
@@ -76,6 +68,14 @@
deps = ELASTICSEARCH_DEPS + [QUERY_TESTS_DEP % name],
) for name, src in ELASTICSEARCH_TESTS_V6.items()]
+[junit_tests(
+ name = "elasticsearch_query_%ss_test_V7" % name,
+ size = "large",
+ srcs = [src],
+ tags = ELASTICSEARCH_TAGS + ["flaky"],
+ deps = ELASTICSEARCH_DEPS + [QUERY_TESTS_DEP % name],
+) for name, src in ELASTICSEARCH_TESTS_V7.items()]
+
junit_tests(
name = "elasticsearch_tests",
size = "small",
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
index c3150f1..79e2853 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.java
@@ -36,14 +36,8 @@
}
}
- public static ElasticContainer<?> createAndStart() {
- return createAndStart(ElasticVersion.V2_4);
- }
-
private static String getImageName(ElasticVersion version) {
switch (version) {
- case V2_4:
- return "elasticsearch:2.4.6-alpine";
case V5_6:
return "docker.elastic.co/elasticsearch/elasticsearch:5.6.13";
case V6_2:
@@ -53,7 +47,9 @@
case V6_4:
return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.3";
case V6_5:
- return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.0";
+ return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.1";
+ case V7_0:
+ return "docker.elastic.co/elasticsearch/elasticsearch-oss:7.0.0-alpha1";
}
throw new IllegalStateException("No tests for version: " + version.name());
}
@@ -65,9 +61,6 @@
@Override
protected void configure() {
addExposedPort(ELASTICSEARCH_DEFAULT_PORT);
-
- // https://github.com/docker-library/elasticsearch/issues/58
- addEnv("-Ees.network.host", "0.0.0.0");
}
@Override
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java
index 5d2f944..074debc 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryAccountsTest.java
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(
elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java
index 5d76162..89d0168 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryChangesTest.java
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(
elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java
index 9ce2e93..79d3ca5 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryGroupsTest.java
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(
elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryProjectsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryProjectsTest.java
index 4184935..247cb29 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryProjectsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV5QueryProjectsTest.java
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(
elasticsearchConfig, nodeInfo.port, indicesPrefix, ElasticVersion.V5_6);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java
index eeb4c09..519a9c3 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryAccountsTest.java
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java
index 7525b65..690734c 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryChangesTest.java
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java
index e8d5683..bf0095a 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryGroupsTest.java
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryProjectsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryProjectsTest.java
index eaaf0c8..f2227a9 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryProjectsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV6QueryProjectsTest.java
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticQueryAccountsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
similarity index 87%
rename from javatests/com/google/gerrit/elasticsearch/ElasticQueryAccountsTest.java
rename to javatests/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
index 4f0f8b0..7ac9f21 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticQueryAccountsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2016 The Android Open Source Project
+// Copyright (C) 2018 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.
@@ -25,7 +25,7 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
-public class ElasticQueryAccountsTest extends AbstractQueryAccountsTest {
+public class ElasticV7QueryAccountsTest extends AbstractQueryAccountsTest {
@ConfigSuite.Default
public static Config defaultConfig() {
return IndexConfig.createForElasticsearch();
@@ -41,7 +41,7 @@
return;
}
- container = ElasticContainer.createAndStart();
+ container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
}
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
similarity index 87%
rename from javatests/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java
rename to javatests/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
index a02d691..ed6f95b 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticQueryChangesTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2014 The Android Open Source Project
+// Copyright (C) 2018 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.
@@ -25,7 +25,7 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
-public class ElasticQueryChangesTest extends AbstractQueryChangesTest {
+public class ElasticV7QueryChangesTest extends AbstractQueryChangesTest {
@ConfigSuite.Default
public static Config defaultConfig() {
return IndexConfig.createForElasticsearch();
@@ -41,7 +41,7 @@
return;
}
- container = ElasticContainer.createAndStart();
+ container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
}
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticQueryGroupsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
similarity index 87%
rename from javatests/com/google/gerrit/elasticsearch/ElasticQueryGroupsTest.java
rename to javatests/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
index f13c491..5efaa4a 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticQueryGroupsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2017 The Android Open Source Project
+// Copyright (C) 2018 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.
@@ -25,7 +25,7 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
-public class ElasticQueryGroupsTest extends AbstractQueryGroupsTest {
+public class ElasticV7QueryGroupsTest extends AbstractQueryGroupsTest {
@ConfigSuite.Default
public static Config defaultConfig() {
return IndexConfig.createForElasticsearch();
@@ -41,7 +41,7 @@
return;
}
- container = ElasticContainer.createAndStart();
+ container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
}
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticQueryProjectsTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java
similarity index 87%
rename from javatests/com/google/gerrit/elasticsearch/ElasticQueryProjectsTest.java
rename to javatests/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java
index dd04010..02b3641 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticQueryProjectsTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2017 The Android Open Source Project
+// Copyright (C) 2018 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.
@@ -25,7 +25,7 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
-public class ElasticQueryProjectsTest extends AbstractQueryProjectsTest {
+public class ElasticV7QueryProjectsTest extends AbstractQueryProjectsTest {
@ConfigSuite.Default
public static Config defaultConfig() {
return IndexConfig.createForElasticsearch();
@@ -41,7 +41,7 @@
return;
}
- container = ElasticContainer.createAndStart();
+ container = ElasticContainer.createAndStart(ElasticVersion.V7_0);
nodeInfo = new ElasticNodeInfo(container.getHttpHost().getPort());
}
@@ -52,10 +52,6 @@
}
}
- private String testName() {
- return testName.getMethodName().toLowerCase() + "_";
- }
-
@Override
protected void initAfterLifecycleStart() throws Exception {
super.initAfterLifecycleStart();
@@ -66,7 +62,7 @@
protected Injector createInjector() {
Config elasticsearchConfig = new Config(config);
InMemoryModule.setDefaults(elasticsearchConfig);
- String indicesPrefix = testName();
+ String indicesPrefix = getSanitizedMethodName();
ElasticTestUtils.configure(elasticsearchConfig, nodeInfo.port, indicesPrefix);
return Guice.createInjector(new InMemoryModule(elasticsearchConfig, notesMigration));
}
diff --git a/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java b/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java
index 3ab9d5a..baf6c2b 100644
--- a/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticVersionTest.java
@@ -22,9 +22,6 @@
public class ElasticVersionTest extends GerritBaseTests {
@Test
public void supportedVersion() throws Exception {
- assertThat(ElasticVersion.forVersion("2.4.0")).isEqualTo(ElasticVersion.V2_4);
- assertThat(ElasticVersion.forVersion("2.4.6")).isEqualTo(ElasticVersion.V2_4);
-
assertThat(ElasticVersion.forVersion("5.6.0")).isEqualTo(ElasticVersion.V5_6);
assertThat(ElasticVersion.forVersion("5.6.11")).isEqualTo(ElasticVersion.V5_6);
@@ -36,6 +33,12 @@
assertThat(ElasticVersion.forVersion("6.4.0")).isEqualTo(ElasticVersion.V6_4);
assertThat(ElasticVersion.forVersion("6.4.1")).isEqualTo(ElasticVersion.V6_4);
+
+ assertThat(ElasticVersion.forVersion("6.5.0")).isEqualTo(ElasticVersion.V6_5);
+ assertThat(ElasticVersion.forVersion("6.5.1")).isEqualTo(ElasticVersion.V6_5);
+
+ assertThat(ElasticVersion.forVersion("7.0.0")).isEqualTo(ElasticVersion.V7_0);
+ assertThat(ElasticVersion.forVersion("7.0.1")).isEqualTo(ElasticVersion.V7_0);
}
@Test
@@ -48,9 +51,19 @@
@Test
public void version6() throws Exception {
- assertThat(ElasticVersion.V6_2.isV6()).isTrue();
- assertThat(ElasticVersion.V6_3.isV6()).isTrue();
- assertThat(ElasticVersion.V6_4.isV6()).isTrue();
- assertThat(ElasticVersion.V5_6.isV6()).isFalse();
+ assertThat(ElasticVersion.V5_6.isV6OrLater()).isFalse();
+ assertThat(ElasticVersion.V6_2.isV6OrLater()).isTrue();
+ assertThat(ElasticVersion.V6_3.isV6OrLater()).isTrue();
+ assertThat(ElasticVersion.V6_4.isV6OrLater()).isTrue();
+ assertThat(ElasticVersion.V7_0.isV6OrLater()).isTrue();
+ }
+
+ @Test
+ public void version7() throws Exception {
+ assertThat(ElasticVersion.V5_6.isV7OrLater()).isFalse();
+ assertThat(ElasticVersion.V6_2.isV7OrLater()).isFalse();
+ assertThat(ElasticVersion.V6_3.isV7OrLater()).isFalse();
+ assertThat(ElasticVersion.V6_4.isV7OrLater()).isFalse();
+ assertThat(ElasticVersion.V7_0.isV7OrLater()).isTrue();
}
}
diff --git a/lib/BUILD b/lib/BUILD
index 95ca4db..80da4c0 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -80,6 +80,13 @@
)
java_library(
+ name = "guava-failureaccess",
+ data = ["//lib:LICENSE-Apache2.0"],
+ visibility = ["//visibility:public"],
+ exports = ["@guava-failureaccess//jar"],
+)
+
+java_library(
name = "j2objc",
data = ["//lib:LICENSE-Apache2.0"],
visibility = ["//visibility:public"],
@@ -91,6 +98,7 @@
data = ["//lib:LICENSE-Apache2.0"],
visibility = ["//visibility:public"],
exports = [
+ ":guava-failureaccess",
":j2objc",
"@guava//jar",
],
diff --git a/lib/guava.bzl b/lib/guava.bzl
index 1add718..e4c9083 100644
--- a/lib/guava.bzl
+++ b/lib/guava.bzl
@@ -1,5 +1,5 @@
-GUAVA_VERSION = "26.0-jre"
+GUAVA_VERSION = "27.0.1-jre"
-GUAVA_BIN_SHA1 = "6a806eff209f36f635f943e16d97491f00f6bfab"
+GUAVA_BIN_SHA1 = "bd41a290787b5301e63929676d792c507bbc00ae"
GUAVA_DOC_URL = "https://google.github.io/guava/releases/" + GUAVA_VERSION + "/api/docs/"
diff --git a/plugins/hooks b/plugins/hooks
index de469e8..25ac76f 160000
--- a/plugins/hooks
+++ b/plugins/hooks
@@ -1 +1 @@
-Subproject commit de469e8e2598779773652abb43a0356650e257b3
+Subproject commit 25ac76fe18537c33f9f27c5463a081449c13ba67
diff --git a/plugins/replication b/plugins/replication
index bc5efb5..3ce09db 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit bc5efb5b60a5a93c25c075f3667841e02532a99c
+Subproject commit 3ce09db0cae09038f2924f1ff8f097e6c91c7a1e
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
index 9a3fc03..8c152b6 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
@@ -165,8 +165,9 @@
hidden$="[[isColumnHidden('Assignee', visibleChangeTableColumns)]]">
<template is="dom-if" if="[[change.assignee]]">
<gr-account-link
+ id="assigneeAccountLink"
account="[[change.assignee]]"
- additional-text="[[_computeAccountStatusString(change.owner)]]"></gr-account-link>
+ additional-text="[[_computeAccountStatusString(change.assignee)]]"></gr-account-link>
</template>
<template is="dom-if" if="[[!change.assignee]]">
<span class="placeholder">--</span>
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.html b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.html
index aaad362..3637653 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item_test.html
@@ -182,10 +182,13 @@
element.change = {
assignee: {
name: 'test',
+ status: 'test',
},
};
flushAsynchronousOperations();
assert.isOk(element.$$('.assignee gr-account-link'));
+ assert.equal(Polymer.dom(element.root)
+ .querySelector('#assigneeAccountLink').additionalText, '(test)');
});
test('_computeAccountStatusString', () => {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
index 098a4af..42a262a 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
@@ -124,26 +124,13 @@
'_groupsChanged(_groups.splices)',
],
- attached() {
- // Setup annotation layers.
- const layers = [
- this._createTrailingWhitespaceLayer(),
- this.$.syntaxLayer,
- this._createIntralineLayer(),
- this._createTabIndicatorLayer(),
- this.$.rangeLayer,
- ];
-
- // Get layers from plugins (if any).
- for (const pluginLayer of this.$.jsAPI.getDiffLayers(
- this.diffPath, this.changeNum, this.patchNum)) {
- layers.push(pluginLayer);
- }
-
- this._layers = layers;
- },
-
render(keyLocations, prefs) {
+ // Setting up annotation layers must happen after plugins are
+ // installed, and |render| satisfies the requirement, however,
+ // |attached| doesn't because in the diff view page, the element is
+ // attached before plugins are installed.
+ this._setupAnnotationLayers();
+
this.$.syntaxLayer.enabled = prefs.syntax_highlighting;
this._showTabs = !!prefs.show_tabs;
this._showTrailingWhitespace = !!prefs.show_whitespace_errors;
@@ -188,6 +175,24 @@
});
},
+ _setupAnnotationLayers() {
+ const layers = [
+ this._createTrailingWhitespaceLayer(),
+ this.$.syntaxLayer,
+ this._createIntralineLayer(),
+ this._createTabIndicatorLayer(),
+ this.$.rangeLayer,
+ ];
+
+ // Get layers from plugins (if any).
+ for (const pluginLayer of this.$.jsAPI.getDiffLayers(
+ this.diffPath, this.changeNum, this.patchNum)) {
+ layers.push(pluginLayer);
+ }
+
+ this._layers = layers;
+ },
+
getLineElByChild(node) {
while (node) {
if (node instanceof Element) {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
index 1b0ba04..294d085 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
@@ -582,13 +582,14 @@
setup(() => {
element = fixture('basic');
element._showTrailingWhitespace = true;
+ element._setupAnnotationLayers();
initialLayersCount = element._layers.length;
});
test('no plugin layers', () => {
const getDiffLayersStub = sinon.stub(element.$.jsAPI, 'getDiffLayers')
.returns([]);
- element.attached();
+ element._setupAnnotationLayers();
assert.isTrue(getDiffLayersStub.called);
assert.equal(element._layers.length, initialLayersCount);
});
@@ -596,9 +597,9 @@
test('with plugin layers', () => {
const getDiffLayersStub = sinon.stub(element.$.jsAPI, 'getDiffLayers')
.returns([{}, {}]);
- element.attached();
+ element._setupAnnotationLayers();
assert.isTrue(getDiffLayersStub.called);
- assert.equal(element._layers.length, initialLayersCount+2);
+ assert.equal(element._layers.length, initialLayersCount + 2);
});
});
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js
index 8b9d8066..fd460cc 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.js
@@ -45,24 +45,6 @@
return !!(diff.binary && (isA || isB));
}
- /**
- * Compare two ranges. Either argument may be falsy, but will only return
- * true if both are falsy or if neither are falsy and have the same position
- * values.
- *
- * @param {Gerrit.Range=} a range 1
- * @param {Gerrit.Range=} b range 2
- * @return {boolean}
- */
- function rangesEqual(a, b) {
- if (!a && !b) { return true; }
- if (!a || !b) { return false; }
- return a.start_line === b.start_line &&
- a.start_character === b.start_character &&
- a.end_line === b.end_line &&
- a.end_character === b.end_character;
- }
-
/** @enum {string} */
Gerrit.DiffSide = {
LEFT: 'left',
@@ -652,7 +634,7 @@
function matchesRange(threadEl) {
const threadRange = /** @type {!Gerrit.Range} */(
JSON.parse(threadEl.getAttribute('range')));
- return rangesEqual(threadRange, range);
+ return Gerrit.rangesEqual(threadRange, range);
}
const filteredThreadEls = this._filterThreadElsForLocation(
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 996d484..b134d4e 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
@@ -55,6 +55,24 @@
* end_line: number, end_character: number}} */
Gerrit.Range;
+ /**
+ * Compare two ranges. Either argument may be falsy, but will only return
+ * true if both are falsy or if neither are falsy and have the same position
+ * values.
+ *
+ * @param {Gerrit.Range=} a range 1
+ * @param {Gerrit.Range=} b range 2
+ * @return {boolean}
+ */
+ Gerrit.rangesEqual = function(a, b) {
+ if (!a && !b) { return true; }
+ if (!a || !b) { return false; }
+ return a.start_line === b.start_line &&
+ a.start_character === b.start_character &&
+ a.end_line === b.end_line &&
+ a.end_character === b.end_character;
+ };
+
function isThreadEl(node) {
return node.nodeType === Node.ELEMENT_NODE &&
node.classList.contains('comment-thread');
@@ -257,18 +275,14 @@
_observeNodes() {
this._nodeObserver = Polymer.dom(this).observeNodes(info => {
const addedThreadEls = info.addedNodes.filter(isThreadEl);
- // In principle we should also handle removed nodes, but I have not
- // figured out how to do that yet without also catching all the removals
- // caused by further redistribution. Right now, comments are never
- // removed by no longer slotting them in, so I decided to not handle
- // this situation until it occurs.
- this._updateRanges(addedThreadEls);
- this._updateKeyLocations(addedThreadEls);
+ const removedThreadEls = info.removedNodes.filter(isThreadEl);
+ this._updateRanges(addedThreadEls, removedThreadEls);
+ this._updateKeyLocations(addedThreadEls, removedThreadEls);
this._redispatchHoverEvents(addedThreadEls);
});
},
- _updateRanges(addedThreadEls) {
+ _updateRanges(addedThreadEls, removedThreadEls) {
function commentRangeFromThreadEl(threadEl) {
const side = threadEl.getAttribute('comment-side');
const range = JSON.parse(threadEl.getAttribute('range'));
@@ -278,15 +292,30 @@
const addedCommentRanges = addedThreadEls
.map(commentRangeFromThreadEl)
.filter(({range}) => range);
+ const removedCommentRanges = removedThreadEls
+ .map(commentRangeFromThreadEl)
+ .filter(({range}) => range);
+ for (const removedCommentRange of removedCommentRanges) {
+ const i = this._commentRanges.findIndex(commentRange => {
+ return commentRange.side === removedCommentRange.side &&
+ Gerrit.rangesEqual(commentRange.range, removedCommentRange.range);
+ });
+ this.splice('_commentRanges', i, 1);
+ }
this.push('_commentRanges', ...addedCommentRanges);
},
- _updateKeyLocations(addedThreadEls) {
+ _updateKeyLocations(addedThreadEls, removedThreadEls) {
for (const threadEl of addedThreadEls) {
const commentSide = threadEl.getAttribute('comment-side');
const lineNum = threadEl.getAttribute('line-num') || GrDiffLine.FILE;
this._keyLocations[commentSide][lineNum] = true;
}
+ for (const threadEl of removedThreadEls) {
+ const commentSide = threadEl.getAttribute('comment-side');
+ const lineNum = threadEl.getAttribute('line-num') || GrDiffLine.FILE;
+ this._keyLocations[commentSide][lineNum] = false;
+ }
},
// Dispatch events that are handled by the gr-diff-highlight.
@@ -628,11 +657,11 @@
_handleRenderContent() {
this._incrementalNodeObserver = Polymer.dom(this).observeNodes(info => {
const addedThreadEls = info.addedNodes.filter(isThreadEl);
- // In principle we should also handle removed nodes, but I have not
- // figured out how to do that yet without also catching all the removals
- // caused by further redistribution. Right now, comments are never
- // removed by no longer slotting them in, so I decided to not handle
- // this situation until it occurs.
+ // Removed nodes do not need to be handled because all this code does is
+ // adding a slot for the added thread elements, and the extra slots do
+ // not hurt. It's probably a bigger performance cost to remove them than
+ // to keep them around. Medium term we can even consider to add one slot
+ // for each line from the start.
for (const threadEl of addedThreadEls) {
const lineNumString = threadEl.getAttribute('line-num') || 'FILE';
const commentSide = threadEl.getAttribute('comment-side');
diff --git a/resources/com/google/gerrit/reviewdb/server/index_postgres.sql b/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
index f2f24e1..439fed7 100644
--- a/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
+++ b/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
@@ -8,7 +8,6 @@
ALTER TABLE patch_comments CLUSTER ON patch_comments_pkey;
ALTER TABLE patch_set_approvals CLUSTER ON patch_set_approvals_pkey;
-ALTER TABLE account_group_members CLUSTER ON account_group_members_pkey;
CLUSTER;