From d8db5996232207bc678f333bfca2e9e34a40a243 Mon Sep 17 00:00:00 2001 From: pvincent Date: Mon, 27 Jul 2026 16:25:46 +0400 Subject: [PATCH] poc3 --- poc | 88 ++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 49 insertions(+), 39 deletions(-) diff --git a/poc b/poc index c5c5091..d28014d 100755 --- a/poc +++ b/poc @@ -24,16 +24,22 @@ function tty_ansi { [[ -n $fg ]] && >/dev/tty echo -ne "\e[${fg}m" || true } +function print_miaou_error { + local source="$1" line="$2" code="$3" type="$4" payload="${5:-}" + >&2 echo -n "${source}: line ${line}: miaou_error: code=${code} type=${type}" + [[ -n "$payload" ]] && >&2 echo " payload=${payload}" || >&2 echo +} + function on_error { - local code - code="${1:-100}" + failure_code="${1:-200}" >/dev/tty printf '\r' # force carriage return explicitly - miaou_debug "on_error: $code ($$ -- $BASHPID)" + miaou_debug "on_error: $failure_code ($$ -- $BASHPID)" if [[ $$ == "$BASHPID" ]]; then - >&2 echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: command_error: ${code}" failure_type="COMMAND_ERROR" + print_miaou_error "${BASH_SOURCE[1]}" "${BASH_LINENO[0]}" "${failure_code}" "${failure_type}" '...' + error_source=("${BASH_SOURCE[@]}") error_lineno=("${BASH_LINENO[@]}") error_funcname=("${FUNCNAME[@]}") @@ -44,13 +50,41 @@ function on_error { error_lineno=("${error_lineno[@]}") error_funcname=("${error_funcname[@]}") - exit "$code" + exit "$failure_code" else - >&2 echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: subshell_error: ${code}" + print_miaou_error "${BASH_SOURCE[1]}" "${BASH_LINENO[0]}" "${failure_code}" 'SUBSHELL' kill -PIPE $$ fi } +function on_pipe { + local tmp_error regex source lineno + + 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]+): miaou_error: code=([0-9]+) type=SUBSHELL' + if [[ $last_error =~ $regex ]]; then + source=${BASH_REMATCH[1]} + lineno=${BASH_REMATCH[2]} + failure_code=${BASH_REMATCH[3]} + failure_type="SUBSHELL_ERROR" + error_source=("$source" "${error_source[@]}") + error_lineno=("$lineno" "${error_lineno[@]}") + error_funcname=("${error_funcname[@]}" '
') + else + failure_code=141 + failure_type="PIPE_ERROR" + fi + # miaou_debug on_pipe: "${failure_code}" + exit "$failure_code" +} function dump_stderr { miaou_debug --stderr-- mapfile -t tmp_error <"$MIAOU_BASH_ERROR" @@ -63,10 +97,17 @@ function dump_stderr { function dump_failure { miaou_debug --error box-- tty_ansi 94 - echo -n "FAILURE TYPE = " + echo -n "MIAOU_BASH: " tty_ansi 95 - echo "$failure_type" + echo -n "$failure_type" + if [[ -v failure_payload ]]; then + tty_ansi 94 + echo -n " $failure_payload" + fi + tty_ansi 33 + printf "%5i" "$failure_code" tty_ansi 0 + echo miaou_debug --end of error box-- } @@ -96,36 +137,6 @@ function on_exit { miaou_debug "on_exit $code" } -function on_pipe { - 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]+)' - 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" -} - ## main set -euo pipefail @@ -143,5 +154,4 @@ miaou_debug "--source from ${BASHPID}" exec 3>/dev/stderr # shellcheck source=/dev/null 2>"$MIAOU_BASH_ERROR" source "$BASH_ARGV0" -exec 3>- miaou_debug '--source success'