test-lib.sh 17.8 KB
Newer Older
1 2 3 4 5
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
#

6 7 8 9 10 11
# if --tee was passed, write the output not only to the terminal, but
# additionally to the file test-results/$BASENAME.out, too.
case "$GIT_TEST_TEE_STARTED, $* " in
done,*)
	# do not redirect again
	;;
12
*' --tee '*|*' --va'*)
13 14 15 16 17 18 19 20 21
	mkdir -p test-results
	BASE=test-results/$(basename "$0" .sh)
	(GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
	 echo $? > $BASE.exit) | tee $BASE.out
	test "$(cat $BASE.exit)" = 0
	exit
	;;
esac

22 23 24
# Keep the original TERM for say_color
ORIGINAL_TERM=$TERM

25 26
# For repeatability, reset the environment to known value.
LANG=C
27
LC_ALL=C
28
PAGER=cat
29
TZ=UTC
30 31
TERM=dumb
export LANG LC_ALL PAGER TERM TZ
32
EDITOR=:
33
unset VISUAL
34
unset GIT_EDITOR
35 36 37 38 39
unset AUTHOR_DATE
unset AUTHOR_EMAIL
unset AUTHOR_NAME
unset COMMIT_AUTHOR_EMAIL
unset COMMIT_AUTHOR_NAME
40
unset EMAIL
41 42
unset GIT_ALTERNATE_OBJECT_DIRECTORIES
unset GIT_AUTHOR_DATE
43 44
GIT_AUTHOR_EMAIL=author@example.com
GIT_AUTHOR_NAME='A U Thor'
45
unset GIT_COMMITTER_DATE
46 47
GIT_COMMITTER_EMAIL=committer@example.com
GIT_COMMITTER_NAME='C O Mitter'
48 49
unset GIT_DIFF_OPTS
unset GIT_DIR
50
unset GIT_WORK_TREE
51 52 53
unset GIT_EXTERNAL_DIFF
unset GIT_INDEX_FILE
unset GIT_OBJECT_DIRECTORY
54
unset GIT_CEILING_DIRECTORIES
55 56
unset SHA1_FILE_DIRECTORIES
unset SHA1_FILE_DIRECTORY
57
unset GIT_NOTES_REF
58
unset GIT_NOTES_DISPLAY_REF
59 60
unset GIT_NOTES_REWRITE_REF
unset GIT_NOTES_REWRITE_MODE
61 62
GIT_MERGE_VERBOSITY=5
export GIT_MERGE_VERBOSITY
63 64
export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
65
export EDITOR
66
GIT_TEST_CMP=${GIT_TEST_CMP:-diff -u}
67

68 69 70 71
# Protect ourselves from common misconfiguration to export
# CDPATH into the environment
unset CDPATH

B
Bert Wesarg 已提交
72 73
unset GREP_OPTIONS

74
case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
75 76 77 78 79 80 81 82
	1|2|true)
		echo "* warning: Some tests will not work if GIT_TRACE" \
			"is set as to trace on STDERR ! *"
		echo "* warning: Please set GIT_TRACE to something" \
			"other than 1, 2 or true ! *"
		;;
esac

83 84 85 86 87 88
# Convenience
#
# A regexp to match 5 and 40 hexdigits
_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"

89 90 91 92 93 94
# Each test should start with something like this, after copyright notices:
#
# test_description='Description of this test...
# This test checks if command xyzzy does the right thing...
# '
# . ./test-lib.sh
95 96 97 98 99 100 101 102
[ "x$ORIGINAL_TERM" != "xdumb" ] && (
		TERM=$ORIGINAL_TERM &&
		export TERM &&
		[ -t 1 ] &&
		tput bold >/dev/null 2>&1 &&
		tput setaf 1 >/dev/null 2>&1 &&
		tput sgr0 >/dev/null 2>&1
	) &&
103
	color=t
104 105 106 107 108 109

while test "$#" -ne 0
do
	case "$1" in
	-d|--d|--de|--deb|--debu|--debug)
		debug=t; shift ;;
J
Junio C Hamano 已提交
110 111
	-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
		immediate=t; shift ;;
112
	-l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
J
Junio C Hamano 已提交
113
		GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
114
	-h|--h|--he|--hel|--help)
115
		help=t; shift ;;
116 117
	-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
		verbose=t; shift ;;
118 119
	-q|--q|--qu|--qui|--quie|--quiet)
		quiet=t; shift ;;
