(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:'pre-commit hook' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with no hook' span_id:18))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:22) (Token id:Id.Lit_Chars val:'\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\techo "foo" > file &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:25) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "first"\n' span_id:26) (Token id:Id.Lit_Chars val:'\n' span_id:27)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--no-verify with no hook' span_id:34))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:38) (Token id:Id.Lit_Chars val:'\n' span_id:39) 
          (Token id:Id.Lit_Chars val:'\techo "bar" > file &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:41) 
          (Token id:Id.Lit_Chars val:'\tgit commit --no-verify -m "bar"\n' span_id:42) (Token id:Id.Lit_Chars val:'\n' span_id:43)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HOOKDIR)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:52)
                  command_list: 
                    (command.CommandList
                      children: [(C {(git)} {(rev-parse)} {(--git-dir)})]
                    )
                ) (/hooks)
              )
            }
          spids: [50]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HOOK)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$HOOKDIR') (/pre-commit))}
          spids: [62]
        )
      ]
    )
    (C {(mkdir)} {(-p)} {(DQ ($ Id.VSub_DollarName '$HOOKDIR'))})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:78)
          fd: -1
          arg_word: {(DQ ($ Id.VSub_DollarName '$HOOK'))}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:84)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 90
          stdin_parts: [('#!/bin/sh\n') ('exit 0\n')]
        )
      ]
    )
    (C {(chmod)} {(Id.Lit_Other '+') (x)} {(DQ ($ Id.VSub_DollarName '$HOOK'))})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with succeeding hook' span_id:104))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:108) (Token id:Id.Lit_Chars val:'\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'\techo "more" >> file &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "more"\n' span_id:112) (Token id:Id.Lit_Chars val:'\n' span_id:113)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--no-verify with succeeding hook' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) (Token id:Id.Lit_Chars val:'\n' span_id:125) 
          (Token id:Id.Lit_Chars val:'\techo "even more" >> file &&\n' span_id:126) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:127) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --no-verify -m "even more"\n'
            span_id: 128
          ) (Token id:Id.Lit_Chars val:'\n' span_id:129)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:138)
          fd: -1
          arg_word: {(DQ ($ Id.VSub_DollarName '$HOOK'))}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:144)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 150
          stdin_parts: [('#!/bin/sh\n') ('exit 1\n')]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with failing hook' span_id:155))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:159) (Token id:Id.Lit_Chars val:'\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\techo "another" >> file &&\n' span_id:161) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:162) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit -m "another"\n'
            span_id: 163
          ) (Token id:Id.Lit_Chars val:'\n' span_id:164)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--no-verify with failing hook' span_id:171))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:175) (Token id:Id.Lit_Chars val:'\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\techo "stuff" >> file &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:178) 
          (Token id:Id.Lit_Chars val:'\tgit commit --no-verify -m "stuff"\n' span_id:179) (Token id:Id.Lit_Chars val:'\n' span_id:180)
        )
      }
    )
    (C {(chmod)} {(-x)} {(DQ ($ Id.VSub_DollarName '$HOOK'))})
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'with non-executable hook' span_id:197))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:201) (Token id:Id.Lit_Chars val:'\n' span_id:202) 
          (Token id:Id.Lit_Chars val:'\techo "content" >> file &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:204) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "content"\n' span_id:205) (Token id:Id.Lit_Chars val:'\n' span_id:206)
        )
      }
    )
    (C {(test_expect_success)} {(POSIXPERM)} 
      {(SQ (Token id:Id.Lit_Chars val:'--no-verify with non-executable hook' span_id:215))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:219) (Token id:Id.Lit_Chars val:'\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\techo "more content" >> file &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:222) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --no-verify -m "more content"\n'
            span_id: 223
          ) (Token id:Id.Lit_Chars val:'\n' span_id:224)
        )
      }
    )
    (C {(chmod)} {(Id.Lit_Other '+') (x)} {(DQ ($ Id.VSub_DollarName '$HOOK'))})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:245)
          fd: -1
          arg_word: {(DQ ($ Id.VSub_DollarName '$HOOK'))}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:251)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 259
          stdin_parts: [
            ('#!/bin/sh\n')
            ('test ')
            (word_part.EscapedLiteral
              token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:256)
            )
            ('GIT_PREFIX = success/\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'with hook requiring GIT_PREFIX' span_id:264))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:268) (Token id:Id.Lit_Chars val:'\n' span_id:269) 
          (Token id:Id.Lit_Chars val:'\techo "more content" >> file &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:271) 
          (Token id:Id.Lit_Chars val:'\tmkdir success &&\n' span_id:272) (Token id:Id.Lit_Chars val:'\t(\n' span_id:273) 
          (Token id:Id.Lit_Chars val:'\t\tcd success &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "hook requires GIT_PREFIX = success/"\n' span_id:275) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:276) (Token id:Id.Lit_Chars val:'\trmdir success\n' span_id:277)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'with failing hook requiring GIT_PREFIX' span_id:284))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:288) (Token id:Id.Lit_Chars val:'\n' span_id:289) 
          (Token id:Id.Lit_Chars val:'\techo "more content" >> file &&\n' span_id:290) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:291) 
          (Token id:Id.Lit_Chars val:'\tmkdir fail &&\n' span_id:292) (Token id:Id.Lit_Chars val:'\t(\n' span_id:293) 
          (Token id:Id.Lit_Chars val:'\t\tcd fail &&\n' span_id:294) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git commit -m "hook must fail"\n' span_id:295) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\trmdir fail &&\n' span_id:297) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -- file\n' span_id:298)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check the author in hook' span_id:305))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:309) 
          (Token id:Id.Lit_Chars val:'\twrite_script "$HOOK" <<-\\EOF &&\n' span_id:310) (Token id:Id.Lit_Chars val:'\ttest "$GIT_AUTHOR_NAME" = "New Author" &&\n' span_id:311) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$GIT_AUTHOR_EMAIL" = "newauthor@example.com"\n'
            span_id: 312
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:313) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git commit --allow-empty -m "by a.u.thor" &&\n'
            span_id: 314
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:315) 
          (Token id:Id.Lit_Chars val:'\t\tGIT_AUTHOR_NAME="New Author" &&\n' span_id:316) (Token id:Id.Lit_Chars val:'\t\tGIT_AUTHOR_EMAIL="newauthor@example.com" &&\n' span_id:317) 
          (Token
            id: Id.Lit_Chars
            val: '\t\texport GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&\n'
            span_id: 318
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit --allow-empty -m "by new.author via env" &&\n'
            span_id: 319
          ) (Token id:Id.Lit_Chars val:'\t\tgit show -s\n' span_id:320) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:321) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit --author="New Author <newauthor@example.com>" \\\n'
            span_id: 322
          ) (Token id:Id.Lit_Chars val:'\t\t--allow-empty -m "by new.author via command line" &&\n' span_id:323) 
          (Token id:Id.Lit_Chars val:'\tgit show -s\n' span_id:324)
        )
      }
    )
    (C {(test_done)})
  ]
)