forked from bchanot/claude
fix(portability): replace bash 4 builtins absent from macOS bash 3.2
macOS ships bash 3.2 as /bin/bash, which `#!/usr/bin/env bash` resolves to when no newer bash is on PATH. Two builtins the repo relies on do not exist there, and both failed SILENTLY: - `mapfile` in the three surgical-commit helpers left every array empty, so the scope guards passed on nothing (fail-OPEN) and the commits degraded to "nothing pending — no-op" while reporting success. deploy-commit.test.sh went 4/16; memory and doc commits simply never happened. - `declare -A` in the session-start hook errored on every session and left each plugin cost at 0, so the passive-budget warning could never fire. `_read_lines_into` is the portable equivalent of `mapfile`, space-safe and resetting its target first — expanding a never-assigned array trips `set -u` on bash < 4.4, which is how the empty arrays surfaced as "unbound variable". Plugin costs move to a `case`. source-scope.sh's header prescribed `mapfile` to its callers; it now shows the read loop, and its own test plus run-reconcile.sh stop using the builtin. deploy-commit 16/16, source-scope 34/34, run-reconcile 25 GREEN / 0 RED, session-start stderr empty.
This commit is contained in:
@@ -21,7 +21,10 @@ has() { printf '%s\n' "$1" | $GREP -qF -- "$2"; } # substring present in multi
|
||||
|
||||
echo "=== T1 recursive coherence — enumerate from BODY, never the ## Index ==="
|
||||
DRIFT="$FIX/registry-index-drift.md"
|
||||
mapfile -t IDS < <(reconcile_enumerate_ids "$DRIFT" LRN)
|
||||
# bash 3.2 (macOS /bin/bash) has no mapfile; read the ids explicitly. IDS is
|
||||
# seeded empty so `set -u` cannot trip on an unset array below.
|
||||
IDS=(); while IFS= read -r _id; do IDS+=("$_id"); done \
|
||||
< <(reconcile_enumerate_ids "$DRIFT" LRN)
|
||||
if [ "${#IDS[@]}" -eq 72 ]; then ok "T1a enumerated 72 body ids"; else no "T1a got ${#IDS[@]}, expected 72 (an Index-reader gives 51)"; fi
|
||||
if printf '%s\n' "${IDS[@]}" | $GREP -qx "LRN-020"; then ok "T1b includes body-only canary LRN-020"; else no "T1b dropped LRN-020 — read the Index, not the body"; fi
|
||||
# teeth: an Index-based enumerator would RED here (the fixture discriminates)
|
||||
|
||||
Reference in New Issue
Block a user