Return more project settings from /project/*/config

Include the project state, the default submit type and the max object
size limit into the result of the /projects/*/config REST endpoint.

Change-Id: I5228cf7c11646b74234b8edd49ba1f76c965239d
This commit is contained in:
Edwin Kempin
2013-07-15 10:12:27 +02:00
committed by Edwin Kempin
parent 3660c135be
commit 3c99f596c9
4 changed files with 94 additions and 14 deletions

View File

@@ -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
~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -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);
}
}
}

View File

@@ -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<ProjectResource> {
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<ProjectResource> {
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<ProjectResource> {
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<ProjectResource> {
public InheritedBooleanInfo useContentMerge;
public InheritedBooleanInfo useSignedOffBy;
public InheritedBooleanInfo requireChangeId;
public MaxObjectSizeLimitInfo maxObjectSizeLimit;
public SubmitType submitType;
public Project.State state;
public Map<String, CommentLinkInfo> commentlinks;
public ThemeInfo theme;
@@ -83,4 +108,10 @@ public class GetConfig implements RestReadView<ProjectResource> {
public InheritableBoolean configuredValue;
public Boolean inheritedValue;
}
public static class MaxObjectSizeLimitInfo {
public String value;
public String configuredValue;
public String inheritedValue;
}
}

View File

@@ -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);
}
}
}