|  | 
| 2 | 2 | set -euo pipefail | 
| 3 | 3 | 
 | 
| 4 | 4 | # Enforce coupling between PRNG algorithm/version and golden regression vector. | 
| 5 |  | - | 
| 6 | 5 | PRNG_FILE="crates/rmg-core/src/math/prng.rs" | 
|  | 6 | +if git diff --cached --name-only | grep -qx "$PRNG_FILE"; then | 
|  | 7 | +  DIFF=$(git diff --cached -- "$PRNG_FILE" || true) | 
|  | 8 | +  # Heuristics to detect algorithm changes: edits to these functions imply behavior change | 
|  | 9 | +  if echo "$DIFF" | grep -E '^(\+|-)\s*(fn\s+next_u64|fn\s+from_seed_u64|fn\s+from_seed\(|fn\s+next_int\()' >/dev/null; then | 
|  | 10 | +    ALGO_CHANGED=1 | 
|  | 11 | +  else | 
|  | 12 | +    ALGO_CHANGED=0 | 
|  | 13 | +  fi | 
| 7 | 14 | 
 | 
| 8 |  | -# Only run if the PRNG file is staged | 
| 9 |  | -if ! git diff --cached --name-only | grep -qx "$PRNG_FILE"; then | 
| 10 |  | -  exit 0 | 
| 11 |  | -fi | 
| 12 |  | - | 
| 13 |  | -DIFF=$(git diff --cached -- "$PRNG_FILE" || true) | 
| 14 |  | - | 
| 15 |  | -# Heuristics to detect algorithm changes: edits to these functions imply behavior change | 
| 16 |  | -if echo "$DIFF" | grep -E '^(\+|-)\s*(fn\s+next_u64|fn\s+from_seed_u64|fn\s+from_seed\(|fn\s+next_int\()' >/dev/null; then | 
| 17 |  | -  ALGO_CHANGED=1 | 
| 18 |  | -else | 
| 19 |  | -  ALGO_CHANGED=0 | 
| 20 |  | -fi | 
| 21 |  | - | 
| 22 |  | -# Version bump present? | 
| 23 |  | -if echo "$DIFF" | grep -E 'PRNG_ALGO_VERSION' >/dev/null; then | 
| 24 |  | -  VERSION_CHANGED=1 | 
| 25 |  | -else | 
| 26 |  | -  VERSION_CHANGED=0 | 
| 27 |  | -fi | 
|  | 15 | +  # Version bump present? | 
|  | 16 | +  if echo "$DIFF" | grep -E 'PRNG_ALGO_VERSION' >/dev/null; then | 
|  | 17 | +    VERSION_CHANGED=1 | 
|  | 18 | +  else | 
|  | 19 | +    VERSION_CHANGED=0 | 
|  | 20 | +  fi | 
| 28 | 21 | 
 | 
| 29 |  | -# Golden regression vector updated? | 
| 30 |  | -if echo "$DIFF" | grep -E 'next_int_golden_regression|assert_eq!\(values,\s*vec!\[' >/dev/null; then | 
| 31 |  | -  GOLDEN_CHANGED=1 | 
| 32 |  | -else | 
| 33 |  | -  GOLDEN_CHANGED=0 | 
| 34 |  | -fi | 
|  | 22 | +  # Golden regression vector updated? | 
|  | 23 | +  if echo "$DIFF" | grep -E 'next_int_golden_regression|assert_eq!\(values,\s*vec!\[' >/dev/null; then | 
|  | 24 | +    GOLDEN_CHANGED=1 | 
|  | 25 | +  else | 
|  | 26 | +    GOLDEN_CHANGED=0 | 
|  | 27 | +  fi | 
| 35 | 28 | 
 | 
| 36 |  | -FAIL=0 | 
| 37 |  | -if [[ "$ALGO_CHANGED" -eq 1 && "$VERSION_CHANGED" -eq 0 ]]; then | 
| 38 |  | -  echo "pre-commit: PRNG algorithm changed but PRNG_ALGO_VERSION was not bumped." >&2 | 
| 39 |  | -  FAIL=1 | 
| 40 |  | -fi | 
|  | 29 | +  FAIL=0 | 
|  | 30 | +  if [[ "$ALGO_CHANGED" -eq 1 && "$VERSION_CHANGED" -eq 0 ]]; then | 
|  | 31 | +    echo "pre-commit: PRNG algorithm changed but PRNG_ALGO_VERSION was not bumped." >&2 | 
|  | 32 | +    FAIL=1 | 
|  | 33 | +  fi | 
| 41 | 34 | 
 | 
| 42 |  | -if [[ "$VERSION_CHANGED" -eq 1 && "$GOLDEN_CHANGED" -eq 0 ]]; then | 
| 43 |  | -  echo "pre-commit: PRNG_ALGO_VERSION bumped but golden regression vector was not updated." >&2 | 
| 44 |  | -  FAIL=1 | 
| 45 |  | -fi | 
|  | 35 | +  if [[ "$VERSION_CHANGED" -eq 1 && "$GOLDEN_CHANGED" -eq 0 ]]; then | 
|  | 36 | +    echo "pre-commit: PRNG_ALGO_VERSION bumped but golden regression vector was not updated." >&2 | 
|  | 37 | +    FAIL=1 | 
|  | 38 | +  fi | 
| 46 | 39 | 
 | 
| 47 |  | -if [[ "$FAIL" -eq 1 ]]; then | 
| 48 |  | -  echo "pre-commit: Refusing commit. Update algorithm version and golden regression together." >&2 | 
| 49 |  | -  exit 1 | 
|  | 40 | +  if [[ "$FAIL" -eq 1 ]]; then | 
|  | 41 | +    echo "pre-commit: Refusing commit. Update algorithm version and golden regression together." >&2 | 
|  | 42 | +    exit 1 | 
|  | 43 | +  fi | 
| 50 | 44 | fi | 
| 51 | 45 | 
 | 
| 52 |  | -exit 0 | 
| 53 |  | - | 
| 54 | 46 | # Format gate: run rustfmt check if Rust files are staged | 
| 55 | 47 | if git diff --cached --name-only | grep -E '\.rs$' >/dev/null; then | 
| 56 | 48 |   echo "[pre-commit] Running cargo fmt --all -- --check ..." | 
|  | 
0 commit comments