summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.test
diff options
context:
space:
mode:
authorKamil Musin <kamilm@google.com>2023-11-24 15:17:26 +0100
committerKamil Musin <kamilm@google.com>2023-11-24 15:39:02 +0100
commit340cc787a0d14a0698d757a919ccd77e0a129fb0 (patch)
tree839a9ad48fe2c544eb08b7c0cdb8de968b71b707 /org.eclipse.jgit.test
parent2a739ad2c1e948b34f6644eca39aa75fe020309d (diff)
downloadjgit-340cc787a0d14a0698d757a919ccd77e0a129fb0.tar.gz
jgit-340cc787a0d14a0698d757a919ccd77e0a129fb0.zip
Improve footer parsing to allow multiline footers.
According to the https://git-scm.com/docs/git-interpret-trailers the CGit supports multiline trailers. Subsequent lines of such multiline trailers have to start with a whitespace. We also rewrite the original parsing code to make it easier to work with. The old code had pointers moving both backwards and forwards at the same time. In the rewritten code we first find the start of the last paragraph and then do all the parsing. Since all the getters of the FooterLine return String, I've considered rewriting the parsing code to operate on strings. However the original code seems to be written with the idea, that the data is only lazily copied in getters and no extra allocations should be performed during original parsing (ex. during RevWalk). The changed code keeps to this idea. Bug: Google b/312440626 Change-Id: Ie1e3b17a4a5ab767b771c95f00c283ea6c300220
Diffstat (limited to 'org.eclipse.jgit.test')
-rw-r--r--org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java51
1 files changed, 51 insertions, 0 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java
index 01f6a3a0a0..303aedcd00 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/FooterLineTest.java
@@ -318,6 +318,57 @@ public class FooterLineTest extends RepositoryTestCase {
assertFalse("not CC", line.matches(FooterKey.CC));
}
+ @Test
+ public void testMultilineFooters() {
+ String msg = buildMessage("subject\n\nbody of commit\n"
+ + "Not-A-Footer-Line: this line must not be read as a footer\n"
+ + "\n" // paragraph break, now footers appear in final block
+ + "Notes: The change must not be merged until dependency ABC is\n"
+ + " updated.\n"
+ + "CC: <some.mailing.list@example.com>\n"
+ + "not really a footer line but we'll skip it anyway\n"
+ + "Acked-by: Some Reviewer <sr@example.com>\n");
+ List<FooterLine> footers = FooterLine.fromMessage(msg);
+ FooterLine f;
+
+ assertNotNull(footers);
+ assertEquals(3, footers.size());
+
+ f = footers.get(0);
+ assertEquals("Notes", f.getKey());
+ assertEquals(
+ "The change must not be merged until dependency ABC is updated.",
+ f.getValue());
+
+ f = footers.get(1);
+ assertEquals("CC", f.getKey());
+ assertEquals("<some.mailing.list@example.com>", f.getValue());
+
+ f = footers.get(2);
+ assertEquals("Acked-by", f.getKey());
+ assertEquals("Some Reviewer <sr@example.com>", f.getValue());
+ }
+
+ @Test
+ public void testMultilineFooters_multipleWhitespaceAreAllowed() {
+ String msg = buildMessage("subject\n\nbody of commit\n"
+ + "Not-A-Footer-Line: this line must not be read as a footer\n"
+ + "\n" // paragraph break, now footers appear in final block
+ + "Notes: The change must not be merged until dependency ABC is\n"
+ + " updated.\n");
+ List<FooterLine> footers = FooterLine.fromMessage(msg);
+ FooterLine f;
+
+ assertNotNull(footers);
+ assertEquals(1, footers.size());
+
+ f = footers.get(0);
+ assertEquals("Notes", f.getKey());
+ assertEquals(
+ "The change must not be merged until dependency ABC is updated.",
+ f.getValue());
+ }
+
private String buildMessage(String msg) {
StringBuilder buf = new StringBuilder();
buf.append("tree " + ObjectId.zeroId().name() + "\n");