From 8c69a2a2090d07bce340c06209b476c73064efcc Mon Sep 17 00:00:00 2001 From: Rob MacEachern Date: Wed, 17 Jun 2026 11:02:57 -0500 Subject: [PATCH 1/2] Guard release script against mismatched tags --- Scripts/release.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Scripts/release.sh b/Scripts/release.sh index 0ccd35b2d..ed8feaf42 100755 --- a/Scripts/release.sh +++ b/Scripts/release.sh @@ -138,6 +138,13 @@ fi git fetch origin --tags target_sha=$(git rev-parse --verify "$target^{commit}") +existing_tag_sha=$(git rev-parse --verify --quiet "refs/tags/$version^{commit}" || true) + +if [[ -n "$existing_tag_sha" && "$existing_tag_sha" != "$target_sha" ]]; then + echo "Error: Tag $version already exists at $existing_tag_sha, not $target_sha." >&2 + echo "Choose a different version, delete or move the tag if it is wrong, or pass --target $existing_tag_sha." >&2 + exit 1 +fi if gh release view "$version" > /dev/null 2>&1; then echo "Error: A GitHub release already exists for $version." >&2 From 46f5dba2e24a225b4c924688651aa43248fd76be Mon Sep 17 00:00:00 2001 From: Rob MacEachern Date: Wed, 17 Jun 2026 11:09:17 -0500 Subject: [PATCH 2/2] Explain release tag resolution --- Scripts/release.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Scripts/release.sh b/Scripts/release.sh index ed8feaf42..998188f7c 100755 --- a/Scripts/release.sh +++ b/Scripts/release.sh @@ -138,6 +138,10 @@ fi git fetch origin --tags target_sha=$(git rev-parse --verify "$target^{commit}") + +# Resolve an existing version tag to its commit. The ^{commit} suffix peels +# annotated tags, and `|| true` lets a missing tag become an empty value under +# `set -e`. existing_tag_sha=$(git rev-parse --verify --quiet "refs/tags/$version^{commit}" || true) if [[ -n "$existing_tag_sha" && "$existing_tag_sha" != "$target_sha" ]]; then