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