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# Keep the original TERM for say_color 19ORIGINAL_TERM=$TERM 20 21# Test the binaries we have just built. The tests are kept in 22# t/ subdirectory and are run in 'trash directory' subdirectory. 23iftest -z"$TEST_DIRECTORY" 24then 25# We allow tests to override this, in case they want to run tests 26# outside of t/, e.g. for running tests on the test library 27# itself. 28 TEST_DIRECTORY=$(pwd) 29fi 30iftest -z"$TEST_OUTPUT_DIRECTORY" 31then 32# Similarly, override this to store the test-results subdir 33# elsewhere 34 TEST_OUTPUT_DIRECTORY=$TEST_DIRECTORY 35fi 36GIT_BUILD_DIR="$TEST_DIRECTORY"/.. 37 38################################################################ 39# It appears that people try to run tests without building... 40"$GIT_BUILD_DIR/git">/dev/null 41iftest $? !=1 42then 43echo>&2'error: you do not seem to have built git yet.' 44exit1 45fi 46 47. "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS 48export PERL_PATH SHELL_PATH 49 50# if --tee was passed, write the output not only to the terminal, but 51# additionally to the file test-results/$BASENAME.out, too. 52case"$GIT_TEST_TEE_STARTED, $* "in 53done,*) 54# do not redirect again 55;; 56*' --tee '*|*' --va'*) 57mkdir-p"$TEST_OUTPUT_DIRECTORY/test-results" 58 BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)" 59(GIT_TEST_TEE_STARTED=done${SHELL_PATH}"$0""$@"2>&1; 60echo $? >$BASE.exit) |tee$BASE.out 61test"$(cat$BASE.exit)"=0 62exit 63;; 64esac 65 66# For repeatability, reset the environment to known value. 67LANG=C 68LC_ALL=C 69PAGER=cat 70TZ=UTC 71TERM=dumb 72export LANG LC_ALL PAGER TERM TZ 73EDITOR=: 74# A call to "unset" with no arguments causes at least Solaris 10 75# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets 76# deriving from the command substitution clustered with the other 77# ones. 78unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH"-e' 79 my @env = keys %ENV; 80 my$ok= join("|", qw( 81 TRACE 82 DEBUG 83 USE_LOOKUP 84 TEST 85 .*_TEST 86 PROVE 87 VALGRIND 88 UNZIP 89 PERF_ 90 )); 91 my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env); 92 print join("\n", @vars); 93') 94unset XDG_CONFIG_HOME 95unset GITPERLLIB 96GIT_AUTHOR_EMAIL=author@example.com 97GIT_AUTHOR_NAME='A U Thor' 98GIT_COMMITTER_EMAIL=committer@example.com 99GIT_COMMITTER_NAME='C O Mitter' 100GIT_MERGE_VERBOSITY=5 101GIT_MERGE_AUTOEDIT=no 102export GIT_MERGE_VERBOSITY GIT_MERGE_AUTOEDIT 103export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME 104export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME 105export EDITOR 106 107# Add libc MALLOC and MALLOC_PERTURB test 108# only if we are not executing the test with valgrind 109ifexpr"$GIT_TEST_OPTS":".* --valgrind ">/dev/null || 110test -n"$TEST_NO_MALLOC_CHECK" 111then 112 setup_malloc_check () { 113: nothing 114} 115 teardown_malloc_check () { 116: nothing 117} 118else 119 setup_malloc_check () { 120 MALLOC_CHECK_=3 MALLOC_PERTURB_=165 121export MALLOC_CHECK_ MALLOC_PERTURB_ 122} 123 teardown_malloc_check () { 124unset MALLOC_CHECK_ MALLOC_PERTURB_ 125} 126fi 127 128# Protect ourselves from common misconfiguration to export 129# CDPATH into the environment 130unset CDPATH 131 132unset GREP_OPTIONS 133unset UNZIP 134 135case $(echo$GIT_TRACE|tr"[A-Z]""[a-z]")in 1361|2|true) 137echo"* warning: Some tests will not work if GIT_TRACE" \ 138"is set as to trace on STDERR ! *" 139echo"* warning: Please set GIT_TRACE to something" \ 140"other than 1, 2 or true ! *" 141;; 142esac 143 144# Convenience 145# 146# A regexp to match 5 and 40 hexdigits 147_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' 148_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05" 149 150# Zero SHA-1 151_z40=0000000000000000000000000000000000000000 152 153# Line feed 154LF=' 155' 156 157export _x05 _x40 _z40 LF 158 159# Each test should start with something like this, after copyright notices: 160# 161# test_description='Description of this test... 162# This test checks if command xyzzy does the right thing... 163# ' 164# . ./test-lib.sh 165["x$ORIGINAL_TERM"!="xdumb"] && ( 166 TERM=$ORIGINAL_TERM&& 167export TERM && 168[-t1] && 169tput bold >/dev/null 2>&1&& 170tput setaf 1>/dev/null 2>&1&& 171tput sgr0 >/dev/null 2>&1 172) && 173 color=t 174 175whiletest"$#"-ne0 176do 177case"$1"in 178-d|--d|--de|--deb|--debu|--debug) 179 debug=t;shift;; 180-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) 181 immediate=t;shift;; 182-l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests) 183 GIT_TEST_LONG=t;export GIT_TEST_LONG;shift;; 184-h|--h|--he|--hel|--help) 185help=t;shift;; 186-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) 187 verbose=t;shift;; 188--verbose-only=*) 189 verbose_only=$(expr"z$1":'z[^=]*=\(.*\)') 190shift;; 191-q|--q|--qu|--qui|--quie|--quiet) 192# Ignore --quiet under a TAP::Harness. Saying how many tests 193# passed without the ok/not ok details is always an error. 194test -z"$HARNESS_ACTIVE"&& quiet=t;shift;; 195--with-dashes) 196 with_dashes=t;shift;; 197--no-color) 198 color=;shift;; 199--va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind) 200 valgrind=memcheck 201shift;; 202--valgrind=*) 203 valgrind=$(expr"z$1":'z[^=]*=\(.*\)') 204shift;; 205--valgrind-only=*) 206 valgrind_only=$(expr"z$1":'z[^=]*=\(.*\)') 207shift;; 208--valgrind-parallel=*) 209 valgrind_parallel=$(expr"z$1":'z[^=]*=\(.*\)') 210shift;; 211--valgrind-only-stride=*) 212 valgrind_only_stride=$(expr"z$1":'z[^=]*=\(.*\)') 213shift;; 214--valgrind-only-offset=*) 215 valgrind_only_offset=$(expr"z$1":'z[^=]*=\(.*\)') 216shift;; 217--tee) 218shift;;# was handled already 219--root=*) 220 root=$(expr"z$1":'z[^=]*=\(.*\)') 221shift;; 222--statusprefix=*) 223 statusprefix=$(expr"z$1":'z[^=]*=\(.*\)') 224shift;; 225*) 226echo"error: unknown test option '$1'">&2;exit1;; 227esac 228done 229 230iftest -n"$valgrind_only"||test -n"$valgrind_only_stride" 231then 232test -z"$valgrind"&& valgrind=memcheck 233test -z"$verbose"&& verbose_only="$valgrind_only" 234eliftest -n"$valgrind" 235then 236 verbose=t 237fi 238 239iftest -n"$color" 240then 241 say_color () { 242( 243 TERM=$ORIGINAL_TERM 244export TERM 245case"$1"in 246 error) 247tput bold;tput setaf 1;;# bold red 248 skip) 249tput setaf 4;;# blue 250 warn) 251tput setaf 3;;# brown/yellow 252 pass) 253tput setaf 2;;# green 254 info) 255tput setaf 6;;# cyan 256*) 257test -n"$quiet"&&return;; 258esac 259shift 260printf"%s""$*" 261tput sgr0 262echo 263) 264} 265else 266 say_color() { 267test -z"$1"&&test -n"$quiet"&&return 268shift 269printf"%s\n""$*" 270} 271fi 272 273error () { 274 say_color error "error: $*" 275 GIT_EXIT_OK=t 276exit1 277} 278 279say () { 280 say_color info "$*" 281} 282 283test"${test_description}"!=""|| 284error "Test script did not set test_description." 285 286iftest"$help"="t" 287then 288echo"$test_description" 289exit0 290fi 291 292exec5>&1 293exec6<&0 294iftest"$verbose"="t" 295then 296exec4>&2 3>&1 297else 298exec4>/dev/null 3>/dev/null 299fi 300 301test_failure=0 302test_count=0 303test_fixed=0 304test_broken=0 305test_success=0 306 307test_external_has_tap=0 308 309die () { 310 code=$? 311iftest -n"$GIT_EXIT_OK" 312then 313exit$code 314else 315echo>&5"FATAL: Unexpected exit with code$code" 316exit1 317fi 318} 319 320GIT_EXIT_OK= 321trap'die' EXIT 322 323# The user-facing functions are loaded from a separate file so that 324# test_perf subshells can have them too 325. "$TEST_DIRECTORY/test-lib-functions.sh" 326 327# You are not expected to call test_ok_ and test_failure_ directly, use 328# the text_expect_* functions instead. 329 330test_ok_ () { 331 test_success=$(($test_success+1)) 332 say_color """${statusprefix}ok$test_count- $@" 333} 334 335test_failure_ () { 336 test_failure=$(($test_failure+1)) 337 say_color error "${statusprefix}not ok$test_count-$1" 338shift 339echo"$@"|sed-e's/^/# /' 340test"$immediate"=""|| { GIT_EXIT_OK=t;exit1; } 341} 342 343test_known_broken_ok_ () { 344 test_fixed=$(($test_fixed+1)) 345 say_color error "${statusprefix}ok$test_count- $@ # TODO known breakage vanished" 346} 347 348test_known_broken_failure_ () { 349 test_broken=$(($test_broken+1)) 350 say_color warn "${statusprefix}not ok$test_count- $@ # TODO known breakage" 351} 352 353test_debug () { 354test"$debug"=""||eval"$1" 355} 356 357match_pattern_list () { 358 arg="$1" 359shift 360test -z"$*"&&return1 361for pattern_ 362do 363case"$arg"in 364$pattern_) 365return0 366esac 367done 368return1 369} 370 371maybe_teardown_verbose () { 372test -z"$verbose_only"&&return 373exec4>/dev/null 3>/dev/null 374 verbose= 375} 376 377last_verbose=t 378maybe_setup_verbose () { 379test -z"$verbose_only"&&return 380if match_pattern_list $test_count $verbose_only|| 381{test -n"$valgrind_only_stride"&& 382expr$test_count"%"$valgrind_only_stride-$valgrind_only_offset=0>/dev/null; } 383then 384exec4>&2 3>&1 385# Emit a delimiting blank line when going from 386# non-verbose to verbose. Within verbose mode the 387# delimiter is printed by test_expect_*. The choice 388# of the initial $last_verbose is such that before 389# test 1, we do not print it. 390test -z"$last_verbose"&&echo>&3"" 391 verbose=t 392else 393exec4>/dev/null 3>/dev/null 394 verbose= 395fi 396 last_verbose=$verbose 397} 398 399maybe_teardown_valgrind () { 400test -z"$GIT_VALGRIND"&&return 401 GIT_VALGRIND_ENABLED= 402} 403 404maybe_setup_valgrind () { 405test -z"$GIT_VALGRIND"&&return 406iftest -z"$valgrind_only"&&test -z"$valgrind_only_stride" 407then 408 GIT_VALGRIND_ENABLED=t 409return 410fi 411 GIT_VALGRIND_ENABLED= 412if match_pattern_list $test_count $valgrind_only 413then 414 GIT_VALGRIND_ENABLED=t 415eliftest -n"$valgrind_only_stride"&& 416expr$test_count"%"$valgrind_only_stride-$valgrind_only_offset=0>/dev/null 417then 418 GIT_VALGRIND_ENABLED=t 419fi 420} 421 422test_eval_ () { 423# This is a separate function because some tests use 424# "return" to end a test_expect_success block early. 425eval</dev/null >&3 2>&4"$*" 426} 427 428test_run_ () { 429 test_cleanup=: 430 expecting_failure=$2 431 setup_malloc_check 432 test_eval_ "$1" 433 eval_ret=$? 434 teardown_malloc_check 435 436iftest -z"$immediate"||test$eval_ret=0||test -n"$expecting_failure" 437then 438 setup_malloc_check 439 test_eval_ "$test_cleanup" 440 teardown_malloc_check 441fi 442iftest"$verbose"="t"&&test -n"$HARNESS_ACTIVE" 443then 444echo"" 445fi 446return"$eval_ret" 447} 448 449test_start_ () { 450 test_count=$(($test_count+1)) 451 maybe_setup_verbose 452 maybe_setup_valgrind 453} 454 455test_finish_ () { 456echo>&3"" 457 maybe_teardown_valgrind 458 maybe_teardown_verbose 459} 460 461test_skip () { 462 to_skip= 463if match_pattern_list $this_test.$test_count $GIT_SKIP_TESTS 464then 465 to_skip=t 466fi 467iftest -z"$to_skip"&&test -n"$test_prereq"&& 468! test_have_prereq "$test_prereq" 469then 470 to_skip=t 471fi 472case"$to_skip"in 473 t) 474 of_prereq= 475iftest"$missing_prereq"!="$test_prereq" 476then 477 of_prereq=" of$test_prereq" 478fi 479 480 say_color skip >&3"${statusprefix}skipping test: $@" 481 say_color skip "${statusprefix}ok$test_count# skip$1(missing$missing_prereq${of_prereq})" 482: true 483;; 484*) 485 false 486;; 487esac 488} 489 490# stub; perf-lib overrides it 491test_at_end_hook_ () { 492: 493} 494 495test_done () { 496 GIT_EXIT_OK=t 497 498# Note: t0000 relies on $HARNESS_ACTIVE disabling the .counts 499# output file 500iftest -z"$HARNESS_ACTIVE" 501then 502 test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" 503mkdir-p"$test_results_dir" 504 base=${0##*/} 505 test_results_path="$test_results_dir/${base%.sh}-$$.counts" 506 507cat>>"$test_results_path"<<-EOF 508 total$test_count 509 success$test_success 510 fixed$test_fixed 511 broken$test_broken 512 failed$test_failure 513 514 EOF 515fi 516 517iftest"$test_fixed"!=0 518then 519 say_color error "${statusprefix}#$test_fixedknown breakage(s) vanished; please update test(s)" 520fi 521iftest"$test_broken"!=0 522then 523 say_color warn "${statusprefix}# still have$test_brokenknown breakage(s)" 524fi 525iftest"$test_broken"!=0||test"$test_fixed"!=0 526then 527 test_remaining=$(($test_count-$test_broken-$test_fixed)) 528 msg="remaining$test_remainingtest(s)" 529else 530 test_remaining=$test_count 531 msg="$test_counttest(s)" 532fi 533case"$test_failure"in 5340) 535# Maybe print SKIP message 536iftest -n"$skip_all"&&test$test_count-gt0 537then 538 error "Can't use skip_all after running some tests" 539fi 540[-z"$skip_all"] || skip_all=" # SKIP$skip_all" 541 542iftest$test_external_has_tap-eq0 543then 544iftest$test_remaining-gt0 545then 546 say_color pass "${statusprefix}# passed all$msg" 547fi 548 say "${statusprefix}1..$test_count$skip_all" 549fi 550 551test -d"$remove_trash"&& 552cd"$(dirname "$remove_trash")"&& 553rm-rf"$(basename "$remove_trash")" 554 555 test_at_end_hook_ 556 557exit0;; 558 559*) 560iftest$test_external_has_tap-eq0 561then 562 say_color error "${statusprefix}# failed$test_failureamong$msg" 563 say "${statusprefix}1..$test_count" 564fi 565 566exit1;; 567 568esac 569} 570 571 572# Set up a directory that we can put in PATH which redirects all git 573# calls to 'valgrind git ...'. 574iftest -n"$valgrind" 575then 576 make_symlink () { 577test -h"$2"&& 578test"$1"="$(readlink "$2")"|| { 579# be super paranoid 580ifmkdir"$2".lock 581then 582rm-f"$2"&& 583ln-s"$1""$2"&& 584rm-r"$2".lock 585else 586whiletest -d"$2".lock 587do 588 say "Waiting for lock on$2." 589sleep1 590done 591fi 592} 593} 594 595 make_valgrind_symlink () { 596# handle only executables, unless they are shell libraries that 597# need to be in the exec-path. We will just use "#!" as a 598# guess for a shell-script, since we have no idea what the user 599# may have configured as the shell path. 600test -x"$1"|| 601test"#!"="$(head -c 2 <"$1")"|| 602return; 603 604 base=$(basename"$1") 605 symlink_target=$GIT_BUILD_DIR/$base 606# do not override scripts 607iftest -x"$symlink_target"&& 608test!-d"$symlink_target"&& 609test"#!"!="$(head -c 2 < "$symlink_target")" 610then 611 symlink_target=../valgrind.sh 612fi 613case"$base"in 614*.sh|*.perl) 615 symlink_target=../unprocessed-script 616esac 617# create the link, or replace it if it is out of date 618 make_symlink "$symlink_target""$GIT_VALGRIND/bin/$base"||exit 619} 620 621# In the case of --valgrind-parallel, we only need to do the 622# wrapping once, in the main script. The worker children all 623# have $valgrind_only_stride set, so we can skip based on that. 624iftest -z"$valgrind_only_stride" 625then 626# override all git executables in TEST_DIRECTORY/.. 627 GIT_VALGRIND=$TEST_DIRECTORY/valgrind 628mkdir-p"$GIT_VALGRIND"/bin 629forfilein$GIT_BUILD_DIR/git*$GIT_BUILD_DIR/test-* 630do 631 make_valgrind_symlink $file 632done 633# special-case the mergetools loadables 634 make_symlink "$GIT_BUILD_DIR"/mergetools "$GIT_VALGRIND/bin/mergetools" 635 OLDIFS=$IFS 636 IFS=: 637for path in$PATH 638do 639ls"$path"/git-*2> /dev/null | 640whilereadfile 641do 642 make_valgrind_symlink "$file" 643done 644done 645 IFS=$OLDIFS 646fi 647 PATH=$GIT_VALGRIND/bin:$PATH 648 GIT_EXEC_PATH=$GIT_VALGRIND/bin 649export GIT_VALGRIND 650 GIT_VALGRIND_MODE="$valgrind" 651export GIT_VALGRIND_MODE 652 GIT_VALGRIND_ENABLED=t 653iftest -n"$valgrind_only"||test -n"$valgrind_only_stride" 654then 655 GIT_VALGRIND_ENABLED= 656fi 657export GIT_VALGRIND_ENABLED 658eliftest -n"$GIT_TEST_INSTALLED" 659then 660 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) || 661 error "Cannot run git from$GIT_TEST_INSTALLED." 662 PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH 663 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} 664else# normal case, use ../bin-wrappers only unless $with_dashes: 665 git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" 666if!test -x"$git_bin_dir/git" 667then 668iftest -z"$with_dashes" 669then 670 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" 671fi 672 with_dashes=t 673fi 674 PATH="$git_bin_dir:$PATH" 675 GIT_EXEC_PATH=$GIT_BUILD_DIR 676iftest -n"$with_dashes" 677then 678 PATH="$GIT_BUILD_DIR:$PATH" 679fi 680fi 681GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt 682unset GIT_CONFIG 683GIT_CONFIG_NOSYSTEM=1 684GIT_ATTR_NOSYSTEM=1 685export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM 686 687iftest -z"$GIT_TEST_CMP" 688then 689iftest -n"$GIT_TEST_CMP_USE_COPIED_CONTEXT" 690then 691 GIT_TEST_CMP="$DIFF-c" 692else 693 GIT_TEST_CMP="$DIFF-u" 694fi 695fi 696 697GITPERLLIB="$GIT_BUILD_DIR"/perl/blib/lib:"$GIT_BUILD_DIR"/perl/blib/arch/auto/Git 698export GITPERLLIB 699test -d"$GIT_BUILD_DIR"/templates/blt || { 700 error "You haven't built things yet, have you?" 701} 702 703if!test -x"$GIT_BUILD_DIR"/test-chmtime 704then 705echo>&2'You need to build test-chmtime:' 706echo>&2'Run "make test-chmtime" in the source (toplevel) directory' 707exit1 708fi 709 710# Test repository 711TRASH_DIRECTORY="trash directory.$(basename "$0" .sh)" 712test -n"$root"&& TRASH_DIRECTORY="$root/$TRASH_DIRECTORY" 713case"$TRASH_DIRECTORY"in 714/*) ;;# absolute path is good 715*) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY";; 716esac 717test!-z"$debug"|| remove_trash=$TRASH_DIRECTORY 718rm-fr"$TRASH_DIRECTORY"|| { 719 GIT_EXIT_OK=t 720echo>&5"FATAL: Cannot prepare test area" 721exit1 722} 723 724HOME="$TRASH_DIRECTORY" 725export HOME 726 727iftest -z"$TEST_NO_CREATE_REPO" 728then 729 test_create_repo "$TRASH_DIRECTORY" 730else 731mkdir-p"$TRASH_DIRECTORY" 732fi 733 734# Gross hack to spawn N sub-instances of the tests in parallel, and 735# summarize the results. Note that if this is enabled, the script 736# terminates at the end of this 'if' block. 737iftest -n"$valgrind_parallel" 738then 739for i in $(test_seq 1$valgrind_parallel) 740do 741 root="$TRASH_DIRECTORY/vgparallel-$i" 742mkdir"$root" 743 TEST_OUTPUT_DIRECTORY="$root" \ 744${SHELL_PATH}"$0" \ 745--root="$root"--statusprefix="[$i] " \ 746--valgrind="$valgrind" \ 747--valgrind-only-stride="$valgrind_parallel" \ 748--valgrind-only-offset="$i"& 749 pids="$pids$!" 750done 751trap"kill$pids" INT TERM HUP 752wait$pids 753trap- INT TERM HUP 754for i in $(test_seq 1$valgrind_parallel) 755do 756 root="$TRASH_DIRECTORY/vgparallel-$i" 757eval"$(cat "$root/test-results/$(basename"$0" .sh)"-*.counts | 758 sed 's/^\([a-z][a-z]*\) \([0-9][0-9]*\)/inner_\1=\2/')" 759 test_count=$(expr$test_count+$inner_total) 760 test_success=$(expr$test_success+$inner_success) 761 test_fixed=$(expr$test_fixed+$inner_fixed) 762 test_broken=$(expr$test_broken+$inner_broken) 763 test_failure=$(expr$test_failure+$inner_failed) 764done 765 test_done 766fi 767 768# Use -P to resolve symlinks in our working directory so that the cwd 769# in subprocesses like git equals our $PWD (for pathname comparisons). 770cd -P"$TRASH_DIRECTORY"||exit1 771 772this_test=${0##*/} 773this_test=${this_test%%-*} 774if match_pattern_list "$this_test"$GIT_SKIP_TESTS 775then 776 say_color info >&3"skipping test$this_testaltogether" 777 skip_all="skip all tests in$this_test" 778 test_done 779fi 780 781# Provide an implementation of the 'yes' utility 782yes() { 783iftest$#=0 784then 785 y=y 786else 787 y="$*" 788fi 789 790whileecho"$y" 791do 792: 793done 794} 795 796# Fix some commands on Windows 797case $(uname -s)in 798*MINGW*) 799# Windows has its own (incompatible) sort and find 800sort() { 801/usr/bin/sort"$@" 802} 803find() { 804/usr/bin/find"$@" 805} 806sum() { 807md5sum"$@" 808} 809# git sees Windows-style pwd 810pwd() { 811builtin pwd -W 812} 813# no POSIX permissions 814# backslashes in pathspec are converted to '/' 815# exec does not inherit the PID 816 test_set_prereq MINGW 817 test_set_prereq NOT_CYGWIN 818 test_set_prereq SED_STRIPS_CR 819 test_set_prereq GREP_STRIPS_CR 820;; 821*CYGWIN*) 822 test_set_prereq POSIXPERM 823 test_set_prereq EXECKEEPSPID 824 test_set_prereq NOT_MINGW 825 test_set_prereq CYGWIN 826 test_set_prereq SED_STRIPS_CR 827 test_set_prereq GREP_STRIPS_CR 828;; 829*) 830 test_set_prereq POSIXPERM 831 test_set_prereq BSLASHPSPEC 832 test_set_prereq EXECKEEPSPID 833 test_set_prereq NOT_MINGW 834 test_set_prereq NOT_CYGWIN 835;; 836esac 837 838( COLUMNS=1&&test$COLUMNS=1) && test_set_prereq COLUMNS_CAN_BE_1 839test -z"$NO_PERL"&& test_set_prereq PERL 840test -z"$NO_PYTHON"&& test_set_prereq PYTHON 841test -n"$USE_LIBPCRE"&& test_set_prereq LIBPCRE 842test -z"$NO_GETTEXT"&& test_set_prereq GETTEXT 843 844# Can we rely on git's output in the C locale? 845iftest -n"$GETTEXT_POISON" 846then 847 GIT_GETTEXT_POISON=YesPlease 848export GIT_GETTEXT_POISON 849 test_set_prereq GETTEXT_POISON 850else 851 test_set_prereq C_LOCALE_OUTPUT 852fi 853 854# Use this instead of test_cmp to compare files that contain expected and 855# actual output from git commands that can be translated. When running 856# under GETTEXT_POISON this pretends that the command produced expected 857# results. 858test_i18ncmp () { 859test -n"$GETTEXT_POISON"|| test_cmp "$@" 860} 861 862# Use this instead of "grep expected-string actual" to see if the 863# output from a git command that can be translated either contains an 864# expected string, or does not contain an unwanted one. When running 865# under GETTEXT_POISON this pretends that the command produced expected 866# results. 867test_i18ngrep () { 868iftest -n"$GETTEXT_POISON" 869then 870:# pretend success 871eliftest"x!"="x$1" 872then 873shift 874!grep"$@" 875else 876grep"$@" 877fi 878} 879 880test_lazy_prereq PIPE ' 881 # test whether the filesystem supports FIFOs 882 case $(uname -s) in 883 CYGWIN*) 884 false 885 ;; 886 *) 887 rm -f testfifo && mkfifo testfifo 888 ;; 889 esac 890' 891 892test_lazy_prereq SYMLINKS ' 893 # test whether the filesystem supports symbolic links 894 ln -s x y && test -h y 895' 896 897test_lazy_prereq CASE_INSENSITIVE_FS ' 898 echo good >CamelCase && 899 echo bad >camelcase && 900 test "$(cat CamelCase)" != good 901' 902 903test_lazy_prereq UTF8_NFD_TO_NFC ' 904 # check whether FS converts nfd unicode to nfc 905 auml=$(printf "\303\244") 906 aumlcdiar=$(printf "\141\314\210") 907 >"$auml" && 908 case "$(echo *)" in 909 "$aumlcdiar") 910 true ;; 911 *) 912 false ;; 913 esac 914' 915 916test_lazy_prereq AUTOIDENT ' 917 sane_unset GIT_AUTHOR_NAME && 918 sane_unset GIT_AUTHOR_EMAIL && 919 git var GIT_AUTHOR_IDENT 920' 921 922# When the tests are run as root, permission tests will report that 923# things are writable when they shouldn't be. 924test -w/ || test_set_prereq SANITY 925 926GIT_UNZIP=${GIT_UNZIP:-unzip} 927test_lazy_prereq UNZIP ' 928 "$GIT_UNZIP" -v 929 test $? -ne 127 930'