package org.eclipse.jgit.merge;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.ChangeIdUtil;
import org.eclipse.jgit.util.StringUtils;
public class MergeMessageFormatter {
public String format(List<Ref> refsToMerge, Ref target) {
StringBuilder sb = new StringBuilder();
sb.append("Merge ");
List<String> branches = new ArrayList<>();
List<String> remoteBranches = new ArrayList<>();
List<String> tags = new ArrayList<>();
List<String> commits = new ArrayList<>();
List<String> others = new ArrayList<>();
for (Ref ref : refsToMerge) {
if (ref.getName().startsWith(Constants.R_HEADS)) {
branches.add("'" + Repository.shortenRefName(ref.getName())
+ "'");
} else if (ref.getName().startsWith(Constants.R_REMOTES)) {
remoteBranches.add("'"
+ Repository.shortenRefName(ref.getName()) + "'");
} else if (ref.getName().startsWith(Constants.R_TAGS)) {
tags.add("'" + Repository.shortenRefName(ref.getName()) + "'");
} else {
ObjectId objectId = ref.getObjectId();
if (objectId != null && ref.getName().equals(objectId.getName())) {
commits.add("'" + ref.getName() + "'");
} else {
others.add(ref.getName());
}
}
}
List<String> listings = new ArrayList<>();
if (!branches.isEmpty())
listings.add(joinNames(branches, "branch", "branches"));
if (!remoteBranches.isEmpty())
listings.add(joinNames(remoteBranches, "remote-tracking branch",
"remote-tracking branches"));
if (!tags.isEmpty())
listings.add(joinNames(tags, "tag", "tags"));
if (!commits.isEmpty())
listings.add(joinNames(commits, "commit", "commits"));
if (!others.isEmpty())
listings.add(StringUtils.join(others, ", ", " and "));
sb.append(StringUtils.join(listings, ", "));
String targetName = target.getLeaf().getName();
if (!targetName.equals(Constants.R_HEADS + Constants.MASTER)) {
String targetShortName = Repository.shortenRefName(targetName);
sb.append(" into " + targetShortName);
}
return sb.toString();
}
public String formatWithConflicts(String message,
List<String> conflictingPaths) {
StringBuilder sb = new StringBuilder();
String[] lines = message.split("\n");
int firstFooterLine = ChangeIdUtil.indexOfFirstFooterLine(lines);
for (int i = 0; i < firstFooterLine; i++)
sb.append(lines[i]).append('\n');
if (firstFooterLine == lines.length && message.length() != 0)
sb.append('\n');
addConflictsMessage(conflictingPaths, sb);
if (firstFooterLine < lines.length)
sb.append('\n');
for (int i = firstFooterLine; i < lines.length; i++)
sb.append(lines[i]).append('\n');
return sb.toString();
}
private static void addConflictsMessage(List<String> conflictingPaths,
StringBuilder sb) {
sb.append("Conflicts:\n");
for (String conflictingPath : conflictingPaths) {
sb.append('\t').append(conflictingPath).append('\n');
}
}
private static String joinNames(List<String> names, String singular,
String plural) {
if (names.size() == 1) {
return singular + " " + names.get(0);
}
return plural + " " + StringUtils.join(names, ", ", " and ");
}
}