[PATCH] parser: Support single-patch "series"

Stephen Finucane stephen at that.guru
Tue Jun 27 06:49:45 AEST 2017


There are merits to supporting single-patch series, not least the
ability to provide two consistent interfaces that show _all_ patches in
the '/patches' endpoint and the '/series' endpoint.

Signed-off-by: Stephen Finucane <stephen at that.guru>
---
 patchwork/parser.py                                | 21 ++++--
 patchwork/tests/series/base-single-patch.mbox      | 34 +++++++++
 .../series/revision-threaded-to-single-patch.mbox  | 85 ++++++++++++++++++++++
 patchwork/tests/test_series.py                     | 38 ++++++++--
 4 files changed, 165 insertions(+), 13 deletions(-)
 create mode 100644 patchwork/tests/series/base-single-patch.mbox
 create mode 100644 patchwork/tests/series/revision-threaded-to-single-patch.mbox

diff --git a/patchwork/parser.py b/patchwork/parser.py
index aa5ac58..b6c8047 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -903,15 +903,20 @@ def parse_mail(mail, list_id=None):
             filenames = find_filenames(diff)
             delegate = find_delegate_by_filename(project, filenames)
 
-        series = find_series(project, mail)
+        # if we don't have a series marker, we will never have an existing
+        # series to match against.
+        series = None
+        if n:
+            series = find_series(project, mail)
+        else:
+            x = n = 1
+
         # We will create a new series if:
-        # - we have a patch number (x of n), and
-        # - either:
-        #    * there is no series, or
-        #    * we have a patch with this number already
-        if n and ((not series) or
-                  (SeriesPatch.objects.filter(series=series, number=x).count()
-                   )):
+        # - there is no existing series to assign this patch to, or
+        # - there is an existing series, but it already has a patch with this
+        #   number in it
+        if not series or (
+                SeriesPatch.objects.filter(series=series, number=x).count()):
             series = Series(project=project,
                             date=date,
                             submitter=author,
diff --git a/patchwork/tests/series/base-single-patch.mbox b/patchwork/tests/series/base-single-patch.mbox
new file mode 100644
index 0000000..a47c3cf
--- /dev/null
+++ b/patchwork/tests/series/base-single-patch.mbox
@@ -0,0 +1,34 @@
+From stephenfinucane at gmail.com Sun Sep 11 23:22:13 2016
+Return-Path: <stephenfinucane at gmail.com>
+From: Stephen Finucane <stephenfinucane at gmail.com>
+To: stephenfinucane at hotmail.com
+Subject: [PATCH] test: Add some lorem ipsum
+Date: Sun, 11 Sep 2016 23:22:03 +0100
+Message-ID: <1473632524-8585-2-git-send-email-stephenfinucane at gmail.com>
+X-Mailer: git-send-email 2.7.4
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Length: 670
+Lines: 22
+
+From: Stephen Finucane <stephenfinucane at hotmail.com>
+
+---
+ test.txt | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/test.txt b/test.txt
+index f75ba05..a6c61c0 100644
+--- a/test.txt
++++ b/test.txt
+@@ -1 +1,8 @@
+ Hello, world.
++
++Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras eget eleifend
++augue. Nullam at metus venenatis, laoreet neque nec, convallis mauris.
++Pellentesque aliquam at nisi et laoreet. Duis non nisl venenatis, rhoncus risus
++id, elementum felis. In hac habitasse platea dictumst. Nam sit amet maximus
++eros. Nam quis ligula ut tortor egestas bibendum. Nunc sed purus sit amet
++tellus commodo bibendum ut vel dolor.
+-- 
+2.7.4
diff --git a/patchwork/tests/series/revision-threaded-to-single-patch.mbox b/patchwork/tests/series/revision-threaded-to-single-patch.mbox
new file mode 100644
index 0000000..1e7b952
--- /dev/null
+++ b/patchwork/tests/series/revision-threaded-to-single-patch.mbox
@@ -0,0 +1,85 @@
+From stephenfinucane at gmail.com Sun Sep 11 23:22:13 2016
+Return-Path: <stephenfinucane at gmail.com>
+From: Stephen Finucane <stephenfinucane at gmail.com>
+To: stephenfinucane at hotmail.com
+Subject: [PATCH] test: Add some lorem ipsum
+Date: Sun, 11 Sep 2016 23:22:03 +0100
+Message-ID: <1473632524-8585-2-git-send-email-stephenfinucane at gmail.com>
+X-Mailer: git-send-email 2.7.4
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Length: 670
+Lines: 22
+
+From: Stephen Finucane <stephenfinucane at hotmail.com>
+
+---
+ test.txt | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/test.txt b/test.txt
+index f75ba05..a6c61c0 100644
+--- a/test.txt
++++ b/test.txt
+@@ -1 +1,8 @@
+ Hello, world.
++
++Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras eget eleifend
++augue. Nullam at metus venenatis, laoreet neque nec, convallis mauris.
++Pellentesque aliquam at nisi et laoreet. Duis non nisl venenatis, rhoncus risus
++id, elementum felis. In hac habitasse platea dictumst. Nam sit amet maximus
++eros. Nam quis ligula ut tortor egestas bibendum. Nunc sed purus sit amet
++tellus commodo bibendum ut vel dolor.
+-- 
+2.7.4
+
+
+From stephenfinucane at gmail.com Sun Sep 11 23:31:04 2016
+Return-Path: <stephenfinucane at gmail.com>
+From: Stephen Finucane <stephenfinucane at gmail.com>
+To: stephenfinucane at hotmail.com
+Subject: [PATCH v2] test: Add some lorem ipsum
+Date: Sun, 11 Sep 2016 23:30:54 +0100
+Message-ID: <1473633055-10316-2-git-send-email-stephenfinucane at gmail.com>
+X-Mailer: git-send-email 2.7.4
+In-Reply-To: <1473632524-8585-2-git-send-email-stephenfinucane at gmail.com>
+References: <1473632524-8585-2-git-send-email-stephenfinucane at gmail.com>
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Length: 1363
+Lines: 35
+
+From: Stephen Finucane <stephenfinucane at hotmail.com>
+
+This is a better commit message.
+---
+v2:
+- Add some additional content
+---
+ test.txt | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/test.txt b/test.txt
+index f75ba05..4478ac2 100644
+--- a/test.txt
++++ b/test.txt
+@@ -1 +1,17 @@
+ Hello, world.
++
++Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras eget eleifend
++augue. Nullam at metus venenatis, laoreet neque nec, convallis mauris.
++Pellentesque aliquam at nisi et laoreet. Duis non nisl venenatis, rhoncus risus
++id, elementum felis. In hac habitasse platea dictumst. Nam sit amet maximus
++eros. Nam quis ligula ut tortor egestas bibendum. Nunc sed purus sit amet
++tellus commodo bibendum ut vel dolor.
++
++Curabitur scelerisque tempus efficitur. Maecenas aliquet elementum quam, ac
++pharetra nisi gravida a. Nam vitae malesuada leo. Nam accumsan facilisis metus
++sed vulputate. Ut libero odio, tempor ac posuere vel, malesuada quis ex. Donec
++interdum ipsum et nibh molestie auctor eget in neque. Sed nec hendrerit enim.
++Etiam scelerisque non magna eu molestie. Maecenas dui quam, tempor quis ipsum
++eu, dapibus congue dui. Integer tincidunt accumsan tortor sed maximus. Praesent
++eu magna accumsan, consequat turpis quis, fringilla ante. Vestibulum nec
++maximus nulla. Donec vehicula nisl at pharetra eleifend.
+-- 
+2.7.4
diff --git a/patchwork/tests/test_series.py b/patchwork/tests/test_series.py
index 390ee51..c1ede06 100644
--- a/patchwork/tests/test_series.py
+++ b/patchwork/tests/test_series.py
@@ -94,6 +94,20 @@ class _BaseTestCase(TestCase):
 class BaseSeriesTest(_BaseTestCase):
     """Tests for a series without any revisions."""
 
+    def test_single_patch(self):
+        """Series with only a single patch.
+
+        Parse a "series" with only a single patch and no subject prefixes.
+
+        Input:
+
+          - [PATCH] test: Add some lorem ipsum
+        """
+        _, patches, _ = self._parse_mbox(
+            'base-single-patch.mbox', [0, 1, 0])
+
+        self.assertSerialized(patches, [1])
+
     def test_cover_letter(self):
         """Series with a cover letter.
 
@@ -291,6 +305,21 @@ class RevisedSeriesTest(_BaseTestCase):
         self.assertSerialized(patches, [2, 2])
         self.assertSerialized(covers, [1, 1])
 
+    def test_threaded_to_single_patch(self):
+        """Series with a revision sent in-reply-to a single-patch series.
+
+        Parse a series with a single patch, followed by a second revision of
+        the same. The second revision is correctly labeled but is sent in reply
+        to the original patch.
+
+          - [PATCH] test: Add some lorem ipsum
+            - [PATCH v2] test: Add some lorem ipsum
+        """
+        _, patches, _ = self._parse_mbox(
+            'revision-threaded-to-single-patch.mbox', [0, 2, 0])
+
+        self.assertSerialized(patches, [1, 1])
+
     def test_threaded_to_cover(self):
         """Series with a revision sent in-reply-to a cover.
 
@@ -427,8 +456,8 @@ class RevisedSeriesTest(_BaseTestCase):
         """Series with a reply with a diff but no number.
 
         The random message with the diff should not belong to the
-        series, as it lacks a n/N label. We expect 1 series and the
-        random message to be orphaned.
+        series, as it lacks a n/N label. We expect two series and the
+        random message to be assigned its own series.
 
         Input:
 
@@ -439,9 +468,8 @@ class RevisedSeriesTest(_BaseTestCase):
         covers, patches, _ = self._parse_mbox(
             'bugs-unnumbered.mbox', [1, 2, 0])
 
-        self.assertEqual(len([p for p in patches if p.latest_series]), 1)
-        self.assertEqual(len([p for p in patches if not p.latest_series]), 1)
-        self.assertSerialized(covers, [1])
+        self.assertSerialized(patches, [1, 1])
+        self.assertSerialized(covers, [1, 0])
 
     def test_reply_nocover_noversion(self):
         """Series with a revision sent without a version label or cover
-- 
2.9.4



More information about the Patchwork mailing list