diff mbox

[V2] parser: fix wrong parsing of diff comments

Message ID 1473085906-12482-1-git-send-email-wengpingbo@gmail.com
State Accepted
Headers show

Commit Message

WEN Pingbo Sept. 5, 2016, 2:31 p.m. UTC
From: WEN Pingbo <wengpingbo@gmail.com>

If the subject of a submission is prefixed by 'Re:', then it can't be a
patch or cover letter.

Signed-off-by: WEN Pingbo <wengpingbo@gmail.com>
---
 patchwork/parser.py | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

Comments

WEN Pingbo Sept. 26, 2016, 2:50 a.m. UTC | #1
Hi, Stephen

I think you missed this patch. But I saw you have already merged
it, maybe it can give you some reference:)

2016-09-05 22:31 GMT+08:00 Pingbo Wen <wengpingbo@gmail.com>:
> From: WEN Pingbo <wengpingbo@gmail.com>
>
> If the subject of a submission is prefixed by 'Re:', then it can't be a
> patch or cover letter.
>
> Signed-off-by: WEN Pingbo <wengpingbo@gmail.com>
> ---
>  patchwork/parser.py | 34 ++++++++++++++++++++++------------
>  1 file changed, 22 insertions(+), 12 deletions(-)
>
> diff --git a/patchwork/parser.py b/patchwork/parser.py
> index 1805df8..a4b20a8 100644
> --- a/patchwork/parser.py
> +++ b/patchwork/parser.py
> @@ -303,6 +303,10 @@ def split_prefixes(prefix):
>
>      return [s for s in matches if s != '']
>
> +def subject_check(subject):
> +    comment_re = re.compile(r'^(re)[:\s]\s*', re.I)
> +
> +    return comment_re.match(subject)
>
>  def clean_subject(subject, drop_prefixes=None):
>      """Clean a Subject: header from an incoming patch.
> @@ -620,7 +624,9 @@ def parse_mail(mail, list_id=None):
>
>      msgid = mail.get('Message-Id').strip()
>      author = find_author(mail)
> -    name, prefixes = clean_subject(mail.get('Subject'), [project.linkname])
> +    subject = mail.get('Subject')
> +    name, prefixes = clean_subject(subject, [project.linkname])
> +    is_comment = subject_check(subject)
>      x, n = parse_series_marker(prefixes)
>      refs = find_references(mail)
>      date = find_date(mail)
> @@ -629,7 +635,7 @@ def parse_mail(mail, list_id=None):
>
>      # build objects
>
> -    if diff or pull_url:  # patches or pull requests
> +    if not is_comment and (diff or pull_url):  # patches or pull requests
>          # we delay the saving until we know we have a patch.
>          author.save()
>
> @@ -659,17 +665,18 @@ def parse_mail(mail, list_id=None):
>          # however, we need to see if a match already exists and, if
>          # not, assume that it is indeed a new cover letter
>          is_cover_letter = False
> -        if not refs == []:
> -            try:
> -                CoverLetter.objects.all().get(name=name)
> -            except CoverLetter.DoesNotExist:
> -                # if no match, this is a new cover letter
> +        if not is_comment:
> +            if not refs == []:
> +                try:
> +                    CoverLetter.objects.all().get(name=name)
> +                except CoverLetter.DoesNotExist:
> +                    # if no match, this is a new cover letter
> +                    is_cover_letter = True
> +                except CoverLetter.MultipleObjectsReturned:
> +                    # if multiple cover letters are found, just ignore
> +                    pass
> +            else:
>                  is_cover_letter = True
> -            except CoverLetter.MultipleObjectsReturned:
> -                # if multiple cover letters are found, just ignore
> -                pass
> -        else:
> -            is_cover_letter = True
>
>          if is_cover_letter:
>              author.save()
> @@ -694,6 +701,9 @@ def parse_mail(mail, list_id=None):
>      if not submission:
>          return
>
> +    if is_comment and diff:
> +        message += diff
> +
>      author.save()
>
>      comment = Comment(
> --
> 1.9.1
>
diff mbox

Patch

diff --git a/patchwork/parser.py b/patchwork/parser.py
index 1805df8..a4b20a8 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -303,6 +303,10 @@  def split_prefixes(prefix):
 
     return [s for s in matches if s != '']
 
+def subject_check(subject):
+    comment_re = re.compile(r'^(re)[:\s]\s*', re.I)
+
+    return comment_re.match(subject)
 
 def clean_subject(subject, drop_prefixes=None):
     """Clean a Subject: header from an incoming patch.
@@ -620,7 +624,9 @@  def parse_mail(mail, list_id=None):
 
     msgid = mail.get('Message-Id').strip()
     author = find_author(mail)
-    name, prefixes = clean_subject(mail.get('Subject'), [project.linkname])
+    subject = mail.get('Subject')
+    name, prefixes = clean_subject(subject, [project.linkname])
+    is_comment = subject_check(subject)
     x, n = parse_series_marker(prefixes)
     refs = find_references(mail)
     date = find_date(mail)
@@ -629,7 +635,7 @@  def parse_mail(mail, list_id=None):
 
     # build objects
 
-    if diff or pull_url:  # patches or pull requests
+    if not is_comment and (diff or pull_url):  # patches or pull requests
         # we delay the saving until we know we have a patch.
         author.save()
 
@@ -659,17 +665,18 @@  def parse_mail(mail, list_id=None):
         # however, we need to see if a match already exists and, if
         # not, assume that it is indeed a new cover letter
         is_cover_letter = False
-        if not refs == []:
-            try:
-                CoverLetter.objects.all().get(name=name)
-            except CoverLetter.DoesNotExist:
-                # if no match, this is a new cover letter
+        if not is_comment:
+            if not refs == []:
+                try:
+                    CoverLetter.objects.all().get(name=name)
+                except CoverLetter.DoesNotExist:
+                    # if no match, this is a new cover letter
+                    is_cover_letter = True
+                except CoverLetter.MultipleObjectsReturned:
+                    # if multiple cover letters are found, just ignore
+                    pass
+            else:
                 is_cover_letter = True
-            except CoverLetter.MultipleObjectsReturned:
-                # if multiple cover letters are found, just ignore
-                pass
-        else:
-            is_cover_letter = True
 
         if is_cover_letter:
             author.save()
@@ -694,6 +701,9 @@  def parse_mail(mail, list_id=None):
     if not submission:
         return
 
+    if is_comment and diff:
+        message += diff
+
     author.save()
 
     comment = Comment(