120 121
	--with-dashes)
		with_dashes=t; shift ;;
122
	--no-color)
123
		color=; shift ;;
124
	--no-python)
J
Junio C Hamano 已提交
125 126
		# noop now...
		shift ;;
127
	--va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
128
		valgrind=t; verbose=t; shift ;;
129 130
	--tee)
		shift ;; # was handled already
131 132 133
	--root=*)
		root=$(expr "z$1" : 'z[^=]*=\(.*\)')
		shift ;;
134
	*)
135
		echo "error: unknown test option '$1'" >&2; exit 1 ;;
136 137 138
	esac
done

139 140
if test -n "$color"; then
	say_color () {
141 142 143
		(
		TERM=$ORIGINAL_TERM
		export TERM
144 145 146 147 148
		case "$1" in
			error) tput bold; tput setaf 1;; # bold red
			skip)  tput bold; tput setaf 2;; # bold green
			pass)  tput setaf 2;;            # green
			info)  tput setaf 3;;            # brown
149
			*) test -n "$quiet" && return;;
150 151
		esac
		shift
S
Shawn O. Pearce 已提交
152
		printf "* %s" "$*"
153
		tput sgr0
154
		echo
155
		)
156 157 158
	}
else
	say_color() {
159
		test -z "$1" && test -n "$quiet" && return
160 161 162 163 164 165 166
		shift
		echo "* $*"
	}
fi

error () {
	say_color error "error: $*"
167
	GIT_EXIT_OK=t
168 169 170 171 172 173 174
	exit 1
}

say () {
	say_color info "$*"
}

175 176 177 178 179 180 181 182 183
test "${test_description}" != "" ||
error "Test script did not set test_description."

if test "$help" = "t"
then
	echo "$test_description"
	exit 0
fi

184
exec 5>&1
185 186 187 188 189 190 191 192 193
if test "$verbose" = "t"
then
	exec 4>&2 3>&1
else
	exec 4>/dev/null 3>/dev/null
fi

test_failure=0
test_count=0
J
Junio C Hamano 已提交
194 195
test_fixed=0
test_broken=0
196
test_success=0
197

198
die () {
199 200 201 202 203 204 205 206
	code=$?
	if test -n "$GIT_EXIT_OK"
	then
		exit $code
	else
		echo >&5 "FATAL: Unexpected exit with code $code"
		exit 1
	fi
207 208
}

209
GIT_EXIT_OK=
210
trap 'die' EXIT
211

212 213 214 215 216 217 218 219
# The semantics of the editor variables are that of invoking
# sh -c "$EDITOR \"$@\"" files ...
#
# If our trash directory contains shell metacharacters, they will be
# interpreted if we just set $EDITOR directly, so do a little dance with
# environment variables to work around this.
#
# In particular, quoting isn't enough, as the path may contain the same quote
220
# that we're using.
221 222 223
test_set_editor () {
	FAKE_EDITOR="$1"
	export FAKE_EDITOR
224 225
	EDITOR='"$FAKE_EDITOR"'
	export EDITOR
226 227
}

228 229 230 231 232 233 234 235 236 237 238
test_decode_color () {
	sed	-e 's/.\[1m/<WHITE>/g' \
		-e 's/.\[31m/<RED>/g' \
		-e 's/.\[32m/<GREEN>/g' \
		-e 's/.\[33m/<YELLOW>/g' \
		-e 's/.\[34m/<BLUE>/g' \
		-e 's/.\[35m/<MAGENTA>/g' \
		-e 's/.\[36m/<CYAN>/g' \
		-e 's/.\[m/<RESET>/g'
}

239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
q_to_nul () {
	perl -pe 'y/Q/\000/'
}

q_to_cr () {
	tr Q '\015'
}

append_cr () {
	sed -e 's/$/Q/' | tr Q '\015'
}

remove_cr () {
	tr '\015' Q | sed -e 's/Q$//'
}

255 256 257
test_tick () {
	if test -z "${test_tick+set}"
	then
J
Junio C Hamano 已提交
258
		test_tick=1112911993
259 260 261
	else
		test_tick=$(($test_tick + 60))
	fi
J
Junio C Hamano 已提交
262 263
	GIT_COMMITTER_DATE="$test_tick -0700"
	GIT_AUTHOR_DATE="$test_tick -0700"
264 265
	export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
}
266

