(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'check pre-push hooks'>)}
          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: <Id.Left_DollarParen '$('>
                  child: (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
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<EOF>}
              here_end_span_id: 55
              stdin_parts: [<'cat >/dev/null\n'> <'exit 0\n'>]
            )
        )
      ]
      do_fork: T
    )
    (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'>
        )
      }
    )
    (command.Simple
      words: [{<write_script>} {(DQ ($ Id.VSub_DollarName '$HOOK'))}]
      redirects: [
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<EOF>}
              here_end_span_id: 84
              stdin_parts: [<'cat >/dev/null\n'> <'exit 1\n'>]
            )
        )
      ]
      do_fork: T
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMIT1)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: (C {<git>} {<rev-parse>} {<HEAD>})
                )
              )
            }
          spids: [86]
        )
      ]
    )
    (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'>)}
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMIT2)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: (C {<git>} {<rev-parse>} {<HEAD>})
                )
              )
            }
          spids: [127]
        )
      ]
    )
    (C {<export>} {<COMMIT2>})
    (command.Simple
      words: [{<write_script>} {(DQ ($ Id.VSub_DollarName '$HOOK'))}]
      redirects: [
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {(SQ <EOF>)}
              here_end_span_id: 157
              stdin_parts: [<'echo "$1" >actual\n'> <'echo "$2" >>actual\n'> <'cat >>actual\n'>]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expected>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              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'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (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'>)}
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:COMMIT3)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: <Id.Left_DollarParen '$('>
                  child: (C {<git>} {<rev-parse>} {<HEAD>})
                )
              )
            }
          spids: [203]
        )
      ]
    )
    (C {<export>} {<COMMIT3>})
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expected>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              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'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'push to default'>)} 
      {(SQ <'\n'> <'\tgit push &&\n'> <'\tdiff expected actual\n'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expected>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              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'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'push non-branches'>)} 
      {
        (SQ <'\n'> <'\tgit push parent1 one:tag1 HEAD~:refs/heads/prev &&\n'> 
          <'\tdiff expected actual\n'>
        )
      }
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expected>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              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'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'push delete'>)} 
      {(SQ <'\n'> <'\tgit push parent1 :prev &&\n'> <'\tdiff expected actual\n'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<expected>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              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'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (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>})
  ]
)