]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
parser: recognise git commit consisting only of empty new file
authorDaniel Axtens <dja@axtens.net>
Thu, 28 Feb 2019 04:29:53 +0000 (15:29 +1100)
committerStephen Finucane <stephen@that.guru>
Sat, 2 Mar 2019 15:41:29 +0000 (15:41 +0000)
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>
(cherry picked from commit 9dd0b5ba843ccac5cf768a1c34226abe8b85cf6d)

patchwork/parser.py
patchwork/tests/mail/0021-git-empty-new-file.mbox [new file with mode: 0644]
patchwork/tests/test_parser.py

index 0d335b71b806f04e19ba64ead7baa0c9e3a4e142..bafb8d88647aa893898b2bad187247041a31d281 100644 (file)
@@ -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 (file)
index 0000000..c3be48e
--- /dev/null
@@ -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
+
+
index b9336d377f279e4898f61367f206f897676f51fb..a4b3d710991dd9bbe64cfd8af04241fead69f390 100644 (file)
@@ -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'))