(command.CommandList children: [ (command.ShFunction name: check body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:credential_opts) op: assign_op.Equal rhs: (word.Empty) spids: [20] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:credential_cmd) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [23] ) ] ) (C {(shift)}) (command.ForEach iter_name: arg iter_words: [{(DQ ($ Id.VSub_At '$@'))}] do_arg_iter: F body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:credential_opts) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$credential_opts') (" -c credential.helper='") ($ Id.VSub_DollarName '$arg') ("'") ) } spids: [44] ) ] ) ] ) ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (command.Simple words: [{(read_chunk)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:58) fd: -1 arg_word: {(stdin)} ) ] ) (command.Simple words: [{(read_chunk)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:66) fd: -1 arg_word: {(expect-stdout)} ) ] ) (command.Simple words: [{(read_chunk)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:74) fd: -1 arg_word: {(expect-stderr)} ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.Pipeline children: [ (C {(eval)} { (DQ ('git ') ($ Id.VSub_DollarName '$credential_opts') (' credential ') ($ Id.VSub_DollarName '$credential_cmd') (' <stdin >stdout 2>stderr') ) } ) ] negated: T ) terminator: (Token id:Id.Op_Semi val:';' span_id:93) ) ] action: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (C {(echo)} {(DQ ('git credential failed with code ') ($ Id.VSub_QMark '$?'))} ) (C {(cat)} {(stderr)}) (C {(false)}) ] ) ] spids: [80 95] ) ] ) (C {(test_cmp)} {(expect-stdout)} {(stdout)}) (C {(test_cmp)} {(expect-stderr)} {(stderr)}) ] ) ] ) ) (command.ShFunction name: read_chunk body: (command.BraceGroup children: [ (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:148) cond: [ (command.Sentence child: (C {(read)} {(line)}) terminator: (Token id:Id.Op_Semi val:';' span_id:153) ) ] body: (command.DoGroup children: [ (command.Case to_match: {(DQ ($ Id.VSub_DollarName '$line'))} arms: [ (case_arm pat_list: [{(--)}] action: [ (command.ControlFlow token: (Token id:Id.ControlFlow_Break val:break span_id:170) ) ] spids: [167 168 172 -1] ) (case_arm pat_list: [{(Id.Lit_Star '*')}] action: [(C {(echo)} {(DQ ($ Id.VSub_DollarName '$line'))})] spids: [175 176 184 -1] ) ] ) ] ) ) ] ) ) (command.ShFunction name: helper_test_clean body: (command.BraceGroup children: [ (C {(reject)} {($ Id.VSub_Number '$1')} {(https)} {(example.com)} {(store-user)}) (C {(reject)} {($ Id.VSub_Number '$1')} {(https)} {(example.com)} {(user1)}) (C {(reject)} {($ Id.VSub_Number '$1')} {(https)} {(example.com)} {(user2)}) (C {(reject)} {($ Id.VSub_Number '$1')} {(http)} {(path.tld)} {(user)}) (C {(reject)} {($ Id.VSub_Number '$1')} {(https)} {(timeout.tld)} {(user)}) ] ) ) (command.ShFunction name: reject body: (command.BraceGroup children: [ (command.Pipeline children: [ (command.Subshell command_list: (command.CommandList children: [ (C {(echo)} {(Id.Lit_VarLike 'protocol=') ($ Id.VSub_Number '$2')}) (C {(echo)} {(Id.Lit_VarLike 'host=') ($ Id.VSub_Number '$3')}) (C {(echo)} {(Id.Lit_VarLike 'username=') ($ Id.VSub_Number '$4')}) ] ) ) (C {(git)} {(-c)} {(credential.helper) (Id.Lit_Equals '=') ($ Id.VSub_Number '$1')} {(credential)} {(reject)} ) ] negated: F ) ] ) ) (command.ShFunction name: helper_test body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HELPER) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [334] ) ] ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') has no existing data'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:348) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 349 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:350) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:351) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:352) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:353) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:354) (Token id: Id.Lit_Chars val: '\t\tusername=askpass-username\n' span_id: 355 ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:356) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:357) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:358) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:360)) (SQ (Token id:Id.Lit_Chars val:'https://example.com' span_id:362)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:364)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:366) (Token id: Id.Lit_Chars val: '\t\taskpass: Password for ' span_id: 367 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:369)) (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@example.com' span_id:371)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:373)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:375) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:376) (Token id:Id.Lit_Chars val:'\t' span_id:377) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') stores password'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:391) (Token id: Id.Lit_Chars val: '\t\tcheck approve $HELPER <<-\\EOF\n' span_id: 392 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:393) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:394) (Token id:Id.Lit_Chars val:'\t\tusername=store-user\n' span_id:395) (Token id: Id.Lit_Chars val: '\t\tpassword=store-pass\n' span_id: 396 ) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:397) (Token id:Id.Lit_Chars val:'\t' span_id:398) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') can retrieve password'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:412) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 413 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:414) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:415) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:416) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:417) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:418) (Token id: Id.Lit_Chars val: '\t\tusername=store-user\n' span_id: 419 ) (Token id:Id.Lit_Chars val:'\t\tpassword=store-pass\n' span_id:420) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:421) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:422) (Token id:Id.Lit_Chars val:'\t' span_id:423) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') requires matching protocol'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:437) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 438 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:439) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:440) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:441) (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:442) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:443) (Token id: Id.Lit_Chars val: '\t\tusername=askpass-username\n' span_id: 444 ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:445) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:446) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:447) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:449)) (SQ (Token id:Id.Lit_Chars val:'http://example.com' span_id:451)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:453)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:455) (Token id: Id.Lit_Chars val: '\t\taskpass: Password for ' span_id: 456 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:458)) (SQ (Token id:Id.Lit_Chars val:'http://askpass-username@example.com' span_id:460)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:462)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:464) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:465) (Token id:Id.Lit_Chars val:'\t' span_id:466) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') requires matching host'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:480) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 481 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:482) (Token id:Id.Lit_Chars val:'\t\thost=other.tld\n' span_id:483) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:484) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:485) (Token id:Id.Lit_Chars val:'\t\thost=other.tld\n' span_id:486) (Token id: Id.Lit_Chars val: '\t\tusername=askpass-username\n' span_id: 487 ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:488) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:489) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:490) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:492)) (SQ (Token id:Id.Lit_Chars val:'https://other.tld' span_id:494)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:496)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:498) (Token id: Id.Lit_Chars val: '\t\taskpass: Password for ' span_id: 499 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:501)) (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@other.tld' span_id:503)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:505)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:507) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:508) (Token id:Id.Lit_Chars val:'\t' span_id:509) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') requires matching username'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:523) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 524 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:525) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:526) (Token id:Id.Lit_Chars val:'\t\tusername=other\n' span_id:527) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:528) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:529) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:530) (Token id:Id.Lit_Chars val:'\t\tusername=other\n' span_id:531) (Token id: Id.Lit_Chars val: '\t\tpassword=askpass-password\n' span_id: 532 ) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:533) (Token id: Id.Lit_Chars val: '\t\taskpass: Password for ' span_id: 534 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:536)) (SQ (Token id:Id.Lit_Chars val:'https://other@example.com' span_id:538)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:540)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:542) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:543) (Token id:Id.Lit_Chars val:'\t' span_id:544) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') requires matching path'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:558) (Token id: Id.Lit_Chars val: '\t\ttest_config credential.usehttppath true &&\n' span_id: 559 ) (Token id:Id.Lit_Chars val:'\t\tcheck approve $HELPER <<-\\EOF &&\n' span_id:560) (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:561) (Token id:Id.Lit_Chars val:'\t\thost=path.tld\n' span_id:562) (Token id:Id.Lit_Chars val:'\t\tpath=foo.git\n' span_id:563) (Token id:Id.Lit_Chars val:'\t\tusername=user\n' span_id:564) (Token id:Id.Lit_Chars val:'\t\tpassword=pass\n' span_id:565) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:566) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 567 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:568) (Token id:Id.Lit_Chars val:'\t\thost=path.tld\n' span_id:569) (Token id:Id.Lit_Chars val:'\t\tpath=bar.git\n' span_id:570) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:571) (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:572) (Token id:Id.Lit_Chars val:'\t\thost=path.tld\n' span_id:573) (Token id:Id.Lit_Chars val:'\t\tpath=bar.git\n' span_id:574) (Token id: Id.Lit_Chars val: '\t\tusername=askpass-username\n' span_id: 575 ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:576) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:577) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:578) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:580)) (SQ (Token id:Id.Lit_Chars val:'http://path.tld/bar.git' span_id:582)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:584)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:586) (Token id: Id.Lit_Chars val: '\t\taskpass: Password for ' span_id: 587 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:589)) (SQ (Token id: Id.Lit_Chars val: 'http://askpass-username@path.tld/bar.git' span_id: 591 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:593)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:595) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:596) (Token id:Id.Lit_Chars val:'\t' span_id:597) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') can forget host'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:611) (Token id: Id.Lit_Chars val: '\t\tcheck reject $HELPER <<-\\EOF &&\n' span_id: 612 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:613) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:614) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:615) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 616 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:617) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:618) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:619) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:620) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:621) (Token id: Id.Lit_Chars val: '\t\tusername=askpass-username\n' span_id: 622 ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:623) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:624) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:625) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:627)) (SQ (Token id:Id.Lit_Chars val:'https://example.com' span_id:629)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:631)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:633) (Token id: Id.Lit_Chars val: '\t\taskpass: Password for ' span_id: 634 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:636)) (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@example.com' span_id:638)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:640)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:642) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:643) (Token id:Id.Lit_Chars val:'\t' span_id:644) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') can store multiple users'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:658) (Token id: Id.Lit_Chars val: '\t\tcheck approve $HELPER <<-\\EOF &&\n' span_id: 659 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:660) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:661) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:662) (Token id:Id.Lit_Chars val:'\t\tpassword=pass1\n' span_id:663) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:664) (Token id: Id.Lit_Chars val: '\t\tcheck approve $HELPER <<-\\EOF &&\n' span_id: 665 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:666) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:667) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:668) (Token id:Id.Lit_Chars val:'\t\tpassword=pass2\n' span_id:669) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:670) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF &&\n' span_id: 671 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:672) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:673) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:674) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:675) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:676) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:677) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:678) (Token id:Id.Lit_Chars val:'\t\tpassword=pass1\n' span_id:679) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:680) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 681 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:682) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:683) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:684) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:685) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:686) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:687) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:688) (Token id:Id.Lit_Chars val:'\t\tpassword=pass2\n' span_id:689) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:690) (Token id:Id.Lit_Chars val:'\t' span_id:691) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') can forget user'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:705) (Token id: Id.Lit_Chars val: '\t\tcheck reject $HELPER <<-\\EOF &&\n' span_id: 706 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:707) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:708) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:709) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:710) (Token id:Id.Lit_Chars val:'\t\tcheck fill $HELPER <<-\\EOF\n' span_id:711) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:712) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:713) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:714) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:715) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:716) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:717) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:718) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:719) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:720) (Token id:Id.Lit_Chars val:'\t\taskpass: Password for ' span_id:721) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:723)) (SQ (Token id:Id.Lit_Chars val:'https://user1@example.com' span_id:725)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:727)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:729) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:730) (Token id:Id.Lit_Chars val:'\t' span_id:731) ) } ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') remembers other user'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:745) (Token id: Id.Lit_Chars val: '\t\tcheck fill $HELPER <<-\\EOF\n' span_id: 746 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:747) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:748) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:749) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:750) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:751) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:752) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:753) (Token id:Id.Lit_Chars val:'\t\tpassword=pass2\n' span_id:754) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:755) (Token id:Id.Lit_Chars val:'\t' span_id:756) ) } ) ] ) ) (command.ShFunction name: helper_test_timeout body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:HELPER) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Star '$*'))} spids: [769] ) ] ) (C {(test_expect_success)} {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') times out'))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:785) (Token id: Id.Lit_Chars val: '\t\tcheck approve "$HELPER" <<-\\EOF &&\n' span_id: 786 ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:787) (Token id:Id.Lit_Chars val:'\t\thost=timeout.tld\n' span_id:788) (Token id:Id.Lit_Chars val:'\t\tusername=user\n' span_id:789) (Token id:Id.Lit_Chars val:'\t\tpassword=pass\n' span_id:790) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:791) (Token id:Id.Lit_Chars val:'\t\tsleep 2 &&\n' span_id:792) (Token id:Id.Lit_Chars val:'\t\tcheck fill "$HELPER" <<-\\EOF\n' span_id:793) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:794) (Token id:Id.Lit_Chars val:'\t\thost=timeout.tld\n' span_id:795) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:796) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:797) (Token id:Id.Lit_Chars val:'\t\thost=timeout.tld\n' span_id:798) (Token id:Id.Lit_Chars val:'\t\tusername=askpass-username\n' span_id:799) (Token id: Id.Lit_Chars val: '\t\tpassword=askpass-password\n' span_id: 800 ) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:801) (Token id: Id.Lit_Chars val: '\t\taskpass: Username for ' span_id: 802 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:804)) (SQ (Token id:Id.Lit_Chars val:'https://timeout.tld' span_id:806)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:808)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:810) (Token id: Id.Lit_Chars val: '\t\taskpass: Password for ' span_id: 811 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:813)) (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@timeout.tld' span_id:815)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:817)) (SQ (Token id:Id.Lit_Chars val:':\n' span_id:819) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:820) (Token id:Id.Lit_Chars val:'\t' span_id:821) ) } ) ] ) ) (command.Simple words: [{(write_script)} {(askpass)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:831) fd: -1 here_begin: {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:832)) (OF) } here_end_span_id: 838 stdin_parts: [ ('echo >&2 askpass: $*\n') ('what=$(echo $1 | cut -d" " -f1 | tr A-Z a-z | tr -cd a-z)\n') ('echo "askpass-$what"\n') ] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GIT_ASKPASS) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$PWD') (/askpass))} spids: [839] ) ] ) (C {(export)} {(GIT_ASKPASS)}) ] )