blob: 285bfd89433461e62051e2bfd45e8b7e83638c0c [file] [log] [blame]
Junio C Hamanoe1970ce2005-05-13 22:50:32 -07001#!/bin/sh
2#
3# Copyright (c) 2005 Junio C Hamano
4#
Michal Sojka64b90322010-04-16 15:53:59 +02005# 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/ .
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070017
Johannes Schindelin44138552009-02-04 00:26:12 +010018# 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 ;;
Johannes Schindelin3da93652009-02-04 00:26:26 +010024*' --tee '*|*' --va'*)
Johannes Schindelin44138552009-02-04 00:26:12 +010025 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
Junio C Hamanoc2116a12008-03-06 19:04:26 -080034# Keep the original TERM for say_color
35ORIGINAL_TERM=$TERM
36
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070037# For repeatability, reset the environment to known value.
38LANG=C
Junio C Hamano899460f2005-10-09 21:58:02 -070039LC_ALL=C
Pavel Roskind9bdd392005-08-10 22:10:01 -040040PAGER=cat
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070041TZ=UTC
Junio C Hamanoc2116a12008-03-06 19:04:26 -080042TERM=dumb
43export LANG LC_ALL PAGER TERM TZ
Eric Wong8ff99e72006-07-11 12:01:54 -070044EDITOR=:
Jonathan Niederd33738d2009-11-11 17:56:07 -060045unset VISUAL
Junio C Hamano18508c32007-07-30 22:16:40 -070046unset GIT_EDITOR
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070047unset AUTHOR_DATE
48unset AUTHOR_EMAIL
49unset AUTHOR_NAME
50unset COMMIT_AUTHOR_EMAIL
51unset COMMIT_AUTHOR_NAME
Josh Triplett28a94f82007-04-28 18:40:28 -070052unset EMAIL
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070053unset GIT_ALTERNATE_OBJECT_DIRECTORIES
54unset GIT_AUTHOR_DATE
Junio C Hamano29e55cd2006-02-10 19:11:23 -080055GIT_AUTHOR_EMAIL=author@example.com
56GIT_AUTHOR_NAME='A U Thor'
Junio C Hamano6677c462005-12-15 12:54:00 -080057unset GIT_COMMITTER_DATE
Junio C Hamano29e55cd2006-02-10 19:11:23 -080058GIT_COMMITTER_EMAIL=committer@example.com
59GIT_COMMITTER_NAME='C O Mitter'
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070060unset GIT_DIFF_OPTS
61unset GIT_DIR
Matthias Lederhofer892c41b2007-06-06 09:10:42 +020062unset GIT_WORK_TREE
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070063unset GIT_EXTERNAL_DIFF
64unset GIT_INDEX_FILE
65unset GIT_OBJECT_DIRECTORY
David Reiss0454dd92008-05-19 23:49:26 -070066unset GIT_CEILING_DIRECTORIES
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070067unset SHA1_FILE_DIRECTORIES
68unset SHA1_FILE_DIRECTORY
Thomas Rast6ceeaee2010-03-12 18:04:25 +010069unset GIT_NOTES_REF
Thomas Rast894a9d32010-03-12 18:04:26 +010070unset GIT_NOTES_DISPLAY_REF
Thomas Rast6956f852010-03-12 18:04:32 +010071unset GIT_NOTES_REWRITE_REF
72unset GIT_NOTES_REWRITE_MODE
Shawn O. Pearce8d0fc482007-02-04 00:45:47 -050073GIT_MERGE_VERBOSITY=5
74export GIT_MERGE_VERBOSITY
Junio C Hamano29e55cd2006-02-10 19:11:23 -080075export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
76export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
Jonathan Niederd33738d2009-11-11 17:56:07 -060077export EDITOR
Junio C Hamanoe1970ce2005-05-13 22:50:32 -070078
Junio C Hamano886a3902007-04-24 11:21:47 -070079# Protect ourselves from common misconfiguration to export
80# CDPATH into the environment
81unset CDPATH
82
Bert Wesarg5565f472009-11-18 17:15:19 +010083unset GREP_OPTIONS
84
Robin Rosenberg3d5c0cc2006-09-23 00:35:20 +020085case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
Christian Couder6ce4e612006-09-02 18:23:48 +020086 1|2|true)
87 echo "* warning: Some tests will not work if GIT_TRACE" \
88 "is set as to trace on STDERR ! *"
89 echo "* warning: Please set GIT_TRACE to something" \
90 "other than 1, 2 or true ! *"
91 ;;
92esac
93
Junio C Hamanocd3c0952009-09-20 11:10:14 -070094# Convenience
95#
96# A regexp to match 5 and 40 hexdigits
97_x05='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
98_x40="$_x05$_x05$_x05$_x05$_x05$_x05$_x05$_x05"
99
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700100# Each test should start with something like this, after copyright notices:
101#
102# test_description='Description of this test...
103# This test checks if command xyzzy does the right thing...
104# '
105# . ./test-lib.sh
Junio C Hamanoc2116a12008-03-06 19:04:26 -0800106[ "x$ORIGINAL_TERM" != "xdumb" ] && (
107 TERM=$ORIGINAL_TERM &&
108 export TERM &&
109 [ -t 1 ] &&
110 tput bold >/dev/null 2>&1 &&
111 tput setaf 1 >/dev/null 2>&1 &&
112 tput sgr0 >/dev/null 2>&1
113 ) &&
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200114 color=t
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700115
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700116while test "$#" -ne 0
117do
118 case "$1" in
119 -d|--d|--de|--deb|--debu|--debug)
120 debug=t; shift ;;
Junio C Hamano886856a2005-05-14 00:24:27 -0700121 -i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
122 immediate=t; shift ;;
Lea Wiemann5e2c08c2008-06-17 03:29:02 +0200123 -l|--l|--lo|--lon|--long|--long-|--long-t|--long-te|--long-tes|--long-test|--long-tests)
Junio C Hamano91e80b92009-02-18 11:17:27 -0800124 GIT_TEST_LONG=t; export GIT_TEST_LONG; shift ;;
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700125 -h|--h|--he|--hel|--help)
Michele Ballabio570f3222007-11-10 15:17:25 +0100126 help=t; shift ;;
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700127 -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
128 verbose=t; shift ;;
Pierre Habouzit1ece1272007-10-24 22:03:39 +0200129 -q|--q|--qu|--qui|--quie|--quiet)
Ævar Arnfjörð Bjarmason092c4332010-07-31 16:40:05 +0000130 # Ignore --quiet under a TAP::Harness. Saying how many tests
131 # passed without the ok/not ok details is always an error.
132 test -z "$HARNESS_ACTIVE" && quiet=t; shift ;;
Matthew Ogilviee4597aa2009-12-02 22:14:06 -0700133 --with-dashes)
134 with_dashes=t; shift ;;
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200135 --no-color)
Clemens Buchacherfaa4bc32008-02-27 20:28:45 +0100136 color=; shift ;;
Johannes Schindelin4e1be632009-02-04 00:25:59 +0100137 --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
Johannes Schindelin3da93652009-02-04 00:26:26 +0100138 valgrind=t; verbose=t; shift ;;
Johannes Schindelin44138552009-02-04 00:26:12 +0100139 --tee)
140 shift ;; # was handled already
Jeff Kingf423ef52009-08-09 04:39:45 -0400141 --root=*)
142 root=$(expr "z$1" : 'z[^=]*=\(.*\)')
143 shift ;;
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700144 *)
Clemens Buchacher1f729dc2009-06-01 14:14:40 +0200145 echo "error: unknown test option '$1'" >&2; exit 1 ;;
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700146 esac
147done
148
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200149if test -n "$color"; then
150 say_color () {
Junio C Hamanoc2116a12008-03-06 19:04:26 -0800151 (
152 TERM=$ORIGINAL_TERM
153 export TERM
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200154 case "$1" in
155 error) tput bold; tput setaf 1;; # bold red
156 skip) tput bold; tput setaf 2;; # bold green
157 pass) tput setaf 2;; # green
158 info) tput setaf 3;; # brown
Pierre Habouzit1ece1272007-10-24 22:03:39 +0200159 *) test -n "$quiet" && return;;
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200160 esac
161 shift
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000162 printf "%s" "$*"
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200163 tput sgr0
Miklos Vajnab8eecaf2008-10-10 00:07:10 +0200164 echo
Junio C Hamanoc2116a12008-03-06 19:04:26 -0800165 )
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200166 }
167else
168 say_color() {
Pierre Habouzit1ece1272007-10-24 22:03:39 +0200169 test -z "$1" && test -n "$quiet" && return
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200170 shift
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000171 echo "$*"
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200172 }
173fi
174
175error () {
176 say_color error "error: $*"
Clemens Buchacher6e7b5aa2009-06-01 14:14:41 +0200177 GIT_EXIT_OK=t
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200178 exit 1
179}
180
181say () {
182 say_color info "$*"
183}
184
Michele Ballabio570f3222007-11-10 15:17:25 +0100185test "${test_description}" != "" ||
186error "Test script did not set test_description."
187
188if test "$help" = "t"
189then
190 echo "$test_description"
191 exit 0
192fi
193
Pavel Roskin4d9d62f2005-08-10 23:56:21 -0400194exec 5>&1
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700195if test "$verbose" = "t"
196then
197 exec 4>&2 3>&1
198else
199 exec 4>/dev/null 3>/dev/null
200fi
201
202test_failure=0
203test_count=0
Junio C Hamano41ac4142008-02-01 01:50:53 -0800204test_fixed=0
205test_broken=0
Sverre Rabbelier2d84e9f2008-06-08 16:04:33 +0200206test_success=0
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700207
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000208test_external_has_tap=0
209
Clemens Buchacherfaa4bc32008-02-27 20:28:45 +0100210die () {
Clemens Buchacher6e7b5aa2009-06-01 14:14:41 +0200211 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
Clemens Buchacherfaa4bc32008-02-27 20:28:45 +0100219}
220
Clemens Buchacher6e7b5aa2009-06-01 14:14:41 +0200221GIT_EXIT_OK=
Markus Heidelberg35641312009-01-20 00:43:26 +0100222trap 'die' EXIT
Pavel Roskin41184272005-08-11 12:00:40 -0400223
Bryan Donlan02b35662008-05-04 01:37:54 -0400224# 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
Lea Wiemann7b7b4512008-06-13 00:35:59 +0200232# that we're using.
Bryan Donlan02b35662008-05-04 01:37:54 -0400233test_set_editor () {
234 FAKE_EDITOR="$1"
235 export FAKE_EDITOR
Jonathan Niederd33738d2009-11-11 17:56:07 -0600236 EDITOR='"$FAKE_EDITOR"'
237 export EDITOR
Bryan Donlan02b35662008-05-04 01:37:54 -0400238}
239
Michael J Gruber68cfc6f2009-12-08 11:12:02 +0100240test_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
Stephen Boydc4f3f552010-01-25 16:33:57 -0800251q_to_nul () {
252 perl -pe 'y/Q/\000/'
253}
254
255q_to_cr () {
256 tr Q '\015'
257}
258
Jonathan Nieder800f1102010-07-23 12:03:07 -0500259q_to_tab () {
260 tr Q '\011'
261}
262
Stephen Boydc4f3f552010-01-25 16:33:57 -0800263append_cr () {
264 sed -e 's/$/Q/' | tr Q '\015'
265}
266
267remove_cr () {
268 tr '\015' Q | sed -e 's/Q$//'
269}
270
Junio C Hamano04509732006-12-29 02:25:04 -0800271test_tick () {
272 if test -z "${test_tick+set}"
273 then
Junio C Hamano21afc412007-01-06 02:16:07 -0800274 test_tick=1112911993
Junio C Hamano04509732006-12-29 02:25:04 -0800275 else
276 test_tick=$(($test_tick + 60))
277 fi
Junio C Hamano21afc412007-01-06 02:16:07 -0800278 GIT_COMMITTER_DATE="$test_tick -0700"
279 GIT_AUTHOR_DATE="$test_tick -0700"
Junio C Hamano04509732006-12-29 02:25:04 -0800280 export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
281}
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700282
Johannes Schindelin00884962009-01-27 23:34:48 +0100283# Call test_commit with the arguments "<message> [<file> [<contents>]]"
284#
285# This will commit a file with the given contents and the given commit
286# message. It will also add a tag with <message> as name.
287#
288# Both <file> and <contents> default to <message>.
289
290test_commit () {
Junio C Hamanoe656fc92009-02-03 21:46:33 -0800291 file=${2:-"$1.t"}
Johannes Schindelin00884962009-01-27 23:34:48 +0100292 echo "${3-$1}" > "$file" &&
293 git add "$file" &&
294 test_tick &&
295 git commit -m "$1" &&
296 git tag "$1"
297}
298
299# Call test_merge with the arguments "<message> <commit>", where <commit>
300# can be a tag pointing to the commit-to-merge.
301
302test_merge () {
303 test_tick &&
304 git merge -m "$1" "$2" &&
305 git tag "$1"
306}
307
Johannes Sixt1f553912009-02-28 21:12:57 +0100308# This function helps systems where core.filemode=false is set.
309# Use it instead of plain 'chmod +x' to set or unset the executable bit
310# of a file in the working directory and add it to the index.
311
312test_chmod () {
313 chmod "$@" &&
314 git update-index --add "--chmod=$@"
315}
316
Johannes Sixta7bb3942009-03-01 21:04:46 +0100317# Use test_set_prereq to tell that a particular prerequisite is available.
318# The prerequisite can later be checked for in two ways:
319#
320# - Explicitly using test_have_prereq.
321#
322# - Implicitly by specifying the prerequisite tag in the calls to
323# test_expect_{success,failure,code}.
324#
325# The single parameter is the prerequisite tag (a simple word, in all
326# capital letters by convention).
327
328test_set_prereq () {
329 satisfied="$satisfied$1 "
330}
331satisfied=" "
332
333test_have_prereq () {
334 case $satisfied in
335 *" $1 "*)
336 : yes, have it ;;
337 *)
338 ! : nope ;;
339 esac
340}
341
Junio C Hamano886856a2005-05-14 00:24:27 -0700342# You are not expected to call test_ok_ and test_failure_ directly, use
343# the text_expect_* functions instead.
344
345test_ok_ () {
Johannes Sixtd5d9de12009-02-05 20:59:27 +0100346 test_success=$(($test_success + 1))
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000347 say_color "" "ok $test_count - $@"
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700348}
349
Junio C Hamano886856a2005-05-14 00:24:27 -0700350test_failure_ () {
Johannes Sixtd5d9de12009-02-05 20:59:27 +0100351 test_failure=$(($test_failure + 1))
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000352 say_color error "not ok - $test_count $1"
Junio C Hamanobf0dd8a2005-07-22 19:09:34 -0700353 shift
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000354 echo "$@" | sed -e 's/^/# /'
Clemens Buchacher6e7b5aa2009-06-01 14:14:41 +0200355 test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
Junio C Hamano886856a2005-05-14 00:24:27 -0700356}
357
Junio C Hamano41ac4142008-02-01 01:50:53 -0800358test_known_broken_ok_ () {
Junio C Hamano41ac4142008-02-01 01:50:53 -0800359 test_fixed=$(($test_fixed+1))
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000360 say_color "" "ok $test_count - $@ # TODO known breakage"
Junio C Hamano41ac4142008-02-01 01:50:53 -0800361}
362
363test_known_broken_failure_ () {
Junio C Hamano41ac4142008-02-01 01:50:53 -0800364 test_broken=$(($test_broken+1))
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000365 say_color skip "not ok $test_count - $@ # TODO known breakage"
Junio C Hamano41ac4142008-02-01 01:50:53 -0800366}
Junio C Hamano886856a2005-05-14 00:24:27 -0700367
368test_debug () {
Junio C Hamano8e832eb2005-08-10 22:53:27 -0700369 test "$debug" = "" || eval "$1"
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700370}
371
Pavel Roskin4d9d62f2005-08-10 23:56:21 -0400372test_run_ () {
Jonathan Niederb6b0afd2010-05-06 03:41:10 -0500373 test_cleanup=:
Pavel Roskin4d9d62f2005-08-10 23:56:21 -0400374 eval >&3 2>&4 "$1"
Jonathan Niederb6b0afd2010-05-06 03:41:10 -0500375 eval_ret=$?
Jonathan Nieder3bf78862010-05-02 03:53:41 -0500376 eval >&3 2>&4 "$test_cleanup"
Ævar Arnfjörð Bjarmason57e15382010-06-24 17:44:47 +0000377 if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then
378 echo ""
379 fi
Pavel Roskin4d9d62f2005-08-10 23:56:21 -0400380 return 0
381}
382
Junio C Hamano04ece592006-12-28 17:58:00 -0800383test_skip () {
Johannes Sixt8586f982009-02-05 21:20:56 +0100384 test_count=$(($test_count+1))
Junio C Hamano04ece592006-12-28 17:58:00 -0800385 to_skip=
386 for skp in $GIT_SKIP_TESTS
387 do
Johannes Sixt8586f982009-02-05 21:20:56 +0100388 case $this_test.$test_count in
Junio C Hamano04ece592006-12-28 17:58:00 -0800389 $skp)
390 to_skip=t
Michael J Gruber47e67d42010-07-12 12:32:18 +0200391 break
Junio C Hamano04ece592006-12-28 17:58:00 -0800392 esac
393 done
Johannes Sixta7bb3942009-03-01 21:04:46 +0100394 if test -z "$to_skip" && test -n "$prereq" &&
395 ! test_have_prereq "$prereq"
396 then
397 to_skip=t
398 fi
Junio C Hamano04ece592006-12-28 17:58:00 -0800399 case "$to_skip" in
400 t)
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200401 say_color skip >&3 "skipping test: $@"
Michael J Gruber637ab292010-07-12 12:33:49 +0200402 say_color skip "ok $test_count # skip $1"
Junio C Hamano04ece592006-12-28 17:58:00 -0800403 : true
404 ;;
405 *)
406 false
407 ;;
408 esac
409}
410
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700411test_expect_failure () {
Johannes Sixta7bb3942009-03-01 21:04:46 +0100412 test "$#" = 3 && { prereq=$1; shift; } || prereq=
Junio C Hamano8e832eb2005-08-10 22:53:27 -0700413 test "$#" = 2 ||
Johannes Sixta7bb3942009-03-01 21:04:46 +0100414 error "bug in the test script: not 2 or 3 parameters to test-expect-failure"
Junio C Hamano04ece592006-12-28 17:58:00 -0800415 if ! test_skip "$@"
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700416 then
Junio C Hamano41ac4142008-02-01 01:50:53 -0800417 say >&3 "checking known breakage: $2"
Junio C Hamano04ece592006-12-28 17:58:00 -0800418 test_run_ "$2"
Junio C Hamano41ac4142008-02-01 01:50:53 -0800419 if [ "$?" = 0 -a "$eval_ret" = 0 ]
Junio C Hamano04ece592006-12-28 17:58:00 -0800420 then
Junio C Hamano41ac4142008-02-01 01:50:53 -0800421 test_known_broken_ok_ "$1"
Junio C Hamano04ece592006-12-28 17:58:00 -0800422 else
Clemens Buchacher6e7b5aa2009-06-01 14:14:41 +0200423 test_known_broken_failure_ "$1"
Junio C Hamano04ece592006-12-28 17:58:00 -0800424 fi
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700425 fi
Martin Waitz7a0cf2d2006-10-07 21:27:46 +0200426 echo >&3 ""
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700427}
428
429test_expect_success () {
Johannes Sixta7bb3942009-03-01 21:04:46 +0100430 test "$#" = 3 && { prereq=$1; shift; } || prereq=
Junio C Hamano8e832eb2005-08-10 22:53:27 -0700431 test "$#" = 2 ||
Johannes Sixta7bb3942009-03-01 21:04:46 +0100432 error "bug in the test script: not 2 or 3 parameters to test-expect-success"
Junio C Hamano04ece592006-12-28 17:58:00 -0800433 if ! test_skip "$@"
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700434 then
Junio C Hamano04ece592006-12-28 17:58:00 -0800435 say >&3 "expecting success: $2"
436 test_run_ "$2"
437 if [ "$?" = 0 -a "$eval_ret" = 0 ]
438 then
439 test_ok_ "$1"
440 else
441 test_failure_ "$@"
442 fi
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700443 fi
Martin Waitz7a0cf2d2006-10-07 21:27:46 +0200444 echo >&3 ""
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700445}
446
Fredrik Kuivinend3bfdb72005-12-03 11:40:39 +0100447test_expect_code () {
Johannes Sixta7bb3942009-03-01 21:04:46 +0100448 test "$#" = 4 && { prereq=$1; shift; } || prereq=
Fredrik Kuivinend3bfdb72005-12-03 11:40:39 +0100449 test "$#" = 3 ||
Johannes Sixta7bb3942009-03-01 21:04:46 +0100450 error "bug in the test script: not 3 or 4 parameters to test-expect-code"
Junio C Hamano04ece592006-12-28 17:58:00 -0800451 if ! test_skip "$@"
Fredrik Kuivinend3bfdb72005-12-03 11:40:39 +0100452 then
Junio C Hamano04ece592006-12-28 17:58:00 -0800453 say >&3 "expecting exit code $1: $3"
454 test_run_ "$3"
455 if [ "$?" = 0 -a "$eval_ret" = "$1" ]
456 then
457 test_ok_ "$2"
458 else
459 test_failure_ "$@"
460 fi
Fredrik Kuivinend3bfdb72005-12-03 11:40:39 +0100461 fi
Martin Waitz7a0cf2d2006-10-07 21:27:46 +0200462 echo >&3 ""
Fredrik Kuivinend3bfdb72005-12-03 11:40:39 +0100463}
464
Lea Wiemannfb32c412008-06-19 20:18:03 +0200465# test_external runs external test scripts that provide continuous
466# test output about their progress, and succeeds/fails on
467# zero/non-zero exit code. It outputs the test output on stdout even
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000468# in non-verbose mode, and announces the external script with "# run
Lea Wiemannfb32c412008-06-19 20:18:03 +0200469# <n>: ..." before running it. When providing relative paths, keep in
470# mind that all scripts run in "trash directory".
471# Usage: test_external description command arguments...
472# Example: test_external 'Perl API' perl ../path/to/test.pl
473test_external () {
Johannes Sixta7bb3942009-03-01 21:04:46 +0100474 test "$#" = 4 && { prereq=$1; shift; } || prereq=
475 test "$#" = 3 ||
476 error >&5 "bug in the test script: not 3 or 4 parameters to test_external"
Lea Wiemannfb32c412008-06-19 20:18:03 +0200477 descr="$1"
478 shift
479 if ! test_skip "$descr" "$@"
480 then
481 # Announce the script to reduce confusion about the
482 # test output that follows.
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000483 say_color "" "# run $test_count: $descr ($*)"
Jakub Narebski5ae80302010-04-24 15:50:09 +0200484 # Export TEST_DIRECTORY, TRASH_DIRECTORY and GIT_TEST_LONG
485 # to be able to use them in script
486 export TEST_DIRECTORY TRASH_DIRECTORY GIT_TEST_LONG
Lea Wiemannfb32c412008-06-19 20:18:03 +0200487 # Run command; redirect its stderr to &4 as in
488 # test_run_, but keep its stdout on our stdout even in
489 # non-verbose mode.
490 "$@" 2>&4
491 if [ "$?" = 0 ]
492 then
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000493 if test $test_external_has_tap -eq 0; then
494 test_ok_ "$descr"
495 else
496 say_color "" "# test_external test $descr was ok"
497 test_success=$(($test_success + 1))
498 fi
Lea Wiemannfb32c412008-06-19 20:18:03 +0200499 else
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000500 if test $test_external_has_tap -eq 0; then
501 test_failure_ "$descr" "$@"
502 else
503 say_color error "# test_external test $descr failed: $@"
504 test_failure=$(($test_failure + 1))
505 fi
Lea Wiemannfb32c412008-06-19 20:18:03 +0200506 fi
507 fi
508}
509
510# Like test_external, but in addition tests that the command generated
511# no output on stderr.
512test_external_without_stderr () {
513 # The temporary file has no (and must have no) security
514 # implications.
515 tmp="$TMPDIR"; if [ -z "$tmp" ]; then tmp=/tmp; fi
516 stderr="$tmp/git-external-stderr.$$.tmp"
517 test_external "$@" 4> "$stderr"
518 [ -f "$stderr" ] || error "Internal error: $stderr disappeared."
519 descr="no stderr: $1"
520 shift
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000521 say >&3 "# expecting no stderr from previous command"
Lea Wiemannfb32c412008-06-19 20:18:03 +0200522 if [ ! -s "$stderr" ]; then
523 rm "$stderr"
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000524
525 if test $test_external_has_tap -eq 0; then
526 test_ok_ "$descr"
527 else
528 say_color "" "# test_external_without_stderr test $descr was ok"
529 test_success=$(($test_success + 1))
530 fi
Lea Wiemannfb32c412008-06-19 20:18:03 +0200531 else
532 if [ "$verbose" = t ]; then
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000533 output=`echo; echo "# Stderr is:"; cat "$stderr"`
Lea Wiemannfb32c412008-06-19 20:18:03 +0200534 else
535 output=
536 fi
537 # rm first in case test_failure exits.
538 rm "$stderr"
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000539 if test $test_external_has_tap -eq 0; then
540 test_failure_ "$descr" "$@" "$output"
541 else
542 say_color error "# test_external_without_stderr test $descr failed: $@: $output"
543 test_failure=$(($test_failure + 1))
544 fi
Lea Wiemannfb32c412008-06-19 20:18:03 +0200545 fi
546}
547
Matthieu Moy2caf20c2010-08-10 17:17:52 +0200548# debugging-friendly alternatives to "test [-f|-d|-e]"
549# The commands test the existence or non-existence of $1. $2 can be
550# given to provide a more precise diagnosis.
551test_path_is_file () {
552 if ! [ -f "$1" ]
553 then
554 echo "File $1 doesn't exist. $*"
555 false
556 fi
557}
558
559test_path_is_dir () {
560 if ! [ -d "$1" ]
561 then
562 echo "Directory $1 doesn't exist. $*"
563 false
564 fi
565}
566
567test_path_is_missing () {
568 if [ -e "$1" ]
569 then
570 echo "Path exists:"
571 ls -ld "$1"
572 if [ $# -ge 1 ]; then
573 echo "$*"
574 fi
575 false
576 fi
577}
578
579
Junio C Hamano74359822008-02-28 13:09:30 -0800580# This is not among top-level (test_expect_success | test_expect_failure)
581# but is a prefix that can be used in the test script, like:
582#
583# test_expect_success 'complain and die' '
584# do something &&
585# do something else &&
586# test_must_fail git checkout ../outerspace
587# '
588#
589# Writing this as "! git checkout ../outerspace" is wrong, because
590# the failure could be due to a segv. We want a controlled failure.
591
592test_must_fail () {
593 "$@"
Jeff King16034fb2010-08-31 11:56:36 -0400594 exit_code=$?
595 if test $exit_code = 0; then
596 echo >&2 "test_must_fail: command succeeded: $*"
597 return 1
598 elif test $exit_code -gt 129 -a $exit_code -le 192; then
599 echo >&2 "test_must_fail: died by signal: $*"
600 return 1
601 fi
602 return 0
Junio C Hamano74359822008-02-28 13:09:30 -0800603}
604
Jonathan Niederfdf1bc42010-04-14 19:38:07 -0500605# Similar to test_must_fail, but tolerates success, too. This is
606# meant to be used in contexts like:
607#
608# test_expect_success 'some command works without configuration' '
609# test_might_fail git config --unset all.configuration &&
610# do something
611# '
612#
613# Writing "git config --unset all.configuration || :" would be wrong,
614# because we want to notice if it fails due to segv.
615
616test_might_fail () {
617 "$@"
618 test $? -ge 0 -a $? -le 129 -o $? -gt 192
619}
620
Jeff King82ebb0b2008-03-12 17:36:36 -0400621# test_cmp is a helper function to compare actual and expected output.
622# You can use it like:
623#
624# test_expect_success 'foo works' '
625# echo expected >expected &&
626# foo >actual &&
627# test_cmp expected actual
628# '
629#
630# This could be written as either "cmp" or "diff -u", but:
631# - cmp's output is not nearly as easy to read as diff -u
632# - not all diff versions understand "-u"
633
634test_cmp() {
635 $GIT_TEST_CMP "$@"
636}
637
Jonathan Nieder3bf78862010-05-02 03:53:41 -0500638# This function can be used to schedule some commands to be run
639# unconditionally at the end of the test to restore sanity:
640#
641# test_expect_success 'test core.capslock' '
642# git config core.capslock true &&
643# test_when_finished "git config --unset core.capslock" &&
644# hello world
645# '
646#
647# That would be roughly equivalent to
648#
649# test_expect_success 'test core.capslock' '
650# git config core.capslock true &&
651# hello world
652# git config --unset core.capslock
653# '
654#
655# except that the greeting and config --unset must both succeed for
656# the test to pass.
657
658test_when_finished () {
Jonathan Niederb6b0afd2010-05-06 03:41:10 -0500659 test_cleanup="{ $*
660 } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup"
Jonathan Nieder3bf78862010-05-02 03:53:41 -0500661}
662
Michele Ballabio0509eb22008-01-31 22:59:11 +0100663# Most tests can use the created repository, but some may need to create more.
Carl Wortheedf8f92006-02-17 13:33:26 -0800664# Usage: test_create_repo <directory>
665test_create_repo () {
666 test "$#" = 1 ||
667 error "bug in the test script: not 1 parameter to test-create-repo"
668 owd=`pwd`
669 repo="$1"
Junio C Hamanobfdbee92008-08-08 02:26:28 -0700670 mkdir -p "$repo"
Carl Wortheedf8f92006-02-17 13:33:26 -0800671 cd "$repo" || error "Cannot setup test environment"
Michael J Gruber3a048322009-04-21 11:21:59 +0200672 "$GIT_EXEC_PATH/git-init" "--template=$TEST_DIRECTORY/../templates/blt/" >&3 2>&4 ||
Nicolas Pitre5c94f872007-01-12 16:01:46 -0500673 error "cannot run git init -- have you built things yet?"
Carl Wortheedf8f92006-02-17 13:33:26 -0800674 mv .git/hooks .git/hooks-disabled
675 cd "$owd"
676}
Junio C Hamanoa6080a02007-06-07 00:04:01 -0700677
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700678test_done () {
Clemens Buchacher6e7b5aa2009-06-01 14:14:41 +0200679 GIT_EXIT_OK=t
Sverre Rabbelier2d84e9f2008-06-08 16:04:33 +0200680 test_results_dir="$TEST_DIRECTORY/test-results"
681 mkdir -p "$test_results_dir"
Thomas Rast7ea3ddf2010-07-16 11:37:44 +0200682 test_results_path="$test_results_dir/${0%.sh}-$$.counts"
Sverre Rabbelier2d84e9f2008-06-08 16:04:33 +0200683
684 echo "total $test_count" >> $test_results_path
685 echo "success $test_success" >> $test_results_path
686 echo "fixed $test_fixed" >> $test_results_path
687 echo "broken $test_broken" >> $test_results_path
688 echo "failed $test_failure" >> $test_results_path
689 echo "" >> $test_results_path
Junio C Hamano41ac4142008-02-01 01:50:53 -0800690
691 if test "$test_fixed" != 0
692 then
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000693 say_color pass "# fixed $test_fixed known breakage(s)"
Junio C Hamano41ac4142008-02-01 01:50:53 -0800694 fi
695 if test "$test_broken" != 0
696 then
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000697 say_color error "# still have $test_broken known breakage(s)"
Junio C Hamano11d54b82008-02-03 00:23:02 -0800698 msg="remaining $(($test_count-$test_broken)) test(s)"
699 else
700 msg="$test_count test(s)"
Junio C Hamano41ac4142008-02-01 01:50:53 -0800701 fi
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700702 case "$test_failure" in
Junio C Hamano10b94e22005-12-09 17:32:18 -0800703 0)
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000704 # Maybe print SKIP message
705 [ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
706
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000707 if test $test_external_has_tap -eq 0; then
708 say_color pass "# passed all $msg"
709 say "1..$test_count$skip_all"
710 fi
Johannes Schindelinabc5d372008-08-08 13:08:37 +0200711
712 test -d "$remove_trash" &&
713 cd "$(dirname "$remove_trash")" &&
714 rm -rf "$(basename "$remove_trash")"
715
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700716 exit 0 ;;
717
718 *)
Ævar Arnfjörð Bjarmasond998bd42010-06-24 17:44:46 +0000719 if test $test_external_has_tap -eq 0; then
720 say_color error "# failed $test_failure among $msg"
721 say "1..$test_count"
722 fi
Ævar Arnfjörð Bjarmason5099b992010-06-24 21:52:12 +0000723
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700724 exit 1 ;;
725
726 esac
727}
728
729# Test the binaries we have just built. The tests are kept in
Jakub Narebski9adefee2008-06-14 20:14:12 +0200730# t/ subdirectory and are run in 'trash directory' subdirectory.
Sverre Rabbelier2d84e9f2008-06-08 16:04:33 +0200731TEST_DIRECTORY=$(pwd)
Matthew Ogilviee4597aa2009-12-02 22:14:06 -0700732if test -n "$valgrind"
Johannes Schindelin4e1be632009-02-04 00:25:59 +0100733then
Johannes Schindelin4e1be632009-02-04 00:25:59 +0100734 make_symlink () {
735 test -h "$2" &&
736 test "$1" = "$(readlink "$2")" || {
737 # be super paranoid
738 if mkdir "$2".lock
739 then
740 rm -f "$2" &&
741 ln -s "$1" "$2" &&
742 rm -r "$2".lock
743 else
744 while test -d "$2".lock
745 do
746 say "Waiting for lock on $2."
747 sleep 1
748 done
749 fi
750 }
751 }
752
753 make_valgrind_symlink () {
754 # handle only executables
755 test -x "$1" || return
756
757 base=$(basename "$1")
758 symlink_target=$TEST_DIRECTORY/../$base
759 # do not override scripts
760 if test -x "$symlink_target" &&
761 test ! -d "$symlink_target" &&
762 test "#!" != "$(head -c 2 < "$symlink_target")"
763 then
764 symlink_target=../valgrind.sh
765 fi
Johannes Schindelinefd92ff2009-02-04 00:26:08 +0100766 case "$base" in
767 *.sh|*.perl)
768 symlink_target=../unprocessed-script
769 esac
Johannes Schindelin4e1be632009-02-04 00:25:59 +0100770 # create the link, or replace it if it is out of date
771 make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
772 }
773
774 # override all git executables in TEST_DIRECTORY/..
775 GIT_VALGRIND=$TEST_DIRECTORY/valgrind
776 mkdir -p "$GIT_VALGRIND"/bin
777 for file in $TEST_DIRECTORY/../git* $TEST_DIRECTORY/../test-*
778 do
779 make_valgrind_symlink $file
780 done
Johannes Schindelinefd92ff2009-02-04 00:26:08 +0100781 OLDIFS=$IFS
782 IFS=:
783 for path in $PATH
784 do
785 ls "$path"/git-* 2> /dev/null |
786 while read file
787 do
788 make_valgrind_symlink "$file"
789 done
790 done
791 IFS=$OLDIFS
Johannes Schindelin4e1be632009-02-04 00:25:59 +0100792 PATH=$GIT_VALGRIND/bin:$PATH
793 GIT_EXEC_PATH=$GIT_VALGRIND/bin
794 export GIT_VALGRIND
Matthew Ogilviee4597aa2009-12-02 22:14:06 -0700795elif test -n "$GIT_TEST_INSTALLED" ; then
796 GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path) ||
797 error "Cannot run git from $GIT_TEST_INSTALLED."
798 PATH=$GIT_TEST_INSTALLED:$TEST_DIRECTORY/..:$PATH
799 GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
800else # normal case, use ../bin-wrappers only unless $with_dashes:
801 git_bin_dir="$TEST_DIRECTORY/../bin-wrappers"
802 if ! test -x "$git_bin_dir/git" ; then
803 if test -z "$with_dashes" ; then
804 say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
805 fi
806 with_dashes=t
807 fi
808 PATH="$git_bin_dir:$PATH"
809 GIT_EXEC_PATH=$TEST_DIRECTORY/..
810 if test -n "$with_dashes" ; then
811 PATH="$TEST_DIRECTORY/..:$PATH"
812 fi
Johannes Schindelin4e1be632009-02-04 00:25:59 +0100813fi
Johannes Schindelin8683a452006-12-19 09:18:09 +0100814GIT_TEMPLATE_DIR=$(pwd)/../templates/blt
Jeff King8bfa6bd2008-02-06 05:11:53 -0500815unset GIT_CONFIG
Jeff King8bfa6bd2008-02-06 05:11:53 -0500816GIT_CONFIG_NOSYSTEM=1
817GIT_CONFIG_NOGLOBAL=1
818export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_CONFIG_NOGLOBAL
Junio C Hamano49ccb082005-12-07 21:52:28 -0800819
Jeff Kingac10a852009-12-07 00:32:50 -0500820. ../GIT-BUILD-OPTIONS
821
Junio C Hamano5e87eae2010-06-11 09:40:25 -0700822if test -z "$GIT_TEST_CMP"
823then
824 if test -n "$GIT_TEST_CMP_USE_COPIED_CONTEXT"
825 then
826 GIT_TEST_CMP="$DIFF -c"
827 else
828 GIT_TEST_CMP="$DIFF -u"
829 fi
830fi
831
Petr Baudis6fcca932006-07-03 23:16:32 +0200832GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git
833export GITPERLLIB
Junio C Hamanoeea42062005-12-10 20:55:32 -0800834test -d ../templates/blt || {
835 error "You haven't built things yet, have you?"
836}
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700837
Jeff Kingac10a852009-12-07 00:32:50 -0500838if test -z "$GIT_TEST_INSTALLED" && test -z "$NO_PYTHON"
Sverre Rabbelier2fe40b62009-11-18 02:42:32 +0100839then
840 GITPYTHONLIB="$(pwd)/../git_remote_helpers/build/lib"
841 export GITPYTHONLIB
842 test -d ../git_remote_helpers/build || {
843 error "You haven't built git_remote_helpers yet, have you?"
844 }
845fi
846
Eric Wong56cf9802007-02-24 16:59:52 -0800847if ! test -x ../test-chmtime; then
848 echo >&2 'You need to build test-chmtime:'
849 echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
850 exit 1
851fi
852
Junio C Hamanoe1970ce2005-05-13 22:50:32 -0700853# Test repository
Johannes Schindelinabc5d372008-08-08 13:08:37 +0200854test="trash directory.$(basename "$0" .sh)"
Jeff Kingf423ef52009-08-09 04:39:45 -0400855test -n "$root" && test="$root/$test"
856case "$test" in
857/*) TRASH_DIRECTORY="$test" ;;
858 *) TRASH_DIRECTORY="$TEST_DIRECTORY/$test" ;;
859esac
Jeff King91c8b822009-08-09 04:38:11 -0400860test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
Junio C Hamano8d14ac92008-03-18 21:58:01 -0700861rm -fr "$test" || {
Clemens Buchacher6e7b5aa2009-06-01 14:14:41 +0200862 GIT_EXIT_OK=t
Junio C Hamano8d14ac92008-03-18 21:58:01 -0700863 echo >&5 "FATAL: Cannot prepare test area"
864 exit 1
865}
866
Bryan Donlan4a7aacc2008-05-04 01:38:00 -0400867test_create_repo "$test"
Lea Wiemann1bd9c642008-05-31 23:11:21 +0200868# Use -P to resolve symlinks in our working directory so that the cwd
869# in subprocesses like git equals our $PWD (for pathname comparisons).
870cd -P "$test" || exit 1
Junio C Hamano04ece592006-12-28 17:58:00 -0800871
Johannes Sixtd5d9de12009-02-05 20:59:27 +0100872this_test=${0##*/}
873this_test=${this_test%%-*}
Junio C Hamano04ece592006-12-28 17:58:00 -0800874for skp in $GIT_SKIP_TESTS
875do
Michael J Gruber47e67d42010-07-12 12:32:18 +0200876 case "$this_test" in
877 $skp)
Pierre Habouzit55db1df2007-10-24 22:03:38 +0200878 say_color skip >&3 "skipping test $this_test altogether"
Michael J Gruber637ab292010-07-12 12:33:49 +0200879 skip_all="skip all tests in $this_test"
Junio C Hamano04ece592006-12-28 17:58:00 -0800880 test_done
881 esac
882done
Johannes Sixtf17e9fb2009-03-11 21:17:26 +0100883
Brandon Casey86487322009-08-28 17:32:41 -0500884# Provide an implementation of the 'yes' utility
885yes () {
886 if test $# = 0
887 then
888 y=y
889 else
890 y="$*"
891 fi
892
893 while echo "$y"
894 do
895 :
896 done
897}
898
Johannes Sixtf17e9fb2009-03-11 21:17:26 +0100899# Fix some commands on Windows
900case $(uname -s) in
901*MINGW*)
902 # Windows has its own (incompatible) sort and find
903 sort () {
904 /usr/bin/sort "$@"
905 }
906 find () {
907 /usr/bin/find "$@"
908 }
Johannes Sixt5397ea32009-03-14 22:21:27 +0100909 sum () {
910 md5sum "$@"
911 }
Johannes Sixt41141562009-03-13 23:35:24 +0100912 # git sees Windows-style pwd
913 pwd () {
914 builtin pwd -W
915 }
Johannes Sixtee9fb682009-03-13 22:55:27 +0100916 # no POSIX permissions
Johannes Sixt6fd11062009-03-13 23:00:15 +0100917 # backslashes in pathspec are converted to '/'
Johannes Sixtfb9a2be2009-03-25 13:21:15 +0100918 # exec does not inherit the PID
Johannes Sixtee9fb682009-03-13 22:55:27 +0100919 ;;
920*)
921 test_set_prereq POSIXPERM
Johannes Sixt6fd11062009-03-13 23:00:15 +0100922 test_set_prereq BSLASHPSPEC
Johannes Sixtfb9a2be2009-03-25 13:21:15 +0100923 test_set_prereq EXECKEEPSPID
Johannes Sixtf17e9fb2009-03-11 21:17:26 +0100924 ;;
925esac
Johannes Sixt704a3142009-03-04 22:38:24 +0100926
Jeff King1b19ccd2009-04-03 15:33:59 -0400927test -z "$NO_PERL" && test_set_prereq PERL
Johan Herlandd4e1b472009-11-18 02:42:31 +0100928test -z "$NO_PYTHON" && test_set_prereq PYTHON
Jeff King1b19ccd2009-04-03 15:33:59 -0400929
Johannes Sixt704a3142009-03-04 22:38:24 +0100930# test whether the filesystem supports symbolic links
931ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS
932rm -f y