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.
--- a/mercurial/mdiff.py Thu Apr 05 19:15:23 2012 +0200
+++ b/mercurial/mdiff.py Thu Apr 05 15:39:07 2012 +0200
@@ -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':
--- a/tests/test-diff-unified.t Thu Apr 05 19:15:23 2012 +0200
+++ b/tests/test-diff-unified.t Thu Apr 05 15:39:07 2012 +0200
@@ -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