(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_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]
        )
      ]
    )
    (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"'>
        )
      }
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'.git/cloneurl'>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
              here_end_span_id: 1657
              stdin_parts: [
                <'git://example.com/git/trash.git\n'>
                <'http://example.com/git/trash.git\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'URL: project URLs via cloneurl file'>)} 
      {(SQ <'gitweb_run "p=.git;a=summary"'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<gitweb_config.perl>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <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'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (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"'>
        )
      }
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'.git/config'>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
              here_end_span_id: 1777
              stdin_parts: [
                <'# testing noval and alternate separator\n'>
                <'[gitweb]\n'>
                <'\tblame\n'>
                <'\tsnapshot = zip tgz\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} 
      {(SQ <'config override: tree view, features enabled in repo config (2)'>)} {(SQ <'gitweb_run "p=.git;a=tree"'>)}
    )
    (command.Simple
      words: [{<cat>}]
      redirects: [
        (redir op:<Id.Redir_DGreat '>>'> loc:(redir_loc.Fd fd:1) arg:{<gitweb_config.perl>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.MultiLine
              here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <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'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (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"'>
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:highlight_version)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (command.Simple
                    words: [{<highlight>} {<--version>}]
                    redirects: [
                      (redir
                        op: <Id.Redir_Less '<'>
                        loc: (redir_loc.Fd fd:0)
                        arg: {<'/dev/null'>}
                      )
                      (redir
                        op: <Id.Redir_Great '2>'>
                        loc: (redir_loc.Fd fd:2)
                        arg: {<'/dev/null'>}
                      )
                    ]
                    do_fork: T
                  )
              )
            }
          spids: [1942]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {<Id.Lit_LBracket '['>} {($ Id.VSub_QMark '$?')} {<-eq>} {<127>} 
                  {<Id.Lit_RBracket ']'>}
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          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: <Id.Op_Semi _>
            )
          ]
          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
              op: <Id.Redir_DGreat '>>'>
              loc: (redir_loc.Fd fd:1)
              arg: {<gitweb_config.perl>}
            )
            (redir
              op: <Id.Redir_DLessDash '<<-'>
              loc: (redir_loc.Fd fd:0)
              arg: 
                (redir_param.MultiLine
                  here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                  here_end_span_id: 2016
                  stdin_parts: [
                    <'our $highlight_bin = "highlight";\n'>
                    <'$feature{\'highlight\'}{\'override\'} = 1;\n'>
                  ]
                )
            )
          ]
          do_fork: T
        )
      ]
    )
    (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"'>
        )
      }
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.Simple
          words: [{<cat>}]
          redirects: [
            (redir
              op: <Id.Redir_DGreat '>>'>
              loc: (redir_loc.Fd fd:1)
              arg: {<gitweb_config.perl>}
            )
            (redir
              op: <Id.Redir_DLess '<<'>
              loc: (redir_loc.Fd fd:0)
              arg: 
                (redir_param.MultiLine
                  here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>}
                  here_end_span_id: 2099
                  stdin_parts: [<'$feature{\'forks\'}{\'default\'} = [1];\n'>]
                )
            )
          ]
          do_fork: T
        )
        (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)'>
            )
          }
        )
      ]
    )
    (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"'>)})
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.Simple
          words: [{<cat>}]
          redirects: [
            (redir
              op: <Id.Redir_DGreat '>>'>
              loc: (redir_loc.Fd fd:1)
              arg: {<gitweb_config.perl>}
            )
            (redir
              op: <Id.Redir_DLessDash '<<-'>
              loc: (redir_loc.Fd fd:0)
              arg: 
                (redir_param.MultiLine
                  here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <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'>
                  ]
                )
            )
          ]
          do_fork: T
        )
        (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'>
            )
          }
        )
      ]
    )
    (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>})
  ]
)