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 SYMLINKS \
 160        'commitdiff(0): file to symlink' \
 161        'rm renamed_file &&
 162         ln -s 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 SYMLINKS '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        ln -s bar foo &&
 223        git update-index foo &&
 224        git commit -m "foo symlinked to bar" &&
 225        git branch foo-symlinked-to-bar &&
 226        rm -f foo &&
 227        echo "how far is the sun?" > foo &&
 228        git update-index foo &&
 229        git commit -m "foo back to file" &&
 230        git branch foo-back-to-file &&
 231        rm -f foo &&
 232        git update-index --remove foo &&
 233        mkdir foo &&
 234        echo "if only I knew" > foo/baz &&
 235        git update-index --add foo/baz &&
 236        git commit -m "foo becomes a directory" &&
 237        git branch "foo-becomes-a-directory" &&
 238        echo "hello world" > foo/baz &&
 239        git update-index foo/baz &&
 240        git commit -m "foo/baz is the original foo" &&
 241        git branch foo-baz-renamed-from-foo
 242        '
 243test_expect_success \
 245        'commitdiff(2): file renamed from foo to foo/baz' \
 246        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-baz-renamed-from-foo"'
 247test_expect_success \
 249        'commitdiff(2): file renamed from foo/baz to foo' \
 250        'gitweb_run "p=.git;a=commitdiff;hp=foo-baz-renamed-from-foo;h=initial"'
 251test_expect_success \
 253        'commitdiff(2): directory becomes file' \
 254        'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=initial"'
 255test_expect_success \
 257        'commitdiff(2): file becomes directory' \
 258        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-becomes-a-directory"'
 259test_expect_success \
 261        'commitdiff(2): file becomes symlink' \
 262        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-symlinked-to-bar"'
 263test_expect_success \
 265        'commitdiff(2): symlink becomes file' \
 266        'gitweb_run "p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-back-to-file"'
 267test_expect_success \
 269        'commitdiff(2): symlink becomes directory' \
 270        'gitweb_run "p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-becomes-a-directory"'
 271test_expect_success \
 273        'commitdiff(2): directory becomes symlink' \
 274        'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=foo-symlinked-to-bar"'
 275# ----------------------------------------------------------------------
 277# commitdiff testing (incomplete lines)
 278test_expect_success 'setup incomplete lines' '
 280        cat >file<<-\EOF &&
 281        Dominus regit me,
 282        et nihil mihi deerit.
 283        In loco pascuae ibi me collocavit,
 284        super aquam refectionis educavit me;
 285        animam meam convertit,
 286        deduxit me super semitas jusitiae,
 287        propter nomen suum.
 288        CHANGE_ME
 289        EOF
 290        git commit -a -m "Preparing for incomplete lines" &&
 291        echo "incomplete" | tr -d "\\012" >>file &&
 292        git commit -a -m "Add incomplete line" &&
 293        git tag incomplete_lines_add &&
 294        sed -e s/CHANGE_ME/change_me/ <file >file+ &&
 295        mv -f file+ file &&
 296        git commit -a -m "Incomplete context line" &&
 297        git tag incomplete_lines_ctx &&
 298        echo "Dominus regit me," >file &&
 299        echo "incomplete line" | tr -d "\\012" >>file &&
 300        git commit -a -m "Change incomplete line" &&
 301        git tag incomplete_lines_chg
 302        echo "Dominus regit me," >file &&
 303        git commit -a -m "Remove incomplete line" &&
 304        git tag incomplete_lines_rem
 305'
 306test_expect_success 'commitdiff(1): addition of incomplete line' '
 308        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_add"
 309'
 310test_expect_success 'commitdiff(1): incomplete line as context line' '
 312        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_ctx"
 313'
 314test_expect_success 'commitdiff(1): change incomplete line' '
 316        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_chg"
 317'
 318test_expect_success 'commitdiff(1): removal of incomplete line' '
 320        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_rem"
 321'
 322# ----------------------------------------------------------------------
 324# commit, commitdiff: merge, large
 325test_expect_success \
 326        'Create a merge' \
 327        'git checkout b &&
 328         echo "Branch" >> b &&
 329         git add b &&
 330         git commit -a -m "On branch" &&
 331         git checkout master &&
 332         git pull . b &&
 333         git tag merge_commit'
 334test_expect_success \
 336        'commit(0): merge commit' \
 337        'gitweb_run "p=.git;a=commit"'
 338test_expect_success \
 340        'commitdiff(0): merge commit' \
 341        'gitweb_run "p=.git;a=commitdiff"'
 342test_expect_success \
 344        'Prepare large commit' \
 345        'git checkout b &&
 346         echo "To be changed" > 01-change &&
 347         echo "To be renamed" > 02-pure-rename-from &&
 348         echo "To be deleted" > 03-delete &&
 349         echo "To be renamed and changed" > 04-rename-from &&
 350         echo "To have mode changed" > 05-mode-change &&
 351         echo "File to symlink" > 06-file-or-symlink &&
 352         echo "To be changed and have mode changed" > 07-change-mode-change     &&
 353         git add 0* &&
 354         git commit -a -m "Prepare large commit" &&
 355         echo "Changed" > 01-change &&
 356         git mv 02-pure-rename-from 02-pure-rename-to &&
 357         git rm 03-delete && rm -f 03-delete &&
 358         echo "A new file" > 03-new &&
 359         git add 03-new &&
 360         git mv 04-rename-from 04-rename-to &&
 361         echo "Changed" >> 04-rename-to &&
 362         test_chmod +x 05-mode-change &&
 363         rm -f 06-file-or-symlink &&
 364         if test_have_prereq SYMLINKS; then
 365                ln -s 01-change 06-file-or-symlink
 366         else
 367                printf %s 01-change > 06-file-or-symlink
 368         fi &&
 369         echo "Changed and have mode changed" > 07-change-mode-change   &&
 370         test_chmod +x 07-change-mode-change &&
 371         git commit -a -m "Large commit" &&
 372         git checkout master'
 373test_expect_success \
 375        'commit(1): large commit' \
 376        'gitweb_run "p=.git;a=commit;h=b"'
 377test_expect_success \
 379        'commitdiff(1): large commit' \
 380        'gitweb_run "p=.git;a=commitdiff;h=b"'
 381# ----------------------------------------------------------------------
 383# side-by-side diff
 384test_expect_success 'side-by-side: addition of incomplete line' '
 386        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_add;ds=sidebyside"
 387'
 388test_expect_success 'side-by-side: incomplete line as context line' '
 390        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_ctx;ds=sidebyside"
 391'
 392test_expect_success 'side-by-side: changed incomplete line' '
 394        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_chg;ds=sidebyside"
 395'
 396test_expect_success 'side-by-side: removal of incomplete line' '
 398        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_rem;ds=sidebyside"
 399'
 400test_expect_success 'side-by-side: merge commit' '
 402        gitweb_run "p=.git;a=commitdiff;h=merge_commit;ds=sidebyside"
 403'
 404# ----------------------------------------------------------------------
 406# tags testing
 407test_expect_success \
 409        'tags: list of different types of tags' \
 410        'git checkout master &&
 411         git tag -a -m "Tag commit object" tag-commit HEAD &&
 412         git tag -a -m "" tag-commit-nomessage HEAD &&
 413         git tag -a -m "Tag tag object" tag-tag tag-commit &&
 414         git tag -a -m "Tag tree object" tag-tree HEAD^{tree} &&
 415         git tag -a -m "Tag blob object" tag-blob HEAD:file &&
 416         git tag lightweight/tag-commit HEAD &&
 417         git tag lightweight/tag-tag tag-commit &&
 418         git tag lightweight/tag-tree HEAD^{tree} &&
 419         git tag lightweight/tag-blob HEAD:file &&
 420         gitweb_run "p=.git;a=tags"'
 421test_expect_success \
 423        'tag: Tag to commit object' \
 424        'gitweb_run "p=.git;a=tag;h=tag-commit"'
 425test_expect_success \
 427        'tag: on lightweight tag (invalid)' \
 428        'gitweb_run "p=.git;a=tag;h=lightweight/tag-commit"'
 429# ----------------------------------------------------------------------
 431# logs
 432test_expect_success \
 434        'logs: log (implicit HEAD)' \
 435        'gitweb_run "p=.git;a=log"'
 436test_expect_success \
 438        'logs: shortlog (implicit HEAD)' \
 439        'gitweb_run "p=.git;a=shortlog"'
 440test_expect_success \
 442        'logs: history (implicit HEAD, file)' \
 443        'gitweb_run "p=.git;a=history;f=file"'
 444test_expect_success \
 446        'logs: history (implicit HEAD, non-existent file)' \
 447        'gitweb_run "p=.git;a=history;f=non-existent"'
 448test_expect_success \
 450        'logs: history (implicit HEAD, deleted file)' \
 451        'git checkout master &&
 452         echo "to be deleted" > deleted_file &&
 453         git add deleted_file &&
 454         git commit -m "Add file to be deleted" &&
 455         git rm deleted_file &&
 456         git commit -m "Delete file" &&
 457         gitweb_run "p=.git;a=history;f=deleted_file"'
 458# ----------------------------------------------------------------------
 460# path_info links
 461test_expect_success \
 462        'path_info: project' \
 463        'gitweb_run "" "/.git"'
 464test_expect_success \
 466        'path_info: project/branch' \
 467        'gitweb_run "" "/.git/b"'
 468test_expect_success \
 470        'path_info: project/branch:file' \
 471        'gitweb_run "" "/.git/master:file"'
 472test_expect_success \
 474        'path_info: project/branch:dir/' \
 475        'gitweb_run "" "/.git/master:foo/"'
 476test_expect_success \
 478        'path_info: project/branch (non-existent)' \
 479        'gitweb_run "" "/.git/non-existent"'
 480test_expect_success \
 482        'path_info: project/branch:filename (non-existent branch)' \
 483        'gitweb_run "" "/.git/non-existent:non-existent"'
 484test_expect_success \
 486        'path_info: project/branch:file (non-existent)' \
 487        'gitweb_run "" "/.git/master:non-existent"'
 488test_expect_success \
 490        'path_info: project/branch:dir/ (non-existent)' \
 491        'gitweb_run "" "/.git/master:non-existent/"'
 492test_expect_success \
 495        'path_info: project/branch:/file' \
 496        'gitweb_run "" "/.git/master:/file"'
 497test_expect_success \
 499        'path_info: project/:/file (implicit HEAD)' \
 500        'gitweb_run "" "/.git/:/file"'
 501test_expect_success \
 503        'path_info: project/:/ (implicit HEAD, top tree)' \
 504        'gitweb_run "" "/.git/:/"'
 505# ----------------------------------------------------------------------
 508# feed generation
 509test_expect_success \
 511        'feeds: OPML' \
 512        'gitweb_run "a=opml"'
 513test_expect_success \
 515        'feed: RSS' \
 516        'gitweb_run "p=.git;a=rss"'
 517test_expect_success \
 519        'feed: Atom' \
 520        'gitweb_run "p=.git;a=atom"'
 521# ----------------------------------------------------------------------
 523# encoding/decoding
 524test_expect_success \
 526        'encode(commit): utf8' \
 527        '. "$TEST_DIRECTORY"/t3901-utf8.txt &&
 528         test_when_finished "GIT_AUTHOR_NAME=\"A U Thor\"" &&
 529         test_when_finished "GIT_COMMITTER_NAME=\"C O Mitter\"" &&
 530         echo "UTF-8" >> file &&
 531         git add file &&
 532         git commit -F "$TEST_DIRECTORY"/t3900/1-UTF-8.txt &&
 533         gitweb_run "p=.git;a=commit"'
 534test_expect_success \
 536        'encode(commit): iso-8859-1' \
 537        '. "$TEST_DIRECTORY"/t3901-8859-1.txt &&
 538         test_when_finished "GIT_AUTHOR_NAME=\"A U Thor\"" &&
 539         test_when_finished "GIT_COMMITTER_NAME=\"C O Mitter\"" &&
 540         echo "ISO-8859-1" >> file &&
 541         git add file &&
 542         test_config i18n.commitencoding ISO-8859-1 &&
 543         git commit -F "$TEST_DIRECTORY"/t3900/ISO8859-1.txt &&
 544         gitweb_run "p=.git;a=commit"'
 545test_expect_success \
 547        'encode(log): utf-8 and iso-8859-1' \
 548        'gitweb_run "p=.git;a=log"'
 549# ----------------------------------------------------------------------
 551# extra options
 552test_expect_success \
 554        'opt: log --no-merges' \
 555        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 556test_expect_success \
 558        'opt: atom --no-merges' \
 559        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 560test_expect_success \
 562        'opt: "file" history --no-merges' \
 563        'gitweb_run "p=.git;a=history;f=file;opt=--no-merges"'
 564test_expect_success \
 566        'opt: log --no-such-option (invalid option)' \
 567        'gitweb_run "p=.git;a=log;opt=--no-such-option"'
 568test_expect_success \
 570        'opt: tree --no-merges (invalid option for action)' \
 571        'gitweb_run "p=.git;a=tree;opt=--no-merges"'
 572# ----------------------------------------------------------------------
 574# testing config_to_multi / cloneurl
 575test_expect_success \
 577       'URL: no project URLs, no base URL' \
 578       'gitweb_run "p=.git;a=summary"'
 579test_expect_success \
 581       'URL: project URLs via gitweb.url' \
 582       'git config --add gitweb.url git://example.com/git/trash.git &&
 583        git config --add gitweb.url http://example.com/git/trash.git &&
 584        gitweb_run "p=.git;a=summary"'
 585cat >.git/cloneurl <<\EOF
 587git://example.com/git/trash.git
 588http://example.com/git/trash.git
 589EOF
 590test_expect_success \
 592       'URL: project URLs via cloneurl file' \
 593       'gitweb_run "p=.git;a=summary"'
 594# ----------------------------------------------------------------------
 596# gitweb config and repo config
 597cat >>gitweb_config.perl <<\EOF
 599# turn on override for each overridable feature
 601foreach my $key (keys %feature) {
 602        if ($feature{$key}{'sub'}) {
 603                $feature{$key}{'override'} = 1;
 604        }
 605}
 606EOF
 607test_expect_success \
 609        'config override: projects list (implicit)' \
 610        'gitweb_run'
 611test_expect_success \
 613        'config override: tree view, features not overridden in repo config' \
 614        'gitweb_run "p=.git;a=tree"'
 615test_expect_success \
 617        'config override: tree view, features disabled in repo config' \
 618        'git config gitweb.blame no &&
 619         git config gitweb.snapshot none &&
 620         git config gitweb.avatar gravatar &&
 621         gitweb_run "p=.git;a=tree"'
 622test_expect_success \
 624        'config override: tree view, features enabled in repo config (1)' \
 625        'git config gitweb.blame yes &&
 626         git config gitweb.snapshot "zip,tgz, tbz2" &&
 627         gitweb_run "p=.git;a=tree"'
 628cat >.git/config <<\EOF
 630# testing noval and alternate separator
 631[gitweb]
 632        blame
 633        snapshot = zip tgz
 634EOF
 635test_expect_success \
 636        'config override: tree view, features enabled in repo config (2)' \
 637        'gitweb_run "p=.git;a=tree"'
 638# ----------------------------------------------------------------------
 640# searching
 641cat >>gitweb_config.perl <<\EOF
 643# enable search
 645$feature{'search'}{'default'} = [1];
 646$feature{'grep'}{'default'} = [1];
 647$feature{'pickaxe'}{'default'} = [1];
 648EOF
 649test_expect_success \
 651        'search: preparation' \
 652        'echo "1st MATCH" >>file &&
 653         echo "2nd MATCH" >>file &&
 654         echo "MATCH" >>bar &&
 655         git add file bar &&
 656         git commit -m "Added MATCH word"'
 657test_expect_success \
 659        'search: commit author' \
 660        'gitweb_run "p=.git;a=search;h=HEAD;st=author;s=A+U+Thor"'
 661test_expect_success \
 663        'search: commit message' \
 664        'gitweb_run "p=.git;a=search;h=HEAD;st=commitr;s=MATCH"'
 665test_expect_success \
 667        'search: grep' \
 668        'gitweb_run "p=.git;a=search;h=HEAD;st=grep;s=MATCH"'
 669test_expect_success \
 671        'search: pickaxe' \
 672        'gitweb_run "p=.git;a=search;h=HEAD;st=pickaxe;s=MATCH"'
 673test_expect_success \
 675        'search: projects' \
 676        'gitweb_run "a=project_list;s=.git"'
 677# ----------------------------------------------------------------------
 679# non-ASCII in README.html
 680test_expect_success \
 682        'README.html with non-ASCII characters (utf-8)' \
 683        'echo "<b>UTF-8 example:</b><br />" > .git/README.html &&
 684         cat "$TEST_DIRECTORY"/t3900/1-UTF-8.txt >> .git/README.html &&
 685         gitweb_run "p=.git;a=summary"'
 686# ----------------------------------------------------------------------
 688# syntax highlighting
 689highlight --version >/dev/null 2>&1
 692if [ $? -eq 127 ]; then
 693        say "Skipping syntax highlighting test, because 'highlight' was not found"
 694else
 695        test_set_prereq HIGHLIGHT
 696        cat >>gitweb_config.perl <<-\EOF
 697        our $highlight_bin = "highlight";
 698        $feature{'highlight'}{'override'} = 1;
 699        EOF
 700fi
 701test_expect_success HIGHLIGHT \
 703        'syntax highlighting (no highlight, unknown syntax)' \
 704        'git config gitweb.highlight yes &&
 705         gitweb_run "p=.git;a=blob;f=file"'
 706test_expect_success HIGHLIGHT \
 708        'syntax highlighting (highlighted, shell script)' \
 709        'git config gitweb.highlight yes &&
 710         echo "#!/usr/bin/sh" > test.sh &&
 711         git add test.sh &&
 712         git commit -m "Add test.sh" &&
 713         gitweb_run "p=.git;a=blob;f=test.sh"'
 714# ----------------------------------------------------------------------
 716# forks of projects
 717cat >>gitweb_config.perl <<\EOF &&
 719$feature{'forks'}{'default'} = [1];
 720EOF
 721test_expect_success \
 723        'forks: prepare' \
 724        'git init --bare foo.git &&
 725         git --git-dir=foo.git --work-tree=. add file &&
 726         git --git-dir=foo.git --work-tree=. commit -m "Initial commit" &&
 727         echo "foo" > foo.git/description &&
 728         mkdir -p foo &&
 729         (cd foo &&
 730          git clone --shared --bare ../foo.git foo-forked.git &&
 731          echo "fork of foo" > foo-forked.git/description)'
 732test_expect_success \
 734        'forks: projects list' \
 735        'gitweb_run'
 736test_expect_success \
 738        'forks: forks action' \
 739        'gitweb_run "p=foo.git;a=forks"'
 740# ----------------------------------------------------------------------
 742# content tags (tag cloud)
 743cat >>gitweb_config.perl <<-\EOF &&
 745# we don't test _setting_ content tags, so any true value is good
 746$feature{'ctags'}{'default'} = ['ctags_script.cgi'];
 747EOF
 748test_expect_success \
 750        'ctags: tag cloud in projects list' \
 751        'mkdir .git/ctags &&
 752         echo "2" > .git/ctags/foo &&
 753         echo "1" > .git/ctags/bar &&
 754        gitweb_run'
 755test_expect_success \
 757        'ctags: search projects by existing tag' \
 758        'gitweb_run "by_tag=foo"'
 759test_expect_success \
 761        'ctags: search projects by non existent tag' \
 762        'gitweb_run "by_tag=non-existent"'
 763test_expect_success \
 765        'ctags: malformed tag weights' \
 766        'mkdir -p .git/ctags &&
 767         echo "not-a-number" > .git/ctags/nan &&
 768         echo "not-a-number-2" > .git/ctags/nan2 &&
 769         echo "0.1" >.git/ctags/floating-point &&
 770         gitweb_run'
 771# ----------------------------------------------------------------------
 773# categories
 774test_expect_success \
 776        'categories: projects list, only default category' \
 777        'echo "\$projects_list_group_categories = 1;" >>gitweb_config.perl &&
 778         gitweb_run'
 779# ----------------------------------------------------------------------
 781# unborn branches
 782test_expect_success \
 784        'unborn HEAD: "summary" page (with "heads" subview)' \
 785        'git checkout orphan_branch || git checkout --orphan orphan_branch &&
 786         test_when_finished "git checkout master" &&
 787         gitweb_run "p=.git;a=summary"'
 788test_done