(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:'git web--browse basic tests\n' span_id:9) (Token id:Id.Lit_Chars val:'\n' span_id:10) (Token id: Id.Lit_Chars val: 'This test checks that git web--browse can handle various valid URLs.' span_id: 11 ) ) } spids: [7] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: test_web_browse body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (command.Simple words: [ {(git)} {(web--browse)} {(--browser) (Id.Lit_Equals '=') (DQ ($ Id.VSub_Number '$1'))} {(DQ ($ Id.VSub_Number '$2'))} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:46) fd: -1 arg_word: {(actual)} ) ] ) (command.Simple words: [{(tr)} {(-d)} {(SQ (Token id:Id.Lit_Chars val:'\\015' span_id:57))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Less val:'<' span_id:60) fd: -1 arg_word: {(actual)} ) (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:63) fd: -1 arg_word: {(text)} ) ] ) (C {(test_cmp)} {(expect)} {(text)}) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'URL with an ampersand in it' span_id:83))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:87) (Token id: Id.Lit_Chars val: '\techo http://example.com/foo\\&bar >expect &&\n' span_id: 88 ) (Token id:Id.Lit_Chars val:'\tgit config browser.custom.cmd echo &&\n' span_id:89) (Token id: Id.Lit_Chars val: '\ttest_web_browse custom http://example.com/foo\\&bar\n' span_id: 90 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'URL with a semi-colon in it' span_id:99))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) (Token id: Id.Lit_Chars val: '\techo http://example.com/foo\\;bar >expect &&\n' span_id: 104 ) (Token id:Id.Lit_Chars val:'\tgit config browser.custom.cmd echo &&\n' span_id:105) (Token id: Id.Lit_Chars val: '\ttest_web_browse custom http://example.com/foo\\;bar\n' span_id: 106 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'URL with a hash in it' span_id:115))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:119) (Token id: Id.Lit_Chars val: '\techo http://example.com/foo#bar >expect &&\n' span_id: 120 ) (Token id:Id.Lit_Chars val:'\tgit config browser.custom.cmd echo &&\n' span_id:121) (Token id: Id.Lit_Chars val: '\ttest_web_browse custom http://example.com/foo#bar\n' span_id: 122 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'browser paths are properly quoted' span_id:131))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:135) (Token id: Id.Lit_Chars val: '\techo fake: http://example.com/foo >expect &&\n' span_id: 136 ) (Token id:Id.Lit_Chars val:'\tcat >"fake browser" <<-\\EOF &&\n' span_id:137) (Token id:Id.Lit_Chars val:'\t#!/bin/sh\n' span_id:138) (Token id:Id.Lit_Chars val:'\techo fake: "$@"\n' span_id:139) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:140) (Token id:Id.Lit_Chars val:'\tchmod +x "fake browser" &&\n' span_id:141) (Token id: Id.Lit_Chars val: '\tgit config browser.w3m.path "$(pwd)/fake browser" &&\n' span_id: 142 ) (Token id:Id.Lit_Chars val:'\ttest_web_browse w3m http://example.com/foo\n' span_id:143) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'browser command allows arbitrary shell code' span_id:152))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:156) (Token id: Id.Lit_Chars val: '\techo "arg: http://example.com/foo" >expect &&\n' span_id: 157 ) (Token id:Id.Lit_Chars val:'\tgit config browser.custom.cmd "\n' span_id:158) (Token id:Id.Lit_Chars val:'\t\tf() {\n' span_id:159) (Token id:Id.Lit_Chars val:'\t\t\tfor i in \\"\\$@\\"; do\n' span_id:160) (Token id:Id.Lit_Chars val:'\t\t\t\techo arg: \\$i\n' span_id:161) (Token id:Id.Lit_Chars val:'\t\t\tdone\n' span_id:162) (Token id:Id.Lit_Chars val:'\t\t}\n' span_id:163) (Token id:Id.Lit_Chars val:'\t\tf" &&\n' span_id:164) (Token id: Id.Lit_Chars val: '\ttest_web_browse custom http://example.com/foo\n' span_id: 165 ) ) } ) (C {(test_done)}) ] )