MozReview: Provide diffstat information in commits table (
Bug 1286030)
MozReview-Commit-ID: 763lRLfYhDx
--- 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)