| #!/usr/bin/env bash |
| # shellcheck disable=SC2048 |
| # shellcheck disable=SC2086 # we want word splitting |
| # shellcheck disable=SC2155 # mktemp usually not failing |
| |
| shopt -s expand_aliases |
| |
| function _x_store_state { |
| if [[ "$-" == *"x"* ]]; then |
| previous_state_x=1 |
| else |
| previous_state_x=0 |
| fi |
| } |
| _x_store_state |
| alias x_store_state='{ _x_store_state; } >/dev/null 2>/dev/null' |
| |
| function _x_off { |
| x_store_state |
| set +x |
| } |
| alias x_off='{ _x_off; } >/dev/null 2>/dev/null' |
| |
| function _x_restore { |
| [ $previous_state_x -eq 0 ] || set -x |
| } |
| alias x_restore='{ _x_restore; } >/dev/null 2>/dev/null' |
| |
| export JOB_START_S=$(date -u +"%s" -d "${CI_JOB_STARTED_AT:?}") |
| |
| function get_current_minsec { |
| DATE_S=$(date -u +"%s") |
| CURR_TIME=$((DATE_S-JOB_START_S)) |
| printf "%02d:%02d" $((CURR_TIME/60)) $((CURR_TIME%60)) |
| } |
| |
| function _build_section_start { |
| local section_params=$1 |
| shift |
| local section_name=$1 |
| CURRENT_SECTION=$section_name |
| shift |
| CYAN="\e[0;36m" |
| ENDCOLOR="\e[0m" |
| |
| CURR_MINSEC=$(get_current_minsec) |
| echo -e "\n\e[0Ksection_start:$(date +%s):$section_name$section_params\r\e[0K${CYAN}[${CURR_MINSEC}] $*${ENDCOLOR}\n" |
| x_restore |
| } |
| alias build_section_start="x_off; _build_section_start" |
| |
| function _section_start { |
| build_section_start "[collapsed=true]" $* |
| x_restore |
| } |
| alias section_start="x_off; _section_start" |
| |
| function _uncollapsed_section_start { |
| build_section_start "" $* |
| x_restore |
| } |
| alias uncollapsed_section_start="x_off; _uncollapsed_section_start" |
| |
| function _build_section_end { |
| echo -e "\e[0Ksection_end:$(date +%s):$1\r\e[0K" |
| CURRENT_SECTION="" |
| x_restore |
| } |
| alias build_section_end="x_off; _build_section_end" |
| |
| function _section_end { |
| build_section_end $* |
| x_restore |
| } |
| alias section_end="x_off; _section_end" |
| |
| function _section_switch { |
| if [ -n "$CURRENT_SECTION" ] |
| then |
| build_section_end $CURRENT_SECTION |
| x_off |
| fi |
| build_section_start "[collapsed=true]" $* |
| x_restore |
| } |
| alias section_switch="x_off; _section_switch" |
| |
| function _uncollapsed_section_switch { |
| if [ -n "$CURRENT_SECTION" ] |
| then |
| build_section_end $CURRENT_SECTION |
| x_off |
| fi |
| build_section_start "" $* |
| x_restore |
| } |
| alias uncollapsed_section_switch="x_off; _uncollapsed_section_switch" |
| |
| export -f _x_store_state |
| export -f _x_off |
| export -f _x_restore |
| export -f get_current_minsec |
| export -f _build_section_start |
| export -f _section_start |
| export -f _build_section_end |
| export -f _section_end |
| export -f _section_switch |
| export -f _uncollapsed_section_switch |
| |
| # Freedesktop requirement (needed for Wayland) |
| [ -n "${XDG_RUNTIME_DIR:-}" ] || export XDG_RUNTIME_DIR="$(mktemp -p "$PWD" -d xdg-runtime-XXXXXX)" |
| |
| if [ -z "${RESULTS_DIR:-}" ]; then |
| export RESULTS_DIR="${PWD%/}/results" |
| if [ -e "${RESULTS_DIR}" ]; then |
| rm -rf "${RESULTS_DIR}" |
| fi |
| mkdir -p "${RESULTS_DIR}" |
| fi |
| |
| function error { |
| RED="\e[0;31m" |
| ENDCOLOR="\e[0m" |
| # we force the following to be not in a section |
| if [ -n "${CURRENT_SECTION:-}" ]; then |
| section_end $CURRENT_SECTION |
| x_off |
| fi |
| |
| CURR_MINSEC=$(get_current_minsec) |
| echo -e "\n${RED}[${CURR_MINSEC}] ERROR: $*${ENDCOLOR}\n" |
| x_restore |
| } |
| |
| function trap_err { |
| x_off |
| error ${CURRENT_SECTION:-'unknown-section'}: ret code: $* |
| } |
| |
| export -f error |
| export -f trap_err |
| |
| set -E |
| trap 'trap_err $?' ERR |