diff --git a/docs/releasing-homebrew.md b/docs/releasing-homebrew.md index 27dc55b..3f0526e 100644 --- a/docs/releasing-homebrew.md +++ b/docs/releasing-homebrew.md @@ -5,13 +5,13 @@ This is the required `verified-hashes-v1` Formula handoff contract for a publish ## Frozen Tap Trust Anchor - Repository: `openclaw/homebrew-tap`. -- Pinned base commit: `104616d9828cf28202bccff19c0738f179c2a3f8`. +- Pinned base commit: `c697e7ce1bf42f8c4a8c909e117204f3beadd088`. - Workflow: `.github/workflows/update-formula.yml`. - Workflow numeric ID: `220664022`. - Updater: `.github/scripts/update_formula.py`. - Required updater marker: `# verified-hashes-v1`. -This base includes the [Formula migration](https://github.com/openclaw/homebrew-tap/pull/56) and the [literal-URL updater fix](https://github.com/openclaw/homebrew-tap/pull/57). Verified updates must retain literal release URLs so Homebrew can infer the version without an explicit version declaration. +This base includes the [Formula migration](https://github.com/openclaw/homebrew-tap/pull/56), [literal-URL updater fix](https://github.com/openclaw/homebrew-tap/pull/57), and [trust-marker restoration](https://github.com/openclaw/homebrew-tap/pull/58). Verified updates must retain literal release URLs so Homebrew can infer the version without an explicit version declaration. The protected default branch, workflow bytes, updater bytes (including `.github/scripts/formula_text.py` at the pinned commit), and marker must match this pinned contract before dispatch. A newer tap commit is not implicitly trusted. diff --git a/scripts/release-local b/scripts/release-local index f817a11..97f2689 100755 --- a/scripts/release-local +++ b/scripts/release-local @@ -13,7 +13,7 @@ readonly EXPECTED_GO_VERSION="go1.26.8" readonly VERIFIER_WORKFLOW=".github/workflows/release-assets.yml" readonly VERIFIER_WORKFLOW_ID="311062804" readonly TAP_REPOSITORY="openclaw/homebrew-tap" -readonly TAP_BASE="104616d9828cf28202bccff19c0738f179c2a3f8" +readonly TAP_BASE="c697e7ce1bf42f8c4a8c909e117204f3beadd088" readonly TAP_WORKFLOW=".github/workflows/update-formula.yml" readonly TAP_WORKFLOW_ID="220664022" readonly TAP_UPDATER=".github/scripts/update_formula.py" diff --git a/scripts/test-release-local.sh b/scripts/test-release-local.sh index 13e5fda..d0045ec 100755 --- a/scripts/test-release-local.sh +++ b/scripts/test-release-local.sh @@ -202,7 +202,7 @@ EOF export GOPLACES_RELEASE_LOCAL_TESTING=1 GOPLACES_RELEASE_LOCAL_SOURCE_ONLY=1 source "$1"; homebrew_command --debug install --formula hostile.rb ' _ "$release_script" - grep -Fq 'readonly TAP_BASE="104616d9828cf28202bccff19c0738f179c2a3f8"' "$release_script" || die "tap trust base is not pinned" + grep -Fq 'readonly TAP_BASE="c697e7ce1bf42f8c4a8c909e117204f3beadd088"' "$release_script" || die "tap trust base is not pinned" grep -Fq 'readonly TAP_WORKFLOW_ID="220664022"' "$release_script" || die "tap workflow numeric identity is not pinned" grep -Fq 'readonly TAR_BIN="/usr/bin/bsdtar"' "$release_script" || die "system tar does not name the canonical nonsymlink executable" grep -Fq 'HOMEBREW_NO_INSTALL_FROM_API=1' "$release_script" || die "Homebrew package inventory can trigger API installation" @@ -2613,7 +2613,7 @@ prepare_homebrew_dispatch_fixture() { ) hb_title="$(jq -er '.expected_title' "${hb_state}/homebrew-intent.json")" jq -n --argjson id 29010348667 --arg title "$hb_title" \ - --arg sha 104616d9828cf28202bccff19c0738f179c2a3f8 --arg repo openclaw/homebrew-tap '{ + --arg sha c697e7ce1bf42f8c4a8c909e117204f3beadd088 --arg repo openclaw/homebrew-tap '{ id:$id,workflow_id:220664022,path:".github/workflows/update-formula.yml",display_title:$title, event:"workflow_dispatch",head_branch:"main",head_sha:$sha,status:"completed",conclusion:"success", run_attempt:1,created_at:"2026-07-10T10:00:00Z",repository:{full_name:$repo}, @@ -2665,7 +2665,7 @@ run_homebrew_dispatch_fixture() { tap_default_branch=main tap_workflow_id=220664022 if ((hb_call == 1)) && [[ "$hb_mode" != direct-child && "$hb_mode" != unbound-child ]]; then - tap_head=104616d9828cf28202bccff19c0738f179c2a3f8 + tap_head=c697e7ce1bf42f8c4a8c909e117204f3beadd088 else tap_head=3333333333333333333333333333333333333333 fi @@ -3056,8 +3056,8 @@ endpoint="" for arg in "$@"; do case "$arg" in repos/*) endpoint="$arg" ;; esac; done case "$endpoint" in repos/openclaw/homebrew-tap) printf '{"default_branch":"main"}\n' ;; - repos/openclaw/homebrew-tap/branches/main) printf '{"name":"main","protected":%s,"commit":{"sha":"%s"}}\n' "${TAP_PROTECTED:-true}" "${TAP_HEAD:-104616d9828cf28202bccff19c0738f179c2a3f8}" ;; - repos/openclaw/homebrew-tap/compare/104616d9828cf28202bccff19c0738f179c2a3f8...104616d9828cf28202bccff19c0738f179c2a3f8) + repos/openclaw/homebrew-tap/branches/main) printf '{"name":"main","protected":%s,"commit":{"sha":"%s"}}\n' "${TAP_PROTECTED:-true}" "${TAP_HEAD:-c697e7ce1bf42f8c4a8c909e117204f3beadd088}" ;; + repos/openclaw/homebrew-tap/compare/c697e7ce1bf42f8c4a8c909e117204f3beadd088...c697e7ce1bf42f8c4a8c909e117204f3beadd088) printf '{"status":"%s","base_commit":{"sha":"%s"},"merge_base_commit":{"sha":"%s"},"head_commit":{"sha":"%s"}}\n' "${TAP_COMPARE_STATUS:-identical}" "${TAP_COMPARE_BASE:-$TAP_BASE}" "${TAP_COMPARE_MERGE_BASE:-$TAP_BASE}" "${TAP_COMPARE_HEAD:-$TAP_BASE}" ;; repos/openclaw/homebrew-tap/contents/.github/workflows/update-formula.yml*) @@ -3074,7 +3074,7 @@ EOF export MOCK_FIXTURE_ROOT="$scratch" GOPLACES_RELEASE_LOCAL_TEST_GH_BIN="${mock_bin}/gh" if ( export GOPLACES_RELEASE_LOCAL_TESTING=1 GOPLACES_RELEASE_LOCAL_SOURCE_ONLY=1 - export GH_BLOCKER_LOG="$log" TAP_BASE="104616d9828cf28202bccff19c0738f179c2a3f8" WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" + export GH_BLOCKER_LOG="$log" TAP_BASE="c697e7ce1bf42f8c4a8c909e117204f3beadd088" WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" PATH="${mock_bin}:$PATH" export PATH # shellcheck source=release-local @@ -3090,7 +3090,7 @@ EOF mkdir -p "${scratch}/work-moved" if ( export GOPLACES_RELEASE_LOCAL_TESTING=1 GOPLACES_RELEASE_LOCAL_SOURCE_ONLY=1 - export GH_BLOCKER_LOG="$log" TAP_BASE="104616d9828cf28202bccff19c0738f179c2a3f8" TAP_HEAD="3333333333333333333333333333333333333333" WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" + export GH_BLOCKER_LOG="$log" TAP_BASE="c697e7ce1bf42f8c4a8c909e117204f3beadd088" TAP_HEAD="3333333333333333333333333333333333333333" WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" PATH="${mock_bin}:$PATH" export PATH source "$release_script" @@ -3106,7 +3106,7 @@ EOF mkdir -p "${scratch}/work-unprotected" if ( export GOPLACES_RELEASE_LOCAL_TESTING=1 GOPLACES_RELEASE_LOCAL_SOURCE_ONLY=1 - export GH_BLOCKER_LOG="$log" TAP_BASE="104616d9828cf28202bccff19c0738f179c2a3f8" TAP_PROTECTED=false WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" + export GH_BLOCKER_LOG="$log" TAP_BASE="c697e7ce1bf42f8c4a8c909e117204f3beadd088" TAP_PROTECTED=false WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" PATH="${mock_bin}:$PATH" export PATH source "$release_script" @@ -3121,7 +3121,7 @@ EOF mkdir -p "${scratch}/work-bad-compare" if ( export GOPLACES_RELEASE_LOCAL_TESTING=1 GOPLACES_RELEASE_LOCAL_SOURCE_ONLY=1 - export GH_BLOCKER_LOG="$log" TAP_BASE="104616d9828cf28202bccff19c0738f179c2a3f8" TAP_COMPARE_STATUS=ahead WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" + export GH_BLOCKER_LOG="$log" TAP_BASE="c697e7ce1bf42f8c4a8c909e117204f3beadd088" TAP_COMPARE_STATUS=ahead WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" PATH="${mock_bin}:$PATH" export PATH source "$release_script" @@ -3139,7 +3139,7 @@ EOF export "$compare_control=3333333333333333333333333333333333333333" if ( export GOPLACES_RELEASE_LOCAL_TESTING=1 GOPLACES_RELEASE_LOCAL_SOURCE_ONLY=1 - export GH_BLOCKER_LOG="$log" TAP_BASE="104616d9828cf28202bccff19c0738f179c2a3f8" WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" + export GH_BLOCKER_LOG="$log" TAP_BASE="c697e7ce1bf42f8c4a8c909e117204f3beadd088" WORKFLOW_CONTENT="$workflow_content" UPDATER_CONTENT="$updater_content" PATH="${mock_bin}:$PATH" export PATH source "$release_script"