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_debug 'cat gitweb.log'
  22test_expect_success \
  24        'no commits: projects_index' \
  25        'gitweb_run "a=project_index"'
  26test_debug 'cat gitweb.log'
  27test_expect_success \
  29        'no commits: .git summary (implicit)' \
  30        'gitweb_run "p=.git"'
  31test_debug 'cat gitweb.log'
  32test_expect_success \
  34        'no commits: .git commit (implicit HEAD)' \
  35        'gitweb_run "p=.git;a=commit"'
  36test_debug 'cat gitweb.log'
  37test_expect_success \
  39        'no commits: .git commitdiff (implicit HEAD)' \
  40        'gitweb_run "p=.git;a=commitdiff"'
  41test_debug 'cat gitweb.log'
  42test_expect_success \
  44        'no commits: .git tree (implicit HEAD)' \
  45        'gitweb_run "p=.git;a=tree"'
  46test_debug 'cat gitweb.log'
  47test_expect_success \
  49        'no commits: .git heads' \
  50        'gitweb_run "p=.git;a=heads"'
  51test_debug 'cat gitweb.log'
  52test_expect_success \
  54        'no commits: .git tags' \
  55        'gitweb_run "p=.git;a=tags"'
  56test_debug 'cat gitweb.log'
  57# ----------------------------------------------------------------------
  60# initial commit
  61test_expect_success \
  63        'Make initial commit' \
  64        'echo "Not an empty file." > file &&
  65         git add file &&
  66         git commit -a -m "Initial commit." &&
  67         git branch b'
  68test_expect_success \
  70        'projects_list (implicit)' \
  71        'gitweb_run'
  72test_debug 'cat gitweb.log'
  73test_expect_success \
  75        'projects_index' \
  76        'gitweb_run "a=project_index"'
  77test_debug 'cat gitweb.log'
  78test_expect_success \
  80        '.git summary (implicit)' \
  81        'gitweb_run "p=.git"'
  82test_debug 'cat gitweb.log'
  83test_expect_success \
  85        '.git commit (implicit HEAD)' \
  86        'gitweb_run "p=.git;a=commit"'
  87test_debug 'cat gitweb.log'
  88test_expect_success \
  90        '.git commitdiff (implicit HEAD, root commit)' \
  91        'gitweb_run "p=.git;a=commitdiff"'
  92test_debug 'cat gitweb.log'
  93test_expect_success \
  95        '.git commitdiff_plain (implicit HEAD, root commit)' \
  96        'gitweb_run "p=.git;a=commitdiff_plain"'
  97test_debug 'cat gitweb.log'
  98test_expect_success \
 100        '.git commit (HEAD)' \
 101        'gitweb_run "p=.git;a=commit;h=HEAD"'
 102test_debug 'cat gitweb.log'
 103test_expect_success \
 105        '.git tree (implicit HEAD)' \
 106        'gitweb_run "p=.git;a=tree"'
 107test_debug 'cat gitweb.log'
 108test_expect_success \
 110        '.git blob (file)' \
 111        'gitweb_run "p=.git;a=blob;f=file"'
 112test_debug 'cat gitweb.log'
 113test_expect_success \
 115        '.git blob_plain (file)' \
 116        'gitweb_run "p=.git;a=blob_plain;f=file"'
 117test_debug 'cat gitweb.log'
 118# ----------------------------------------------------------------------
 120# nonexistent objects
 121test_expect_success \
 123        '.git commit (non-existent)' \
 124        'gitweb_run "p=.git;a=commit;h=non-existent"'
 125test_debug 'cat gitweb.log'
 126test_expect_success \
 128        '.git commitdiff (non-existent)' \
 129        'gitweb_run "p=.git;a=commitdiff;h=non-existent"'
 130test_debug 'cat gitweb.log'
 131test_expect_success \
 133        '.git commitdiff (non-existent vs HEAD)' \
 134        'gitweb_run "p=.git;a=commitdiff;hp=non-existent;h=HEAD"'
 135test_debug 'cat gitweb.log'
 136test_expect_success \
 138        '.git tree (0000000000000000000000000000000000000000)' \
 139        'gitweb_run "p=.git;a=tree;h=0000000000000000000000000000000000000000"'
 140test_debug 'cat gitweb.log'
 141test_expect_success \
 143        '.git tag (0000000000000000000000000000000000000000)' \
 144        'gitweb_run "p=.git;a=tag;h=0000000000000000000000000000000000000000"'
 145test_debug 'cat gitweb.log'
 146test_expect_success \
 148        '.git blob (non-existent)' \
 149        'gitweb_run "p=.git;a=blob;f=non-existent"'
 150test_debug 'cat gitweb.log'
 151test_expect_success \
 153        '.git blob_plain (non-existent)' \
 154        'gitweb_run "p=.git;a=blob_plain;f=non-existent"'
 155test_debug 'cat gitweb.log'
 156# ----------------------------------------------------------------------
 159# commitdiff testing (implicit, one implicit tree-ish)
 160test_expect_success \
 162        'commitdiff(0): root' \
 163        'gitweb_run "p=.git;a=commitdiff"'
 164test_debug 'cat gitweb.log'
 165test_expect_success \
 167        'commitdiff(0): file added' \
 168        'echo "New file" > new_file &&
 169         git add new_file &&
 170         git commit -a -m "File added." &&
 171         gitweb_run "p=.git;a=commitdiff"'
 172test_debug 'cat gitweb.log'
 173test_expect_success \
 175        'commitdiff(0): mode change' \
 176        'test_chmod +x new_file &&
 177         git commit -a -m "Mode changed." &&
 178         gitweb_run "p=.git;a=commitdiff"'
 179test_debug 'cat gitweb.log'
 180test_expect_success \
 182        'commitdiff(0): file renamed' \
 183        'git mv new_file renamed_file &&
 184         git commit -a -m "File renamed." &&
 185         gitweb_run "p=.git;a=commitdiff"'
 186test_debug 'cat gitweb.log'
 187test_expect_success SYMLINKS \
 189        'commitdiff(0): file to symlink' \
 190        'rm renamed_file &&
 191         ln -s file renamed_file &&
 192         git commit -a -m "File to symlink." &&
 193         gitweb_run "p=.git;a=commitdiff"'
 194test_debug 'cat gitweb.log'
 195test_expect_success \
 197        'commitdiff(0): file deleted' \
 198        'git rm renamed_file &&
 199         rm -f renamed_file &&
 200         git commit -a -m "File removed." &&
 201         gitweb_run "p=.git;a=commitdiff"'
 202test_debug 'cat gitweb.log'
 203test_expect_success \
 205        'commitdiff(0): file copied / new file' \
 206        'cp file file2 &&
 207         git add file2 &&
 208         git commit -a -m "File copied." &&
 209         gitweb_run "p=.git;a=commitdiff"'
 210test_debug 'cat gitweb.log'
 211test_expect_success \
 213        'commitdiff(0): mode change and modified' \
 214        'echo "New line" >> file2 &&
 215         test_chmod +x file2 &&
 216         git commit -a -m "Mode change and modification." &&
 217         gitweb_run "p=.git;a=commitdiff"'
 218test_debug 'cat gitweb.log'
 219test_expect_success \
 221        'commitdiff(0): renamed and modified' \
 222        'cat >file2<<EOF &&
 223Dominus regit me,
 224et nihil mihi deerit.
 225In loco pascuae ibi me collocavit,
 226super aquam refectionis educavit me;
 227animam meam convertit,
 228deduxit me super semitas jusitiae,
 229propter nomen suum.
 230EOF
 231         git commit -a -m "File added." &&
 232         git mv file2 file3 &&
 233         echo "Propter nomen suum." >> file3 &&
 234         git commit -a -m "File rename and modification." &&
 235         gitweb_run "p=.git;a=commitdiff"'
 236test_debug 'cat gitweb.log'
 237test_expect_success \
 239        'commitdiff(0): renamed, mode change and modified' \
 240        'git mv file3 file2 &&
 241         echo "Propter nomen suum." >> file2 &&
 242         test_chmod +x file2 &&
 243         git commit -a -m "File rename, mode change and modification." &&
 244         gitweb_run "p=.git;a=commitdiff"'
 245test_debug 'cat gitweb.log'
 246# ----------------------------------------------------------------------
 248# commitdiff testing (taken from t4114-apply-typechange.sh)
 249test_expect_success SYMLINKS 'setup typechange commits' '
 251        echo "hello world" > foo &&
 252        echo "hi planet" > bar &&
 253        git update-index --add foo bar &&
 254        git commit -m initial &&
 255        git branch initial &&
 256        rm -f foo &&
 257        ln -s bar foo &&
 258        git update-index foo &&
 259        git commit -m "foo symlinked to bar" &&
 260        git branch foo-symlinked-to-bar &&
 261        rm -f foo &&
 262        echo "how far is the sun?" > foo &&
 263        git update-index foo &&
 264        git commit -m "foo back to file" &&
 265        git branch foo-back-to-file &&
 266        rm -f foo &&
 267        git update-index --remove foo &&
 268        mkdir foo &&
 269        echo "if only I knew" > foo/baz &&
 270        git update-index --add foo/baz &&
 271        git commit -m "foo becomes a directory" &&
 272        git branch "foo-becomes-a-directory" &&
 273        echo "hello world" > foo/baz &&
 274        git update-index foo/baz &&
 275        git commit -m "foo/baz is the original foo" &&
 276        git branch foo-baz-renamed-from-foo
 277        '
 278test_expect_success \
 280        'commitdiff(2): file renamed from foo to foo/baz' \
 281        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-baz-renamed-from-foo"'
 282test_debug 'cat gitweb.log'
 283test_expect_success \
 285        'commitdiff(2): file renamed from foo/baz to foo' \
 286        'gitweb_run "p=.git;a=commitdiff;hp=foo-baz-renamed-from-foo;h=initial"'
 287test_debug 'cat gitweb.log'
 288test_expect_success \
 290        'commitdiff(2): directory becomes file' \
 291        'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=initial"'
 292test_debug 'cat gitweb.log'
 293test_expect_success \
 295        'commitdiff(2): file becomes directory' \
 296        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-becomes-a-directory"'
 297test_debug 'cat gitweb.log'
 298test_expect_success \
 300        'commitdiff(2): file becomes symlink' \
 301        'gitweb_run "p=.git;a=commitdiff;hp=initial;h=foo-symlinked-to-bar"'
 302test_debug 'cat gitweb.log'
 303test_expect_success \
 305        'commitdiff(2): symlink becomes file' \
 306        'gitweb_run "p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-back-to-file"'
 307test_debug 'cat gitweb.log'
 308test_expect_success \
 310        'commitdiff(2): symlink becomes directory' \
 311        'gitweb_run "p=.git;a=commitdiff;hp=foo-symlinked-to-bar;h=foo-becomes-a-directory"'
 312test_debug 'cat gitweb.log'
 313test_expect_success \
 315        'commitdiff(2): directory becomes symlink' \
 316        'gitweb_run "p=.git;a=commitdiff;hp=foo-becomes-a-directory;h=foo-symlinked-to-bar"'
 317test_debug 'cat gitweb.log'
 318# ----------------------------------------------------------------------
 320# commit, commitdiff: merge, large
 321test_expect_success \
 322        'Create a merge' \
 323        'git checkout b &&
 324         echo "Branch" >> b &&
 325         git add b &&
 326         git commit -a -m "On branch" &&
 327         git checkout master &&
 328         git pull . b'
 329test_expect_success \
 331        'commit(0): merge commit' \
 332        'gitweb_run "p=.git;a=commit"'
 333test_debug 'cat gitweb.log'
 334test_expect_success \
 336        'commitdiff(0): merge commit' \
 337        'gitweb_run "p=.git;a=commitdiff"'
 338test_debug 'cat gitweb.log'
 339test_expect_success \
 341        'Prepare large commit' \
 342        'git checkout b &&
 343         echo "To be changed" > 01-change &&
 344         echo "To be renamed" > 02-pure-rename-from &&
 345         echo "To be deleted" > 03-delete &&
 346         echo "To be renamed and changed" > 04-rename-from &&
 347         echo "To have mode changed" > 05-mode-change &&
 348         echo "File to symlink" > 06-file-or-symlink &&
 349         echo "To be changed and have mode changed" > 07-change-mode-change     &&
 350         git add 0* &&
 351         git commit -a -m "Prepare large commit" &&
 352         echo "Changed" > 01-change &&
 353         git mv 02-pure-rename-from 02-pure-rename-to &&
 354         git rm 03-delete && rm -f 03-delete &&
 355         echo "A new file" > 03-new &&
 356         git add 03-new &&
 357         git mv 04-rename-from 04-rename-to &&
 358         echo "Changed" >> 04-rename-to &&
 359         test_chmod +x 05-mode-change &&
 360         rm -f 06-file-or-symlink &&
 361         if test_have_prereq SYMLINKS; then
 362                ln -s 01-change 06-file-or-symlink
 363         else
 364                printf %s 01-change > 06-file-or-symlink
 365         fi &&
 366         echo "Changed and have mode changed" > 07-change-mode-change   &&
 367         test_chmod +x 07-change-mode-change &&
 368         git commit -a -m "Large commit" &&
 369         git checkout master'
 370test_expect_success \
 372        'commit(1): large commit' \
 373        'gitweb_run "p=.git;a=commit;h=b"'
 374test_debug 'cat gitweb.log'
 375test_expect_success \
 377        'commitdiff(1): large commit' \
 378        'gitweb_run "p=.git;a=commitdiff;h=b"'
 379test_debug 'cat gitweb.log'
 380# ----------------------------------------------------------------------
 382# tags testing
 383test_expect_success \
 385        'tags: list of different types of tags' \
 386        'git checkout master &&
 387         git tag -a -m "Tag commit object" tag-commit HEAD &&
 388         git tag -a -m "" tag-commit-nomessage HEAD &&
 389         git tag -a -m "Tag tag object" tag-tag tag-commit &&
 390         git tag -a -m "Tag tree object" tag-tree HEAD^{tree} &&
 391         git tag -a -m "Tag blob object" tag-blob HEAD:file &&
 392         git tag lightweight/tag-commit HEAD &&
 393         git tag lightweight/tag-tag tag-commit &&
 394         git tag lightweight/tag-tree HEAD^{tree} &&
 395         git tag lightweight/tag-blob HEAD:file &&
 396         gitweb_run "p=.git;a=tags"'
 397test_debug 'cat gitweb.log'
 398test_expect_success \
 400        'tag: Tag to commit object' \
 401        'gitweb_run "p=.git;a=tag;h=tag-commit"'
 402test_debug 'cat gitweb.log'
 403test_expect_success \
 405        'tag: on lightweight tag (invalid)' \
 406        'gitweb_run "p=.git;a=tag;h=lightweight/tag-commit"'
 407test_debug 'cat gitweb.log'
 408# ----------------------------------------------------------------------
 410# logs
 411test_expect_success \
 413        'logs: log (implicit HEAD)' \
 414        'gitweb_run "p=.git;a=log"'
 415test_debug 'cat gitweb.log'
 416test_expect_success \
 418        'logs: shortlog (implicit HEAD)' \
 419        'gitweb_run "p=.git;a=shortlog"'
 420test_debug 'cat gitweb.log'
 421test_expect_success \
 423        'logs: history (implicit HEAD, file)' \
 424        'gitweb_run "p=.git;a=history;f=file"'
 425test_debug 'cat gitweb.log'
 426test_expect_success \
 428        'logs: history (implicit HEAD, non-existent file)' \
 429        'gitweb_run "p=.git;a=history;f=non-existent"'
 430test_debug 'cat gitweb.log'
 431test_expect_success \
 433        'logs: history (implicit HEAD, deleted file)' \
 434        'git checkout master &&
 435         echo "to be deleted" > deleted_file &&
 436         git add deleted_file &&
 437         git commit -m "Add file to be deleted" &&
 438         git rm deleted_file &&
 439         git commit -m "Delete file" &&
 440         gitweb_run "p=.git;a=history;f=deleted_file"'
 441test_debug 'cat gitweb.log'
 442# ----------------------------------------------------------------------
 444# path_info links
 445test_expect_success \
 446        'path_info: project' \
 447        'gitweb_run "" "/.git"'
 448test_debug 'cat gitweb.log'
 449test_expect_success \
 451        'path_info: project/branch' \
 452        'gitweb_run "" "/.git/b"'
 453test_debug 'cat gitweb.log'
 454test_expect_success \
 456        'path_info: project/branch:file' \
 457        'gitweb_run "" "/.git/master:file"'
 458test_debug 'cat gitweb.log'
 459test_expect_success \
 461        'path_info: project/branch:dir/' \
 462        'gitweb_run "" "/.git/master:foo/"'
 463test_debug 'cat gitweb.log'
 464test_expect_success \
 466        'path_info: project/branch:file (non-existent)' \
 467        'gitweb_run "" "/.git/master:non-existent"'
 468test_debug 'cat gitweb.log'
 469test_expect_success \
 471        'path_info: project/branch:dir/ (non-existent)' \
 472        'gitweb_run "" "/.git/master:non-existent/"'
 473test_debug 'cat gitweb.log'
 474test_expect_success \
 477        'path_info: project/branch:/file' \
 478        'gitweb_run "" "/.git/master:/file"'
 479test_debug 'cat gitweb.log'
 480test_expect_success \
 482        'path_info: project/:/file (implicit HEAD)' \
 483        'gitweb_run "" "/.git/:/file"'
 484test_debug 'cat gitweb.log'
 485test_expect_success \
 487        'path_info: project/:/ (implicit HEAD, top tree)' \
 488        'gitweb_run "" "/.git/:/"'
 489test_debug 'cat gitweb.log'
 490# ----------------------------------------------------------------------
 493# feed generation
 494test_expect_success \
 496        'feeds: OPML' \
 497        'gitweb_run "a=opml"'
 498test_debug 'cat gitweb.log'
 499test_expect_success \
 501        'feed: RSS' \
 502        'gitweb_run "p=.git;a=rss"'
 503test_debug 'cat gitweb.log'
 504test_expect_success \
 506        'feed: Atom' \
 507        'gitweb_run "p=.git;a=atom"'
 508test_debug 'cat gitweb.log'
 509# ----------------------------------------------------------------------
 511# encoding/decoding
 512test_expect_success \
 514        'encode(commit): utf8' \
 515        '. "$TEST_DIRECTORY"/t3901-utf8.txt &&
 516         echo "UTF-8" >> file &&
 517         git add file &&
 518         git commit -F "$TEST_DIRECTORY"/t3900/1-UTF-8.txt &&
 519         gitweb_run "p=.git;a=commit"'
 520test_debug 'cat gitweb.log'
 521test_expect_success \
 523        'encode(commit): iso-8859-1' \
 524        '. "$TEST_DIRECTORY"/t3901-8859-1.txt &&
 525         echo "ISO-8859-1" >> file &&
 526         git add file &&
 527         git config i18n.commitencoding ISO-8859-1 &&
 528         git commit -F "$TEST_DIRECTORY"/t3900/ISO8859-1.txt &&
 529         git config --unset i18n.commitencoding &&
 530         gitweb_run "p=.git;a=commit"'
 531test_debug 'cat gitweb.log'
 532test_expect_success \
 534        'encode(log): utf-8 and iso-8859-1' \
 535        'gitweb_run "p=.git;a=log"'
 536test_debug 'cat gitweb.log'
 537# ----------------------------------------------------------------------
 539# extra options
 540test_expect_success \
 542        'opt: log --no-merges' \
 543        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 544test_debug 'cat gitweb.log'
 545test_expect_success \
 547        'opt: atom --no-merges' \
 548        'gitweb_run "p=.git;a=log;opt=--no-merges"'
 549test_debug 'cat gitweb.log'
 550test_expect_success \
 552        'opt: "file" history --no-merges' \
 553        'gitweb_run "p=.git;a=history;f=file;opt=--no-merges"'
 554test_debug 'cat gitweb.log'
 555test_expect_success \
 557        'opt: log --no-such-option (invalid option)' \
 558        'gitweb_run "p=.git;a=log;opt=--no-such-option"'
 559test_debug 'cat gitweb.log'
 560test_expect_success \
 562        'opt: tree --no-merges (invalid option for action)' \
 563        'gitweb_run "p=.git;a=tree;opt=--no-merges"'
 564test_debug 'cat gitweb.log'
 565# ----------------------------------------------------------------------
 567# testing config_to_multi / cloneurl
 568test_expect_success \
 570       'URL: no project URLs, no base URL' \
 571       'gitweb_run "p=.git;a=summary"'
 572test_debug 'cat gitweb.log'
 573test_expect_success \
 575       'URL: project URLs via gitweb.url' \
 576       'git config --add gitweb.url git://example.com/git/trash.git &&
 577        git config --add gitweb.url http://example.com/git/trash.git &&
 578        gitweb_run "p=.git;a=summary"'
 579test_debug 'cat gitweb.log'
 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"'
 589test_debug 'cat gitweb.log'
 590# ----------------------------------------------------------------------
 592# gitweb config and repo config
 593cat >>gitweb_config.perl <<EOF
 595\$feature{'blame'}{'override'} = 1;
 597\$feature{'snapshot'}{'override'} = 1;
 598\$feature{'avatar'}{'override'} = 1;
 599EOF
 600test_expect_success \
 602        'config override: tree view, features not overridden in repo config' \
 603        'gitweb_run "p=.git;a=tree"'
 604test_debug 'cat gitweb.log'
 605test_expect_success \
 607        'config override: tree view, features disabled in repo config' \
 608        'git config gitweb.blame no &&
 609         git config gitweb.snapshot none &&
 610         git config gitweb.avatar gravatar &&
 611         gitweb_run "p=.git;a=tree"'
 612test_debug 'cat gitweb.log'
 613test_expect_success \
 615        'config override: tree view, features enabled in repo config (1)' \
 616        'git config gitweb.blame yes &&
 617         git config gitweb.snapshot "zip,tgz, tbz2" &&
 618         gitweb_run "p=.git;a=tree"'
 619test_debug 'cat gitweb.log'
 620cat >.git/config <<\EOF
 622# testing noval and alternate separator
 623[gitweb]
 624        blame
 625        snapshot = zip tgz
 626EOF
 627test_expect_success \
 628        'config override: tree view, features enabled in repo config (2)' \
 629        'gitweb_run "p=.git;a=tree"'
 630test_debug 'cat gitweb.log'
 631# ----------------------------------------------------------------------
 633# non-ASCII in README.html
 634test_expect_success \
 636        'README.html with non-ASCII characters (utf-8)' \
 637        'echo "<b>UTF-8 example:</b><br />" > .git/README.html &&
 638         cat "$TEST_DIRECTORY"/t3900/1-UTF-8.txt >> .git/README.html &&
 639         gitweb_run "p=.git;a=summary"'
 640test_debug 'cat gitweb.log'
 641test_done