fast-export: quote paths with spaces
authorJay Soffian <jaysoffian@gmail.com>
Wed, 27 Jun 2012 21:58:01 +0000 (17:58 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 28 Jun 2012 02:53:04 +0000 (19:53 -0700)
A path containing a space must be quoted when used as an
argument to either the copy or rename commands (because
unlike other commands, the path is not the final thing on
the line for those commands).

Commit 6280dfdc3b (fast-export: quote paths in output,
2011-08-05) previously attempted to fix fast-export's
quoting by passing all paths through quote_c_style().
However, that function does not consider the space to be a
character which requires quoting, so let's special-case the
space inside print_path(). This will cause space-containing
paths to also be quoted in other commands where such quoting
is not strictly necessary, but it does not hurt to do so.

The test from 6280dfdc3b did not detect this because, while
it does introduce renames in the export stream, it does not
actually turn on rename detection, so they were presented as
pairs of deletions/adds. Using "-M" reveals the bug.

Signed-off-by: Jay Soffian <jaysoffian@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fast-export.c
t/t9350-fast-export.sh

index 9836e6b7ca22e254c06d8d766d510ef43a8cbe90..e8a07c95e11dd4e8a305f586b3aafbda84c34a28 100644 (file)
@@ -185,6 +185,8 @@ static void print_path(const char *path)
        int need_quote = quote_c_style(path, NULL, NULL, 0);
        if (need_quote)
                quote_c_style(path, NULL, stdout, 0);
+       else if (strchr(path, ' '))
+               printf("\"%s\"", path);
        else
                printf("%s", path);
 }
index 950d0ff498fda58c2d3d68dfb2cf50512f8f81ba..79deef98870e4fdefc4989c09a24f2b9c8aad600 100755 (executable)
@@ -430,7 +430,7 @@ test_expect_success 'fast-export quotes pathnames' '
         git commit -m rename &&
         git read-tree --empty &&
         git commit -m deletion &&
-        git fast-export HEAD >export.out &&
+        git fast-export -M HEAD >export.out &&
         git rev-list HEAD >expect &&
         git init result &&
         cd result &&