From 0c60d688d0ac3cf41477970b9c8d299ef1d4227b Mon Sep 17 00:00:00 2001 From: Daniel Axtens Date: Thu, 28 Feb 2019 15:29:53 +1100 Subject: [PATCH] parser: recognise git commit consisting only of empty new file Commits with only an empty new file are liable to be missed. The parser state machine doesn't recognise the headers "new file mode" and "index": teach it about them. Add a test to demonstrate. It's a little bit academic as you don't usually send patches like that but sometimes you do, especially if you're a snowpatch dev :) Closes: #256 Reported-by: Andrew Donnellan Signed-off-by: Daniel Axtens Reviewed-by: Andrew Donnellan Reviewed-by: Stephen Finucane (cherry picked from commit 9dd0b5ba843ccac5cf768a1c34226abe8b85cf6d) --- patchwork/parser.py | 10 +++--- .../tests/mail/0021-git-empty-new-file.mbox | 32 +++++++++++++++++++ patchwork/tests/test_parser.py | 5 +++ 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 patchwork/tests/mail/0021-git-empty-new-file.mbox diff --git a/patchwork/parser.py b/patchwork/parser.py index 0d335b71..bafb8d88 100644 --- a/patchwork/parser.py +++ b/patchwork/parser.py @@ -751,7 +751,7 @@ def parse_patch(content): # 3: patch header line 2 (+++) # 4: patch hunk header line (@@ line) # 5: patch hunk content - # 6: patch meta header (rename from/rename to) + # 6: patch meta header (rename from/rename to/new file/index) # # valid transitions: # 0 -> 1 (diff, Index:) @@ -761,7 +761,7 @@ def parse_patch(content): # 3 -> 4 (@@ line) # 4 -> 5 (patch content) # 5 -> 1 (run out of lines from @@-specifed count) - # 1 -> 6 (rename from / rename to) + # 1 -> 6 (rename from / rename to / new file / index) # 6 -> 2 (---) # 6 -> 1 (other text) # @@ -791,7 +791,8 @@ def parse_patch(content): if line.startswith('--- '): state = 2 - if line.startswith(('rename from ', 'rename to ')): + if line.startswith(('rename from ', 'rename to ', + 'new file mode ', 'index ')): state = 6 elif state == 2: if line.startswith('+++ '): @@ -852,7 +853,8 @@ def parse_patch(content): else: state = 5 elif state == 6: - if line.startswith(('rename to ', 'rename from ')): + if line.startswith(('rename to ', 'rename from ', + 'new file mode ', 'index ')): patchbuf += buf + line buf = '' elif line.startswith('--- '): diff --git a/patchwork/tests/mail/0021-git-empty-new-file.mbox b/patchwork/tests/mail/0021-git-empty-new-file.mbox new file mode 100644 index 00000000..c3be48e6 --- /dev/null +++ b/patchwork/tests/mail/0021-git-empty-new-file.mbox @@ -0,0 +1,32 @@ +From andrew.donnellan@au1.ibm.com Thu Feb 28 00:37:42 2019 +Delivered-To: dja@axtens.net +Received: by 2002:a4a:2812:0:0:0:0:0 with SMTP id h18csp2242ooa; + Wed, 27 Feb 2019 16:37:59 -0800 (PST) +From: Andrew Donnellan +Subject: [snowpatch] [PATCH 1/3] Test commit; please ignore +To: Daniel Axtens +Date: Thu, 28 Feb 2019 11:37:42 +1100 +User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 + Thunderbird/60.5.1 +MIME-Version: 1.0 +Content-Language: en-AU + + +Doing some snowpatching. +--- + banana | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + create mode 100644 banana + +diff --git a/banana b/banana +new file mode 100644 +index 000000000000..e69de29bb2d1 +-- +2.11.0 + +_______________________________________________ +snowpatch mailing list +snowpatch@lists.ozlabs.org +https://lists.ozlabs.org/listinfo/snowpatch + + diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py index b9336d37..a4b3d710 100644 --- a/patchwork/tests/test_parser.py +++ b/patchwork/tests/test_parser.py @@ -597,6 +597,11 @@ class PatchParseTest(PatchTest): self.assertEqual(diff.count("\nrename to "), 2) self.assertEqual(diff.count('\n-a\n+b'), 1) + def test_git_new_empty_file(self): + diff, message = self._find_content('0021-git-empty-new-file.mbox') + self.assertTrue(diff is not None) + self.assertTrue(message is not None) + def test_cvs_format(self): diff, message = self._find_content('0007-cvs-format-diff.mbox') self.assertTrue(diff.startswith('Index')) -- 2.47.3