[PATCH 03/10] parser: Set the delegate using Delegation rules

Mauro Carvalho Chehab mchehab at osg.samsung.com
Sat Nov 28 23:14:39 AEDT 2015


From: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab at osg.samsung.com>
---
 patchwork/bin/parsemail.py | 47 +++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 40 insertions(+), 7 deletions(-)

diff --git a/patchwork/bin/parsemail.py b/patchwork/bin/parsemail.py
index e66b55715d8f..4f22c7f2d6a0 100755
--- a/patchwork/bin/parsemail.py
+++ b/patchwork/bin/parsemail.py
@@ -25,13 +25,14 @@ import datetime
 import time
 import operator
 import codecs
+from fnmatch import fnmatch
 from email import message_from_file
 from email.header import Header, decode_header
 from email.utils import parsedate_tz, mktime_tz
 
-from patchwork.parser import parse_patch
+from patchwork.parser import parse_patch, patch_get_filenames
 from patchwork.models import Patch, Project, Person, Comment, State, \
-        get_default_initial_patch_state
+        DelegationRule, get_default_initial_patch_state
 import django
 from django.contrib.auth.models import User
 
@@ -208,6 +209,10 @@ def find_content(project, mail):
 
     patch = None
     comment = None
+    filenames = None
+
+    if patchbuf:
+        filenames = patch_get_filenames(patchbuf)
 
     if pullurl or patchbuf:
         name = clean_subject(mail.get('Subject'), [project.linkname])
@@ -225,12 +230,12 @@ def find_content(project, mail):
         else:
             cpatch = find_patch_for_comment(project, mail)
             if not cpatch:
-                return (None, None)
+                return (None, None, None)
             comment = Comment(patch = cpatch, date = mail_date(mail),
                     content = clean_content(commentbuf),
                     headers = mail_headers(mail))
 
-    return (patch, comment)
+    return (patch, comment, filenames)
 
 def find_patch_for_comment(project, mail):
     # construct a list of possible reply message ids
@@ -334,6 +339,31 @@ def get_state(state_name):
             pass
     return get_default_initial_patch_state()
 
+def auto_delegate(project, filenames):
+    if not filenames:
+        return None
+
+    rules = list(DelegationRule.objects.filter(project = project))
+
+    patch_delegate = None
+
+    for filename in filenames:
+        file_delegate = None
+        for rule in rules:
+            if fnmatch(filename, rule.path):
+                file_delegate = rule.user
+                break;
+
+        if file_delegate is None:
+            return None
+
+        if patch_delegate is not None and file_delegate != patch_delegate:
+            return None
+
+        patch_delegate = file_delegate
+
+    return patch_delegate
+
 def get_delegate(delegate_email):
     """ Return the delegate with the given email or None """
     if delegate_email:
@@ -368,9 +398,13 @@ def parse_mail(mail):
 
     (author, save_required) = find_author(mail)
 
-    (patch, comment) = find_content(project, mail)
+    (patch, comment, filenames) = find_content(project, mail)
 
     if patch:
+        delegate = get_delegate(mail.get('X-Patchwork-Delegate', '').strip())
+	if not delegate:
+	    delegate = auto_delegate(project, filenames)
+
         # we delay the saving until we know we have a patch.
         if save_required:
             author.save()
@@ -379,8 +413,7 @@ def parse_mail(mail):
         patch.msgid = msgid
         patch.project = project
         patch.state = get_state(mail.get('X-Patchwork-State', '').strip())
-        patch.delegate = get_delegate(
-                mail.get('X-Patchwork-Delegate', '').strip())
+        patch.delegate = delegate
         try:
             patch.save()
         except Exception, ex:
-- 
2.5.0



More information about the Patchwork mailing list