(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:'basic credential helper tests' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/lib-credential.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup helper scripts' span_id:24))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:28) 
          (Token id:Id.Lit_Chars val:'\tcat >dump <<-\\EOF &&\n' span_id:29) (Token id:Id.Lit_Chars val:'\twhoami=$(echo $0 | sed s/.*git-credential-//)\n' span_id:30) 
          (Token id:Id.Lit_Chars val:'\techo >&2 "$whoami: $*"\n' span_id:31) (Token id:Id.Lit_Chars val:'\tOIFS=$IFS\n' span_id:32) 
          (Token id:Id.Lit_Chars val:'\tIFS==\n' span_id:33) (Token id:Id.Lit_Chars val:'\twhile read key value; do\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\t\techo >&2 "$whoami: $key=$value"\n' span_id:35) (Token id:Id.Lit_Chars val:'\t\teval "$key=$value"\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\tdone\n' span_id:37) (Token id:Id.Lit_Chars val:'\tIFS=$OIFS\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:39) (Token id:Id.Lit_Chars val:'\n' span_id:40) 
          (Token
            id: Id.Lit_Chars
            val: '\twrite_script git-credential-useless <<-\\EOF &&\n'
            span_id: 41
          ) (Token id:Id.Lit_Chars val:'\t. ./dump\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\texit 0\n' span_id:43) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:44) (Token id:Id.Lit_Chars val:'\n' span_id:45) 
          (Token
            id: Id.Lit_Chars
            val: '\twrite_script git-credential-verbatim <<-\\EOF &&\n'
            span_id: 46
          ) (Token id:Id.Lit_Chars val:'\tuser=$1; shift\n' span_id:47) 
          (Token id:Id.Lit_Chars val:'\tpass=$1; shift\n' span_id:48) (Token id:Id.Lit_Chars val:'\t. ./dump\n' span_id:49) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$user" || echo username=$user\n'
            span_id: 50
          ) (Token id:Id.Lit_Chars val:'\ttest -z "$pass" || echo password=$pass\n' span_id:51) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:52) (Token id:Id.Lit_Chars val:'\n' span_id:53) 
          (Token id:Id.Lit_Chars val:'\tPATH="$PWD:$PATH"\n' span_id:54)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'credential_fill invokes helper' span_id:61))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:65) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill "verbatim foo bar" <<-\\EOF\n'
            span_id: 66
          ) (Token id:Id.Lit_Chars val:'\t--\n' span_id:67) 
          (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:68) (Token id:Id.Lit_Chars val:'\tpassword=bar\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:70) (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:71) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:72)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'credential_fill invokes multiple helpers' span_id:79))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:83) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill useless "verbatim foo bar" <<-\\EOF\n'
            span_id: 84
          ) (Token id:Id.Lit_Chars val:'\t--\n' span_id:85) 
          (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:86) (Token id:Id.Lit_Chars val:'\tpassword=bar\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:88) (Token id:Id.Lit_Chars val:'\tuseless: get\n' span_id:89) 
          (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:90) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:91)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'credential_fill stops when we get a full response'
            span_id: 98
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:102) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill "verbatim one two" "verbatim three four" <<-\\EOF\n'
            span_id: 103
          ) (Token id:Id.Lit_Chars val:'\t--\n' span_id:104) 
          (Token id:Id.Lit_Chars val:'\tusername=one\n' span_id:105) (Token id:Id.Lit_Chars val:'\tpassword=two\n' span_id:106) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:107) (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:108) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:109)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'credential_fill continues through partial response'
            span_id: 116
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:120) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill "verbatim one \\"\\"" "verbatim two three" <<-\\EOF\n'
            span_id: 121
          ) (Token id:Id.Lit_Chars val:'\t--\n' span_id:122) 
          (Token id:Id.Lit_Chars val:'\tusername=two\n' span_id:123) (Token id:Id.Lit_Chars val:'\tpassword=three\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:125) (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:127) (Token id:Id.Lit_Chars val:'\tverbatim: username=one\n' span_id:128) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:129)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'credential_fill passes along metadata' span_id:136))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:140) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill "verbatim one two" <<-\\EOF\n'
            span_id: 141
          ) (Token id:Id.Lit_Chars val:'\tprotocol=ftp\n' span_id:142) 
          (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:143) (Token id:Id.Lit_Chars val:'\tpath=foo.git\n' span_id:144) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:145) (Token id:Id.Lit_Chars val:'\tprotocol=ftp\n' span_id:146) 
          (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:147) (Token id:Id.Lit_Chars val:'\tpath=foo.git\n' span_id:148) 
          (Token id:Id.Lit_Chars val:'\tusername=one\n' span_id:149) (Token id:Id.Lit_Chars val:'\tpassword=two\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:151) (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:152) 
          (Token id:Id.Lit_Chars val:'\tverbatim: protocol=ftp\n' span_id:153) (Token id:Id.Lit_Chars val:'\tverbatim: host=example.com\n' span_id:154) 
          (Token id:Id.Lit_Chars val:'\tverbatim: path=foo.git\n' span_id:155) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:156)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'credential_approve calls all helpers' span_id:163))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:167) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck approve useless "verbatim one two" <<-\\EOF\n'
            span_id: 168
          ) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:169) 
          (Token id:Id.Lit_Chars val:'\tpassword=bar\n' span_id:170) (Token id:Id.Lit_Chars val:'\t--\n' span_id:171) (Token id:Id.Lit_Chars val:'\t--\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\tuseless: store\n' span_id:173) (Token id:Id.Lit_Chars val:'\tuseless: username=foo\n' span_id:174) 
          (Token id:Id.Lit_Chars val:'\tuseless: password=bar\n' span_id:175) (Token id:Id.Lit_Chars val:'\tverbatim: store\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\tverbatim: username=foo\n' span_id:177) (Token id:Id.Lit_Chars val:'\tverbatim: password=bar\n' span_id:178) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:179)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not bother storing password-less credential' span_id:186))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:190) 
          (Token id:Id.Lit_Chars val:'\tcheck approve useless <<-\\EOF\n' span_id:191) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:192) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:193) (Token id:Id.Lit_Chars val:'\t--\n' span_id:194) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:195)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'credential_reject calls all helpers' span_id:203))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:207) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck reject useless "verbatim one two" <<-\\EOF\n'
            span_id: 208
          ) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:209) 
          (Token id:Id.Lit_Chars val:'\tpassword=bar\n' span_id:210) (Token id:Id.Lit_Chars val:'\t--\n' span_id:211) (Token id:Id.Lit_Chars val:'\t--\n' span_id:212) 
          (Token id:Id.Lit_Chars val:'\tuseless: erase\n' span_id:213) (Token id:Id.Lit_Chars val:'\tuseless: username=foo\n' span_id:214) 
          (Token id:Id.Lit_Chars val:'\tuseless: password=bar\n' span_id:215) (Token id:Id.Lit_Chars val:'\tverbatim: erase\n' span_id:216) 
          (Token id:Id.Lit_Chars val:'\tverbatim: username=foo\n' span_id:217) (Token id:Id.Lit_Chars val:'\tverbatim: password=bar\n' span_id:218) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:219)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'usernames can be preserved' span_id:226))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:230) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill "verbatim \\"\\" three" <<-\\EOF\n'
            span_id: 231
          ) (Token id:Id.Lit_Chars val:'\tusername=one\n' span_id:232) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:233) (Token id:Id.Lit_Chars val:'\tusername=one\n' span_id:234) 
          (Token id:Id.Lit_Chars val:'\tpassword=three\n' span_id:235) (Token id:Id.Lit_Chars val:'\t--\n' span_id:236) 
          (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:237) (Token id:Id.Lit_Chars val:'\tverbatim: username=one\n' span_id:238) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:239)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'usernames can be overridden' span_id:246))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:250) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill "verbatim two three" <<-\\EOF\n'
            span_id: 251
          ) (Token id:Id.Lit_Chars val:'\tusername=one\n' span_id:252) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:253) (Token id:Id.Lit_Chars val:'\tusername=two\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\tpassword=three\n' span_id:255) (Token id:Id.Lit_Chars val:'\t--\n' span_id:256) 
          (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:257) (Token id:Id.Lit_Chars val:'\tverbatim: username=one\n' span_id:258) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:259)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'do not bother completing already-full credential'
            span_id: 266
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:270) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill "verbatim three four" <<-\\EOF\n'
            span_id: 271
          ) (Token id:Id.Lit_Chars val:'\tusername=one\n' span_id:272) 
          (Token id:Id.Lit_Chars val:'\tpassword=two\n' span_id:273) (Token id:Id.Lit_Chars val:'\t--\n' span_id:274) 
          (Token id:Id.Lit_Chars val:'\tusername=one\n' span_id:275) (Token id:Id.Lit_Chars val:'\tpassword=two\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:277) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:278)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'empty helper list falls back to internal getpass'
            span_id: 294
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\tcheck fill <<-\\EOF\n' span_id:299) (Token id:Id.Lit_Chars val:'\t--\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\tusername=askpass-username\n' span_id:301) (Token id:Id.Lit_Chars val:'\tpassword=askpass-password\n' span_id:302) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:303) (Token id:Id.Lit_Chars val:'\taskpass: Username:\n' span_id:304) 
          (Token id:Id.Lit_Chars val:'\taskpass: Password:\n' span_id:305) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:306)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'internal getpass does not ask for known username'
            span_id: 313
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:317) 
          (Token id:Id.Lit_Chars val:'\tcheck fill <<-\\EOF\n' span_id:318) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:320) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:321) 
          (Token id:Id.Lit_Chars val:'\tpassword=askpass-password\n' span_id:322) (Token id:Id.Lit_Chars val:'\t--\n' span_id:323) 
          (Token id:Id.Lit_Chars val:'\taskpass: Password:\n' span_id:324) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:325)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:HELPER)
          op: assign_op.Equal
          rhs: 
            {
              (DQ ('!f() {\n') ('\t\tcat >/dev/null\n') ('\t\techo username=foo\n') 
                ('\t\techo password=bar\n') ('\t}; f')
              )
            }
          spids: [329]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'respect configured credentials' span_id:341))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:345) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config credential.helper "$HELPER" &&\n'
            span_id: 346
          ) (Token id:Id.Lit_Chars val:'\tcheck fill <<-\\EOF\n' span_id:347) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:348) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:349) 
          (Token id:Id.Lit_Chars val:'\tpassword=bar\n' span_id:350) (Token id:Id.Lit_Chars val:'\t--\n' span_id:351) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:352)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'match configured credential' span_id:359))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:363) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config credential.https://example.com.helper "$HELPER" &&\n'
            span_id: 364
          ) (Token id:Id.Lit_Chars val:'\tcheck fill <<-\\EOF\n' span_id:365) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:366) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:367) 
          (Token id:Id.Lit_Chars val:'\tpath=repo.git\n' span_id:368) (Token id:Id.Lit_Chars val:'\t--\n' span_id:369) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:370) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:371) 
          (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:372) (Token id:Id.Lit_Chars val:'\tpassword=bar\n' span_id:373) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:374) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:375)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'do not match configured credential' span_id:382))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:386) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config credential.https://foo.helper "$HELPER" &&\n'
            span_id: 387
          ) (Token id:Id.Lit_Chars val:'\tcheck fill <<-\\EOF\n' span_id:388) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:389) (Token id:Id.Lit_Chars val:'\thost=bar\n' span_id:390) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:391) (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:392) 
          (Token id:Id.Lit_Chars val:'\thost=bar\n' span_id:393) (Token id:Id.Lit_Chars val:'\tusername=askpass-username\n' span_id:394) 
          (Token id:Id.Lit_Chars val:'\tpassword=askpass-password\n' span_id:395) (Token id:Id.Lit_Chars val:'\t--\n' span_id:396) 
          (Token id:Id.Lit_Chars val:'\taskpass: Username for ' span_id:397)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:399)) 
        (SQ (Token id:Id.Lit_Chars val:'https://bar' span_id:401)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:403)) 
        (SQ (Token id:Id.Lit_Chars val:':\n' span_id:405) 
          (Token id:Id.Lit_Chars val:'\taskpass: Password for ' span_id:406)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:408)) 
        (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@bar' span_id:410)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:412)) 
        (SQ (Token id:Id.Lit_Chars val:':\n' span_id:414) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:415)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'pull username from config' span_id:422))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:426) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config credential.https://example.com.username foo &&\n'
            span_id: 427
          ) (Token id:Id.Lit_Chars val:'\tcheck fill <<-\\EOF\n' span_id:428) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:429) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:430) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:431) (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:432) 
          (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:433) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:434) 
          (Token id:Id.Lit_Chars val:'\tpassword=askpass-password\n' span_id:435) (Token id:Id.Lit_Chars val:'\t--\n' span_id:436) 
          (Token id:Id.Lit_Chars val:'\taskpass: Password for ' span_id:437)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:439)) 
        (SQ (Token id:Id.Lit_Chars val:'https://foo@example.com' span_id:441)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:443)) 
        (SQ (Token id:Id.Lit_Chars val:':\n' span_id:445) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:446)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'http paths can be part of context' span_id:453))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:457) 
          (Token
            id: Id.Lit_Chars
            val: '\tcheck fill "verbatim foo bar" <<-\\EOF &&\n'
            span_id: 458
          ) (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:459) 
          (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:460) (Token id:Id.Lit_Chars val:'\tpath=foo.git\n' span_id:461) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:462) (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:463) 
          (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:464) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:465) 
          (Token id:Id.Lit_Chars val:'\tpassword=bar\n' span_id:466) (Token id:Id.Lit_Chars val:'\t--\n' span_id:467) 
          (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:468) (Token id:Id.Lit_Chars val:'\tverbatim: protocol=https\n' span_id:469) 
          (Token id:Id.Lit_Chars val:'\tverbatim: host=example.com\n' span_id:470) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:471) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config credential.https://example.com.useHttpPath true &&\n'
            span_id: 472
          ) (Token id:Id.Lit_Chars val:'\tcheck fill "verbatim foo bar" <<-\\EOF\n' span_id:473) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:474) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:475) 
          (Token id:Id.Lit_Chars val:'\tpath=foo.git\n' span_id:476) (Token id:Id.Lit_Chars val:'\t--\n' span_id:477) 
          (Token id:Id.Lit_Chars val:'\tprotocol=https\n' span_id:478) (Token id:Id.Lit_Chars val:'\thost=example.com\n' span_id:479) 
          (Token id:Id.Lit_Chars val:'\tpath=foo.git\n' span_id:480) (Token id:Id.Lit_Chars val:'\tusername=foo\n' span_id:481) 
          (Token id:Id.Lit_Chars val:'\tpassword=bar\n' span_id:482) (Token id:Id.Lit_Chars val:'\t--\n' span_id:483) 
          (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:484) (Token id:Id.Lit_Chars val:'\tverbatim: protocol=https\n' span_id:485) 
          (Token id:Id.Lit_Chars val:'\tverbatim: host=example.com\n' span_id:486) (Token id:Id.Lit_Chars val:'\tverbatim: path=foo.git\n' span_id:487) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:488)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'helpers can abort the process' span_id:495))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:499) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git \\\n' span_id:500) (Token id:Id.Lit_Chars val:'\t\t-c credential.helper="!f() { echo quit=1; }; f" \\\n' span_id:501) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t-c credential.helper="verbatim foo bar" \\\n'
            span_id: 502
          ) (Token id:Id.Lit_Chars val:'\t\tcredential fill >stdout &&\n' span_id:503) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:504) (Token id:Id.Lit_Chars val:'\ttest_cmp expect stdout\n' span_id:505)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'empty helper spec resets helper list' span_id:512))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:516) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config credential.helper "verbatim file file" &&\n'
            span_id: 517
          ) (Token id:Id.Lit_Chars val:'\tcheck fill "" "verbatim cmdline cmdline" <<-\\EOF\n' span_id:518) 
          (Token id:Id.Lit_Chars val:'\t--\n' span_id:519) (Token id:Id.Lit_Chars val:'\tusername=cmdline\n' span_id:520) 
          (Token id:Id.Lit_Chars val:'\tpassword=cmdline\n' span_id:521) (Token id:Id.Lit_Chars val:'\t--\n' span_id:522) 
          (Token id:Id.Lit_Chars val:'\tverbatim: get\n' span_id:523) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:524)
        )
      }
    )
    (C {(test_done)})
  ]
)