Always clean the build directory before installing for running the tests.
Otherwise tests might run an old version, when e.g. commands.py.orig is
moved back after a revert (old timestamp).
#!/bin/sh -e
#
# environment variables:
#
# TEST_COVERAGE - set non-empty if you want to print test coverage report
# COVERAGE_STDLIB - set non-empty to report coverage of standard library
LANG="C"; export LANG
LC_CTYPE="C"; export LC_CTYPE
LC_NUMERIC="C"; export LC_NUMERIC
LC_TIME="C"; export LC_TIME
LC_COLLATE="C"; export LC_COLLATE
LC_MONETARY="C"; export LC_MONETARY
LC_MESSAGES="C"; export LC_MESSAGES
LC_PAPER="C"; export LC_PAPER
LC_NAME="C"; export LC_NAME
LC_ADDRESS="C"; export LC_ADDRESS
LC_TELEPHONE="C"; export LC_TELEPHONE
LC_MEASUREMENT="C"; export LC_MEASUREMENT
LC_IDENTIFICATION="C"; export LC_IDENTIFICATION
LC_ALL=""; export LC_ALL
TZ=GMT; export TZ
HGEDITOR=true; export HGEDITOR
HGMERGE=true; export HGMERGE
HGUSER="test"; export HGUSER
HGRCPATH=""; export HGRCPATH
OS=`uname`
case "$OS" in
HP-UX|SunOS)
DIFFOPTS=
;;
*)
DIFFOPTS=-u
;;
esac
if [ `echo -n HG` = "-n HG" ]
then
ECHO_N=echo
NNL="\c"
else
ECHO_N="echo -n"
NNL=
fi
umask 022
tests=0
failed=0
HGTMP=""
cleanup_exit() {
rm -rf "$HGTMP"
}
# Remove temporary files even if we get interrupted
trap "cleanup_exit" 0 # normal exit
trap "exit 255" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
HGTMP="${TMPDIR-/tmp}/hgtests.$RANDOM.$RANDOM.$RANDOM.$$"
(umask 077 && mkdir "$HGTMP") || {
echo "Could not create temporary directory! Exiting." 1>&2
exit 1
}
TESTDIR="`pwd`"
export TESTDIR
INST="$HGTMP/install"
PYTHONDIR="$INST/lib/python"
cd ..
if ${PYTHON-python} setup.py clean --all install --force --home="$INST" \
--install-lib="$PYTHONDIR" > tests/install.err 2>&1
then
rm tests/install.err
else
cat tests/install.err
exit 1
fi
cd "$TESTDIR"
BINDIR="$INST/bin"; export BINDIR
if [ -n "$TEST_COVERAGE" ]; then
COVERAGE_FILE="$TESTDIR/.coverage"; export COVERAGE_FILE
rm -f "$COVERAGE_FILE"
mv "$BINDIR/hg" "$BINDIR/hg.py"
{
echo '#!/bin/sh'
echo "exec \"${PYTHON-python}\" \"$TESTDIR/coverage.py\"" \
"-x \"$BINDIR/hg.py\" \"\$@\""
} > "$BINDIR/hg"
chmod 700 "$BINDIR/hg"
fi
PATH="$BINDIR:$PATH"; export PATH
if [ -n "$PYTHON" ]; then
{
echo "#!/bin/sh"
echo "exec \"$PYTHON"'" "$@"'
} > "$BINDIR/python"
chmod 755 "$BINDIR/python"
fi
PYTHONPATH="$PYTHONDIR"; export PYTHONPATH
run_one() {
rm -f "$1.err"
mkdir "$HGTMP/$1"
cd "$HGTMP/$1"
fail=0
HOME="$HGTMP/$1"; export HOME
OUT="$HGTMP/$1.out"
OUTOK="$TESTDIR/$1.out"
ERR="$TESTDIR/$1.err"
if "$TESTDIR/$1" > "$OUT" 2>&1; then
: no error
else
echo "$1 failed with error code $?"
fail=1
fi
if [ -s "$OUT" -a ! -s "$OUTOK" ] ; then
cp "$OUT" "$ERR"
echo
echo "$1 generated unexpected output:"
cat "$ERR"
fail=1
elif [ -r "$OUTOK" ]; then
if diff $DIFFOPTS "$OUTOK" "$OUT" > /dev/null; then
: no differences
else
cp "$OUT" "$ERR"
echo
echo "$1 output changed:"
diff $DIFFOPTS "$OUTOK" "$ERR" || true
fail=1
fi
fi
cd "$TESTDIR"
rm -f "$HGTMP/$1.out"
rm -rf "$HGTMP/$1"
return $fail
}
# list of prerequisite programs
# stuff from coreutils (cat, rm, etc) are not tested
prereqs="python merge diff grep unzip gunzip bunzip2 sed"
missing=''
for pre in $prereqs ; do
if type $pre > /dev/null 2>&1 ; then
: prereq exists
else
missing="$pre $missing"
fi
done
if [ "$missing" != '' ] ; then
echo "ERROR: the test suite needs some programs to execute correctly."
echo "The following programs are missing: "
for pre in $missing; do
echo " $pre"
done
exit 1
fi
TESTS="$*"
if [ -z "$TESTS" ] ; then
TESTS=`ls test-* | grep -v "[.~]"`
fi
for f in $TESTS ; do
$ECHO_N ".${NNL}"
run_one $f || failed=`expr $failed + 1`
tests=`expr $tests + 1`
done
echo
echo "Ran $tests tests, $failed failed."
if [ -n "$TEST_COVERAGE" ]; then
unset PYTHONPATH
$ECHO_N "$BINDIR,$TESTDIR,$HGTMP/test-," > "$HGTMP/omit"
if [ -z "$COVERAGE_STDLIB" ]; then
"${PYTHON-python}" -c 'import sys; print ",".join(sys.path)' \
>> "$HGTMP/omit"
fi
cd "$PYTHONDIR"
"${PYTHON-python}" "$TESTDIR/coverage.py" -r --omit="`cat \"$HGTMP/omit\"`"
fi
if [ $failed -gt 0 ] ; then
exit 1
fi
exit 0