#!/usr/bin/env bash # test_release_push_once.sh — release-agent.sh releases a version only when the registry says it is NEW (R-1098). # # The REAL release-agent.sh runs from a copy inside a scratch git repo (so its tag check reads scratch tags), with # RELEASE_ALLOW_DIRTY=1 (the clean-tree gate has its own history) and a fake `curl` and `go` first on PATH: curl answers # the package probe as FAKE_MODE says, and `go` stops the run right after the check, so nothing is built or published. # published (200) -> refused, "ALREADY PUBLISHED" # absent (404) -> passes the check, reaches the build # unreachable (000) -> refused, "could not establish" # server error (500) -> refused, "could not establish" # the tag already exists -> refused, "already exists" # Run: bash scripts/test_release_push_once.sh (exit 0 all cases right · 1 a case wrong) set -uo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" WS="$(mktemp -d)"; trap 'rm -rf "${WS:?}"' EXIT fails=0; ran=0 mkdir -p "$WS/bin" "$WS/repo/scripts" cp "$HERE/release-agent.sh" "$WS/repo/scripts/release-agent.sh" (cd "$WS/repo" && git init -q -b main && git -c user.name=t -c user.email=t@t commit -q --allow-empty -m init) cat > "$WS/bin/curl" <<'FAKE' #!/bin/bash case "${FAKE_MODE}" in published) printf 200; exit 0 ;; absent) printf 404; exit 22 ;; down) printf 000; exit 7 ;; error) printf 500; exit 22 ;; esac FAKE printf '#!/bin/sh\necho "FAKE-GO-REACHED $*"; exit 1\n' > "$WS/bin/go" chmod +x "$WS/bin/curl" "$WS/bin/go" run() { # name, mode, expected rc, required fragment, forbidden fragment local out rc out=$(cd "$WS/repo" && FAKE_MODE="$2" RELEASE_ALLOW_DIRTY=1 GITEA_USER=u GITEA_TOKEN=t PATH="$WS/bin:$PATH" \ bash scripts/release-agent.sh 9.9.9 2>&1); rc=$? ran=$((ran+1)) if [[ "$rc" != "$3" ]] || ! grep -qi -- "$4" <<<"$out" || { [[ -n "$5" ]] && grep -qi -- "$5" <<<"$out"; }; then fails=$((fails+1)); echo " FAIL $1 (exit $rc)"; echo "$out" | tail -4 | sed 's/^/ /'; return fi echo " ok $1" } echo "release-agent.sh — a version is released once, and only when the registry says it is new" run "published (200) -> refused" published 1 "ALREADY PUBLISHED" "FAKE-GO-REACHED" run "absent (404) -> proceeds" absent 1 "FAKE-GO-REACHED" "could not establish" run "unreachable (000) -> refused" down 1 "could not establish" "FAKE-GO-REACHED" run "server error (500) -> refused" error 1 "could not establish" "FAKE-GO-REACHED" (cd "$WS/repo" && git tag v9.9.9) run "the tag exists -> refused" absent 1 "already exists" "FAKE-GO-REACHED" echo if [[ $fails -eq 0 ]]; then echo "all $ran cases behaved"; exit 0; fi echo "$fails of $ran cases FAILED"; exit 1