summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIsmo Haataja <ismo.haataja@digia.com>2014-04-08 14:22:53 +0300
committerIsmo Haataja <ismo.haataja@digia.com>2014-06-12 14:07:34 +0200
commitbc9ced781bde591e626d9df6c334ddd7ab5c0ca1 (patch)
tree7e02ea19a4be96294216326b2e1866d71a57538f
parentf4c9a8da43dc4b48abaab6703756ec90edb21895 (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>
-rw-r--r--gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectDetail.java6
-rw-r--r--gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.java5
-rw-r--r--gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties4
-rw-r--r--gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java104
-rw-r--r--gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectDetailFactory.java2
-rw-r--r--gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java73
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java11
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java21
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java27
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();
}