MozReview: Provide diffstat information in commits table (Bug 1286030) draft
authorDavid Walsh <dwalsh@mozilla.com>
Mon, 25 Jul 2016 15:32:54 -0500
changeset 9050 8faa27c711318709f8d93fb7a1275c747ee938b2
parent 9046 56f1d498eeede6ddbbd0f1431b391523b19aa1a6
push id1064
push userbmo:dwalsh@mozilla.com
push dateWed, 27 Jul 2016 15:08:58 +0000
bugs1286030
MozReview: Provide diffstat information in commits table (Bug 1286030) MozReview-Commit-ID: 763lRLfYhDx
pylib/mozreview/mozreview/static/mozreview/css/commits.less
pylib/mozreview/mozreview/templates/mozreview/commits.html
pylib/mozreview/mozreview/templatetags/mozreview.py
--- a/pylib/mozreview/mozreview/static/mozreview/css/commits.less
+++ b/pylib/mozreview/mozreview/static/mozreview/css/commits.less
@@ -62,29 +62,34 @@
         min-width: 18px;
       }
 
       & > .diff {
         flex: 0 0;
         min-width: 100px;
       }
 
+      & > .diffstat {
+        flex: 0 0;
+        min-width: 140px;
+      }
+
       & > .reviews {
-        flex: 5 0;
+        flex: 6 0;
         min-width: 300px;
       }
 
       & > .truncate_text {
         white-space: nowrap;
         overflow: hidden;
         text-overflow: ellipsis;
       }
 
       & > .reviewers {
-        flex: 4 1;
+        flex: 5 1;
         min-width: 100px;
       }
 
       & .reviewer-name {
         min-height: 10px;
         display: inline-block;
 
         &.reviewer-ship-it {
@@ -115,17 +120,29 @@
         min-width: 80px;
         white-space: nowrap;
       }
     }
   }
 
   & > tbody > tr {
     background-color: #FFFFFF;
+
+    & .diffstat {
+      font-size: 90%;
+
+      .diffstat-insert {
+        color: green;
+      }
+      .diffstat-delete {
+        color: #a02222;
+      }
+    }
   }
+
   & > tbody > tr[current="true"],
   & > tbody > tr:hover {
     background-color: #d4e0f3;
   }
 
    td,
    th {
      padding: 5px;
--- a/pylib/mozreview/mozreview/templates/mozreview/commits.html
+++ b/pylib/mozreview/mozreview/templates/mozreview/commits.html
@@ -19,16 +19,17 @@ This is the template for the "Commits" l
     <a href="{{parent_details.get_review_request.get_absolute_url}}">Review Summary</a>
     <a href="{{parent_details.get_review_request.get_absolute_url}}diff/#index_header">Squashed Diff</a>
   </div>
   <table id="mozreview-child-requests">
     <thead>
     <tr>
       <th class="hg">{% trans "Hg" %}</th>
       <th class="diff">{% trans "Diff" %}</th>
+      <th class="diffstat">{% trans "Changes" %}</th>
       <th class="reviews">{% trans "Reviews" %}</th>
       {% comment "TODO: show this column when the commit author will be available" %}
       <th class="submitter">{% trans "Submitter" %}</th>
       {% endcomment %}
       <th class="reviewers">{% trans "Reviewers" %}</th>
       <th class="status">
         {% trans "Landable" %}
         <div class="help-icon help-tooltip" title="{% trans "Hover over each commit's status to view landable status" %}"><span>?</span></div>
@@ -43,16 +44,19 @@ This is the template for the "Commits" l
         </a>
       </td>
       <td class="diff">
         <a title="See diff for commit {{child_details|commit_id|slice:":12"}}"
            class="commit_sha" href="{{child_details.get_review_request.get_absolute_url}}diff/#index_header">
           {{child_details|commit_id|slice:":12"}}
         </a>
       </td>
+      <td class="diffstat truncate_text">
+          {{ child_details.get_review_request|diffstat_text:user }}
+      </td>
       <td class="reviews truncate_text">
         <a class="mozreview_commit_summary" title="{{ child_details.summary}}" href="{{child_details.get_review_request.get_absolute_url}}">
           {{ child_details.summary }}
         </a>
       </td>
       {% comment "TODO: show this column when the commit author will be available" %}
       <td>{{ child_details.submitter }}</td>
       {% endcomment %}
--- a/pylib/mozreview/mozreview/templatetags/mozreview.py
+++ b/pylib/mozreview/mozreview/templatetags/mozreview.py
@@ -1,13 +1,17 @@
 from __future__ import absolute_import
 
 from django import template
 from django.contrib.auth.models import User
+from django.utils.safestring import SafeString
 
+from mozreview.diffviewer import (
+    get_diffstats,
+)
 from mozreview.extra_data import (
     COMMIT_ID_KEY,
     fetch_commit_data,
     is_parent,
     is_pushed,
 )
 from mozreview.review_helpers import get_reviewers_status
 
@@ -146,8 +150,36 @@ def userid_to_user(user_id):
 def review_flag_class(review_flag):
     reviewer_status_class_map = {
         'r?': 'review-pending',
         'r+': 'review-granted',
         'r-': 'review-denied',
         ' ': 'review-cleared'
     }
     return reviewer_status_class_map.get(review_flag)
+
+
+@register.filter()
+def diffstat_text(review_request, user):
+    stat = get_diffstats(review_request, user)
+    insert = separator = delete = ''
+
+    if stat['insert'] != 0:
+        insert = diffstat_rounded_label(stat['insert'])
+
+    if stat['insert'] != 0 and stat['delete'] != 0:
+        separator = ' / '
+
+    if stat['delete'] != 0:
+        delete = diffstat_rounded_label(stat['delete'], False)
+
+    return SafeString('%s%s%s' % (insert, separator, delete))
+
+
+def diffstat_rounded_label(num, is_addition=True):
+    base = 1000
+    template = '<span class="diffstat-%s">%s%s</span>'
+    label = '%s' % (num if num < base else '%sK' % int(num / base))
+
+    if(is_addition):
+        return template % ('insert', '+', label)
+    else:
+        return template % ('delete', '-', label)