[PATCH] mdiff: fix diff header generation for files with spaces (issue3357)

Patrick Mezard patrick at mezard.eu
Thu Apr 5 08:46:47 CDT 2012


# HG changeset patch
# User Patrick Mezard <patrick at mezard.eu>
# Date 1333633147 -7200
# Branch stable
# Node ID de87f746388db911ed51ff37ddd54e95a4999dfe
# Parent  8ca7187d479f87ac876f7371429bdd28c878f597
mdiff: fix diff header generation for files with spaces (issue3357)

diff ---/+++ should end filenames with a TAB when they contain spaces. Current
code failed to do so when only the +++ file had spaces. This only happened with
git renames from a name without space to one with space.

diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py
--- a/mercurial/mdiff.py
+++ b/mercurial/mdiff.py
@@ -156,10 +156,10 @@
     return ' '.join(parts) + '\n'
 
 def unidiff(a, ad, b, bd, fn1, fn2, r=None, opts=defaultopts):
-    def datetag(date, addtab=True):
+    def datetag(date, fn=None):
         if not opts.git and not opts.nodates:
             return '\t%s\n' % date
-        if addtab and ' ' in fn1:
+        if fn and ' ' in fn:
             return '\t\n'
         return '\n'
 
@@ -177,19 +177,19 @@
     elif not a:
         b = splitnewlines(b)
         if a is None:
-            l1 = '--- /dev/null%s' % datetag(epoch, False)
+            l1 = '--- /dev/null%s' % datetag(epoch)
         else:
-            l1 = "--- %s%s" % ("a/" + fn1, datetag(ad))
-        l2 = "+++ %s%s" % ("b/" + fn2, datetag(bd))
+            l1 = "--- %s%s" % ("a/" + fn1, datetag(ad, fn1))
+        l2 = "+++ %s%s" % ("b/" + fn2, datetag(bd, fn2))
         l3 = "@@ -0,0 +1,%d @@\n" % len(b)
         l = [l1, l2, l3] + ["+" + e for e in b]
     elif not b:
         a = splitnewlines(a)
-        l1 = "--- %s%s" % ("a/" + fn1, datetag(ad))
+        l1 = "--- %s%s" % ("a/" + fn1, datetag(ad, fn1))
         if b is None:
-            l2 = '+++ /dev/null%s' % datetag(epoch, False)
+            l2 = '+++ /dev/null%s' % datetag(epoch)
         else:
-            l2 = "+++ %s%s" % ("b/" + fn2, datetag(bd))
+            l2 = "+++ %s%s" % ("b/" + fn2, datetag(bd, fn2))
         l3 = "@@ -1,%d +0,0 @@\n" % len(a)
         l = [l1, l2, l3] + ["-" + e for e in a]
     else:
@@ -199,8 +199,8 @@
         if not l:
             return ""
 
-        l.insert(0, "--- a/%s%s" % (fn1, datetag(ad)))
-        l.insert(1, "+++ b/%s%s" % (fn2, datetag(bd)))
+        l.insert(0, "--- a/%s%s" % (fn1, datetag(ad, fn1)))
+        l.insert(1, "+++ b/%s%s" % (fn2, datetag(bd, fn2)))
 
     for ln in xrange(len(l)):
         if l[ln][-1] != '\n':
diff --git a/tests/test-diff-unified.t b/tests/test-diff-unified.t
--- a/tests/test-diff-unified.t
+++ b/tests/test-diff-unified.t
@@ -140,3 +140,54 @@
   +c3
   @@ -3,1 +4,0 @@ c4
   -c5
+
+  $ echo a > f1
+  $ hg ci -m movef2
+
+Test diff headers terminating with TAB when necessary (issue3357)
+Regular diff --nodates, file creation
+
+  $ hg mv f1 'f 1'
+  $ echo b > 'f 1'
+  $ hg diff --nodates 'f 1'
+  diff -r 7574207d0d15 f 1
+  --- /dev/null
+  +++ b/f 1	
+  @@ -0,0 +1,1 @@
+  +b
+
+Git diff, adding space
+
+  $ hg diff --git
+  diff --git a/f1 b/f 1
+  rename from f1
+  rename to f 1
+  --- a/f1
+  +++ b/f 1	
+  @@ -1,1 +1,1 @@
+  -a
+  +b
+
+Regular diff --nodates, file deletion
+
+  $ hg ci -m addspace
+  $ hg mv 'f 1' f1
+  $ echo a > f1
+  $ hg diff --nodates 'f 1'
+  diff -r ca50fe67c9c7 f 1
+  --- a/f 1	
+  +++ /dev/null
+  @@ -1,1 +0,0 @@
+  -b
+
+Git diff, removing space
+
+  $ hg diff --git
+  diff --git a/f 1 b/f1
+  rename from f 1
+  rename to f1
+  --- a/f 1	
+  +++ b/f1
+  @@ -1,1 +1,1 @@
+  -b
+  +a


More information about the Mercurial-devel mailing list