web: provide diff summary to the changeset page
This is the same message displayed at the end of the "diff --stat" command.
For example, "9 files changed, 1651 insertions(+), 2 deletions(-)".
The webutil.diffstatgen function allows the diffstat data to be lazily
calculated only once and then re-used.
--- a/mercurial/hgweb/webcommands.py Sat Jun 11 14:14:53 2011 -0500
+++ b/mercurial/hgweb/webcommands.py Sat Jun 11 21:11:43 2011 +0800
@@ -271,7 +271,8 @@
diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style)
parity = paritygen(web.stripecount)
- diffstat = webutil.diffstat(tmpl, ctx, parity)
+ diffstatgen = webutil.diffstatgen(ctx)
+ diffstat = webutil.diffstat(tmpl, ctx, diffstatgen, parity)
return tmpl('changeset',
diff=diffs,
@@ -286,6 +287,7 @@
desc=ctx.description(),
date=ctx.date(),
files=files,
+ diffsummary=lambda **x: webutil.diffsummary(diffstatgen),
diffstat=diffstat,
archives=web.archivelist(ctx.hex()),
tags=webutil.nodetagsdict(web.repo, ctx.node()),
--- a/mercurial/hgweb/webutil.py Sat Jun 11 14:14:53 2011 -0500
+++ b/mercurial/hgweb/webutil.py Sat Jun 11 21:11:43 2011 +0800
@@ -8,6 +8,7 @@
import os, copy
from mercurial import match, patch, scmutil, error, ui, util
+from mercurial.i18n import _
from mercurial.node import hex, nullid
def up(p):
@@ -211,11 +212,25 @@
yield tmpl('diffblock', parity=parity.next(),
lines=prettyprintlines(''.join(block)))
-def diffstat(tmpl, ctx, parity):
- '''Return a diffstat template for each file in the diff.'''
+def diffstatgen(ctx):
+ '''Generator function that provides the diffstat data.'''
stats = patch.diffstatdata(util.iterlines(ctx.diff()))
maxname, maxtotal, addtotal, removetotal, binary = patch.diffstatsum(stats)
+ while True:
+ yield stats, maxname, maxtotal, addtotal, removetotal, binary
+
+def diffsummary(statgen):
+ '''Return a short summary of the diff.'''
+
+ stats, maxname, maxtotal, addtotal, removetotal, binary = statgen.next()
+ return _(' %d files changed, %d insertions(+), %d deletions(-)\n') % (
+ len(stats), addtotal, removetotal)
+
+def diffstat(tmpl, ctx, statgen, parity):
+ '''Return a diffstat template for each file in the diff.'''
+
+ stats, maxname, maxtotal, addtotal, removetotal, binary = statgen.next()
files = ctx.files()
def pct(i):