refactor: improve pre-commit hook to format only staged files

Changes:
- Format only staged PHP files (not all dirty files)
- Auto-stage only the files that were already staged
- Prevents accidentally staging unstaged changes
- Safer for partial staging workflows
- Maintains full automation for normal commits

This aligns with industry best practices from lint-staged
and prevents security risks from staging unintended files.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Jon Leopard
2025-11-16 22:21:54 -07:00
parent 8e1162a1c9
commit 60a375960f
3 changed files with 33 additions and 16 deletions

View File

@@ -23,10 +23,11 @@ chmod +x .githooks/*
### `pre-commit` - Laravel Pint Auto-formatter ✅ ENFORCED ### `pre-commit` - Laravel Pint Auto-formatter ✅ ENFORCED
**What it does:** **What it does:**
- Runs Laravel Pint on staged files only (`--dirty`) - Runs Laravel Pint on staged PHP files only (not unstaged files)
- Auto-formats code to match team standards - Auto-formats code to match team standards
- Automatically stages formatted files - Automatically re-stages the formatted files
- Fast feedback (runs in seconds) - Fast feedback (runs in seconds)
- Safe: Won't format or stage files you haven't explicitly added
**When it runs:** **When it runs:**
- Every time you run `git commit` - Every time you run `git commit`

View File

@@ -1,22 +1,37 @@
#!/bin/sh #!/bin/sh
# Laravel Pint Pre-commit Hook # Laravel Pint Pre-commit Hook
# Automatically format code before committing # Automatically format staged PHP files before committing
echo "🎨 Running Laravel Pint..." echo "🎨 Running Laravel Pint..."
# Run Pint on staged files only # Get only staged PHP files
./vendor/bin/pint --dirty STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.php$')
# Check if Pint made changes # Exit early if no PHP files are staged
if ! git diff --quiet; then if [ -z "$STAGED_FILES" ]; then
echo "✅ Code formatted! Files have been updated." echo "✅ No PHP files staged"
echo " Changes have been staged automatically."
# Stage the formatted files
git add -u
exit 0
else
echo "✅ Code style looks good!"
exit 0 exit 0
fi fi
# Run Pint only on staged files
echo "$STAGED_FILES" | xargs ./vendor/bin/pint
# Check if Pint made changes to any of the staged files
CHANGED=false
for file in $STAGED_FILES; do
if ! git diff --quiet "$file" 2>/dev/null; then
CHANGED=true
break
fi
done
# Re-stage the formatted files (only the ones that were already staged)
if [ "$CHANGED" = true ]; then
echo "✅ Code formatted! Files have been updated."
echo " Changes have been staged automatically."
echo "$STAGED_FILES" | xargs git add
else
echo "✅ Code style looks good!"
fi
exit 0

View File

@@ -1,5 +1,6 @@
<?php <?php
// Testing pre-commit hook - staged files only
use App\Http\Controllers\ProfileController; use App\Http\Controllers\ProfileController;
use App\Models\User; use App\Models\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;