(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:'pre-commit hook' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with no hook' span_id:18))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:22) (Token id:Id.Lit_Chars val:'\n' span_id:23) (Token id:Id.Lit_Chars val:'\techo "foo" > file &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:25) (Token id:Id.Lit_Chars val:'\tgit commit -m "first"\n' span_id:26) (Token id:Id.Lit_Chars val:'\n' span_id:27) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--no-verify with no hook' span_id:34))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:38) (Token id:Id.Lit_Chars val:'\n' span_id:39) (Token id:Id.Lit_Chars val:'\techo "bar" > file &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:41) (Token id:Id.Lit_Chars val:'\tgit commit --no-verify -m "bar"\n' span_id:42) (Token id:Id.Lit_Chars val:'\n' span_id:43) ) } ) (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:52) command_list: (command.CommandList children: [(C {(git)} {(rev-parse)} {(--git-dir)})] ) ) (/hooks) ) } spids: [50] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HOOK) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$HOOKDIR') (/pre-commit))} spids: [62] ) ] ) (C {(mkdir)} {(-p)} {(DQ ($ Id.VSub_DollarName '$HOOKDIR'))}) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:78) fd: -1 arg_word: {(DQ ($ Id.VSub_DollarName '$HOOK'))} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:84) fd: -1 here_begin: {(EOF)} here_end_span_id: 90 stdin_parts: [('#!/bin/sh\n') ('exit 0\n')] ) ] ) (C {(chmod)} {(Id.Lit_Other '+') (x)} {(DQ ($ Id.VSub_DollarName '$HOOK'))}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with succeeding hook' span_id:104))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:108) (Token id:Id.Lit_Chars val:'\n' span_id:109) (Token id:Id.Lit_Chars val:'\techo "more" >> file &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:111) (Token id:Id.Lit_Chars val:'\tgit commit -m "more"\n' span_id:112) (Token id:Id.Lit_Chars val:'\n' span_id:113) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--no-verify with succeeding hook' span_id:120))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) (Token id:Id.Lit_Chars val:'\n' span_id:125) (Token id:Id.Lit_Chars val:'\techo "even more" >> file &&\n' span_id:126) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:127) (Token id: Id.Lit_Chars val: '\tgit commit --no-verify -m "even more"\n' span_id: 128 ) (Token id:Id.Lit_Chars val:'\n' span_id:129) ) } ) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:138) fd: -1 arg_word: {(DQ ($ Id.VSub_DollarName '$HOOK'))} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:144) fd: -1 here_begin: {(EOF)} here_end_span_id: 150 stdin_parts: [('#!/bin/sh\n') ('exit 1\n')] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with failing hook' span_id:155))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:159) (Token id:Id.Lit_Chars val:'\n' span_id:160) (Token id:Id.Lit_Chars val:'\techo "another" >> file &&\n' span_id:161) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:162) (Token id: Id.Lit_Chars val: '\ttest_must_fail git commit -m "another"\n' span_id: 163 ) (Token id:Id.Lit_Chars val:'\n' span_id:164) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'--no-verify with failing hook' span_id:171))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:175) (Token id:Id.Lit_Chars val:'\n' span_id:176) (Token id:Id.Lit_Chars val:'\techo "stuff" >> file &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:178) (Token id:Id.Lit_Chars val:'\tgit commit --no-verify -m "stuff"\n' span_id:179) (Token id:Id.Lit_Chars val:'\n' span_id:180) ) } ) (C {(chmod)} {(-x)} {(DQ ($ Id.VSub_DollarName '$HOOK'))}) (C {(test_expect_success)} {(POSIXPERM)} {(SQ (Token id:Id.Lit_Chars val:'with non-executable hook' span_id:197))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:201) (Token id:Id.Lit_Chars val:'\n' span_id:202) (Token id:Id.Lit_Chars val:'\techo "content" >> file &&\n' span_id:203) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\tgit commit -m "content"\n' span_id:205) (Token id:Id.Lit_Chars val:'\n' span_id:206) ) } ) (C {(test_expect_success)} {(POSIXPERM)} {(SQ (Token id:Id.Lit_Chars val:'--no-verify with non-executable hook' span_id:215))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:219) (Token id:Id.Lit_Chars val:'\n' span_id:220) (Token id:Id.Lit_Chars val:'\techo "more content" >> file &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:222) (Token id: Id.Lit_Chars val: '\tgit commit --no-verify -m "more content"\n' span_id: 223 ) (Token id:Id.Lit_Chars val:'\n' span_id:224) ) } ) (C {(chmod)} {(Id.Lit_Other '+') (x)} {(DQ ($ Id.VSub_DollarName '$HOOK'))}) (command.Simple words: [{(cat)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:245) fd: -1 arg_word: {(DQ ($ Id.VSub_DollarName '$HOOK'))} ) (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:251) fd: -1 here_begin: {(EOF)} here_end_span_id: 259 stdin_parts: [ ('#!/bin/sh\n') ('test ') (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\$' span_id:256) ) ('GIT_PREFIX = success/\n') ] ) ] ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with hook requiring GIT_PREFIX' span_id:264))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:268) (Token id:Id.Lit_Chars val:'\n' span_id:269) (Token id:Id.Lit_Chars val:'\techo "more content" >> file &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:271) (Token id:Id.Lit_Chars val:'\tmkdir success &&\n' span_id:272) (Token id:Id.Lit_Chars val:'\t(\n' span_id:273) (Token id:Id.Lit_Chars val:'\t\tcd success &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "hook requires GIT_PREFIX = success/"\n' span_id:275) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:276) (Token id:Id.Lit_Chars val:'\trmdir success\n' span_id:277) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'with failing hook requiring GIT_PREFIX' span_id:284))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:288) (Token id:Id.Lit_Chars val:'\n' span_id:289) (Token id:Id.Lit_Chars val:'\techo "more content" >> file &&\n' span_id:290) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:291) (Token id:Id.Lit_Chars val:'\tmkdir fail &&\n' span_id:292) (Token id:Id.Lit_Chars val:'\t(\n' span_id:293) (Token id:Id.Lit_Chars val:'\t\tcd fail &&\n' span_id:294) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git commit -m "hook must fail"\n' span_id:295) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\trmdir fail &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\tgit checkout -- file\n' span_id:298) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check the author in hook' span_id:305))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:309) (Token id:Id.Lit_Chars val:'\twrite_script "$HOOK" <<-\\EOF &&\n' span_id:310) (Token id:Id.Lit_Chars val:'\ttest "$GIT_AUTHOR_NAME" = "New Author" &&\n' span_id:311) (Token id: Id.Lit_Chars val: '\ttest "$GIT_AUTHOR_EMAIL" = "newauthor@example.com"\n' span_id: 312 ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:313) (Token id: Id.Lit_Chars val: '\ttest_must_fail git commit --allow-empty -m "by a.u.thor" &&\n' span_id: 314 ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:315) (Token id:Id.Lit_Chars val:'\t\tGIT_AUTHOR_NAME="New Author" &&\n' span_id:316) (Token id:Id.Lit_Chars val:'\t\tGIT_AUTHOR_EMAIL="newauthor@example.com" &&\n' span_id:317) (Token id: Id.Lit_Chars val: '\t\texport GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&\n' span_id: 318 ) (Token id: Id.Lit_Chars val: '\t\tgit commit --allow-empty -m "by new.author via env" &&\n' span_id: 319 ) (Token id:Id.Lit_Chars val:'\t\tgit show -s\n' span_id:320) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:321) (Token id: Id.Lit_Chars val: '\tgit commit --author="New Author <newauthor@example.com>" \\\n' span_id: 322 ) (Token id:Id.Lit_Chars val:'\t\t--allow-empty -m "by new.author via command line" &&\n' span_id:323) (Token id:Id.Lit_Chars val:'\tgit show -s\n' span_id:324) ) } ) (C {(test_done)}) ] )