diff mercurial/patch.py @ 15363:628a4a9e411d stable

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'.
author Patrick Mezard <pmezard@gmail.com>
date Mon, 24 Oct 2011 13:41:19 +0200
parents 2c4fdee4d1a8
children 2b1ec74c961f
line wrap: on
line diff
--- a/mercurial/patch.py	Mon Oct 24 10:41:10 2011 -0200
+++ b/mercurial/patch.py	Mon Oct 24 13:41:19 2011 +0200
@@ -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