# Git Hooks - Simple Declarative Setup ## Concept Hooks are defined in Nix (`flake.nix`) and installed by running `nix flake check` once. **No systemd services, no activation scripts, no complexity.** ## How It Works ### 1. Hooks Defined in Nix `flake.nix`: ```nix checks.${system}.pre-commit-check = git-hooks.lib.${system}.run { src = ./.; hooks = { nixfmt.enable = true; statix.enable = true; deadnix.enable = true; }; }; ``` ### 2. Installation Run once on each host: ```bash nix flake check ``` This installs the hooks and creates `.git/hooks/pre-commit`. ### 3. Automatic - ✅ Hooks run on every `git commit` - ✅ CI runs `nix flake check` automatically - ✅ Hooks checked on every push/PR ## Usage ### Install Hooks (One-Time Per Host) ```bash # From the flake directory nix flake check # You should see hooks installing ``` ### Verify Installation ```bash ls -la .git/hooks/ ``` Should show `pre-commit` (and potentially other hooks). ### Test Hooks ```bash # Create a file with bad formatting echo "broken { }" > test.nix # Try to commit (should fail) git add test.nix git commit -m "test" # Clean up rm test.nix ``` ## What's Declarative | Aspect | Status | |---------|--------| | Hook definitions | ✅ Yes - in `flake.nix` | | Hook installation | ✅ Yes - via `nix flake check` | | CI integration | ✅ Yes - via `nix flake check` in workflows | | Local git hooks | ✅ Yes - run automatically on commit | | No systemd services | ✅ Removed - too complex | | No activation scripts | ✅ Removed - unnecessary | | One-time setup | ✅ Yes - run `nix flake check` once per host | ## Files | File | Status | |------|--------| | `flake.nix` | ✅ Hook definitions | | `.github/workflows/flake-check.yaml` | ✅ CI uses `nix flake check` | | `.editorconfig` | ✅ Code style | | `modules/git-hooks/default.nix` | ❌ **DELETED** - Not needed | | `hosts/*/default.nix` | ✅ **CLEANED** - Removed git-hooks | ## Next Steps 1. Test locally: ```bash nix flake check ls -la .git/hooks/ echo "broken { }" > test.nix git add test.nix git commit -m "test" # Should fail rm test.nix ``` 2. Commit changes: ```bash git add . git commit -m "Simplify: Git hooks via nix flake check (no systemd, no activation)" git push ``` 3. Run `nix flake check` on each host when you next rebuild ## This Is The Right Approach Because | Issue | Overcomplicated Solution | Simple Solution | |-------|----------------------|----------------| | Declarative | ❌ Systemd service is separate from Nix | ✅ Hooks in `flake.nix`, install via `nix flake check` | | Simple | ❌ Multiple layers (activation, systemd) | ✅ One command: `nix flake check` | | Idempotent | ❌ Runs on every rebuild | ✅ Idempotent - run once per host | | Reproducible | ❌ Depends on systemd state | ✅ Pure Nix | ## Summary **The simplest declarative approach:** 1. Define hooks in `flake.nix` ✅ Already done 2. Run `nix flake check` once per host ✅ To do 3. That's it! Hooks work automatically ✅ Declarative No systemd services. No activation scripts. No complexity.