[PATCH 05/10] add patch series function

WEN Pingbo wengpingbo at gmail.com
Tue Aug 23 19:03:39 AEST 2016


Added a ForeignKey in submission, and linked releated patches by
'In-Reply-To' or the first 'References'.

Child emails must fill 'In-Reply-To' or 'References' with correct msg-id,
or the parent field will keep empty.

Signed-off-by: WEN Pingbo <wengpingbo at gmail.com>
---
 htdocs/css/style.css                          |  4 ++--
 patchwork/bin/parsemail.py                    | 12 +++++++++++
 patchwork/models.py                           |  1 +
 patchwork/templates/patchwork/submission.html | 14 +++++++++++++
 patchwork/views/patch.py                      | 30 +++++++++++++++++++++++++++
 5 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/htdocs/css/style.css b/htdocs/css/style.css
index f7f7b6a..702b7ed 100644
--- a/htdocs/css/style.css
+++ b/htdocs/css/style.css
@@ -336,9 +336,9 @@ div.patchform h3 {
 }
 
 div.patchform ul {
-	list-style-type: none;
 	padding-left: 0.2em;
-	margin-top: 0em;
+	margin-top: 0.5em;
+	margin-left: 1.5em;
 }
 
 /* forms */
diff --git a/patchwork/bin/parsemail.py b/patchwork/bin/parsemail.py
index 6f644da..bcc7982 100755
--- a/patchwork/bin/parsemail.py
+++ b/patchwork/bin/parsemail.py
@@ -318,6 +318,16 @@ def find_submission_for_comment(project, refs):
 
     return None
 
+def find_submission_for_ppatch(project, ref):
+    submission = None
+
+    if not ref == None:
+        try:
+            submission = Submission.objects.get(project=project, msgid=ref)
+        except Submission.DoesNotExist:
+            pass
+
+    return submission
 
 def split_prefixes(prefix):
     """Turn a prefix string into a list of prefix tokens."""
@@ -487,6 +497,7 @@ def parse_mail(mail, list_id=None):
     date = find_date(mail)
     headers = find_headers(mail)
     pull_url = find_pull_request(message)
+    parent = find_submission_for_ppatch(project, None if not refs else refs[0])
 
     # build objects
 
@@ -510,6 +521,7 @@ def parse_mail(mail, list_id=None):
             diff=diff,
             pull_url=pull_url,
             delegate=delegate,
+            parent=parent,
             state=find_state(mail))
         patch.save()
         LOGGER.debug('Patch saved')
diff --git a/patchwork/models.py b/patchwork/models.py
index 521b20c..bcc8f90 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -298,6 +298,7 @@ class Submission(EmailMixin, models.Model):
     # submission metadata
 
     name = models.CharField(max_length=255)
+    parent = models.ForeignKey('self', null=True, blank=True, related_name="children")
 
     # patchwork metadata
 
diff --git a/patchwork/templates/patchwork/submission.html b/patchwork/templates/patchwork/submission.html
index 088cceb..8f1386d 100644
--- a/patchwork/templates/patchwork/submission.html
+++ b/patchwork/templates/patchwork/submission.html
@@ -108,6 +108,20 @@ function toggle_headers(link_id, headers_id)
  </div>
 {% endif %}
 
+{% if patchseries %}
+<div class="patchform patchform-series">
+<h3>Patch Series</h3>
+
+<ul>
+{% for patch in patchseries %}
+    <li><a href="{% url 'patch-detail' patch_id=patch.id %}">{{ patch.name }}</a></li>
+{% endfor %}
+</ul>
+
+</div>
+{% endif %}
+
+
 {% if createbundleform %}
  <div class="patchform patchform-bundle">
   <h3>Bundling</h3>
diff --git a/patchwork/views/patch.py b/patchwork/views/patch.py
index 3346568..cd73d8b 100644
--- a/patchwork/views/patch.py
+++ b/patchwork/views/patch.py
@@ -32,6 +32,35 @@ from patchwork.forms import PatchForm, CreateBundleForm
 from patchwork.models import Patch, Project, Bundle, Submission
 from patchwork.views import generic_list, patch_to_mbox
 
+def find_patch_series(patch):
+    def find_child(parent):
+        series = []
+
+        subms = parent.children.all().only('id', 'name')
+        for subm in subms:
+            tmp = {}
+
+            tmp['id'] = subm.id
+            tmp['name'] = subm.name
+            series.append(tmp)
+
+            if subm.children.all():
+                series += find_child(subm)
+
+        return series
+
+    # find the top parent
+    parent = patch
+    while parent.parent:
+        parent = parent.parent
+
+    patches = find_child(parent)
+    if len(patches) == 0:
+        return None
+
+    # We assume the fisrt submission in a series is a patch, and
+    # url will automaticly switch to cover if a patch is not found
+    return [{'id':parent.id, 'name':parent.name}] + patches
 
 def patch(request, patch_id):
     # redirect to cover letters where necessary
@@ -104,6 +133,7 @@ def patch(request, patch_id):
     context['patchform'] = form
     context['createbundleform'] = createbundleform
     context['project'] = patch.project
+    context['patchseries'] = find_patch_series(patch)
 
     return render(request, 'patchwork/submission.html', context)
 
-- 
1.9.1



More information about the Patchwork mailing list