dotfiles-guix/scripts/guix-retry

74 lines
1.4 KiB
Text
Raw Normal View History

#!/bin/sh
2024-12-13 03:53:10 +00:00
# fail on errors
set -e
2024-12-13 03:53:10 +00:00
# if the error output matches this regex, auto retry
# and dont prompt user.
auto_retry_regex="write_to_session_record_port" # Guix does not know how to
# gracefully reconnect TLS...
# run dir
run="${XDG_RUNTIME_DIR:-/tmp}/guix-retry/$$"
mkdir -p "$run"
2024-12-13 03:53:10 +00:00
# delete run dir on exit
function cleanup {
real="$(realpath "$run")"
if [[ ! "$real" = "/" ]]; then
rm -fr "$real"
fi
}
trap cleanup EXIT
# get error stream
stderr="$run/stderr"
mkfifo -m 600 "$stderr"
log="$run/log"
# unset fail on errors
set +e
# retry command forever
# until success or abort
while true; do
2024-12-13 03:53:10 +00:00
# execute command
if [[ ! -z "$GUIX_RETRY_NO_TTY" ]]; then
"$@" 2>"$stderr" &
else
command="$@"
script -q -c "$command" 2>"$stderr" "$log" &
fi
pid="$!"
output="$(cat "$stderr" | tee /dev/stderr)"
wait "$pid"
err="$?"
if [[ -z "$GUIX_RETRY_NO_TTY" ]]; then
err="$(tail -n1 "$log" | awk -F '"' '{ print $2 }')"
fi
if [[ "$err" -eq 0 ]]; then
# command succeeded, break loop
break
fi
if [[ "$output" =~ "$auto_retry_regex" ]]; then
# command errored and is set to auto retry
continue
fi
2024-12-13 03:53:10 +00:00
if [[ ! -z "$GUIX_RETRY_NO_PROMPT" ]]; then
# do not prompt, just fail
exit 1
fi
# check if user wants to retry
read -p "Command failed. Retry? (y/N): " response
if [[ ! "$response" = "y" ]]; then
# command failed and told to abort, break loop
exit 1
fi
done