summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Axtens <dja@axtens.net>2019-02-28 15:29:53 +1100
committerStephen Finucane <stephen@that.guru>2019-03-02 13:06:38 +0000
commit9dd0b5ba843ccac5cf768a1c34226abe8b85cf6d (patch)
tree3bbb013a72cd98e17146a43744518698a443ddbc
parent5d9cbb429d480e87f0cb7f50e231db91e1c3b3b2 (diff)
downloadpatchwork-9dd0b5ba843ccac5cf768a1c34226abe8b85cf6d.tar
patchwork-9dd0b5ba843ccac5cf768a1c34226abe8b85cf6d.tar.gz
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 <andrew.donnellan@au1.ibm.com> Signed-off-by: Daniel Axtens <dja@axtens.net> Reviewed-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Reviewed-by: Stephen Finucane <stephen@that.guru>
-rw-r--r--patchwork/parser.py10
-rw-r--r--patchwork/tests/mail/0021-git-empty-new-file.mbox32
-rw-r--r--patchwork/tests/test_parser.py5
3 files changed, 43 insertions, 4 deletions
diff --git a/patchwork/parser.py b/patchwork/parser.py
index 946b668..712780a 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 0000000..c3be48e
--- /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 <andrew.donnellan@au1.ibm.com>
+Subject: [snowpatch] [PATCH 1/3] Test commit; please ignore
+To: Daniel Axtens <dja@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@lists.ozlabs.org
+https://lists.ozlabs.org/listinfo/snowpatch
+
+
diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py
index 664edd5..ddbcf5b 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'))