[yocto] [patchwork][PATCH] parsemail.py: Improve status-change-through-email

Jose Lamego jose.a.lamego at linux.intel.com
Tue Mar 28 16:59:34 PDT 2017


Patch status can be edited through email by project maintainers only
without any feedback if this is attempted by any other user,
providing a poor user experience.

This change extends the patch-status-through-email functionality
to be performed by the series submitter also, and provides a
system-generated message if an attempt was made through a message
using an email address not recognized neither as project maintainer or
series submitter in patchwork.

[YOCTO #11027]

Signed-off-by: Jose Lamego <jose.a.lamego at linux.intel.com>
---
 patchwork/bin/parsemail.py | 73 +++++++++++++++++++++++++++++++---------------
 1 file changed, 49 insertions(+), 24 deletions(-)

diff --git a/patchwork/bin/parsemail.py b/patchwork/bin/parsemail.py
index ebfa849..61c18b2 100755
--- a/patchwork/bin/parsemail.py
+++ b/patchwork/bin/parsemail.py
@@ -838,31 +838,56 @@ def parse_mail(mail):
         comment.msgid = msgid
         comment.save()
         LOGGER.debug('Comment saved')
-
-        # if comment's author has project-maintainer permissions,
-        # parse comment content and process the status-change command
-        # if it is found
-        if author.user and project in \
-                (author.user).profile.maintainer_projects.all():
-            cmd = None
-            comment_re = re.compile('^\[Patchwork-Status:\s*(Under Review|\
-Rejected|RFC|Not Applicable|Changes Requested|Awaiting Upstream|Superseded|\
-Deferred)\]$', re.M | re.I)
-            # if multiple valid status-change commands are found, use last one
-            for match in comment_re.finditer(comment.content):
-                cmd = re.sub(r'(\[Patchwork-Status:\s*)(.*)(\])', r'\2',
-                             "{}".format(match.group(0)))
-            if cmd is not None:
-                new_state = State.objects.get(name=cmd.title())
-                mod_patch = Patch.objects.get(pk=comment.patch.pk)
-                if new_state and mod_patch.state != new_state:
-                    mod_patch.state = new_state
-                    mod_patch.save()
-                    cmd_message = 'This is a system generated Comment: Patch \
-%s status was updated to "%s" due to request in comment.' % (
-                                  comment.patch.pk, cmd)
+        # look for a status-change command string in the comment
+        cmd = None
+        comment_re = re.compile('^(?:\n|\r\n?)\[Patchwork-Status:\s*\
+(Under Review|Rejected|RFC|Not Applicable|Changes Requested|Awaiting \
+Upstream|Superseded|Deferred)\](?:\n|\r\n?)$', re.M | re.I)
+        # if multiple valid status-change commands are found, use last one
+        for match in comment_re.finditer(comment.content):
+            cmd = re.sub(
+                r'((?:\n|\r\n?)\[Patchwork-Status:\s*)(.*)(\](?:\n|\r\n?))',
+                r'\2', "{}".format(match.group(0)))
+        # if a status-change command string is found, see if comment's author
+        # has either project-maintainer permissions or is the series submitter
+        # and process the command if true.
+        if cmd is not None:
+            refs = build_references_list(mail)
+            if not refs == []:
+                if not series:
+                    series = SeriesRevision.objects.filter(
+                        series__project=project,
+                        root_msgid=refs[-1]).reverse()[0].series
+                if (author.user and project in
+                    (author.user).profile.maintainer_projects.all()) or (
+                        author and author == series.submitter):
+                    new_state = State.objects.get(name=cmd.title())
+                    mod_patch = Patch.objects.get(pk=comment.patch.pk)
+                    if new_state and mod_patch.state != new_state:
+                        mod_patch.state = new_state
+                        mod_patch.save()
+                        cmd_message = 'This is a system generated Comment: \
+Patch %s status was updated to "%s"\ndue to request in comment body.' % (
+                            comment.patch.pk, cmd)
+                        cmd_msgid = "%s: System generated by comment %s" % (
+                            datetime.datetime.now().strftime("\
+%d%b%Y.%H:%M:%S.%f"), comment.pk)
+                        new_comment = Comment(pk=None, patch=comment.patch,
+                                              content=cmd_message,
+                                              date=datetime.datetime.now(),
+                                              submitter=comment.submitter,
+                                              msgid=cmd_msgid)
+                        new_comment.save()
+                else:
+                    # notify that a patch-status change was attempted without
+                    #  apropriate submitter/maintainer permissions
+                    cmd_message = 'This is a system generated Comment: \
+A command to change a patch-status through\nemail was detected in comment, \
+but the sender email does not belong either to\na project maintainer or to \
+the series submitter, the only approved users for\nthis function. \
+Ensure you are using an approved email address when submitting.'
                     cmd_msgid = "%s: System generated by comment %s" % (
-                                datetime.datetime.now().strftime("\
+                        datetime.datetime.now().strftime("\
 %d%b%Y.%H:%M:%S.%f"), comment.pk)
                     new_comment = Comment(pk=None, patch=comment.patch,
                                           content=cmd_message,
-- 
2.7.4




More information about the yocto mailing list