view tests/run-tests @ 1031:503aaf19a040

Rewrite log command. New version is faster and more featureful. The original implementation of log walked backwards through history, which had terrible behaviour. It took several minutes to view complete kernel change history on a fast machine, for example. The rewrite uses a windowed approach to walk hunks of history forwards, while still giving results in reverse order. This reduces run time from five minutes to five seconds on my system. In addition, the rewrite uses our normal name handling mechanisms, so you can run a command like "hg log net/ipv4/**.c" and get a useful answer. It optimises for three different cases (no arguments, only files, and anything goes), so it performs well in all circumstances I've tested.
author Bryan O'Sullivan <bos@serpentine.com>
date Wed, 24 Aug 2005 12:39:10 -0700
parents 5a034646e472
children 8ab1c07d4e0b
line wrap: on
line source

#!/bin/sh -e

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

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"

if [ -d /usr/lib64 ]; then
    lib=lib64
else
    lib=lib
fi

INST="$HGTMP/install"
cd ..
if ${PYTHON-python} setup.py install --home="$INST" > tests/install.err 2>&1
then
    rm tests/install.err
else
    cat tests/install.err
    exit 1
fi
cd "$TESTDIR"

PATH="$INST/bin:$PATH"; export PATH
PYTHONPATH="$INST/$lib/python"; 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
}

TESTS="$*"
if [ -z "$TESTS" ] ; then
    TESTS=`ls test-* | grep -v "[.~]"`
fi

for f in $TESTS ; do
    echo -n "."
    run_one $f || failed=`expr $failed + 1`
    tests=`expr $tests + 1`
done

echo
echo "Ran $tests tests, $failed failed."

if [ $failed -gt 0 ] ; then
    exit 1
fi
exit 0