(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: 
            {
              (SQ <"gitweb as standalone script (basic tests).\n"> <"\n"> 
                <"This test runs gitweb (git web interface) as CGI script from\n"> <"commandline, and checks that it would not write any errors\n"> <"or warnings to log.">
              )
            }
          spids: [13]
        )
      ]
      spids: [13]
    )
    (C {(.)} {(./gitweb-lib.sh)})
    (C {(test_expect_success)} {(SQ <"no commits: projects_list (implicit)">)} {(SQ <gitweb_run>)})
    (C {(test_expect_success)} {(SQ <"no commits: projects_index">)} 
      {(SQ <"gitweb_run \"a=project_index\"">)}
    )
    (C {(test_expect_success)} {(SQ <"no commits: .git summary (implicit)">)} 
      {(SQ <"gitweb_run \"p=.git\"">)}
    )
    (C {(test_expect_success)} {(SQ <"no commits: .git commit (implicit HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commit\"">)}
    )
    (C {(test_expect_success)} {(SQ <"no commits: .git commitdiff (implicit HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff\"">)}
    )
    (C {(test_expect_success)} {(SQ <"no commits: .git tree (implicit HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=tree\"">)}
    )
    (C {(test_expect_success)} {(SQ <"no commits: .git heads">)} {(SQ <"gitweb_run \"p=.git;a=heads\"">)})
    (C {(test_expect_success)} {(SQ <"no commits: .git tags">)} {(SQ <"gitweb_run \"p=.git;a=tags\"">)})
    (C {(test_expect_success)} {(SQ <"Make initial commit">)} 
      {
        (SQ <"echo \"Not an empty file.\" > file &&\n"> <"\t git add file &&\n"> 
          <"\t git commit -a -m \"Initial commit.\" &&\n"> <"\t git branch b">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"projects_list (implicit)">)} {(SQ <gitweb_run>)})
    (C {(test_expect_success)} {(SQ <projects_index>)} {(SQ <"gitweb_run \"a=project_index\"">)})
    (C {(test_expect_success)} {(SQ <".git summary (implicit)">)} {(SQ <"gitweb_run \"p=.git\"">)})
    (C {(test_expect_success)} {(SQ <".git commit (implicit HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commit\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git commitdiff (implicit HEAD, root commit)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git commitdiff_plain (implicit HEAD, root commit)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff_plain\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git commit (HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commit;h=HEAD\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git tree (implicit HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=tree\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git blob (file)">)} {(SQ <"gitweb_run \"p=.git;a=blob;f=file\"">)})
    (C {(test_expect_success)} {(SQ <".git blob_plain (file)">)} 
      {(SQ <"gitweb_run \"p=.git;a=blob_plain;f=file\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git commit (non-existent)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commit;h=non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git commitdiff (non-existent)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;h=non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git commitdiff (non-existent vs HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=non-existent;h=HEAD\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git tree (0000000000000000000000000000000000000000)">)} 
      {(SQ <"gitweb_run \"p=.git;a=tree;h=0000000000000000000000000000000000000000\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git tag (0000000000000000000000000000000000000000)">)} 
      {(SQ <"gitweb_run \"p=.git;a=tag;h=0000000000000000000000000000000000000000\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git blob (non-existent)">)} 
      {(SQ <"gitweb_run \"p=.git;a=blob;f=non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <".git blob_plain (non-existent)">)} 
      {(SQ <"gitweb_run \"p=.git;a=blob_plain;f=non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): root">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): file added">)} 
      {
        (SQ <"echo \"New file\" > new_file &&\n"> <"\t git add new_file &&\n"> 
          <"\t git commit -a -m \"File added.\" &&\n"> <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): mode change">)} 
      {
        (SQ <"test_chmod +x new_file &&\n"> <"\t git commit -a -m \"Mode changed.\" &&\n"> 
          <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): file renamed">)} 
      {
        (SQ <"git mv new_file renamed_file &&\n"> <"\t git commit -a -m \"File renamed.\" &&\n"> 
          <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): file to symlink">)} 
      {
        (SQ <"rm renamed_file &&\n"> <"\t test_ln_s_add file renamed_file &&\n"> 
          <"\t git commit -a -m \"File to symlink.\" &&\n"> <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): file deleted">)} 
      {
        (SQ <"git rm renamed_file &&\n"> <"\t rm -f renamed_file &&\n"> 
          <"\t git commit -a -m \"File removed.\" &&\n"> <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): file copied / new file">)} 
      {
        (SQ <"cp file file2 &&\n"> <"\t git add file2 &&\n"> 
          <"\t git commit -a -m \"File copied.\" &&\n"> <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): mode change and modified">)} 
      {
        (SQ <"echo \"New line\" >> file2 &&\n"> <"\t test_chmod +x file2 &&\n"> 
          <"\t git commit -a -m \"Mode change and modification.\" &&\n"> <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): renamed and modified">)} 
      {
        (SQ <"cat >file2<<EOF &&\n"> <"Dominus regit me,\n"> <"et nihil mihi deerit.\n"> 
          <"In loco pascuae ibi me collocavit,\n"> <"super aquam refectionis educavit me;\n"> <"animam meam convertit,\n"> 
          <"deduxit me super semitas jusitiae,\n"> <"propter nomen suum.\n"> <"EOF\n"> <"\t git commit -a -m \"File added.\" &&\n"> 
          <"\t git mv file2 file3 &&\n"> <"\t echo \"Propter nomen suum.\" >> file3 &&\n"> 
          <"\t git commit -a -m \"File rename and modification.\" &&\n"> <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): renamed, mode change and modified">)} 
      {
        (SQ <"git mv file3 file2 &&\n"> <"\t echo \"Propter nomen suum.\" >> file2 &&\n"> 
          <"\t test_chmod +x file2 &&\n"> <"\t git commit -a -m \"File rename, mode change and modification.\" &&\n"> 
          <"\t gitweb_run \"p=.git;a=commitdiff\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"setup typechange commits">)} 
      {
        (SQ <"\n"> <"\techo \"hello world\" > foo &&\n"> <"\techo \"hi planet\" > bar &&\n"> 
          <"\tgit update-index --add foo bar &&\n"> <"\tgit commit -m initial &&\n"> <"\tgit branch initial &&\n"> <"\trm -f foo &&\n"> 
          <"\ttest_ln_s_add bar foo &&\n"> <"\tgit commit -m \"foo symlinked to bar\" &&\n"> <"\tgit branch foo-symlinked-to-bar &&\n"> 
          <"\trm -f foo &&\n"> <"\techo \"how far is the sun?\" > foo &&\n"> <"\tgit update-index foo &&\n"> 
          <"\tgit commit -m \"foo back to file\" &&\n"> <"\tgit branch foo-back-to-file &&\n"> <"\trm -f foo &&\n"> <"\tgit update-index --remove foo &&\n"> 
          <"\tmkdir foo &&\n"> <"\techo \"if only I knew\" > foo/baz &&\n"> <"\tgit update-index --add foo/baz &&\n"> 
          <"\tgit commit -m \"foo becomes a directory\" &&\n"> <"\tgit branch \"foo-becomes-a-directory\" &&\n"> <"\techo \"hello world\" > foo/baz &&\n"> 
          <"\tgit update-index foo/baz &&\n"> <"\tgit commit -m \"foo/baz is the original foo\" &&\n"> <"\tgit branch foo-baz-renamed-from-foo\n"> 
          <"\t">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(2): file renamed from foo to foo/baz">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=initial;h=foo-baz-renamed-from-foo\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(2): file renamed from foo/baz to foo">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=foo-baz-renamed-from-foo;h=initial\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(2): directory becomes file">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=initial\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(2): file becomes directory">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=initial;h=foo-becomes-a-directory\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(2): file becomes symlink">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=initial;h=foo-symlinked-to-bar\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(2): symlink becomes file">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-back-to-file\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(2): symlink becomes directory">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-becomes-a-directory\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(2): directory becomes symlink">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=foo-symlinked-to-bar\"">)}
    )
    (C {(test_expect_success)} {(SQ <"setup incomplete lines">)} 
      {
        (SQ <"\n"> <"\tcat >file<<-\\EOF &&\n"> <"\tDominus regit me,\n"> <"\tet nihil mihi deerit.\n"> 
          <"\tIn loco pascuae ibi me collocavit,\n"> <"\tsuper aquam refectionis educavit me;\n"> <"\tanimam meam convertit,\n"> 
          <"\tdeduxit me super semitas jusitiae,\n"> <"\tpropter nomen suum.\n"> <"\tCHANGE_ME\n"> <"\tEOF\n"> 
          <"\tgit commit -a -m \"Preparing for incomplete lines\" &&\n"> <"\techo \"incomplete\" | tr -d \"\\\\012\" >>file &&\n"> 
          <"\tgit commit -a -m \"Add incomplete line\" &&\n"> <"\tgit tag incomplete_lines_add &&\n"> <"\tsed -e s/CHANGE_ME/change_me/ <file >file+ &&\n"> 
          <"\tmv -f file+ file &&\n"> <"\tgit commit -a -m \"Incomplete context line\" &&\n"> <"\tgit tag incomplete_lines_ctx &&\n"> 
          <"\techo \"Dominus regit me,\" >file &&\n"> <"\techo \"incomplete line\" | tr -d \"\\\\012\" >>file &&\n"> 
          <"\tgit commit -a -m \"Change incomplete line\" &&\n"> <"\tgit tag incomplete_lines_chg &&\n"> <"\techo \"Dominus regit me,\" >file &&\n"> 
          <"\tgit commit -a -m \"Remove incomplete line\" &&\n"> <"\tgit tag incomplete_lines_rem\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(1): addition of incomplete line">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=incomplete_lines_add\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(1): incomplete line as context line">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=incomplete_lines_ctx\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(1): change incomplete line">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=incomplete_lines_chg\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(1): removal of incomplete line">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=incomplete_lines_rem\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"Create a merge">)} 
      {
        (SQ <"git checkout b &&\n"> <"\t echo \"Branch\" >> b &&\n"> <"\t git add b &&\n"> 
          <"\t git commit -a -m \"On branch\" &&\n"> <"\t git checkout master &&\n"> <"\t git merge b &&\n"> <"\t git tag merge_commit">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commit(0): merge commit">)} 
      {(SQ <"gitweb_run \"p=.git;a=commit\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(0): merge commit">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff\"">)}
    )
    (C {(test_expect_success)} {(SQ <"Prepare large commit">)} 
      {
        (SQ <"git checkout b &&\n"> <"\t echo \"To be changed\" > 01-change &&\n"> 
          <"\t echo \"To be renamed\" > 02-pure-rename-from &&\n"> <"\t echo \"To be deleted\" > 03-delete &&\n"> 
          <"\t echo \"To be renamed and changed\" > 04-rename-from &&\n"> <"\t echo \"To have mode changed\" > 05-mode-change &&\n"> 
          <"\t echo \"File to symlink\" > 06-file-or-symlink &&\n"> <"\t echo \"To be changed and have mode changed\" > 07-change-mode-change\t&&\n"> 
          <"\t git add 0* &&\n"> <"\t git commit -a -m \"Prepare large commit\" &&\n"> <"\t echo \"Changed\" > 01-change &&\n"> 
          <"\t git mv 02-pure-rename-from 02-pure-rename-to &&\n"> <"\t git rm 03-delete && rm -f 03-delete &&\n"> <"\t echo \"A new file\" > 03-new &&\n"> 
          <"\t git add 03-new &&\n"> <"\t git mv 04-rename-from 04-rename-to &&\n"> <"\t echo \"Changed\" >> 04-rename-to &&\n"> 
          <"\t test_chmod +x 05-mode-change &&\n"> <"\t rm -f 06-file-or-symlink &&\n"> <"\t test_ln_s_add 01-change 06-file-or-symlink &&\n"> 
          <"\t echo \"Changed and have mode changed\" > 07-change-mode-change\t&&\n"> <"\t test_chmod +x 07-change-mode-change &&\n"> <"\t git commit -a -m \"Large commit\" &&\n"> 
          <"\t git checkout master">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"commit(1): large commit">)} 
      {(SQ <"gitweb_run \"p=.git;a=commit;h=b\"">)}
    )
    (C {(test_expect_success)} {(SQ <"commitdiff(1): large commit">)} 
      {(SQ <"gitweb_run \"p=.git;a=commitdiff;h=b\"">)}
    )
    (C {(test_expect_success)} {(SQ <"side-by-side: addition of incomplete line">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=incomplete_lines_add;ds=sidebyside\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"side-by-side: incomplete line as context line">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=incomplete_lines_ctx;ds=sidebyside\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"side-by-side: changed incomplete line">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=incomplete_lines_chg;ds=sidebyside\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"side-by-side: removal of incomplete line">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=incomplete_lines_rem;ds=sidebyside\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"side-by-side: merge commit">)} 
      {(SQ <"\n"> <"\tgitweb_run \"p=.git;a=commitdiff;h=merge_commit;ds=sidebyside\"\n">)}
    )
    (C {(test_expect_success)} {(SQ <"tags: list of different types of tags">)} 
      {
        (SQ <"git checkout master &&\n"> 
          <"\t git tag -a -m \"Tag commit object\" tag-commit HEAD &&\n"> <"\t git tag -a -m \"\" tag-commit-nomessage HEAD &&\n"> 
          <"\t git tag -a -m \"Tag tag object\" tag-tag tag-commit &&\n"> <"\t git tag -a -m \"Tag tree object\" tag-tree HEAD^{tree} &&\n"> 
          <"\t git tag -a -m \"Tag blob object\" tag-blob HEAD:file &&\n"> <"\t git tag lightweight/tag-commit HEAD &&\n"> <"\t git tag lightweight/tag-tag tag-commit &&\n"> 
          <"\t git tag lightweight/tag-tree HEAD^{tree} &&\n"> <"\t git tag lightweight/tag-blob HEAD:file &&\n"> <"\t gitweb_run \"p=.git;a=tags\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"tag: Tag to commit object">)} 
      {(SQ <"gitweb_run \"p=.git;a=tag;h=tag-commit\"">)}
    )
    (C {(test_expect_success)} {(SQ <"tag: on lightweight tag (invalid)">)} 
      {(SQ <"gitweb_run \"p=.git;a=tag;h=lightweight/tag-commit\"">)}
    )
    (C {(test_expect_success)} {(SQ <"logs: log (implicit HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=log\"">)}
    )
    (C {(test_expect_success)} {(SQ <"logs: shortlog (implicit HEAD)">)} 
      {(SQ <"gitweb_run \"p=.git;a=shortlog\"">)}
    )
    (C {(test_expect_success)} {(SQ <"logs: history (implicit HEAD, file)">)} 
      {(SQ <"gitweb_run \"p=.git;a=history;f=file\"">)}
    )
    (C {(test_expect_success)} {(SQ <"logs: history (implicit HEAD, non-existent file)">)} 
      {(SQ <"gitweb_run \"p=.git;a=history;f=non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <"logs: history (implicit HEAD, deleted file)">)} 
      {
        (SQ <"git checkout master &&\n"> <"\t echo \"to be deleted\" > deleted_file &&\n"> 
          <"\t git add deleted_file &&\n"> <"\t git commit -m \"Add file to be deleted\" &&\n"> <"\t git rm deleted_file &&\n"> 
          <"\t git commit -m \"Delete file\" &&\n"> <"\t gitweb_run \"p=.git;a=history;f=deleted_file\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"path_info: project">)} {(SQ <"gitweb_run \"\" \"/.git\"">)})
    (C {(test_expect_success)} {(SQ <"path_info: project/branch">)} 
      {(SQ <"gitweb_run \"\" \"/.git/b\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/branch:file">)} 
      {(SQ <"gitweb_run \"\" \"/.git/master:file\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/branch:dir/">)} 
      {(SQ <"gitweb_run \"\" \"/.git/master:foo/\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/branch (non-existent)">)} 
      {(SQ <"gitweb_run \"\" \"/.git/non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/branch:filename (non-existent branch)">)} 
      {(SQ <"gitweb_run \"\" \"/.git/non-existent:non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/branch:file (non-existent)">)} 
      {(SQ <"gitweb_run \"\" \"/.git/master:non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/branch:dir/ (non-existent)">)} 
      {(SQ <"gitweb_run \"\" \"/.git/master:non-existent/\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/branch:/file">)} 
      {(SQ <"gitweb_run \"\" \"/.git/master:/file\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/:/file (implicit HEAD)">)} 
      {(SQ <"gitweb_run \"\" \"/.git/:/file\"">)}
    )
    (C {(test_expect_success)} {(SQ <"path_info: project/:/ (implicit HEAD, top tree)">)} 
      {(SQ <"gitweb_run \"\" \"/.git/:/\"">)}
    )
    (C {(test_expect_success)} {(SQ <"feeds: OPML">)} {(SQ <"gitweb_run \"a=opml\"">)})
    (C {(test_expect_success)} {(SQ <"feed: RSS">)} {(SQ <"gitweb_run \"p=.git;a=rss\"">)})
    (C {(test_expect_success)} {(SQ <"feed: Atom">)} {(SQ <"gitweb_run \"p=.git;a=atom\"">)})
    (C {(test_expect_success)} {(SQ <"encode(commit): utf8">)} 
      {
        (SQ <". \"$TEST_DIRECTORY\"/t3901-utf8.txt &&\n"> 
          <"\t test_when_finished \"GIT_AUTHOR_NAME=\\\"A U Thor\\\"\" &&\n"> <"\t test_when_finished \"GIT_COMMITTER_NAME=\\\"C O Mitter\\\"\" &&\n"> 
          <"\t echo \"UTF-8\" >> file &&\n"> <"\t git add file &&\n"> <"\t git commit -F \"$TEST_DIRECTORY\"/t3900/1-UTF-8.txt &&\n"> 
          <"\t gitweb_run \"p=.git;a=commit\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"encode(commit): iso-8859-1">)} 
      {
        (SQ <". \"$TEST_DIRECTORY\"/t3901-8859-1.txt &&\n"> 
          <"\t test_when_finished \"GIT_AUTHOR_NAME=\\\"A U Thor\\\"\" &&\n"> <"\t test_when_finished \"GIT_COMMITTER_NAME=\\\"C O Mitter\\\"\" &&\n"> 
          <"\t echo \"ISO-8859-1\" >> file &&\n"> <"\t git add file &&\n"> <"\t test_config i18n.commitencoding ISO-8859-1 &&\n"> 
          <"\t git commit -F \"$TEST_DIRECTORY\"/t3900/ISO8859-1.txt &&\n"> <"\t gitweb_run \"p=.git;a=commit\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"encode(log): utf-8 and iso-8859-1">)} 
      {(SQ <"gitweb_run \"p=.git;a=log\"">)}
    )
    (C {(test_expect_success)} {(SQ <"opt: log --no-merges">)} 
      {(SQ <"gitweb_run \"p=.git;a=log;opt=--no-merges\"">)}
    )
    (C {(test_expect_success)} {(SQ <"opt: atom --no-merges">)} 
      {(SQ <"gitweb_run \"p=.git;a=log;opt=--no-merges\"">)}
    )
    (C {(test_expect_success)} {(SQ <"opt: \"file\" history --no-merges">)} 
      {(SQ <"gitweb_run \"p=.git;a=history;f=file;opt=--no-merges\"">)}
    )
    (C {(test_expect_success)} {(SQ <"opt: log --no-such-option (invalid option)">)} 
      {(SQ <"gitweb_run \"p=.git;a=log;opt=--no-such-option\"">)}
    )
    (C {(test_expect_success)} {(SQ <"opt: tree --no-merges (invalid option for action)">)} 
      {(SQ <"gitweb_run \"p=.git;a=tree;opt=--no-merges\"">)}
    )
    (C {(test_expect_success)} {(SQ <"URL: no project URLs, no base URL">)} 
      {(SQ <"gitweb_run \"p=.git;a=summary\"">)}
    )
    (C {(test_expect_success)} {(SQ <"URL: project URLs via gitweb.url">)} 
      {
        (SQ <"git config --add gitweb.url git://example.com/git/trash.git &&\n"> 
          <"        git config --add gitweb.url http://example.com/git/trash.git &&\n"> <"        gitweb_run \"p=.git;a=summary\"">
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(.git/cloneurl)} spids:[1648])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: {("git://example.com/git/trash.git\n") ("http://example.com/git/trash.git\n")}
          do_expansion: False
          here_end: EOF
          was_filled: True
          spids: [1651]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <"URL: project URLs via cloneurl file">)} 
      {(SQ <"gitweb_run \"p=.git;a=summary\"">)}
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_DGreat fd:-1 arg_word:{(gitweb_config.perl)} spids:[1680])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {("\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")
            }
          do_expansion: False
          here_end: EOF
          was_filled: True
          spids: [1683]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <"config override: projects list (implicit)">)} {(SQ <gitweb_run>)})
    (C {(test_expect_success)} 
      {(SQ <"config override: tree view, features not overridden in repo config">)} {(SQ <"gitweb_run \"p=.git;a=tree\"">)}
    )
    (C {(test_expect_success)} {(SQ <"config override: tree view, features disabled in repo config">)} 
      {
        (SQ <"git config gitweb.blame no &&\n"> <"\t git config gitweb.snapshot none &&\n"> 
          <"\t git config gitweb.avatar gravatar &&\n"> <"\t gitweb_run \"p=.git;a=tree\"">
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <"config override: tree view, features enabled in repo config (1)">)} 
      {
        (SQ <"git config gitweb.blame yes &&\n"> 
          <"\t git config gitweb.snapshot \"zip,tgz, tbz2\" &&\n"> <"\t gitweb_run \"p=.git;a=tree\"">
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(.git/config)} spids:[1755])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {("# testing noval and alternate separator\n") ("[gitweb]\n") ("\tblame\n") 
              ("\tsnapshot = zip tgz\n")
            }
          do_expansion: False
          here_end: EOF
          was_filled: True
          spids: [1758]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ <"config override: tree view, features enabled in repo config (2)">)} {(SQ <"gitweb_run \"p=.git;a=tree\"">)}
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_DGreat fd:-1 arg_word:{(gitweb_config.perl)} spids:[1786])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {("\n") ("# enable search\n") ("$feature{'search'}{'default'} = [1];\n") 
              ("$feature{'grep'}{'default'} = [1];\n") ("$feature{'pickaxe'}{'default'} = [1];\n")
            }
          do_expansion: False
          here_end: EOF
          was_filled: True
          spids: [1789]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <"search: preparation">)} 
      {
        (SQ <"echo \"1st MATCH\" >>file &&\n"> <"\t echo \"2nd MATCH\" >>file &&\n"> 
          <"\t echo \"MATCH\" >>bar &&\n"> <"\t git add file bar &&\n"> <"\t git commit -m \"Added MATCH word\"">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"search: commit author">)} 
      {(SQ <"gitweb_run \"p=.git;a=search;h=HEAD;st=author;s=A+U+Thor\"">)}
    )
    (C {(test_expect_success)} {(SQ <"search: commit message">)} 
      {(SQ <"gitweb_run \"p=.git;a=search;h=HEAD;st=commitr;s=MATCH\"">)}
    )
    (C {(test_expect_success)} {(SQ <"search: grep">)} 
      {(SQ <"gitweb_run \"p=.git;a=search;h=HEAD;st=grep;s=MATCH\"">)}
    )
    (C {(test_expect_success)} {(SQ <"search: pickaxe">)} 
      {(SQ <"gitweb_run \"p=.git;a=search;h=HEAD;st=pickaxe;s=MATCH\"">)}
    )
    (C {(test_expect_success)} {(SQ <"search: projects">)} 
      {(SQ <"gitweb_run \"a=project_list;s=.git\"">)}
    )
    (C {(test_expect_success)} {(SQ <"README.html with non-ASCII characters (utf-8)">)} 
      {
        (SQ <"echo \"<b>UTF-8 example:</b><br />\" > .git/README.html &&\n"> 
          <"\t cat \"$TEST_DIRECTORY\"/t3900/1-UTF-8.txt >> .git/README.html &&\n"> <"\t gitweb_run \"p=.git;a=summary\"">
        )
      }
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:highlight_version)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: 
                  (CommandList
                    children: [
                      (SimpleCommand
                        words: [{(highlight)} {(--version)}]
                        redirects: [
                          (Redir
                            op_id: Redir_Less
                            fd: -1
                            arg_word: {(/dev/null)}
                            spids: [1926]
                          )
                          (Redir
                            op_id: Redir_Great
                            fd: 2
                            arg_word: {(/dev/null)}
                            spids: [1929]
                          )
                        ]
                      )
                    ]
                  )
                left_token: <Left_CommandSub "$(">
                spids: [1921 1931]
              )
            }
          spids: [1920]
        )
      ]
      spids: [1920]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: (C {(Lit_Other "[")} {($ VSub_QMark "$?")} {(-eq)} {(127)} {(Lit_Other "]")})
              terminator: <Op_Semi ";">
            )
          ]
          action: [(C {(say)} {(DQ ("Skipping syntax highlighting tests: 'highlight' not found"))})]
          spids: [-1 1946]
        )
        (if_arm
          cond: [
            (Sentence
              child: (C {(test)} {(-z)} {(DQ ($ VSub_Name "$highlight_version"))})
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (C {(say)} {(DQ ("Skipping syntax highlighting tests: incorrect 'highlight' found"))})
          ]
          spids: [1955 1966]
        )
      ]
      else_action: [
        (C {(test_set_prereq)} {(HIGHLIGHT)})
        (SimpleCommand
          words: [{(cat)}]
          redirects: [
            (Redir op_id:Redir_DGreat fd:-1 arg_word:{(gitweb_config.perl)} spids:[1985])
            (HereDoc
              op_id: Redir_DLessDash
              fd: -1
              body: 
                {("our $highlight_bin = \"highlight\";\n") 
                  ("$feature{'highlight'}{'override'} = 1;\n")
                }
              do_expansion: False
              here_end: EOF
              was_filled: True
              spids: [1988]
            )
          ]
        )
      ]
      spids: [1975 1992]
    )
    (C {(test_expect_success)} {(HIGHLIGHT)} 
      {(SQ <"syntax highlighting (no highlight, unknown syntax)">)} {(SQ <"git config gitweb.highlight yes &&\n"> <"\t gitweb_run \"p=.git;a=blob;f=file\"">)}
    )
    (C {(test_expect_success)} {(HIGHLIGHT)} {(SQ <"syntax highlighting (highlighted, shell script)">)} 
      {
        (SQ <"git config gitweb.highlight yes &&\n"> <"\t echo \"#!/usr/bin/sh\" > test.sh &&\n"> 
          <"\t git add test.sh &&\n"> <"\t git commit -m \"Add test.sh\" &&\n"> <"\t gitweb_run \"p=.git;a=blob;f=test.sh\"">
        )
      }
    )
    (C {(test_expect_success)} {(HIGHLIGHT)} 
      {(SQ <"syntax highlighting (highlighter language autodetection)">)} 
      {
        (SQ <"git config gitweb.highlight yes &&\n"> <"\t echo \"#!/usr/bin/perl\" > test &&\n"> 
          <"\t git add test &&\n"> <"\t git commit -m \"Add test\" &&\n"> <"\t gitweb_run \"p=.git;a=blob;f=test\"">
        )
      }
    )
    (AndOr
      children: [
        (SimpleCommand
          words: [{(cat)}]
          redirects: [
            (Redir op_id:Redir_DGreat fd:-1 arg_word:{(gitweb_config.perl)} spids:[2064])
            (HereDoc
              op_id: Redir_DLess
              fd: -1
              body: {("$feature{'forks'}{'default'} = [1];\n")}
              do_expansion: False
              here_end: EOF
              was_filled: True
              spids: [2067]
            )
          ]
        )
        (C {(test_expect_success)} {(SQ <"forks: prepare">)} 
          {
            (SQ <"git init --bare foo.git &&\n"> 
              <"\t git --git-dir=foo.git --work-tree=. add file &&\n"> <"\t git --git-dir=foo.git --work-tree=. commit -m \"Initial commit\" &&\n"> 
              <"\t echo \"foo\" > foo.git/description &&\n"> <"\t mkdir -p foo &&\n"> <"\t (cd foo &&\n"> 
              <"\t  git clone --shared --bare ../foo.git foo-forked.git &&\n"> <"\t  echo \"fork of foo\" > foo-forked.git/description)">
            )
          }
        )
      ]
      op_id: Op_DAmp
    )
    (C {(test_expect_success)} {(SQ <"forks: projects list">)} {(SQ <gitweb_run>)})
    (C {(test_expect_success)} {(SQ <"forks: forks action">)} {(SQ <"gitweb_run \"p=foo.git;a=forks\"">)})
    (AndOr
      children: [
        (SimpleCommand
          words: [{(cat)}]
          redirects: [
            (Redir op_id:Redir_DGreat fd:-1 arg_word:{(gitweb_config.perl)} spids:[2135])
            (HereDoc
              op_id: Redir_DLessDash
              fd: -1
              body: 
                {("# we don't test _setting_ content tags, so any true value is good\n") 
                  ("$feature{'ctags'}{'default'} = ['ctags_script.cgi'];\n")
                }
              do_expansion: False
              here_end: EOF
              was_filled: True
              spids: [2138]
            )
          ]
        )
        (C {(test_expect_success)} {(SQ <"ctags: tag cloud in projects list">)} 
          {
            (SQ <"mkdir .git/ctags &&\n"> <"\t echo \"2\" > .git/ctags/foo &&\n"> 
              <"\t echo \"1\" > .git/ctags/bar &&\n"> <"\tgitweb_run">
            )
          }
        )
      ]
      op_id: Op_DAmp
    )
    (C {(test_expect_success)} {(SQ <"ctags: search projects by existing tag">)} 
      {(SQ <"gitweb_run \"by_tag=foo\"">)}
    )
    (C {(test_expect_success)} {(SQ <"ctags: search projects by non existent tag">)} 
      {(SQ <"gitweb_run \"by_tag=non-existent\"">)}
    )
    (C {(test_expect_success)} {(SQ <"ctags: malformed tag weights">)} 
      {
        (SQ <"mkdir -p .git/ctags &&\n"> <"\t echo \"not-a-number\" > .git/ctags/nan &&\n"> 
          <"\t echo \"not-a-number-2\" > .git/ctags/nan2 &&\n"> <"\t echo \"0.1\" >.git/ctags/floating-point &&\n"> <"\t gitweb_run">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"categories: projects list, only default category">)} 
      {
        (SQ <"echo \"\\$projects_list_group_categories = 1;\" >>gitweb_config.perl &&\n"> 
          <"\t gitweb_run">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"unborn HEAD: \"summary\" page (with \"heads\" subview)">)} 
      {
        (SQ <"{\n"> <"\t\tgit checkout orphan_branch ||\n"> 
          <"\t\tgit checkout --orphan orphan_branch\n"> <"\t } &&\n"> <"\t test_when_finished \"git checkout master\" &&\n"> 
          <"\t gitweb_run \"p=.git;a=summary\"">
        )
      }
    )
    (C {(test_done)})
  ]
)