diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt index 412b60f0bd..57d62904e7 100644 --- a/Documentation/rest-api-projects.txt +++ b/Documentation/rest-api-projects.txt @@ -455,7 +455,14 @@ read access to `refs/meta/config`. "value": false, "configured_value": "FALSE", "inherited_value": true - } + }, + "max_object_size_limit": { + "value": "15m", + "configured_value": "15m", + "inherited_value": "20m" + }, + "submit_type": "MERGE_IF_NECESSARY", + "state": "ACTIVE", "commentlinks": {} } ---- @@ -1086,6 +1093,17 @@ link:#inherited-boolean-info[InheritedBooleanInfo] that tells whether a valid link:user-changeid.html[Change-Id] footer in any commit uploaded for review is required. This does not apply to commits pushed directly to a branch or tag. +|`max_object_size_limit` || +The link:config-gerrit.html#receive.maxObjectSizeLimit[max object size +limit] of this project as a link:#max-object-size-limit-info[ +MaxObjectSizeLimitInfo] entity. +|`submit_type` || +The default submit type of the project, can be `MERGE_IF_NECESSARY`, +`FAST_FORWARD_ONLY`, `REBASE_IF_NECESSARY`, `MERGE_ALWAYS` or +`CHERRY_PICK`. +|`state` |optional| +The state of the project, can be `ACTIVE`, `READ_ONLY` or `HIDDEN`. + +Not set if the project state is `ACTIVE`. |`commentlinks` || Map with the comment link configurations of the project. The name of the comment link configuration is mapped to the comment link @@ -1196,6 +1214,29 @@ The boolean value inherited from the parent. + Not set if there is no parent. |================================ +[[max-object-size-limit-info]] +MaxObjectSizeLimitInfo +~~~~~~~~~~~~~~~~~~~~~~ +The `MaxObjectSizeLimitInfo` entity contains information about the +link:config-gerrit.html#receive.maxObjectSizeLimit[max object size +limit] of a project. + +[options="header",width="50%",cols="1,^2,4"] +|=============================== +|Field Name ||Description +|`value` |optional| +The effective value of the max object size limit as a formatted string. + +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 +formatted string. + +Not set if there is no limit for the object size configured on project +level. +|`inherited_value` |optional| +The max object size limit that is inherited as a formatted string. + +Not set if there is no global limit for the object size. +|=============================== + [[project-description-input]] ProjectDescriptionInput ~~~~~~~~~~~~~~~~~~~~~~~ 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 af404b5c0f..8be0a10f74 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,6 +16,7 @@ package com.google.gerrit.server.git; 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; @@ -29,12 +30,14 @@ public class TransferConfig { private final int timeout; private final PackConfig packConfig; private final long maxObjectSizeLimit; + private final String maxObjectSizeLimitFormatted; @Inject TransferConfig(@GerritServerConfig final Config cfg) { timeout = (int) ConfigUtil.getTimeUnit(cfg, "transfer", null, "timeout", // 0, TimeUnit.SECONDS); maxObjectSizeLimit = cfg.getLong("receive", "maxObjectSizeLimit", 0); + maxObjectSizeLimitFormatted = cfg.getString("receive", null, "maxObjectSizeLimit"); packConfig = new PackConfig(); packConfig.setDeltaCompress(false); @@ -54,4 +57,19 @@ public class TransferConfig { public long getMaxObjectSizeLimit() { return maxObjectSizeLimit; } + + 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); + } else { + // 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/project/GetConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java index ee14d71fe7..9193fd9ba2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetConfig.java @@ -19,15 +19,26 @@ import com.google.common.collect.Maps; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.Project.InheritableBoolean; +import com.google.gerrit.reviewdb.client.Project.SubmitType; +import com.google.gerrit.server.git.TransferConfig; +import com.google.inject.Inject; import java.util.Map; public class GetConfig implements RestReadView { + private final TransferConfig config; + + @Inject + public GetConfig(TransferConfig config) { + this.config = config; + } + @Override public ConfigInfo apply(ProjectResource resource) { ConfigInfo result = new ConfigInfo(); ProjectState state = resource.getControl().getProjectState(); + Project p = state.getProject(); InheritedBooleanInfo useContributorAgreements = new InheritedBooleanInfo(); InheritedBooleanInfo useSignedOffBy = new InheritedBooleanInfo(); InheritedBooleanInfo useContentMerge = new InheritedBooleanInfo(); @@ -38,7 +49,6 @@ public class GetConfig implements RestReadView { useContentMerge.value = state.isUseContentMerge(); requireChangeId.value = state.isRequireChangeID(); - Project p = state.getProject(); useContributorAgreements.configuredValue = p.getUseContributorAgreements(); useSignedOffBy.configuredValue = p.getUseSignedOffBy(); useContentMerge.configuredValue = p.getUseContentMerge(); @@ -57,6 +67,18 @@ public class GetConfig implements RestReadView { result.useContentMerge = useContentMerge; result.requireChangeId = requireChangeId; + MaxObjectSizeLimitInfo maxObjectSizeLimit = new MaxObjectSizeLimitInfo(); + maxObjectSizeLimit.value = + config.getEffectiveMaxObjectSizeLimit(state) == config.getMaxObjectSizeLimit() + ? config.getFormattedMaxObjectSizeLimit() + : p.getMaxObjectSizeLimit(); + maxObjectSizeLimit.configuredValue = p.getMaxObjectSizeLimit(); + maxObjectSizeLimit.inheritedValue = config.getFormattedMaxObjectSizeLimit(); + result.maxObjectSizeLimit = maxObjectSizeLimit; + + result.submitType = p.getSubmitType(); + result.state = p.getState() != Project.State.ACTIVE ? p.getState() : null; + result.commentlinks = Maps.newLinkedHashMap(); for (CommentLinkInfo cl : state.getCommentLinks()) { result.commentlinks.put(cl.name, cl); @@ -73,6 +95,9 @@ public class GetConfig implements RestReadView { public InheritedBooleanInfo useContentMerge; public InheritedBooleanInfo useSignedOffBy; public InheritedBooleanInfo requireChangeId; + public MaxObjectSizeLimitInfo maxObjectSizeLimit; + public SubmitType submitType; + public Project.State state; public Map commentlinks; public ThemeInfo theme; @@ -83,4 +108,10 @@ public class GetConfig implements RestReadView { public InheritableBoolean configuredValue; public Boolean inheritedValue; } + + public static class MaxObjectSizeLimitInfo { + public String value; + public String configuredValue; + public String inheritedValue; + } } diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java index 28f20cf95a..f9d5ac136d 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java @@ -94,7 +94,8 @@ final class Receive extends AbstractGitCommand { final ReceivePack rp = receive.getReceivePack(); rp.setRefLogIdent(currentUser.newRefLogIdent()); rp.setTimeout(config.getTimeout()); - rp.setMaxObjectSizeLimit(getMaxObjectSizeLimit()); + rp.setMaxObjectSizeLimit(config.getEffectiveMaxObjectSizeLimit( + projectControl.getProjectState())); try { receive.advertiseHistory(); rp.receive(in, out, err); @@ -170,15 +171,4 @@ final class Receive extends AbstractGitCommand { } } } - - private long getMaxObjectSizeLimit() { - long global = config.getMaxObjectSizeLimit(); - long local = projectControl.getProjectState().getMaxObjectSizeLimit(); - if (global > 0 && local > 0) { - return Math.min(global, local); - } else { - // zero means "no limit", in this case the max is more limiting - return Math.max(global, local); - } - } }