]> arthur.barton.de Git - bup.git/commitdiff
wvtest.sh: print a backtrace on failure when running under bash.
authorRob Browning <rlb@defaultvalue.org>
Thu, 20 Mar 2014 18:52:06 +0000 (13:52 -0500)
committerRob Browning <rlb@defaultvalue.org>
Thu, 20 Mar 2014 22:34:25 +0000 (17:34 -0500)
Very handy when there are nested WV* calls, i.e.

  foo() { ... WVPASS bar; ... }
  ...
  WVPASS foo

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
wvtest-bash.sh [new file with mode: 0644]
wvtest.sh [changed mode: 0644->0755]

diff --git a/wvtest-bash.sh b/wvtest-bash.sh
new file mode 100644 (file)
index 0000000..61f8dce
--- /dev/null
@@ -0,0 +1,32 @@
+
+declare -a _wvbtstack
+
+_wvpushcall()
+{
+    _wvbtstack[${#_wvbtstack[@]}]="$*"
+}
+
+_wvpopcall()
+{
+    unset _wvbtstack[$((${#_wvbtstack[@]} - 1))]
+}
+
+_wvbacktrace()
+{
+    local i loc
+    local call=$((${#_wvbtstack[@]} - 1))
+    for ((i=0; i <= ${#FUNCNAME[@]}; i++)); do
+       local name="${FUNCNAME[$i]}"
+       if test "${name:0:2}" == WV; then
+            loc="${BASH_SOURCE[$i+1]}:${BASH_LINENO[$i]}"
+           echo "called from $loc ${FUNCNAME[$i]} ${_wvbtstack[$call]}" 1>&2
+           ((call--))
+       fi
+    done
+}
+
+_wvfind_caller()
+{
+    WVCALLER_FILE=${BASH_SOURCE[2]}
+    WVCALLER_LINE=${BASH_LINENO[1]}
+}
old mode 100644 (file)
new mode 100755 (executable)
index daaa6c4..05f6f34
--- a/wvtest.sh
+++ b/wvtest.sh
@@ -14,12 +14,12 @@ _wvtextclean()
 
 
 if [ -n "$BASH_VERSION" ]; then
-       _wvfind_caller()
-       {
-               WVCALLER_FILE=${BASH_SOURCE[2]}
-               WVCALLER_LINE=${BASH_LINENO[1]}
-       }
+       . ./wvtest-bash.sh  # This keeps sh from choking on the syntax.
 else
+       _wvbacktrace() { true; }
+       _wvpushcall() { true; }
+       _wvpopcall() { true; }
+
        _wvfind_caller()
        {
                WVCALLER_FILE="unknown"
@@ -38,6 +38,7 @@ _wvcheck()
        fi
        echo "! $WVCALLER_FILE:$WVCALLER_LINE  $TEXT  $OK" >&2
        if [ "$CODE" -ne 0 ]; then
+               _wvbacktrace
                exit $CODE
        else
                return 0
@@ -48,9 +49,11 @@ _wvcheck()
 WVPASS()
 {
        local TEXT="$*"
+       _wvpushcall "$@"
 
        _wvfind_caller
        if "$@"; then
+               _wvpopcall
                _wvcheck 0 "$TEXT"
                return 0
        else
@@ -64,6 +67,7 @@ WVPASS()
 WVFAIL()
 {
        local TEXT="$*"
+       _wvpushcall "$@"
 
        _wvfind_caller
        if "$@"; then
@@ -72,6 +76,7 @@ WVFAIL()
                return 1
        else
                _wvcheck 0 "NOT($TEXT)"
+               _wvpopcall
                return 0
        fi
 }
@@ -86,6 +91,7 @@ _wvgetrv()
 
 WVPASSEQ()
 {
+       _wvpushcall "$@"
        _wvfind_caller
        _wvcheck $(_wvgetrv [ "$#" -eq 2 ]) "exactly 2 arguments"
        echo "Comparing:" >&2
@@ -93,11 +99,13 @@ WVPASSEQ()
        echo "--" >&2
        echo "$2" >&2
        _wvcheck $(_wvgetrv [ "$1" = "$2" ]) "'$1' = '$2'"
+       _wvpopcall
 }
 
 
 WVPASSNE()
 {
+       _wvpushcall "$@"
        _wvfind_caller
        _wvcheck $(_wvgetrv [ "$#" -eq 2 ]) "exactly 2 arguments"
        echo "Comparing:" >&2
@@ -105,22 +113,27 @@ WVPASSNE()
        echo "--" >&2
        echo "$2" >&2
        _wvcheck $(_wvgetrv [ "$1" != "$2" ]) "'$1' != '$2'"
+       _wvpopcall
 }
 
 
 WVPASSRC()
 {
        local RC=$?
+       _wvpushcall "$@"
        _wvfind_caller
        _wvcheck $(_wvgetrv [ $RC -eq 0 ]) "return code($RC) == 0"
+       _wvpopcall
 }
 
 
 WVFAILRC()
 {
        local RC=$?
+       _wvpushcall "$@"
        _wvfind_caller
        _wvcheck $(_wvgetrv [ $RC -ne 0 ]) "return code($RC) != 0"
+       _wvpopcall
 }