#!/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