(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: { (SQ <'gitweb as standalone script (parsing script output).\n'> <'\n'> <'This test runs gitweb (git web interface) as a CGI script from the\n'> <'commandline, and checks that it produces the correct output, either\n'> <'in the HTTP header or the actual script output.'> ) } spids: [13] ) ] spids: [13] ) (C {(.)} {(./gitweb-lib.sh)}) (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_DGreat fd:16777215 arg_word:{(gitweb_config.perl)} spids:[38]) (HereDoc op_id: Redir_DLess fd: 16777215 body: {('\n') ("$known_snapshot_formats{'tar'} = {\n") ("\t'display' => 'tar',\n") ("\t'type' => 'application/x-tar',\n") ("\t'suffix' => '.tar',\n") ("\t'format' => 'tar',\n") ('};\n') ('\n') ("$feature{'snapshot'}{'default'} = ['tar'];\n") } do_expansion: False here_end: EOF was_filled: True spids: [41] ) ] ) (FuncDef name: check_snapshot body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:basename) op: Equal rhs: {($ VSub_Number '$1')} spids: [75] ) ] spids: [75] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:prefix) op: Equal rhs: { (BracedVarSub token: <VSub_Number 2> suffix_op: (StringUnary op_id: VTest_ColonHyphen arg_word: {(DQ ($ VSub_Number '$1'))} ) spids: [80 86] ) } spids: [79] ) ] spids: [79] ) (C {(echo)} {(DQ ('basename=') ($ VSub_Name '$basename'))}) (AndOr children: [ (SimpleCommand words: [ {(grep)} {(DQ ('filename=.*') ($ VSub_Name '$basename') (.tar))} {(gitweb.headers)} ] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {(/dev/null)} spids: [107] ) (Redir op_id:Redir_GreatAnd fd:2 arg_word:{(1)} spids:[110]) ] ) (AndOr children: [ (SimpleCommand words: [{(DQ ($ VSub_Name '$TAR'))} {(tf)} {(gitweb.body)}] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {(file_list)} spids: [124] ) ] ) (Pipeline children: [ (C {(grep)} {(-v)} {(-e)} {(DQ ('^') ($ VSub_Name '$prefix') (Lit_Other '$'))} {(-e)} {(DQ ('^') ($ VSub_Name '$prefix') (/))} {(-e)} {(DQ ('^pax_global_header') (Lit_Other '$'))} {(file_list)} ) ] negated: True ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [72] ) spids: [67 71] ) (C {(test_expect_success)} {(setup)} { (SQ <'\n'> <'\ttest_commit first foo &&\n'> <'\tgit branch xx/test &&\n'> <'\tFULL_ID=$(git rev-parse --verify HEAD) &&\n'> <'\tSHORT_ID=$(git rev-parse --verify --short=7 HEAD)\n'> ) } ) (C {(test_debug)} {(SQ <'\n'> <'\techo "FULL_ID = $FULL_ID"\n'> <'\techo "SHORT_ID = $SHORT_ID"\n'>)} ) (C {(test_expect_success)} {(SQ <'snapshot: full sha1'>)} { (SQ <'\n'> <'\tgitweb_run "p=.git;a=snapshot;h=$FULL_ID;sf=tar" &&\n'> <'\tcheck_snapshot ".git-$SHORT_ID"\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers && cat file_list'>)}) (C {(test_expect_success)} {(SQ <'snapshot: shortened sha1'>)} { (SQ <'\n'> <'\tgitweb_run "p=.git;a=snapshot;h=$SHORT_ID;sf=tar" &&\n'> <'\tcheck_snapshot ".git-$SHORT_ID"\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers && cat file_list'>)}) (C {(test_expect_success)} {(SQ <'snapshot: almost full sha1'>)} { (SQ <'\n'> <'\tID=$(git rev-parse --short=30 HEAD) &&\n'> <'\tgitweb_run "p=.git;a=snapshot;h=$ID;sf=tar" &&\n'> <'\tcheck_snapshot ".git-$SHORT_ID"\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers && cat file_list'>)}) (C {(test_expect_success)} {(SQ <'snapshot: HEAD'>)} { (SQ <'\n'> <'\tgitweb_run "p=.git;a=snapshot;h=HEAD;sf=tar" &&\n'> <'\tcheck_snapshot ".git-HEAD-$SHORT_ID"\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers && cat file_list'>)}) (C {(test_expect_success)} {(SQ <'snapshot: short branch name (master)'>)} { (SQ <'\n'> <'\tgitweb_run "p=.git;a=snapshot;h=master;sf=tar" &&\n'> <'\tID=$(git rev-parse --verify --short=7 master) &&\n'> <'\tcheck_snapshot ".git-master-$ID"\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers && cat file_list'>)}) (C {(test_expect_success)} {(SQ <'snapshot: short tag name (first)'>)} { (SQ <'\n'> <'\tgitweb_run "p=.git;a=snapshot;h=first;sf=tar" &&\n'> <'\tID=$(git rev-parse --verify --short=7 first) &&\n'> <'\tcheck_snapshot ".git-first-$ID"\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers && cat file_list'>)}) (C {(test_expect_success)} {(SQ <'snapshot: full branch name (refs/heads/master)'>)} { (SQ <'\n'> <'\tgitweb_run "p=.git;a=snapshot;h=refs/heads/master;sf=tar" &&\n'> <'\tID=$(git rev-parse --verify --short=7 master) &&\n'> <'\tcheck_snapshot ".git-master-$ID"\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers && cat file_list'>)}) (C {(test_expect_success)} {(SQ <'snapshot: full tag name (refs/tags/first)'>)} { (SQ <'\n'> <'\tgitweb_run "p=.git;a=snapshot;h=refs/tags/first;sf=tar" &&\n'> <'\tcheck_snapshot ".git-first"\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers && cat file_list'>)}) (C {(test_expect_success)} {(SQ <'snapshot: hierarchical branch name (xx/test)'>)} { (SQ <'\n'> <'\tgitweb_run "p=.git;a=snapshot;h=xx/test;sf=tar" &&\n'> <'\t! grep "filename=.*/" gitweb.headers\n'> ) } ) (C {(test_debug)} {(SQ <'cat gitweb.headers'>)}) (C {(test_expect_success)} {(SQ <'forks: setup'>)} { (SQ <'\n'> <'\tgit init --bare foo.git &&\n'> <'\techo file > file &&\n'> <'\tgit --git-dir=foo.git --work-tree=. add file &&\n'> <'\tgit --git-dir=foo.git --work-tree=. commit -m "Initial commit" &&\n'> <'\techo "foo" > foo.git/description &&\n'> <'\tgit clone --bare foo.git foo.bar.git &&\n'> <'\techo "foo.bar" > foo.bar.git/description &&\n'> <'\tgit clone --bare foo.git foo_baz.git &&\n'> <'\techo "foo_baz" > foo_baz.git/description &&\n'> <'\trm -fr foo &&\n'> <'\tmkdir -p foo &&\n'> <'\t(\n'> <'\t\tcd foo &&\n'> <'\t\tgit clone --shared --bare ../foo.git foo-forked.git &&\n'> <'\t\techo "fork of foo" > foo-forked.git/description\n'> <'\t)\n'> ) } ) (C {(test_expect_success)} {(SQ <'forks: not skipped unless "forks" feature enabled'>)} { (SQ <'\n'> <'\tgitweb_run "a=project_list" &&\n'> <'\tgrep -q ">\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo_baz\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo\\\\.bar\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo_baz\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo/foo-forked\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">fork of .*<" gitweb.body\n'> ) } ) (C {(test_expect_success)} {(SQ <'enable forks feature'>)} { (SQ <'\n'> <'\tcat >>gitweb_config.perl <<-\\EOF\n'> <'\t$feature{"forks"}{"default"} = [1];\n'> <'\tEOF\n'> ) } ) (C {(test_expect_success)} {(SQ <'forks: forks skipped if "forks" feature enabled'>)} { (SQ <'\n'> <'\tgitweb_run "a=project_list" &&\n'> <'\tgrep -q ">\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo_baz\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo\\\\.bar\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">foo_baz\\\\.git<" gitweb.body &&\n'> <'\tgrep -v ">foo/foo-forked\\\\.git<" gitweb.body &&\n'> <'\tgrep -v ">fork of .*<" gitweb.body\n'> ) } ) (C {(test_expect_success)} {(SQ <'forks: "forks" action for forked repository'>)} { (SQ <'\n'> <'\tgitweb_run "p=foo.git;a=forks" &&\n'> <'\tgrep -q ">foo/foo-forked\\\\.git<" gitweb.body &&\n'> <'\tgrep -q ">fork of foo<" gitweb.body\n'> ) } ) (C {(test_expect_success)} {(SQ <'forks: can access forked repository'>)} { (SQ <'\n'> <'\tgitweb_run "p=foo/foo-forked.git;a=summary" &&\n'> <'\tgrep -q "200 OK" gitweb.headers &&\n'> <'\tgrep -q ">fork of foo<" gitweb.body\n'> ) } ) (C {(test_expect_success)} {(SQ <'forks: project_index lists all projects (incl. forks)'>)} { (SQ <'\n'> <'\tcat >expected <<-\\EOF &&\n'> <'\t.git\n'> <'\tfoo.bar.git\n'> <'\tfoo.git\n'> <'\tfoo/foo-forked.git\n'> <'\tfoo_baz.git\n'> <'\tEOF\n'> <'\tgitweb_run "a=project_index" &&\n'> <'\tsed -e "s/ .*//" <gitweb.body | sort >actual &&\n'> <'\ttest_cmp expected actual\n'> ) } ) (FuncDef name: xss body: (BraceGroup children: [ (AndOr children: [ (SimpleCommand words: [{(echo)} {(DQ ('Checking ') ($ VSub_Number '$1') (...))}] redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[504])] ) (AndOr children: [ (C {(gitweb_run)} {(DQ ($ VSub_Number '$1'))}) (If arms: [ (if_arm cond: [ (Sentence child: (C {(grep)} {(DQ ($ VSub_Name '$TAG'))} {(gitweb.body)}) terminator: <Op_Semi ';'> ) ] action: [ (SimpleCommand words: [ {(echo)} { (DQ ('xss: ') ($ VSub_Name '$TAG') (' should have been quoted in output') ) } ] redirects: [ (Redir op_id: Redir_GreatAnd fd: 16777215 arg_word: {(2)} spids: [541] ) ] ) (ControlFlow token: <ControlFlow_Return return> arg_word: {(1)} ) ] spids: [16777215 536] ) ] spids: [16777215 556] ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) (ControlFlow token:<ControlFlow_Return return> arg_word:{(0)}) ] spids: [499] ) spids: [495 498] ) (C {(test_expect_success)} {(SQ <'xss checks'>)} { (SQ <'\n'> <'\tTAG="<magic-xss-tag>" &&\n'> <'\txss "a=rss&p=$TAG" &&\n'> <'\txss "a=rss&p=foo.git&f=$TAG"\n'> ) } ) (C {(test_done)}) ] )