[PATCH 2/4] parser: allow series numbers at end of another prefix

Daniel Axtens dja at axtens.net
Wed Jan 31 02:36:09 AEDT 2018


We see some emails with e.g. "[PATCH1/8]" - no space between H and 1.

This is poor behaviour but we can accept it anyway.

Fixes: #126
Signed-off-by: Daniel Axtens <dja at axtens.net>
---
 patchwork/parser.py            |  7 ++++++-
 patchwork/tests/test_parser.py | 10 ++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/patchwork/parser.py b/patchwork/parser.py
index 8b3a712905b9..2cabb3cbc299 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -428,7 +428,12 @@ def parse_series_marker(subject_prefixes):
         (x, n) if markers found, else (None, None)
     """
 
-    regex = re.compile(r'^([0-9]+)(?:/| of )([0-9]+)$')
+    # Allow for there to be stuff before the number. This allows for
+    # e.g. "PATCH1/8" which we have seen in the wild. To allow
+    # e.g. PATCH100/123 to work, make the pre-number match
+    # non-greedy. To allow really pathological cases like v2PATCH12/15
+    # to work, allow it to match everthing (don't exclude numbers).
+    regex = re.compile(r'.*?([0-9]+)(?:/| of )([0-9]+)$')
     m = _find_matching_prefix(subject_prefixes, regex)
     if m:
         return (int(m.group(1)), int(m.group(2)))
diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py
index b7bf224cede0..20d70af12120 100644
--- a/patchwork/tests/test_parser.py
+++ b/patchwork/tests/test_parser.py
@@ -874,6 +874,16 @@ class SubjectTest(TestCase):
         self.assertEqual(parse_series_marker(['bar', '0/12']), (0, 12))
         self.assertEqual(parse_series_marker(['bar', '1 of 2']), (1, 2))
         self.assertEqual(parse_series_marker(['bar', '0 of 12']), (0, 12))
+        # Handle people missing the space between PATCH and the markers
+        # e.g. PATCH1/8
+        self.assertEqual(parse_series_marker(['PATCH1/8']), (1, 8))
+        self.assertEqual(parse_series_marker(['PATCH1 of 8']), (1, 8))
+        # verify the prefix-stripping is non-greedy
+        self.assertEqual(parse_series_marker(['PATCH100/123']), (100, 123))
+        # and that it is hard to confuse
+        self.assertEqual(parse_series_marker(['v2PATCH1/4']), (1, 4))
+        self.assertEqual(parse_series_marker(['v2', 'PATCH1/4']), (1, 4))
+        self.assertEqual(parse_series_marker(['v2.3PATCH1/4']), (1, 4))
 
     def test_version(self):
         self.assertEqual(parse_version('', []), 1)
-- 
2.14.1



More information about the Patchwork mailing list