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