Mercurial > hg-stable
diff mercurial/patch.py @ 9642:7d17794f08a9
diffstat: with --git, mark binary files with Bin
Normally, diffs without any text insertions or deletions are reported
as having 0 lines changed by stock diffstat. Compatibility is
preserved with stock diffstat in this case, but when using --git,
binary files are marked with Bin as a means of clarification.
git diff --stat does something similar, though it also includes the
old and new file sizes.
author | Brodie Rao <me+hg@dackz.net> |
---|---|
date | Sun, 25 Oct 2009 02:53:33 +0200 |
parents | 5384a22ab698 |
children | ac3a68cb16eb |
line wrap: on
line diff
--- a/mercurial/patch.py Sun Oct 25 02:52:36 2009 +0200 +++ b/mercurial/patch.py Sun Oct 25 02:53:33 2009 +0200 @@ -1364,7 +1364,8 @@ 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 @@ 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 @@ # 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')