diff --git a/bin/miaou-bash b/bin/miaou-bash index 63f8382..35f4e45 100755 --- a/bin/miaou-bash +++ b/bin/miaou-bash @@ -188,7 +188,6 @@ function on_exit { failure_traces+=("$stack_detail") done dump_failure - # builtin exit "$code" else dump_success fi @@ -199,6 +198,46 @@ function debug { is_true "${MIAOU_BASH_DEBUG}" && >/dev/tty echo "*********** DEBUG: $*" || true } +function ansi_block_continuation { + tput sc + tput cuu 1 + BG=RED FG=BLACK style_ansi "\t╦" + tput rc + FG=RED style_ansi "\t║\n" +} + +function ansi_block_error { + BG=RED + FG=BLACK + PADDING=2 + + local content detail exit_code + + content=$(style_ansi "$1") + content=$(style_padding "$content") + detail=$(BG=BLACK style_padding "$2") + exit_code=$(FG=CYAN style_ansi " $3") + style_block "$content$detail$exit_code" + + ansi_reset +} + +function ansi_traces { + local optional location sources lines functions + declare -n sources=$1 + declare -n lines=$2 + declare -n functions=$3 + optional=false + for i in "${!sources[@]}"; do + FG=RED style_ansi "\t╟─⟶" + location="${sources[$i]}:${lines[$i]}" + is_true "$optional" && + location=$(FG=GRAY STYLE=ITALIC style_ansi "\t$location") || # FIXME: \t should not be required! + location=$(STYLE=ITALIC style_ansi "$location") + printf "%40s\t%s\n" "${location}" "${functions[$i]}" + optional=true + done +} function dump_failure { dump_stderr true debug '---stacktrace---' @@ -208,14 +247,18 @@ function dump_failure { if [[ $failure_type == 'SUBSHELL ERROR' ]]; then >&4 echo -e "${failure_payload}" else - >&4 echo -e "\tCODE: ${code}" - >&4 echo -e "\tTYPE: ${failure_type}" - >&4 echo -e "\tPAYLOAD: ${failure_payload}" + declare -F style_ansi >/dev/null || source "$MIAOU_BASH_DIR/lib/ansi.bash" + >&4 ansi_block_error "$failure_type" "$failure_payload" "$code" + >&4 ansi_block_continuation fi fi - for i in "${failure_traces[@]}"; do - >&4 echo -e "$i" - done + + declare -F style_ansi >/dev/null || source "$MIAOU_BASH_DIR/lib/ansi.bash" + >&4 ansi_traces stack_sources stack_lines stack_functions + + # for i in "${failure_traces[@]}"; do + # >&4 echo -e "$i" + # done debug '---end of stacktrace---' cleanup } diff --git a/lib/ansi.bash b/lib/ansi.bash index 30f07ca..722f830 100644 --- a/lib/ansi.bash +++ b/lib/ansi.bash @@ -4,6 +4,9 @@ PADDING=0 ANSI_RESET='\e[0m' +BLOCK_CONTINUATION_COL= +BLOCK_CONTINUATION_SYMBOL=╦ + declare -A STYLE_VARIANTS STYLE_VARIANTS[BOLD]='\e[1m' STYLE_VARIANTS[ITALIC]='\e[3m' @@ -88,7 +91,7 @@ function style_ansi { } function style_block { - local content length top bottom + local content length top bottom i content=$(style_padding "$1") length=$(ansi_length "$content") @@ -97,16 +100,22 @@ function style_block { for _ in $(seq 1 "${length}"); do builtin echo -n '═'; done builtin echo "╗" ) - style_ansi "${top}" && echo + style_ansi "${top}" && builtin echo style_ansi "║" style_ansi "${content}" - style_ansi "║" && echo + style_ansi "║" && builtin echo bottom=$( builtin echo -n "╚" - for _ in $(seq 1 "${length}"); do builtin echo -n '═'; done + for i in $(seq 1 "${length}"); do + if [[ $i == "$BLOCK_CONTINUATION_COL" ]]; then + builtin echo -n "$BLOCK_CONTINUATION_SYMBOL" + else + builtin echo -n '═' + fi + done builtin echo "╝" ) - style_ansi "${bottom}" && echo + style_ansi "${bottom}" && builtin echo } diff --git a/test/stub/ansi_error.bash b/test/stub/ansi_error.bash index 5786f79..92a3761 100755 --- a/test/stub/ansi_error.bash +++ b/test/stub/ansi_error.bash @@ -1,21 +1,19 @@ #!/usr/bin/env miaou-bash -. "$MIAOU_BASH_DIR/lib/ansi.bash" - -CODE=118 -TYPE='SUBSHELL TERM' -PAYLOAD='blabla' +code=118 +failure_type='SUBSHELL TERM' +failure_payload='blabla' stack_sources=('file.bash' './lib/utility.bash' 'file.bash') stack_lines=(18 56 12) stack_functions=('f2' 'f1' '
') -function ansi_block_continuation { - tput sc - tput cuu 1 - BG=RED FG=BLACK style_ansi "\t╦" - tput rc - FG=RED style_ansi "\t║\n" -} +# function ansi_block_continuation { +# tput sc +# tput cuu 1 +# BG=RED FG=BLACK style_ansi "\t╦" +# tput rc +# FG=RED style_ansi "\t║\n" +# } function ansi_block_error { BG=RED @@ -24,30 +22,42 @@ function ansi_block_error { local content detail exit_code - content=$(style_ansi "${TYPE}") + content=$(style_ansi "$1") content=$(style_padding "$content") - detail=$(BG=BLACK style_padding "${PAYLOAD}") - exit_code=$(FG=WHITE style_ansi " ${CODE}") - style_block "$content$detail$exit_code" - + detail=$(BG=BLACK style_padding "$2") + exit_code=$(FG=CYAN style_ansi " $3") + BLOCK_CONTINUATION_COL=5 style_block "$content$detail$exit_code" ansi_reset + FG=RED style_ansi " ║" + echo } function ansi_traces { - local optional location - + local optional location sources lines functions + declare -n sources=$1 + declare -n lines=$2 + declare -n functions=$3 optional=false - for i in "${!stack_sources[@]}"; do - FG=RED style_ansi "\t╟─⟶" - location="${stack_sources[$i]}:${stack_lines[$i]}" + for i in "${!sources[@]}"; do + FG=RED style_ansi " ╟─⟶" + location=$(printf "%40s" "${sources[$i]}:${lines[$i]}") is_true "$optional" && - location=$(FG=GRAY STYLE=ITALIC style_ansi "\t$location") || # FIXME: \t should not be required! + location=$(FG=GRAY STYLE=ITALIC style_ansi "$location") || location=$(STYLE=ITALIC style_ansi "$location") - printf "%40s\t%s\n" "${location}" "${stack_functions[$i]}" + builtin echo "${location} ${functions[$i]}" optional=true done } -ansi_block_error -ansi_block_continuation -ansi_traces +function show_error { + >&2 printf '\r' + >&2 ansi_block_error "$failure_type" "$failure_payload" "$code" + >&2 ansi_traces stack_sources stack_lines stack_functions + # [[ -p /dev/stdout ]] && kill -TERM $$ +} + +declare -F style_ansi >/dev/null || source "$MIAOU_BASH_DIR/lib/ansi.bash" + +echo START +# echo -n "standard flow:" && show_error +echo -n "starting subshell: $(show_error)" diff --git a/test/stub/scenario.bash b/test/stub/scenario.bash index 5f485b2..eaaa898 100755 --- a/test/stub/scenario.bash +++ b/test/stub/scenario.bash @@ -7,6 +7,10 @@ readonly BASEDIR # SCENARII +function do_subshell_false { + result=$(false) +} + function do_subshell_term { # grep nope nope echo "found=$(command_not_found)"