#!/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 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 install --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 -u "$OUTOK" "$OUT" > /dev/null; then : no differences else cp "$OUT" "$ERR" echo echo "$1 output changed:" diff -u "$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