267 268 269 270 271 272 273 274
# Call test_commit with the arguments "<message> [<file> [<contents>]]"
#
# This will commit a file with the given contents and the given commit
# message.  It will also add a tag with <message> as name.
#
# Both <file> and <contents> default to <message>.

test_commit () {
275
	file=${2:-"$1.t"}
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
	echo "${3-$1}" > "$file" &&
	git add "$file" &&
	test_tick &&
	git commit -m "$1" &&
	git tag "$1"
}

# Call test_merge with the arguments "<message> <commit>", where <commit>
# can be a tag pointing to the commit-to-merge.

test_merge () {
	test_tick &&
	git merge -m "$1" "$2" &&
	git tag "$1"
}

292 293 294 295 296 297 298 299 300
# This function helps systems where core.filemode=false is set.
# Use it instead of plain 'chmod +x' to set or unset the executable bit
# of a file in the working directory and add it to the index.

test_chmod () {
	chmod "$@" &&
	git update-index --add "--chmod=$@"
}

301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
# Use test_set_prereq to tell that a particular prerequisite is available.
# The prerequisite can later be checked for in two ways:
#
# - Explicitly using test_have_prereq.
#
# - Implicitly by specifying the prerequisite tag in the calls to
#   test_expect_{success,failure,code}.
#
# The single parameter is the prerequisite tag (a simple word, in all
# capital letters by convention).

test_set_prereq () {
	satisfied="$satisfied$1 "
}
satisfied=" "

test_have_prereq () {
	case $satisfied in
	*" $1 "*)
		: yes, have it ;;
	*)
		! : nope ;;
	esac
}

J
Junio C Hamano 已提交
326 327 328 329
# You are not expected to call test_ok_ and test_failure_ directly, use
# the text_expect_* functions instead.

test_ok_ () {
330
	test_success=$(($test_success + 1))
331
	say_color "" "  ok $test_count: $@"
332 333
}

J
Junio C Hamano 已提交
334
test_failure_ () {
335
	test_failure=$(($test_failure + 1))
336
	say_color error "FAIL $test_count: $1"
337 338
	shift
	echo "$@" | sed -e 's/^/	/'
339
	test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
J
Junio C Hamano 已提交
340 341
}

J
Junio C Hamano 已提交
342 343 344 345 346 347 348 349 350
test_known_broken_ok_ () {
	test_fixed=$(($test_fixed+1))
	say_color "" "  FIXED $test_count: $@"
}

test_known_broken_failure_ () {
	test_broken=$(($test_broken+1))
	say_color skip "  still broken $test_count: $@"
}
J
Junio C Hamano 已提交
351 352

test_debug () {
353
	test "$debug" = "" || eval "$1"
354 355
}

356 357 358 359 360 361
test_run_ () {
	eval >&3 2>&4 "$1"
	eval_ret="$?"
	return 0
}

362
test_skip () {
363
	test_count=$(($test_count+1))
364 365 366
	to_skip=
	for skp in $GIT_SKIP_TESTS
	do
367
		case $this_test.$test_count in
368 369 370 371
		$skp)
			to_skip=t
		esac
	done
372 373 374 375 376
	if test -z "$to_skip" && test -n "$prereq" &&
	   ! test_have_prereq "$prereq"
	then
		to_skip=t
	fi
377 378
	case "$to_skip" in
	t)
379 380
		say_color skip >&3 "skipping test: $@"
		say_color skip "skip $test_count: $1"
381 382 383 384 385 386 387 388
		: true
		;;
	*)
		false
		;;
	esac
}

389
test_expect_failure () {
390
	test "$#" = 3 && { prereq=$1; shift; } || prereq=
391
	test "$#" = 2 ||
392
	error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
393
	if ! test_skip "$@"
394
	then
J
Junio C Hamano 已提交
395
		say >&3 "checking known breakage: $2"
396
		test_run_ "$2"
J
Junio C Hamano 已提交
397
		if [ "$?" = 0 -a "$eval_ret" = 0 ]
398
		then
J
Junio C Hamano 已提交
399
			test_known_broken_ok_ "$1"
400
		else
401
			test_known_broken_failure_ "$1"
402
		fi
403
	fi
404
	echo >&3 ""
405 406 407
}

