From f51da33a658ce69543bd10cd4412da9a6be91a04 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:29:07 +0000 Subject: [PATCH] tools/ci/release-version-check.sh (rule 15): a release-0.3.N branch reads 0.3.N in Cargo.toml, Cargo.lock and version.h from its first commit; self-test on the 0.3.23 shape; wired into the pre-push gate Co-Authored-By: Claude Fable 5.1 --- tools/ci/pre-push.sh | 2 ++ tools/ci/release-version-check.sh | 40 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100755 tools/ci/release-version-check.sh diff --git a/tools/ci/pre-push.sh b/tools/ci/pre-push.sh index d401750cb..647a203b2 100755 --- a/tools/ci/pre-push.sh +++ b/tools/ci/pre-push.sh @@ -83,6 +83,8 @@ never_push_checks() { # the third never-push class (7 October 2026, 20:5x UK): a founder name on ANY branch, because every branch went to the public host's # mirror and a branch green-stamped before the check existed carried one onto master through the deferred merge run "no founder name, personal login, earlier business or personal address in any tracked text file (the pre-public scrub; self-test first, encoded list)" bash -c 'bash tools/ci/founder-strings-check.sh --self-test && bash tools/ci/founder-strings-check.sh' + # rule 15 (7 October 2026): a release branch reads its own version in Cargo.toml, Cargo.lock and version.h from its first commit + run "release-version: a release-0.3.N branch reads 0.3.N in Cargo.toml, Cargo.lock and version.h (self-test first)" bash -c 'bash tools/ci/release-version-check.sh --self-test && bash tools/ci/release-version-check.sh' } tree_checks() { diff --git a/tools/ci/release-version-check.sh b/tools/ci/release-version-check.sh new file mode 100755 index 000000000..ff7f09cf0 --- /dev/null +++ b/tools/ci/release-version-check.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# Rule 15 (7 October 2026, after the 0.3.23 miss): the version bump is a release branch's first commit. release-0.3.23 opened +# at 4cdcab31 and carried 0.3.22 in Cargo.toml, Cargo.lock and app/windows/version.h until 21:26 BST, so the app exes and the +# window host crossed from its first closed tip read 0.3.22 and were void. On a push to release-0.3.N this check reads the +# three version places against the branch name and goes red on a mismatch; a branch that is not release-* passes. +# +# tools/ci/release-version-check.sh [] # the current branch when omitted; exit 1 with the mismatch named +# tools/ci/release-version-check.sh --self-test # a release-0.3.23 tree reading 0.3.22 fails on every place; a matching tree passes; a feature branch passes +set -euo pipefail +cd "$(dirname "$0")/../.." +check() { # -> prints each mismatch, exit 1 if any + local branch="$1" toml="$2" lock="$3" vh="$4" want bad=0 + case "$branch" in release-*) want="${branch#release-}" ;; *) echo "release-version: $branch is not a release branch; nothing to check"; return 0 ;; esac + case "$want" in *.*.*) ;; *) echo "release-version: $branch is not a three-part version (rule 1)"; return 1 ;; esac + local got_toml got_lock got_h got_rc + got_toml=$(awk -F'"' '/^version = "/{print $2; exit}' "$toml") + got_lock=$(awk '/^name = "igneum-app"$/{f=1;next} f&&/^version = /{gsub(/"/,"",$3); print $3; exit}' "$lock") + got_h=$(awk -F'"' '/IGNEUM_HOST_VERSION_STR/{print $2; exit}' "$vh") + got_rc=$(awk '/IGNEUM_HOST_VERSION_RC/{print $3; exit}' "$vh" | tr -d ' ') + [ "$got_toml" = "$want" ] || { echo "release-version: $toml reads $got_toml, the branch is $branch"; bad=1; } + [ "$got_lock" = "$want" ] || { echo "release-version: $lock reads $got_lock for igneum-app, the branch is $branch"; bad=1; } + [ "$got_h" = "$want" ] || { echo "release-version: $vh IGNEUM_HOST_VERSION_STR reads $got_h, the branch is $branch"; bad=1; } + [ "$got_rc" = "$(echo "$want" | tr . ,),0" ] || { echo "release-version: $vh IGNEUM_HOST_VERSION_RC reads $got_rc, want $(echo "$want" | tr . ,),0"; bad=1; } + [ $bad = 0 ] && echo "release-version: $branch reads $want in Cargo.toml, Cargo.lock and version.h" + return $bad +} +if [ "${1:-}" = "--self-test" ]; then + T=$(mktemp -d); trap 'rm -rf "$T"' EXIT + printf '[package]\nname = "igneum-app"\nversion = "0.3.22"\n' > "$T/Cargo.toml" + printf '[[package]]\nname = "igneum-app"\nversion = "0.3.22"\n' > "$T/Cargo.lock" + printf '#define IGNEUM_HOST_VERSION_STR "0.3.22"\n#define IGNEUM_HOST_VERSION_RC 0,3,22,0\n' > "$T/version.h" + out=$(check release-0.3.23 "$T/Cargo.toml" "$T/Cargo.lock" "$T/version.h" 2>&1 || true) + [ "$(printf '%s\n' "$out" | grep -cF ' reads 0.3.22')" = 3 ] && printf '%s\n' "$out" | grep -q 'VERSION_RC reads 0,3,22,0' || { echo "self-test: the 0.3.23 miss was not caught on every place"; printf '%s\n' "$out"; exit 1; } + sed -i.bak 's/0\.3\.22/0.3.23/g; s/0,3,22,0/0,3,23,0/' "$T/Cargo.toml" "$T/Cargo.lock" "$T/version.h" + check release-0.3.23 "$T/Cargo.toml" "$T/Cargo.lock" "$T/version.h" >/dev/null || { echo "self-test: a matching tree failed"; exit 1; } + check driver-check "$T/Cargo.toml" "$T/Cargo.lock" "$T/version.h" >/dev/null || { echo "self-test: a feature branch failed"; exit 1; } + echo "self-test passed: the 0.3.23 shape fails on every place, a matching release tree passes, a feature branch passes"; exit 0 +fi +BRANCH="${1:-$(git rev-parse --abbrev-ref HEAD)}" +check "$BRANCH" app/igneum-app/Cargo.toml app/igneum-app/Cargo.lock app/windows/version.h