#!/usr/bin/env bash # # Size gate: fail if the stripped release daemon exceeds the section 5 budget. # # Usage: size-check.sh [binary-path] [max-bytes] # # Kept separate from ci.sh so the Gitea workflow can run it as its own step # against an artifact it has already built, rather than rebuilding. source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/lib.sh" # Default binary path. CARGO_TARGET_DIR may be absolute (the usual case — it # points outside the repo) or relative, so it must not be blindly joined onto # REPO_ROOT: doing that turns "/home/sp/.blocker-target/..." into # "/home/sp/blocker//home/sp/.blocker-target/...". DEFAULT_TARGET="${CARGO_TARGET_DIR:-${HOME}/.blocker-target}" if [[ "${DEFAULT_TARGET}" = /* ]]; then DEFAULT_BINARY="${DEFAULT_TARGET}/release/blocker-daemon" else DEFAULT_BINARY="${REPO_ROOT}/${DEFAULT_TARGET}/release/blocker-daemon" fi BINARY="${1:-${DEFAULT_BINARY}}" MAX_BYTES="${2:-${MAX_DAEMON_BYTES}}" # Normalise so the message shows the real path rather than a doubled prefix. BINARY="$(cd -- "$(dirname -- "${BINARY}")" 2>/dev/null && pwd)/$(basename -- "${BINARY}")" \ || die "binary not found: ${BINARY}" SIZE="$(stat -c %s "${BINARY}" 2>/dev/null || stat -f %z "${BINARY}")" # Human-readable, using 1024-based units to match how the budget is written. printf 'binary : %s\n' "${BINARY}" printf 'size : %s bytes (%d.%03d MB)\n' \ "${SIZE}" "$((SIZE / 1048576))" "$(((SIZE % 1048576) * 1000 / 1048576))" printf 'budget : %s bytes (%d MB)\n' "${MAX_BYTES}" "$((MAX_BYTES / 1048576))" if (( SIZE > MAX_BYTES )); then printf '%sOVER BUDGET by %s bytes%s\n' "${C_RED}" "$((SIZE - MAX_BYTES))" "${C_RESET}" exit 1 fi printf '%swithin budget, %s bytes headroom%s\n' \ "${C_GREEN}" "$((MAX_BYTES - SIZE))" "${C_RESET}"