#!/bin/sh # ============================================================================= # freshen-channel — rebuild a tool's alpha or beta channel from its current # stable tag, so users tracking that channel are never on code older than # current stable. # # Usage: # ./freshen-channel # tool archive | transmittal | classifier | browse | landing | form | tables # channel alpha | beta # # Why this exists: # Stable releases do NOT automatically clobber alpha/beta files (see # AGENTS.md "Channel discipline" rule 4). After cutting stable v0.0.5, # users pinned to alpha may be on an older build than current stable — # that violates the stale-channel rule. Run this to drag alpha (or # beta) forward to whatever stable currently is. # # What it does: # 1. Finds the latest -v* tag. # 2. Creates a temporary git worktree at that tag — does NOT touch # your current branch or working tree. # 3. Runs /build.sh --release inside the worktree. # 4. Copies the resulting _.html into the main repo's # website/releases/. # 5. Removes the worktree. # # The on-page label of the freshened build will be # ` · · ` — the SHA encodes which # stable was used as the source, so anyone debugging can `git checkout` # that exact commit. # # Note: the build pipeline used is the one AT THE TAG, not the latest # main. That is intentional — pure reproducibility. If you have made # build-system improvements since stable was cut and want the freshen # to use them, cut a new stable that includes those changes first. # ============================================================================= set -eu TOOL="${1:-}" CHANNEL="${2:-}" case "$TOOL" in archive | transmittal | classifier | browse | landing | form | tables) ;; *) echo "usage: $0 " >&2 echo " tool: archive | transmittal | classifier | browse | landing | form | tables" >&2 exit 1 ;; esac case "$CHANNEL" in alpha | beta) ;; *) echo "usage: $0 " >&2 echo " channel: alpha | beta (stable is what you are freshening FROM)" >&2 exit 1 ;; esac REPO=$(cd "$(dirname "$0")" && pwd) # Find the latest stable tag for the tool. LATEST_TAG=$(git -C "$REPO" tag --list "${TOOL}-v*" --sort=-v:refname | head -1) if [ -z "$LATEST_TAG" ]; then echo "error: no stable tag found for ${TOOL} (looking for ${TOOL}-v*)" >&2 echo " cut a stable release first: sh ${TOOL}/build.sh --release [version]" >&2 exit 1 fi # Temporary detached worktree at the stable tag. Cleaned up on exit. WT=$(mktemp -d) cleanup() { git -C "$REPO" worktree remove --force "$WT" >/dev/null 2>&1 || true rm -rf "$WT" } trap cleanup EXIT INT TERM echo "Freshening ${TOOL} ${CHANNEL} from ${LATEST_TAG}" git -C "$REPO" worktree add --quiet --detach "$WT" "$LATEST_TAG" # Build in the worktree. The tool's build.sh resolves its release dir # from $ZDDC_DEPLOY_RELEASES_DIR (default $REPO/dist/release-output); # pass through whatever the parent process has set so freshen-channel # honors the same target as the regular build. DEPLOY_DIR="${ZDDC_DEPLOY_RELEASES_DIR:-$REPO/dist/release-output}" mkdir -p "$DEPLOY_DIR" ZDDC_DEPLOY_RELEASES_DIR="$DEPLOY_DIR" \ sh "$WT/${TOOL}/build.sh" --release "$CHANNEL" DST="$DEPLOY_DIR/${TOOL}_${CHANNEL}.html" if [ ! -f "$DST" ]; then echo "error: build did not produce $DST" >&2 exit 1 fi echo "Wrote $DST" echo "Done. ${CHANNEL} channel for ${TOOL} now reflects ${LATEST_TAG}." echo "Run ./deploy --releases to push it to the live site."