#!/usr/bin/env bash # The in-loop verify: fmt everywhere, clippy and test on the changed crates and their dependents. # # The change set is the fork point against main plus staged, unstaged and untracked files. A path # under crates// scopes that package, docs/ and *.md scope nothing, and any other path runs # scripts/gates.sh, the workspace-wide chain run at land. # CHECK_FULL=1 goes straight to gates.sh. # # scripts/check.sh set -uo pipefail # Check the checkout you stand in when it is one of this repo, else this file's (as gates.sh does). here="$(cd "$(dirname "$0")/.." && pwd)" root="$(git rev-parse --show-toplevel 2>/dev/null || true)" [ -n "$root" ] && [ -f "$root/scripts/check.sh" ] || root="$here" cd "$root" || exit 1 if [ "${CHECK_FULL:-}" = "1" ]; then exec "$root/scripts/gates.sh" fi # ── The round's change set ─────────────────────────────────────────────────────────────────────── base="$(git merge-base HEAD main 2>/dev/null || git rev-parse HEAD)" changed="$( { git diff --name-only "$base" HEAD 2>/dev/null git diff --name-only HEAD 2>/dev/null git ls-files --others --exclude-standard 2>/dev/null; } | sort -u )" if [ -z "$changed" ]; then echo "check: no changes against main and a clean tree — nothing to verify" exit 0 fi # ── Map files → crate dirs; anything unmappable escalates to the full chain ────────────────────── dirs="" full_reason="" while IFS= read -r f; do case "$f" in docs/* | *.md) ;; # provably gate-inert (gates.sh's docs-only rule) crates/*/*) d="${f#crates/}"; dirs="$dirs DIR:crates/${d%%/*}" ;; *) full_reason="$f" ;; esac done <"$log" 2>&1; then echo "CHECK FAILED: $name" tail -30 "$log" exit 1 fi echo "check ok: $name" } run fmt cargo fmt --all -- --check run clippy cargo clippy $pflags --all-targets -- -D warnings # --no-fail-fast: one red test binary does not hide the failures in the ones after it. run test env BENILLA_SKIP_LOG="$skips" cargo test --no-fail-fast $pflags # Data-gated tests skip without the install or the addon corpus and libtest swallows their line, # so each skip is also logged to $BENILLA_SKIP_LOG and counted here. if [ -s "$skips" ]; then echo " test: $(wc -l <"$skips" | tr -d ' ') data-gated tests SKIPPED on this machine —" sort "$skips" | uniq -c | sort -rn | sed 's/^ *\([0-9]*\) \(.*\)/ \1 × \2/' echo " (they run where the data is: docs/CONTRIBUTING.md, \"Setting up\")" fi echo "CHECK GREEN (scoped: $pkgs)" echo " (the full chain, scripts/gates.sh, runs once on the tree that lands; a run before it repeats it)"