From 1f30af4345af31403ca12fe9f1f591fe5bbb70ab Mon Sep 17 00:00:00 2001
From: Xavier Morel <xmo@odoo.com>
Date: Mon, 4 Mar 2019 12:11:34 +0100
Subject: [PATCH] [IMP] runbot_merge: dashboard clarity

* split out truly awaiting PRs from those waiting on an event of some
  sort
* if a staging is active but doesn't have a state yet, it should be
  considered pending not cancelled

closes #74
---
 runbot_merge/models/pull_requests.py | 18 ++++++++++++++++++
 runbot_merge/views/templates.xml     | 13 +++++++++++--
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py
index b3762710..62c01aa5 100644
--- a/runbot_merge/models/pull_requests.py
+++ b/runbot_merge/models/pull_requests.py
@@ -440,6 +440,24 @@ class PullRequests(models.Model):
                             " PR is linked to an other non-ready PR"
     )
 
+    @property
+    def blocked(self):
+        if self.state not in ('ready', 'merged', 'closed'):
+            return True
+        if not (self.squash or self.merge_method):
+            return True
+
+        # can't be blocked on a co-dependent PR if it's a patch-*
+        if re.search(r':patch-\d+$', self.label):
+            return False
+
+        return bool(self.search_count([
+            ('id', '!=', self.id),
+            ('label', '=', self.label),
+            ('state', '!=', 'ready'),
+            ('priority', '!=', 0),
+        ]))
+
     @api.depends('head')
     def _compute_statuses(self):
         Commits = self.env['runbot_merge.commit']
diff --git a/runbot_merge/views/templates.xml b/runbot_merge/views/templates.xml
index fa60fef4..4a085ce6 100644
--- a/runbot_merge/views/templates.xml
+++ b/runbot_merge/views/templates.xml
@@ -53,7 +53,16 @@
                         <t t-if="ready_unstaged">
                             <h5 style="display: inline-block;">Awaiting</h5>
                             <ul class="list-inline" style="display: inline-block;">
-                                <li t-foreach="ready_unstaged" t-as="pr">
+                                <li t-foreach="ready_unstaged" t-as="pr" t-if="not pr.blocked">
+                                    <a t-attf-href="https://github.com/{{ pr.repository.name }}/pull/{{ pr.number }}"
+                                       t-att-title="pr.message.split('\n')[0]">
+                                        <t t-esc="pr.repository.name"/>#<t t-esc="pr.number"/>
+                                    </a>
+                                </li>
+                            </ul>
+                            <h5 style="display: inline-block;">Blocked</h5>
+                            <ul class="list-inline" style="display: inline-block;">
+                                <li t-foreach="ready_unstaged" t-as="pr" t-if="pr.blocked">
                                     <a t-attf-href="https://github.com/{{ pr.repository.name }}/pull/{{ pr.number }}"
                                        t-att-title="pr.message.split('\n')[0]">
                                         <t t-esc="pr.repository.name"/>#<t t-esc="pr.number"/>
@@ -71,7 +80,7 @@
             <t t-foreach="branch.staging_ids.sorted(lambda s: s.staged_at, reverse=True)[:6]" t-as="staging">
                 <t t-set="success" t-value="staging.state == 'success'"/>
                 <t t-set="failure" t-value="staging.state == 'failure'"/>
-                <t t-set="pending" t-value="staging.state == 'pending' and staging.active"/>
+                <t t-set="pending" t-value="staging.active and (not staging.state or staging.state == 'pending')"/>
                 <t t-set="stateclass">
                     <t t-if="success">bg-success</t>
                     <t t-if="failure">bg-danger</t>