[PATCH STABLE] diffstat: be more picky when marking file as 'binary' (issue2816)

Patrick Mezard pmezard at gmail.com
Mon Oct 24 06:48:43 CDT 2011


# HG changeset patch
# User Patrick Mezard <pmezard at gmail.com>
# Date 1319456479 -7200
# Branch stable
# Node ID d24dfadfd68e99e5c16654a1bb6b5c35297178da
# Parent  b74f74b482d8c875984216135e6ae1db17e401f0
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 @@
     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 @@
             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 @@
         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 @@
   $ 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 @@
 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:


More information about the Mercurial-devel mailing list