From 5a752fa21047af18581d2816d370fad8264ff882 Mon Sep 17 00:00:00 2001 From: pvincent Date: Mon, 27 Jul 2026 11:44:17 +0400 Subject: [PATCH] poc3 --- poc | 50 ++++++++++++++++++++++++++++++++++------- test/stub/scenario.bash | 2 ++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/poc b/poc index e4333bb..ce4549d 100755 --- a/poc +++ b/poc @@ -25,14 +25,25 @@ function tty_ansi { } function on_error { + local code + code="${1:-100}" >/dev/tty printf '\r' # force carriage return explicitly - code="${1:-100}" - # miaou_debug "on_error: $code ($$ -- $BASHPID)" + miaou_debug "on_error: $code ($$ -- $BASHPID)" if [[ $$ == "$BASHPID" ]]; then >&2 echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: command_error: ${code}" failure_type="COMMAND_ERROR" + error_source=("${BASH_SOURCE[@]}") + error_lineno=("${BASH_LINENO[@]}") + error_funcname=("${FUNCNAME[@]}") + unset 'error_source[-1]' 'error_lineno[-1]' 'error_funcname[-1]' + unset 'error_source[0]' 'error_lineno[-1]' 'error_funcname[0]' + error_funcname[-1]='
' + error_source=("${error_source[@]}") + error_lineno=("${error_lineno[@]}") + error_funcname=("${error_funcname[@]}") + exit "$code" else >&2 echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: subshell_error: ${code}" @@ -60,9 +71,15 @@ function dump_failure { } function dump_stacktrace { - miaou_debug --stacktrace-- + miaou_debug --stacktrace ${#error_source[@]}-- tty_ansi 94 - echo TODO: stacktrace... + local i source lineno funcname + for i in "${!error_source[@]}"; do + source="${error_source[$i]}" + lineno="${error_lineno[$i]}" + funcname="${error_funcname[$i]}" + printf "%40s:%.4s \t%s\n" "$source" "$lineno" "$funcname" + done tty_ansi 0 miaou_debug --end of stacktrace-- } @@ -79,13 +96,30 @@ function on_exit { } function on_pipe { - local code=141 # default code error for pipe - local tmp_error regex + local code tmp_error regex + + error_source=("${BASH_SOURCE[@]}") + error_lineno=("${BASH_LINENO[@]}") + error_funcname=("${FUNCNAME[@]}") + unset 'error_source[0]' 'error_lineno[0]' 'error_funcname[0]' + unset 'error_source[-1]' 'error_lineno[-1]' 'error_funcname[-1]' + unset 'error_source[-1]' 'error_lineno[-1]' 'error_funcname[-1]' mapfile -t tmp_error <"$MIAOU_BASH_ERROR" last_error="${tmp_error[-1]}" - regex='.*: line [0-9]+: subshell_error: ([0-9]+)' - [[ $last_error =~ $regex ]] && code=${BASH_REMATCH[1]} && failure_type="SUBSHELL_ERROR" + regex='(.*): line ([0-9]+): subshell_error: ([0-9]+)' + if [[ $last_error =~ $regex ]]; then + source=${BASH_REMATCH[1]} + lineno=${BASH_REMATCH[2]} + code=${BASH_REMATCH[3]} + failure_type="SUBSHELL_ERROR" + error_source=("$source" "${error_source[@]}") + error_lineno=("$lineno" "${error_lineno[@]}") + error_funcname=("${error_funcname[@]}" '
') + else + code=141 + failure_type="PIPE_ERROR" + fi # miaou_debug on_pipe: "${code}" exit "$code" diff --git a/test/stub/scenario.bash b/test/stub/scenario.bash index 17ced1e..0bd908d 100755 --- a/test/stub/scenario.bash +++ b/test/stub/scenario.bash @@ -22,6 +22,7 @@ function do_subshell_term { # echo 'toto' | return 3 echo -n "found1=$(grep nope nope)" + echo -n "found1=$(false)" # echo "found1=$(grep nope nope | grep none)" # echo "found2=$(command_not_found)" # echo SHOULD NOT SHOW UP! @@ -139,6 +140,7 @@ function main { F1 F3 echo before subshell + grep nope nope 2>/dev/null echo "here in subshell $(grep titi $0)" echo NO MORE