changeset 4679:826659bd8053

git patches: correct handling of filenames with spaces Add a trailing TAB to the "--- filename" lines if there's a space in the file name. This allows patch(1) to work correctly. The same is done for diff --nodates. This was originally suggested by Andrei Vermel, but at the time I thought git was doing something different.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Fri, 22 Jun 2007 19:06:04 -0300
parents a814a5b11fff
children 059bdc8dfb9d
files mercurial/mdiff.py tests/test-git-export tests/test-git-export.out tests/test-git-import tests/test-git-import.out
diffstat 5 files changed, 37 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/mdiff.py
+++ b/mercurial/mdiff.py
@@ -50,8 +50,12 @@ class diffopts(object):
 defaultopts = diffopts()
 
 def unidiff(a, ad, b, bd, fn, r=None, opts=defaultopts):
-    def datetag(date):
-        return (opts.git or opts.nodates) and '\n' or '\t%s\n' % date
+    def datetag(date, addtab=True):
+        if not opts.git and not opts.nodates:
+            return '\t%s\n' % date
+        if addtab and ' ' in fn:
+            return '\t\n'
+        return '\n'
 
     if not a and not b: return ""
     epoch = util.datestr((0, 0))
@@ -66,7 +70,7 @@ def unidiff(a, ad, b, bd, fn, r=None, op
     elif not a:
         b = splitnewlines(b)
         if a is None:
-            l1 = '--- /dev/null%s' % datetag(epoch)
+            l1 = '--- /dev/null%s' % datetag(epoch, False)
         else:
             l1 = "--- %s%s" % ("a/" + fn, datetag(ad))
         l2 = "+++ %s%s" % ("b/" + fn, datetag(bd))
@@ -76,7 +80,7 @@ def unidiff(a, ad, b, bd, fn, r=None, op
         a = splitnewlines(a)
         l1 = "--- %s%s" % ("a/" + fn, datetag(ad))
         if b is None:
-            l2 = '+++ /dev/null%s' % datetag(epoch)
+            l2 = '+++ /dev/null%s' % datetag(epoch, False)
         else:
             l2 = "+++ %s%s" % ("b/" + fn, datetag(bd))
         l3 = "@@ -1,%d +0,0 @@\n" % len(a)
--- a/tests/test-git-export
+++ b/tests/test-git-export
@@ -140,3 +140,9 @@ hg mv brand-new2 brand-new3-2
 hg ci -m 'multiple renames/copies'
 hg diff --git -r -2 -r -1
 
+echo '% there should be a trailing TAB if there are spaces in the file name'
+echo foo > 'with spaces'
+hg add 'with spaces'
+hg diff --git
+hg ci -m 'add filename with spaces'
+
--- a/tests/test-git-export.out
+++ b/tests/test-git-export.out
@@ -145,3 +145,10 @@ rename to brand-new3
 diff --git a/brand-new2 b/brand-new3-2
 copy from brand-new2
 copy to brand-new3-2
+% there should be a trailing TAB if there are spaces in the file name
+diff --git a/with spaces b/with spaces
+new file mode 100644
+--- /dev/null
++++ b/with spaces	
+@@ -0,0 +1,1 @@
++foo
--- a/tests/test-git-import
+++ b/tests/test-git-import
@@ -181,3 +181,16 @@ Mc\${NkU|\`?^000jF3jhEB
 
 EOF
 hg manifest --debug | grep mbinary
+
+echo % filenames with spaces
+hg import -m spaces - <<EOF
+diff --git a/foo bar b/foo bar
+new file mode 100644
+index 0000000..257cc56
+--- /dev/null
++++ b/foo bar	
+@@ -0,0 +1 @@
++foo
+EOF
+cat "foo bar"
+
--- a/tests/test-git-import.out
+++ b/tests/test-git-import.out
@@ -60,3 +60,6 @@ 045c85ba38952325e126c70962cc0f9d9077bc67
 applying patch from stdin
 045c85ba38952325e126c70962cc0f9d9077bc67 644 mbinary1
 a874b471193996e7cb034bb301cac7bdaf3e3f46 644 mbinary2
+% filenames with spaces
+applying patch from stdin
+foo