(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'check pre-push hooks'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:HOOKDIR)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: (CommandList children:[(C {(git)} {(rev-parse)} {(--git-dir)})])
                  left_token: <Left_CommandSub '$('>
                  spids: [19 25]
                ) (/hooks)
              )
            }
          spids: [17]
        )
      ]
      spids: [17]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:HOOK)
          op: Equal
          rhs: {(DQ ($ VSub_Name '$HOOKDIR') (/pre-push))}
          spids: [29]
        )
      ]
      spids: [29]
    )
    (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$HOOKDIR'))})
    (SimpleCommand
      words: [{(write_script)} {(DQ ($ VSub_Name '$HOOK'))}]
      redirects: [
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: {(DQ ('cat >/dev/null\n') ('exit 0\n'))}
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [49]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <setup>)} 
      {
        (SQ <'\n'> <'\tgit config push.default upstream &&\n'> <'\tgit init --bare repo1 &&\n'> 
          <'\tgit remote add parent1 repo1 &&\n'> <'\ttest_commit one &&\n'> <'\tgit push parent1 HEAD:foreign\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(write_script)} {(DQ ($ VSub_Name '$HOOK'))}]
      redirects: [
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: {(DQ ('cat >/dev/null\n') ('exit 1\n'))}
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [76]
        )
      ]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:COMMIT1)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: (CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})])
                  left_token: <Left_CommandSub '$('>
                  spids: [84 90]
                )
              )
            }
          spids: [82]
        )
      ]
      spids: [82]
    )
    (C {(export)} {(COMMIT1)})
    (C {(test_expect_success)} {(SQ <'push with failing hook'>)} 
      {(SQ <'\n'> <'\ttest_commit two &&\n'> <'\ttest_must_fail git push parent1 HEAD\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'--no-verify bypasses hook'>)} 
      {(SQ <'\n'> <'\tgit push --no-verify parent1 HEAD\n'>)}
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:COMMIT2)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: (CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})])
                  left_token: <Left_CommandSub '$('>
                  spids: [125 131]
                )
              )
            }
          spids: [123]
        )
      ]
      spids: [123]
    )
    (C {(export)} {(COMMIT2)})
    (SimpleCommand
      words: [{(write_script)} {(DQ ($ VSub_Name '$HOOK'))}]
      redirects: [
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: {('echo "$1" >actual\n') ('echo "$2" >>actual\n') ('cat >>actual\n')}
          do_expansion: False
          here_end: EOF
          was_filled: True
          spids: [145]
        )
      ]
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expected)} spids:[153])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('parent1\n') ('repo1\n') ('refs/heads/master ') ($ VSub_Name '$COMMIT2') 
                (' refs/heads/foreign ') ($ VSub_Name '$COMMIT1') ('\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [156]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'push with hook'>)} 
      {(SQ <'\n'> <'\tgit push parent1 master:foreign &&\n'> <'\tdiff expected actual\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'add a branch'>)} 
      {(SQ <'\n'> <'\tgit checkout -b other parent1/foreign &&\n'> <'\ttest_commit three\n'>)}
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:COMMIT3)
          op: Equal
          rhs: 
            {
              (DQ 
                (CommandSubPart
                  command_list: (CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})])
                  left_token: <Left_CommandSub '$('>
                  spids: [195 201]
                )
              )
            }
          spids: [193]
        )
      ]
      spids: [193]
    )
    (C {(export)} {(COMMIT3)})
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expected)} spids:[211])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('parent1\n') ('repo1\n') ('refs/heads/other ') ($ VSub_Name '$COMMIT3') 
                (' refs/heads/foreign ') ($ VSub_Name '$COMMIT2') ('\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [214]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'push to default'>)} 
      {(SQ <'\n'> <'\tgit push &&\n'> <'\tdiff expected actual\n'>)}
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expected)} spids:[240])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('parent1\n') ('repo1\n') ('refs/tags/one ') ($ VSub_Name '$COMMIT1') 
                (' refs/tags/tag1 ') ($ VSub_Name '$_z40') ('\n') ('HEAD~ ') ($ VSub_Name '$COMMIT2') (' refs/heads/prev ') 
                ($ VSub_Name '$_z40') ('\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [243]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'push non-branches'>)} 
      {
        (SQ <'\n'> <'\tgit push parent1 one:tag1 HEAD~:refs/heads/prev &&\n'> 
          <'\tdiff expected actual\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expected)} spids:[274])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('parent1\n') ('repo1\n') ('(delete) ') ($ VSub_Name '$_z40') (' refs/heads/prev ') 
                ($ VSub_Name '$COMMIT2') ('\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [277]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'push delete'>)} 
      {(SQ <'\n'> <'\tgit push parent1 :prev &&\n'> <'\tdiff expected actual\n'>)}
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expected)} spids:[303])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('repo1\n') ('repo1\n') ('HEAD ') ($ VSub_Name '$COMMIT3') (' refs/heads/other ') 
                ($ VSub_Name '$_z40') ('\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [306]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'push to URL'>)} 
      {(SQ <'\n'> <'\tgit push repo1 HEAD &&\n'> <'\tdiff expected actual\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'set up many-ref tests'>)} 
      {
        (SQ <'\n'> <'\t{\n'> <'\t\tnr=1000\n'> <'\t\twhile test $nr -lt 2000\n'> <'\t\tdo\n'> 
          <'\t\t\tnr=$(( $nr + 1 ))\n'> <'\t\t\techo "create refs/heads/b/$nr $COMMIT3"\n'> <'\t\tdone\n'> <'\t} | git update-ref --stdin\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'sigpipe does not cause pre-push hook failure'>)} 
      {
        (SQ <'\n'> <'\techo "exit 0" | write_script "$HOOK" &&\n'> 
          <'\tgit push parent1 "refs/heads/b/*:refs/heads/b/*"\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)