tests/run-tests
author mpm@selenic.com
Sun, 21 Aug 2005 21:59:55 -0700
changeset 990 5007e0bdeed2
parent 925 5a034646e472
child 1279 8ab1c07d4e0b
permissions -rwxr-xr-x
Fix long-standing excessive file merges Since switching to the multihead approach, we've been creating excessive file-level merges where files are marked as merged with their ancestors. This explicitly checks at commit time whether the two parent versions are linearly related, and if so, reduces the file check-in to a non-merge. Then the file is compared against the remaining parent, and, if equal, skips check-in of that file (as it's not changed). Since we're not checking in all files that were different between versions, we no longer need to mark so many files for merge. This removes most of the 'm' state marking as well. Finally, it is possible to do a tree-level merge with no file-level changes. This will happen if one user changes file A and another changes file B. Thus, if we have have two parents, we allow commit to proceed even if there are no file-level changes.

#!/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