1
0
Fork 0
mirror of https://github.com/imjasonh/nescript synced 2026-07-09 01:16:12 +00:00
nescript/scripts/pre-commit
Claude 57faf9e36a
commit built ROMs alongside .ne sources
The compiler is deterministic: rebuilding any example produces
a byte-identical ROM, verified across all 22 examples and all
four mappers (NROM, MMC1, UxROM, MMC3). That means the .nes
files are reproducible artefacts and can live next to their
sources without drift.

Benefits:

- Users can clone the repo and open any example in an emulator
  without installing a Rust toolchain or running the compiler.
- The emulator harness can trust examples/*.nes directly, so its
  CI job no longer needs a compiler build or a "compile all
  examples" loop — it just boots jsnes against the committed
  ROMs and diffs each against its golden.
- ROM diffs in PRs are now meaningful: "this compiler change
  flipped 17 bytes in hello_sprite.nes" is visible review
  signal, not hidden behind the emulator golden.

Guard rails so the ROMs don't drift from their sources:

- .gitignore no longer excludes *.nes.
- The `examples` CI job rebuilds every .ne into /tmp and fails
  loudly (with a GitHub error annotation pointing at the exact
  cargo command to rerun) if any committed ROM differs.
- scripts/pre-commit does the same check locally.
- CLAUDE.md now states that editing a .ne file requires
  rebuilding its .nes in the same commit, so future agents
  won't miss the invariant.

Total footprint: 22 ROMs, 624 KB (avg 28 KB each — most are
NROM 24 KB; two banked examples are larger).

https://claude.ai/code/session_01BcCcHi6FUmTh8jC7UgkA3A
2026-04-13 15:12:39 +00:00

42 lines
1.3 KiB
Bash
Executable file

#!/bin/sh
# Pre-commit hook for nescript
# Install: cp scripts/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit
set -e
echo "Running pre-commit checks..."
echo " Checking formatting..."
cargo fmt --all -- --check
echo " Running clippy..."
cargo clippy --all-targets -- -D warnings
echo " Running tests..."
cargo test --all-targets
# Committed ROMs must match their .ne sources — the compiler is
# deterministic, so any example whose on-disk .nes differs from a
# fresh build means someone edited the .ne file but forgot to
# rebuild. Rebuild each to a tmp path and fail if any differ, then
# point the user at the exact `cargo run` command to fix it.
echo " Checking committed ROMs match .ne sources..."
cargo build --release --quiet
tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT
stale=0
for f in examples/*.ne; do
name=$(basename "$f" .ne)
./target/release/nescript build "$f" --output "$tmp/$name.nes" >/dev/null
if ! cmp -s "examples/$name.nes" "$tmp/$name.nes"; then
echo " STALE: examples/$name.nes"
echo " rerun: cargo run --release -- build $f"
stale=1
fi
done
if [ $stale -ne 0 ]; then
echo "one or more committed ROMs are out of date"
exit 1
fi
echo "All pre-commit checks passed."