Simplify: Git hooks via nix flake check (no systemd, no activation, deleted module)
This commit is contained in:
130
SIMPLE_HOOKS.md
Normal file
130
SIMPLE_HOOKS.md
Normal file
@@ -0,0 +1,130 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user