Include topic name in merge commit messages

When merging more than one commit, use the topic name from the top
of the series as the subject line of the merge message. This may
be a cleaner way to read history than "Merge changes Ic0ffee,...".
See the parent commit for an example of a merge where this would
have written a cleaner subject line.

For more than 5 commits in a series with no topic, elide the rest
in the subject line so it is more likely to fit into 80 columns
when merging into the master branch.

Change-Id: I0b3ac381cc79b4f0e4a1e333630c606b972f80d0
This commit is contained in:
Shawn Pearce
2013-12-26 16:09:15 -08:00
parent e9c62bb780
commit 9f3759b98e

View File

@@ -16,6 +16,10 @@ package com.google.gerrit.server.git;
import static com.google.common.base.Preconditions.checkArgument;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.reviewdb.client.Account;
@@ -69,6 +73,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
@@ -558,24 +563,7 @@ public class MergeUtil {
}
}
final StringBuilder msgbuf = new StringBuilder();
if (merged.size() == 1) {
final CodeReviewCommit c = merged.get(0);
rw.parseBody(c);
msgbuf.append("Merge \"");
msgbuf.append(c.getShortMessage());
msgbuf.append("\"");
} else {
msgbuf.append("Merge changes ");
for (final Iterator<CodeReviewCommit> i = merged.iterator(); i.hasNext();) {
msgbuf.append(i.next().change.getKey().abbreviate());
if (i.hasNext()) {
msgbuf.append(',');
}
}
}
StringBuilder msgbuf = new StringBuilder().append(summarize(rw, merged));
if (!R_HEADS_MASTER.equals(destBranch.get())) {
msgbuf.append(" into ");
msgbuf.append(destBranch.getShortName());
@@ -603,6 +591,39 @@ public class MergeUtil {
return (CodeReviewCommit) rw.parseCommit(commit(inserter, mergeCommit));
}
private String summarize(RevWalk rw, List<CodeReviewCommit> merged)
throws IOException {
if (merged.size() == 1) {
CodeReviewCommit c = merged.get(0);
rw.parseBody(c);
return String.format("Merge \"%s\"", c.getShortMessage());
}
LinkedHashSet<String> topics = new LinkedHashSet<>(4);
for (CodeReviewCommit c : merged) {
if (!Strings.isNullOrEmpty(c.change.getTopic())) {
topics.add(c.change.getTopic());
}
}
if (topics.size() == 1) {
return String.format("Merge topic '%s'", Iterables.getFirst(topics, null));
} else if (topics.size() > 1) {
return String.format("Merge topics '%s'", Joiner.on("', '").join(topics));
} else {
return String.format("Merge changes %s%s",
Joiner.on(',').join(Iterables.transform(
Iterables.limit(merged, 5),
new Function<CodeReviewCommit, String>() {
@Override
public String apply(CodeReviewCommit in) {
return in.change.getKey().abbreviate();
}
})),
merged.size() > 5 ? ", ..." : "");
}
}
public ThreeWayMerger newThreeWayMerger(final Repository repo,
final ObjectInserter inserter) {
return newThreeWayMerger(repo, inserter,