Merge "Count unresolved threads within thread groups rather than by leaves" into stable-2.15
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index fe10b64..54d356e 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -3054,7 +3054,7 @@
|===============================
|Field Name ||Description
|`value` |optional|
-The effective value of the max object size limit as a formatted string. +
+The effective value in bytes of the max object size limit. +
Not set if there is no limit for the object size.
|`configured_value`|optional|
The max object size limit that is configured on the project as a
diff --git a/WORKSPACE b/WORKSPACE
index a667de6..924a930 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -16,7 +16,7 @@
name = "io_bazel_rules_closure",
sha256 = "4dd84dd2bdd6c9f56cb5a475d504ea31d199c34309e202e9379501d01c3067e5",
strip_prefix = "rules_closure-3103a773820b59b76345f94c231cb213e0d404e2",
- url = "https://github.com/bazelbuild/rules_closure/archive/3103a773820b59b76345f94c231cb213e0d404e2.tar.gz",
+ urls = ["https://github.com/bazelbuild/rules_closure/archive/3103a773820b59b76345f94c231cb213e0d404e2.tar.gz"],
)
# File is specific to Polymer and copied from the Closure Github -- should be
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
index d3104b2..206adfd 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
@@ -222,7 +222,7 @@
public void maxObjectSizeCanBeSetAndCleared() throws Exception {
// Set a value
ConfigInfo info = setMaxObjectSize("100k");
- assertThat(info.maxObjectSizeLimit.value).isEqualTo("100k");
+ assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
assertThat(info.maxObjectSizeLimit.inheritedValue).isNull();
@@ -238,6 +238,7 @@
Project.NameKey child = createProject(name("child"), project);
ConfigInfo info = setMaxObjectSize("100k");
+ assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
assertThat(info.maxObjectSizeLimit.inheritedValue).isNull();
@@ -251,7 +252,7 @@
@GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
public void maxObjectSizeIsInheritedFromGlobalConfig() throws Exception {
ConfigInfo info = getConfig();
- assertThat(info.maxObjectSizeLimit.value).isEqualTo("200k");
+ assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
assertThat(info.maxObjectSizeLimit.configuredValue).isNull();
assertThat(info.maxObjectSizeLimit.inheritedValue).isEqualTo("200k");
}
@@ -260,7 +261,7 @@
@GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
public void maxObjectSizeOverridesGlobalConfigWhenLower() throws Exception {
ConfigInfo info = setMaxObjectSize("100k");
- assertThat(info.maxObjectSizeLimit.value).isEqualTo("100k");
+ assertThat(info.maxObjectSizeLimit.value).isEqualTo("102400");
assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("100k");
assertThat(info.maxObjectSizeLimit.inheritedValue).isEqualTo("200k");
}
@@ -269,7 +270,7 @@
@GerritConfig(name = "receive.maxObjectSizeLimit", value = "200k")
public void maxObjectSizeDoesNotOverrideGlobalConfigWhenHigher() throws Exception {
ConfigInfo info = setMaxObjectSize("300k");
- assertThat(info.maxObjectSizeLimit.value).isEqualTo("200k");
+ assertThat(info.maxObjectSizeLimit.value).isEqualTo("204800");
assertThat(info.maxObjectSizeLimit.configuredValue).isEqualTo("300k");
assertThat(info.maxObjectSizeLimit.inheritedValue).isEqualTo("200k");
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ReflogIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ReflogIT.java
index 28a66f1..7b4e2d6 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ReflogIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ReflogIT.java
@@ -21,19 +21,25 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.UseLocalDisk;
+import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.groups.GroupApi;
import com.google.gerrit.extensions.api.projects.BranchApi;
import com.google.gerrit.extensions.api.projects.ReflogEntryInfo;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.project.Util;
import java.io.File;
import java.util.List;
import org.eclipse.jgit.lib.ReflogEntry;
import org.eclipse.jgit.lib.Repository;
import org.junit.Test;
-@UseLocalDisk
public class ReflogIT extends AbstractDaemonTest {
@Test
+ @UseLocalDisk
public void guessRestApiInReflog() throws Exception {
assume().that(notesMigration.disableChangeReviewDb()).isTrue();
PushOneCommit.Result r = createChange();
@@ -54,6 +60,7 @@
}
@Test
+ @UseLocalDisk
public void reflogUpdatedBySubmittingChange() throws Exception {
BranchApi branchApi = gApi.projects().name(project.get()).branch("master");
List<ReflogEntryInfo> reflog = branchApi.reflog();
@@ -74,4 +81,33 @@
reflog = branchApi.reflog();
assertThat(reflog).hasSize(refLogLen + 1);
}
+
+ @Test
+ @UseLocalDisk
+ public void regularUserIsNotAllowedToGetReflog() throws Exception {
+ setApiUser(user);
+ exception.expect(AuthException.class);
+ gApi.projects().name(project.get()).branch("master").reflog();
+ }
+
+ @Test
+ @UseLocalDisk
+ public void ownerUserIsAllowedToGetReflog() throws Exception {
+ GroupApi groupApi = gApi.groups().create(name("get-reflog"));
+ groupApi.addMembers("user");
+
+ ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
+ Util.allow(cfg, Permission.OWNER, new AccountGroup.UUID(groupApi.get().id), "refs/*");
+ saveProjectConfig(project, cfg);
+
+ setApiUser(user);
+ gApi.projects().name(project.get()).branch("master").reflog();
+ }
+
+ @Test
+ @UseLocalDisk
+ public void adminUserIsAllowedToGetReflog() throws Exception {
+ setApiUser(admin);
+ gApi.projects().name(project.get()).branch("master").reflog();
+ }
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
index 7307264..878abd25 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
@@ -137,7 +137,25 @@
if (size == 0) {
return Resources.C.notAvailable();
}
- int p = Math.abs(Math.round(delta * 100 / size));
+ int p = Math.abs(saturatedCast(delta * 100 / size));
return p + "%";
}
+
+ /**
+ * Returns the {@code int} nearest in value to {@code value}.
+ *
+ * @param value any {@code long} value
+ * @return the same value cast to {@code int} if it is in the range of the {@code int} type,
+ * {@link Integer#MAX_VALUE} if it is too large, or {@link Integer#MIN_VALUE} if it is too
+ * small
+ */
+ private static int saturatedCast(long value) {
+ if (value > Integer.MAX_VALUE) {
+ return Integer.MAX_VALUE;
+ }
+ if (value < Integer.MIN_VALUE) {
+ return Integer.MIN_VALUE;
+ }
+ return (int) value;
+ }
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.java
index 0c2f6fa..fe27e9c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.java
@@ -38,6 +38,8 @@
String globalMaxObjectSizeLimit(String globalMaxObjectSizeLimit);
+ String noMaxObjectSizeLimit();
+
String pluginProjectOptionsTitle(String pluginName);
String pluginProjectInheritedValue(String value);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.properties
index 6338920..f746365 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminMessages.properties
@@ -5,8 +5,9 @@
deletedGroup = Deleted Group {0}
deletedReference = Reference {0} was deleted
deletedSection = Section {0} was deleted
-effectiveMaxObjectSizeLimit = effective: {0}
+effectiveMaxObjectSizeLimit = effective: {0} bytes
globalMaxObjectSizeLimit = The global max object size limit is set to {0}. The limit cannot be increased on project level.
+noMaxObjectSizeLimit = No max object size limit is set.
pluginProjectOptionsTitle = {0} Plugin Options
pluginProjectOptionsTitle = {0} Plugin
pluginProjectInheritedValue = inherited: {0}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
index 880dbb7..568be85 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
@@ -429,14 +429,15 @@
setSubmitType(result.submitType());
setState(result.state());
maxObjectSizeLimit.setText(result.maxObjectSizeLimit().configuredValue());
- if (result.maxObjectSizeLimit().inheritedValue() != null) {
- effectiveMaxObjectSizeLimit.setVisible(true);
+ if (result.maxObjectSizeLimit().value() != null) {
effectiveMaxObjectSizeLimit.setText(
AdminMessages.I.effectiveMaxObjectSizeLimit(result.maxObjectSizeLimit().value()));
- effectiveMaxObjectSizeLimit.setTitle(
- AdminMessages.I.globalMaxObjectSizeLimit(result.maxObjectSizeLimit().inheritedValue()));
+ if (result.maxObjectSizeLimit().inheritedValue() != null) {
+ effectiveMaxObjectSizeLimit.setTitle(
+ AdminMessages.I.globalMaxObjectSizeLimit(result.maxObjectSizeLimit().inheritedValue()));
+ }
} else {
- effectiveMaxObjectSizeLimit.setVisible(false);
+ effectiveMaxObjectSizeLimit.setText(AdminMessages.I.noMaxObjectSizeLimit());
}
saveProject.setEnabled(false);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
index 40b3a1f..218bd82 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
@@ -451,10 +451,7 @@
return rulesId;
}
- /**
- * @return the maxObjectSizeLimit for this project, if set. Zero if this project doesn't define
- * own maxObjectSizeLimit.
- */
+ /** @return the maxObjectSizeLimit configured on this project, or zero if not configured. */
public long getMaxObjectSizeLimit() {
return maxObjectSizeLimit;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java
index 204a0d5..f85f24b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TransferConfig.java
@@ -16,7 +16,6 @@
import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.project.ProjectState;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.concurrent.TimeUnit;
@@ -66,14 +65,4 @@
public String getFormattedMaxObjectSizeLimit() {
return maxObjectSizeLimitFormatted;
}
-
- public long getEffectiveMaxObjectSizeLimit(ProjectState p) {
- long global = getMaxObjectSizeLimit();
- long local = p.getMaxObjectSizeLimit();
- if (global > 0 && local > 0) {
- return Math.min(global, local);
- }
- // zero means "no limit", in this case the max is more limiting
- return Math.max(global, local);
- }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
index 030f9b7..d6fb161 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java
@@ -215,7 +215,7 @@
rp.setAllowNonFastForwards(true);
rp.setRefLogIdent(user.newRefLogIdent());
rp.setTimeout(transferConfig.getTimeout());
- rp.setMaxObjectSizeLimit(transferConfig.getEffectiveMaxObjectSizeLimit(state));
+ rp.setMaxObjectSizeLimit(state.getEffectiveMaxObjectSizeLimit());
rp.setCheckReceivedObjects(state.getConfig().getCheckReceivedObjects());
rp.setRefFilter(new ReceiveRefFilter());
rp.setAllowPushOptions(true);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java
index 5265516..158d410 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfoImpl.java
@@ -142,11 +142,8 @@
private MaxObjectSizeLimitInfo getMaxObjectSizeLimit(
ProjectState projectState, TransferConfig transferConfig, Project p) {
MaxObjectSizeLimitInfo info = new MaxObjectSizeLimitInfo();
- info.value =
- transferConfig.getEffectiveMaxObjectSizeLimit(projectState)
- == transferConfig.getMaxObjectSizeLimit()
- ? transferConfig.getFormattedMaxObjectSizeLimit()
- : p.getMaxObjectSizeLimit();
+ long value = projectState.getEffectiveMaxObjectSizeLimit();
+ info.value = value == 0 ? null : String.valueOf(value);
info.configuredValue = p.getMaxObjectSizeLimit();
info.inheritedValue = transferConfig.getFormattedMaxObjectSizeLimit();
return info;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
index adacdb5..86d84a3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
@@ -47,6 +47,7 @@
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.git.ProjectLevelConfig;
+import com.google.gerrit.server.git.TransferConfig;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
@@ -95,6 +96,7 @@
private final ProjectConfig config;
private final Map<String, ProjectLevelConfig> configs;
private final Set<AccountGroup.UUID> localOwners;
+ private final long globalMaxObjectSizeLimit;
/** Prolog rule state. */
private volatile PrologMachineCopy rulesMachine;
@@ -126,6 +128,7 @@
RulesCache rulesCache,
List<CommentLinkInfo> commentLinks,
CapabilityCollection.Factory limitsFactory,
+ TransferConfig transferConfig,
@Assisted ProjectConfig config) {
this.sitePaths = sitePaths;
this.projectCache = projectCache;
@@ -143,6 +146,7 @@
isAllProjects
? limitsFactory.create(config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES))
: null;
+ this.globalMaxObjectSizeLimit = transferConfig.getMaxObjectSizeLimit();
if (isAllProjects && !Permission.canBeOnAllProjects(AccessSection.ALL, Permission.OWNER)) {
localOwners = Collections.emptySet();
@@ -254,8 +258,13 @@
return cfg;
}
- public long getMaxObjectSizeLimit() {
- return config.getMaxObjectSizeLimit();
+ public long getEffectiveMaxObjectSizeLimit() {
+ long local = config.getMaxObjectSizeLimit();
+ if (globalMaxObjectSizeLimit > 0 && local > 0) {
+ return Math.min(globalMaxObjectSizeLimit, local);
+ }
+ // zero means "no limit", in this case the max is more limiting
+ return Math.max(globalMaxObjectSizeLimit, local);
}
/** Get the sections that pertain only to this project. */
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
index fe849a8..df4cb95 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
@@ -56,6 +56,7 @@
import com.google.gerrit.server.config.AllUsersNameProvider;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.git.ProjectConfig;
+import com.google.gerrit.server.git.TransferConfig;
import com.google.gerrit.server.index.SingleVersionModule.SingleVersionListener;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.ProjectPermission;
@@ -207,6 +208,7 @@
@Inject private SingleVersionListener singleVersionListener;
@Inject private InMemoryDatabase schemaFactory;
@Inject private ThreadLocalRequestContext requestContext;
+ @Inject private TransferConfig transferConfig;
@Before
public void setUp() throws Exception {
@@ -867,6 +869,7 @@
rulesCache,
commentLinks,
capabilityCollectionFactory,
+ transferConfig,
pc));
return repo;
}
diff --git a/tools/bzl/javadoc.bzl b/tools/bzl/javadoc.bzl
index 34ae9d2..8f2316c 100644
--- a/tools/bzl/javadoc.bzl
+++ b/tools/bzl/javadoc.bzl
@@ -36,7 +36,7 @@
"rm -rf %s" % dir,
"mkdir %s" % dir,
" ".join([
- ctx.file._javadoc.path,
+ "%s/bin/javadoc" % ctx.attr._jdk[java_common.JavaRuntimeInfo].java_home,
"-Xdoclint:-missing",
"-protected",
"-encoding UTF-8",
@@ -67,14 +67,10 @@
"pkgs": attr.string_list(),
"title": attr.string(),
"external_docs": attr.string_list(),
- "_javadoc": attr.label(
- default = Label("@local_jdk//:bin/javadoc"),
- single_file = True,
- allow_files = True,
- ),
"_jdk": attr.label(
- default = Label("@local_jdk//:jdk-default"),
+ default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
allow_files = True,
+ providers = [java_common.JavaRuntimeInfo],
),
},
outputs = {"zip": "%{name}.zip"},