(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 pre-push hooks' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (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:19)
                  command_list: 
                    (command.CommandList
                      children: [(C {(git)} {(rev-parse)} {(--git-dir)})]
                    )
                ) (/hooks)
              )
            }
          spids: [17]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HOOK)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$HOOKDIR') (/pre-push))}
          spids: [29]
        )
      ]
    )
    (C {(mkdir)} {(-p)} {(DQ ($ Id.VSub_DollarName '$HOOKDIR'))})
    (command.Simple
      words: [{(write_script)} {(DQ ($ Id.VSub_DollarName '$HOOK'))}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:49)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 55
          stdin_parts: [('cat >/dev/null\n') ('exit 0\n')]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:60))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:64) 
          (Token id:Id.Lit_Chars val:'\tgit config push.default upstream &&\n' span_id:65) (Token id:Id.Lit_Chars val:'\tgit init --bare repo1 &&\n' span_id:66) 
          (Token id:Id.Lit_Chars val:'\tgit remote add parent1 repo1 &&\n' span_id:67) (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:68) 
          (Token id:Id.Lit_Chars val:'\tgit push parent1 HEAD:foreign\n' span_id:69)
        )
      }
    )
    (command.Simple
      words: [{(write_script)} {(DQ ($ Id.VSub_DollarName '$HOOK'))}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:78)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 84
          stdin_parts: [('cat >/dev/null\n') ('exit 1\n')]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMIT1)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:88)
                  command_list: (command.CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})])
                )
              )
            }
          spids: [86]
        )
      ]
    )
    (C {(export)} {(COMMIT1)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push with failing hook' span_id:105))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\ttest_must_fail git push parent1 HEAD\n' span_id:111)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'--no-verify bypasses hook' span_id:118))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) 
          (Token id:Id.Lit_Chars val:'\tgit push --no-verify parent1 HEAD\n' span_id:123)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMIT2)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:129)
                  command_list: (command.CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})])
                )
              )
            }
          spids: [127]
        )
      ]
    )
    (C {(export)} {(COMMIT2)})
    (command.Simple
      words: [{(write_script)} {(DQ ($ Id.VSub_DollarName '$HOOK'))}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:149)
          fd: -1
          here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:151))}
          here_end_span_id: 157
          stdin_parts: [('echo "$1" >actual\n') ('echo "$2" >>actual\n') ('cat >>actual\n')]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:161)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:164)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 175
          stdin_parts: [
            ('parent1\n')
            ('repo1\n')
            ('refs/heads/master ')
            ($ Id.VSub_DollarName '$COMMIT2')
            (' refs/heads/foreign ')
            ($ Id.VSub_DollarName '$COMMIT1')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push with hook' span_id:180))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\tgit push parent1 master:foreign &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:186)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add a branch' span_id:193))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:197) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout -b other parent1/foreign &&\n'
            span_id: 198
          ) (Token id:Id.Lit_Chars val:'\ttest_commit three\n' span_id:199)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMIT3)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:205)
                  command_list: (command.CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})])
                )
              )
            }
          spids: [203]
        )
      ]
    )
    (C {(export)} {(COMMIT3)})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:221)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:224)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 235
          stdin_parts: [
            ('parent1\n')
            ('repo1\n')
            ('refs/heads/other ')
            ($ Id.VSub_DollarName '$COMMIT3')
            (' refs/heads/foreign ')
            ($ Id.VSub_DollarName '$COMMIT2')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to default' span_id:240))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:244) 
          (Token id:Id.Lit_Chars val:'\tgit push &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:246)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:252)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:255)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 271
          stdin_parts: [
            ('parent1\n')
            ('repo1\n')
            ('refs/tags/one ')
            ($ Id.VSub_DollarName '$COMMIT1')
            (' refs/tags/tag1 ')
            ($ Id.VSub_DollarName '$_z40')
            ('\n')
            ('HEAD~ ')
            ($ Id.VSub_DollarName '$COMMIT2')
            (' refs/heads/prev ')
            ($ Id.VSub_DollarName '$_z40')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push non-branches' span_id:276))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:280) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit push parent1 one:tag1 HEAD~:refs/heads/prev &&\n'
            span_id: 281
          ) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:282)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:288)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:291)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 302
          stdin_parts: [
            ('parent1\n')
            ('repo1\n')
            ('(delete) ')
            ($ Id.VSub_DollarName '$_z40')
            (' refs/heads/prev ')
            ($ Id.VSub_DollarName '$COMMIT2')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push delete' span_id:307))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:311) 
          (Token id:Id.Lit_Chars val:'\tgit push parent1 :prev &&\n' span_id:312) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:313)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:319)
          fd: -1
          arg_word: {(expected)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:322)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 333
          stdin_parts: [
            ('repo1\n')
            ('repo1\n')
            ('HEAD ')
            ($ Id.VSub_DollarName '$COMMIT3')
            (' refs/heads/other ')
            ($ Id.VSub_DollarName '$_z40')
            ('\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to URL' span_id:338))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:342) 
          (Token id:Id.Lit_Chars val:'\tgit push repo1 HEAD &&\n' span_id:343) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:344)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set up many-ref tests' span_id:351))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:355) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:356) (Token id:Id.Lit_Chars val:'\t\tnr=1000\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'\t\twhile test $nr -lt 2000\n' span_id:358) (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\t\t\tnr=$(( $nr + 1 ))\n' span_id:360) (Token id:Id.Lit_Chars val:'\t\t\techo "create refs/heads/b/$nr $COMMIT3"\n' span_id:361) 
          (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:362) (Token id:Id.Lit_Chars val:'\t} | git update-ref --stdin\n' span_id:363)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'sigpipe does not cause pre-push hook failure' span_id:370))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "exit 0" | write_script "$HOOK" &&\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\tgit push parent1 "refs/heads/b/*:refs/heads/b/*"\n' span_id:376)
        )
      }
    )
    (C {(test_done)})
  ]
)