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# commit, commitdiff: merge, large
 278test_expect_success \
 279        'Create a merge' \
 280        'git checkout b &&
 281         echo "Branch" >> b &&
 282         git add b &&
 283         git commit -a -m "On branch" &&
 284         git checkout master &&
 285         git pull . b'
 286test_expect_success \
 288        'commit(0): merge commit' \
 289        'gitweb_run "p=.git;a=commit"'
 290test_expect_success \
 292        'commitdiff(0): merge commit' \
 293        'gitweb_run "p=.git;a=commitdiff"'
 294test_expect_success \
 296        'Prepare large commit' \
 297        'git checkout b &&
 298         echo "To be changed" > 01-change &&
 299         echo "To be renamed" > 02-pure-rename-from &&
 300         echo "To be deleted" > 03-delete &&
 301         echo "To be renamed and changed" > 04-rename-from &&
 302         echo "To have mode changed" > 05-mode-change &&
 303         echo "File to symlink" > 06-file-or-symlink &&
 304         echo "To be changed and have mode changed" > 07-change-mode-change     &&
 305         git add 0* &&
 306         git commit -a -m "Prepare large commit" &&
 307         echo "Changed" > 01-change &&
 308         git mv 02-pure-rename-from 02-pure-rename-to &&
 309         git rm 03-delete && rm -f 03-delete &&
 310         echo "A new file" > 03-new &&
 311         git add 03-new &&
 312         git mv 04-rename-from 04-rename-to &&
 313         echo "Changed" >> 04-rename-to &&
 314         test_chmod +x 05-mode-change &&
 315         rm -f 06-file-or-symlink &&
 316         if test_have_prereq SYMLINKS; then
 317                ln -s 01-change 06-file-or-symlink
 318         else
 319                printf %s 01-change > 06-file-or-symlink
 320         fi &&
 321         echo "Changed and have mode changed" > 07-change-mode-change   &&
 322         test_chmod +x 07-change-mode-change &&
 323         git commit -a -m "Large commit" &&
 324         git checkout master'
 325test_expect_success \
 327        'commit(1): large commit' \
 328        'gitweb_run "p=.git;a=commit;h=b"'
 329test_expect_success \
 331        'commitdiff(1): large commit' \
 332        'gitweb_run "p=.git;a=commitdiff;h=b"'
 333# ----------------------------------------------------------------------
 335# tags testing
 336test_expect_success \
 338        'tags: list of different types of tags' \
 339        'git checkout master &&
 340         git tag -a -m "Tag commit object" tag-commit HEAD &&
 341         git tag -a -m "" tag-commit-nomessage HEAD &&
 342         git tag -a -m "Tag tag object" tag-tag tag-commit &&
 343         git tag -a -m "Tag tree object" tag-tree HEAD^{tree} &&
 344         git tag -a -m "Tag blob object" tag-blob HEAD:file &&
 345         git tag lightweight/tag-commit HEAD &&
 346         git tag lightweight/tag-tag tag-commit &&
 347         git tag lightweight/tag-tree HEAD^{tree} &&
 348         git tag lightweight/tag-blob HEAD:file &&
 349         gitweb_run "p=.git;a=tags"'
 350test_expect_success \
 352        'tag: Tag to commit object' \
 353        'gitweb_run "p=.git;a=tag;h=tag-commit"'
 354test_expect_success \
 356        'tag: on lightweight tag (invalid)' \
 357        'gitweb_run "p=.git;a=tag;h=lightweight/tag-commit"'
 358# ----------------------------------------------------------------------
 360# logs
 361test_expect_success \
 363        'logs: log (implicit HEAD)' \
 364        'gitweb_run "p=.git;a=log"'
 365test_expect_success \
 367        'logs: shortlog (implicit HEAD)' \
 368        'gitweb_run "p=.git;a=shortlog"'
 369test_expect_success \
 371        'logs: history (implicit HEAD, file)' \
 372        'gitweb_run "p=.git;a=history;f=file"'
 373test_expect_success \
 375        'logs: history (implicit HEAD, non-existent file)' \
 376        'gitweb_run "p=.git;a=history;f=non-existent"'
 377test_expect_success \
 379        'logs: history (implicit HEAD, deleted file)' \
 380        'git checkout master &&
 381         echo "to be deleted" > deleted_file &&
 382         git add deleted_file &&
 383         git commit -m "Add file to be deleted" &&
 384         git rm deleted_file &&
 385         git commit -m "Delete file" &&
 386         gitweb_run "p=.git;a=history;f=deleted_file"'
 387# ----------------------------------------------------------------------
 389# path_info links
 390test_expect_success \
 391        'path_info: project' \
 392        'gitweb_run "" "/.git"'
 393test_expect_success \
 395        'path_info: project/branch' \
 396        'gitweb_run "" "/.git/b"'
 397test_expect_success \
 399        'path_info: project/branch:file' \
 400        'gitweb_run "" "/.git/master:file"'
 401test_expect_success \
 403        'path_info: project/branch:dir/' \
 404        'gitweb_run "" "/.git/master:foo/"'
 405test_expect_success \
 407        'path_info: project/branch:file (non-existent)' \
 408        'gitweb_run "" "/.git/master:non-existent"'
 409test_expect_success \
 411        'path_info: project/branch:dir/ (non-existent)' \
 412        'gitweb_run "" "/.git/master:non-existent/"'
 413test_expect_success \
 416        'path_info: project/branch:/file' \
 417        'gitweb_run "" "/.git/master:/file"'
 418test_expect_success \
 420        'path_info: project/:/file (implicit HEAD)' \
 421        'gitweb_run "" "/.git/:/file"'
 422test_expect_success \
 424        'path_info: project/:/ (implicit HEAD, top tree)' \
 425        'gitweb_run "" "/.git/:/"'
 426# ----------------------------------------------------------------------
 429# feed generation
 430test_expect_success \
 432        'feeds: OPML' \
 433        'gitweb_run "a=opml"'
 434test_expect_success \
 436        'feed: RSS' \
 437        'gitweb_run "p=.git;a=rss"'
 438test_expect_success \
 440        'feed: Atom' \
 441        'gitweb_run "p=.git;a=atom"'
 442# ----------------------------------------------------------------------
 444# encoding/decoding
 445test_expect_success \
 447        'encode(commit): utf8' \
 448        '. "$TEST_DIRECTORY"/t3901-utf8.txt &&
 449         echo "UTF-8" >> file &&
 450         git add file &&
 451         git commit -F "$TEST_DIRECTORY"/t3900/1-UTF-8.txt &&
 452         gitweb_run "p=.git;a=commit"'
 453test_expect_success \
 455        'encode(commit): iso-8859-1' \
 456        '. "$TEST_DIRECTORY"/t3901-8859-1.txt &&
 457         echo "ISO-8859-1" >> file &&
 458         git add file &&
 459         git config i18n.commitencoding ISO-8859-1 &&
 460         git commit -F "$TEST_DIRECTORY"/t3900/ISO8859-1.txt &&
 461         git config --unset i18n.commitencoding &&
 462         gitweb_run "p=.git;a=commit"'
 463test_expect_success \
 465        'encode(log): utf-8 and iso-8859-1' \
 466        'gitweb_run "p=.git;a=log"'
 467# ----------------------------------------------------------------------
 469# extra options
 470test_expect_success \
 472        'opt: log --no-merges' \
 473        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 474test_expect_success \
 476        'opt: atom --no-merges' \
 477        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 478test_expect_success \
 480        'opt: "file" history --no-merges' \
 481        'gitweb_run "p=.git;a=history;f=file;opt=--no-merges"'
 482test_expect_success \
 484        'opt: log --no-such-option (invalid option)' \
 485        'gitweb_run "p=.git;a=log;opt=--no-such-option"'
 486test_expect_success \
 488        'opt: tree --no-merges (invalid option for action)' \
 489        'gitweb_run "p=.git;a=tree;opt=--no-merges"'
 490# ----------------------------------------------------------------------
 492# testing config_to_multi / cloneurl
 493test_expect_success \
 495       'URL: no project URLs, no base URL' \
 496       'gitweb_run "p=.git;a=summary"'
 497test_expect_success \
 499       'URL: project URLs via gitweb.url' \
 500       'git config --add gitweb.url git://example.com/git/trash.git &&
 501        git config --add gitweb.url http://example.com/git/trash.git &&
 502        gitweb_run "p=.git;a=summary"'
 503cat >.git/cloneurl <<\EOF
 505git://example.com/git/trash.git
 506http://example.com/git/trash.git
 507EOF
 508test_expect_success \
 510       'URL: project URLs via cloneurl file' \
 511       'gitweb_run "p=.git;a=summary"'
 512# ----------------------------------------------------------------------
 514# gitweb config and repo config
 515cat >>gitweb_config.perl <<\EOF
 517# turn on override for each overridable feature
 519foreach my $key (keys %feature) {
 520        if ($feature{$key}{'sub'}) {
 521                $feature{$key}{'override'} = 1;
 522        }
 523}
 524EOF
 525test_expect_success \
 527        'config override: projects list (implicit)' \
 528        'gitweb_run'
 529test_expect_success \
 531        'config override: tree view, features not overridden in repo config' \
 532        'gitweb_run "p=.git;a=tree"'
 533test_expect_success \
 535        'config override: tree view, features disabled in repo config' \
 536        'git config gitweb.blame no &&
 537         git config gitweb.snapshot none &&
 538         git config gitweb.avatar gravatar &&
 539         gitweb_run "p=.git;a=tree"'
 540test_expect_success \
 542        'config override: tree view, features enabled in repo config (1)' \
 543        'git config gitweb.blame yes &&
 544         git config gitweb.snapshot "zip,tgz, tbz2" &&
 545         gitweb_run "p=.git;a=tree"'
 546cat >.git/config <<\EOF
 548# testing noval and alternate separator
 549[gitweb]
 550        blame
 551        snapshot = zip tgz
 552EOF
 553test_expect_success \
 554        'config override: tree view, features enabled in repo config (2)' \
 555        'gitweb_run "p=.git;a=tree"'
 556# ----------------------------------------------------------------------
 558# non-ASCII in README.html
 559test_expect_success \
 561        'README.html with non-ASCII characters (utf-8)' \
 562        'echo "<b>UTF-8 example:</b><br />" > .git/README.html &&
 563         cat "$TEST_DIRECTORY"/t3900/1-UTF-8.txt >> .git/README.html &&
 564         gitweb_run "p=.git;a=summary"'
 565# ----------------------------------------------------------------------
 567# syntax highlighting
 568highlight --version >/dev/null 2>&1
 571if [ $? -eq 127 ]; then
 572        say "Skipping syntax highlighting test, because 'highlight' was not found"
 573else
 574        test_set_prereq HIGHLIGHT
 575        cat >>gitweb_config.perl <<-\EOF
 576        our $highlight_bin = "highlight";
 577        $feature{'highlight'}{'override'} = 1;
 578        EOF
 579fi
 580test_expect_success HIGHLIGHT \
 582        'syntax highlighting (no highlight, unknown syntax)' \
 583        'git config gitweb.highlight yes &&
 584         gitweb_run "p=.git;a=blob;f=file"'
 585test_expect_success HIGHLIGHT \
 587        'syntax highlighting (highlighted, shell script)' \
 588        'git config gitweb.highlight yes &&
 589         echo "#!/usr/bin/sh" > test.sh &&
 590         git add test.sh &&
 591         git commit -m "Add test.sh" &&
 592         gitweb_run "p=.git;a=blob;f=test.sh"'
 593test_done