(command.CommandList
  children: [
    (command.ShAssignment
      left: <Id.Lit_VarLike 'test_description='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'test_description='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'test_description='> name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'check pre-push hooks'>)}
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <.>
      more_env: []
      words: [{<.>} {<'./test-lib.sh'>}]
      redirects: []
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'HOOKDIR='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'HOOKDIR='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'HOOKDIR='> name:HOOKDIR)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (CommandSub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Simple
                      blame_tok: <git>
                      more_env: []
                      words: [{<git>} {<rev-parse>} {<--git-dir>}]
                      redirects: []
                      do_fork: T
                    )
                  right: <Id.Eof_RParen _>
                ) <'/hooks'>
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'HOOK='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'HOOK='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'HOOK='> name:HOOK)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName HOOKDIR) <'/pre-push'>)}
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <mkdir>
      more_env: []
      words: [{<mkdir>} {<-p>} {(DQ ($ Id.VSub_DollarName HOOKDIR))}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <write_script>
      more_env: []
      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_tok: <Id.Undefined_Tok ''>
              stdin_parts: [<'cat >/dev/null\n'> <'exit 0\n'>]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<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'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <write_script>
      more_env: []
      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_tok: <Id.Undefined_Tok ''>
              stdin_parts: [<'cat >/dev/null\n'> <'exit 1\n'>]
            )
        )
      ]
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'COMMIT1='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'COMMIT1='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'COMMIT1='> name:COMMIT1)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (CommandSub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Simple
                      blame_tok: <git>
                      more_env: []
                      words: [{<git>} {<rev-parse>} {<HEAD>}]
                      redirects: []
                      do_fork: T
                    )
                  right: <Id.Eof_RParen _>
                )
              )
            }
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <export>
      more_env: []
      words: [{<export>} {<COMMIT1>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'push with failing hook'>)}
        {(SQ <'\n'> <'\ttest_commit two &&\n'> <'\ttest_must_fail git push parent1 HEAD\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'--no-verify bypasses hook'>)}
        {(SQ <'\n'> <'\tgit push --no-verify parent1 HEAD\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'COMMIT2='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'COMMIT2='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'COMMIT2='> name:COMMIT2)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (CommandSub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Simple
                      blame_tok: <git>
                      more_env: []
                      words: [{<git>} {<rev-parse>} {<HEAD>}]
                      redirects: []
                      do_fork: T
                    )
                  right: <Id.Eof_RParen _>
                )
              )
            }
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <export>
      more_env: []
      words: [{<export>} {<COMMIT2>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <write_script>
      more_env: []
      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_tok: <Id.Undefined_Tok ''>
              stdin_parts: [<'echo "$1" >actual\n'> <'echo "$2" >>actual\n'> <'cat >>actual\n'>]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      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_tok: <Id.Undefined_Tok ''>
              stdin_parts: [
                <'parent1\n'>
                <'repo1\n'>
                <'refs/heads/master '>
                ($ Id.VSub_DollarName COMMIT2)
                <' refs/heads/foreign '>
                ($ Id.VSub_DollarName COMMIT1)
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'push with hook'>)}
        {(SQ <'\n'> <'\tgit push parent1 master:foreign &&\n'> <'\tdiff expected actual\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'add a branch'>)}
        {(SQ <'\n'> <'\tgit checkout -b other parent1/foreign &&\n'> <'\ttest_commit three\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'COMMIT3='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'COMMIT3='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'COMMIT3='> name:COMMIT3)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (CommandSub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Simple
                      blame_tok: <git>
                      more_env: []
                      words: [{<git>} {<rev-parse>} {<HEAD>}]
                      redirects: []
                      do_fork: T
                    )
                  right: <Id.Eof_RParen _>
                )
              )
            }
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <export>
      more_env: []
      words: [{<export>} {<COMMIT3>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      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_tok: <Id.Undefined_Tok ''>
              stdin_parts: [
                <'parent1\n'>
                <'repo1\n'>
                <'refs/heads/other '>
                ($ Id.VSub_DollarName COMMIT3)
                <' refs/heads/foreign '>
                ($ Id.VSub_DollarName COMMIT2)
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'push to default'>)}
        {(SQ <'\n'> <'\tgit push &&\n'> <'\tdiff expected actual\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      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_tok: <Id.Undefined_Tok ''>
              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
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'push non-branches'>)}
        {
          (SQ <'\n'> <'\tgit push parent1 one:tag1 HEAD~:refs/heads/prev &&\n'> 
            <'\tdiff expected actual\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      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_tok: <Id.Undefined_Tok ''>
              stdin_parts: [
                <'parent1\n'>
                <'repo1\n'>
                <'(delete) '>
                ($ Id.VSub_DollarName _z40)
                <' refs/heads/prev '>
                ($ Id.VSub_DollarName COMMIT2)
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'push delete'>)}
        {(SQ <'\n'> <'\tgit push parent1 :prev &&\n'> <'\tdiff expected actual\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <cat>
      more_env: []
      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_tok: <Id.Undefined_Tok ''>
              stdin_parts: [
                <'repo1\n'>
                <'repo1\n'>
                <'HEAD '>
                ($ Id.VSub_DollarName COMMIT3)
                <' refs/heads/other '>
                ($ Id.VSub_DollarName _z40)
                <'\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'push to URL'>)}
        {(SQ <'\n'> <'\tgit push repo1 HEAD &&\n'> <'\tdiff expected actual\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<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'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<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'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_done>
      more_env: []
      words: [{<test_done>}]
      redirects: []
      do_fork: T
    )
  ]
)