[PATCH] parser: recognise git commit consisting only of empty new file
Daniel Axtens
dja at axtens.net
Thu Feb 28 15:29:53 AEDT 2019
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 <andrew.donnellan at au1.ibm.com>
Signed-off-by: Daniel Axtens <dja at axtens.net>
---
Apologies for the long radio silence. I'm now in a job where Patchwork
is slightly adjacent to my role, so I have a bit more flexibility to work
on it. The usual lack of promises apply.
---
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 946b66851d7c..712780a498c4 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -742,7 +742,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:)
@@ -752,7 +752,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)
#
@@ -782,7 +782,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('+++ '):
@@ -843,7 +844,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 000000000000..c3be48e6eb39
--- /dev/null
+++ b/patchwork/tests/mail/0021-git-empty-new-file.mbox
@@ -0,0 +1,32 @@
+From andrew.donnellan at au1.ibm.com Thu Feb 28 00:37:42 2019
+Delivered-To: dja at 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 <andrew.donnellan at au1.ibm.com>
+Subject: [snowpatch] [PATCH 1/3] Test commit; please ignore
+To: Daniel Axtens <dja at axtens.net>
+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 at lists.ozlabs.org
+https://lists.ozlabs.org/listinfo/snowpatch
+
+
diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py
index 664edd5bab44..ddbcf5b15a19 100644
--- a/patchwork/tests/test_parser.py
+++ b/patchwork/tests/test_parser.py
@@ -583,6 +583,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.19.1
More information about the Patchwork
mailing list