test_expect_success () {
408
	test "$#" = 3 && { prereq=$1; shift; } || prereq=
409
	test "$#" = 2 ||
410
	error "bug in the test script: not 2 or 3 parameters to test-expect-success"
411
	if ! test_skip "$@"
412
	then
413 414 415 416 417 418 419 420
		say >&3 "expecting success: $2"
		test_run_ "$2"
		if [ "$?" = 0 -a "$eval_ret" = 0 ]
		then
			test_ok_ "$1"
		else
			test_failure_ "$@"
		fi
421
	fi
422
	echo >&3 ""
423 424
}

425
test_expect_code () {
426
	test "$#" = 4 && { prereq=$1; shift; } || prereq=
427
	test "$#" = 3 ||
428
	error "bug in the test script: not 3 or 4 parameters to test-expect-code"
429
	if ! test_skip "$@"
430
	then
431 432 433 434 435 436 437 438
		say >&3 "expecting exit code $1: $3"
		test_run_ "$3"
		if [ "$?" = 0 -a "$eval_ret" = "$1" ]
		then
			test_ok_ "$2"
		else
			test_failure_ "$@"
		fi
439
	fi
440
	echo >&3 ""
441 442
}

443 444 445 446 447 448 449 450 451
# test_external runs external test scripts that provide continuous
# test output about their progress, and succeeds/fails on
# zero/non-zero exit code.  It outputs the test output on stdout even
# in non-verbose mode, and announces the external script with "* run
# <n>: ..." before running it.  When providing relative paths, keep in
# mind that all scripts run in "trash directory".
# Usage: test_external description command arguments...
# Example: test_external 'Perl API' perl ../path/to/test.pl
test_external () {
452 453 454
	test "$#" = 4 && { prereq=$1; shift; } || prereq=
	test "$#" = 3 ||
	error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
455 456 457 458 459 460
	descr="$1"
	shift
	if ! test_skip "$descr" "$@"
	then
		# Announce the script to reduce confusion about the
		# test output that follows.
461
		say_color "" " run $test_count: $descr ($*)"
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
		# Run command; redirect its stderr to &4 as in
		# test_run_, but keep its stdout on our stdout even in
		# non-verbose mode.
		"$@" 2>&4
		if [ "$?" = 0 ]
		then
			test_ok_ "$descr"
		else
			test_failure_ "$descr" "$@"
		fi
	fi
}

# Like test_external, but in addition tests that the command generated
# no output on stderr.
test_external_without_stderr () {
	# The temporary file has no (and must have no) security
	# implications.
	tmp="$TMPDIR"; if [ -z "$tmp" ]; then tmp=/tmp; fi
	stderr="$tmp/git-external-stderr.$$.tmp"
	test_external "$@" 4> "$stderr"
	[ -f "$stderr" ] || error "Internal error: $stderr disappeared."
	descr="no stderr: $1"
	shift
	say >&3 "expecting no stderr from previous command"
	if [ ! -s "$stderr" ]; then
		rm "$stderr"
		test_ok_ "$descr"
	else
		if [ "$verbose" = t ]; then
			output=`echo; echo Stderr is:; cat "$stderr"`
		else
			output=
		fi
		# rm first in case test_failure exits.
		rm "$stderr"
		test_failure_ "$descr" "$@" "$output"
	fi
}

J
Junio C Hamano 已提交
502 503 504 505 506 507 508 509 510 511 512 513 514 515
# This is not among top-level (test_expect_success | test_expect_failure)
# but is a prefix that can be used in the test script, like:
#
#	test_expect_success 'complain and die' '
#           do something &&
#           do something else &&
#	    test_must_fail git checkout ../outerspace
#	'
#
# Writing this as "! git checkout ../outerspace" is wrong, because
# the failure could be due to a segv.  We want a controlled failure.

test_must_fail () {
	"$@"
516
	test $? -gt 0 -a $? -le 129 -o $? -gt 192
J
Junio C Hamano 已提交
517 518
}

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
# test_cmp is a helper function to compare actual and expected output.
# You can use it like:
#
#	test_expect_success 'foo works' '
#		echo expected >expected &&
#		foo >actual &&
#		test_cmp expected actual
#	'
#
# This could be written as either "cmp" or "diff -u", but:
# - cmp's output is not nearly as easy to read as diff -u
# - not all diff versions understand "-u"

test_cmp() {
	$GIT_TEST_CMP "$@"
}

