(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'check pre-push hooks' span_id:6))} 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: (Token id:Id.Left_DollarParen val:'$(' span_id:19) command_list: (command.CommandList children: [(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.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:49) fd: -1 here_begin: {(EOF)} here_end_span_id: 55 stdin_parts: [('cat >/dev/null\n') ('exit 0\n')] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:60))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:64) (Token id:Id.Lit_Chars val:'\tgit config push.default upstream &&\n' span_id:65) (Token id:Id.Lit_Chars val:'\tgit init --bare repo1 &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\tgit remote add parent1 repo1 &&\n' span_id:67) (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:68) (Token id:Id.Lit_Chars val:'\tgit push parent1 HEAD:foreign\n' span_id:69) ) } ) (command.Simple words: [{(write_script)} {(DQ ($ Id.VSub_DollarName '$HOOK'))}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:78) fd: -1 here_begin: {(EOF)} here_end_span_id: 84 stdin_parts: [('cat >/dev/null\n') ('exit 1\n')] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:COMMIT1) op: assign_op.Equal rhs: { (DQ (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:88) command_list: (command.CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})]) ) ) } spids: [86] ) ] ) (C {(export)} {(COMMIT1)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push with failing hook' span_id:105))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:109) (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\ttest_must_fail git push parent1 HEAD\n' span_id:111) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--no-verify bypasses hook' span_id:118))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) (Token id:Id.Lit_Chars val:'\tgit push --no-verify parent1 HEAD\n' span_id:123) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:COMMIT2) op: assign_op.Equal rhs: { (DQ (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:129) command_list: (command.CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})]) ) ) } spids: [127] ) ] ) (C {(export)} {(COMMIT2)}) (command.Simple words: [{(write_script)} {(DQ ($ Id.VSub_DollarName '$HOOK'))}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:149) fd: -1 here_begin: {(SQ (Token id:Id.Lit_Chars val:EOF span_id:151))} here_end_span_id: 157 stdin_parts: [('echo "$1" >actual\n') ('echo "$2" >>actual\n') ('cat >>actual\n')] ) ] ) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:161) fd: -1 arg_word: {(expected)} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:164) fd: -1 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') ] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push with hook' span_id:180))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:184) (Token id:Id.Lit_Chars val:'\tgit push parent1 master:foreign &&\n' span_id:185) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:186) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add a branch' span_id:193))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:197) (Token id: Id.Lit_Chars val: '\tgit checkout -b other parent1/foreign &&\n' span_id: 198 ) (Token id:Id.Lit_Chars val:'\ttest_commit three\n' span_id:199) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:COMMIT3) op: assign_op.Equal rhs: { (DQ (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:205) command_list: (command.CommandList children:[(C {(git)} {(rev-parse)} {(HEAD)})]) ) ) } spids: [203] ) ] ) (C {(export)} {(COMMIT3)}) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:221) fd: -1 arg_word: {(expected)} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:224) fd: -1 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') ] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to default' span_id:240))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:244) (Token id:Id.Lit_Chars val:'\tgit push &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:246) ) } ) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:252) fd: -1 arg_word: {(expected)} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:255) fd: -1 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') ] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push non-branches' span_id:276))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:280) (Token id: Id.Lit_Chars val: '\tgit push parent1 one:tag1 HEAD~:refs/heads/prev &&\n' span_id: 281 ) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:282) ) } ) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:288) fd: -1 arg_word: {(expected)} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:291) fd: -1 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') ] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push delete' span_id:307))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:311) (Token id:Id.Lit_Chars val:'\tgit push parent1 :prev &&\n' span_id:312) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:313) ) } ) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:319) fd: -1 arg_word: {(expected)} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:322) fd: -1 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') ] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push to URL' span_id:338))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:342) (Token id:Id.Lit_Chars val:'\tgit push repo1 HEAD &&\n' span_id:343) (Token id:Id.Lit_Chars val:'\tdiff expected actual\n' span_id:344) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set up many-ref tests' span_id:351))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:355) (Token id:Id.Lit_Chars val:'\t{\n' span_id:356) (Token id:Id.Lit_Chars val:'\t\tnr=1000\n' span_id:357) (Token id:Id.Lit_Chars val:'\t\twhile test $nr -lt 2000\n' span_id:358) (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:359) (Token id:Id.Lit_Chars val:'\t\t\tnr=$(( $nr + 1 ))\n' span_id:360) (Token id:Id.Lit_Chars val:'\t\t\techo "create refs/heads/b/$nr $COMMIT3"\n' span_id:361) (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:362) (Token id:Id.Lit_Chars val:'\t} | git update-ref --stdin\n' span_id:363) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'sigpipe does not cause pre-push hook failure' span_id:370))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:374) (Token id: Id.Lit_Chars val: '\techo "exit 0" | write_script "$HOOK" &&\n' span_id: 375 ) (Token id:Id.Lit_Chars val:'\tgit push parent1 "refs/heads/b/*:refs/heads/b/*"\n' span_id:376) ) } ) (C {(test_done)}) ] )