On 06/13/2016 05:41 AM, Stephen Finucane wrote:
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 <[email protected]>
---
  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

I think this can be simplified and perhaps be less racy:
+                # prevent duplication
+                if SeriesReference.objects.filter(msgid=ref).exists():
+                    continue
+
                  series_ref = SeriesReference(series=series,
                                               msgid=ref)
                  series_ref.save()

   try:
       SeriesReference.objects.create(series=series, msgid=ref)
   except IntegrityError:
        pass # already exists

@@ -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()


_______________________________________________
Patchwork mailing list
[email protected]
https://lists.ozlabs.org/listinfo/patchwork

Reply via email to