| #!/bin/sh | 
 | # | 
 | # Copyright (c) 2005 Junio C Hamano | 
 | # | 
 |  | 
 | # For repeatability, reset the environment to known value. | 
 | LANG=C | 
 | LC_ALL=C | 
 | PAGER=cat | 
 | TZ=UTC | 
 | export LANG LC_ALL PAGER TZ | 
 | EDITOR=: | 
 | VISUAL=: | 
 | unset AUTHOR_DATE | 
 | unset AUTHOR_EMAIL | 
 | unset AUTHOR_NAME | 
 | unset COMMIT_AUTHOR_EMAIL | 
 | unset COMMIT_AUTHOR_NAME | 
 | unset EMAIL | 
 | unset GIT_ALTERNATE_OBJECT_DIRECTORIES | 
 | unset GIT_AUTHOR_DATE | 
 | GIT_AUTHOR_EMAIL=author@example.com | 
 | GIT_AUTHOR_NAME='A U Thor' | 
 | unset GIT_COMMITTER_DATE | 
 | GIT_COMMITTER_EMAIL=committer@example.com | 
 | GIT_COMMITTER_NAME='C O Mitter' | 
 | unset GIT_DIFF_OPTS | 
 | unset GIT_DIR | 
 | unset GIT_EXTERNAL_DIFF | 
 | unset GIT_INDEX_FILE | 
 | unset GIT_OBJECT_DIRECTORY | 
 | unset SHA1_FILE_DIRECTORIES | 
 | unset SHA1_FILE_DIRECTORY | 
 | GIT_MERGE_VERBOSITY=5 | 
 | export GIT_MERGE_VERBOSITY | 
 | export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME | 
 | export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME | 
 | export EDITOR VISUAL | 
 |  | 
 | # Protect ourselves from common misconfiguration to export | 
 | # CDPATH into the environment | 
 | unset CDPATH | 
 |  | 
 | case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in | 
 | 	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 | 
 |  | 
 | # 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 | 
 |  | 
 | error () { | 
 | 	echo "* error: $*" | 
 | 	trap - exit | 
 | 	exit 1 | 
 | } | 
 |  | 
 | say () { | 
 | 	echo "* $*" | 
 | } | 
 |  | 
 | test "${test_description}" != "" || | 
 | error "Test script did not set test_description." | 
 |  | 
 | while test "$#" -ne 0 | 
 | do | 
 | 	case "$1" in | 
 | 	-d|--d|--de|--deb|--debu|--debug) | 
 | 		debug=t; shift ;; | 
 | 	-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate) | 
 | 		immediate=t; shift ;; | 
 | 	-h|--h|--he|--hel|--help) | 
 | 		echo "$test_description" | 
 | 		exit 0 ;; | 
 | 	-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose) | 
 | 		verbose=t; shift ;; | 
 | 	--no-python) | 
 | 		# noop now... | 
 | 		shift ;; | 
 | 	*) | 
 | 		break ;; | 
 | 	esac | 
 | done | 
 |  | 
 | exec 5>&1 | 
 | 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 | 
 |  | 
 | trap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit | 
 |  | 
 | test_tick () { | 
 | 	if test -z "${test_tick+set}" | 
 | 	then | 
 | 		test_tick=1112911993 | 
 | 	else | 
 | 		test_tick=$(($test_tick + 60)) | 
 | 	fi | 
 | 	GIT_COMMITTER_DATE="$test_tick -0700" | 
 | 	GIT_AUTHOR_DATE="$test_tick -0700" | 
 | 	export GIT_COMMITTER_DATE GIT_AUTHOR_DATE | 
 | } | 
 |  | 
 | # You are not expected to call test_ok_ and test_failure_ directly, use | 
 | # the text_expect_* functions instead. | 
 |  | 
 | test_ok_ () { | 
 | 	test_count=$(expr "$test_count" + 1) | 
 | 	say "  ok $test_count: $@" | 
 | } | 
 |  | 
 | test_failure_ () { | 
 | 	test_count=$(expr "$test_count" + 1) | 
 | 	test_failure=$(expr "$test_failure" + 1); | 
 | 	say "FAIL $test_count: $1" | 
 | 	shift | 
 | 	echo "$@" | sed -e 's/^/	/' | 
 | 	test "$immediate" = "" || { trap - exit; exit 1; } | 
 | } | 
 |  | 
 |  | 
 | test_debug () { | 
 | 	test "$debug" = "" || eval "$1" | 
 | } | 
 |  | 
 | test_run_ () { | 
 | 	eval >&3 2>&4 "$1" | 
 | 	eval_ret="$?" | 
 | 	return 0 | 
 | } | 
 |  | 
 | test_skip () { | 
 | 	this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') | 
 | 	this_test="$this_test.$(expr "$test_count" + 1)" | 
 | 	to_skip= | 
 | 	for skp in $GIT_SKIP_TESTS | 
 | 	do | 
 | 		case "$this_test" in | 
 | 		$skp) | 
 | 			to_skip=t | 
 | 		esac | 
 | 	done | 
 | 	case "$to_skip" in | 
 | 	t) | 
 | 		say >&3 "skipping test: $@" | 
 | 		test_count=$(expr "$test_count" + 1) | 
 | 		say "skip $test_count: $1" | 
 | 		: true | 
 | 		;; | 
 | 	*) | 
 | 		false | 
 | 		;; | 
 | 	esac | 
 | } | 
 |  | 
 | test_expect_failure () { | 
 | 	test "$#" = 2 || | 
 | 	error "bug in the test script: not 2 parameters to test-expect-failure" | 
 | 	if ! test_skip "$@" | 
 | 	then | 
 | 		say >&3 "expecting failure: $2" | 
 | 		test_run_ "$2" | 
 | 		if [ "$?" = 0 -a "$eval_ret" != 0 -a "$eval_ret" -lt 129 ] | 
 | 		then | 
 | 			test_ok_ "$1" | 
 | 		else | 
 | 			test_failure_ "$@" | 
 | 		fi | 
 | 	fi | 
 | 	echo >&3 "" | 
 | } | 
 |  | 
 | test_expect_success () { | 
 | 	test "$#" = 2 || | 
 | 	error "bug in the test script: not 2 parameters to test-expect-success" | 
 | 	if ! test_skip "$@" | 
 | 	then | 
 | 		say >&3 "expecting success: $2" | 
 | 		test_run_ "$2" | 
 | 		if [ "$?" = 0 -a "$eval_ret" = 0 ] | 
 | 		then | 
 | 			test_ok_ "$1" | 
 | 		else | 
 | 			test_failure_ "$@" | 
 | 		fi | 
 | 	fi | 
 | 	echo >&3 "" | 
 | } | 
 |  | 
 | test_expect_code () { | 
 | 	test "$#" = 3 || | 
 | 	error "bug in the test script: not 3 parameters to test-expect-code" | 
 | 	if ! test_skip "$@" | 
 | 	then | 
 | 		say >&3 "expecting exit code $1: $3" | 
 | 		test_run_ "$3" | 
 | 		if [ "$?" = 0 -a "$eval_ret" = "$1" ] | 
 | 		then | 
 | 			test_ok_ "$2" | 
 | 		else | 
 | 			test_failure_ "$@" | 
 | 		fi | 
 | 	fi | 
 | 	echo >&3 "" | 
 | } | 
 |  | 
 | # Most tests can use the created repository, but some amy need to create more. | 
 | # 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" | 
 | 	mkdir "$repo" | 
 | 	cd "$repo" || error "Cannot setup test environment" | 
 | 	"$GIT_EXEC_PATH/git" init --template=$GIT_EXEC_PATH/templates/blt/ >/dev/null 2>&1 || | 
 | 	error "cannot run git init -- have you built things yet?" | 
 | 	mv .git/hooks .git/hooks-disabled | 
 | 	cd "$owd" | 
 | } | 
 | 	 | 
 | test_done () { | 
 | 	trap - exit | 
 | 	case "$test_failure" in | 
 | 	0) | 
 | 		# We could: | 
 | 		# cd .. && rm -fr trash | 
 | 		# but that means we forbid any tests that use their own | 
 | 		# subdirectory from calling test_done without coming back | 
 | 		# to where they started from. | 
 | 		# The Makefile provided will clean this test area so | 
 | 		# we will leave things as they are. | 
 |  | 
 | 		say "passed all $test_count test(s)" | 
 | 		exit 0 ;; | 
 |  | 
 | 	*) | 
 | 		say "failed $test_failure among $test_count test(s)" | 
 | 		exit 1 ;; | 
 |  | 
 | 	esac | 
 | } | 
 |  | 
 | # Test the binaries we have just built.  The tests are kept in | 
 | # t/ subdirectory and are run in trash subdirectory. | 
 | PATH=$(pwd)/..:$PATH | 
 | GIT_EXEC_PATH=$(pwd)/.. | 
 | GIT_TEMPLATE_DIR=$(pwd)/../templates/blt | 
 | GIT_CONFIG=.git/config | 
 | export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG | 
 |  | 
 | GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git | 
 | export GITPERLLIB | 
 | test -d ../templates/blt || { | 
 | 	error "You haven't built things yet, have you?" | 
 | } | 
 |  | 
 | 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 | 
 |  | 
 | # Test repository | 
 | test=trash | 
 | rm -fr "$test" | 
 | test_create_repo $test | 
 | cd "$test" | 
 |  | 
 | this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$') | 
 | 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) | 
 | 		say >&3 "skipping test $this_test altogether" | 
 | 		say "skip all tests in $this_test" | 
 | 		test_done | 
 | 	esac | 
 | done |