#!/bin/sh # # Copyright (c) 2005 Junio C Hamano # global test_description := ''Pathnames with funny characters. This test tries pathnames with funny characters in the working tree, index, and tree objects. '' source ./test-lib.sh global HT := '' '' test_have_prereq MINGW || echo !2 >/dev/null > "Name with an$(HT)HT" if ! test -f "Name with an$(HT)HT" { # since FAT/NTFS does not allow tabs in filenames, skip this test global skip_all := ''Your filesystem does not allow tabs in filenames'' test_done } global p0 := ''no-funny'' global p1 := ''tabs ," (dq) and spaces'' global p2 := ''just space'' test_expect_success 'setup' ' cat >"$p0" <<-\EOF && 1. A quick brown fox jumps over the lazy cat, oops dog. 2. A quick brown fox jumps over the lazy cat, oops dog. 3. A quick brown fox jumps over the lazy cat, oops dog. EOF { cat "$p0" >"$p1" || :; } && { echo "Foo Bar Baz" >"$p2" || :; } ' test_expect_success 'setup: populate index and tree' ' git update-index --add "$p0" "$p2" && t0=$(git write-tree) ' test_expect_success 'ls-files prints space in filename verbatim' ' printf "%s\n" "just space" no-funny >expected && git ls-files >current && test_cmp expected current ' test_expect_success 'setup: add funny filename' ' git update-index --add "$p1" && t1=$(git write-tree) ' test_expect_success 'ls-files quotes funny filename' ' cat >expected <<-\EOF && just space no-funny "tabs\t,\" (dq) and spaces" EOF git ls-files >current && test_cmp expected current ' test_expect_success 'ls-files -z does not quote funny filename' ' cat >expected <<-\EOF && just space no-funny tabs ," (dq) and spaces EOF git ls-files -z >ls-files.z && perl -pe "y/\000/\012/" current && test_cmp expected current ' test_expect_success 'ls-tree quotes funny filename' ' cat >expected <<-\EOF && just space no-funny "tabs\t,\" (dq) and spaces" EOF git ls-tree -r $t1 >ls-tree && sed -e "s/^[^ ]* //" current && test_cmp expected current ' test_expect_success 'diff-index --name-status quotes funny filename' ' cat >expected <<-\EOF && A "tabs\t,\" (dq) and spaces" EOF git diff-index --name-status $t0 >current && test_cmp expected current ' test_expect_success 'diff-tree --name-status quotes funny filename' ' cat >expected <<-\EOF && A "tabs\t,\" (dq) and spaces" EOF git diff-tree --name-status $t0 $t1 >current && test_cmp expected current ' test_expect_success 'diff-index -z does not quote funny filename' ' cat >expected <<-\EOF && A tabs ," (dq) and spaces EOF git diff-index -z --name-status $t0 >diff-index.z && perl -pe "y/\000/\012/" current && test_cmp expected current ' test_expect_success 'diff-tree -z does not quote funny filename' ' cat >expected <<-\EOF && A tabs ," (dq) and spaces EOF git diff-tree -z --name-status $t0 $t1 >diff-tree.z && perl -pe y/\\000/\\012/ current && test_cmp expected current ' test_expect_success 'diff-tree --find-copies-harder quotes funny filename' ' cat >expected <<-\EOF && CNUM no-funny "tabs\t,\" (dq) and spaces" EOF git diff-tree -C --find-copies-harder --name-status $t0 $t1 >out && sed -e "s/^C[0-9]*/CNUM/" current && test_cmp expected current ' test_expect_success 'setup: remove unfunny index entry' ' git update-index --force-remove "$p0" ' test_expect_success 'diff-tree -M quotes funny filename' ' cat >expected <<-\EOF && RNUM no-funny "tabs\t,\" (dq) and spaces" EOF git diff-index -M --name-status $t0 >out && sed -e "s/^R[0-9]*/RNUM/" current && test_cmp expected current ' test_expect_success 'diff-index -M -p quotes funny filename' ' cat >expected <<-\EOF && diff --git a/no-funny "b/tabs\t,\" (dq) and spaces" similarity index NUM% rename from no-funny rename to "tabs\t,\" (dq) and spaces" EOF git diff-index -M -p $t0 >diff && sed -e "s/index [0-9]*%/index NUM%/" current && test_cmp expected current ' test_expect_success 'setup: mode change' ' chmod +x "$p1" ' test_expect_success 'diff-index -M -p with mode change quotes funny filename' ' cat >expected <<-\EOF && diff --git a/no-funny "b/tabs\t,\" (dq) and spaces" old mode 100644 new mode 100755 similarity index NUM% rename from no-funny rename to "tabs\t,\" (dq) and spaces" EOF git diff-index -M -p $t0 >diff && sed -e "s/index [0-9]*%/index NUM%/" current && test_cmp expected current ' test_expect_success 'diffstat for rename quotes funny filename' ' cat >expected <<-\EOF && "tabs\t,\" (dq) and spaces" 1 file changed, 0 insertions(+), 0 deletions(-) EOF git diff-index -M -p $t0 >diff && git apply --stat diffstat && sed -e "s/|.*//" -e "s/ *\$//" current && test_i18ncmp expected current ' test_expect_success 'numstat for rename quotes funny filename' ' cat >expected <<-\EOF && 0 0 "tabs\t,\" (dq) and spaces" EOF git diff-index -M -p $t0 >diff && git apply --numstat current && test_cmp expected current ' test_expect_success 'numstat without -M quotes funny filename' ' cat >expected <<-\EOF && 0 3 no-funny 3 0 "tabs\t,\" (dq) and spaces" EOF git diff-index -p $t0 >diff && git apply --numstat current && test_cmp expected current ' test_expect_success 'numstat for non-git rename diff quotes funny filename' ' cat >expected <<-\EOF && 0 3 no-funny 3 0 "tabs\t,\" (dq) and spaces" EOF git diff-index -p $t0 >git-diff && sed -ne "/^[-+@]/p" diff && git apply --numstat current && test_cmp expected current ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: { (SQ <"Pathnames with funny characters.\n"> <"\n"> <"This test tries pathnames with funny characters in the working\n"> <"tree, index, and tree objects.\n"> ) } spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HT) op:Equal rhs:{(SQ <"\t">)} spids:[27])] spids: [27] ) (AndOr children: [ (C {(test_have_prereq)} {(MINGW)}) (SimpleCommand words: [{(echo)}] redirects: [ (Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[41]) (Redir op_id: Redir_Great fd: -1 arg_word: {(DQ ("Name with an") (${ VSub_Name HT) (HT))} spids: [44] ) ] ) ] op_id: Op_DPipe ) (If arms: [ (if_arm cond: [ (Pipeline children: [(C {(test)} {(-f)} {(DQ ("Name with an") (${ VSub_Name HT) (HT))})] negated: True ) ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:skip_all) op: Equal rhs: {(SQ <"Your filesystem does not allow tabs in filenames">)} spids: [77] ) ] spids: [77] ) (C {(test_done)}) ] spids: [-1 70] ) ] spids: [-1 85] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:p0) op:Equal rhs:{(SQ )} spids:[88])] spids: [88] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:p1) op: Equal rhs: {(SQ <"tabs\t,\" (dq) and spaces">)} spids: [93] ) ] spids: [93] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:p2) op:Equal rhs:{(SQ <"just space">)} spids:[98])] spids: [98] ) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\tcat >\"$p0\" <<-\\EOF &&\n"> <"\t1. A quick brown fox jumps over the lazy cat, oops dog.\n"> <"\t2. A quick brown fox jumps over the lazy cat, oops dog.\n"> <"\t3. A quick brown fox jumps over the lazy cat, oops dog.\n"> <"\tEOF\n"> <"\n"> <"\t{ cat \"$p0\" >\"$p1\" || :; } &&\n"> <"\t{ echo \"Foo Bar Baz\" >\"$p2\" || :; }\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup: populate index and tree">)} {(SQ <"\n"> <"\tgit update-index --add \"$p0\" \"$p2\" &&\n"> <"\tt0=$(git write-tree)\n">)} ) (C {(test_expect_success)} {(SQ <"ls-files prints space in filename verbatim">)} { (SQ <"\n"> <"\tprintf \"%s\\n\" \"just space\" no-funny >expected &&\n"> <"\tgit ls-files >current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup: add funny filename">)} {(SQ <"\n"> <"\tgit update-index --add \"$p1\" &&\n"> <"\tt1=$(git write-tree)\n">)} ) (C {(test_expect_success)} {(SQ <"ls-files quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tjust space\n"> <"\tno-funny\n"> <"\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit ls-files >current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"ls-files -z does not quote funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tjust space\n"> <"\tno-funny\n"> <"\ttabs\t,\" (dq) and spaces\n"> <"\tEOF\n"> <"\tgit ls-files -z >ls-files.z &&\n"> <"\tperl -pe \"y/\\000/\\012/\" current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"ls-tree quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tjust space\n"> <"\tno-funny\n"> <"\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit ls-tree -r $t1 >ls-tree &&\n"> <"\tsed -e \"s/^[^\t]*\t//\" current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff-index --name-status quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tA\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-index --name-status $t0 >current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff-tree --name-status quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tA\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-tree --name-status $t0 $t1 >current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff-index -z does not quote funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tA\n"> <"\ttabs\t,\" (dq) and spaces\n"> <"\tEOF\n"> <"\tgit diff-index -z --name-status $t0 >diff-index.z &&\n"> <"\tperl -pe \"y/\\000/\\012/\" current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff-tree -z does not quote funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tA\n"> <"\ttabs\t,\" (dq) and spaces\n"> <"\tEOF\n"> <"\tgit diff-tree -z --name-status $t0 $t1 >diff-tree.z &&\n"> <"\tperl -pe y/\\\\000/\\\\012/ current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff-tree --find-copies-harder quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tCNUM\tno-funny\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-tree -C --find-copies-harder --name-status $t0 $t1 >out &&\n"> <"\tsed -e \"s/^C[0-9]*/CNUM/\" current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup: remove unfunny index entry">)} {(SQ <"\n"> <"\tgit update-index --force-remove \"$p0\"\n">)} ) (C {(test_expect_success)} {(SQ <"diff-tree -M quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tRNUM\tno-funny\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-index -M --name-status $t0 >out &&\n"> <"\tsed -e \"s/^R[0-9]*/RNUM/\" current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"diff-index -M -p quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tdiff --git a/no-funny \"b/tabs\\t,\\\" (dq) and spaces\"\n"> <"\tsimilarity index NUM%\n"> <"\trename from no-funny\n"> <"\trename to \"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-index -M -p $t0 >diff &&\n"> <"\tsed -e \"s/index [0-9]*%/index NUM%/\" current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup: mode change">)} {(SQ <"\n"> <"\tchmod +x \"$p1\"\n">)}) (C {(test_expect_success)} {(SQ <"diff-index -M -p with mode change quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\tdiff --git a/no-funny \"b/tabs\\t,\\\" (dq) and spaces\"\n"> <"\told mode 100644\n"> <"\tnew mode 100755\n"> <"\tsimilarity index NUM%\n"> <"\trename from no-funny\n"> <"\trename to \"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-index -M -p $t0 >diff &&\n"> <"\tsed -e \"s/index [0-9]*%/index NUM%/\" current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"diffstat for rename quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\t \"tabs\\t,\\\" (dq) and spaces\"\n"> <"\t 1 file changed, 0 insertions(+), 0 deletions(-)\n"> <"\tEOF\n"> <"\tgit diff-index -M -p $t0 >diff &&\n"> <"\tgit apply --stat diffstat &&\n"> <"\tsed -e \"s/|.*//\" -e \"s/ *\\$//\" current &&\n"> <"\ttest_i18ncmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"numstat for rename quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\t0\t0\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-index -M -p $t0 >diff &&\n"> <"\tgit apply --numstat current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"numstat without -M quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\t0\t3\tno-funny\n"> <"\t3\t0\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-index -p $t0 >diff &&\n"> <"\tgit apply --numstat current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_expect_success)} {(SQ <"numstat for non-git rename diff quotes funny filename">)} { (SQ <"\n"> <"\tcat >expected <<-\\EOF &&\n"> <"\t0\t3\tno-funny\n"> <"\t3\t0\t\"tabs\\t,\\\" (dq) and spaces\"\n"> <"\tEOF\n"> <"\tgit diff-index -p $t0 >git-diff &&\n"> <"\tsed -ne \"/^[-+@]/p\" diff &&\n"> <"\tgit apply --numstat current &&\n"> <"\ttest_cmp expected current\n"> ) } ) (C {(test_done)}) ] )