t / t9500-gitweb-standalone-no-errors.shon commit Merge branch 'ld/p4-case-fold' (ee2309d)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Jakub Narebski
   4#
   5
   6test_description='gitweb as standalone script (basic tests).
   7
   8This 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
  12
  13. ./gitweb-lib.sh
  14
  15# ----------------------------------------------------------------------
  16# no commits (empty, just initialized repository)
  17
  18test_expect_success \
  19        'no commits: projects_list (implicit)' \
  20        'gitweb_run'
  21
  22test_expect_success \
  23        'no commits: projects_index' \
  24        'gitweb_run "a=project_index"'
  25
  26test_expect_success \
  27        'no commits: .git summary (implicit)' \
  28        'gitweb_run "p=.git"'
  29
  30test_expect_success \
  31        'no commits: .git commit (implicit HEAD)' \
  32        'gitweb_run "p=.git;a=commit"'
  33
  34test_expect_success \
  35        'no commits: .git commitdiff (implicit HEAD)' \
  36        'gitweb_run "p=.git;a=commitdiff"'
  37
  38test_expect_success \
  39        'no commits: .git tree (implicit HEAD)' \
  40        'gitweb_run "p=.git;a=tree"'
  41
  42test_expect_success \
  43        'no commits: .git heads' \
  44        'gitweb_run "p=.git;a=heads"'
  45
  46test_expect_success \
  47        'no commits: .git tags' \
  48        'gitweb_run "p=.git;a=tags"'
  49
  50
  51# ----------------------------------------------------------------------
  52# initial commit
  53
  54test_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'
  60
  61test_expect_success \
  62        'projects_list (implicit)' \
  63        'gitweb_run'
  64
  65test_expect_success \
  66        'projects_index' \
  67        'gitweb_run "a=project_index"'
  68
  69test_expect_success \
  70        '.git summary (implicit)' \
  71        'gitweb_run "p=.git"'
  72
  73test_expect_success \
  74        '.git commit (implicit HEAD)' \
  75        'gitweb_run "p=.git;a=commit"'
  76
  77test_expect_success \
  78        '.git commitdiff (implicit HEAD, root commit)' \
  79        'gitweb_run "p=.git;a=commitdiff"'
  80
  81test_expect_success \
  82        '.git commitdiff_plain (implicit HEAD, root commit)' \
  83        'gitweb_run "p=.git;a=commitdiff_plain"'
  84
  85test_expect_success \
  86        '.git commit (HEAD)' \
  87        'gitweb_run "p=.git;a=commit;h=HEAD"'
  88
  89test_expect_success \
  90        '.git tree (implicit HEAD)' \
  91        'gitweb_run "p=.git;a=tree"'
  92
  93test_expect_success \
  94        '.git blob (file)' \
  95        'gitweb_run "p=.git;a=blob;f=file"'
  96
  97test_expect_success \
  98        '.git blob_plain (file)' \
  99        'gitweb_run "p=.git;a=blob_plain;f=file"'
 100
 101# ----------------------------------------------------------------------
 102# nonexistent objects
 103
 104test_expect_success \
 105        '.git commit (non-existent)' \
 106        'gitweb_run "p=.git;a=commit;h=non-existent"'
 107
 108test_expect_success \
 109        '.git commitdiff (non-existent)' \
 110        'gitweb_run "p=.git;a=commitdiff;h=non-existent"'
 111
 112test_expect_success \
 113        '.git commitdiff (non-existent vs HEAD)' \
 114        'gitweb_run "p=.git;a=commitdiff;hp=non-existent;h=HEAD"'
 115
 116test_expect_success \
 117        '.git tree (0000000000000000000000000000000000000000)' \
 118        'gitweb_run "p=.git;a=tree;h=0000000000000000000000000000000000000000"'
 119
 120test_expect_success \
 121        '.git tag (0000000000000000000000000000000000000000)' \
 122        'gitweb_run "p=.git;a=tag;h=0000000000000000000000000000000000000000"'
 123
 124test_expect_success \
 125        '.git blob (non-existent)' \
 126        'gitweb_run "p=.git;a=blob;f=non-existent"'
 127
 128test_expect_success \
 129        '.git blob_plain (non-existent)' \
 130        'gitweb_run "p=.git;a=blob_plain;f=non-existent"'
 131
 132
 133# ----------------------------------------------------------------------
 134# commitdiff testing (implicit, one implicit tree-ish)
 135
 136test_expect_success \
 137        'commitdiff(0): root' \
 138        'gitweb_run "p=.git;a=commitdiff"'
 139
 140test_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"'
 146
 147test_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"'
 152
 153test_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"'
 158
 159test_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"'
 165
 166test_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"'
 172
 173test_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"'
 179
 180test_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"'
 186
 187test_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"'
 203
 204test_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
 212# ----------------------------------------------------------------------
 213# commitdiff testing (taken from t4114-apply-typechange.sh)
 214
 215test_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        '
 242
 243test_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"'
 246
 247test_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"'
 250
 251test_expect_success \
 252        'commitdiff(2): directory becomes file' \
 253        'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=initial"'
 254
 255test_expect_success \
 256        'commitdiff(2): file becomes directory' \
 257        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-becomes-a-directory"'
 258
 259test_expect_success \
 260        'commitdiff(2): file becomes symlink' \
 261        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-symlinked-to-bar"'
 262
 263test_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"'
 266
 267test_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"'
 270
 271test_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
 275# ----------------------------------------------------------------------
 276# commitdiff testing (incomplete lines)
 277
 278test_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'
 305
 306test_expect_success 'commitdiff(1): addition of incomplete line' '
 307        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_add"
 308'
 309
 310test_expect_success 'commitdiff(1): incomplete line as context line' '
 311        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_ctx"
 312'
 313
 314test_expect_success 'commitdiff(1): change incomplete line' '
 315        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_chg"
 316'
 317
 318test_expect_success 'commitdiff(1): removal of incomplete line' '
 319        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_rem"
 320'
 321
 322# ----------------------------------------------------------------------
 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'
 333
 334test_expect_success \
 335        'commit(0): merge commit' \
 336        'gitweb_run "p=.git;a=commit"'
 337
 338test_expect_success \
 339        'commitdiff(0): merge commit' \
 340        'gitweb_run "p=.git;a=commitdiff"'
 341
 342test_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'
 368
 369test_expect_success \
 370        'commit(1): large commit' \
 371        'gitweb_run "p=.git;a=commit;h=b"'
 372
 373test_expect_success \
 374        'commitdiff(1): large commit' \
 375        'gitweb_run "p=.git;a=commitdiff;h=b"'
 376
 377# ----------------------------------------------------------------------
 378# side-by-side diff
 379
 380test_expect_success 'side-by-side: addition of incomplete line' '
 381        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_add;ds=sidebyside"
 382'
 383
 384test_expect_success 'side-by-side: incomplete line as context line' '
 385        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_ctx;ds=sidebyside"
 386'
 387
 388test_expect_success 'side-by-side: changed incomplete line' '
 389        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_chg;ds=sidebyside"
 390'
 391
 392test_expect_success 'side-by-side: removal of incomplete line' '
 393        gitweb_run "p=.git;a=commitdiff;h=incomplete_lines_rem;ds=sidebyside"
 394'
 395
 396test_expect_success 'side-by-side: merge commit' '
 397        gitweb_run "p=.git;a=commitdiff;h=merge_commit;ds=sidebyside"
 398'
 399
 400# ----------------------------------------------------------------------
 401# tags testing
 402
 403test_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"'
 416
 417test_expect_success \
 418        'tag: Tag to commit object' \
 419        'gitweb_run "p=.git;a=tag;h=tag-commit"'
 420
 421test_expect_success \
 422        'tag: on lightweight tag (invalid)' \
 423        'gitweb_run "p=.git;a=tag;h=lightweight/tag-commit"'
 424
 425# ----------------------------------------------------------------------
 426# logs
 427
 428test_expect_success \
 429        'logs: log (implicit HEAD)' \
 430        'gitweb_run "p=.git;a=log"'
 431
 432test_expect_success \
 433        'logs: shortlog (implicit HEAD)' \
 434        'gitweb_run "p=.git;a=shortlog"'
 435
 436test_expect_success \
 437        'logs: history (implicit HEAD, file)' \
 438        'gitweb_run "p=.git;a=history;f=file"'
 439
 440test_expect_success \
 441        'logs: history (implicit HEAD, non-existent file)' \
 442        'gitweb_run "p=.git;a=history;f=non-existent"'
 443
 444test_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
 454# ----------------------------------------------------------------------
 455# path_info links
 456test_expect_success \
 457        'path_info: project' \
 458        'gitweb_run "" "/.git"'
 459
 460test_expect_success \
 461        'path_info: project/branch' \
 462        'gitweb_run "" "/.git/b"'
 463
 464test_expect_success \
 465        'path_info: project/branch:file' \
 466        'gitweb_run "" "/.git/master:file"'
 467
 468test_expect_success \
 469        'path_info: project/branch:dir/' \
 470        'gitweb_run "" "/.git/master:foo/"'
 471
 472test_expect_success \
 473        'path_info: project/branch (non-existent)' \
 474        'gitweb_run "" "/.git/non-existent"'
 475
 476test_expect_success \
 477        'path_info: project/branch:filename (non-existent branch)' \
 478        'gitweb_run "" "/.git/non-existent:non-existent"'
 479
 480test_expect_success \
 481        'path_info: project/branch:file (non-existent)' \
 482        'gitweb_run "" "/.git/master:non-existent"'
 483
 484test_expect_success \
 485        'path_info: project/branch:dir/ (non-existent)' \
 486        'gitweb_run "" "/.git/master:non-existent/"'
 487
 488
 489test_expect_success \
 490        'path_info: project/branch:/file' \
 491        'gitweb_run "" "/.git/master:/file"'
 492
 493test_expect_success \
 494        'path_info: project/:/file (implicit HEAD)' \
 495        'gitweb_run "" "/.git/:/file"'
 496
 497test_expect_success \
 498        'path_info: project/:/ (implicit HEAD, top tree)' \
 499        'gitweb_run "" "/.git/:/"'
 500
 501
 502# ----------------------------------------------------------------------
 503# feed generation
 504
 505test_expect_success \
 506        'feeds: OPML' \
 507        'gitweb_run "a=opml"'
 508
 509test_expect_success \
 510        'feed: RSS' \
 511        'gitweb_run "p=.git;a=rss"'
 512
 513test_expect_success \
 514        'feed: Atom' \
 515        'gitweb_run "p=.git;a=atom"'
 516
 517# ----------------------------------------------------------------------
 518# encoding/decoding
 519
 520test_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"'
 529
 530test_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"'
 540
 541test_expect_success \
 542        'encode(log): utf-8 and iso-8859-1' \
 543        'gitweb_run "p=.git;a=log"'
 544
 545# ----------------------------------------------------------------------
 546# extra options
 547
 548test_expect_success \
 549        'opt: log --no-merges' \
 550        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 551
 552test_expect_success \
 553        'opt: atom --no-merges' \
 554        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 555
 556test_expect_success \
 557        'opt: "file" history --no-merges' \
 558        'gitweb_run "p=.git;a=history;f=file;opt=--no-merges"'
 559
 560test_expect_success \
 561        'opt: log --no-such-option (invalid option)' \
 562        'gitweb_run "p=.git;a=log;opt=--no-such-option"'
 563
 564test_expect_success \
 565        'opt: tree --no-merges (invalid option for action)' \
 566        'gitweb_run "p=.git;a=tree;opt=--no-merges"'
 567
 568# ----------------------------------------------------------------------
 569# testing config_to_multi / cloneurl
 570
 571test_expect_success \
 572       'URL: no project URLs, no base URL' \
 573       'gitweb_run "p=.git;a=summary"'
 574
 575test_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"'
 580
 581cat >.git/cloneurl <<\EOF
 582git://example.com/git/trash.git
 583http://example.com/git/trash.git
 584EOF
 585
 586test_expect_success \
 587       'URL: project URLs via cloneurl file' \
 588       'gitweb_run "p=.git;a=summary"'
 589
 590# ----------------------------------------------------------------------
 591# gitweb config and repo config
 592
 593cat >>gitweb_config.perl <<\EOF
 594
 595# 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
 602
 603test_expect_success \
 604        'config override: projects list (implicit)' \
 605        'gitweb_run'
 606
 607test_expect_success \
 608        'config override: tree view, features not overridden in repo config' \
 609        'gitweb_run "p=.git;a=tree"'
 610
 611test_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"'
 617
 618test_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"'
 623
 624cat >.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
 634# ----------------------------------------------------------------------
 635# searching
 636
 637cat >>gitweb_config.perl <<\EOF
 638
 639# enable search
 640$feature{'search'}{'default'} = [1];
 641$feature{'grep'}{'default'} = [1];
 642$feature{'pickaxe'}{'default'} = [1];
 643EOF
 644
 645test_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"'
 652
 653test_expect_success \
 654        'search: commit author' \
 655        'gitweb_run "p=.git;a=search;h=HEAD;st=author;s=A+U+Thor"'
 656
 657test_expect_success \
 658        'search: commit message' \
 659        'gitweb_run "p=.git;a=search;h=HEAD;st=commitr;s=MATCH"'
 660
 661test_expect_success \
 662        'search: grep' \
 663        'gitweb_run "p=.git;a=search;h=HEAD;st=grep;s=MATCH"'
 664
 665test_expect_success \
 666        'search: pickaxe' \
 667        'gitweb_run "p=.git;a=search;h=HEAD;st=pickaxe;s=MATCH"'
 668
 669test_expect_success \
 670        'search: projects' \
 671        'gitweb_run "a=project_list;s=.git"'
 672
 673# ----------------------------------------------------------------------
 674# non-ASCII in README.html
 675
 676test_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
 682# ----------------------------------------------------------------------
 683# syntax highlighting
 684
 685
 686highlight_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
 698
 699test_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"'
 703
 704test_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
 712# ----------------------------------------------------------------------
 713# forks of projects
 714
 715cat >>gitweb_config.perl <<\EOF &&
 716$feature{'forks'}{'default'} = [1];
 717EOF
 718
 719test_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)'
 729
 730test_expect_success \
 731        'forks: projects list' \
 732        'gitweb_run'
 733
 734test_expect_success \
 735        'forks: forks action' \
 736        'gitweb_run "p=foo.git;a=forks"'
 737
 738# ----------------------------------------------------------------------
 739# content tags (tag cloud)
 740
 741cat >>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
 745
 746test_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'
 752
 753test_expect_success \
 754        'ctags: search projects by existing tag' \
 755        'gitweb_run "by_tag=foo"'
 756
 757test_expect_success \
 758        'ctags: search projects by non existent tag' \
 759        'gitweb_run "by_tag=non-existent"'
 760
 761test_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
 769# ----------------------------------------------------------------------
 770# categories
 771
 772test_expect_success \
 773        'categories: projects list, only default category' \
 774        'echo "\$projects_list_group_categories = 1;" >>gitweb_config.perl &&
 775         gitweb_run'
 776
 777# ----------------------------------------------------------------------
 778# unborn branches
 779
 780test_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"'
 788
 789test_done