(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: { (SQ (Token id:Id.Lit_Chars val:'Pathnames with funny characters.\n' span_id:15) (Token id:Id.Lit_Chars val:'\n' span_id:16) (Token id: Id.Lit_Chars val: 'This test tries pathnames with funny characters in the working\n' span_id: 17 ) (Token id:Id.Lit_Chars val:'tree, index, and tree objects.\n' span_id:18) ) } spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HT) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'\t' span_id:29))} spids: [27] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(test_have_prereq)} {(MINGW)}) (command.Simple words: [{(echo)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:41) fd: 2 arg_word: {(/dev/null)} ) (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:44) fd: -1 arg_word: {(DQ ('Name with an') (${ Id.VSub_Name HT) (HT))} ) ] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Pipeline children: [(C {(test)} {(-f)} {(DQ ('Name with an') (${ Id.VSub_Name HT) (HT))})] negated: T ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:skip_all) op: assign_op.Equal rhs: { (SQ (Token id: Id.Lit_Chars val: 'Your filesystem does not allow tabs in filenames' span_id: 79 ) ) } spids: [77] ) ] ) (C {(test_done)}) ] spids: [54 70] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:p0) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:no-funny span_id:90))} spids: [88] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:p1) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'tabs\t," (dq) and spaces' span_id:95))} spids: [93] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:p2) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'just space' span_id:100))} spids: [98] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:107))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:111) (Token id:Id.Lit_Chars val:'\tcat >"$p0" <<-\\EOF &&\n' span_id:112) (Token id:Id.Lit_Chars val:'\t1. A quick brown fox jumps over the lazy cat, oops dog.\n' span_id:113) (Token id: Id.Lit_Chars val: '\t2. A quick brown fox jumps over the lazy cat, oops dog.\n' span_id: 114 ) (Token id:Id.Lit_Chars val:'\t3. A quick brown fox jumps over the lazy cat, oops dog.\n' span_id:115) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:116) (Token id:Id.Lit_Chars val:'\n' span_id:117) (Token id:Id.Lit_Chars val:'\t{ cat "$p0" >"$p1" || :; } &&\n' span_id:118) (Token id:Id.Lit_Chars val:'\t{ echo "Foo Bar Baz" >"$p2" || :; }\n' span_id:119) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: populate index and tree' span_id:126))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:130) (Token id: Id.Lit_Chars val: '\tgit update-index --add "$p0" "$p2" &&\n' span_id: 131 ) (Token id:Id.Lit_Chars val:'\tt0=$(git write-tree)\n' span_id:132) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ls-files prints space in filename verbatim' span_id:139))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:143) (Token id: Id.Lit_Chars val: '\tprintf "%s\\n" "just space" no-funny >expected &&\n' span_id: 144 ) (Token id:Id.Lit_Chars val:'\tgit ls-files >current &&\n' span_id:145) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:146) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: add funny filename' span_id:153))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:157) (Token id:Id.Lit_Chars val:'\tgit update-index --add "$p1" &&\n' span_id:158) (Token id:Id.Lit_Chars val:'\tt1=$(git write-tree)\n' span_id:159) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ls-files quotes funny filename' span_id:166))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:170) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:171) (Token id:Id.Lit_Chars val:'\tjust space\n' span_id:172) (Token id:Id.Lit_Chars val:'\tno-funny\n' span_id:173) (Token id:Id.Lit_Chars val:'\t"tabs\\t,\\" (dq) and spaces"\n' span_id:174) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:175) (Token id:Id.Lit_Chars val:'\tgit ls-files >current &&\n' span_id:176) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:177) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ls-files -z does not quote funny filename' span_id:184))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:188) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\tjust space\n' span_id:190) (Token id:Id.Lit_Chars val:'\tno-funny\n' span_id:191) (Token id:Id.Lit_Chars val:'\ttabs\t," (dq) and spaces\n' span_id:192) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:193) (Token id:Id.Lit_Chars val:'\tgit ls-files -z >ls-files.z &&\n' span_id:194) (Token id: Id.Lit_Chars val: '\tperl -pe "y/\\000/\\012/" <ls-files.z >current &&\n' span_id: 195 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:196) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ls-tree quotes funny filename' span_id:203))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:207) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\tjust space\n' span_id:209) (Token id:Id.Lit_Chars val:'\tno-funny\n' span_id:210) (Token id:Id.Lit_Chars val:'\t"tabs\\t,\\" (dq) and spaces"\n' span_id:211) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:212) (Token id:Id.Lit_Chars val:'\tgit ls-tree -r $t1 >ls-tree &&\n' span_id:213) (Token id: Id.Lit_Chars val: '\tsed -e "s/^[^\t]*\t//" <ls-tree >current &&\n' span_id: 214 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:215) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-index --name-status quotes funny filename' span_id:222))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:226) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:227) (Token id:Id.Lit_Chars val:'\tA\t"tabs\\t,\\" (dq) and spaces"\n' span_id:228) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:229) (Token id:Id.Lit_Chars val:'\tgit diff-index --name-status $t0 >current &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:231) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-tree --name-status quotes funny filename' span_id:238))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:242) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:243) (Token id:Id.Lit_Chars val:'\tA\t"tabs\\t,\\" (dq) and spaces"\n' span_id:244) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:245) (Token id:Id.Lit_Chars val:'\tgit diff-tree --name-status $t0 $t1 >current &&\n' span_id:246) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:247) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-index -z does not quote funny filename' span_id:254))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:258) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\tA\n' span_id:260) (Token id:Id.Lit_Chars val:'\ttabs\t," (dq) and spaces\n' span_id:261) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:262) (Token id: Id.Lit_Chars val: '\tgit diff-index -z --name-status $t0 >diff-index.z &&\n' span_id: 263 ) (Token id:Id.Lit_Chars val:'\tperl -pe "y/\\000/\\012/" <diff-index.z >current &&\n' span_id:264) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:265) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-tree -z does not quote funny filename' span_id:272))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:276) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:277) (Token id:Id.Lit_Chars val:'\tA\n' span_id:278) (Token id:Id.Lit_Chars val:'\ttabs\t," (dq) and spaces\n' span_id:279) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:280) (Token id: Id.Lit_Chars val: '\tgit diff-tree -z --name-status $t0 $t1 >diff-tree.z &&\n' span_id: 281 ) (Token id:Id.Lit_Chars val:'\tperl -pe y/\\\\000/\\\\012/ <diff-tree.z >current &&\n' span_id:282) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:283) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'diff-tree --find-copies-harder quotes funny filename' span_id: 290 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:294) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\tCNUM\tno-funny\t"tabs\\t,\\" (dq) and spaces"\n' span_id:296) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:297) (Token id: Id.Lit_Chars val: '\tgit diff-tree -C --find-copies-harder --name-status $t0 $t1 >out &&\n' span_id: 298 ) (Token id:Id.Lit_Chars val:'\tsed -e "s/^C[0-9]*/CNUM/" <out >current &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:300) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: remove unfunny index entry' span_id:307))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:311) (Token id: Id.Lit_Chars val: '\tgit update-index --force-remove "$p0"\n' span_id: 312 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-tree -M quotes funny filename' span_id:319))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:323) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:324) (Token id:Id.Lit_Chars val:'\tRNUM\tno-funny\t"tabs\\t,\\" (dq) and spaces"\n' span_id:325) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:326) (Token id:Id.Lit_Chars val:'\tgit diff-index -M --name-status $t0 >out &&\n' span_id:327) (Token id: Id.Lit_Chars val: '\tsed -e "s/^R[0-9]*/RNUM/" <out >current &&\n' span_id: 328 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:329) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-index -M -p quotes funny filename' span_id:336))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:340) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:341) (Token id:Id.Lit_Chars val:'\tdiff --git a/no-funny "b/tabs\\t,\\" (dq) and spaces"\n' span_id:342) (Token id:Id.Lit_Chars val:'\tsimilarity index NUM%\n' span_id:343) (Token id:Id.Lit_Chars val:'\trename from no-funny\n' span_id:344) (Token id: Id.Lit_Chars val: '\trename to "tabs\\t,\\" (dq) and spaces"\n' span_id: 345 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:346) (Token id:Id.Lit_Chars val:'\tgit diff-index -M -p $t0 >diff &&\n' span_id:347) (Token id:Id.Lit_Chars val:'\tsed -e "s/index [0-9]*%/index NUM%/" <diff >current &&\n' span_id:348) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:349) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: mode change' span_id:356))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:360) (Token id:Id.Lit_Chars val:'\tchmod +x "$p1"\n' span_id:361) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'diff-index -M -p with mode change quotes funny filename' span_id: 368 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:372) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\tdiff --git a/no-funny "b/tabs\\t,\\" (dq) and spaces"\n' span_id:374) (Token id:Id.Lit_Chars val:'\told mode 100644\n' span_id:375) (Token id:Id.Lit_Chars val:'\tnew mode 100755\n' span_id:376) (Token id:Id.Lit_Chars val:'\tsimilarity index NUM%\n' span_id:377) (Token id:Id.Lit_Chars val:'\trename from no-funny\n' span_id:378) (Token id: Id.Lit_Chars val: '\trename to "tabs\\t,\\" (dq) and spaces"\n' span_id: 379 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:380) (Token id:Id.Lit_Chars val:'\tgit diff-index -M -p $t0 >diff &&\n' span_id:381) (Token id:Id.Lit_Chars val:'\tsed -e "s/index [0-9]*%/index NUM%/" <diff >current &&\n' span_id:382) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:383) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diffstat for rename quotes funny filename' span_id:390))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:394) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:395) (Token id:Id.Lit_Chars val:'\t "tabs\\t,\\" (dq) and spaces"\n' span_id:396) (Token id: Id.Lit_Chars val: '\t 1 file changed, 0 insertions(+), 0 deletions(-)\n' span_id: 397 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:398) (Token id:Id.Lit_Chars val:'\tgit diff-index -M -p $t0 >diff &&\n' span_id:399) (Token id:Id.Lit_Chars val:'\tgit apply --stat <diff >diffstat &&\n' span_id:400) (Token id: Id.Lit_Chars val: '\tsed -e "s/|.*//" -e "s/ *\\$//" <diffstat >current &&\n' span_id: 401 ) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expected current\n' span_id:402) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'numstat for rename quotes funny filename' span_id:409))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:413) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:414) (Token id:Id.Lit_Chars val:'\t0\t0\t"tabs\\t,\\" (dq) and spaces"\n' span_id:415) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:416) (Token id:Id.Lit_Chars val:'\tgit diff-index -M -p $t0 >diff &&\n' span_id:417) (Token id: Id.Lit_Chars val: '\tgit apply --numstat <diff >current &&\n' span_id: 418 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:419) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'numstat without -M quotes funny filename' span_id:426))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:430) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:431) (Token id:Id.Lit_Chars val:'\t0\t3\tno-funny\n' span_id:432) (Token id:Id.Lit_Chars val:'\t3\t0\t"tabs\\t,\\" (dq) and spaces"\n' span_id:433) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:434) (Token id:Id.Lit_Chars val:'\tgit diff-index -p $t0 >diff &&\n' span_id:435) (Token id:Id.Lit_Chars val:'\tgit apply --numstat <diff >current &&\n' span_id:436) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:437) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'numstat for non-git rename diff quotes funny filename' span_id: 444 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:448) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:449) (Token id:Id.Lit_Chars val:'\t0\t3\tno-funny\n' span_id:450) (Token id:Id.Lit_Chars val:'\t3\t0\t"tabs\\t,\\" (dq) and spaces"\n' span_id:451) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:452) (Token id:Id.Lit_Chars val:'\tgit diff-index -p $t0 >git-diff &&\n' span_id:453) (Token id:Id.Lit_Chars val:'\tsed -ne "/^[-+@]/p" <git-diff >diff &&\n' span_id:454) (Token id: Id.Lit_Chars val: '\tgit apply --numstat <diff >current &&\n' span_id: 455 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:456) ) } ) (C {(test_done)}) ] )