various fixes and mail improvements
[distro-setup] / mount-latest-subvol
index ea1d1f89195cc26420e68aa462671d1288eef5c4..5cb226c5676b9539ea96ebab8241b5ccc6ebbec4 100644 (file)
@@ -35,28 +35,13 @@ EOF
 }
 
 
-errcatch() {
-  set -E; shopt -s extdebug
-  _err-trap() {
-    err=$?
-    exec >&2
-    set +x
-    echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}:in \`$BASH_COMMAND' returned $err"
-    bash-trace 2
-    echo "$0: exiting with code $err"
-    exit $err
-  }
-  trap _err-trap ERR
-  set -o pipefail
-}
-bash-trace() {
-  local -i argc_index=0 frame i start=${1:-1} max_indent=8 indent
+err-bash-trace() {
+  local -i argc_index=0 frame i start=${1:-0} max_indent=8 indent
   local source
   local extdebug=false
   if [[ $(shopt -p extdebug) == *-s* ]]; then
     extdebug=true
   fi
-
   for ((frame=0; frame < ${#FUNCNAME[@]}-1; frame++)); do
     argc=${BASH_ARGC[frame]}
     argc_index+=$argc
@@ -64,7 +49,7 @@ bash-trace() {
     if (( ${#BASH_SOURCE[@]} > 1 )); then
       source="${BASH_SOURCE[frame+1]}:${BASH_LINENO[frame]}:"
     fi
-    indent=$((frame-start+1))
+    indent=$((frame-start + 1))
     indent=$((indent < max_indent ? indent : max_indent))
     printf "%${indent}s↳%sin \`%s" '' "$source" "${FUNCNAME[frame]}"
     if $extdebug; then
@@ -74,8 +59,25 @@ bash-trace() {
     fi
     echo \'
   done
+  return 0
+}
+err-catch() {
+  set -E; shopt -s extdebug
+  _err-trap() {
+    err=$?
+    exec >&2
+    set +x
+    echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}: \`$BASH_COMMAND' returned $err"
+    err-bash-trace 2
+    set -e # err trap does not work within an error trap
+    "${_errcatch_cleanup[@]:-:}" # note :-: is to be compatible with set -u
+    echo "$0: exiting with code $err"
+    exit $err
+  }
+  trap _err-trap ERR
+  set -o pipefail
 }
-errcatch
+err-catch
 
 tu() {
   while read -r line; do