pvincent 2 weeks ago
parent
commit
d8db599623
  1. 88
      poc

88
poc

@ -24,16 +24,22 @@ function tty_ansi {
[[ -n $fg ]] && >/dev/tty echo -ne "\e[${fg}m" || true [[ -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 { function on_error {
local code
code="${1:-100}"
failure_code="${1:-200}"
>/dev/tty printf '\r' # force carriage return explicitly >/dev/tty printf '\r' # force carriage return explicitly
miaou_debug "on_error: $code ($$ -- $BASHPID)"
miaou_debug "on_error: $failure_code ($$ -- $BASHPID)"
if [[ $$ == "$BASHPID" ]]; then if [[ $$ == "$BASHPID" ]]; then
>&2 echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: command_error: ${code}"
failure_type="COMMAND_ERROR" failure_type="COMMAND_ERROR"
print_miaou_error "${BASH_SOURCE[1]}" "${BASH_LINENO[0]}" "${failure_code}" "${failure_type}" '...'
error_source=("${BASH_SOURCE[@]}") error_source=("${BASH_SOURCE[@]}")
error_lineno=("${BASH_LINENO[@]}") error_lineno=("${BASH_LINENO[@]}")
error_funcname=("${FUNCNAME[@]}") error_funcname=("${FUNCNAME[@]}")
@ -44,13 +50,41 @@ function on_error {
error_lineno=("${error_lineno[@]}") error_lineno=("${error_lineno[@]}")
error_funcname=("${error_funcname[@]}") error_funcname=("${error_funcname[@]}")
exit "$code"
exit "$failure_code"
else 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 $$ kill -PIPE $$
fi 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[@]}" '<main>')
else
failure_code=141
failure_type="PIPE_ERROR"
fi
# miaou_debug on_pipe: "${failure_code}"
exit "$failure_code"
}
function dump_stderr { function dump_stderr {
miaou_debug --stderr-- miaou_debug --stderr--
mapfile -t tmp_error <"$MIAOU_BASH_ERROR" mapfile -t tmp_error <"$MIAOU_BASH_ERROR"
@ -63,10 +97,17 @@ function dump_stderr {
function dump_failure { function dump_failure {
miaou_debug --error box-- miaou_debug --error box--
tty_ansi 94 tty_ansi 94
echo -n "FAILURE TYPE = "
echo -n "MIAOU_BASH: "
tty_ansi 95 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 tty_ansi 0
echo
miaou_debug --end of error box-- miaou_debug --end of error box--
} }
@ -96,36 +137,6 @@ function on_exit {
miaou_debug "on_exit $code" 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[@]}" '<main>')
else
code=141
failure_type="PIPE_ERROR"
fi
# miaou_debug on_pipe: "${code}"
exit "$code"
}
## main ## main
set -euo pipefail set -euo pipefail
@ -143,5 +154,4 @@ miaou_debug "--source from ${BASHPID}"
exec 3>/dev/stderr exec 3>/dev/stderr
# shellcheck source=/dev/null # shellcheck source=/dev/null
2>"$MIAOU_BASH_ERROR" source "$BASH_ARGV0" 2>"$MIAOU_BASH_ERROR" source "$BASH_ARGV0"
exec 3>-
miaou_debug '--source success' miaou_debug '--source success'
Loading…
Cancel
Save