1#!/bin/sh
   2#
   3# Copyright (c) 2007 Jakub Narebski
   4#
   5test_description='gitweb as standalone script (basic tests).
   7This test runs gitweb (git web interface) as CGI script from
   9commandline, and checks that it would not write any errors
  10or warnings to log.'
  11. ./gitweb-lib.sh
  14# ----------------------------------------------------------------------
  16# no commits (empty, just initialized repository)
  17test_expect_success \
  19        'no commits: projects_list (implicit)' \
  20        'gitweb_run'
  21test_expect_success \
  23        'no commits: projects_index' \
  24        'gitweb_run "a=project_index"'
  25test_expect_success \
  27        'no commits: .git summary (implicit)' \
  28        'gitweb_run "p=.git"'
  29test_expect_success \
  31        'no commits: .git commit (implicit HEAD)' \
  32        'gitweb_run "p=.git;a=commit"'
  33test_expect_success \
  35        'no commits: .git commitdiff (implicit HEAD)' \
  36        'gitweb_run "p=.git;a=commitdiff"'
  37test_expect_success \
  39        'no commits: .git tree (implicit HEAD)' \
  40        'gitweb_run "p=.git;a=tree"'
  41test_expect_success \
  43        'no commits: .git heads' \
  44        'gitweb_run "p=.git;a=heads"'
  45test_expect_success \
  47        'no commits: .git tags' \
  48        'gitweb_run "p=.git;a=tags"'
  49# ----------------------------------------------------------------------
  52# initial commit
  53test_expect_success \
  55        'Make initial commit' \
  56        'echo "Not an empty file." > file &&
  57         git add file &&
  58         git commit -a -m "Initial commit." &&
  59         git branch b'
  60test_expect_success \
  62        'projects_list (implicit)' \
  63        'gitweb_run'
  64test_expect_success \
  66        'projects_index' \
  67        'gitweb_run "a=project_index"'
  68test_expect_success \
  70        '.git summary (implicit)' \
  71        'gitweb_run "p=.git"'
  72test_expect_success \
  74        '.git commit (implicit HEAD)' \
  75        'gitweb_run "p=.git;a=commit"'
  76test_expect_success \
  78        '.git commitdiff (implicit HEAD, root commit)' \
  79        'gitweb_run "p=.git;a=commitdiff"'
  80test_expect_success \
  82        '.git commitdiff_plain (implicit HEAD, root commit)' \
  83        'gitweb_run "p=.git;a=commitdiff_plain"'
  84test_expect_success \
  86        '.git commit (HEAD)' \
  87        'gitweb_run "p=.git;a=commit;h=HEAD"'
  88test_expect_success \
  90        '.git tree (implicit HEAD)' \
  91        'gitweb_run "p=.git;a=tree"'
  92test_expect_success \
  94        '.git blob (file)' \
  95        'gitweb_run "p=.git;a=blob;f=file"'
  96test_expect_success \
  98        '.git blob_plain (file)' \
  99        'gitweb_run "p=.git;a=blob_plain;f=file"'
 100# ----------------------------------------------------------------------
 102# nonexistent objects
 103test_expect_success \
 105        '.git commit (non-existent)' \
 106        'gitweb_run "p=.git;a=commit;h=non-existent"'
 107test_expect_success \
 109        '.git commitdiff (non-existent)' \
 110        'gitweb_run "p=.git;a=commitdiff;h=non-existent"'
 111test_expect_success \
 113        '.git commitdiff (non-existent vs HEAD)' \
 114        'gitweb_run "p=.git;a=commitdiff;hp=non-existent;h=HEAD"'
 115test_expect_success \
 117        '.git tree (0000000000000000000000000000000000000000)' \
 118        'gitweb_run "p=.git;a=tree;h=0000000000000000000000000000000000000000"'
 119test_expect_success \
 121        '.git tag (0000000000000000000000000000000000000000)' \
 122        'gitweb_run "p=.git;a=tag;h=0000000000000000000000000000000000000000"'
 123test_expect_success \
 125        '.git blob (non-existent)' \
 126        'gitweb_run "p=.git;a=blob;f=non-existent"'
 127test_expect_success \
 129        '.git blob_plain (non-existent)' \
 130        'gitweb_run "p=.git;a=blob_plain;f=non-existent"'
 131# ----------------------------------------------------------------------
 134# commitdiff testing (implicit, one implicit tree-ish)
 135test_expect_success \
 137        'commitdiff(0): root' \
 138        'gitweb_run "p=.git;a=commitdiff"'
 139test_expect_success \
 141        'commitdiff(0): file added' \
 142        'echo "New file" > new_file &&
 143         git add new_file &&
 144         git commit -a -m "File added." &&
 145         gitweb_run "p=.git;a=commitdiff"'
 146test_expect_success \
 148        'commitdiff(0): mode change' \
 149        'test_chmod +x new_file &&
 150         git commit -a -m "Mode changed." &&
 151         gitweb_run "p=.git;a=commitdiff"'
 152test_expect_success \
 154        'commitdiff(0): file renamed' \
 155        'git mv new_file renamed_file &&
 156         git commit -a -m "File renamed." &&
 157         gitweb_run "p=.git;a=commitdiff"'
 158test_expect_success \
 160        'commitdiff(0): file to symlink' \
 161        'rm renamed_file &&
 162         test_ln_s_add file renamed_file &&
 163         git commit -a -m "File to symlink." &&
 164         gitweb_run "p=.git;a=commitdiff"'
 165test_expect_success \
 167        'commitdiff(0): file deleted' \
 168        'git rm renamed_file &&
 169         rm -f renamed_file &&
 170         git commit -a -m "File removed." &&
 171         gitweb_run "p=.git;a=commitdiff"'
 172test_expect_success \
 174        'commitdiff(0): file copied / new file' \
 175        'cp file file2 &&
 176         git add file2 &&
 177         git commit -a -m "File copied." &&
 178         gitweb_run "p=.git;a=commitdiff"'
 179test_expect_success \
 181        'commitdiff(0): mode change and modified' \
 182        'echo "New line" >> file2 &&
 183         test_chmod +x file2 &&
 184         git commit -a -m "Mode change and modification." &&
 185         gitweb_run "p=.git;a=commitdiff"'
 186test_expect_success \
 188        'commitdiff(0): renamed and modified' \
 189        'cat >file2<<EOF &&
 190Dominus regit me,
 191et nihil mihi deerit.
 192In loco pascuae ibi me collocavit,
 193super aquam refectionis educavit me;
 194animam meam convertit,
 195deduxit me super semitas jusitiae,
 196propter nomen suum.
 197EOF
 198         git commit -a -m "File added." &&
 199         git mv file2 file3 &&
 200         echo "Propter nomen suum." >> file3 &&
 201         git commit -a -m "File rename and modification." &&
 202         gitweb_run "p=.git;a=commitdiff"'
 203test_expect_success \
 205        'commitdiff(0): renamed, mode change and modified' \
 206        'git mv file3 file2 &&
 207         echo "Propter nomen suum." >> file2 &&
 208         test_chmod +x file2 &&
 209         git commit -a -m "File rename, mode change and modification." &&
 210         gitweb_run "p=.git;a=commitdiff"'
 211# ----------------------------------------------------------------------
 213# commitdiff testing (taken from t4114-apply-typechange.sh)
 214test_expect_success 'setup typechange commits' '
 216        echo "hello world" > foo &&
 217        echo "hi planet" > bar &&
 218        git update-index --add foo bar &&
 219        git commit -m initial &&
 220        git branch initial &&
 221        rm -f foo &&
 222        test_ln_s_add bar foo &&
 223        git commit -m "foo symlinked to bar" &&
 224        git branch foo-symlinked-to-bar &&
 225        rm -f foo &&
 226        echo "how far is the sun?" > foo &&
 227        git update-index foo &&
 228        git commit -m "foo back to file" &&
 229        git branch foo-back-to-file &&
 230        rm -f foo &&
 231        git update-index --remove foo &&
 232        mkdir foo &&
 233        echo "if only I knew" > foo/baz &&
 234        git update-index --add foo/baz &&
 235        git commit -m "foo becomes a directory" &&
 236        git branch "foo-becomes-a-directory" &&
 237        echo "hello world" > foo/baz &&
 238        git update-index foo/baz &&
 239        git commit -m "foo/baz is the original foo" &&
 240        git branch foo-baz-renamed-from-foo
 241        '
 242test_expect_success \
 244        'commitdiff(2): file renamed from foo to foo/baz' \
 245        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-baz-renamed-from-foo"'
 246test_expect_success \
 248        'commitdiff(2): file renamed from foo/baz to foo' \
 249        'gitweb_run "p=.git;a=commitdiff;hp=foo-baz-renamed-from-foo;h=initial"'
 250test_expect_success \
 252        'commitdiff(2): directory becomes file' \
 253        'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=initial"'
 254test_expect_success \
 256        'commitdiff(2): file becomes directory' \
 257        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-becomes-a-directory"'
 258test_expect_success \
 260        'commitdiff(2): file becomes symlink' \
 261        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-symlinked-to-bar"'
 262test_expect_success \
 264        'commitdiff(2): symlink becomes file' \
 265        'gitweb_run "p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-back-to-file"'
 266test_expect_success \
 268        'commitdiff(2): symlink becomes directory' \
 269        'gitweb_run "p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-becomes-a-directory"'
 270test_expect_success \
 272        'commitdiff(2): directory becomes symlink' \
 273        'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=foo-symlinked-to-bar"'
 274# ----------------------------------------------------------------------
 276# commitdiff testing (incomplete lines)
 277test_expect_success 'setup incomplete lines' '
 279        cat >file<<-\EOF &&
 280        Dominus regit me,
 281        et nihil mihi deerit.
 282        In loco pascuae ibi me collocavit,
 283        super aquam refectionis educavit me;
 284        animam meam convertit,
 285        deduxit me super semitas jusitiae,
 286        propter nomen suum.
 287        CHANGE_ME
 288        EOF
 289        git commit -a -m "Preparing for incomplete lines" &&
 290        echo "incomplete" | tr -d "\\012" >>file &&
 291        git commit -a -m "Add incomplete line" &&
 292        git tag incomplete_lines_add &&
 293        sed -e s/CHANGE_ME/change_me/ <file >file+ &&
 294        mv -f file+ file &&
 295        git commit -a -m "Incomplete context line" &&
 296        git tag incomplete_lines_ctx &&
 297        echo "Dominus regit me," >file &&
 298        echo "incomplete line" | tr -d "\\012" >>file &&
 299        git commit -a -m "Change incomplete line" &&
 300        git tag incomplete_lines_chg &&
 301        echo "Dominus regit me," >file &&
 302        git commit -a -m "Remove incomplete line" &&
 303        git tag incomplete_lines_rem
 304'
 305test_expect_success 'commitdiff(1): addition of incomplete line' '
 307        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_add"
 308'
 309test_expect_success 'commitdiff(1): incomplete line as context line' '
 311        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_ctx"
 312'
 313test_expect_success 'commitdiff(1): change incomplete line' '
 315        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_chg"
 316'
 317test_expect_success 'commitdiff(1): removal of incomplete line' '
 319        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_rem"
 320'
 321# ----------------------------------------------------------------------
 323# commit, commitdiff: merge, large
 324test_expect_success \
 325        'Create a merge' \
 326        'git checkout b &&
 327         echo "Branch" >> b &&
 328         git add b &&
 329         git commit -a -m "On branch" &&
 330         git checkout master &&
 331         git merge b &&
 332         git tag merge_commit'
 333test_expect_success \
 335        'commit(0): merge commit' \
 336        'gitweb_run "p=.git;a=commit"'
 337test_expect_success \
 339        'commitdiff(0): merge commit' \
 340        'gitweb_run "p=.git;a=commitdiff"'
 341test_expect_success \
 343        'Prepare large commit' \
 344        'git checkout b &&
 345         echo "To be changed" > 01-change &&
 346         echo "To be renamed" > 02-pure-rename-from &&
 347         echo "To be deleted" > 03-delete &&
 348         echo "To be renamed and changed" > 04-rename-from &&
 349         echo "To have mode changed" > 05-mode-change &&
 350         echo "File to symlink" > 06-file-or-symlink &&
 351         echo "To be changed and have mode changed" > 07-change-mode-change     &&
 352         git add 0* &&
 353         git commit -a -m "Prepare large commit" &&
 354         echo "Changed" > 01-change &&
 355         git mv 02-pure-rename-from 02-pure-rename-to &&
 356         git rm 03-delete && rm -f 03-delete &&
 357         echo "A new file" > 03-new &&
 358         git add 03-new &&
 359         git mv 04-rename-from 04-rename-to &&
 360         echo "Changed" >> 04-rename-to &&
 361         test_chmod +x 05-mode-change &&
 362         rm -f 06-file-or-symlink &&
 363         test_ln_s_add 01-change 06-file-or-symlink &&
 364         echo "Changed and have mode changed" > 07-change-mode-change   &&
 365         test_chmod +x 07-change-mode-change &&
 366         git commit -a -m "Large commit" &&
 367         git checkout master'
 368test_expect_success \
 370        'commit(1): large commit' \
 371        'gitweb_run "p=.git;a=commit;h=b"'
 372test_expect_success \
 374        'commitdiff(1): large commit' \
 375        'gitweb_run "p=.git;a=commitdiff;h=b"'
 376# ----------------------------------------------------------------------
 378# side-by-side diff
 379test_expect_success 'side-by-side: addition of incomplete line' '
 381        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_add;ds=sidebyside"
 382'
 383test_expect_success 'side-by-side: incomplete line as context line' '
 385        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_ctx;ds=sidebyside"
 386'
 387test_expect_success 'side-by-side: changed incomplete line' '
 389        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_chg;ds=sidebyside"
 390'
 391test_expect_success 'side-by-side: removal of incomplete line' '
 393        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_rem;ds=sidebyside"
 394'
 395test_expect_success 'side-by-side: merge commit' '
 397        gitweb_run "p=.git;a=commitdiff;h=merge_commit;ds=sidebyside"
 398'
 399# ----------------------------------------------------------------------
 401# tags testing
 402test_expect_success \
 404        'tags: list of different types of tags' \
 405        'git checkout master &&
 406         git tag -a -m "Tag commit object" tag-commit HEAD &&
 407         git tag -a -m "" tag-commit-nomessage HEAD &&
 408         git tag -a -m "Tag tag object" tag-tag tag-commit &&
 409         git tag -a -m "Tag tree object" tag-tree HEAD^{tree} &&
 410         git tag -a -m "Tag blob object" tag-blob HEAD:file &&
 411         git tag lightweight/tag-commit HEAD &&
 412         git tag lightweight/tag-tag tag-commit &&
 413         git tag lightweight/tag-tree HEAD^{tree} &&
 414         git tag lightweight/tag-blob HEAD:file &&
 415         gitweb_run "p=.git;a=tags"'
 416test_expect_success \
 418        'tag: Tag to commit object' \
 419        'gitweb_run "p=.git;a=tag;h=tag-commit"'
 420test_expect_success \
 422        'tag: on lightweight tag (invalid)' \
 423        'gitweb_run "p=.git;a=tag;h=lightweight/tag-commit"'
 424# ----------------------------------------------------------------------
 426# logs
 427test_expect_success \
 429        'logs: log (implicit HEAD)' \
 430        'gitweb_run "p=.git;a=log"'
 431test_expect_success \
 433        'logs: shortlog (implicit HEAD)' \
 434        'gitweb_run "p=.git;a=shortlog"'
 435test_expect_success \
 437        'logs: history (implicit HEAD, file)' \
 438        'gitweb_run "p=.git;a=history;f=file"'
 439test_expect_success \
 441        'logs: history (implicit HEAD, non-existent file)' \
 442        'gitweb_run "p=.git;a=history;f=non-existent"'
 443test_expect_success \
 445        'logs: history (implicit HEAD, deleted file)' \
 446        'git checkout master &&
 447         echo "to be deleted" > deleted_file &&
 448         git add deleted_file &&
 449         git commit -m "Add file to be deleted" &&
 450         git rm deleted_file &&
 451         git commit -m "Delete file" &&
 452         gitweb_run "p=.git;a=history;f=deleted_file"'
 453# ----------------------------------------------------------------------
 455# path_info links
 456test_expect_success \
 457        'path_info: project' \
 458        'gitweb_run "" "/.git"'
 459test_expect_success \
 461        'path_info: project/branch' \
 462        'gitweb_run "" "/.git/b"'
 463test_expect_success \
 465        'path_info: project/branch:file' \
 466        'gitweb_run "" "/.git/master:file"'
 467test_expect_success \
 469        'path_info: project/branch:dir/' \
 470        'gitweb_run "" "/.git/master:foo/"'
 471test_expect_success \
 473        'path_info: project/branch (non-existent)' \
 474        'gitweb_run "" "/.git/non-existent"'
 475test_expect_success \
 477        'path_info: project/branch:filename (non-existent branch)' \
 478        'gitweb_run "" "/.git/non-existent:non-existent"'
 479test_expect_success \
 481        'path_info: project/branch:file (non-existent)' \
 482        'gitweb_run "" "/.git/master:non-existent"'
 483test_expect_success \
 485        'path_info: project/branch:dir/ (non-existent)' \
 486        'gitweb_run "" "/.git/master:non-existent/"'
 487test_expect_success \
 490        'path_info: project/branch:/file' \
 491        'gitweb_run "" "/.git/master:/file"'
 492test_expect_success \
 494        'path_info: project/:/file (implicit HEAD)' \
 495        'gitweb_run "" "/.git/:/file"'
 496test_expect_success \
 498        'path_info: project/:/ (implicit HEAD, top tree)' \
 499        'gitweb_run "" "/.git/:/"'
 500# ----------------------------------------------------------------------
 503# feed generation
 504test_expect_success \
 506        'feeds: OPML' \
 507        'gitweb_run "a=opml"'
 508test_expect_success \
 510        'feed: RSS' \
 511        'gitweb_run "p=.git;a=rss"'
 512test_expect_success \
 514        'feed: Atom' \
 515        'gitweb_run "p=.git;a=atom"'
 516# ----------------------------------------------------------------------
 518# encoding/decoding
 519test_expect_success \
 521        'encode(commit): utf8' \
 522        '. "$TEST_DIRECTORY"/t3901-utf8.txt &&
 523         test_when_finished "GIT_AUTHOR_NAME=\"A U Thor\"" &&
 524         test_when_finished "GIT_COMMITTER_NAME=\"C O Mitter\"" &&
 525         echo "UTF-8" >> file &&
 526         git add file &&
 527         git commit -F "$TEST_DIRECTORY"/t3900/1-UTF-8.txt &&
 528         gitweb_run "p=.git;a=commit"'
 529test_expect_success \
 531        'encode(commit): iso-8859-1' \
 532        '. "$TEST_DIRECTORY"/t3901-8859-1.txt &&
 533         test_when_finished "GIT_AUTHOR_NAME=\"A U Thor\"" &&
 534         test_when_finished "GIT_COMMITTER_NAME=\"C O Mitter\"" &&
 535         echo "ISO-8859-1" >> file &&
 536         git add file &&
 537         test_config i18n.commitencoding ISO-8859-1 &&
 538         git commit -F "$TEST_DIRECTORY"/t3900/ISO8859-1.txt &&
 539         gitweb_run "p=.git;a=commit"'
 540test_expect_success \
 542        'encode(log): utf-8 and iso-8859-1' \
 543        'gitweb_run "p=.git;a=log"'
 544# ----------------------------------------------------------------------
 546# extra options
 547test_expect_success \
 549        'opt: log --no-merges' \
 550        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 551test_expect_success \
 553        'opt: atom --no-merges' \
 554        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 555test_expect_success \
 557        'opt: "file" history --no-merges' \
 558        'gitweb_run "p=.git;a=history;f=file;opt=--no-merges"'
 559test_expect_success \
 561        'opt: log --no-such-option (invalid option)' \
 562        'gitweb_run "p=.git;a=log;opt=--no-such-option"'
 563test_expect_success \
 565        'opt: tree --no-merges (invalid option for action)' \
 566        'gitweb_run "p=.git;a=tree;opt=--no-merges"'
 567# ----------------------------------------------------------------------
 569# testing config_to_multi / cloneurl
 570test_expect_success \
 572       'URL: no project URLs, no base URL' \
 573       'gitweb_run "p=.git;a=summary"'
 574test_expect_success \
 576       'URL: project URLs via gitweb.url' \
 577       'git config --add gitweb.url git://example.com/git/trash.git &&
 578        git config --add gitweb.url http://example.com/git/trash.git &&
 579        gitweb_run "p=.git;a=summary"'
 580cat >.git/cloneurl <<\EOF
 582git://example.com/git/trash.git
 583http://example.com/git/trash.git
 584EOF
 585test_expect_success \
 587       'URL: project URLs via cloneurl file' \
 588       'gitweb_run "p=.git;a=summary"'
 589# ----------------------------------------------------------------------
 591# gitweb config and repo config
 592cat >>gitweb_config.perl <<\EOF
 594# turn on override for each overridable feature
 596foreach my $key (keys %feature) {
 597        if ($feature{$key}{'sub'}) {
 598                $feature{$key}{'override'} = 1;
 599        }
 600}
 601EOF
 602test_expect_success \
 604        'config override: projects list (implicit)' \
 605        'gitweb_run'
 606test_expect_success \
 608        'config override: tree view, features not overridden in repo config' \
 609        'gitweb_run "p=.git;a=tree"'
 610test_expect_success \
 612        'config override: tree view, features disabled in repo config' \
 613        'git config gitweb.blame no &&
 614         git config gitweb.snapshot none &&
 615         git config gitweb.avatar gravatar &&
 616         gitweb_run "p=.git;a=tree"'
 617test_expect_success \
 619        'config override: tree view, features enabled in repo config (1)' \
 620        'git config gitweb.blame yes &&
 621         git config gitweb.snapshot "zip,tgz, tbz2" &&
 622         gitweb_run "p=.git;a=tree"'
 623cat >.git/config <<\EOF
 625# testing noval and alternate separator
 626[gitweb]
 627        blame
 628        snapshot = zip tgz
 629EOF
 630test_expect_success \
 631        'config override: tree view, features enabled in repo config (2)' \
 632        'gitweb_run "p=.git;a=tree"'
 633# ----------------------------------------------------------------------
 635# searching
 636cat >>gitweb_config.perl <<\EOF
 638# enable search
 640$feature{'search'}{'default'} = [1];
 641$feature{'grep'}{'default'} = [1];
 642$feature{'pickaxe'}{'default'} = [1];
 643EOF
 644test_expect_success \
 646        'search: preparation' \
 647        'echo "1st MATCH" >>file &&
 648         echo "2nd MATCH" >>file &&
 649         echo "MATCH" >>bar &&
 650         git add file bar &&
 651         git commit -m "Added MATCH word"'
 652test_expect_success \
 654        'search: commit author' \
 655        'gitweb_run "p=.git;a=search;h=HEAD;st=author;s=A+U+Thor"'
 656test_expect_success \
 658        'search: commit message' \
 659        'gitweb_run "p=.git;a=search;h=HEAD;st=commitr;s=MATCH"'
 660test_expect_success \
 662        'search: grep' \
 663        'gitweb_run "p=.git;a=search;h=HEAD;st=grep;s=MATCH"'
 664test_expect_success \
 666        'search: pickaxe' \
 667        'gitweb_run "p=.git;a=search;h=HEAD;st=pickaxe;s=MATCH"'
 668test_expect_success \
 670        'search: projects' \
 671        'gitweb_run "a=project_list;s=.git"'
 672# ----------------------------------------------------------------------
 674# non-ASCII in README.html
 675test_expect_success \
 677        'README.html with non-ASCII characters (utf-8)' \
 678        'echo "<b>UTF-8 example:</b><br />" > .git/README.html &&
 679         cat "$TEST_DIRECTORY"/t3900/1-UTF-8.txt >> .git/README.html &&
 680         gitweb_run "p=.git;a=summary"'
 681# ----------------------------------------------------------------------
 683# syntax highlighting
 684highlight_version=$(highlight --version </dev/null 2>/dev/null)
 687if [ $? -eq 127 ]; then
 688        say "Skipping syntax highlighting tests: 'highlight' not found"
 689elif test -z "$highlight_version"; then
 690        say "Skipping syntax highlighting tests: incorrect 'highlight' found"
 691else
 692        test_set_prereq HIGHLIGHT
 693        cat >>gitweb_config.perl <<-\EOF
 694        our $highlight_bin = "highlight";
 695        $feature{'highlight'}{'override'} = 1;
 696        EOF
 697fi
 698test_expect_success HIGHLIGHT \
 700        'syntax highlighting (no highlight, unknown syntax)' \
 701        'git config gitweb.highlight yes &&
 702         gitweb_run "p=.git;a=blob;f=file"'
 703test_expect_success HIGHLIGHT \
 705        'syntax highlighting (highlighted, shell script)' \
 706        'git config gitweb.highlight yes &&
 707         echo "#!/usr/bin/sh" > test.sh &&
 708         git add test.sh &&
 709         git commit -m "Add test.sh" &&
 710         gitweb_run "p=.git;a=blob;f=test.sh"'
 711# ----------------------------------------------------------------------
 713# forks of projects
 714cat >>gitweb_config.perl <<\EOF &&
 716$feature{'forks'}{'default'} = [1];
 717EOF
 718test_expect_success \
 720        'forks: prepare' \
 721        'git init --bare foo.git &&
 722         git --git-dir=foo.git --work-tree=. add file &&
 723         git --git-dir=foo.git --work-tree=. commit -m "Initial commit" &&
 724         echo "foo" > foo.git/description &&
 725         mkdir -p foo &&
 726         (cd foo &&
 727          git clone --shared --bare ../foo.git foo-forked.git &&
 728          echo "fork of foo" > foo-forked.git/description)'
 729test_expect_success \
 731        'forks: projects list' \
 732        'gitweb_run'
 733test_expect_success \
 735        'forks: forks action' \
 736        'gitweb_run "p=foo.git;a=forks"'
 737# ----------------------------------------------------------------------
 739# content tags (tag cloud)
 740cat >>gitweb_config.perl <<-\EOF &&
 742# we don't test _setting_ content tags, so any true value is good
 743$feature{'ctags'}{'default'} = ['ctags_script.cgi'];
 744EOF
 745test_expect_success \
 747        'ctags: tag cloud in projects list' \
 748        'mkdir .git/ctags &&
 749         echo "2" > .git/ctags/foo &&
 750         echo "1" > .git/ctags/bar &&
 751        gitweb_run'
 752test_expect_success \
 754        'ctags: search projects by existing tag' \
 755        'gitweb_run "by_tag=foo"'
 756test_expect_success \
 758        'ctags: search projects by non existent tag' \
 759        'gitweb_run "by_tag=non-existent"'
 760test_expect_success \
 762        'ctags: malformed tag weights' \
 763        'mkdir -p .git/ctags &&
 764         echo "not-a-number" > .git/ctags/nan &&
 765         echo "not-a-number-2" > .git/ctags/nan2 &&
 766         echo "0.1" >.git/ctags/floating-point &&
 767         gitweb_run'
 768# ----------------------------------------------------------------------
 770# categories
 771test_expect_success \
 773        'categories: projects list, only default category' \
 774        'echo "\$projects_list_group_categories = 1;" >>gitweb_config.perl &&
 775         gitweb_run'
 776# ----------------------------------------------------------------------
 778# unborn branches
 779test_expect_success \
 781        'unborn HEAD: "summary" page (with "heads" subview)' \
 782        '{
 783                git checkout orphan_branch ||
 784                git checkout --orphan orphan_branch
 785         } &&
 786         test_when_finished "git checkout master" &&
 787         gitweb_run "p=.git;a=summary"'
 788test_done