Add BooleanProjectConfig to reduce boiler plate

Adding a new inheritable boolean project configuration required adding
it in many places so that it can be set and retrieved from the API and
is persisted in Git. Also making sure that it has the required
inheritance behavior was cumbersome.

This commit refactors the code and introdcues BooleanProjectConfig. This
makes it very easy to add new boolean configs server-side by adding them
to BooleanProjectConfig, ConfigInfo, ConfigInput and
BooleanProjectConfigTransformations.

Change-Id: Ie5b3678bbc8db44cb7ccefe5c59dd68918aba045
This commit is contained in:
Patrick Hiesel
2017-11-27 16:10:11 +01:00
parent d96ef40576
commit cb904b41ac
26 changed files with 355 additions and 433 deletions

View File

@@ -69,6 +69,7 @@ import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
@@ -874,7 +875,7 @@ public abstract class AbstractDaemonTest {
protected void setUseContributorAgreements(InheritableBoolean value) throws Exception {
try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
ProjectConfig config = ProjectConfig.read(md);
config.getProject().setUseContributorAgreements(value);
config.getProject().setBooleanConfig(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS, value);
config.commit(md);
projectCache.evict(config.getProject());
}
@@ -883,7 +884,7 @@ public abstract class AbstractDaemonTest {
protected void setUseSignedOffBy(InheritableBoolean value) throws Exception {
try (MetaDataUpdate md = metaDataUpdateFactory.create(project)) {
ProjectConfig config = ProjectConfig.read(md);
config.getProject().setUseSignedOffBy(value);
config.getProject().setBooleanConfig(BooleanProjectConfig.USE_SIGNED_OFF_BY, value);
config.commit(md);
projectCache.evict(config.getProject());
}
@@ -1558,7 +1559,10 @@ public abstract class AbstractDaemonTest {
protected void enableCreateNewChangeForAllNotInTarget() throws Exception {
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
config
.getProject()
.setBooleanConfig(
BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET, InheritableBoolean.TRUE);
saveProjectConfig(project, config);
}
}

View File

@@ -23,6 +23,7 @@ import java.util.Map;
public class ConfigInfo {
public String description;
public InheritedBooleanInfo useContributorAgreements;
public InheritedBooleanInfo useContentMerge;
public InheritedBooleanInfo useSignedOffBy;
@@ -34,6 +35,7 @@ public class ConfigInfo {
public InheritedBooleanInfo privateByDefault;
public InheritedBooleanInfo enableReviewerByEmail;
public InheritedBooleanInfo matchAuthorToCommitterDate;
public MaxObjectSizeLimitInfo maxObjectSizeLimit;
public SubmitType submitType;
public ProjectState state;

View File

@@ -16,6 +16,7 @@ package com.google.gerrit.gpg;
import com.google.common.base.Strings;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.EnableSignedPush;
import com.google.gerrit.server.config.AllUsersName;
@@ -88,7 +89,7 @@ class SignedPushModule extends AbstractModule {
@Override
public void init(Project.NameKey project, ReceivePack rp) {
ProjectState ps = projectCache.get(project);
if (!ps.isEnableSignedPush()) {
if (!ps.is(BooleanProjectConfig.ENABLE_SIGNED_PUSH)) {
rp.setSignedPushConfig(null);
return;
} else if (signedPushConfig == null) {
@@ -103,7 +104,7 @@ class SignedPushModule extends AbstractModule {
rp.setSignedPushConfig(signedPushConfig);
List<PreReceiveHook> hooks = new ArrayList<>(3);
if (ps.isRequireSignedPush()) {
if (ps.is(BooleanProjectConfig.REQUIRE_SIGNED_PUSH)) {
hooks.add(SignedPushPreReceiveHook.Required.INSTANCE);
}
hooks.add(hook);

View File

@@ -0,0 +1,64 @@
// Copyright (C) 2017 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.reviewdb.client;
/**
* Contains all inheritable boolean project configs and maps internal representations to API
* objects.
*
* <p>Perform the following steps for adding a new inheritable boolean project config:
*
* <ol>
* <li>Add a field to {@link com.google.gerrit.extensions.api.projects.ConfigInput}
* <li>Add a field to {@link com.google.gerrit.extensions.api.projects.ConfigInfo}
* <li>Add the config to this enum
* <li>Add API mappers to {@link
* com.google.gerrit.server.project.BooleanProjectConfigTransformations}
* </ol>
*/
public enum BooleanProjectConfig {
USE_CONTRIBUTOR_AGREEMENTS("receive", "requireContributorAgreement"),
USE_SIGNED_OFF_BY("receive", "requireSignedOffBy"),
USE_CONTENT_MERGE("submit", "mergeContent"),
REQUIRE_CHANGE_ID("receive", "requireChangeId"),
CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET("receive", "createNewChangeForAllNotInTarget"),
ENABLE_SIGNED_PUSH("receive", "enableSignedPush"),
REQUIRE_SIGNED_PUSH("receive", "requireSignedPush"),
REJECT_IMPLICIT_MERGES("receive", "rejectImplicitMerges"),
PRIVATE_BY_DEFAULT("change", "privateByDefault"),
ENABLE_REVIEWER_BY_EMAIL("reviewer", "enableByEmail"),
MATCH_AUTHOR_TO_COMMITTER_DATE("project", "matchAuthorToCommitterDate");
// Git config
private final String section;
private final String name;
BooleanProjectConfig(String section, String name) {
this.section = section;
this.name = name;
}
public String getSection() {
return section;
}
public String getSubSection() {
return null;
}
public String getName() {
return name;
}
}

View File

@@ -19,6 +19,9 @@ import com.google.gerrit.extensions.client.ProjectState;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gwtorm.client.Column;
import com.google.gwtorm.client.StringKey;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/** Projects match a source code repository managed by Gerrit */
public final class Project {
@@ -74,9 +77,7 @@ public final class Project {
protected String description;
protected InheritableBoolean useContributorAgreements;
protected InheritableBoolean useSignedOffBy;
protected Map<BooleanProjectConfig, InheritableBoolean> booleanConfigs;
protected SubmitType submitType;
@@ -84,46 +85,24 @@ public final class Project {
protected NameKey parent;
protected InheritableBoolean requireChangeID;
protected String maxObjectSizeLimit;
protected InheritableBoolean useContentMerge;
protected String defaultDashboardId;
protected String localDefaultDashboardId;
protected String themeName;
protected InheritableBoolean createNewChangeForAllNotInTarget;
protected InheritableBoolean enableSignedPush;
protected InheritableBoolean requireSignedPush;
protected InheritableBoolean rejectImplicitMerges;
protected InheritableBoolean privateByDefault;
protected InheritableBoolean enableReviewerByEmail;
protected InheritableBoolean matchAuthorToCommitterDate;
protected Project() {}
public Project(Project.NameKey nameKey) {
name = nameKey;
submitType = SubmitType.MERGE_IF_NECESSARY;
state = ProjectState.ACTIVE;
useContributorAgreements = InheritableBoolean.INHERIT;
useSignedOffBy = InheritableBoolean.INHERIT;
requireChangeID = InheritableBoolean.INHERIT;
useContentMerge = InheritableBoolean.INHERIT;
createNewChangeForAllNotInTarget = InheritableBoolean.INHERIT;
enableSignedPush = InheritableBoolean.INHERIT;
requireSignedPush = InheritableBoolean.INHERIT;
privateByDefault = InheritableBoolean.INHERIT;
enableReviewerByEmail = InheritableBoolean.INHERIT;
matchAuthorToCommitterDate = InheritableBoolean.INHERIT;
booleanConfigs = new HashMap<>();
Arrays.stream(BooleanProjectConfig.values())
.forEach(c -> booleanConfigs.put(c, InheritableBoolean.INHERIT));
}
public Project.NameKey getNameKey() {
@@ -142,102 +121,22 @@ public final class Project {
description = d;
}
public InheritableBoolean getUseContributorAgreements() {
return useContributorAgreements;
}
public InheritableBoolean getUseSignedOffBy() {
return useSignedOffBy;
}
public InheritableBoolean getUseContentMerge() {
return useContentMerge;
}
public InheritableBoolean getRequireChangeID() {
return requireChangeID;
}
public String getMaxObjectSizeLimit() {
return maxObjectSizeLimit;
}
public InheritableBoolean getRejectImplicitMerges() {
return rejectImplicitMerges;
public InheritableBoolean getBooleanConfig(BooleanProjectConfig config) {
return booleanConfigs.get(config);
}
public InheritableBoolean getPrivateByDefault() {
return privateByDefault;
}
public void setPrivateByDefault(InheritableBoolean privateByDefault) {
this.privateByDefault = privateByDefault;
}
public InheritableBoolean getEnableReviewerByEmail() {
return enableReviewerByEmail;
}
public void setEnableReviewerByEmail(InheritableBoolean enable) {
enableReviewerByEmail = enable;
}
public InheritableBoolean getMatchAuthorToCommitterDate() {
return matchAuthorToCommitterDate;
}
public void setMatchAuthorToCommitterDate(InheritableBoolean match) {
matchAuthorToCommitterDate = match;
}
public void setUseContributorAgreements(InheritableBoolean u) {
useContributorAgreements = u;
}
public void setUseSignedOffBy(InheritableBoolean sbo) {
useSignedOffBy = sbo;
}
public void setUseContentMerge(InheritableBoolean cm) {
useContentMerge = cm;
}
public void setRequireChangeID(InheritableBoolean cid) {
requireChangeID = cid;
}
public InheritableBoolean getCreateNewChangeForAllNotInTarget() {
return createNewChangeForAllNotInTarget;
}
public void setCreateNewChangeForAllNotInTarget(InheritableBoolean useAllNotInTarget) {
this.createNewChangeForAllNotInTarget = useAllNotInTarget;
}
public InheritableBoolean getEnableSignedPush() {
return enableSignedPush;
}
public void setEnableSignedPush(InheritableBoolean enable) {
enableSignedPush = enable;
}
public InheritableBoolean getRequireSignedPush() {
return requireSignedPush;
}
public void setRequireSignedPush(InheritableBoolean require) {
requireSignedPush = require;
public void setBooleanConfig(BooleanProjectConfig config, InheritableBoolean val) {
booleanConfigs.replace(config, val);
}
public void setMaxObjectSizeLimit(String limit) {
maxObjectSizeLimit = limit;
}
public void setRejectImplicitMerges(InheritableBoolean check) {
rejectImplicitMerges = check;
}
public SubmitType getSubmitType() {
return submitType;
}
@@ -280,14 +179,10 @@ public final class Project {
public void copySettingsFrom(Project update) {
description = update.description;
useContributorAgreements = update.useContributorAgreements;
useSignedOffBy = update.useSignedOffBy;
useContentMerge = update.useContentMerge;
requireChangeID = update.requireChangeID;
booleanConfigs = new HashMap<>(update.booleanConfigs);
submitType = update.submitType;
state = update.state;
maxObjectSizeLimit = update.maxObjectSizeLimit;
createNewChangeForAllNotInTarget = update.createNewChangeForAllNotInTarget;
}
/**

View File

@@ -33,6 +33,7 @@ import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
@@ -253,7 +254,7 @@ public class CreateChange
c = newCommit(oi, rw, author, mergeTip, commitMessage);
}
boolean privateByDefault = rsrc.getProjectState().isPrivateByDefault();
boolean privateByDefault = rsrc.getProjectState().is(BooleanProjectConfig.PRIVATE_BY_DEFAULT);
Change.Id changeId = new Change.Id(seq.nextChangeId());
ChangeInserter ins = changeInserterFactory.create(changeId, c, refName);
ins.setMessage(String.format("Uploaded patch set %s.", ins.getPatchSetId().get()));

View File

@@ -39,6 +39,7 @@ import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -181,7 +182,10 @@ public class PostReviewers
return fail(reviewer, e.getMessage());
}
boolean confirmed = input.confirmed();
boolean allowByEmail = projectCache.checkedGet(rsrc.getProject()).isEnableReviewerByEmail();
boolean allowByEmail =
projectCache
.checkedGet(rsrc.getProject())
.is(BooleanProjectConfig.ENABLE_REVIEWER_BY_EMAIL);
Addition byAccountId =
addByAccountId(reviewer, rsrc, state, notify, accountsToNotify, allowGroup, allowByEmail);

View File

@@ -23,6 +23,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.ChangeUtil;
@@ -114,7 +115,7 @@ public class PutMessage
ensureCanEditCommitMessage(resource.getNotes());
ensureChangeIdIsCorrect(
projectCache.checkedGet(resource.getProject()).isRequireChangeID(),
projectCache.checkedGet(resource.getProject()).is(BooleanProjectConfig.REQUIRE_CHANGE_ID),
resource.getChange().getKey().get(),
sanitizedCommitMessage);

View File

@@ -31,6 +31,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.MergeConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.LabelId;
@@ -168,7 +169,7 @@ public class MergeUtil {
approvalsUtil,
project,
commitMessageGenerator,
project.isUseContentMerge());
project.is(BooleanProjectConfig.USE_CONTENT_MERGE));
}
@AssistedInject
@@ -869,7 +870,7 @@ public class MergeUtil {
}
private static void matchAuthorToCommitterDate(ProjectState project, CommitBuilder commit) {
if (project.isMatchAuthorToCommitterDate()) {
if (project.is(BooleanProjectConfig.MATCH_AUTHOR_TO_COMMITTER_DATE)) {
commit.setAuthor(
new PersonIdent(
commit.getAuthor(),

View File

@@ -44,6 +44,7 @@ import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.client.ProjectState;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
@@ -88,8 +89,6 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError.
private static final String PROJECT = "project";
private static final String KEY_DESCRIPTION = "description";
private static final String KEY_MATCH_AUTHOR_DATE_WITH_COMMITTER_DATE =
"matchAuthorToCommitterDate";
public static final String ACCESS = "access";
private static final String KEY_INHERIT_FROM = "inheritFrom";
@@ -115,24 +114,14 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError.
private static final String CAPABILITY = "capability";
private static final String RECEIVE = "receive";
private static final String KEY_REQUIRE_SIGNED_OFF_BY = "requireSignedOffBy";
private static final String KEY_REQUIRE_CHANGE_ID = "requireChangeId";
private static final String KEY_USE_ALL_NOT_IN_TARGET = "createNewChangeForAllNotInTarget";
private static final String KEY_MAX_OBJECT_SIZE_LIMIT = "maxObjectSizeLimit";
private static final String KEY_REQUIRE_CONTRIBUTOR_AGREEMENT = "requireContributorAgreement";
private static final String KEY_CHECK_RECEIVED_OBJECTS = "checkReceivedObjects";
private static final String KEY_ENABLE_SIGNED_PUSH = "enableSignedPush";
private static final String KEY_REQUIRE_SIGNED_PUSH = "requireSignedPush";
private static final String KEY_REJECT_IMPLICIT_MERGES = "rejectImplicitMerges";
private static final String CHANGE = "change";
private static final String KEY_PRIVATE_BY_DEFAULT = "privateByDefault";
private static final String SUBMIT = "submit";
private static final String KEY_ACTION = "action";
private static final String KEY_MERGE_CONTENT = "mergeContent";
private static final String KEY_STATE = "state";
private static final String KEY_MAX_OBJECT_SIZE_LIMIT = "maxObjectSizeLimit";
private static final String SUBSCRIBE_SECTION = "allowSuperproject";
private static final String SUBSCRIBE_MATCH_REFS = "matching";
private static final String SUBSCRIBE_MULTI_MATCH_REFS = "all";
@@ -157,9 +146,6 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError.
private static final String KEY_CAN_OVERRIDE = "canOverride";
private static final String KEY_BRANCH = "branch";
private static final String REVIEWER = "reviewer";
private static final String KEY_ENABLE_REVIEWER_BY_EMAIL = "enableByEmail";
private static final String LEGACY_PERMISSION_PUSH_TAG = "pushTag";
private static final String LEGACY_PERMISSION_PUSH_SIGNED_TAG = "pushSignedTag";
@@ -520,37 +506,20 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError.
}
p.setParentName(rc.getString(ACCESS, null, KEY_INHERIT_FROM));
p.setUseContributorAgreements(
getEnum(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, InheritableBoolean.INHERIT));
p.setUseSignedOffBy(
getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, InheritableBoolean.INHERIT));
p.setRequireChangeID(
getEnum(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, InheritableBoolean.INHERIT));
p.setCreateNewChangeForAllNotInTarget(
getEnum(rc, RECEIVE, null, KEY_USE_ALL_NOT_IN_TARGET, InheritableBoolean.INHERIT));
p.setEnableSignedPush(
getEnum(rc, RECEIVE, null, KEY_ENABLE_SIGNED_PUSH, InheritableBoolean.INHERIT));
p.setRequireSignedPush(
getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_PUSH, InheritableBoolean.INHERIT));
p.setMaxObjectSizeLimit(rc.getString(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT));
p.setRejectImplicitMerges(
getEnum(rc, RECEIVE, null, KEY_REJECT_IMPLICIT_MERGES, InheritableBoolean.INHERIT));
p.setPrivateByDefault(
getEnum(rc, CHANGE, null, KEY_PRIVATE_BY_DEFAULT, InheritableBoolean.INHERIT));
p.setEnableReviewerByEmail(
getEnum(rc, REVIEWER, null, KEY_ENABLE_REVIEWER_BY_EMAIL, InheritableBoolean.INHERIT));
p.setSubmitType(getEnum(rc, SUBMIT, null, KEY_ACTION, DEFAULT_SUBMIT_ACTION));
p.setUseContentMerge(getEnum(rc, SUBMIT, null, KEY_MERGE_CONTENT, InheritableBoolean.INHERIT));
p.setMatchAuthorToCommitterDate(
for (BooleanProjectConfig config : BooleanProjectConfig.values()) {
p.setBooleanConfig(
config,
getEnum(
rc,
SUBMIT,
null,
KEY_MATCH_AUTHOR_DATE_WITH_COMMITTER_DATE,
config.getSection(),
config.getSubSection(),
config.getName(),
InheritableBoolean.INHERIT));
}
p.setMaxObjectSizeLimit(rc.getString(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT));
p.setSubmitType(getEnum(rc, SUBMIT, null, KEY_ACTION, DEFAULT_SUBMIT_ACTION));
p.setState(getEnum(rc, PROJECT, null, KEY_STATE, DEFAULT_STATE_VALUE));
p.setDefaultDashboard(rc.getString(DASHBOARD, null, KEY_DEFAULT));
@@ -1056,87 +1025,25 @@ public class ProjectConfig extends VersionedMetaData implements ValidationError.
rc.unset(PROJECT, null, KEY_DESCRIPTION);
}
set(rc, ACCESS, null, KEY_INHERIT_FROM, p.getParentName());
for (BooleanProjectConfig config : BooleanProjectConfig.values()) {
set(
rc,
RECEIVE,
null,
KEY_REQUIRE_CONTRIBUTOR_AGREEMENT,
p.getUseContributorAgreements(),
InheritableBoolean.INHERIT);
set(
rc,
RECEIVE,
null,
KEY_REQUIRE_SIGNED_OFF_BY,
p.getUseSignedOffBy(),
InheritableBoolean.INHERIT);
set(
rc,
RECEIVE,
null,
KEY_REQUIRE_CHANGE_ID,
p.getRequireChangeID(),
InheritableBoolean.INHERIT);
set(
rc,
RECEIVE,
null,
KEY_USE_ALL_NOT_IN_TARGET,
p.getCreateNewChangeForAllNotInTarget(),
config.getSection(),
config.getSubSection(),
config.getName(),
p.getBooleanConfig(config),
InheritableBoolean.INHERIT);
}
set(
rc,
RECEIVE,
null,
KEY_MAX_OBJECT_SIZE_LIMIT,
validMaxObjectSizeLimit(p.getMaxObjectSizeLimit()));
set(
rc,
RECEIVE,
null,
KEY_ENABLE_SIGNED_PUSH,
p.getEnableSignedPush(),
InheritableBoolean.INHERIT);
set(
rc,
RECEIVE,
null,
KEY_REQUIRE_SIGNED_PUSH,
p.getRequireSignedPush(),
InheritableBoolean.INHERIT);
set(
rc,
RECEIVE,
null,
KEY_REJECT_IMPLICIT_MERGES,
p.getRejectImplicitMerges(),
InheritableBoolean.INHERIT);
set(
rc,
CHANGE,
null,
KEY_PRIVATE_BY_DEFAULT,
p.getPrivateByDefault(),
InheritableBoolean.INHERIT);
set(
rc,
REVIEWER,
null,
KEY_ENABLE_REVIEWER_BY_EMAIL,
p.getEnableReviewerByEmail(),
InheritableBoolean.INHERIT);
set(rc, SUBMIT, null, KEY_ACTION, p.getSubmitType(), DEFAULT_SUBMIT_ACTION);
set(rc, SUBMIT, null, KEY_MERGE_CONTENT, p.getUseContentMerge(), InheritableBoolean.INHERIT);
set(
rc,
SUBMIT,
null,
KEY_MATCH_AUTHOR_DATE_WITH_COMMITTER_DATE,
p.getMatchAuthorToCommitterDate(),
InheritableBoolean.INHERIT);
set(rc, PROJECT, null, KEY_STATE, p.getState(), DEFAULT_STATE_VALUE);

View File

@@ -75,6 +75,7 @@ import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
@@ -486,7 +487,8 @@ class ReceiveCommits {
newChanges = Collections.emptyList();
// Other settings populated during processing.
newChangeForAllNotInTarget = projectState.isCreateNewChangeForAllNotInTarget();
newChangeForAllNotInTarget =
projectState.is(BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET);
// Handles for outputting back over the wire to the end user.
messageSender = new ReceivePackMessageSender();
@@ -1735,7 +1737,9 @@ class ReceiveCommits {
int alreadyTracked = 0;
boolean rejectImplicitMerges =
start.getParentCount() == 1
&& projectCache.get(project.getNameKey()).isRejectImplicitMerges()
&& projectCache
.get(project.getNameKey())
.is(BooleanProjectConfig.REJECT_IMPLICIT_MERGES)
// Don't worry about implicit merges when creating changes for
// already-merged commits; they're already in history, so it's too
// late.
@@ -2124,7 +2128,8 @@ class ReceiveCommits {
}
private void setChangeId(int id) {
boolean privateByDefault = projectCache.get(project.getNameKey()).isPrivateByDefault();
boolean privateByDefault =
projectCache.get(project.getNameKey()).is(BooleanProjectConfig.PRIVATE_BY_DEFAULT);
changeId = new Change.Id(id);
ins =

View File

@@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList;
import com.google.gerrit.extensions.restapi.MergeConflictException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.change.RebaseChangeOp;
@@ -179,7 +180,8 @@ public class RebaseSubmitStrategy extends SubmitStrategy {
// Do not post message after inserting new patchset because there
// will be one about change being merged already.
.setPostMessage(false)
.setMatchAuthorToCommitterDate(args.project.isMatchAuthorToCommitterDate());
.setMatchAuthorToCommitterDate(
args.project.is(BooleanProjectConfig.MATCH_AUTHOR_TO_COMMITTER_DATE));
try {
rebaseOp.updateRepo(ctx);
} catch (MergeConflictException | NoSuchChangeException e) {

View File

@@ -28,6 +28,7 @@ import com.google.gerrit.extensions.api.config.ConsistencyCheckInfo.ConsistencyP
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.client.RevId;
@@ -257,7 +258,7 @@ public class CommitValidators {
String sha1 = commit.abbreviate(RevId.ABBREV_LEN).name();
if (idList.isEmpty()) {
if (projectState.isRequireChangeID()) {
if (projectState.is(BooleanProjectConfig.REQUIRE_CHANGE_ID)) {
String shortMsg = commit.getShortMessage();
if (shortMsg.startsWith(CHANGE_ID_PREFIX)
&& CHANGE_ID
@@ -516,7 +517,7 @@ public class CommitValidators {
@Override
public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
throws CommitValidationException {
if (!state.isUseSignedOffBy()) {
if (!state.is(BooleanProjectConfig.USE_SIGNED_OFF_BY)) {
return Collections.emptyList();
}

View File

@@ -0,0 +1,115 @@
// Copyright (C) 2017 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.server.project;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import com.google.gerrit.extensions.api.projects.ConfigInfo;
import com.google.gerrit.extensions.api.projects.ConfigInfo.InheritedBooleanInfo;
import com.google.gerrit.extensions.api.projects.ConfigInput;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import java.util.Arrays;
import java.util.HashSet;
/** Provides transformations to get and set BooleanProjectConfigs from the API. */
public class BooleanProjectConfigTransformations {
private static ImmutableMap<BooleanProjectConfig, Mapper> MAPPER =
ImmutableMap.<BooleanProjectConfig, Mapper>builder()
.put(
BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS,
new Mapper(i -> i.useContributorAgreements, (i, v) -> i.useContributorAgreements = v))
.put(
BooleanProjectConfig.USE_SIGNED_OFF_BY,
new Mapper(i -> i.useSignedOffBy, (i, v) -> i.useSignedOffBy = v))
.put(
BooleanProjectConfig.USE_CONTENT_MERGE,
new Mapper(i -> i.useContentMerge, (i, v) -> i.useContentMerge = v))
.put(
BooleanProjectConfig.REQUIRE_CHANGE_ID,
new Mapper(i -> i.requireChangeId, (i, v) -> i.requireChangeId = v))
.put(
BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
new Mapper(
i -> i.createNewChangeForAllNotInTarget,
(i, v) -> i.createNewChangeForAllNotInTarget = v))
.put(
BooleanProjectConfig.ENABLE_SIGNED_PUSH,
new Mapper(i -> i.enableSignedPush, (i, v) -> i.enableSignedPush = v))
.put(
BooleanProjectConfig.REQUIRE_SIGNED_PUSH,
new Mapper(i -> i.requireSignedPush, (i, v) -> i.requireSignedPush = v))
.put(
BooleanProjectConfig.REJECT_IMPLICIT_MERGES,
new Mapper(i -> i.rejectImplicitMerges, (i, v) -> i.rejectImplicitMerges = v))
.put(
BooleanProjectConfig.PRIVATE_BY_DEFAULT,
new Mapper(i -> i.privateByDefault, (i, v) -> i.privateByDefault = v))
.put(
BooleanProjectConfig.ENABLE_REVIEWER_BY_EMAIL,
new Mapper(i -> i.enableReviewerByEmail, (i, v) -> i.enableReviewerByEmail = v))
.put(
BooleanProjectConfig.MATCH_AUTHOR_TO_COMMITTER_DATE,
new Mapper(
i -> i.matchAuthorToCommitterDate, (i, v) -> i.matchAuthorToCommitterDate = v))
.build();
static {
// Verify that each BooleanProjectConfig has to/from API mappers in BooleanProjectConfigTransformations
if (!Sets.symmetricDifference(
MAPPER.keySet(), new HashSet<>(Arrays.asList(BooleanProjectConfig.values())))
.isEmpty()) {
throw new IllegalStateException(
"All values of BooleanProjectConfig must have transformations associated with them");
}
}
@FunctionalInterface
private interface ToApi {
void apply(ConfigInfo info, InheritedBooleanInfo val);
}
@FunctionalInterface
private interface FromApi {
InheritableBoolean apply(ConfigInput input);
}
public static void set(BooleanProjectConfig cfg, ConfigInfo info, InheritedBooleanInfo val) {
MAPPER.get(cfg).set(info, val);
}
public static InheritableBoolean get(BooleanProjectConfig cfg, ConfigInput input) {
return MAPPER.get(cfg).get(input);
}
private static class Mapper {
private final FromApi fromApi;
private final ToApi toApi;
private Mapper(FromApi fromApi, ToApi toApi) {
this.fromApi = fromApi;
this.toApi = toApi;
}
public void set(ConfigInfo info, InheritedBooleanInfo val) {
toApi.apply(info, val);
}
public InheritableBoolean get(ConfigInput input) {
return fromApi.apply(input);
}
}
}

View File

@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.registration.DynamicMap.Entry;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.config.AllProjectsName;
@@ -51,65 +52,20 @@ public class ConfigInfoImpl extends ConfigInfo {
Project p = projectState.getProject();
this.description = Strings.emptyToNull(p.getDescription());
InheritedBooleanInfo useContributorAgreements = new InheritedBooleanInfo();
InheritedBooleanInfo useSignedOffBy = new InheritedBooleanInfo();
InheritedBooleanInfo useContentMerge = new InheritedBooleanInfo();
InheritedBooleanInfo requireChangeId = new InheritedBooleanInfo();
InheritedBooleanInfo createNewChangeForAllNotInTarget = new InheritedBooleanInfo();
InheritedBooleanInfo enableSignedPush = new InheritedBooleanInfo();
InheritedBooleanInfo requireSignedPush = new InheritedBooleanInfo();
InheritedBooleanInfo rejectImplicitMerges = new InheritedBooleanInfo();
InheritedBooleanInfo privateByDefault = new InheritedBooleanInfo();
InheritedBooleanInfo enableReviewerByEmail = new InheritedBooleanInfo();
InheritedBooleanInfo matchAuthorToCommitterDate = new InheritedBooleanInfo();
useContributorAgreements.value = projectState.isUseContributorAgreements();
useSignedOffBy.value = projectState.isUseSignedOffBy();
useContentMerge.value = projectState.isUseContentMerge();
requireChangeId.value = projectState.isRequireChangeID();
createNewChangeForAllNotInTarget.value = projectState.isCreateNewChangeForAllNotInTarget();
useContributorAgreements.configuredValue = p.getUseContributorAgreements();
useSignedOffBy.configuredValue = p.getUseSignedOffBy();
useContentMerge.configuredValue = p.getUseContentMerge();
requireChangeId.configuredValue = p.getRequireChangeID();
createNewChangeForAllNotInTarget.configuredValue = p.getCreateNewChangeForAllNotInTarget();
enableSignedPush.configuredValue = p.getEnableSignedPush();
requireSignedPush.configuredValue = p.getRequireSignedPush();
rejectImplicitMerges.configuredValue = p.getRejectImplicitMerges();
privateByDefault.configuredValue = p.getPrivateByDefault();
enableReviewerByEmail.configuredValue = p.getEnableReviewerByEmail();
matchAuthorToCommitterDate.configuredValue = p.getMatchAuthorToCommitterDate();
ProjectState parentState = Iterables.getFirst(projectState.parents(), null);
for (BooleanProjectConfig cfg : BooleanProjectConfig.values()) {
InheritedBooleanInfo info = new InheritedBooleanInfo();
info.configuredValue = p.getBooleanConfig(cfg);
if (parentState != null) {
useContributorAgreements.inheritedValue = parentState.isUseContributorAgreements();
useSignedOffBy.inheritedValue = parentState.isUseSignedOffBy();
useContentMerge.inheritedValue = parentState.isUseContentMerge();
requireChangeId.inheritedValue = parentState.isRequireChangeID();
createNewChangeForAllNotInTarget.inheritedValue =
parentState.isCreateNewChangeForAllNotInTarget();
enableSignedPush.inheritedValue = projectState.isEnableSignedPush();
requireSignedPush.inheritedValue = projectState.isRequireSignedPush();
privateByDefault.inheritedValue = projectState.isPrivateByDefault();
rejectImplicitMerges.inheritedValue = projectState.isRejectImplicitMerges();
enableReviewerByEmail.inheritedValue = projectState.isEnableReviewerByEmail();
matchAuthorToCommitterDate.inheritedValue = projectState.isMatchAuthorToCommitterDate();
info.inheritedValue = parentState.is(cfg);
}
BooleanProjectConfigTransformations.set(cfg, this, info);
}
this.useContributorAgreements = useContributorAgreements;
this.useSignedOffBy = useSignedOffBy;
this.useContentMerge = useContentMerge;
this.requireChangeId = requireChangeId;
this.rejectImplicitMerges = rejectImplicitMerges;
this.createNewChangeForAllNotInTarget = createNewChangeForAllNotInTarget;
this.enableReviewerByEmail = enableReviewerByEmail;
this.matchAuthorToCommitterDate = matchAuthorToCommitterDate;
if (serverEnableSignedPush) {
this.enableSignedPush = enableSignedPush;
this.requireSignedPush = requireSignedPush;
if (!serverEnableSignedPush) {
this.enableSignedPush = null;
this.requireSignedPush = null;
}
this.privateByDefault = privateByDefault;
MaxObjectSizeLimitInfo maxObjectSizeLimit = new MaxObjectSizeLimitInfo();
maxObjectSizeLimit.value =

View File

@@ -22,6 +22,7 @@ import com.google.gerrit.common.data.PermissionRule.Action;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
@@ -65,7 +66,7 @@ public class ContributorAgreementsChecker {
throw new IOException("Can't load All-Projects");
}
if (!projectState.isUseContributorAgreements()) {
if (!projectState.is(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS)) {
return;
}

View File

@@ -41,6 +41,7 @@ import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.GerritPersonIdent;
@@ -273,11 +274,14 @@ public class CreateProject implements RestModifyView<TopLevelResource, ProjectIn
newProject.setSubmitType(
MoreObjects.firstNonNull(
args.submitType, repositoryCfg.getDefaultSubmitType(args.getProject())));
newProject.setUseContributorAgreements(args.contributorAgreements);
newProject.setUseSignedOffBy(args.signedOffBy);
newProject.setUseContentMerge(args.contentMerge);
newProject.setCreateNewChangeForAllNotInTarget(args.newChangeForAllNotInTarget);
newProject.setRequireChangeID(args.changeIdRequired);
newProject.setBooleanConfig(
BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS, args.contributorAgreements);
newProject.setBooleanConfig(BooleanProjectConfig.USE_SIGNED_OFF_BY, args.signedOffBy);
newProject.setBooleanConfig(BooleanProjectConfig.USE_CONTENT_MERGE, args.contentMerge);
newProject.setBooleanConfig(
BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET,
args.newChangeForAllNotInTarget);
newProject.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, args.changeIdRequired);
newProject.setMaxObjectSizeLimit(args.maxObjectSizeLimit);
if (args.newParent != null) {
newProject.setParentName(args.newParent);

View File

@@ -31,8 +31,8 @@ import com.google.gerrit.common.data.RefConfigSection;
import com.google.gerrit.common.data.SubscribeSection;
import com.google.gerrit.extensions.api.projects.CommentLinkInfo;
import com.google.gerrit.extensions.api.projects.ThemeInfo;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
@@ -66,7 +66,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
@@ -375,48 +374,19 @@ public class ProjectState {
return isAllUsers;
}
public boolean isUseContributorAgreements() {
return getInheritableBoolean(Project::getUseContributorAgreements);
public boolean is(BooleanProjectConfig config) {
for (ProjectState s : tree()) {
switch (s.getProject().getBooleanConfig(config)) {
case TRUE:
return true;
case FALSE:
return false;
case INHERIT:
default:
continue;
}
public boolean isUseContentMerge() {
return getInheritableBoolean(Project::getUseContentMerge);
}
public boolean isUseSignedOffBy() {
return getInheritableBoolean(Project::getUseSignedOffBy);
}
public boolean isRequireChangeID() {
return getInheritableBoolean(Project::getRequireChangeID);
}
public boolean isCreateNewChangeForAllNotInTarget() {
return getInheritableBoolean(Project::getCreateNewChangeForAllNotInTarget);
}
public boolean isEnableSignedPush() {
return getInheritableBoolean(Project::getEnableSignedPush);
}
public boolean isRequireSignedPush() {
return getInheritableBoolean(Project::getRequireSignedPush);
}
public boolean isRejectImplicitMerges() {
return getInheritableBoolean(Project::getRejectImplicitMerges);
}
public boolean isPrivateByDefault() {
return getInheritableBoolean(Project::getPrivateByDefault);
}
public boolean isEnableReviewerByEmail() {
return getInheritableBoolean(Project::getEnableReviewerByEmail);
}
public boolean isMatchAuthorToCommitterDate() {
return getInheritableBoolean(Project::getMatchAuthorToCommitterDate);
return false;
}
/** All available label types. */
@@ -561,21 +531,6 @@ public class ProjectState {
return Files.exists(p) ? new String(Files.readAllBytes(p), UTF_8) : null;
}
private boolean getInheritableBoolean(Function<Project, InheritableBoolean> func) {
for (ProjectState s : tree()) {
switch (func.apply(s.getProject())) {
case TRUE:
return true;
case FALSE:
return false;
case INHERIT:
default:
continue;
}
}
return false;
}
private LabelTypes loadLabelTypes() {
Map<String, LabelType> types = new LinkedHashMap<>();
for (ProjectState s : treeInOrder()) {

View File

@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.api.projects.ConfigInfo;
import com.google.gerrit.extensions.api.projects.ConfigInput;
import com.google.gerrit.extensions.api.projects.ConfigValue;
import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -28,6 +29,7 @@ import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.EnableSignedPush;
@@ -120,39 +122,11 @@ public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
p.setDescription(Strings.emptyToNull(input.description));
if (input.useContributorAgreements != null) {
p.setUseContributorAgreements(input.useContributorAgreements);
for (BooleanProjectConfig cfg : BooleanProjectConfig.values()) {
InheritableBoolean val = BooleanProjectConfigTransformations.get(cfg, input);
if (val != null) {
p.setBooleanConfig(cfg, val);
}
if (input.useContentMerge != null) {
p.setUseContentMerge(input.useContentMerge);
}
if (input.useSignedOffBy != null) {
p.setUseSignedOffBy(input.useSignedOffBy);
}
if (input.createNewChangeForAllNotInTarget != null) {
p.setCreateNewChangeForAllNotInTarget(input.createNewChangeForAllNotInTarget);
}
if (input.requireChangeId != null) {
p.setRequireChangeID(input.requireChangeId);
}
if (serverEnableSignedPush) {
if (input.enableSignedPush != null) {
p.setEnableSignedPush(input.enableSignedPush);
}
if (input.requireSignedPush != null) {
p.setRequireSignedPush(input.requireSignedPush);
}
}
if (input.rejectImplicitMerges != null) {
p.setRejectImplicitMerges(input.rejectImplicitMerges);
}
if (input.privateByDefault != null) {
p.setPrivateByDefault(input.privateByDefault);
}
if (input.maxObjectSizeLimit != null) {
@@ -167,14 +141,6 @@ public class PutConfig implements RestModifyView<ProjectResource, ConfigInput> {
p.setState(input.state);
}
if (input.enableReviewerByEmail != null) {
p.setEnableReviewerByEmail(input.enableReviewerByEmail);
}
if (input.matchAuthorToCommitterDate != null) {
p.setMatchAuthorToCommitterDate(input.matchAuthorToCommitterDate);
}
if (input.pluginConfigValues != null) {
setPluginConfigValues(projectState, projectConfig, input.pluginConfigValues);
}

View File

@@ -20,6 +20,7 @@ import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRange;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
@@ -584,7 +585,7 @@ class RefControl {
&& canForgeCommitter()
&& canForgeGerritServerIdentity()
&& canUploadMerges()
&& !projectControl.getProjectState().isUseSignedOffBy();
&& !projectControl.getProjectState().is(BooleanProjectConfig.USE_SIGNED_OFF_BY);
}
throw new PermissionBackendException(perm + " unsupported");
}

View File

@@ -17,6 +17,7 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.index.query.Predicate;
import com.google.gerrit.index.query.QueryParseException;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.git.CodeReviewCommit;
@@ -115,7 +116,10 @@ public class ConflictsPredicate {
ObjectId other = ObjectId.fromString(object.currentPatchSet().getRevision().get());
ConflictKey conflictsKey =
new ConflictKey(
changeDataCache.getTestAgainst(), other, str.type, projectState.isUseContentMerge());
changeDataCache.getTestAgainst(),
other,
str.type,
projectState.is(BooleanProjectConfig.USE_CONTENT_MERGE));
Boolean conflicts = args.conflictsCache.getIfPresent(conflictsKey);
if (conflicts != null) {
return conflicts;

View File

@@ -36,6 +36,7 @@ import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.PermissionRule.Action;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -150,11 +151,11 @@ public class AllProjectsCreator {
ProjectConfig config = ProjectConfig.read(md);
Project p = config.getProject();
p.setDescription("Access inherited by all other projects.");
p.setRequireChangeID(InheritableBoolean.TRUE);
p.setUseContentMerge(InheritableBoolean.TRUE);
p.setUseContributorAgreements(InheritableBoolean.FALSE);
p.setUseSignedOffBy(InheritableBoolean.FALSE);
p.setEnableSignedPush(InheritableBoolean.FALSE);
p.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.TRUE);
p.setBooleanConfig(BooleanProjectConfig.USE_CONTENT_MERGE, InheritableBoolean.TRUE);
p.setBooleanConfig(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS, InheritableBoolean.FALSE);
p.setBooleanConfig(BooleanProjectConfig.USE_SIGNED_OFF_BY, InheritableBoolean.FALSE);
p.setBooleanConfig(BooleanProjectConfig.ENABLE_SIGNED_PUSH, InheritableBoolean.FALSE);
AccessSection cap = config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true);
AccessSection all = config.getAccessSection(AccessSection.ALL, true);

View File

@@ -69,6 +69,7 @@ import com.google.gerrit.extensions.common.LabelInfo;
import com.google.gerrit.extensions.common.RevisionInfo;
import com.google.gerrit.extensions.common.testing.EditInfoSubject;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchSet;
@@ -1159,7 +1160,10 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
@Test
public void pushSameCommitTwice() throws Exception {
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
config
.getProject()
.setBooleanConfig(
BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET, InheritableBoolean.TRUE);
saveProjectConfig(project, config);
PushOneCommit push =
@@ -1183,7 +1187,10 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
@Test
public void pushSameCommitTwiceWhenIndexFailed() throws Exception {
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
config
.getProject()
.setBooleanConfig(
BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET, InheritableBoolean.TRUE);
saveProjectConfig(project, config);
PushOneCommit push =
@@ -1276,7 +1283,9 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
pushForReviewRejected(testRepo, "missing Change-Id in commit message footer");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
config
.getProject()
.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewOk(testRepo);
}
@@ -1302,7 +1311,9 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
pushForReviewRejected(testRepo, "multiple Change-Id lines in commit message footer");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
config
.getProject()
.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewRejected(testRepo, "multiple Change-Id lines in commit message footer");
}
@@ -1323,7 +1334,9 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
pushForReviewRejected(testRepo, "invalid Change-Id line format in commit message footer");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
config
.getProject()
.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewRejected(testRepo, "invalid Change-Id line format in commit message footer");
}
@@ -1349,7 +1362,10 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
pushForReviewRejected(testRepo, "invalid Change-Id line format in commit message footer");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
config
.getProject()
.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
;
saveProjectConfig(project, config);
pushForReviewRejected(testRepo, "invalid Change-Id line format in commit message footer");
}
@@ -1372,7 +1388,9 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
+ " commit");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
config
.getProject()
.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewRejected(
@@ -1395,7 +1413,9 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
+ " commit");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
config
.getProject()
.setBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID, InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewRejected(

View File

@@ -20,6 +20,7 @@ import static com.google.gerrit.acceptance.GitUtil.pushHead;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.extensions.client.InheritableBoolean;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.server.git.ProjectConfig;
import org.eclipse.jgit.lib.ObjectId;
import org.junit.Test;
@@ -82,7 +83,8 @@ public class ImplicitMergeCheckIT extends AbstractDaemonTest {
private void setRejectImplicitMerges() throws Exception {
ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
cfg.getProject().setRejectImplicitMerges(InheritableBoolean.TRUE);
cfg.getProject()
.setBooleanConfig(BooleanProjectConfig.REJECT_IMPLICIT_MERGES, InheritableBoolean.TRUE);
saveProjectConfig(project, cfg);
}

View File

@@ -56,6 +56,7 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
@@ -564,7 +565,10 @@ public abstract class AbstractSubmit extends AbstractDaemonTest {
// C0 -- Master
//
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
config
.getProject()
.setBooleanConfig(
BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET, InheritableBoolean.TRUE);
saveProjectConfig(project, config);
PushOneCommit push1 =

View File

@@ -37,6 +37,7 @@ import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.group.SystemGroupBackend;
@@ -181,10 +182,14 @@ public class CreateProjectIT extends AbstractDaemonTest {
assertProjectInfo(project, p);
assertThat(project.getDescription()).isEqualTo(in.description);
assertThat(project.getSubmitType()).isEqualTo(in.submitType);
assertThat(project.getUseContributorAgreements()).isEqualTo(in.useContributorAgreements);
assertThat(project.getUseSignedOffBy()).isEqualTo(in.useSignedOffBy);
assertThat(project.getUseContentMerge()).isEqualTo(in.useContentMerge);
assertThat(project.getRequireChangeID()).isEqualTo(in.requireChangeId);
assertThat(project.getBooleanConfig(BooleanProjectConfig.USE_CONTRIBUTOR_AGREEMENTS))
.isEqualTo(in.useContributorAgreements);
assertThat(project.getBooleanConfig(BooleanProjectConfig.USE_SIGNED_OFF_BY))
.isEqualTo(in.useSignedOffBy);
assertThat(project.getBooleanConfig(BooleanProjectConfig.USE_CONTENT_MERGE))
.isEqualTo(in.useContentMerge);
assertThat(project.getBooleanConfig(BooleanProjectConfig.REQUIRE_CHANGE_ID))
.isEqualTo(in.requireChangeId);
}
@Test