(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)})
  ]
)