536
# Most tests can use the created repository, but some may need to create more.
537 538 539 540 541 542
# Usage: test_create_repo <directory>
test_create_repo () {
	test "$#" = 1 ||
	error "bug in the test script: not 1 parameter to test-create-repo"
	owd=`pwd`
	repo="$1"
543
	mkdir -p "$repo"
544
	cd "$repo" || error "Cannot setup test environment"
545
	"$GIT_EXEC_PATH/git-init" "--template=$TEST_DIRECTORY/../templates/blt/" >&3 2>&4 ||
546
	error "cannot run git init -- have you built things yet?"
547 548 549
	mv .git/hooks .git/hooks-disabled
	cd "$owd"
}
J
Junio C Hamano 已提交
550

551
test_done () {
552
	GIT_EXIT_OK=t
553 554
	test_results_dir="$TEST_DIRECTORY/test-results"
	mkdir -p "$test_results_dir"
555
	test_results_path="$test_results_dir/${0%.sh}-$$"
556 557 558 559 560 561 562

	echo "total $test_count" >> $test_results_path
	echo "success $test_success" >> $test_results_path
	echo "fixed $test_fixed" >> $test_results_path
	echo "broken $test_broken" >> $test_results_path
	echo "failed $test_failure" >> $test_results_path
	echo "" >> $test_results_path
J
Junio C Hamano 已提交
563 564 565 566 567 568 569 570

	if test "$test_fixed" != 0
	then
		say_color pass "fixed $test_fixed known breakage(s)"
	fi
	if test "$test_broken" != 0
	then
		say_color error "still have $test_broken known breakage(s)"
571 572 573
		msg="remaining $(($test_count-$test_broken)) test(s)"
	else
		msg="$test_count test(s)"
J
Junio C Hamano 已提交
574
	fi
575
	case "$test_failure" in
576
	0)
577
		say_color pass "passed all $msg"
J
Johannes Schindelin 已提交
578 579 580 581 582

		test -d "$remove_trash" &&
		cd "$(dirname "$remove_trash")" &&
		rm -rf "$(basename "$remove_trash")"

583 584 585
		exit 0 ;;

	*)
586
		say_color error "failed $test_failure among $msg"
587 588 589 590 591 592
		exit 1 ;;

	esac
}

# Test the binaries we have just built.  The tests are kept in
593
# t/ subdirectory and are run in 'trash directory' subdirectory.
594
TEST_DIRECTORY=$(pwd)
595
if test -n "$valgrind"
596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628
then
	make_symlink () {
		test -h "$2" &&
		test "$1" = "$(readlink "$2")" || {
			# be super paranoid
			if mkdir "$2".lock
			then
				rm -f "$2" &&
				ln -s "$1" "$2" &&
				rm -r "$2".lock
			else
				while test -d "$2".lock
				do
					say "Waiting for lock on $2."
					sleep 1
				done
			fi
		}
	}

	make_valgrind_symlink () {
		# handle only executables
		test -x "$1" || return

		base=$(basename "$1")
		symlink_target=$TEST_DIRECTORY/../$base
		# do not override scripts
		if test -x "$symlink_target" &&
		    test ! -d "$symlink_target" &&
		    test "#!" != "$(head -c 2 < "$symlink_target")"
		then
			symlink_target=../valgrind.sh
		fi
629 630 631 632
		case "$base" in
		*.sh|*.perl)
			symlink_target=../unprocessed-script
		esac
633 634 635 636 637 638 639 640 641 642 643
		# create the link, or replace it if it is out of date
		make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
	}

	# override all git executables in TEST_DIRECTORY/..
	GIT_VALGRIND=$TEST_DIRECTORY/valgrind
	mkdir -p "$GIT_VALGRIND"/bin
	for file in $TEST_DIRECTORY/../git* $TEST_DIRECTORY/../test-*
	do
		make_valgrind_symlink $file
	done
644 645 646 647 648 649 650 651 652 653 654
	OLDIFS=$IFS
	IFS=:
	for path in $PATH
	do
		ls "$path"/git-* 2> /dev/null |
		while read file
		do
			make_valgrind_symlink "$file"
		done
	done
	IFS=$OLDIFS
655 656 657
	PATH=$GIT_VALGRIND/bin:$PATH
	GIT_EXEC_PATH=$GIT_VALGRIND/bin
	export GIT_VALGRIND
658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675
elif test -n "$GIT_TEST_INSTALLED" ; then
	GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path)  ||
	error "Cannot run git from $GIT_TEST_INSTALLED."
	PATH=$GIT_TEST_INSTALLED:$TEST_DIRECTORY/..:$PATH
	GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
