(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: 'check that read-tree rejects confusing paths'
                  span_id: 6
                )
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'create base tree' span_id:17))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token id:Id.Lit_Chars val:'\techo content >file &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m base &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tblob=$(git rev-parse HEAD:file) &&\n' span_id:25) 
          (Token id:Id.Lit_Chars val:'\ttree=$(git rev-parse HEAD^{tree})\n' span_id:26)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'enable core.protectHFS for rejection tests' span_id:33))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:37) 
          (Token id:Id.Lit_Chars val:'\tgit config core.protectHFS true\n' span_id:38)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'enable core.protectNTFS for rejection tests' span_id:45))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:49) 
          (Token id:Id.Lit_Chars val:'\tgit config core.protectNTFS true\n' span_id:50)
        )
      }
    )
    (command.WhileUntil
      keyword: (Token id:Id.KW_While val:while span_id:54)
      cond: [
        (command.Sentence
          child: (C {(read)} {(path)} {(pretty)})
          terminator: (Token id:Id.Op_Semi val:';' span_id:61)
        )
      ]
      body: 
        (command.DoGroup
          children: [
            (C {(Id.Lit_Other ':')} 
              {
                (braced_var_sub
                  token: (Token id:Id.VSub_Name val:pretty span_id:69)
                  suffix_op: 
                    (suffix_op.Unary
                      op_id: Id.VTest_ColonEquals
                      arg_word: {($ Id.VSub_DollarName '$path')}
                    )
                )
              }
            )
            (command.Case
              to_match: {(DQ ($ Id.VSub_DollarName '$path'))}
              arms: [
                (case_arm
                  pat_list: [{(Id.Lit_Star '*') (SPACE)}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:path)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (braced_var_sub
                                  token: (Token id:Id.VSub_Name val:path span_id:92)
                                  suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(SPACE)})
                                ) (' ')
                              )
                            }
                          spids: [89]
                        )
                      ]
                    )
                  ]
                  spids: [84 86 100 -1]
                )
              ]
            )
            (C {(test_expect_success)} 
              {(DQ ('reject ') ($ Id.VSub_DollarName '$pretty') (' at end of path'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:115) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tprintf "100644 blob %s\\t%s" "$blob" "$path" >tree &&\n'
                    span_id: 116
                  ) (Token id:Id.Lit_Chars val:'\t\tbogus=$(git mktree <tree) &&\n' span_id:117) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_must_fail git read-tree $bogus\n'
                    span_id: 118
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:119)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('reject ') ($ Id.VSub_DollarName '$pretty') (' as subtree'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:133) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tprintf "040000 tree %s\\t%s" "$tree" "$path" >tree &&\n'
                    span_id: 134
                  ) (Token id:Id.Lit_Chars val:'\t\tbogus=$(git mktree <tree) &&\n' span_id:135) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_must_fail git read-tree $bogus\n'
                    span_id: 136
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:137)
                )
              }
            )
          ]
        )
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:142)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 177
          stdin_parts: [
            ('.\n')
            ('..\n')
            ('.git\n')
            ('.GIT\n')
            (${ Id.VSub_Name u200c)
            ('.Git {u200c}.Git\n')
            (.gI)
            (${ Id.VSub_Name u200c)
            ('T .gI{u200c}T\n')
            (.GiT)
            (${ Id.VSub_Name u200c)
            (' .GiT{u200c}\n')
            ('git~1\n')
            ('.git.SPACE .git.{space}\n')
            (.)
            (word_part.EscapedLiteral
              token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:166)
            )
            (word_part.EscapedLiteral
              token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:167)
            )
            (.GIT)
            (word_part.EscapedLiteral
              token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:169)
            )
            (word_part.EscapedLiteral
              token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:170)
            )
            ('foobar backslashes\n')
            (.git)
            (word_part.EscapedLiteral
              token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:173)
            )
            (word_part.EscapedLiteral
              token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:174)
            )
            ('foobar backslashes2\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'utf-8 paths allowed with core.protectHFS off' span_id:182))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:186) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git read-tree HEAD" &&\n'
            span_id: 187
          ) (Token id:Id.Lit_Chars val:'\ttest_config core.protectHFS false &&\n' span_id:188) 
          (Token
            id: Id.Lit_Chars
            val: '\tprintf "100644 blob %s\\t%s" "$blob" ".gi${u200c}t" >tree &&\n'
            span_id: 189
          ) (Token id:Id.Lit_Chars val:'\tok=$(git mktree <tree) &&\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\tgit read-tree $ok\n' span_id:191)
        )
      }
    )
    (C {(test_done)})
  ]
)