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