Recognize CRLF when parsing the short message of a commit or tag
Bug: 400707 Change-Id: I9b09bb88528af465018fc0278f5441f7e6b75986
This commit is contained in:
parent
c693a232b0
commit
b0ffacf122
|
@ -383,6 +383,19 @@ public void testParse_PublicParseMethod()
|
||||||
assertEquals(src.getMessage(), p.getFullMessage());
|
assertEquals(src.getMessage(), p.getFullMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParse_GitStyleMessageWithCRLF() throws Exception {
|
||||||
|
final String shortMsgIn = "This fixes a\r\nbug.\r\n\r\n";
|
||||||
|
final String shortMsg = "This fixes a bug.";
|
||||||
|
final String body = "We do it with magic and pixie dust\r\nand stuff.\r\n"
|
||||||
|
+ "\r\n\r\n"
|
||||||
|
+ "Signed-off-by: A U. Thor <author@example.com>\r\n";
|
||||||
|
final String fullMsg = shortMsgIn + "\r\n" + "\r\n" + body;
|
||||||
|
final RevCommit c = create(fullMsg);
|
||||||
|
assertEquals(fullMsg, c.getFullMessage());
|
||||||
|
assertEquals(shortMsg, c.getShortMessage());
|
||||||
|
}
|
||||||
|
|
||||||
private static ObjectId id(final String str) {
|
private static ObjectId id(final String str) {
|
||||||
return ObjectId.fromString(str);
|
return ObjectId.fromString(str);
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,4 +91,16 @@ public void testEqualsIgnoreCase4() {
|
||||||
assertTrue(StringUtils.equalsIgnoreCase("A", "a"));
|
assertTrue(StringUtils.equalsIgnoreCase("A", "a"));
|
||||||
assertTrue(StringUtils.equalsIgnoreCase("a", "A"));
|
assertTrue(StringUtils.equalsIgnoreCase("a", "A"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReplaceLineBreaks() {
|
||||||
|
assertEquals("a b c ",
|
||||||
|
StringUtils.replaceLineBreaksWithSpace("a b\nc\r"));
|
||||||
|
assertEquals("a b c ",
|
||||||
|
StringUtils.replaceLineBreaksWithSpace("a b\nc\n"));
|
||||||
|
assertEquals("a b c ",
|
||||||
|
StringUtils.replaceLineBreaksWithSpace("a b\nc\r\n"));
|
||||||
|
assertEquals("a b c d",
|
||||||
|
StringUtils.replaceLineBreaksWithSpace("a\r\nb\nc d"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,7 @@
|
||||||
import org.eclipse.jgit.lib.ObjectReader;
|
import org.eclipse.jgit.lib.ObjectReader;
|
||||||
import org.eclipse.jgit.lib.PersonIdent;
|
import org.eclipse.jgit.lib.PersonIdent;
|
||||||
import org.eclipse.jgit.util.RawParseUtils;
|
import org.eclipse.jgit.util.RawParseUtils;
|
||||||
|
import org.eclipse.jgit.util.StringUtils;
|
||||||
|
|
||||||
/** A commit reference to a commit in the DAG. */
|
/** A commit reference to a commit in the DAG. */
|
||||||
public class RevCommit extends RevObject {
|
public class RevCommit extends RevObject {
|
||||||
|
@ -421,7 +422,7 @@ public final String getShortMessage() {
|
||||||
final int msgE = RawParseUtils.endOfParagraph(raw, msgB);
|
final int msgE = RawParseUtils.endOfParagraph(raw, msgB);
|
||||||
String str = RawParseUtils.decode(enc, raw, msgB, msgE);
|
String str = RawParseUtils.decode(enc, raw, msgB, msgE);
|
||||||
if (hasLF(raw, msgB, msgE))
|
if (hasLF(raw, msgB, msgE))
|
||||||
str = str.replace('\n', ' ');
|
str = StringUtils.replaceLineBreaksWithSpace(str);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
import org.eclipse.jgit.lib.PersonIdent;
|
import org.eclipse.jgit.lib.PersonIdent;
|
||||||
import org.eclipse.jgit.util.MutableInteger;
|
import org.eclipse.jgit.util.MutableInteger;
|
||||||
import org.eclipse.jgit.util.RawParseUtils;
|
import org.eclipse.jgit.util.RawParseUtils;
|
||||||
|
import org.eclipse.jgit.util.StringUtils;
|
||||||
|
|
||||||
/** An annotated tag. */
|
/** An annotated tag. */
|
||||||
public class RevTag extends RevObject {
|
public class RevTag extends RevObject {
|
||||||
|
@ -234,7 +235,7 @@ public final String getShortMessage() {
|
||||||
final int msgE = RawParseUtils.endOfParagraph(raw, msgB);
|
final int msgE = RawParseUtils.endOfParagraph(raw, msgB);
|
||||||
String str = RawParseUtils.decode(enc, raw, msgB, msgE);
|
String str = RawParseUtils.decode(enc, raw, msgB, msgE);
|
||||||
if (RevCommit.hasLF(raw, msgB, msgE))
|
if (RevCommit.hasLF(raw, msgB, msgE))
|
||||||
str = str.replace('\n', ' ');
|
str = StringUtils.replaceLineBreaksWithSpace(str);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1058,7 +1058,7 @@ public static final int tagMessage(final byte[] b, int ptr) {
|
||||||
/**
|
/**
|
||||||
* Locate the end of a paragraph.
|
* Locate the end of a paragraph.
|
||||||
* <p>
|
* <p>
|
||||||
* A paragraph is ended by two consecutive LF bytes.
|
* A paragraph is ended by two consecutive LF bytes or CRLF pairs
|
||||||
*
|
*
|
||||||
* @param b
|
* @param b
|
||||||
* buffer to scan.
|
* buffer to scan.
|
||||||
|
@ -1072,9 +1072,11 @@ public static final int tagMessage(final byte[] b, int ptr) {
|
||||||
public static final int endOfParagraph(final byte[] b, final int start) {
|
public static final int endOfParagraph(final byte[] b, final int start) {
|
||||||
int ptr = start;
|
int ptr = start;
|
||||||
final int sz = b.length;
|
final int sz = b.length;
|
||||||
while (ptr < sz && b[ptr] != '\n')
|
while (ptr < sz && (b[ptr] != '\n' && b[ptr] != '\r'))
|
||||||
ptr = nextLF(b, ptr);
|
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--;
|
ptr--;
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -279,4 +279,30 @@ private StringUtils() {
|
||||||
public static boolean isEmptyOrNull(String stringValue) {
|
public static boolean isEmptyOrNull(String stringValue) {
|
||||||
return stringValue == null || stringValue.length() == 0;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue