[PATCH 05/10] parsemail: Handle series sent "in-reply-to"

Stephen Finucane stephen.finucane at intel.com
Mon Jun 13 20:41:37 AEST 2016


Take a series, "v2", sent as a reply to another, "v1", like so:

    [PATCH 0/3] A cover letter
      [PATCH 1/3] The first patch
      ...
      [PATCH v2 0/3] A cover letter
        [PATCH v2 1/3] The first patch
        ...

The current behavior for traversing references is oldest first. For
example, for "PATCH v2 1/3" above, the references field will look like
so:

    ["0/3", "v2 0/3", "v2 1/3"]

Where "0/3" corresponds to the message-id of "PATCH 0/3".

By traversing this way, patches sent in-reply-to an existing series
will always be linked to that series, instead of creating a new series,
as expected. Flip things around, and instead attempt to find series
using the most recent message-id first. This will ensure the most
recent series is always used.

Signed-off-by: Stephen Finucane <stephen.finucane at intel.com>
---
 patchwork/bin/parsemail.py |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/patchwork/bin/parsemail.py b/patchwork/bin/parsemail.py
index f52776e..8baacf6 100755
--- a/patchwork/bin/parsemail.py
+++ b/patchwork/bin/parsemail.py
@@ -137,7 +137,7 @@ def find_series(mail):
     """
     series = None
 
-    for ref in find_references(mail) + [mail.get('Message-ID').strip()]:
+    for ref in [mail.get('Message-ID').strip()] + find_references(mail)[::-1]:
         # try parsing by RFC5322 fields first
         try:
             series_ref = SeriesReference.objects.get(msgid=ref)
@@ -575,6 +575,10 @@ def parse_mail(mail, list_id=None):
             series.save()
 
             for ref in refs + [msgid]:  # save references for series
+                # prevent duplication
+                if SeriesReference.objects.filter(msgid=ref).exists():
+                    continue
+
                 series_ref = SeriesReference(series=series,
                                              msgid=ref)
                 series_ref.save()
@@ -621,6 +625,10 @@ def parse_mail(mail, list_id=None):
                 series.save()
 
                 for ref in refs + [msgid]:  # save references for series
+                    # prevent duplication
+                    if SeriesReference.objects.filter(msgid=ref).exists():
+                        continue
+
                     series_ref = SeriesReference(series=series,
                                                  msgid=ref)
                     series_ref.save()
-- 
1.7.4.1



More information about the Patchwork mailing list