Skip to content

Commit 301df23

Browse files
msohnGerrit Code Review @ Eclipse.org
authored andcommitted
Merge "Accept Change-Id even if footer contains not well-formed entries" into stable-2.3
2 parents 5d7b722 + 3b41fcb commit 301df23

2 files changed

Lines changed: 76 additions & 21 deletions

File tree

org.eclipse.jgit.test/tst/org/eclipse/jgit/util/ChangeIdUtilTest.java

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -642,29 +642,58 @@ public void testIndexOfChangeId() {
642642
assertEquals(3, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
643643
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n",
644644
"\n"));
645+
assertEquals(3, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
646+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n\n\n",
647+
"\n"));
648+
assertEquals(3, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
649+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n \n \n",
650+
"\n"));
651+
assertEquals(3, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
652+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n",
653+
"\n"));
654+
655+
// leading whitespace is rejected by Gerrit
656+
assertEquals(-1, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
657+
+ " Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n",
658+
"\n"));
659+
assertEquals(-1, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
660+
+ "\t Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n",
661+
"\n"));
662+
663+
assertEquals(-1, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
664+
+ "Change-Id: \n", "\n"));
665+
assertEquals(3, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
666+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701 \n",
667+
"\n"));
668+
assertEquals(12, ChangeIdUtil.indexOfChangeId("x\n" + "\n"
669+
+ "Bug 4711\n"
670+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n",
671+
"\n"));
672+
assertEquals(56, ChangeIdUtil.indexOfChangeId("x\n"
673+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n"
674+
+ "\n"
675+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n",
676+
"\n"));
677+
assertEquals(-1, ChangeIdUtil.indexOfChangeId("x\n"
678+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n"
679+
+ "\n" + "x\n", "\n"));
680+
assertEquals(-1, ChangeIdUtil.indexOfChangeId("x\n\n"
681+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n"
682+
+ "\n" + "x\n", "\n"));
645683
assertEquals(5, ChangeIdUtil.indexOfChangeId("x\r\n" + "\r\n"
646684
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\r\n",
647685
"\r\n"));
648686
assertEquals(3, ChangeIdUtil.indexOfChangeId("x\r" + "\r"
649687
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\r",
650688
"\r"));
689+
assertEquals(3, ChangeIdUtil.indexOfChangeId("x\r" + "\r"
690+
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\r",
691+
"\r"));
651692
assertEquals(8, ChangeIdUtil.indexOfChangeId("x\ny\n\nz\n" + "\n"
652693
+ "Change-Id: I3b7e4e16b503ce00f07ba6ad01d97a356dad7701\n",
653694
"\n"));
654695
}
655696

656-
@Test
657-
public void testIndexOfFirstFooterLine() {
658-
assertEquals(
659-
2,
660-
ChangeIdUtil.indexOfFirstFooterLine(new String[] { "a", "",
661-
"Bug: 42", "Signed-Off-By: j.developer@a.com" }));
662-
assertEquals(
663-
3,
664-
ChangeIdUtil.indexOfFirstFooterLine(new String[] { "a",
665-
"Bug: 42", "", "Signed-Off-By: j.developer@a.com" }));
666-
}
667-
668697
private void hookDoesNotModify(final String in) throws Exception {
669698
assertEquals(in, call(in));
670699
}

org.eclipse.jgit/src/org/eclipse/jgit/util/ChangeIdUtil.java

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,14 @@ public static ObjectId computeChangeId(final ObjectId treeId,
125125
private static final Pattern footerPattern = Pattern
126126
.compile("(^[a-zA-Z0-9-]+:(?!//).*$)"); //$NON-NLS-1$
127127

128+
private static final Pattern changeIdPattern = Pattern
129+
.compile("(^" + CHANGE_ID + " *I[a-f0-9]{40}$)"); //$NON-NLS-1$ //$NON-NLS-2$
130+
128131
private static final Pattern includeInFooterPattern = Pattern
129132
.compile("^[ \\[].*$"); //$NON-NLS-1$
130133

134+
private static final Pattern trailingWhitespace = Pattern.compile("\\s+$");
135+
131136
/**
132137
* Find the right place to insert a Change-Id and return it.
133138
* <p>
@@ -209,8 +214,11 @@ public static String insertId(String message, ObjectId changeId,
209214
}
210215

211216
/**
212-
* Find the index in the String {@code} message} where the Change-Id entry
213-
* begins
217+
* Return the index in the String {@code message} where the Change-Id entry
218+
* in the footer begins. If there are more than one entries matching the
219+
* pattern, return the index of the last one in the last section. Because of
220+
* Bug: 400818 we release the constraint here that a footer must contain
221+
* only lines matching {@code footerPattern}.
214222
*
215223
* @param message
216224
* @param delimiter
@@ -221,14 +229,32 @@ public static String insertId(String message, ObjectId changeId,
221229
*/
222230
public static int indexOfChangeId(String message, String delimiter) {
223231
String[] lines = message.split(delimiter);
224-
int footerFirstLine = indexOfFirstFooterLine(lines);
225-
if (footerFirstLine == lines.length)
226-
return -1;
232+
int indexOfChangeIdLine = 0;
233+
boolean inFooter = false;
234+
for (int i = lines.length - 1; i >= 0; --i) {
235+
if (!inFooter && isEmptyLine(lines[i]))
236+
continue;
237+
inFooter = true;
238+
if (changeIdPattern.matcher(trimRight(lines[i])).matches()) {
239+
indexOfChangeIdLine = i;
240+
break;
241+
} else if (isEmptyLine(lines[i]) || i == 0)
242+
return -1;
243+
}
244+
int indexOfChangeIdLineinString = 0;
245+
for (int i = 0; i < indexOfChangeIdLine; ++i)
246+
indexOfChangeIdLineinString += lines[i].length()
247+
+ delimiter.length();
248+
return indexOfChangeIdLineinString
249+
+ lines[indexOfChangeIdLine].indexOf(CHANGE_ID);
250+
}
251+
252+
private static boolean isEmptyLine(String line) {
253+
return line.trim().length() == 0;
254+
}
227255

228-
int indexOfFooter = 0;
229-
for (int i = 0; i < footerFirstLine; ++i)
230-
indexOfFooter += lines[i].length() + delimiter.length();
231-
return message.indexOf(CHANGE_ID, indexOfFooter);
256+
private static String trimRight(String s) {
257+
return trailingWhitespace.matcher(s).replaceAll(""); //$NON-NLS-1$
232258
}
233259

234260
/**

0 commit comments

Comments
 (0)