write_in_full: really write in full or return error on disk full.
[gitweb.git] / t / test-lib.sh
index e2629339d4b1c9acf8cdf002f8ac59ef736eacf3..72ea2b259875e209752022f63bd57f9ca83a0cc4 100755 (executable)
@@ -34,7 +34,7 @@ export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
 export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
 export EDITOR VISUAL
 
-case $(echo $GIT_TRACE |tr [A-Z] [a-z]) in
+case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
        1|2|true)
                echo "* warning: Some tests will not work if GIT_TRACE" \
                        "is set as to trace on STDERR ! *"
@@ -76,7 +76,8 @@ do
        -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
                verbose=t; shift ;;
        --no-python)
-               no_python=t; shift ;;
+               # noop now...
+               shift ;;
        *)
                break ;;
        esac
@@ -95,6 +96,17 @@ test_count=0
 
 trap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit
 
+test_tick () {
+       if test -z "${test_tick+set}"
+       then
+               test_tick=1112911993
+       else
+               test_tick=$(($test_tick + 60))
+       fi
+       GIT_COMMITTER_DATE="$test_tick -0700"
+       GIT_AUTHOR_DATE="$test_tick -0700"
+       export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
+}
 
 # You are not expected to call test_ok_ and test_failure_ directly, use
 # the text_expect_* functions instead.
@@ -124,43 +136,79 @@ test_run_ () {
        return 0
 }
 
+test_skip () {
+       this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$')
+       this_test="$this_test.$(expr "$test_count" + 1)"
+       to_skip=
+       for skp in $GIT_SKIP_TESTS
+       do
+               case "$this_test" in
+               $skp)
+                       to_skip=t
+               esac
+       done
+       case "$to_skip" in
+       t)
+               say >&3 "skipping test: $@"
+               test_count=$(expr "$test_count" + 1)
+               say "skip $test_count: $1"
+               : true
+               ;;
+       *)
+               false
+               ;;
+       esac
+}
+
 test_expect_failure () {
        test "$#" = 2 ||
        error "bug in the test script: not 2 parameters to test-expect-failure"
-       say >&3 "expecting failure: $2"
-       test_run_ "$2"
-       if [ "$?" = 0 -a "$eval_ret" != 0 ]
+       if ! test_skip "$@"
        then
-               test_ok_ "$1"
-       else
-               test_failure_ "$@"
+               say >&3 "expecting failure: $2"
+               test_run_ "$2"
+               if [ "$?" = 0 -a "$eval_ret" != 0 -a "$eval_ret" -lt 129 ]
+               then
+                       test_ok_ "$1"
+               else
+                       test_failure_ "$@"
+               fi
        fi
+       echo >&3 ""
 }
 
 test_expect_success () {
        test "$#" = 2 ||
        error "bug in the test script: not 2 parameters to test-expect-success"
-       say >&3 "expecting success: $2"
-       test_run_ "$2"
-       if [ "$?" = 0 -a "$eval_ret" = 0 ]
+       if ! test_skip "$@"
        then
-               test_ok_ "$1"
-       else
-               test_failure_ "$@"
+               say >&3 "expecting success: $2"
+               test_run_ "$2"
+               if [ "$?" = 0 -a "$eval_ret" = 0 ]
+               then
+                       test_ok_ "$1"
+               else
+                       test_failure_ "$@"
+               fi
        fi
+       echo >&3 ""
 }
 
 test_expect_code () {
        test "$#" = 3 ||
        error "bug in the test script: not 3 parameters to test-expect-code"
-       say >&3 "expecting exit code $1: $3"
-       test_run_ "$3"
-       if [ "$?" = 0 -a "$eval_ret" = "$1" ]
+       if ! test_skip "$@"
        then
-               test_ok_ "$2"
-       else
-               test_failure_ "$@"
+               say >&3 "expecting exit code $1: $3"
+               test_run_ "$3"
+               if [ "$?" = 0 -a "$eval_ret" = "$1" ]
+               then
+                       test_ok_ "$2"
+               else
+                       test_failure_ "$@"
+               fi
        fi
+       echo >&3 ""
 }
 
 # Most tests can use the created repository, but some amy need to create more.
@@ -172,7 +220,7 @@ test_create_repo () {
        repo="$1"
        mkdir "$repo"
        cd "$repo" || error "Cannot setup test environment"
-       "$GIT_EXEC_PATH/git" init-db --template=$GIT_EXEC_PATH/templates/blt/ 2>/dev/null ||
+       "$GIT_EXEC_PATH/git" init-db --template=$GIT_EXEC_PATH/templates/blt/ >/dev/null 2>&1 ||
        error "cannot run git init-db -- have you built things yet?"
        mv .git/hooks .git/hooks-disabled
        cd "$owd"
@@ -204,20 +252,12 @@ test_done () {
 # t/ subdirectory and are run in trash subdirectory.
 PATH=$(pwd)/..:$PATH
 GIT_EXEC_PATH=$(pwd)/..
-export PATH GIT_EXEC_PATH
-
-# Similarly use ../compat/subprocess.py if our python does not
-# have subprocess.py on its own.
-PYTHON=`sed -e '1{
-       s/^#!//
-       q
-}' ../git-merge-recursive` || {
-       error "You haven't built things yet, have you?"
-}
-"$PYTHON" -c 'import subprocess' 2>/dev/null || {
-       PYTHONPATH=$(pwd)/../compat
-       export PYTHONPATH
-}
+GIT_TEMPLATE_DIR=$(pwd)/../templates/blt
+HOME=$(pwd)/trash
+export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR HOME
+
+GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git
+export GITPERLLIB
 test -d ../templates/blt || {
        error "You haven't built things yet, have you?"
 }
@@ -227,3 +267,22 @@ test=trash
 rm -fr "$test"
 test_create_repo $test
 cd "$test"
+
+this_test=$(expr "./$0" : '.*/\(t[0-9]*\)-[^/]*$')
+for skp in $GIT_SKIP_TESTS
+do
+       to_skip=
+       for skp in $GIT_SKIP_TESTS
+       do
+               case "$this_test" in
+               $skp)
+                       to_skip=t
+               esac
+       done
+       case "$to_skip" in
+       t)
+               say >&3 "skipping test $this_test altogether"
+               say "skip all tests in $this_test"
+               test_done
+       esac
+done