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