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