diff --git a/.githooks/pre-commit b/.githooks/pre-commit index d09c049..627b114 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -2,7 +2,23 @@ # smarm pre-commit gate: clippy the library (src/) with warnings as errors. # unwrap_used / expect_used are denied (Cargo.toml [lints.clippy]): library # code must not hide a panic behind unwrap/expect. Tests/examples are not gated. +# +# Toolchain resolution: prefer an installed cargo-clippy; on machines whose +# rust comes without the clippy component (e.g. NixOS home-manager), fall +# back to an ephemeral nix-shell toolchain. The fallback uses its own target +# dir (target/clippy) because the shell's rustc version may differ from the +# default toolchain's — mixed-compiler artifacts in one target dir are an +# E0514 hard error. MSRV (Cargo.toml rust-version) keeps the older shell +# toolchain a legitimate gate. set -eu [ -f "$HOME/.cargo/env" ] && . "$HOME/.cargo/env" cd "$(git rev-parse --show-toplevel)" -cargo clippy --lib -- -D warnings +if cargo clippy --version >/dev/null 2>&1; then + cargo clippy --lib -- -D warnings +elif command -v nix-shell >/dev/null 2>&1; then + nix-shell -p clippy -p cargo -p rustc \ + --run 'CARGO_TARGET_DIR=target/clippy cargo clippy --lib -- -D warnings' +else + echo "pre-commit: cargo clippy unavailable and no nix-shell fallback" >&2 + exit 1 +fi