# HG changeset patch # User Patrick Mezard # Date 2011-10-24 11:41:19 # Node ID 628a4a9e411d532af071794e41edda97af0ccb39 # Parent 60f93ddd61fd3a8ce5966c9860d536579b8d5299 diffstat: be more picky when marking file as 'binary' (issue2816) The 'Bin' marker was added to every changed file for which we could not find any diff changes. This included binary files but also copy/renames and mode changes. Since Mercurial regular diff format emits a 'Binary file XXX has changed' line when fed with binary files, we use that and the usual git marker to tell them from other cases. In particular, new empty files are no longer reported as binary. Still, this fix is not complete since copy/renames/mode changes are now reported as '0' lines changes, instead of 'Bin'. diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -1787,18 +1787,17 @@ def diffstatdata(lines): diffre = re.compile('^diff .*-r [a-z0-9]+\s(.*)$') results = [] - filename, adds, removes = None, 0, 0 + filename, adds, removes, isbinary = None, 0, 0, False def addresult(): if filename: - isbinary = adds == 0 and removes == 0 results.append((filename, adds, removes, isbinary)) for line in lines: if line.startswith('diff'): addresult() # set numbers to 0 anyway when starting new file - adds, removes = 0, 0 + adds, removes, isbinary = 0, 0, False if line.startswith('diff --git'): filename = gitre.search(line).group(1) elif line.startswith('diff -r'): @@ -1808,6 +1807,9 @@ def diffstatdata(lines): adds += 1 elif line.startswith('-') and not line.startswith('---'): removes += 1 + elif (line.startswith('GIT binary patch') or + line.startswith('Binary file')): + isbinary = True addresult() return results @@ -1832,7 +1834,7 @@ def diffstat(lines, width=80, git=False) return max(i * graphwidth // maxtotal, int(bool(i))) for filename, adds, removes, isbinary in stats: - if git and isbinary: + if isbinary: count = 'Bin' else: count = adds + removes diff --git a/tests/test-diffstat.t b/tests/test-diffstat.t --- a/tests/test-diffstat.t +++ b/tests/test-diffstat.t @@ -36,19 +36,21 @@ Narrow diffstat: $ hg ci -m appenda $ printf '\0' > c - $ hg add c + $ touch d + $ hg add c d Binary diffstat: $ hg diff --stat - c | 0 + c | Bin 1 files changed, 0 insertions(+), 0 deletions(-) Binary git diffstat: $ hg diff --stat --git c | Bin - 1 files changed, 0 insertions(+), 0 deletions(-) + d | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) $ hg ci -m createb @@ -58,7 +60,7 @@ Binary git diffstat: Filename with spaces diffstat: $ hg diff --stat - file with spaces | 0 + file with spaces | Bin 1 files changed, 0 insertions(+), 0 deletions(-) Filename with spaces git diffstat: