(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: 'gitweb as standalone script (basic tests).\n'
                  span_id: 15
                ) (Token id:Id.Lit_Chars val:'\n' span_id:16) 
                (Token
                  id: Id.Lit_Chars
                  val: 'This test runs gitweb (git web interface) as CGI script from\n'
                  span_id: 17
                ) (Token id:Id.Lit_Chars val:'commandline, and checks that it would not write any errors\n' span_id:18) 
                (Token id:Id.Lit_Chars val:'or warnings to log.' span_id:19)
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./gitweb-lib.sh)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no commits: projects_list (implicit)' span_id:41))} {(SQ (Token id:Id.Lit_Chars val:gitweb_run span_id:47))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no commits: projects_index' span_id:56))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "a=project_index"' span_id:62))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no commits: .git summary (implicit)' span_id:71))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git"' span_id:77))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no commits: .git commit (implicit HEAD)' span_id:86))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commit"' span_id:92))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no commits: .git commitdiff (implicit HEAD)' span_id:101))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commitdiff"' span_id:107))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no commits: .git tree (implicit HEAD)' span_id:116))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=tree"' span_id:122))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'no commits: .git heads' span_id:131))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=heads"' span_id:137))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'no commits: .git tags' span_id:146))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=tags"' span_id:152))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Make initial commit' span_id:169))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'echo "Not an empty file." > file &&\n' span_id:175) 
          (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:176) (Token id:Id.Lit_Chars val:'\t git commit -a -m "Initial commit." &&\n' span_id:177) 
          (Token id:Id.Lit_Chars val:'\t git branch b' span_id:178)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'projects_list (implicit)' span_id:187))} 
      {(SQ (Token id:Id.Lit_Chars val:gitweb_run span_id:193))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:projects_index span_id:202))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "a=project_index"' span_id:208))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'.git summary (implicit)' span_id:217))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git"' span_id:223))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'.git commit (implicit HEAD)' span_id:232))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commit"' span_id:238))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'.git commitdiff (implicit HEAD, root commit)' span_id:247))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commitdiff"' span_id:253))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '.git commitdiff_plain (implicit HEAD, root commit)'
            span_id: 262
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commitdiff_plain"' span_id:268))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'.git commit (HEAD)' span_id:277))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commit;h=HEAD"' span_id:283))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'.git tree (implicit HEAD)' span_id:292))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=tree"' span_id:298))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'.git blob (file)' span_id:307))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=blob;f=file"' span_id:313))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'.git blob_plain (file)' span_id:322))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=blob_plain;f=file"' span_id:328))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'.git commit (non-existent)' span_id:344))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commit;h=non-existent"' span_id:350))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'.git commitdiff (non-existent)' span_id:359))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commitdiff;h=non-existent"' span_id:365))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'.git commitdiff (non-existent vs HEAD)' span_id:374))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=commitdiff;hp=non-existent;h=HEAD"'
            span_id: 380
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '.git tree (0000000000000000000000000000000000000000)'
            span_id: 389
          )
        )
      } 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=tree;h=0000000000000000000000000000000000000000"'
            span_id: 395
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '.git tag (0000000000000000000000000000000000000000)'
            span_id: 404
          )
        )
      } 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=tag;h=0000000000000000000000000000000000000000"'
            span_id: 410
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'.git blob (non-existent)' span_id:419))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=blob;f=non-existent"' span_id:425))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'.git blob_plain (non-existent)' span_id:434))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=blob_plain;f=non-existent"' span_id:440))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): root' span_id:457))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commitdiff"' span_id:463))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): file added' span_id:472))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'echo "New file" > new_file &&\n' span_id:478) 
          (Token id:Id.Lit_Chars val:'\t git add new_file &&\n' span_id:479) (Token id:Id.Lit_Chars val:'\t git commit -a -m "File added." &&\n' span_id:480) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:481)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): mode change' span_id:490))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'test_chmod +x new_file &&\n' span_id:496) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -a -m "Mode changed." &&\n'
            span_id: 497
          ) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:498)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): file renamed' span_id:507))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git mv new_file renamed_file &&\n' span_id:513) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -a -m "File renamed." &&\n'
            span_id: 514
          ) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:515)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): file to symlink' span_id:524))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'rm renamed_file &&\n' span_id:530) 
          (Token id:Id.Lit_Chars val:'\t test_ln_s_add file renamed_file &&\n' span_id:531) (Token id:Id.Lit_Chars val:'\t git commit -a -m "File to symlink." &&\n' span_id:532) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:533)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): file deleted' span_id:542))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git rm renamed_file &&\n' span_id:548) 
          (Token id:Id.Lit_Chars val:'\t rm -f renamed_file &&\n' span_id:549) (Token id:Id.Lit_Chars val:'\t git commit -a -m "File removed." &&\n' span_id:550) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:551)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): file copied / new file' span_id:560))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'cp file file2 &&\n' span_id:566) 
          (Token id:Id.Lit_Chars val:'\t git add file2 &&\n' span_id:567) (Token id:Id.Lit_Chars val:'\t git commit -a -m "File copied." &&\n' span_id:568) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:569)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): mode change and modified' span_id:578))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'echo "New line" >> file2 &&\n' span_id:584) 
          (Token id:Id.Lit_Chars val:'\t test_chmod +x file2 &&\n' span_id:585) (Token id:Id.Lit_Chars val:'\t git commit -a -m "Mode change and modification." &&\n' span_id:586) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:587)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): renamed and modified' span_id:596))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'cat >file2<<EOF &&\n' span_id:602) 
          (Token id:Id.Lit_Chars val:'Dominus regit me,\n' span_id:603) (Token id:Id.Lit_Chars val:'et nihil mihi deerit.\n' span_id:604) 
          (Token id:Id.Lit_Chars val:'In loco pascuae ibi me collocavit,\n' span_id:605) (Token id:Id.Lit_Chars val:'super aquam refectionis educavit me;\n' span_id:606) 
          (Token id:Id.Lit_Chars val:'animam meam convertit,\n' span_id:607) (Token id:Id.Lit_Chars val:'deduxit me super semitas jusitiae,\n' span_id:608) 
          (Token id:Id.Lit_Chars val:'propter nomen suum.\n' span_id:609) (Token id:Id.Lit_Chars val:'EOF\n' span_id:610) 
          (Token id:Id.Lit_Chars val:'\t git commit -a -m "File added." &&\n' span_id:611) (Token id:Id.Lit_Chars val:'\t git mv file2 file3 &&\n' span_id:612) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "Propter nomen suum." >> file3 &&\n'
            span_id: 613
          ) (Token id:Id.Lit_Chars val:'\t git commit -a -m "File rename and modification." &&\n' span_id:614) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:615)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'commitdiff(0): renamed, mode change and modified'
            span_id: 624
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'git mv file3 file2 &&\n' span_id:630) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "Propter nomen suum." >> file2 &&\n'
            span_id: 631
          ) (Token id:Id.Lit_Chars val:'\t test_chmod +x file2 &&\n' span_id:632) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -a -m "File rename, mode change and modification." &&\n'
            span_id: 633
          ) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commitdiff"' span_id:634)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup typechange commits' span_id:648))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:652) 
          (Token id:Id.Lit_Chars val:'\techo "hello world" > foo &&\n' span_id:653) (Token id:Id.Lit_Chars val:'\techo "hi planet" > bar &&\n' span_id:654) 
          (Token id:Id.Lit_Chars val:'\tgit update-index --add foo bar &&\n' span_id:655) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:656) 
          (Token id:Id.Lit_Chars val:'\tgit branch initial &&\n' span_id:657) (Token id:Id.Lit_Chars val:'\trm -f foo &&\n' span_id:658) 
          (Token id:Id.Lit_Chars val:'\ttest_ln_s_add bar foo &&\n' span_id:659) (Token id:Id.Lit_Chars val:'\tgit commit -m "foo symlinked to bar" &&\n' span_id:660) 
          (Token id:Id.Lit_Chars val:'\tgit branch foo-symlinked-to-bar &&\n' span_id:661) (Token id:Id.Lit_Chars val:'\trm -f foo &&\n' span_id:662) 
          (Token id:Id.Lit_Chars val:'\techo "how far is the sun?" > foo &&\n' span_id:663) (Token id:Id.Lit_Chars val:'\tgit update-index foo &&\n' span_id:664) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "foo back to file" &&\n' span_id:665) (Token id:Id.Lit_Chars val:'\tgit branch foo-back-to-file &&\n' span_id:666) 
          (Token id:Id.Lit_Chars val:'\trm -f foo &&\n' span_id:667) (Token id:Id.Lit_Chars val:'\tgit update-index --remove foo &&\n' span_id:668) 
          (Token id:Id.Lit_Chars val:'\tmkdir foo &&\n' span_id:669) (Token id:Id.Lit_Chars val:'\techo "if only I knew" > foo/baz &&\n' span_id:670) 
          (Token id:Id.Lit_Chars val:'\tgit update-index --add foo/baz &&\n' span_id:671) (Token id:Id.Lit_Chars val:'\tgit commit -m "foo becomes a directory" &&\n' span_id:672) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit branch "foo-becomes-a-directory" &&\n'
            span_id: 673
          ) (Token id:Id.Lit_Chars val:'\techo "hello world" > foo/baz &&\n' span_id:674) 
          (Token id:Id.Lit_Chars val:'\tgit update-index foo/baz &&\n' span_id:675) (Token id:Id.Lit_Chars val:'\tgit commit -m "foo/baz is the original foo" &&\n' span_id:676) 
          (Token id:Id.Lit_Chars val:'\tgit branch foo-baz-renamed-from-foo\n' span_id:677) (Token id:Id.Lit_Chars val:'\t' span_id:678)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(2): file renamed from foo to foo/baz' span_id:687))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-baz-renamed-from-foo"'
            span_id: 693
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(2): file renamed from foo/baz to foo' span_id:702))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=commitdiff;hp=foo-baz-renamed-from-foo;h=initial"'
            span_id: 708
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(2): directory becomes file' span_id:717))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=initial"'
            span_id: 723
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(2): file becomes directory' span_id:732))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-becomes-a-directory"'
            span_id: 738
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(2): file becomes symlink' span_id:747))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-symlinked-to-bar"'
            span_id: 753
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(2): symlink becomes file' span_id:762))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-back-to-file"'
            span_id: 768
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(2): symlink becomes directory' span_id:777))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'gitweb_run "p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-becomes-a-directory"'
            span_id: 783
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(2): directory becomes symlink' span_id:792))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=foo-symlinked-to-bar"'
            span_id: 798
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup incomplete lines' span_id:812))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:816) 
          (Token id:Id.Lit_Chars val:'\tcat >file<<-\\EOF &&\n' span_id:817) (Token id:Id.Lit_Chars val:'\tDominus regit me,\n' span_id:818) 
          (Token id:Id.Lit_Chars val:'\tet nihil mihi deerit.\n' span_id:819) (Token id:Id.Lit_Chars val:'\tIn loco pascuae ibi me collocavit,\n' span_id:820) 
          (Token
            id: Id.Lit_Chars
            val: '\tsuper aquam refectionis educavit me;\n'
            span_id: 821
          ) (Token id:Id.Lit_Chars val:'\tanimam meam convertit,\n' span_id:822) 
          (Token id:Id.Lit_Chars val:'\tdeduxit me super semitas jusitiae,\n' span_id:823) (Token id:Id.Lit_Chars val:'\tpropter nomen suum.\n' span_id:824) 
          (Token id:Id.Lit_Chars val:'\tCHANGE_ME\n' span_id:825) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:826) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Preparing for incomplete lines" &&\n'
            span_id: 827
          ) (Token id:Id.Lit_Chars val:'\techo "incomplete" | tr -d "\\\\012" >>file &&\n' span_id:828) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Add incomplete line" &&\n'
            span_id: 829
          ) (Token id:Id.Lit_Chars val:'\tgit tag incomplete_lines_add &&\n' span_id:830) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e s/CHANGE_ME/change_me/ <file >file+ &&\n'
            span_id: 831
          ) (Token id:Id.Lit_Chars val:'\tmv -f file+ file &&\n' span_id:832) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Incomplete context line" &&\n'
            span_id: 833
          ) (Token id:Id.Lit_Chars val:'\tgit tag incomplete_lines_ctx &&\n' span_id:834) 
          (Token id:Id.Lit_Chars val:'\techo "Dominus regit me," >file &&\n' span_id:835) (Token id:Id.Lit_Chars val:'\techo "incomplete line" | tr -d "\\\\012" >>file &&\n' span_id:836) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "Change incomplete line" &&\n'
            span_id: 837
          ) (Token id:Id.Lit_Chars val:'\tgit tag incomplete_lines_chg &&\n' span_id:838) 
          (Token id:Id.Lit_Chars val:'\techo "Dominus regit me," >file &&\n' span_id:839) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "Remove incomplete line" &&\n' span_id:840) 
          (Token id:Id.Lit_Chars val:'\tgit tag incomplete_lines_rem\n' span_id:841)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(1): addition of incomplete line' span_id:848))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:852) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=incomplete_lines_add"\n'
            span_id: 853
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(1): incomplete line as context line' span_id:860))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:864) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=incomplete_lines_ctx"\n'
            span_id: 865
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(1): change incomplete line' span_id:872))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:876) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=incomplete_lines_chg"\n'
            span_id: 877
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(1): removal of incomplete line' span_id:884))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:888) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=incomplete_lines_rem"\n'
            span_id: 889
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Create a merge' span_id:904))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git checkout b &&\n' span_id:910) 
          (Token id:Id.Lit_Chars val:'\t echo "Branch" >> b &&\n' span_id:911) (Token id:Id.Lit_Chars val:'\t git add b &&\n' span_id:912) 
          (Token id:Id.Lit_Chars val:'\t git commit -a -m "On branch" &&\n' span_id:913) (Token id:Id.Lit_Chars val:'\t git checkout master &&\n' span_id:914) 
          (Token id:Id.Lit_Chars val:'\t git merge b &&\n' span_id:915) (Token id:Id.Lit_Chars val:'\t git tag merge_commit' span_id:916)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'commit(0): merge commit' span_id:925))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commit"' span_id:931))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(0): merge commit' span_id:940))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commitdiff"' span_id:946))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Prepare large commit' span_id:955))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git checkout b &&\n' span_id:961) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "To be changed" > 01-change &&\n'
            span_id: 962
          ) (Token id:Id.Lit_Chars val:'\t echo "To be renamed" > 02-pure-rename-from &&\n' span_id:963) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "To be deleted" > 03-delete &&\n'
            span_id: 964
          ) (Token id:Id.Lit_Chars val:'\t echo "To be renamed and changed" > 04-rename-from &&\n' span_id:965) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "To have mode changed" > 05-mode-change &&\n'
            span_id: 966
          ) (Token id:Id.Lit_Chars val:'\t echo "File to symlink" > 06-file-or-symlink &&\n' span_id:967) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "To be changed and have mode changed" > 07-change-mode-change\t&&\n'
            span_id: 968
          ) (Token id:Id.Lit_Chars val:'\t git add 0* &&\n' span_id:969) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -a -m "Prepare large commit" &&\n'
            span_id: 970
          ) (Token id:Id.Lit_Chars val:'\t echo "Changed" > 01-change &&\n' span_id:971) 
          (Token
            id: Id.Lit_Chars
            val: '\t git mv 02-pure-rename-from 02-pure-rename-to &&\n'
            span_id: 972
          ) (Token id:Id.Lit_Chars val:'\t git rm 03-delete && rm -f 03-delete &&\n' span_id:973) 
          (Token id:Id.Lit_Chars val:'\t echo "A new file" > 03-new &&\n' span_id:974) (Token id:Id.Lit_Chars val:'\t git add 03-new &&\n' span_id:975) 
          (Token
            id: Id.Lit_Chars
            val: '\t git mv 04-rename-from 04-rename-to &&\n'
            span_id: 976
          ) (Token id:Id.Lit_Chars val:'\t echo "Changed" >> 04-rename-to &&\n' span_id:977) 
          (Token id:Id.Lit_Chars val:'\t test_chmod +x 05-mode-change &&\n' span_id:978) (Token id:Id.Lit_Chars val:'\t rm -f 06-file-or-symlink &&\n' span_id:979) 
          (Token
            id: Id.Lit_Chars
            val: '\t test_ln_s_add 01-change 06-file-or-symlink &&\n'
            span_id: 980
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "Changed and have mode changed" > 07-change-mode-change\t&&\n'
            span_id: 981
          ) (Token id:Id.Lit_Chars val:'\t test_chmod +x 07-change-mode-change &&\n' span_id:982) 
          (Token id:Id.Lit_Chars val:'\t git commit -a -m "Large commit" &&\n' span_id:983) (Token id:Id.Lit_Chars val:'\t git checkout master' span_id:984)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'commit(1): large commit' span_id:993))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commit;h=b"' span_id:999))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'commitdiff(1): large commit' span_id:1008))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=commitdiff;h=b"' span_id:1014))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'side-by-side: addition of incomplete line' span_id:1028))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1032) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=incomplete_lines_add;ds=sidebyside"\n'
            span_id: 1033
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'side-by-side: incomplete line as context line' span_id:1040))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1044) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=incomplete_lines_ctx;ds=sidebyside"\n'
            span_id: 1045
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'side-by-side: changed incomplete line' span_id:1052))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1056) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=incomplete_lines_chg;ds=sidebyside"\n'
            span_id: 1057
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'side-by-side: removal of incomplete line' span_id:1064))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1068) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=incomplete_lines_rem;ds=sidebyside"\n'
            span_id: 1069
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'side-by-side: merge commit' span_id:1076))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1080) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=commitdiff;h=merge_commit;ds=sidebyside"\n'
            span_id: 1081
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'tags: list of different types of tags' span_id:1097))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git checkout master &&\n' span_id:1103) 
          (Token
            id: Id.Lit_Chars
            val: '\t git tag -a -m "Tag commit object" tag-commit HEAD &&\n'
            span_id: 1104
          ) (Token id:Id.Lit_Chars val:'\t git tag -a -m "" tag-commit-nomessage HEAD &&\n' span_id:1105) 
          (Token
            id: Id.Lit_Chars
            val: '\t git tag -a -m "Tag tag object" tag-tag tag-commit &&\n'
            span_id: 1106
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t git tag -a -m "Tag tree object" tag-tree HEAD^{tree} &&\n'
            span_id: 1107
          ) (Token id:Id.Lit_Chars val:'\t git tag -a -m "Tag blob object" tag-blob HEAD:file &&\n' span_id:1108) 
          (Token
            id: Id.Lit_Chars
            val: '\t git tag lightweight/tag-commit HEAD &&\n'
            span_id: 1109
          ) (Token id:Id.Lit_Chars val:'\t git tag lightweight/tag-tag tag-commit &&\n' span_id:1110) 
          (Token
            id: Id.Lit_Chars
            val: '\t git tag lightweight/tag-tree HEAD^{tree} &&\n'
            span_id: 1111
          ) (Token id:Id.Lit_Chars val:'\t git tag lightweight/tag-blob HEAD:file &&\n' span_id:1112) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=tags"' span_id:1113)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'tag: Tag to commit object' span_id:1122))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=tag;h=tag-commit"' span_id:1128))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'tag: on lightweight tag (invalid)' span_id:1137))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=tag;h=lightweight/tag-commit"' span_id:1143))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'logs: log (implicit HEAD)' span_id:1159))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=log"' span_id:1165))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'logs: shortlog (implicit HEAD)' span_id:1174))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=shortlog"' span_id:1180))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'logs: history (implicit HEAD, file)' span_id:1189))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=history;f=file"' span_id:1195))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'logs: history (implicit HEAD, non-existent file)'
            span_id: 1204
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=history;f=non-existent"' span_id:1210))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'logs: history (implicit HEAD, deleted file)' span_id:1219))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git checkout master &&\n' span_id:1225) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "to be deleted" > deleted_file &&\n'
            span_id: 1226
          ) (Token id:Id.Lit_Chars val:'\t git add deleted_file &&\n' span_id:1227) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -m "Add file to be deleted" &&\n'
            span_id: 1228
          ) (Token id:Id.Lit_Chars val:'\t git rm deleted_file &&\n' span_id:1229) 
          (Token id:Id.Lit_Chars val:'\t git commit -m "Delete file" &&\n' span_id:1230) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=history;f=deleted_file"' span_id:1231)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'path_info: project' span_id:1246))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git"' span_id:1252))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'path_info: project/branch' span_id:1261))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/b"' span_id:1267))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'path_info: project/branch:file' span_id:1276))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/master:file"' span_id:1282))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'path_info: project/branch:dir/' span_id:1291))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/master:foo/"' span_id:1297))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'path_info: project/branch (non-existent)' span_id:1306))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/non-existent"' span_id:1312))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'path_info: project/branch:filename (non-existent branch)'
            span_id: 1321
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/non-existent:non-existent"' span_id:1327))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'path_info: project/branch:file (non-existent)' span_id:1336))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/master:non-existent"' span_id:1342))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'path_info: project/branch:dir/ (non-existent)' span_id:1351))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/master:non-existent/"' span_id:1357))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'path_info: project/branch:/file' span_id:1367))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/master:/file"' span_id:1373))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'path_info: project/:/file (implicit HEAD)' span_id:1382))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/:/file"' span_id:1388))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'path_info: project/:/ (implicit HEAD, top tree)'
            span_id: 1397
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "" "/.git/:/"' span_id:1403))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'feeds: OPML' span_id:1420))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "a=opml"' span_id:1426))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'feed: RSS' span_id:1435))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=rss"' span_id:1441))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'feed: Atom' span_id:1450))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=atom"' span_id:1456))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'encode(commit): utf8' span_id:1472))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'. "$TEST_DIRECTORY"/t3901-utf8.txt &&\n' span_id:1478) 
          (Token
            id: Id.Lit_Chars
            val: '\t test_when_finished "GIT_AUTHOR_NAME=\\"A U Thor\\"" &&\n'
            span_id: 1479
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t test_when_finished "GIT_COMMITTER_NAME=\\"C O Mitter\\"" &&\n'
            span_id: 1480
          ) (Token id:Id.Lit_Chars val:'\t echo "UTF-8" >> file &&\n' span_id:1481) 
          (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:1482) (Token id:Id.Lit_Chars val:'\t git commit -F "$TEST_DIRECTORY"/t3900/1-UTF-8.txt &&\n' span_id:1483) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commit"' span_id:1484)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'encode(commit): iso-8859-1' span_id:1493))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'. "$TEST_DIRECTORY"/t3901-8859-1.txt &&\n' span_id:1499) 
          (Token
            id: Id.Lit_Chars
            val: '\t test_when_finished "GIT_AUTHOR_NAME=\\"A U Thor\\"" &&\n'
            span_id: 1500
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t test_when_finished "GIT_COMMITTER_NAME=\\"C O Mitter\\"" &&\n'
            span_id: 1501
          ) (Token id:Id.Lit_Chars val:'\t echo "ISO-8859-1" >> file &&\n' span_id:1502) 
          (Token id:Id.Lit_Chars val:'\t git add file &&\n' span_id:1503) (Token id:Id.Lit_Chars val:'\t test_config i18n.commitencoding ISO-8859-1 &&\n' span_id:1504) 
          (Token
            id: Id.Lit_Chars
            val: '\t git commit -F "$TEST_DIRECTORY"/t3900/ISO8859-1.txt &&\n'
            span_id: 1505
          ) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=commit"' span_id:1506)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'encode(log): utf-8 and iso-8859-1' span_id:1515))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=log"' span_id:1521))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'opt: log --no-merges' span_id:1537))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=log;opt=--no-merges"' span_id:1543))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'opt: atom --no-merges' span_id:1552))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=log;opt=--no-merges"' span_id:1558))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'opt: "file" history --no-merges' span_id:1567))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=history;f=file;opt=--no-merges"' span_id:1573))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'opt: log --no-such-option (invalid option)' span_id:1582))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=log;opt=--no-such-option"' span_id:1588))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'opt: tree --no-merges (invalid option for action)'
            span_id: 1597
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=tree;opt=--no-merges"' span_id:1603))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'URL: no project URLs, no base URL' span_id:1619))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=summary"' span_id:1625))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'URL: project URLs via gitweb.url' span_id:1634))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git config --add gitweb.url git://example.com/git/trash.git &&\n'
            span_id: 1640
          ) 
          (Token
            id: Id.Lit_Chars
            val: '        git config --add gitweb.url http://example.com/git/trash.git &&\n'
            span_id: 1641
          ) (Token id:Id.Lit_Chars val:'        gitweb_run "p=.git;a=summary"' span_id:1642)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1648)
          fd: -1
          arg_word: {(.git/cloneurl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1651)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1652)) 
              (OF)
            }
          here_end_span_id: 1657
          stdin_parts: [('git://example.com/git/trash.git\n') ('http://example.com/git/trash.git\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'URL: project URLs via cloneurl file' span_id:1664))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=summary"' span_id:1670))}
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_DGreat val:'>>' span_id:1683)
          fd: -1
          arg_word: {(gitweb_config.perl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1686)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1687)) 
              (OF)
            }
          here_end_span_id: 1697
          stdin_parts: [
            ('\n')
            ('# turn on override for each overridable feature\n')
            ('foreach my $key (keys %feature) {\n')
            ("\tif ($feature{$key}{'sub'}) {\n")
            ("\t\t$feature{$key}{'override'} = 1;\n")
            ('\t}\n')
            ('}\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'config override: projects list (implicit)' span_id:1704))} {(SQ (Token id:Id.Lit_Chars val:gitweb_run span_id:1710))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'config override: tree view, features not overridden in repo config'
            span_id: 1719
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=tree"' span_id:1725))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'config override: tree view, features disabled in repo config'
            span_id: 1734
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'git config gitweb.blame no &&\n' span_id:1740) 
          (Token
            id: Id.Lit_Chars
            val: '\t git config gitweb.snapshot none &&\n'
            span_id: 1741
          ) (Token id:Id.Lit_Chars val:'\t git config gitweb.avatar gravatar &&\n' span_id:1742) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=tree"' span_id:1743)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'config override: tree view, features enabled in repo config (1)'
            span_id: 1752
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'git config gitweb.blame yes &&\n' span_id:1758) 
          (Token
            id: Id.Lit_Chars
            val: '\t git config gitweb.snapshot "zip,tgz, tbz2" &&\n'
            span_id: 1759
          ) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=tree"' span_id:1760)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1766)
          fd: -1
          arg_word: {(.git/config)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1769)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1770)) 
              (OF)
            }
          here_end_span_id: 1777
          stdin_parts: [
            ('# testing noval and alternate separator\n')
            ('[gitweb]\n')
            ('\tblame\n')
            ('\tsnapshot = zip tgz\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'config override: tree view, features enabled in repo config (2)'
            span_id: 1783
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=.git;a=tree"' span_id:1789))}
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_DGreat val:'>>' span_id:1802)
          fd: -1
          arg_word: {(gitweb_config.perl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1805)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1806)) 
              (OF)
            }
          here_end_span_id: 1814
          stdin_parts: [
            ('\n')
            ('# enable search\n')
            ("$feature{'search'}{'default'} = [1];\n")
            ("$feature{'grep'}{'default'} = [1];\n")
            ("$feature{'pickaxe'}{'default'} = [1];\n")
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'search: preparation' span_id:1821))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'echo "1st MATCH" >>file &&\n' span_id:1827) 
          (Token id:Id.Lit_Chars val:'\t echo "2nd MATCH" >>file &&\n' span_id:1828) (Token id:Id.Lit_Chars val:'\t echo "MATCH" >>bar &&\n' span_id:1829) 
          (Token id:Id.Lit_Chars val:'\t git add file bar &&\n' span_id:1830) (Token id:Id.Lit_Chars val:'\t git commit -m "Added MATCH word"' span_id:1831)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'search: commit author' span_id:1840))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=search;h=HEAD;st=author;s=A+U+Thor"'
            span_id: 1846
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'search: commit message' span_id:1855))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=search;h=HEAD;st=commitr;s=MATCH"'
            span_id: 1861
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'search: grep' span_id:1870))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=search;h=HEAD;st=grep;s=MATCH"'
            span_id: 1876
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'search: pickaxe' span_id:1885))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=search;h=HEAD;st=pickaxe;s=MATCH"'
            span_id: 1891
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'search: projects' span_id:1900))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "a=project_list;s=.git"' span_id:1906))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'README.html with non-ASCII characters (utf-8)' span_id:1922))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'echo "<b>UTF-8 example:</b><br />" > .git/README.html &&\n'
            span_id: 1928
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t cat "$TEST_DIRECTORY"/t3900/1-UTF-8.txt >> .git/README.html &&\n'
            span_id: 1929
          ) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=summary"' span_id:1930)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:highlight_version)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1943)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.Simple
                        words: [{(highlight)} {(--version)}]
                        redirects: [
                          (redir.Redir
                            op: (Token id:Id.Redir_Less val:'<' span_id:1948)
                            fd: -1
                            arg_word: {(/dev/null)}
                          )
                          (redir.Redir
                            op: (Token id:Id.Redir_Great val:'2>' span_id:1951)
                            fd: 2
                            arg_word: {(/dev/null)}
                          )
                        ]
                      )
                    ]
                  )
              )
            }
          spids: [1942]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {($ Id.VSub_QMark '$?')} {(-eq)} {(127)} 
                  {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:1966)
            )
          ]
          action: [(C {(say)} {(DQ ("Skipping syntax highlighting tests: 'highlight' not found"))})]
          spids: [1955 1968]
        )
        (if_arm
          cond: [
            (command.Sentence
              child: (C {(test)} {(-z)} {(DQ ($ Id.VSub_DollarName '$highlight_version'))})
              terminator: (Token id:Id.Op_Semi val:';' span_id:1986)
            )
          ]
          action: [
            (C {(say)} {(DQ ("Skipping syntax highlighting tests: incorrect 'highlight' found"))})
          ]
          spids: [1977 1988]
        )
      ]
      else_action: [
        (C {(test_set_prereq)} {(HIGHLIGHT)})
        (command.Simple
          words: [{(cat)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_DGreat val:'>>' span_id:2007)
              fd: -1
              arg_word: {(gitweb_config.perl)}
            )
            (redir.HereDoc
              op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:2010)
              fd: -1
              here_begin: 
                {
                  (word_part.EscapedLiteral
                    token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:2011)
                  ) (OF)
                }
              here_end_span_id: 2016
              stdin_parts: [
                ('our $highlight_bin = "highlight";\n')
                ("$feature{'highlight'}{'override'} = 1;\n")
              ]
            )
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(HIGHLIGHT)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'syntax highlighting (no highlight, unknown syntax)'
            span_id: 2027
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'git config gitweb.highlight yes &&\n' span_id:2033) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=blob;f=file"' span_id:2034)
        )
      }
    )
    (C {(test_expect_success)} {(HIGHLIGHT)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'syntax highlighting (highlighted, shell script)'
            span_id: 2045
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'git config gitweb.highlight yes &&\n' span_id:2051) 
          (Token id:Id.Lit_Chars val:'\t echo "#!/usr/bin/sh" > test.sh &&\n' span_id:2052) (Token id:Id.Lit_Chars val:'\t git add test.sh &&\n' span_id:2053) 
          (Token id:Id.Lit_Chars val:'\t git commit -m "Add test.sh" &&\n' span_id:2054) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=blob;f=test.sh"' span_id:2055)
        )
      }
    )
    (C {(test_expect_success)} {(HIGHLIGHT)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'syntax highlighting (highlighter language autodetection)'
            span_id: 2066
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'git config gitweb.highlight yes &&\n' span_id:2072) 
          (Token id:Id.Lit_Chars val:'\t echo "#!/usr/bin/perl" > test &&\n' span_id:2073) (Token id:Id.Lit_Chars val:'\t git add test &&\n' span_id:2074) 
          (Token id:Id.Lit_Chars val:'\t git commit -m "Add test" &&\n' span_id:2075) (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=blob;f=test"' span_id:2076)
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.Simple
          words: [{(cat)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_DGreat val:'>>' span_id:2089)
              fd: -1
              arg_word: {(gitweb_config.perl)}
            )
            (redir.HereDoc
              op: (Token id:Id.Redir_DLess val:'<<' span_id:2092)
              fd: -1
              here_begin: 
                {
                  (word_part.EscapedLiteral
                    token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:2093)
                  ) (OF)
                }
              here_end_span_id: 2099
              stdin_parts: [("$feature{'forks'}{'default'} = [1];\n")]
            )
          ]
        )
        (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'forks: prepare' span_id:2106))} 
          {
            (SQ (Token id:Id.Lit_Chars val:'git init --bare foo.git &&\n' span_id:2112) 
              (Token
                id: Id.Lit_Chars
                val: '\t git --git-dir=foo.git --work-tree=. add file &&\n'
                span_id: 2113
              ) 
              (Token
                id: Id.Lit_Chars
                val: '\t git --git-dir=foo.git --work-tree=. commit -m "Initial commit" &&\n'
                span_id: 2114
              ) (Token id:Id.Lit_Chars val:'\t echo "foo" > foo.git/description &&\n' span_id:2115) 
              (Token id:Id.Lit_Chars val:'\t mkdir -p foo &&\n' span_id:2116) (Token id:Id.Lit_Chars val:'\t (cd foo &&\n' span_id:2117) 
              (Token
                id: Id.Lit_Chars
                val: '\t  git clone --shared --bare ../foo.git foo-forked.git &&\n'
                span_id: 2118
              ) (Token id:Id.Lit_Chars val:'\t  echo "fork of foo" > foo-forked.git/description)' span_id:2119)
            )
          }
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'forks: projects list' span_id:2128))} 
      {(SQ (Token id:Id.Lit_Chars val:gitweb_run span_id:2134))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'forks: forks action' span_id:2143))} 
      {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "p=foo.git;a=forks"' span_id:2149))}
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.Simple
          words: [{(cat)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_DGreat val:'>>' span_id:2162)
              fd: -1
              arg_word: {(gitweb_config.perl)}
            )
            (redir.HereDoc
              op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:2165)
              fd: -1
              here_begin: 
                {
                  (word_part.EscapedLiteral
                    token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:2166)
                  ) (OF)
                }
              here_end_span_id: 2173
              stdin_parts: [
                ("# we don't test _setting_ content tags, so any true value is good\n")
                ("$feature{'ctags'}{'default'} = ['ctags_script.cgi'];\n")
              ]
            )
          ]
        )
        (C {(test_expect_success)} 
          {(SQ (Token id:Id.Lit_Chars val:'ctags: tag cloud in projects list' span_id:2180))} 
          {
            (SQ (Token id:Id.Lit_Chars val:'mkdir .git/ctags &&\n' span_id:2186) 
              (Token
                id: Id.Lit_Chars
                val: '\t echo "2" > .git/ctags/foo &&\n'
                span_id: 2187
              ) (Token id:Id.Lit_Chars val:'\t echo "1" > .git/ctags/bar &&\n' span_id:2188) 
              (Token id:Id.Lit_Chars val:'\tgitweb_run' span_id:2189)
            )
          }
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ctags: search projects by existing tag' span_id:2198))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "by_tag=foo"' span_id:2204))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ctags: search projects by non existent tag' span_id:2213))} {(SQ (Token id:Id.Lit_Chars val:'gitweb_run "by_tag=non-existent"' span_id:2219))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ctags: malformed tag weights' span_id:2228))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'mkdir -p .git/ctags &&\n' span_id:2234) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "not-a-number" > .git/ctags/nan &&\n'
            span_id: 2235
          ) (Token id:Id.Lit_Chars val:'\t echo "not-a-number-2" > .git/ctags/nan2 &&\n' span_id:2236) 
          (Token
            id: Id.Lit_Chars
            val: '\t echo "0.1" >.git/ctags/floating-point &&\n'
            span_id: 2237
          ) (Token id:Id.Lit_Chars val:'\t gitweb_run' span_id:2238)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'categories: projects list, only default category'
            span_id: 2254
          )
        )
      } 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'echo "\\$projects_list_group_categories = 1;" >>gitweb_config.perl &&\n'
            span_id: 2260
          ) (Token id:Id.Lit_Chars val:'\t gitweb_run' span_id:2261)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'unborn HEAD: "summary" page (with "heads" subview)'
            span_id: 2277
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'{\n' span_id:2283) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout orphan_branch ||\n' span_id:2284) (Token id:Id.Lit_Chars val:'\t\tgit checkout --orphan orphan_branch\n' span_id:2285) 
          (Token id:Id.Lit_Chars val:'\t } &&\n' span_id:2286) (Token id:Id.Lit_Chars val:'\t test_when_finished "git checkout master" &&\n' span_id:2287) 
          (Token id:Id.Lit_Chars val:'\t gitweb_run "p=.git;a=summary"' span_id:2288)
        )
      }
    )
    (C {(test_done)})
  ]
)