changeset 9640:9e76232fbfbe

diff: add --stat for diffstat output diff/qdiff --stat invokes patch.diffstat() on the diff output. When in interactive mode, the output's maximum width is determined by the terminal's width.
author Brodie Rao <me+hg@dackz.net>
date Sun, 25 Oct 2009 02:52:35 +0200
parents 5384a22ab698
children 9b99f158348a
files hgext/mq.py mercurial/commands.py tests/test-debugcomplete.out tests/test-diffstat tests/test-diffstat.out tests/test-help.out
diffstat 6 files changed, 67 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/mq.py	Sun Oct 25 02:35:35 2009 +0200
+++ b/hgext/mq.py	Sun Oct 25 02:52:35 2009 +0200
@@ -420,11 +420,19 @@
 
     def printdiff(self, repo, node1, node2=None, files=None,
                   fp=None, changes=None, opts={}):
+        stat = opts.get('stat')
+        if stat:
+            opts['unified'] = '0'
+
         m = cmdutil.match(repo, files, opts)
         chunks = patch.diff(repo, node1, node2, m, changes, self.diffopts())
         write = fp is None and repo.ui.write or fp.write
-        for chunk in chunks:
-            write(chunk)
+        if stat:
+            width = self.ui.interactive() and util.termwidth() or 80
+            write(patch.diffstat(util.iterlines(chunks), width=width))
+        else:
+            for chunk in chunks:
+                write(chunk)
 
     def mergeone(self, repo, mergeq, head, patch, rev):
         # first try just applying the patch
--- a/mercurial/commands.py	Sun Oct 25 02:35:35 2009 +0200
+++ b/mercurial/commands.py	Sun Oct 25 02:52:35 2009 +0200
@@ -1085,6 +1085,7 @@
 
     revs = opts.get('rev')
     change = opts.get('change')
+    stat = opts.get('stat')
 
     if revs and change:
         msg = _('cannot specify --rev and --change at the same time')
@@ -1095,10 +1096,17 @@
     else:
         node1, node2 = cmdutil.revpair(repo, revs)
 
+    if stat:
+        opts['unified'] = '0'
+
     m = cmdutil.match(repo, pats, opts)
     it = patch.diff(repo, node1, node2, match=m, opts=patch.diffopts(ui, opts))
-    for chunk in it:
-        ui.write(chunk)
+    if stat:
+        width = ui.interactive() and util.termwidth() or 80
+        ui.write(patch.diffstat(util.iterlines(it), width=width))
+    else:
+        for chunk in it:
+            ui.write(chunk)
 
 def export(ui, repo, *changesets, **opts):
     """dump the header and diffs for one or more changesets
@@ -3260,7 +3268,8 @@
      _('ignore changes in the amount of white space')),
     ('B', 'ignore-blank-lines', None,
      _('ignore changes whose lines are all blank')),
-    ('U', 'unified', '', _('number of lines of context to show'))
+    ('U', 'unified', '', _('number of lines of context to show')),
+    ('', 'stat', None, _('output diffstat-style summary of changes')),
 ]
 
 similarityopts = [
--- a/tests/test-debugcomplete.out	Sun Oct 25 02:35:35 2009 +0200
+++ b/tests/test-debugcomplete.out	Sun Oct 25 02:52:35 2009 +0200
@@ -167,7 +167,7 @@
 annotate: rev, follow, text, user, date, number, changeset, line-number, include, exclude
 clone: noupdate, rev, pull, uncompressed, ssh, remotecmd
 commit: addremove, close-branch, include, exclude, message, logfile, date, user
-diff: rev, change, text, git, nodates, show-function, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, include, exclude
+diff: rev, change, text, git, nodates, show-function, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude
 export: output, switch-parent, text, git, nodates
 forget: include, exclude
 init: ssh, remotecmd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-diffstat	Sun Oct 25 02:52:35 2009 +0200
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+hg init repo
+cd repo
+i=0; while (( $i < 213 )); do echo a >> a; i=$(($i + 1)); done
+hg add a
+
+echo '% wide diffstat'
+hg diff --stat
+
+echo '% diffstat width'
+COLUMNS=24 hg diff --config ui.interactive=true --stat
+
+hg ci -m adda
+
+cat >> a <<EOF
+a
+a
+a
+EOF
+
+echo '% narrow diffstat'
+hg diff --stat
+
+hg ci -m appenda
+
+printf '%b' '\x00' > b
+hg add b
+
+echo '% binary diffstat'
+hg diff --stat
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-diffstat.out	Sun Oct 25 02:52:35 2009 +0200
@@ -0,0 +1,12 @@
+% wide diffstat
+ a |  213 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 files changed, 213 insertions(+), 0 deletions(-)
+% diffstat width
+ a |  213 ++++++++++++++
+ 1 files changed, 213 insertions(+), 0 deletions(-)
+% narrow diffstat
+ a |  3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+% binary diffstat
+ b |  0 
+ 1 files changed, 0 insertions(+), 0 deletions(-)
--- a/tests/test-help.out	Sun Oct 25 02:35:35 2009 +0200
+++ b/tests/test-help.out	Sun Oct 25 02:52:35 2009 +0200
@@ -241,6 +241,7 @@
  -b --ignore-space-change  ignore changes in the amount of white space
  -B --ignore-blank-lines   ignore changes whose lines are all blank
  -U --unified              number of lines of context to show
+    --stat                 output diffstat-style summary of changes
  -I --include              include names matching the given patterns
  -X --exclude              exclude names matching the given patterns