summaryrefslogtreecommitdiffstats
path: root/gerrit-server
diff options
context:
space:
mode:
authorIsmo Haataja <ismo.haataja@digia.com>2014-04-08 14:22:53 +0300
committerOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-06-20 19:25:46 +0200
commit13d7a710938489476309c7d384fee0f5f91e7e44 (patch)
treeff0417aac704dab6991378371b6c441c78e3393e /gerrit-server
parent44dc1922d3c82d72b37a0259adcea627c38b7ac6 (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>
Diffstat (limited to 'gerrit-server')
-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
3 files changed, 54 insertions, 5 deletions
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();
}