diff options
author | Ismo Haataja <ismo.haataja@digia.com> | 2014-04-08 14:22:53 +0300 |
---|---|---|
committer | Ismo Haataja <ismo.haataja@digia.com> | 2014-06-12 14:07:34 +0200 |
commit | bc9ced781bde591e626d9df6c334ddd7ab5c0ca1 (patch) | |
tree | 7e02ea19a4be96294216326b2e1866d71a57538f | |
parent | f4c9a8da43dc4b48abaab6703756ec90edb21895 (diff) |
Commit message footer options for cherry-pick mode
When using cherry pick submit type, there is now additional options
which define which footers are added to the commit message. Also,
added footers can be limited to reviewers who gave the maximum
approval score. These options are visible only for actual projects,
not for All-Projects.
Bug: issue 655
Originally-by: Mika Hamalainen <mika.hamalainen@accenture.com>
Change-Id: Ibfb7193edde7f88607683adf061e8603cb382d06
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Ismo Haataja <ismo.haataja@digia.com>
9 files changed, 245 insertions, 8 deletions
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java index 1e7589b828..e257badac7 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java @@ -1,4 +1,5 @@ // Copyright (C) 2008 The Android Open Source Project +// Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -24,6 +25,7 @@ public class ProjectDetail { public boolean canModifyAgreements; public boolean canModifyAccess; public boolean canModifyState; + public boolean canModifyCherryPickOptions; public boolean isPermissionOnly; public InheritedBoolean useContributorAgreements; public InheritedBoolean useSignedOffBy; @@ -57,6 +59,10 @@ public class ProjectDetail { canModifyAccess = cma; } + public void setCanModifyCherryPickOptions(final boolean cmo) { + canModifyCherryPickOptions = cmo; + } + public void setPermissionOnly(final boolean ipo) { isPermissionOnly = ipo; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java index f4c0b559c6..6363c7b7ce 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java @@ -1,4 +1,5 @@ // Copyright (C) 2008 The Android Open Source Project +// Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -47,6 +48,10 @@ public interface AdminConstants extends Constants { String buttonSaveGroupOptions(); String suggestedGroupLabel(); String parentSuggestions(); + String cherryPickOptions(); + String includeReviewedOn(); + String includeOnlyMaxApprovals(); + String footerPrefix(); String buttonBrowseProjects(); String projects(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties index a2296e017d..b68718eb63 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties @@ -31,6 +31,10 @@ suggestedGroupLabel = group headingParentProjectName = Rights Inherit From parentSuggestions = Parent Suggestion columnProjectName = Project Name +cherryPickOptions = Cherry Pick Options +includeReviewedOn = Footer Reviewed-on +includeOnlyMaxApprovals = Add footer only for approvals with maximum score +footerPrefix = Footer headingGroupUUID = Group UUID headingOwner = Owners 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 40921309c0..a0ec88c681 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 @@ -1,4 +1,5 @@ // Copyright (C) 2008 The Android Open Source Project +// Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,10 +17,13 @@ package com.google.gerrit.client.admin; import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.download.DownloadPanel; +import com.google.gerrit.client.rpc.CallbackGroup; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.ScreenLoadCallback; import com.google.gerrit.client.ui.OnEditEnabler; import com.google.gerrit.client.ui.SmallHeading; +import com.google.gerrit.common.data.LabelType; +import com.google.gerrit.common.data.ProjectAccess; import com.google.gerrit.common.data.ProjectDetail; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand; import com.google.gerrit.reviewdb.client.InheritedBoolean; @@ -31,12 +35,19 @@ import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.globalkey.client.NpTextArea; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + public class ProjectInfoScreen extends ProjectScreen { private String projectName; private Project project; @@ -53,6 +64,13 @@ public class ProjectInfoScreen extends ProjectScreen { private ListBox contributorAgreements; private ListBox signedOffBy; + private Label cherryPickHeader; + private Panel cherryPickPanel; + private CheckBox includeReviewedOn; + private CheckBox includeOnlyMaxApproval; + private Map<String, CheckBox> approvalsInFooter; + private boolean canModifyCherryPickOptions; + private NpTextArea descTxt; private Button saveProject; @@ -80,6 +98,7 @@ public class ProjectInfoScreen extends ProjectScreen { initDescription(); grid = new LabeledWidgetsGrid(); initProjectOptions(); + initcherryPickOptions(); initAgreements(); add(grid); add(saveProject); @@ -88,19 +107,40 @@ public class ProjectInfoScreen extends ProjectScreen { @Override protected void onLoad() { super.onLoad(); + + CallbackGroup cbs = new CallbackGroup(); + Util.PROJECT_SVC.projectAccess(getProjectKey(), + cbs.addGwtjsonrpc(new ScreenLoadCallback<ProjectAccess>(this) { + public void preDisplay(final ProjectAccess result) { + for (final LabelType t : result.getLabelTypes().getLabelTypes()) { + final String footer = t.getName(); + if (!approvalsInFooter.containsKey(footer)) { + final String title = Util.C.footerPrefix() + " " + footer; + CheckBox checkBox = new CheckBox(title, true); + approvalsInFooter.put(footer, checkBox); + saveEnabler.listenTo(checkBox); + cherryPickPanel.add(checkBox); + } + } + } + })); + Util.PROJECT_SVC.projectDetail(getProjectKey(), - new ScreenLoadCallback<ProjectDetail>(this) { + cbs.addGwtjsonrpc(new ScreenLoadCallback<ProjectDetail>(this) { public void preDisplay(final ProjectDetail result) { enableForm(result.canModifyAgreements, result.canModifyDescription, result.canModifyMergeType, result.canModifyState); + enableCherryPickOptions(result.canModifyCherryPickOptions); saveProject.setVisible( result.canModifyAgreements || result.canModifyDescription || result.canModifyMergeType || - result.canModifyState); + result.canModifyState || + result.canModifyCherryPickOptions); + canModifyCherryPickOptions = result.canModifyCherryPickOptions; display(result); } - }); + })); savedPanel = INFO; } @@ -141,6 +181,7 @@ public class ProjectInfoScreen extends ProjectScreen { @Override public void onChange(ChangeEvent event) { setEnabledForUseContentMerge(); + setEnabledForCherryPick(); } }); saveEnabler.listenTo(submitType); @@ -188,6 +229,22 @@ public class ProjectInfoScreen extends ProjectScreen { } } + private void setEnabledForCherryPick() { + final boolean isCherryPickSubmitType = + SubmitType.CHERRY_PICK.equals(Project.SubmitType.valueOf( + submitType.getValue(submitType.getSelectedIndex()))); + enableCherryPickOptions(isCherryPickSubmitType + && canModifyCherryPickOptions && Gerrit.isSignedIn()); + } + + private void enableCherryPickOptions(final boolean enable) { + includeReviewedOn.setEnabled(enable); + includeOnlyMaxApproval.setEnabled(enable); + for (CheckBox checkBox : approvalsInFooter.values()) { + checkBox.setEnabled(enable); + } + } + private void initAgreements() { grid.addHeader(new SmallHeading(Util.C.headingAgreements())); @@ -202,6 +259,24 @@ public class ProjectInfoScreen extends ProjectScreen { grid.addHtml(Util.C.useSignedOffBy(), signedOffBy); } + private void initcherryPickOptions() { + cherryPickHeader = new SmallHeading(Util.C.cherryPickOptions()); + grid.addHeader(cherryPickHeader); + cherryPickPanel = new VerticalPanel(); + + includeOnlyMaxApproval = new CheckBox(Util.C.includeOnlyMaxApprovals(), true); + saveEnabler.listenTo(includeOnlyMaxApproval); + cherryPickPanel.add(includeOnlyMaxApproval); + + includeReviewedOn = new CheckBox(Util.C.includeReviewedOn(), true); + saveEnabler.listenTo(includeReviewedOn); + cherryPickPanel.add(includeReviewedOn); + + approvalsInFooter = new HashMap<String, CheckBox>(); + + grid.add(null, cherryPickPanel); + } + private void setSubmitType(final Project.SubmitType newSubmitType) { int index = -1; if (submitType != null) { @@ -213,6 +288,7 @@ public class ProjectInfoScreen extends ProjectScreen { } submitType.setSelectedIndex(index); setEnabledForUseContentMerge(); + setEnabledForCherryPick(); } } @@ -278,6 +354,22 @@ public class ProjectInfoScreen extends ProjectScreen { setSubmitType(project.getSubmitType()); setState(project.getState()); + includeOnlyMaxApproval.setValue(project.isIncludeOnlyMaxApproval()); + includeReviewedOn.setValue(!project.isHideReviewedOn()); + final boolean isAll = project.getParent(Gerrit.getConfig().getWildProject()) == null; + cherryPickHeader.setVisible(!isAll); + cherryPickPanel.setVisible(!isAll); + + Map<String, Boolean> hiddenFooters = project.getHiddenFooters(); + for (Entry<String, CheckBox> entry : approvalsInFooter.entrySet()) { + final CheckBox checkBox = entry.getValue(); + if (hiddenFooters.containsKey(entry.getKey())) { + checkBox.setValue(!hiddenFooters.get(entry.getKey())); + } else { + checkBox.setValue(true); + } + } + saveProject.setEnabled(false); } @@ -291,12 +383,18 @@ public class ProjectInfoScreen extends ProjectScreen { project.setSubmitType(Project.SubmitType.valueOf(submitType .getValue(submitType.getSelectedIndex()))); } + project.setIncludeOnlyMaxApproval(includeOnlyMaxApproval.getValue()); + project.setHideReviewedOn(!includeReviewedOn.getValue()); + for (Entry<String, CheckBox> entry : approvalsInFooter.entrySet()) { + project.addHiddenFooter(entry.getKey(), !entry.getValue().getValue()); + } if (state.getSelectedIndex() >= 0) { project.setState(Project.State.valueOf(state .getValue(state.getSelectedIndex()))); } enableForm(false, false, false, false); + enableCherryPickOptions(false); Util.PROJECT_SVC.changeProjectSettings(project, new GerritCallback<ProjectDetail>() { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java index 2533feb970..47f286d9fb 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java @@ -1,4 +1,5 @@ // Copyright (C) 2009 The Android Open Source Project +// Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -69,6 +70,7 @@ class ProjectDetailFactory extends Handler<ProjectDetail> { detail.setCanModifyDescription(userIsOwner); detail.setCanModifyMergeType(userIsOwner); detail.setCanModifyState(userIsOwner); + detail.setCanModifyCherryPickOptions(userIsOwner); final InheritedBoolean useContributorAgreements = new InheritedBoolean(); final InheritedBoolean useSignedOffBy = new InheritedBoolean(); diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java index d2434964a9..5019e19c7b 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java @@ -1,4 +1,5 @@ // Copyright (C) 2008 The Android Open Source Project +// Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,6 +18,11 @@ package com.google.gerrit.reviewdb.client; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.StringKey; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** Projects match a source code repository managed by Gerrit */ public final class Project { /** Project name key */ @@ -65,6 +71,27 @@ public final class Project { } } + public static class ApprovalFooterValue { + String label; + boolean hidden; + + protected ApprovalFooterValue() { + } + + protected ApprovalFooterValue(final String label, final boolean on) { + this.label = label; + this.hidden = on; + } + + public String getLabel() { + return label; + } + + public boolean getHidden() { + return hidden; + } + } + public static enum SubmitType { FAST_FORWARD_ONLY, @@ -115,13 +142,21 @@ public final class Project { protected String themeName; + protected boolean hideReviewedOn; + + protected boolean includeOnlyMaximumApprovals; + + protected List<ApprovalFooterValue> hiddenFooters; + protected Project() { + hiddenFooters = new ArrayList<Project.ApprovalFooterValue>(); } public Project(Project.NameKey nameKey) { name = nameKey; submitType = SubmitType.MERGE_IF_NECESSARY; state = State.ACTIVE; + hiddenFooters = new ArrayList<Project.ApprovalFooterValue>(); useContributorAgreements = InheritableBoolean.INHERIT; useSignedOffBy = InheritableBoolean.INHERIT; requireChangeID = InheritableBoolean.INHERIT; @@ -164,6 +199,22 @@ public final class Project { useContributorAgreements = u; } + public boolean isHideReviewedOn() { + return hideReviewedOn; + } + + public boolean isIncludeOnlyMaxApproval() { + return includeOnlyMaximumApprovals; + } + + public Map<String, Boolean> getHiddenFooters() { + HashMap<String, Boolean> footers = new HashMap<String, Boolean>(); + for (ApprovalFooterValue value : hiddenFooters) { + footers.put(value.getLabel(), value.getHidden()); + } + return footers; + } + public void setUseSignedOffBy(final InheritableBoolean sbo) { useSignedOffBy = sbo; } @@ -176,6 +227,14 @@ public final class Project { requireChangeID = cid; } + public void setHideReviewedOn(boolean includeReviewedOn) { + this.hideReviewedOn = includeReviewedOn; + } + + public void setIncludeOnlyMaxApproval(boolean includeOnlyMaxApproval) { + this.includeOnlyMaximumApprovals = includeOnlyMaxApproval; + } + public SubmitType getSubmitType() { return submitType; } @@ -192,6 +251,17 @@ public final class Project { state = newState; } + public void addHiddenFooter(final String label, final boolean on) { + for (ApprovalFooterValue value : hiddenFooters) { + if (value.label.equals(label)) { + value.hidden = on; + return; + } + } + + hiddenFooters.add(new ApprovalFooterValue(label, on)); + } + public String getDefaultDashboard() { return defaultDashboardId; } @@ -224,6 +294,9 @@ public final class Project { requireChangeID = update.requireChangeID; submitType = update.submitType; state = update.state; + includeOnlyMaximumApprovals = update.includeOnlyMaximumApprovals; + hideReviewedOn = update.hideReviewedOn; + hiddenFooters = update.hiddenFooters; } /** diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java index ff6ce2555a..d3a3d9324b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java @@ -1,4 +1,5 @@ // Copyright (C) 2012 The Android Open Source Project +// Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -26,6 +27,7 @@ import com.google.gerrit.server.extensions.events.GitReferenceUpdated; import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gwtorm.server.OrmException; +import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.RefUpdate; @@ -122,13 +124,15 @@ public class CherryPick extends SubmitStrategy { throw new MergeException("Cannot merge " + n.name(), e); } catch (OrmException e) { throw new MergeException("Cannot merge " + n.name(), e); + } catch (ConfigInvalidException e) { + throw new MergeException("Cannot merge " + n.name(), e); } } return mergeTip; } private CodeReviewCommit writeCherryPickCommit(final CodeReviewCommit mergeTip, final CodeReviewCommit n) - throws IOException, OrmException { + throws IOException, OrmException, ConfigInvalidException { args.rw.parseBody(n); @@ -145,7 +149,10 @@ public class CherryPick extends SubmitStrategy { cherryPickCommitterIdent = args.myIdent; } - final String cherryPickCmtMsg = args.mergeUtil.createCherryPickCommitMessage(n); + final ProjectConfig cfg = new ProjectConfig(n.change.getProject()); + cfg.load(args.repo); + final String cherryPickCmtMsg = + args.mergeUtil.createCherryPickCommitMessage(n, cfg.getProject()); final CodeReviewCommit newCommit = args.mergeUtil.createCherryPickFromCommit(args.repo, args.inserter, mergeTip, n, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java index a625b6c3c0..3468e9775d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java @@ -21,6 +21,7 @@ import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.PatchSetApproval; import com.google.gerrit.reviewdb.client.PatchSetApproval.LabelId; +import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.config.CanonicalWebUrl; @@ -68,6 +69,7 @@ import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.TimeZone; @@ -238,7 +240,7 @@ public class MergeUtil { } } - public String createCherryPickCommitMessage(final CodeReviewCommit n) { + public String createCherryPickCommitMessage(final CodeReviewCommit n, final Project p) { final List<FooterLine> footers = n.getFooterLines(); final StringBuilder msgbuf = new StringBuilder(); msgbuf.append(n.getFullMessage()); @@ -266,7 +268,7 @@ public class MergeUtil { } final String siteUrl = urlProvider.get(); - if (siteUrl != null) { + if (!p.isHideReviewedOn() && siteUrl != null) { final String url = siteUrl + n.patchsetId.getParentKey().get(); if (!contains(footers, REVIEWED_ON, url)) { msgbuf.append(REVIEWED_ON.getName()); @@ -277,6 +279,7 @@ public class MergeUtil { } PatchSetApproval submitAudit = null; + final Map<String, Boolean> hiddenFooters = p.getHiddenFooters(); for (final PatchSetApproval a : getApprovalsForCommit(n)) { if (a.getValue() <= 0) { @@ -325,6 +328,7 @@ public class MergeUtil { } final String tag; + final String tagOrig = a.getLabelId().get(); if (isCodeReview(a.getLabelId())) { tag = "Reviewed-by"; } else if (isVerified(a.getLabelId())) { @@ -337,7 +341,18 @@ public class MergeUtil { tag = lt.getName(); } - if (!contains(footers, new FooterKey(tag), identbuf.toString())) { + if (p.isIncludeOnlyMaxApproval()) { + final LabelType lt = project.getLabelTypes().byLabel(a.getLabelId()); + if (lt == null) { + continue; + } + if (a.getValue() < lt.getMax().getValue()) { + continue; + } + } + + if (!hiddenFooters.containsKey(tagOrig) + && !contains(footers, new FooterKey(tag), identbuf.toString())) { msgbuf.append(tag); msgbuf.append(": "); msgbuf.append(identbuf); 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 bfaa97ea80..a2c56a4d5a 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 @@ -1,4 +1,5 @@ // Copyright (C) 2010 The Android Open Source Project +// Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -66,6 +67,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -129,6 +131,11 @@ public class ProjectConfig extends VersionedMetaData { private static final Set<String> LABEL_FUNCTIONS = ImmutableSet.of( "MaxWithBlock", "MaxNoBlock", "NoBlock", "NoOp"); + private static final String CHERRY_PICK = "cherryPick"; + private static final String LABEL_FOOTERS = "labelFooters"; + private static final String INCLUDE_ONLY_MAX_APPROVALS = "includeOnlyMaximumApprovals"; + private static final String HIDE_REVIEWED_ON = "includeReviewedOn"; + private static final SubmitType defaultSubmitAction = SubmitType.MERGE_IF_NECESSARY; private static final State defaultStateValue = @@ -380,6 +387,14 @@ public class ProjectConfig extends VersionedMetaData { p.setDefaultDashboard(rc.getString(DASHBOARD, null, KEY_DEFAULT)); p.setLocalDefaultDashboard(rc.getString(DASHBOARD, null, KEY_LOCAL_DEFAULT)); + p.setIncludeOnlyMaxApproval(rc.getBoolean(CHERRY_PICK, INCLUDE_ONLY_MAX_APPROVALS, false)); + p.setHideReviewedOn(rc.getBoolean(CHERRY_PICK, HIDE_REVIEWED_ON, false)); + + for (String label : rc.getNames(CHERRY_PICK, LABEL_FOOTERS)) { + final boolean value = rc.getBoolean(LABEL_FOOTERS, label, true); + p.addHiddenFooter(label, value); + } + loadAccountsSection(rc, groupsByName); loadContributorAgreements(rc, groupsByName); loadAccessSections(rc, groupsByName); @@ -712,6 +727,9 @@ public class ProjectConfig extends VersionedMetaData { set(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, p.getUseSignedOffBy(), Project.InheritableBoolean.INHERIT); set(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, p.getRequireChangeID(), Project.InheritableBoolean.INHERIT); + set(rc, CHERRY_PICK, null, INCLUDE_ONLY_MAX_APPROVALS, p.isIncludeOnlyMaxApproval()); + set(rc, CHERRY_PICK, null, HIDE_REVIEWED_ON, p.isHideReviewedOn()); + set(rc, SUBMIT, null, KEY_ACTION, p.getSubmitType(), defaultSubmitAction); set(rc, SUBMIT, null, KEY_MERGE_CONTENT, p.getUseContentMerge(), Project.InheritableBoolean.INHERIT); @@ -728,6 +746,15 @@ public class ProjectConfig extends VersionedMetaData { groupsByUUID.keySet().retainAll(keepGroups); saveLabelSections(rc); + final Map<String, Boolean> footers = p.getHiddenFooters(); + for (Entry<String, Boolean> entry : footers.entrySet()) { + if (!entry.getValue()) { + rc.unset(CHERRY_PICK, LABEL_FOOTERS, entry.getKey()); + } else { + rc.setBoolean(CHERRY_PICK, LABEL_FOOTERS, entry.getKey(), true); + } + } + saveConfig(PROJECT_CONFIG, rc); saveGroupList(); } |