diff options
author | Robin Rosenberg <robin.rosenberg@dewire.com> | 2013-01-19 11:54:21 -0500 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org <gerrit@eclipse.org> | 2013-01-19 11:54:21 -0500 |
commit | 9f7b97c90ab065fa3d8fcc6392bda087664bbef9 (patch) | |
tree | 748dd9f9f2e1c536f96f90ca35ee91d2c4e4cffd /org.eclipse.jgit | |
parent | 6a3c360984328690b1242a5e92d210f13aaf459c (diff) | |
parent | 215a74ecebedba54c326f4dc51edb3795e807869 (diff) | |
download | jgit-9f7b97c90ab065fa3d8fcc6392bda087664bbef9.tar.gz jgit-9f7b97c90ab065fa3d8fcc6392bda087664bbef9.zip |
Merge changes I7e7fae12,I87ecca00
* changes:
Add conflicts message before footer
Only replace the ChangeId in the footer, not in the body
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeMessageFormatter.java | 25 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java | 95 |
2 files changed, 88 insertions, 32 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeMessageFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeMessageFormatter.java index 29fa8d65ad..d94e7280c1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeMessageFormatter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/MergeMessageFormatter.java @@ -48,6 +48,7 @@ import java.util.List; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.util.ChangeIdUtil; import org.eclipse.jgit.util.StringUtils; /** @@ -133,14 +134,26 @@ public class MergeMessageFormatter { */ public String formatWithConflicts(String message, List<String> conflictingPaths) { - StringBuilder sb = new StringBuilder(message); - if (!message.endsWith("\n") && message.length() != 0) //$NON-NLS-1$ - sb.append("\n"); //$NON-NLS-1$ - sb.append("\n"); //$NON-NLS-1$ - sb.append("Conflicts:\n"); + StringBuilder sb = new StringBuilder(); + String[] lines = message.split("\n"); //$NON-NLS-1$ + 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"); //$NON-NLS-1$ for (String conflictingPath : conflictingPaths) sb.append('\t').append(conflictingPath).append('\n'); - return sb.toString(); } private static String joinNames(List<String> names, String singular, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java index a869b2beac..41bb4cc7eb 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java @@ -161,36 +161,26 @@ public class ChangeIdUtil { */ public static String insertId(String message, ObjectId changeId, boolean replaceExisting) { - if (message.indexOf(CHANGE_ID) > 0) { - if (replaceExisting) { - int i = message.indexOf(CHANGE_ID) + 10; - while (message.charAt(i) == ' ') - i++; - String oldId = message.length() == (i + 40) ? - message.substring(i) : message.substring(i, i + 41); - message = message.replace(oldId, "I" + changeId.getName()); //$NON-NLS-1$ + int indexOfChangeId = indexOfChangeId(message, "\n"); //$NON-NLS-1$ + if (indexOfChangeId > 0) { + if (!replaceExisting) + return message; + else { + StringBuilder ret = new StringBuilder(message.substring(0, + indexOfChangeId)); + ret.append(CHANGE_ID); + ret.append(" I"); //$NON-NLS-1$ + ret.append(ObjectId.toString(changeId)); + int indexOfNextLineBreak = message.indexOf("\n", //$NON-NLS-1$ + indexOfChangeId); + if (indexOfNextLineBreak > 0) + ret.append(message.substring(indexOfNextLineBreak)); + return ret.toString(); } - return message; } String[] lines = message.split("\n"); //$NON-NLS-1$ - int footerFirstLine = lines.length; - for (int i = lines.length - 1; i > 1; --i) { - if (footerPattern.matcher(lines[i]).matches()) { - footerFirstLine = i; - continue; - } - if (footerFirstLine != lines.length && lines[i].length() == 0) { - break; - } - if (footerFirstLine != lines.length - && includeInFooterPattern.matcher(lines[i]).matches()) { - footerFirstLine = i + 1; - continue; - } - footerFirstLine = lines.length; - break; - } + int footerFirstLine = indexOfFirstFooterLine(lines); int insertAfter = footerFirstLine; for (int i = footerFirstLine; i < lines.length; ++i) { if (issuePattern.matcher(lines[i]).matches()) { @@ -217,4 +207,57 @@ public class ChangeIdUtil { } return ret.toString(); } + + /** + * Find the index in the String {@code} message} where the Change-Id entry + * begins + * + * @param message + * @param delimiter + * the line delimiter, like "\n" or "\r\n", needed to find the + * footer + * @return the index of the ChangeId footer in the message, or -1 if no + * ChangeId footer available + */ + public static int indexOfChangeId(String message, String delimiter) { + String[] lines = message.split(delimiter); + int footerFirstLine = indexOfFirstFooterLine(lines); + if (footerFirstLine == lines.length) + return -1; + + int indexOfFooter = 0; + for (int i = 0; i < footerFirstLine; ++i) + indexOfFooter += lines[i].length() + delimiter.length(); + return message.indexOf(CHANGE_ID, indexOfFooter); + } + + /** + * Find the index of the first line of the footer paragraph in an array of + * the lines, or lines.length if no footer is available + * + * @param lines + * the commit message split into lines and the line delimiters + * stripped off + * @return the index of the first line of the footer paragraph, or + * lines.length if no footer is available + */ + public static int indexOfFirstFooterLine(String[] lines) { + int footerFirstLine = lines.length; + for (int i = lines.length - 1; i > 1; --i) { + if (footerPattern.matcher(lines[i]).matches()) { + footerFirstLine = i; + continue; + } + if (footerFirstLine != lines.length && lines[i].length() == 0) + break; + if (footerFirstLine != lines.length + && includeInFooterPattern.matcher(lines[i]).matches()) { + footerFirstLine = i + 1; + continue; + } + footerFirstLine = lines.length; + break; + } + return footerFirstLine; + } } |