1#!/bin/sh 2# 3# Copyright (c) 2005 Junio C Hamano 4# 5# This program is free software: you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation, either version 2 of the License, or 8# (at your option) any later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program. If not, see http://www.gnu.org/licenses/ . 17 18# if --tee was passed, write the output not only to the terminal, but 19# additionally to the file test-results/$BASENAME.out, too. 20case"$GIT_TEST_TEE_STARTED, $* "in 21done,*) 22# do not redirect again 23;; 24*' --tee '*|*' --va'*) 25mkdir-p test-results 26 BASE=test-results/$(basename "$0" .sh) 27(GIT_TEST_TEE_STARTED=done${SHELL-sh}"$0""$@"2>&1; 28echo $? >$BASE.exit) |tee$BASE.out 29test"$(cat $BASE.exit)"=0 30exit 31;; 32esac 33 34# Keep the original TERM for say_color 35ORIGINAL_TERM=$TERM 36 37# For repeatability, reset the environment to known value. 38LANG=C 39LC_ALL=C 40PAGER=cat 41TZ=UTC 42TERM=dumb 43export LANG LC_ALL PAGER TERM TZ 44EDITOR=: 45unset VISUAL 46unset GIT_EDITOR 47unset AUTHOR_DATE 48unset AUTHOR_EMAIL 49unset AUTHOR_NAME 50unset COMMIT_AUTHOR_EMAIL 51unset COMMIT_AUTHOR_NAME 52unset EMAIL 53unset GIT_ALTERNATE_OBJECT_DIRECTORIES 54unset GIT_AUTHOR_DATE 55GIT_AUTHOR_EMAIL=author@example.com 56GIT_AUTHOR_NAME='A U Thor' 57unset GIT_COMMITTER_DATE 58GIT_COMMITTER_EMAIL=committer@example.com 59GIT_COMMITTER_NAME='C O Mitter' 60unset GIT_DIFF_OPTS 61unset GIT_DIR 62unset GIT_WORK_TREE 63unset GIT_EXTERNAL_DIFF 64unset GIT_INDEX_FILE 65unset GIT_OBJECT_DIRECTORY 66unset GIT_CEILING_DIRECTORIES 67unset SHA1_FILE_DIRECTORIES 68unset SHA1_FILE_DIRECTORY 69unset GIT_NOTES_REF 70unset GIT_NOTES_DISPLAY_REF 71unset GIT_NOTES_REWRITE_REF 72unset GIT_NOTES_REWRITE_MODE 73GIT_MERGE_VERBOSITY=5 74export GIT_MERGE_VERBOSITY 75export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME 76export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME 77export EDITOR 78 79# Protect ourselves from common misconfiguration to export 80# CDPATH into the environment 81unset CDPATH 82 83unset GREP_OPTIONS 84 85case$(echo $GIT_TRACE |tr "[A-Z]" "[a-z]")in 861|2|true) 87echo"* warning: Some tests will not work if GIT_TRACE" \ 88"is set as to trace on STDERR ! *" 89echo"* warning: Please set GIT_TRACE to something" \ 90"other than 1, 2 or true ! *" 91;; 92esac 93 94# Convenience 95# 96# A regexp to match 5 and 40 hexdigits 97_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' 98_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05" 99 100# Each test should start with something like this, after copyright notices: 101# 102# test_description='Description of this test... 103# This test checks if command xyzzy does the right thing... 104# ' 105# . ./test-lib.sh 106["x$ORIGINAL_TERM"!="xdumb"] && ( 107 TERM=$ORIGINAL_TERM&& 108export TERM && 109[-t1] && 110tput bold >/dev/null 2>&1&& 111tput setaf 1>/dev/null 2>&1&& 112tput sgr0 >/dev/null 2>&1 113) && 114 color=t 115 116whiletest"$#"-ne0 117do 118case"$1"in 119-d|--d|--de|--deb|--debu|--debug) 120 debug=t;shift;; 121-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 122 immediate=t;shift;; 123-l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) 124 GIT_TEST_LONG=t;export GIT_TEST_LONG;shift;; 125-h|--h|--he|--hel|--help) 126help=t;shift;; 127-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 128 verbose=t;shift;; 129-q|--q|--qu|--qui|--quie|--quiet) 130# Ignore --quiet under a TAP::Harness. Saying how many tests 131# passed without the ok/not ok details is always an error. 132test -z"$HARNESS_ACTIVE"&& quiet=t;shift;; 133--with-dashes) 134 with_dashes=t;shift;; 135--no-color) 136 color=;shift;; 137--va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) 138 valgrind=t; verbose=t;shift;; 139--tee) 140shift;;# was handled already 141--root=*) 142 root=$(expr "z$1" : 'z[^=]*=\(.*\)') 143 shift ;; 144 *) 145 echo "error: unknown test option '$1'" >&2; exit 1 ;; 146 esac 147done 148 149if test -n "$color"; then 150 say_color () { 151 ( 152 TERM=$ORIGINAL_TERM 153 export TERM 154 case "$1" in 155 error) tput bold; tput setaf 1;; # bold red 156 skip) tput bold; tput setaf 2;; # bold green 157 pass) tput setaf 2;; # green 158 info) tput setaf 3;; # brown 159 *) test -n "$quiet" && return;; 160 esac 161 shift 162 printf "%s" "$*" 163 tput sgr0 164 echo 165 ) 166 } 167else 168 say_color() { 169 test -z "$1" && test -n "$quiet" && return 170 shift 171 echo "$*" 172 } 173fi 174 175error () { 176 say_color error "error: $*" 177 GIT_EXIT_OK=t 178 exit 1 179} 180 181say () { 182 say_color info "$*" 183} 184 185test "${test_description}" != "" || 186error "Test script did not set test_description." 187 188if test "$help" = "t" 189then 190 echo "$test_description" 191 exit 0 192fi 193 194exec 5>&1 195if test "$verbose" = "t" 196then 197 exec 4>&2 3>&1 198else 199 exec 4>/dev/null 3>/dev/null 200fi 201 202test_failure=0 203test_count=0 204test_fixed=0 205test_broken=0 206test_success=0 207 208test_external_has_tap=0 209 210die () { 211 code=$? 212 if test -n "$GIT_EXIT_OK" 213 then 214 exit$code 215 else 216 echo >&5 "FATAL: Unexpected exit with code$code" 217 exit 1 218 fi 219} 220 221GIT_EXIT_OK= 222trap 'die' EXIT 223 224# The semantics of the editor variables are that of invoking 225# sh -c "$EDITOR\"$@\"" files ... 226# 227# If our trash directory contains shell metacharacters, they will be 228# interpreted if we just set$EDITORdirectly, so do a little dance with 229# environment variables to work around this. 230# 231# In particular, quoting isn't enough, as the path may contain the same quote 232# that we're using. 233test_set_editor () { 234 FAKE_EDITOR="$1" 235export FAKE_EDITOR 236 EDITOR='"$FAKE_EDITOR"' 237export EDITOR 238} 239 240test_decode_color () { 241sed-e's/.\[1m/<WHITE>/g' \ 242-e's/.\[31m/<RED>/g' \ 243-e's/.\[32m/<GREEN>/g' \ 244-e's/.\[33m/<YELLOW>/g' \ 245-e's/.\[34m/<BLUE>/g' \ 246-e's/.\[35m/<MAGENTA>/g' \ 247-e's/.\[36m/<CYAN>/g' \ 248-e's/.\[m/<RESET>/g' 249} 250 251nul_to_q () { 252 perl -pe'y/\000/Q/' 253} 254 255q_to_nul () { 256 perl -pe'y/Q/\000/' 257} 258 259q_to_cr () { 260tr Q '\015' 261} 262 263q_to_tab () { 264tr Q '\011' 265} 266 267append_cr () { 268sed-e's/$/Q/'|tr Q '\015' 269} 270 271remove_cr () { 272tr'\015' Q |sed-e's/Q$//' 273} 274 275test_tick () { 276iftest -z"${test_tick+set}" 277then 278 test_tick=1112911993 279else 280 test_tick=$(($test_tick + 60)) 281fi 282 GIT_COMMITTER_DATE="$test_tick-0700" 283 GIT_AUTHOR_DATE="$test_tick-0700" 284export GIT_COMMITTER_DATE GIT_AUTHOR_DATE 285} 286 287# Call test_commit with the arguments "<message> [<file> [<contents>]]" 288# 289# This will commit a file with the given contents and the given commit 290# message. It will also add a tag with <message> as name. 291# 292# Both <file> and <contents> default to <message>. 293 294test_commit () { 295file=${2:-"$1.t"} 296echo"${3-$1}">"$file"&& 297 git add "$file"&& 298 test_tick && 299 git commit -m"$1"&& 300 git tag "$1" 301} 302 303# Call test_merge with the arguments "<message> <commit>", where <commit> 304# can be a tag pointing to the commit-to-merge. 305 306test_merge () { 307 test_tick && 308 git merge -m"$1""$2"&& 309 git tag "$1" 310} 311 312# This function helps systems where core.filemode=false is set. 313# Use it instead of plain 'chmod +x' to set or unset the executable bit 314# of a file in the working directory and add it to the index. 315 316test_chmod () { 317chmod"$@"&& 318 git update-index --add"--chmod=$@" 319} 320 321# Use test_set_prereq to tell that a particular prerequisite is available. 322# The prerequisite can later be checked for in two ways: 323# 324# - Explicitly using test_have_prereq. 325# 326# - Implicitly by specifying the prerequisite tag in the calls to 327# test_expect_{success,failure,code}. 328# 329# The single parameter is the prerequisite tag (a simple word, in all 330# capital letters by convention). 331 332test_set_prereq () { 333 satisfied="$satisfied$1" 334} 335satisfied=" " 336 337test_have_prereq () { 338# prerequisites can be concatenated with ',' 339 save_IFS=$IFS 340 IFS=, 341set -- $* 342 IFS=$save_IFS 343 344 total_prereq=0 345 ok_prereq=0 346 missing_prereq= 347 348for prerequisite 349do 350 total_prereq=$(($total_prereq + 1)) 351case$satisfiedin 352*"$prerequisite"*) 353 ok_prereq=$(($ok_prereq + 1)) 354;; 355*) 356# Keep a list of missing prerequisites 357iftest -z"$missing_prereq" 358then 359 missing_prereq=$prerequisite 360else 361 missing_prereq="$prerequisite,$missing_prereq" 362fi 363esac 364done 365 366test$total_prereq=$ok_prereq 367} 368 369test_declared_prereq () { 370case",$test_prereq,"in 371*,$1,*) 372return0 373;; 374esac 375return1 376} 377 378# You are not expected to call test_ok_ and test_failure_ directly, use 379# the text_expect_* functions instead. 380 381test_ok_ () { 382 test_success=$(($test_success + 1)) 383 say_color """ok$test_count- $@" 384} 385 386test_failure_ () { 387 test_failure=$(($test_failure + 1)) 388 say_color error "not ok -$test_count$1" 389shift 390echo"$@"|sed-e's/^/# /' 391test"$immediate"=""|| { GIT_EXIT_OK=t;exit1; } 392} 393 394test_known_broken_ok_ () { 395 test_fixed=$(($test_fixed+1)) 396 say_color """ok$test_count- $@ # TODO known breakage" 397} 398 399test_known_broken_failure_ () { 400 test_broken=$(($test_broken+1)) 401 say_color skip "not ok$test_count- $@ # TODO known breakage" 402} 403 404test_debug () { 405test"$debug"=""||eval"$1" 406} 407 408test_run_ () { 409 test_cleanup=: 410eval>&3 2>&4"$1" 411 eval_ret=$? 412eval>&3 2>&4"$test_cleanup" 413iftest"$verbose"="t"&&test -n"$HARNESS_ACTIVE";then 414echo"" 415fi 416return0 417} 418 419test_skip () { 420 test_count=$(($test_count+1)) 421 to_skip= 422for skp in$GIT_SKIP_TESTS 423do 424case$this_test.$test_countin 425$skp) 426 to_skip=t 427break 428esac 429done 430iftest -z"$to_skip"&&test -n"$test_prereq"&& 431! test_have_prereq "$test_prereq" 432then 433 to_skip=t 434fi 435case"$to_skip"in 436 t) 437 of_prereq= 438iftest"$missing_prereq"!="$test_prereq" 439then 440 of_prereq=" of$test_prereq" 441fi 442 443 say_color skip >&3"skipping test: $@" 444 say_color skip "ok$test_count# skip$1(missing$missing_prereq${of_prereq})" 445: true 446;; 447*) 448 false 449;; 450esac 451} 452 453test_expect_failure () { 454test"$#"=3&& { test_prereq=$1;shift; } || test_prereq= 455test"$#"=2|| 456 error "bug in the test script: not 2 or 3 parameters to test-expect-failure" 457export test_prereq 458if! test_skip "$@" 459then 460 say >&3"checking known breakage:$2" 461 test_run_ "$2" 462if["$?"=0-a"$eval_ret"=0] 463then 464 test_known_broken_ok_ "$1" 465else 466 test_known_broken_failure_ "$1" 467fi 468fi 469echo>&3"" 470} 471 472test_expect_success () { 473test"$#"=3&& { test_prereq=$1;shift; } || test_prereq= 474test"$#"=2|| 475 error "bug in the test script: not 2 or 3 parameters to test-expect-success" 476export test_prereq 477if! test_skip "$@" 478then 479 say >&3"expecting success:$2" 480 test_run_ "$2" 481if["$?"=0-a"$eval_ret"=0] 482then 483 test_ok_ "$1" 484else 485 test_failure_ "$@" 486fi 487fi 488echo>&3"" 489} 490 491test_expect_code () { 492test"$#"=4&& { prereq=$1;shift; } || prereq= 493test"$#"=3|| 494 error "bug in the test script: not 3 or 4 parameters to test-expect-code" 495if! test_skip "$@" 496then 497 say >&3"expecting exit code$1:$3" 498 test_run_ "$3" 499if["$?"=0-a"$eval_ret"="$1"] 500then 501 test_ok_ "$2" 502else 503 test_failure_ "$@" 504fi 505fi 506echo>&3"" 507} 508 509# test_external runs external test scripts that provide continuous 510# test output about their progress, and succeeds/fails on 511# zero/non-zero exit code. It outputs the test output on stdout even 512# in non-verbose mode, and announces the external script with "# run 513# <n>: ..." before running it. When providing relative paths, keep in 514# mind that all scripts run in "trash directory". 515# Usage: test_external description command arguments... 516# Example: test_external 'Perl API' perl ../path/to/test.pl 517test_external () { 518test"$#"=4&& { test_prereq=$1;shift; } || test_prereq= 519test"$#"=3|| 520 error >&5"bug in the test script: not 3 or 4 parameters to test_external" 521 descr="$1" 522shift 523export test_prereq 524if! test_skip "$descr""$@" 525then 526# Announce the script to reduce confusion about the 527# test output that follows. 528 say_color """# run$test_count:$descr($*)" 529# Export TEST_DIRECTORY, TRASH_DIRECTORY and GIT_TEST_LONG 530# to be able to use them in script 531export TEST_DIRECTORY TRASH_DIRECTORY GIT_TEST_LONG 532# Run command; redirect its stderr to &4 as in 533# test_run_, but keep its stdout on our stdout even in 534# non-verbose mode. 535"$@"2>&4 536if["$?"=0] 537then 538iftest$test_external_has_tap-eq0;then 539 test_ok_ "$descr" 540else 541 say_color """# test_external test$descrwas ok" 542 test_success=$(($test_success + 1)) 543fi 544else 545iftest$test_external_has_tap-eq0;then 546 test_failure_ "$descr""$@" 547else 548 say_color error "# test_external test$descrfailed: $@" 549 test_failure=$(($test_failure + 1)) 550fi 551fi 552fi 553} 554 555# Like test_external, but in addition tests that the command generated 556# no output on stderr. 557test_external_without_stderr () { 558# The temporary file has no (and must have no) security 559# implications. 560 tmp="$TMPDIR";if[-z"$tmp"];then tmp=/tmp;fi 561 stderr="$tmp/git-external-stderr.$$.tmp" 562 test_external "$@"4>"$stderr" 563[-f"$stderr"] || error "Internal error:$stderrdisappeared." 564 descr="no stderr:$1" 565shift 566 say >&3"# expecting no stderr from previous command" 567if[ !-s"$stderr"];then 568rm"$stderr" 569 570iftest$test_external_has_tap-eq0;then 571 test_ok_ "$descr" 572else 573 say_color """# test_external_without_stderr test$descrwas ok" 574 test_success=$(($test_success + 1)) 575fi 576else 577if["$verbose"= t ];then 578 output=`echo; echo "# Stderr is:"; cat "$stderr"` 579else 580 output= 581fi 582# rm first in case test_failure exits. 583rm"$stderr" 584iftest$test_external_has_tap-eq0;then 585 test_failure_ "$descr""$@""$output" 586else 587 say_color error "# test_external_without_stderr test$descrfailed: $@:$output" 588 test_failure=$(($test_failure + 1)) 589fi 590fi 591} 592 593# debugging-friendly alternatives to "test [-f|-d|-e]" 594# The commands test the existence or non-existence of $1. $2 can be 595# given to provide a more precise diagnosis. 596test_path_is_file () { 597if! [-f"$1"] 598then 599echo"File$1doesn't exist. $*" 600 false 601fi 602} 603 604test_path_is_dir () { 605if! [-d"$1"] 606then 607echo"Directory$1doesn't exist. $*" 608 false 609fi 610} 611 612test_path_is_missing () { 613if[-e"$1"] 614then 615echo"Path exists:" 616ls-ld"$1" 617if[$#-ge1];then 618echo"$*" 619fi 620 false 621fi 622} 623 624 625# This is not among top-level (test_expect_success | test_expect_failure) 626# but is a prefix that can be used in the test script, like: 627# 628# test_expect_success 'complain and die' ' 629# do something && 630# do something else && 631# test_must_fail git checkout ../outerspace 632# ' 633# 634# Writing this as "! git checkout ../outerspace" is wrong, because 635# the failure could be due to a segv. We want a controlled failure. 636 637test_must_fail () { 638"$@" 639 exit_code=$? 640iftest$exit_code=0;then 641echo>&2"test_must_fail: command succeeded: $*" 642return1 643eliftest$exit_code-gt129-a$exit_code-le192;then 644echo>&2"test_must_fail: died by signal: $*" 645return1 646eliftest$exit_code=127;then 647echo>&2"test_must_fail: command not found: $*" 648return1 649fi 650return0 651} 652 653# Similar to test_must_fail, but tolerates success, too. This is 654# meant to be used in contexts like: 655# 656# test_expect_success 'some command works without configuration' ' 657# test_might_fail git config --unset all.configuration && 658# do something 659# ' 660# 661# Writing "git config --unset all.configuration || :" would be wrong, 662# because we want to notice if it fails due to segv. 663 664test_might_fail () { 665"$@" 666 exit_code=$? 667iftest$exit_code-gt129-a$exit_code-le192;then 668echo>&2"test_might_fail: died by signal: $*" 669return1 670eliftest$exit_code=127;then 671echo>&2"test_might_fail: command not found: $*" 672return1 673fi 674return0 675} 676 677# test_cmp is a helper function to compare actual and expected output. 678# You can use it like: 679# 680# test_expect_success 'foo works' ' 681# echo expected >expected && 682# foo >actual && 683# test_cmp expected actual 684# ' 685# 686# This could be written as either "cmp" or "diff -u", but: 687# - cmp's output is not nearly as easy to read as diff -u 688# - not all diff versions understand "-u" 689 690test_cmp() { 691$GIT_TEST_CMP"$@" 692} 693 694# This function can be used to schedule some commands to be run 695# unconditionally at the end of the test to restore sanity: 696# 697# test_expect_success 'test core.capslock' ' 698# git config core.capslock true && 699# test_when_finished "git config --unset core.capslock" && 700# hello world 701# ' 702# 703# That would be roughly equivalent to 704# 705# test_expect_success 'test core.capslock' ' 706# git config core.capslock true && 707# hello world 708# git config --unset core.capslock 709# ' 710# 711# except that the greeting and config --unset must both succeed for 712# the test to pass. 713 714test_when_finished () { 715 test_cleanup="{ $* 716 } && (exit\"\$eval_ret\"); eval_ret=\$?;$test_cleanup" 717} 718 719# Most tests can use the created repository, but some may need to create more. 720# Usage: test_create_repo <directory> 721test_create_repo () { 722test"$#"=1|| 723 error "bug in the test script: not 1 parameter to test-create-repo" 724 repo="$1" 725mkdir-p"$repo" 726( 727cd"$repo"|| error "Cannot setup test environment" 728"$GIT_EXEC_PATH/git-init""--template=$GIT_BUILD_DIR/templates/blt/">&3 2>&4|| 729 error "cannot run git init -- have you built things yet?" 730mv .git/hooks .git/hooks-disabled 731) ||exit 732} 733 734test_done () { 735 GIT_EXIT_OK=t 736 737iftest -z"$HARNESS_ACTIVE";then 738 test_results_dir="$TEST_DIRECTORY/test-results" 739mkdir-p"$test_results_dir" 740 test_results_path="$test_results_dir/${0%.sh}-$$.counts" 741 742echo"total$test_count">>$test_results_path 743echo"success$test_success">>$test_results_path 744echo"fixed$test_fixed">>$test_results_path 745echo"broken$test_broken">>$test_results_path 746echo"failed$test_failure">>$test_results_path 747echo"">>$test_results_path 748fi 749 750iftest"$test_fixed"!=0 751then 752 say_color pass "# fixed$test_fixedknown breakage(s)" 753fi 754iftest"$test_broken"!=0 755then 756 say_color error "# still have$test_brokenknown breakage(s)" 757 msg="remaining$(($test_count-$test_broken)) test(s)" 758else 759 msg="$test_counttest(s)" 760fi 761case"$test_failure"in 7620) 763# Maybe print SKIP message 764[-z"$skip_all"] || skip_all=" # SKIP$skip_all" 765 766iftest$test_external_has_tap-eq0;then 767 say_color pass "# passed all$msg" 768 say "1..$test_count$skip_all" 769fi 770 771test -d"$remove_trash"&& 772cd"$(dirname "$remove_trash")"&& 773rm-rf"$(basename "$remove_trash")" 774 775exit0;; 776 777*) 778iftest$test_external_has_tap-eq0;then 779 say_color error "# failed$test_failureamong$msg" 780 say "1..$test_count" 781fi 782 783exit1;; 784 785esac 786} 787 788# Test the binaries we have just built. The tests are kept in 789# t/ subdirectory and are run in 'trash directory' subdirectory. 790iftest -z"$TEST_DIRECTORY" 791then 792# We allow tests to override this, in case they want to run tests 793# outside of t/, e.g. for running tests on the test library 794# itself. 795 TEST_DIRECTORY=$(pwd) 796fi 797GIT_BUILD_DIR="$TEST_DIRECTORY"/.. 798 799iftest -n"$valgrind" 800then 801 make_symlink () { 802test -h"$2"&& 803test"$1"="$(readlink "$2")"|| { 804# be super paranoid 805ifmkdir"$2".lock 806then 807rm-f"$2"&& 808ln-s"$1""$2"&& 809rm-r"$2".lock 810else 811whiletest -d"$2".lock 812do 813 say "Waiting for lock on$2." 814sleep1 815done 816fi 817} 818} 819 820 make_valgrind_symlink () { 821# handle only executables 822test -x"$1"||return 823 824 base=$(basename "$1") 825 symlink_target=$GIT_BUILD_DIR/$base 826# do not override scripts 827iftest -x"$symlink_target"&& 828test!-d"$symlink_target"&& 829test"#!"!="$(head -c 2 < "$symlink_target")" 830then 831 symlink_target=../valgrind.sh 832fi 833case"$base"in 834*.sh|*.perl) 835 symlink_target=../unprocessed-script 836esac 837# create the link, or replace it if it is out of date 838 make_symlink "$symlink_target""$GIT_VALGRIND/bin/$base"||exit 839} 840 841# override all git executables in TEST_DIRECTORY/.. 842 GIT_VALGRIND=$TEST_DIRECTORY/valgrind 843mkdir-p"$GIT_VALGRIND"/bin 844forfilein$GIT_BUILD_DIR/git*$GIT_BUILD_DIR/test-* 845do 846 make_valgrind_symlink $file 847done 848 OLDIFS=$IFS 849 IFS=: 850for path in$PATH 851do 852ls"$path"/git-*2> /dev/null | 853whilereadfile 854do 855 make_valgrind_symlink "$file" 856done 857done 858 IFS=$OLDIFS 859 PATH=$GIT_VALGRIND/bin:$PATH 860 GIT_EXEC_PATH=$GIT_VALGRIND/bin 861export GIT_VALGRIND 862eliftest -n"$GIT_TEST_INSTALLED";then 863 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path)|| 864 error "Cannot run git from$GIT_TEST_INSTALLED." 865 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH 866 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} 867else# normal case, use ../bin-wrappers only unless $with_dashes: 868 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" 869if!test -x"$git_bin_dir/git";then 870iftest -z"$with_dashes";then 871 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" 872fi 873 with_dashes=t 874fi 875 PATH="$git_bin_dir:$PATH" 876 GIT_EXEC_PATH=$GIT_BUILD_DIR 877iftest -n"$with_dashes";then 878 PATH="$GIT_BUILD_DIR:$PATH" 879fi 880fi 881GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt 882unset GIT_CONFIG 883GIT_CONFIG_NOSYSTEM=1 884GIT_CONFIG_NOGLOBAL=1 885export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_CONFIG_NOGLOBAL 886 887. "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS 888 889iftest -z"$GIT_TEST_CMP" 890then 891iftest -n"$GIT_TEST_CMP_USE_COPIED_CONTEXT" 892then 893 GIT_TEST_CMP="$DIFF-c" 894else 895 GIT_TEST_CMP="$DIFF-u" 896fi 897fi 898 899GITPERLLIB="$GIT_BUILD_DIR"/perl/blib/lib:"$GIT_BUILD_DIR"/perl/blib/arch/auto/Git 900export GITPERLLIB 901test -d"$GIT_BUILD_DIR"/templates/blt || { 902 error "You haven't built things yet, have you?" 903} 904 905iftest -z"$GIT_TEST_INSTALLED"&&test -z"$NO_PYTHON" 906then 907 GITPYTHONLIB="$GIT_BUILD_DIR/git_remote_helpers/build/lib" 908export GITPYTHONLIB 909test -d"$GIT_BUILD_DIR"/git_remote_helpers/build || { 910 error "You haven't built git_remote_helpers yet, have you?" 911} 912fi 913 914if!test -x"$GIT_BUILD_DIR"/test-chmtime;then 915echo>&2'You need to build test-chmtime:' 916echo>&2'Run "make test-chmtime" in the source (toplevel) directory' 917exit1 918fi 919 920# Test repository 921test="trash directory.$(basename "$0" .sh)" 922test -n"$root"&&test="$root/$test" 923case"$test"in 924/*) TRASH_DIRECTORY="$test";; 925*) TRASH_DIRECTORY="$TEST_DIRECTORY/$test";; 926esac 927test!-z"$debug"|| remove_trash=$TRASH_DIRECTORY 928rm-fr"$test"|| { 929 GIT_EXIT_OK=t 930echo>&5"FATAL: Cannot prepare test area" 931exit1 932} 933 934test_create_repo "$test" 935# Use -P to resolve symlinks in our working directory so that the cwd 936# in subprocesses like git equals our $PWD (for pathname comparisons). 937cd -P"$test"||exit1 938 939HOME=$(pwd) 940export HOME 941 942this_test=${0##*/} 943this_test=${this_test%%-*} 944for skp in$GIT_SKIP_TESTS 945do 946case"$this_test"in 947$skp) 948 say_color skip >&3"skipping test$this_testaltogether" 949 skip_all="skip all tests in$this_test" 950 test_done 951esac 952done 953 954# Provide an implementation of the 'yes' utility 955yes() { 956iftest$#=0 957then 958 y=y 959else 960 y="$*" 961fi 962 963whileecho"$y" 964do 965: 966done 967} 968 969# Fix some commands on Windows 970case$(uname -s)in 971*MINGW*) 972# Windows has its own (incompatible) sort and find 973sort() { 974/usr/bin/sort"$@" 975} 976find() { 977/usr/bin/find"$@" 978} 979sum() { 980md5sum"$@" 981} 982# git sees Windows-style pwd 983pwd() { 984builtin pwd -W 985} 986# no POSIX permissions 987# backslashes in pathspec are converted to '/' 988# exec does not inherit the PID 989 test_set_prereq MINGW 990;; 991*) 992 test_set_prereq POSIXPERM 993 test_set_prereq BSLASHPSPEC 994 test_set_prereq EXECKEEPSPID 995 test_set_prereq NOT_MINGW 996;; 997esac 998 999test -z"$NO_PERL"&& test_set_prereq PERL1000test -z"$NO_PYTHON"&& test_set_prereq PYTHON10011002# test whether the filesystem supports symbolic links1003ln-s x y 2>/dev/null &&test -h y 2>/dev/null && test_set_prereq SYMLINKS1004rm-f y10051006# When the tests are run as root, permission tests will report that1007# things are writable when they shouldn't be.1008test -w/ || test_set_prereq SANITY