core/pkgs/build-support/rust/build-rust-crate/log.nix

62 lines
1.7 KiB
Nix
Raw Normal View History

2024-05-02 00:46:19 +00:00
{ lib }:
2024-06-30 08:16:52 +00:00
let
echo_colored_body =
start_escape:
# Body of a function that behaves like "echo" but
# has the output colored by the given start_escape
# sequence. E.g.
#
# * echo_x "Building ..."
# * echo_x -n "Running "
#
# This is more complicated than apparent at first sight
# because:
# * The color markers and the text must be print
# in the same echo statement. Otherise, other
# intermingled text from concurrent builds will
# be colored as well.
# * We need to preserve the trailing newline of the
# echo if and only if it is present. Bash likes
# to strip those if we capture the output of echo
# in a variable.
# * Leading "-" will be interpreted by test as an
# option for itself. Therefore, we prefix it with
# an x in `[[ "x$1" =~ ^x- ]]`.
''
2024-05-02 00:46:19 +00:00
local echo_args="";
while [[ "x$1" =~ ^x- ]]; do
echo_args+=" $1"
shift
done
local start_escape="$(printf '${start_escape}')"
local reset="$(printf '\033[0m')"
echo $echo_args $start_escape"$@"$reset
2024-06-30 08:16:52 +00:00
'';
echo_conditional_colored_body =
colors: start_escape:
if colors == "always" then (echo_colored_body start_escape) else ''echo "$@"'';
in
{
2024-05-02 00:46:19 +00:00
echo_colored = colors: ''
echo_colored() {
${echo_conditional_colored_body colors ''\033[0;1;32m''}
}
echo_error() {
${echo_conditional_colored_body colors ''\033[0;1;31m''}
}
2024-06-30 08:16:52 +00:00
'';
2024-05-02 00:46:19 +00:00
noisily = colors: verbose: ''
2024-06-30 08:16:52 +00:00
noisily() {
${lib.optionalString verbose ''
echo_colored -n "Running "
echo $@
''}
$@
}
2024-05-02 00:46:19 +00:00
'';
}