diff options
author | Robin Rosenberg <robin.rosenberg@dewire.com> | 2013-08-10 18:31:01 -0400 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org <gerrit@eclipse.org> | 2013-08-10 18:31:01 -0400 |
commit | c58405b0c305d9bc91b22858b8f2ede667596a57 (patch) | |
tree | 4f7d3f14e50bc0c2341d28a3f12a77f35ac903a1 /org.eclipse.jgit | |
parent | b6e5189c4ece48e65633c3a3ee79981004acfa6e (diff) | |
parent | b0ffacf1226e3c0b0d8fd6ed0beb7311e508dc14 (diff) | |
download | jgit-c58405b0c305d9bc91b22858b8f2ede667596a57.tar.gz jgit-c58405b0c305d9bc91b22858b8f2ede667596a57.zip |
Merge "Recognize CRLF when parsing the short message of a commit or tag"
Diffstat (limited to 'org.eclipse.jgit')
4 files changed, 35 insertions, 5 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java index 9f2ccfd97e..93d28aaf5a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java @@ -59,6 +59,7 @@ import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.util.RawParseUtils; +import org.eclipse.jgit.util.StringUtils; /** A commit reference to a commit in the DAG. */ public class RevCommit extends RevObject { @@ -421,7 +422,7 @@ public class RevCommit extends RevObject { final int msgE = RawParseUtils.endOfParagraph(raw, msgB); String str = RawParseUtils.decode(enc, raw, msgB, msgE); if (hasLF(raw, msgB, msgE)) - str = str.replace('\n', ' '); + str = StringUtils.replaceLineBreaksWithSpace(str); return str; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java index 12693a03e2..1a59b440c3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevTag.java @@ -58,6 +58,7 @@ import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.util.MutableInteger; import org.eclipse.jgit.util.RawParseUtils; +import org.eclipse.jgit.util.StringUtils; /** An annotated tag. */ public class RevTag extends RevObject { @@ -234,7 +235,7 @@ public class RevTag extends RevObject { final int msgE = RawParseUtils.endOfParagraph(raw, msgB); String str = RawParseUtils.decode(enc, raw, msgB, msgE); if (RevCommit.hasLF(raw, msgB, msgE)) - str = str.replace('\n', ' '); + str = StringUtils.replaceLineBreaksWithSpace(str); return str; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java index 9114d500ee..2f9a6d12c7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java @@ -1058,7 +1058,7 @@ public final class RawParseUtils { /** * Locate the end of a paragraph. * <p> - * A paragraph is ended by two consecutive LF bytes. + * A paragraph is ended by two consecutive LF bytes or CRLF pairs * * @param b * buffer to scan. @@ -1072,9 +1072,11 @@ public final class RawParseUtils { public static final int endOfParagraph(final byte[] b, final int start) { int ptr = start; final int sz = b.length; - while (ptr < sz && b[ptr] != '\n') + while (ptr < sz && (b[ptr] != '\n' && b[ptr] != '\r')) ptr = nextLF(b, ptr); - while (0 < ptr && start < ptr && b[ptr - 1] == '\n') + if (ptr > start && b[ptr - 1] == '\n') + ptr--; + if (ptr > start && b[ptr - 1] == '\r') ptr--; return ptr; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java index cb4895025d..bfefc50c3b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/StringUtils.java @@ -279,4 +279,30 @@ public final class StringUtils { public static boolean isEmptyOrNull(String stringValue) { return stringValue == null || stringValue.length() == 0; } + + /** + * Replace CRLF, CR or LF with a single space. + * + * @param in + * A string with line breaks + * @return in without line breaks + */ + public static String replaceLineBreaksWithSpace(String in) { + char[] buf = new char[in.length()]; + int o = 0; + for (int i = 0; i < buf.length; ++i) { + char ch = in.charAt(i); + if (ch == '\r') { + if (i + 1 < buf.length && in.charAt(i + 1) == '\n') { + buf[o++] = ' '; + ++i; + } else + buf[o++] = ' '; + } else if (ch == '\n') + buf[o++] = ' '; + else + buf[o++] = ch; + } + return new String(buf, 0, o); + } } |