66 lines
1.3 KiB
Bash
Executable file
66 lines
1.3 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
|
|
command="$@"
|
|
script -q -c "$command; exit \$?" 2>"$stderr" "$log" &
|
|
pid="$!"
|
|
output="$(cat "$stderr" | tee /dev/stderr)"
|
|
wait "$pid"
|
|
err="$(tail -n1 "$log" | awk -F '"' '{ print $2 }')"
|
|
|
|
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
|
|
break
|
|
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
|
|
break
|
|
fi
|
|
done
|