else # normal case, use ../bin-wrappers only unless $with_dashes:
	git_bin_dir="$TEST_DIRECTORY/../bin-wrappers"
	if ! test -x "$git_bin_dir/git" ; then
		if test -z "$with_dashes" ; then
			say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
		fi
		with_dashes=t
	fi
	PATH="$git_bin_dir:$PATH"
	GIT_EXEC_PATH=$TEST_DIRECTORY/..
	if test -n "$with_dashes" ; then
		PATH="$TEST_DIRECTORY/..:$PATH"
	fi
676
fi
J
Johannes Schindelin 已提交
677
GIT_TEMPLATE_DIR=$(pwd)/../templates/blt
J
Jeff King 已提交
678 679 680 681
unset GIT_CONFIG
GIT_CONFIG_NOSYSTEM=1
GIT_CONFIG_NOGLOBAL=1
export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_CONFIG_NOGLOBAL
682

J
Jeff King 已提交
683 684
. ../GIT-BUILD-OPTIONS

685 686
GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git
export GITPERLLIB
687 688 689
test -d ../templates/blt || {
	error "You haven't built things yet, have you?"
}
690

J
Jeff King 已提交
691
if test -z "$GIT_TEST_INSTALLED" && test -z "$NO_PYTHON"
692 693 694 695 696 697 698 699
then
	GITPYTHONLIB="$(pwd)/../git_remote_helpers/build/lib"
	export GITPYTHONLIB
	test -d ../git_remote_helpers/build || {
		error "You haven't built git_remote_helpers yet, have you?"
	}
fi

E
Eric Wong 已提交
700 701 702 703 704 705
if ! test -x ../test-chmtime; then
	echo >&2 'You need to build test-chmtime:'
	echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
	exit 1
fi

706
# Test repository
J
Johannes Schindelin 已提交
707
test="trash directory.$(basename "$0" .sh)"
708 709 710 711 712
test -n "$root" && test="$root/$test"
case "$test" in
/*) TRASH_DIRECTORY="$test" ;;
 *) TRASH_DIRECTORY="$TEST_DIRECTORY/$test" ;;
esac
713
test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
714
rm -fr "$test" || {
715
	GIT_EXIT_OK=t
716 717 718 719
	echo >&5 "FATAL: Cannot prepare test area"
	exit 1
}

720
test_create_repo "$test"
721 722 723
# Use -P to resolve symlinks in our working directory so that the cwd
# in subprocesses like git equals our $PWD (for pathname comparisons).
cd -P "$test" || exit 1
724

725 726
this_test=${0##*/}
this_test=${this_test%%-*}
727 728 729 730 731 732 733 734 735 736 737 738
for skp in $GIT_SKIP_TESTS
do
	to_skip=
	for skp in $GIT_SKIP_TESTS
	do
		case "$this_test" in
		$skp)
			to_skip=t
		esac
	done
	case "$to_skip" in
	t)
739 740
		say_color skip >&3 "skipping test $this_test altogether"
		say_color skip "skip all tests in $this_test"
741 742 743
		test_done
	esac
done
744

745 746 747 748 749 750 751 752 753 754 755 756 757 758 759
# Provide an implementation of the 'yes' utility
yes () {
	if test $# = 0
	then
		y=y
	else
		y="$*"
	fi

	while echo "$y"
	do
		:
	done
}

760 761 762 763 764 765 766 767 768 769
# Fix some commands on Windows
case $(uname -s) in
*MINGW*)
	# Windows has its own (incompatible) sort and find
	sort () {
		/usr/bin/sort "$@"
	}
	find () {
		/usr/bin/find "$@"
	}
770 771 772
	sum () {
		md5sum "$@"
	}
773 774 775 776
	# git sees Windows-style pwd
	pwd () {
		builtin pwd -W
	}
777
	# no POSIX permissions
778
	# backslashes in pathspec are converted to '/'
779
	# exec does not inherit the PID
780 781 782
	;;
*)
	test_set_prereq POSIXPERM
783
	test_set_prereq BSLASHPSPEC
784
	test_set_prereq EXECKEEPSPID
785 786
	;;
esac
787

788
test -z "$NO_PERL" && test_set_prereq PERL
789
test -z "$NO_PYTHON" && test_set_prereq PYTHON
790

791 792 793
# test whether the filesystem supports symbolic links
ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS
rm -f y