#!/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 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