dotfiles-guix/scripts/guix-retry
Freya Murphy 55de09d909
Some checks failed
installer / build (push) Failing after 1h2m18s
add guix installer workflow
2024-12-19 23:37:47 -05:00

73 lines
1.4 KiB
Bash
Executable file

#!/bin/sh
# fail on errors
set -e
# 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"
# 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
# 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
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