]> git.ipfire.org Git - thirdparty/git.git/blame - t/test-lib.sh
test-lib: Let tests specify commands to be run at end of test
[thirdparty/git.git] / t / test-lib.sh
CommitLineData
e1970ce4
JH
1#!/bin/sh
2#
3# Copyright (c) 2005 Junio C Hamano
4#
64b90323
MS
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/ .
e1970ce4 17
44138559
JS
18# if --tee was passed, write the output not only to the terminal, but
19# additionally to the file test-results/$BASENAME.out, too.
20case "$GIT_TEST_TEE_STARTED, $* " in
21done,*)
22 # do not redirect again
23 ;;
3da93652 24*' --tee '*|*' --va'*)
44138559
JS
25 mkdir -p test-results
26 BASE=test-results/$(basename "$0" .sh)
27 (GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
28 echo $? > $BASE.exit) | tee $BASE.out
29 test "$(cat $BASE.exit)" = 0
30 exit
31 ;;
32esac
33
c2116a17
JH
34# Keep the original TERM for say_color
35ORIGINAL_TERM=$TERM
36
e1970ce4
JH
37# For repeatability, reset the environment to known value.
38LANG=C
899460f3 39LC_ALL=C
d9bdd39e 40PAGER=cat
e1970ce4 41TZ=UTC
c2116a17
JH
42TERM=dumb
43export LANG LC_ALL PAGER TERM TZ
8ff99e74 44EDITOR=:
d33738d7 45unset VISUAL
18508c39 46unset GIT_EDITOR
e1970ce4
JH
47unset AUTHOR_DATE
48unset AUTHOR_EMAIL
49unset AUTHOR_NAME
50unset COMMIT_AUTHOR_EMAIL
51unset COMMIT_AUTHOR_NAME
28a94f88 52unset EMAIL
e1970ce4
JH
53unset GIT_ALTERNATE_OBJECT_DIRECTORIES
54unset GIT_AUTHOR_DATE
29e55cd5
JH
55GIT_AUTHOR_EMAIL=author@example.com
56GIT_AUTHOR_NAME='A U Thor'
6677c466 57unset GIT_COMMITTER_DATE
29e55cd5
JH
58GIT_COMMITTER_EMAIL=committer@example.com
59GIT_COMMITTER_NAME='C O Mitter'
e1970ce4
JH
60unset GIT_DIFF_OPTS
61unset GIT_DIR
892c41b9 62unset GIT_WORK_TREE
e1970ce4
JH
63unset GIT_EXTERNAL_DIFF
64unset GIT_INDEX_FILE
65unset GIT_OBJECT_DIRECTORY
0454dd93 66unset GIT_CEILING_DIRECTORIES
e1970ce4
JH
67unset SHA1_FILE_DIRECTORIES
68unset SHA1_FILE_DIRECTORY
6ceeaee7 69unset GIT_NOTES_REF
894a9d33 70unset GIT_NOTES_DISPLAY_REF
6956f858
TR
71unset GIT_NOTES_REWRITE_REF
72unset GIT_NOTES_REWRITE_MODE
8d0fc48f
SP
73GIT_MERGE_VERBOSITY=5
74export GIT_MERGE_VERBOSITY
29e55cd5
JH
75export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
76export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
d33738d7 77export EDITOR
82ebb0b6 78GIT_TEST_CMP=${GIT_TEST_CMP:-diff -u}
e1970ce4 79
886a3907
JH
80# Protect ourselves from common misconfiguration to export
81# CDPATH into the environment
82unset CDPATH
83
5565f47c
BW
84unset GREP_OPTIONS
85
3d5c0cc9 86case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
6ce4e61f
CC
87 1|2|true)
88 echo "* warning: Some tests will not work if GIT_TRACE" \
89 "is set as to trace on STDERR ! *"
90 echo "* warning: Please set GIT_TRACE to something" \
91 "other than 1, 2 or true ! *"
92 ;;
93esac
94
cd3c095c
JH
95# Convenience
96#
97# A regexp to match 5 and 40 hexdigits
98_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
99_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
100
e1970ce4
JH
101# Each test should start with something like this, after copyright notices:
102#
103# test_description='Description of this test...
104# This test checks if command xyzzy does the right thing...
105# '
106# . ./test-lib.sh
c2116a17
JH
107[ "x$ORIGINAL_TERM" != "xdumb" ] && (
108 TERM=$ORIGINAL_TERM &&
109 export TERM &&
110 [ -t 1 ] &&
111 tput bold >/dev/null 2>&1 &&
112 tput setaf 1 >/dev/null 2>&1 &&
113 tput sgr0 >/dev/null 2>&1
114 ) &&
55db1df0 115 color=t
e1970ce4 116
e1970ce4
JH
117while test "$#" -ne 0
118do
119 case "$1" in
120 -d|--d|--de|--deb|--debu|--debug)
121 debug=t; shift ;;
886856ab
JH
122 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
123 immediate=t; shift ;;
5e2c08c6 124 -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
91e80b98 125 GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
e1970ce4 126 -h|--h|--he|--hel|--help)
570f3226 127 help=t; shift ;;
e1970ce4
JH
128 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
129 verbose=t; shift ;;
1ece1274
PH
130 -q|--q|--qu|--qui|--quie|--quiet)
131 quiet=t; shift ;;
e4597aae
MO
132 --with-dashes)
133 with_dashes=t; shift ;;
55db1df0 134 --no-color)
faa4bc35 135 color=; shift ;;
abb7c7b3 136 --no-python)
7cdbff14
JH
137 # noop now...
138 shift ;;
4e1be63c 139 --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
3da93652 140 valgrind=t; verbose=t; shift ;;
44138559
JS
141 --tee)
142 shift ;; # was handled already
f423ef5f
JK
143 --root=*)
144 root=$(expr "z$1" : 'z[^=]*=\(.*\)')
145 shift ;;
e1970ce4 146 *)
1f729dca 147 echo "error: unknown test option '$1'" >&2; exit 1 ;;
e1970ce4
JH
148 esac
149done
150
55db1df0
PH
151if test -n "$color"; then
152 say_color () {
c2116a17
JH
153 (
154 TERM=$ORIGINAL_TERM
155 export TERM
55db1df0
PH
156 case "$1" in
157 error) tput bold; tput setaf 1;; # bold red
158 skip) tput bold; tput setaf 2;; # bold green
159 pass) tput setaf 2;; # green
160 info) tput setaf 3;; # brown
1ece1274 161 *) test -n "$quiet" && return;;
55db1df0
PH
162 esac
163 shift
72d404de 164 printf "* %s" "$*"
55db1df0 165 tput sgr0
b8eecafd 166 echo
c2116a17 167 )
55db1df0
PH
168 }
169else
170 say_color() {
1ece1274 171 test -z "$1" && test -n "$quiet" && return
55db1df0
PH
172 shift
173 echo "* $*"
174 }
175fi
176
177error () {
178 say_color error "error: $*"
6e7b5aaf 179 GIT_EXIT_OK=t
55db1df0
PH
180 exit 1
181}
182
183say () {
184 say_color info "$*"
185}
186
570f3226
MB
187test "${test_description}" != "" ||
188error "Test script did not set test_description."
189
190if test "$help" = "t"
191then
192 echo "$test_description"
193 exit 0
194fi
195
4d9d62fa 196exec 5>&1
e1970ce4
JH
197if test "$verbose" = "t"
198then
199 exec 4>&2 3>&1
200else
201 exec 4>/dev/null 3>/dev/null
202fi
203
204test_failure=0
205test_count=0
41ac414e
JH
206test_fixed=0
207test_broken=0
2d84e9fb 208test_success=0
e1970ce4 209
faa4bc35 210die () {
6e7b5aaf
CB
211 code=$?
212 if test -n "$GIT_EXIT_OK"
213 then
214 exit $code
215 else
216 echo >&5 "FATAL: Unexpected exit with code $code"
217 exit 1
218 fi
faa4bc35
CB
219}
220
6e7b5aaf 221GIT_EXIT_OK=
35641310 222trap 'die' EXIT
41184273 223
02b35660
BD
224# The semantics of the editor variables are that of invoking
225# sh -c "$EDITOR \"$@\"" files ...
226#
227# If our trash directory contains shell metacharacters, they will be
228# interpreted if we just set $EDITOR directly, so do a little dance with
229# environment variables to work around this.
230#
231# In particular, quoting isn't enough, as the path may contain the same quote
7b7b4516 232# that we're using.
02b35660
BD
233test_set_editor () {
234 FAKE_EDITOR="$1"
235 export FAKE_EDITOR
d33738d7
JN
236 EDITOR='"$FAKE_EDITOR"'
237 export EDITOR
02b35660
BD
238}
239
68cfc6f5
MG
240test_decode_color () {
241 sed -e 's/.\[1m/<WHITE>/g' \
242 -e 's/.\[31m/<RED>/g' \
243 -e 's/.\[32m/<GREEN>/g' \
244 -e 's/.\[33m/<YELLOW>/g' \
245 -e 's/.\[34m/<BLUE>/g' \
246 -e 's/.\[35m/<MAGENTA>/g' \
247 -e 's/.\[36m/<CYAN>/g' \
248 -e 's/.\[m/<RESET>/g'
249}
250
c4f3f551
SB
251q_to_nul () {
252 perl -pe 'y/Q/\000/'
253}
254
255q_to_cr () {
256 tr Q '\015'
257}
258
259append_cr () {
260 sed -e 's/$/Q/' | tr Q '\015'
261}
262
263remove_cr () {
264 tr '\015' Q | sed -e 's/Q$//'
265}
266
04509738
JH
267test_tick () {
268 if test -z "${test_tick+set}"
269 then
21afc41c 270 test_tick=1112911993
04509738
JH
271 else
272 test_tick=$(($test_tick + 60))
273 fi
21afc41c
JH
274 GIT_COMMITTER_DATE="$test_tick -0700"
275 GIT_AUTHOR_DATE="$test_tick -0700"
04509738
JH
276 export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
277}
e1970ce4 278
00884968
JS
279# Call test_commit with the arguments "<message> [<file> [<contents>]]"
280#
281# This will commit a file with the given contents and the given commit
282# message. It will also add a tag with <message> as name.
283#
284# Both <file> and <contents> default to <message>.
285
286test_commit () {
e656fc97 287 file=${2:-"$1.t"}
00884968
JS
288 echo "${3-$1}" > "$file" &&
289 git add "$file" &&
290 test_tick &&
291 git commit -m "$1" &&
292 git tag "$1"
293}
294
295# Call test_merge with the arguments "<message> <commit>", where <commit>
296# can be a tag pointing to the commit-to-merge.
297
298test_merge () {
299 test_tick &&
300 git merge -m "$1" "$2" &&
301 git tag "$1"
302}
303
1f553918
JS
304# This function helps systems where core.filemode=false is set.
305# Use it instead of plain 'chmod +x' to set or unset the executable bit
306# of a file in the working directory and add it to the index.
307
308test_chmod () {
309 chmod "$@" &&
310 git update-index --add "--chmod=$@"
311}
312
a7bb3940
JS
313# Use test_set_prereq to tell that a particular prerequisite is available.
314# The prerequisite can later be checked for in two ways:
315#
316# - Explicitly using test_have_prereq.
317#
318# - Implicitly by specifying the prerequisite tag in the calls to
319# test_expect_{success,failure,code}.
320#
321# The single parameter is the prerequisite tag (a simple word, in all
322# capital letters by convention).
323
324test_set_prereq () {
325 satisfied="$satisfied$1 "
326}
327satisfied=" "
328
329test_have_prereq () {
330 case $satisfied in
331 *" $1 "*)
332 : yes, have it ;;
333 *)
334 ! : nope ;;
335 esac
336}
337
886856ab
JH
338# You are not expected to call test_ok_ and test_failure_ directly, use
339# the text_expect_* functions instead.
340
341test_ok_ () {
d5d9de1b 342 test_success=$(($test_success + 1))
55db1df0 343 say_color "" " ok $test_count: $@"
e1970ce4
JH
344}
345
886856ab 346test_failure_ () {
d5d9de1b 347 test_failure=$(($test_failure + 1))
55db1df0 348 say_color error "FAIL $test_count: $1"
bf0dd8a8
JH
349 shift
350 echo "$@" | sed -e 's/^/ /'
6e7b5aaf 351 test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
886856ab
JH
352}
353
41ac414e 354test_known_broken_ok_ () {
41ac414e
JH
355 test_fixed=$(($test_fixed+1))
356 say_color "" " FIXED $test_count: $@"
357}
358
359test_known_broken_failure_ () {
41ac414e
JH
360 test_broken=$(($test_broken+1))
361 say_color skip " still broken $test_count: $@"
362}
886856ab
JH
363
364test_debug () {
8e832ebc 365 test "$debug" = "" || eval "$1"
e1970ce4
JH
366}
367
4d9d62fa 368test_run_ () {
3bf78867 369 test_cleanup='eval_ret=$?'
4d9d62fa 370 eval >&3 2>&4 "$1"
3bf78867 371 eval >&3 2>&4 "$test_cleanup"
4d9d62fa
PR
372 return 0
373}
374
04ece593 375test_skip () {
8586f98b 376 test_count=$(($test_count+1))
04ece593
JH
377 to_skip=
378 for skp in $GIT_SKIP_TESTS
379 do
8586f98b 380 case $this_test.$test_count in
04ece593
JH
381 $skp)
382 to_skip=t
383 esac
384 done
a7bb3940
JS
385 if test -z "$to_skip" && test -n "$prereq" &&
386 ! test_have_prereq "$prereq"
387 then
388 to_skip=t
389 fi
04ece593
JH
390 case "$to_skip" in
391 t)
55db1df0 392 say_color skip >&3 "skipping test: $@"
55db1df0 393 say_color skip "skip $test_count: $1"
04ece593
JH
394 : true
395 ;;
396 *)
397 false
398 ;;
399 esac
400}
401
e1970ce4 402test_expect_failure () {
a7bb3940 403 test "$#" = 3 && { prereq=$1; shift; } || prereq=
8e832ebc 404 test "$#" = 2 ||
a7bb3940 405 error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
04ece593 406 if ! test_skip "$@"
e1970ce4 407 then
41ac414e 408 say >&3 "checking known breakage: $2"
04ece593 409 test_run_ "$2"
41ac414e 410 if [ "$?" = 0 -a "$eval_ret" = 0 ]
04ece593 411 then
41ac414e 412 test_known_broken_ok_ "$1"
04ece593 413 else
6e7b5aaf 414 test_known_broken_failure_ "$1"
04ece593 415 fi
e1970ce4 416 fi
7a0cf2d0 417 echo >&3 ""
e1970ce4
JH
418}
419
420test_expect_success () {
a7bb3940 421 test "$#" = 3 && { prereq=$1; shift; } || prereq=
8e832ebc 422 test "$#" = 2 ||
a7bb3940 423 error "bug in the test script: not 2 or 3 parameters to test-expect-success"
04ece593 424 if ! test_skip "$@"
e1970ce4 425 then
04ece593
JH
426 say >&3 "expecting success: $2"
427 test_run_ "$2"
428 if [ "$?" = 0 -a "$eval_ret" = 0 ]
429 then
430 test_ok_ "$1"
431 else
432 test_failure_ "$@"
433 fi
e1970ce4 434 fi
7a0cf2d0 435 echo >&3 ""
e1970ce4
JH
436}
437
d3bfdb75 438test_expect_code () {
a7bb3940 439 test "$#" = 4 && { prereq=$1; shift; } || prereq=
d3bfdb75 440 test "$#" = 3 ||
a7bb3940 441 error "bug in the test script: not 3 or 4 parameters to test-expect-code"
04ece593 442 if ! test_skip "$@"
d3bfdb75 443 then
04ece593
JH
444 say >&3 "expecting exit code $1: $3"
445 test_run_ "$3"
446 if [ "$?" = 0 -a "$eval_ret" = "$1" ]
447 then
448 test_ok_ "$2"
449 else
450 test_failure_ "$@"
451 fi
d3bfdb75 452 fi
7a0cf2d0 453 echo >&3 ""
d3bfdb75
FK
454}
455
fb32c410
LW
456# test_external runs external test scripts that provide continuous
457# test output about their progress, and succeeds/fails on
458# zero/non-zero exit code. It outputs the test output on stdout even
459# in non-verbose mode, and announces the external script with "* run
460# <n>: ..." before running it. When providing relative paths, keep in
461# mind that all scripts run in "trash directory".
462# Usage: test_external description command arguments...
463# Example: test_external 'Perl API' perl ../path/to/test.pl
464test_external () {
a7bb3940
JS
465 test "$#" = 4 && { prereq=$1; shift; } || prereq=
466 test "$#" = 3 ||
467 error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
fb32c410
LW
468 descr="$1"
469 shift
470 if ! test_skip "$descr" "$@"
471 then
472 # Announce the script to reduce confusion about the
473 # test output that follows.
8586f98b 474 say_color "" " run $test_count: $descr ($*)"
fb32c410
LW
475 # Run command; redirect its stderr to &4 as in
476 # test_run_, but keep its stdout on our stdout even in
477 # non-verbose mode.
478 "$@" 2>&4
479 if [ "$?" = 0 ]
480 then
481 test_ok_ "$descr"
482 else
483 test_failure_ "$descr" "$@"
484 fi
485 fi
486}
487
488# Like test_external, but in addition tests that the command generated
489# no output on stderr.
490test_external_without_stderr () {
491 # The temporary file has no (and must have no) security
492 # implications.
493 tmp="$TMPDIR"; if [ -z "$tmp" ]; then tmp=/tmp; fi
494 stderr="$tmp/git-external-stderr.$$.tmp"
495 test_external "$@" 4> "$stderr"
496 [ -f "$stderr" ] || error "Internal error: $stderr disappeared."
497 descr="no stderr: $1"
498 shift
499 say >&3 "expecting no stderr from previous command"
500 if [ ! -s "$stderr" ]; then
501 rm "$stderr"
502 test_ok_ "$descr"
503 else
504 if [ "$verbose" = t ]; then
505 output=`echo; echo Stderr is:; cat "$stderr"`
506 else
507 output=
508 fi
509 # rm first in case test_failure exits.
510 rm "$stderr"
511 test_failure_ "$descr" "$@" "$output"
512 fi
513}
514
74359821
JH
515# This is not among top-level (test_expect_success | test_expect_failure)
516# but is a prefix that can be used in the test script, like:
517#
518# test_expect_success 'complain and die' '
519# do something &&
520# do something else &&
521# test_must_fail git checkout ../outerspace
522# '
523#
524# Writing this as "! git checkout ../outerspace" is wrong, because
525# the failure could be due to a segv. We want a controlled failure.
526
527test_must_fail () {
528 "$@"
5a269730 529 test $? -gt 0 -a $? -le 129 -o $? -gt 192
74359821
JH
530}
531
82ebb0b6
JK
532# test_cmp is a helper function to compare actual and expected output.
533# You can use it like:
534#
535# test_expect_success 'foo works' '
536# echo expected >expected &&
537# foo >actual &&
538# test_cmp expected actual
539# '
540#
541# This could be written as either "cmp" or "diff -u", but:
542# - cmp's output is not nearly as easy to read as diff -u
543# - not all diff versions understand "-u"
544
545test_cmp() {
546 $GIT_TEST_CMP "$@"
547}
548
3bf78867
JN
549# This function can be used to schedule some commands to be run
550# unconditionally at the end of the test to restore sanity:
551#
552# test_expect_success 'test core.capslock' '
553# git config core.capslock true &&
554# test_when_finished "git config --unset core.capslock" &&
555# hello world
556# '
557#
558# That would be roughly equivalent to
559#
560# test_expect_success 'test core.capslock' '
561# git config core.capslock true &&
562# hello world
563# git config --unset core.capslock
564# '
565#
566# except that the greeting and config --unset must both succeed for
567# the test to pass.
568
569test_when_finished () {
570 test_cleanup="eval_ret=\$?; { $*
571 } && (exit \"\$eval_ret\"); $test_cleanup"
572}
573
0509eb21 574# Most tests can use the created repository, but some may need to create more.
eedf8f97
CW
575# Usage: test_create_repo <directory>
576test_create_repo () {
577 test "$#" = 1 ||
578 error "bug in the test script: not 1 parameter to test-create-repo"
579 owd=`pwd`
580 repo="$1"
bfdbee98 581 mkdir -p "$repo"
eedf8f97 582 cd "$repo" || error "Cannot setup test environment"
3a048328 583 "$GIT_EXEC_PATH/git-init" "--template=$TEST_DIRECTORY/../templates/blt/" >&3 2>&4 ||
5c94f87e 584 error "cannot run git init -- have you built things yet?"
eedf8f97
CW
585 mv .git/hooks .git/hooks-disabled
586 cd "$owd"
587}
a6080a0a 588
e1970ce4 589test_done () {
6e7b5aaf 590 GIT_EXIT_OK=t
2d84e9fb
SR
591 test_results_dir="$TEST_DIRECTORY/test-results"
592 mkdir -p "$test_results_dir"
bba2a7b2 593 test_results_path="$test_results_dir/${0%.sh}-$$"
2d84e9fb
SR
594
595 echo "total $test_count" >> $test_results_path
596 echo "success $test_success" >> $test_results_path
597 echo "fixed $test_fixed" >> $test_results_path
598 echo "broken $test_broken" >> $test_results_path
599 echo "failed $test_failure" >> $test_results_path
600 echo "" >> $test_results_path
41ac414e
JH
601
602 if test "$test_fixed" != 0
603 then
604 say_color pass "fixed $test_fixed known breakage(s)"
605 fi
606 if test "$test_broken" != 0
607 then
608 say_color error "still have $test_broken known breakage(s)"
11d54b8b
JH
609 msg="remaining $(($test_count-$test_broken)) test(s)"
610 else
611 msg="$test_count test(s)"
41ac414e 612 fi
e1970ce4 613 case "$test_failure" in
10b94e28 614 0)
11d54b8b 615 say_color pass "passed all $msg"
abc5d372
JS
616
617 test -d "$remove_trash" &&
618 cd "$(dirname "$remove_trash")" &&
619 rm -rf "$(basename "$remove_trash")"
620
e1970ce4
JH
621 exit 0 ;;
622
623 *)
11d54b8b 624 say_color error "failed $test_failure among $msg"
e1970ce4
JH
625 exit 1 ;;
626
627 esac
628}
629
630# Test the binaries we have just built. The tests are kept in
9adefee5 631# t/ subdirectory and are run in 'trash directory' subdirectory.
2d84e9fb 632TEST_DIRECTORY=$(pwd)
e4597aae 633if test -n "$valgrind"
4e1be63c 634then
4e1be63c
JS
635 make_symlink () {
636 test -h "$2" &&
637 test "$1" = "$(readlink "$2")" || {
638 # be super paranoid
639 if mkdir "$2".lock
640 then
641 rm -f "$2" &&
642 ln -s "$1" "$2" &&
643 rm -r "$2".lock
644 else
645 while test -d "$2".lock
646 do
647 say "Waiting for lock on $2."
648 sleep 1
649 done
650 fi
651 }
652 }
653
654 make_valgrind_symlink () {
655 # handle only executables
656 test -x "$1" || return
657
658 base=$(basename "$1")
659 symlink_target=$TEST_DIRECTORY/../$base
660 # do not override scripts
661 if test -x "$symlink_target" &&
662 test ! -d "$symlink_target" &&
663 test "#!" != "$(head -c 2 < "$symlink_target")"
664 then
665 symlink_target=../valgrind.sh
666 fi
efd92ffd
JS
667 case "$base" in
668 *.sh|*.perl)
669 symlink_target=../unprocessed-script
670 esac
4e1be63c
JS
671 # create the link, or replace it if it is out of date
672 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
673 }
674
675 # override all git executables in TEST_DIRECTORY/..
676 GIT_VALGRIND=$TEST_DIRECTORY/valgrind
677 mkdir -p "$GIT_VALGRIND"/bin
678 for file in $TEST_DIRECTORY/../git* $TEST_DIRECTORY/../test-*
679 do
680 make_valgrind_symlink $file
681 done
efd92ffd
JS
682 OLDIFS=$IFS
683 IFS=:
684 for path in $PATH
685 do
686 ls "$path"/git-* 2> /dev/null |
687 while read file
688 do
689 make_valgrind_symlink "$file"
690 done
691 done
692 IFS=$OLDIFS
4e1be63c
JS
693 PATH=$GIT_VALGRIND/bin:$PATH
694 GIT_EXEC_PATH=$GIT_VALGRIND/bin
695 export GIT_VALGRIND
e4597aae
MO
696elif test -n "$GIT_TEST_INSTALLED" ; then
697 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) ||
698 error "Cannot run git from $GIT_TEST_INSTALLED."
699 PATH=$GIT_TEST_INSTALLED:$TEST_DIRECTORY/..:$PATH
700 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
701else # normal case, use ../bin-wrappers only unless $with_dashes:
702 git_bin_dir="$TEST_DIRECTORY/../bin-wrappers"
703 if ! test -x "$git_bin_dir/git" ; then
704 if test -z "$with_dashes" ; then
705 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
706 fi
707 with_dashes=t
708 fi
709 PATH="$git_bin_dir:$PATH"
710 GIT_EXEC_PATH=$TEST_DIRECTORY/..
711 if test -n "$with_dashes" ; then
712 PATH="$TEST_DIRECTORY/..:$PATH"
713 fi
4e1be63c 714fi
8683a45d 715GIT_TEMPLATE_DIR=$(pwd)/../templates/blt
8bfa6bd6 716unset GIT_CONFIG
8bfa6bd6
JK
717GIT_CONFIG_NOSYSTEM=1
718GIT_CONFIG_NOGLOBAL=1
719export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_CONFIG_NOGLOBAL
49ccb087 720
ac10a857
JK
721. ../GIT-BUILD-OPTIONS
722
6fcca938
PB
723GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git
724export GITPERLLIB
eea42069
JH
725test -d ../templates/blt || {
726 error "You haven't built things yet, have you?"
727}
e1970ce4 728
ac10a857 729if test -z "$GIT_TEST_INSTALLED" && test -z "$NO_PYTHON"
2fe40b63
SR
730then
731 GITPYTHONLIB="$(pwd)/../git_remote_helpers/build/lib"
732 export GITPYTHONLIB
733 test -d ../git_remote_helpers/build || {
734 error "You haven't built git_remote_helpers yet, have you?"
735 }
736fi
737
56cf9806
EW
738if ! test -x ../test-chmtime; then
739 echo >&2 'You need to build test-chmtime:'
740 echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
741 exit 1
742fi
743
e1970ce4 744# Test repository
abc5d372 745test="trash directory.$(basename "$0" .sh)"
f423ef5f
JK
746test -n "$root" && test="$root/$test"
747case "$test" in
748/*) TRASH_DIRECTORY="$test" ;;
749 *) TRASH_DIRECTORY="$TEST_DIRECTORY/$test" ;;
750esac
91c8b825 751test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
8d14ac94 752rm -fr "$test" || {
6e7b5aaf 753 GIT_EXIT_OK=t
8d14ac94
JH
754 echo >&5 "FATAL: Cannot prepare test area"
755 exit 1
756}
757
4a7aaccd 758test_create_repo "$test"
1bd9c648
LW
759# Use -P to resolve symlinks in our working directory so that the cwd
760# in subprocesses like git equals our $PWD (for pathname comparisons).
761cd -P "$test" || exit 1
04ece593 762
d5d9de1b
JS
763this_test=${0##*/}
764this_test=${this_test%%-*}
04ece593
JH
765for skp in $GIT_SKIP_TESTS
766do
767 to_skip=
768 for skp in $GIT_SKIP_TESTS
769 do
770 case "$this_test" in
771 $skp)
772 to_skip=t
773 esac
774 done
775 case "$to_skip" in
776 t)
55db1df0
PH
777 say_color skip >&3 "skipping test $this_test altogether"
778 say_color skip "skip all tests in $this_test"
04ece593
JH
779 test_done
780 esac
781done
f17e9fbb 782
8648732e
BC
783# Provide an implementation of the 'yes' utility
784yes () {
785 if test $# = 0
786 then
787 y=y
788 else
789 y="$*"
790 fi
791
792 while echo "$y"
793 do
794 :
795 done
796}
797
f17e9fbb
JS
798# Fix some commands on Windows
799case $(uname -s) in
800*MINGW*)
801 # Windows has its own (incompatible) sort and find
802 sort () {
803 /usr/bin/sort "$@"
804 }
805 find () {
806 /usr/bin/find "$@"
807 }
5397ea31
JS
808 sum () {
809 md5sum "$@"
810 }
4114156a
JS
811 # git sees Windows-style pwd
812 pwd () {
813 builtin pwd -W
814 }
ee9fb68c 815 # no POSIX permissions
6fd1106a 816 # backslashes in pathspec are converted to '/'
fb9a2bea 817 # exec does not inherit the PID
ee9fb68c
JS
818 ;;
819*)
820 test_set_prereq POSIXPERM
6fd1106a 821 test_set_prereq BSLASHPSPEC
fb9a2bea 822 test_set_prereq EXECKEEPSPID
f17e9fbb
JS
823 ;;
824esac
704a3143 825
1b19ccd2 826test -z "$NO_PERL" && test_set_prereq PERL
d4e1b47a 827test -z "$NO_PYTHON" && test_set_prereq PYTHON
1b19ccd2 828
704a3143
JS
829# test whether the filesystem supports symbolic links
830ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS
831rm -f y