|
|
@ -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' |