mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-04-17 08:43:59 +02:00
82 lines
1.9 KiB
Bash
82 lines
1.9 KiB
Bash
#!/usr/bin/env bash
|
|
# This file is meant to be sourced by other scripts, not executed directly.
|
|
# It contains a bunch of helper functions for writing bash scripts.
|
|
|
|
# This output stream is used by subshells to send their output to the root process stdout.
|
|
global_stdout=3
|
|
eval "exec $global_stdout>&1"
|
|
|
|
# Log a message at the info level
|
|
function info {
|
|
local message=$1
|
|
|
|
echo -e "\033[32;1m[INFO]\033[0m \033[0;32m$message\033[0m" >&2
|
|
}
|
|
|
|
# Log a message at the warn level
|
|
function warn {
|
|
local message=$1
|
|
|
|
echo -e "\033[33;1m[WARN]\033[0m \033[0;33m$message\033[0m" >&2
|
|
}
|
|
|
|
# Log a message at the error level
|
|
function error {
|
|
local message=$1
|
|
|
|
echo -e "\033[31;1m[ERROR]\033[0m \033[0;31m$message\033[0m" >&2
|
|
}
|
|
|
|
# Log a message at the error level and exit with a non-zero status
|
|
function die {
|
|
local message=$1
|
|
|
|
error "$message"
|
|
exit 1
|
|
}
|
|
|
|
# Log the command and execute it
|
|
function step {
|
|
local cmd="$1"
|
|
if [[ $cmd == exec ]]; then
|
|
cmd=("${@:2}")
|
|
else
|
|
cmd=("${@:1}")
|
|
fi
|
|
|
|
# If the process runs in a parallel subshell - use the TASK env var to prefix
|
|
# its log with the task name.
|
|
local task="${TASK:-}"
|
|
|
|
if [[ -n $task ]]; then
|
|
task="($task) "
|
|
fi
|
|
|
|
colorized_cmd=$(colorize_command "${cmd[@]}")
|
|
|
|
echo >&$global_stdout -e "\033[32;1m$task❱\033[0m $colorized_cmd" >&2
|
|
|
|
"$@"
|
|
}
|
|
|
|
# Returns a command with syntax highlighting
|
|
function colorize_command {
|
|
local program=$1
|
|
shift
|
|
|
|
local args=()
|
|
for arg in "$@"; do
|
|
if [[ $arg =~ ^- ]]; then
|
|
args+=("\033[34;1m${arg}\033[0m")
|
|
else
|
|
args+=("\033[0;33m${arg}\033[0m")
|
|
fi
|
|
done
|
|
|
|
# On old versions of bash, for example 4.2.46 if the `args` array is empty,
|
|
# then an `unbound variable` is thrown.
|
|
#
|
|
# Luckily, we don't pass commands without positional arguments to this function,
|
|
# and we use bash >= v5. If this ever becomes a problem, you know the why.
|
|
echo -e "\033[1;32m${program}\033[0m ${args[*]}"
|
|
}
|