diff --git a/hgext/mq.py b/hgext/mq.py --- a/hgext/mq.py +++ b/hgext/mq.py @@ -429,7 +429,8 @@ class queue(object): write = fp is None and repo.ui.write or fp.write if stat: width = self.ui.interactive() and util.termwidth() or 80 - write(patch.diffstat(util.iterlines(chunks), width=width)) + write(patch.diffstat(util.iterlines(chunks), width=width, + git=self.diffopts().git)) else: for chunk in chunks: write(chunk) diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -1098,12 +1098,14 @@ def diff(ui, repo, *pats, **opts): if stat: opts['unified'] = '0' + diffopts = patch.diffopts(ui, opts) m = cmdutil.match(repo, pats, opts) - it = patch.diff(repo, node1, node2, match=m, opts=patch.diffopts(ui, opts)) + it = patch.diff(repo, node1, node2, match=m, opts=diffopts) if stat: width = ui.interactive() and util.termwidth() or 80 - ui.write(patch.diffstat(util.iterlines(it), width=width)) + ui.write(patch.diffstat(util.iterlines(it), width=width, + git=diffopts.git)) else: for chunk in it: ui.write(chunk) diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -1364,7 +1364,8 @@ def diffstatdata(lines): for line in lines: if line.startswith('diff'): if filename: - yield (filename, adds, removes) + isbinary = adds == 0 and removes == 0 + yield (filename, adds, removes, isbinary) # set numbers to 0 anyway when starting new file adds, removes = 0, 0 if line.startswith('diff --git'): @@ -1377,21 +1378,27 @@ def diffstatdata(lines): elif line.startswith('-') and not line.startswith('---'): removes += 1 if filename: - yield (filename, adds, removes) + isbinary = adds == 0 and removes == 0 + yield (filename, adds, removes, isbinary) -def diffstat(lines, width=80): +def diffstat(lines, width=80, git=False): output = [] stats = list(diffstatdata(lines)) maxtotal, maxname = 0, 0 totaladds, totalremoves = 0, 0 - for filename, adds, removes in stats: + hasbinary = False + for filename, adds, removes, isbinary in stats: totaladds += adds totalremoves += removes maxname = max(maxname, len(filename)) maxtotal = max(maxtotal, adds+removes) + if isbinary: + hasbinary = True countwidth = len(str(maxtotal)) + if hasbinary and countwidth < 3: + countwidth = 3 graphwidth = width - countwidth - maxname - 6 if graphwidth < 10: graphwidth = 10 @@ -1404,11 +1411,15 @@ def diffstat(lines, width=80): # if there were at least some changes. return max(i * graphwidth // maxtotal, int(bool(i))) - for filename, adds, removes in stats: + for filename, adds, removes, isbinary in stats: + if git and isbinary: + count = 'Bin' + else: + count = adds + removes pluses = '+' * scale(adds) minuses = '-' * scale(removes) output.append(' %-*s | %*s %s%s\n' % (maxname, filename, countwidth, - adds+removes, pluses, minuses)) + count, pluses, minuses)) if stats: output.append(_(' %d files changed, %d insertions(+), %d deletions(-)\n') diff --git a/tests/test-diffstat b/tests/test-diffstat --- a/tests/test-diffstat +++ b/tests/test-diffstat @@ -29,3 +29,6 @@ hg add b echo '% binary diffstat' hg diff --stat + +echo '% binary git diffstat' +hg diff --stat --git diff --git a/tests/test-diffstat.out b/tests/test-diffstat.out --- a/tests/test-diffstat.out +++ b/tests/test-diffstat.out @@ -8,5 +8,8 @@ a | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) % binary diffstat - b | 0 + b | 0 1 files changed, 0 insertions(+), 0 deletions(-) +% binary git diffstat + b | Bin + 1 files changed, 0 insertions(+), 0 deletions(-)