[PATCH v2] Fix parsing of interesing series reply structures
Stephen Fincane
stephen at that.guru
Fri Nov 18 12:16:20 AEDT 2016
On Thu, 2016-11-17 at 16:11 +1100, Daniel Axtens wrote:
> There are some things you probably shouldn't do on public
> mailing lists, but which people do anyway.
>
> The first, and most understandable, is this:
>
> - [PATCH 1/2] test: Add some lorem ipsum
> - [PATCH 2/2] test: Convert to Markdown
> - [PATCH v2 1/2] test: Add some lorem ipsum
> - [PATCH v2 2/2] test: Convert to Markdown
>
> We should correctly parse these by:
> - creating a new series if the version number changes
> - when deciding whether to create a SeriesReference, search by
> message-id alone, not the message-id/series pair. (Otherwise,
> we try to create a series ref for v1 2/2 in the series for v2,
> which breaks a uniqueness constraint.
>
> The second, and less excusable, is this:
>
> - [PATCH 1/2] test: Add some lorem ipsum
> - [PATCH 2/2] test: Convert to Markdown
> - [PATCH 1/2] test: Add some lorem ipsum
> - [PATCH 2/2] test: Convert to Markdown
>
> With this patch:
> - if we get a x/n for a series that already has an x/n, create a
> new series for it.
>
> Signed-off-by: Daniel Axtens <dja at axtens.net>
I've got two suggestions for improvement that I'd like to make when
merging, but they're non-blocking. Lovely, tidy fixes.
Reviewed-by: Stephen Finucane <stephen at that.guru>
> ---
>
> v2: - drop a hunk that I created during debugging but which was no
> longer required.
> - better support for the second scenario - I had mistakenly
> thought
> it wouldn't work because of an earier typo.
> ---
> patchwork/parser.py | 22 +-
> patchwork/tests/series/bugs-nocover-noversion.mbox | 222
> +++++++++++++++++++++
> patchwork/tests/series/bugs-nocover.mbox | 222
> +++++++++++++++++++++
> patchwork/tests/test_series.py | 43 ++++
> 4 files changed, 507 insertions(+), 2 deletions(-)
> create mode 100644 patchwork/tests/series/bugs-nocover-
> noversion.mbox
> create mode 100644 patchwork/tests/series/bugs-nocover.mbox
>
> diff --git a/patchwork/parser.py b/patchwork/parser.py
> index b1544c951a3f..c7890ea18c2d 100644
> --- a/patchwork/parser.py
> +++ b/patchwork/parser.py
> @@ -41,6 +41,7 @@ from patchwork.models import Person
> from patchwork.models import Project
> from patchwork.models import Series
> from patchwork.models import SeriesReference
> +from patchwork.models import SeriesPatch
> from patchwork.models import State
> from patchwork.models import Submission
>
> @@ -789,7 +790,16 @@ def parse_mail(mail, list_id=None):
> delegate = auto_delegate(project, filenames)
>
> series = find_series(mail)
> - if not series and n: # the series markers indicates a
> series
> + # We will create a new series if:
> + # - we have a patch number (x of n), and
> + # - either:
> + # * there is no series, or
> + # * the version doesn't match
> + # * we have a patch with this number already
> + if n and ((not series) or
> + (series.version != version) or
> + (SeriesPatch.objects.filter(series=series,
> number=x).count()
Instead of importing SeriesPatch, could we do:
series.patches.filter(number=x).exists()
Seems a little cleaner?
> + )):
> series = Series(date=date,
> submitter=author,
> version=version,
> @@ -803,7 +813,15 @@ def parse_mail(mail, list_id=None):
> # as the earlier patch does not reference the later one.
> for ref in refs + [msgid]:
> # we don't want duplicates
> - SeriesReference.objects.get_or_create(series=series,
> msgid=ref)
> + try:
> + # we could have a ref to a previous series. (For
> + # example, a series sent in reply to another
> + # series.) That should not create a series ref
> + # for this series, so check for the msg-id only,
> + # not the msg-id/series pair.
> + SeriesReference.objects.get(msgid=ref)
> + except SeriesReference.DoesNotExist:
> + SeriesReference.objects.create(series=series,
> msgid=ref)
I imagine that as soon as we meet a conflicting SeriesReference we
could (should?) exit. Python has a fancy try-except-else syntax for
exactly this use case:
try:
something
except Exception:
do something
else:
or something else
More information about the Patchwork
mailing list