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