Instead of failing and requiring manual fix + re-commit, the hook now runs ruff check --fix first, re-stages the fixed files, then checks for remaining unfixable issues. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
40 lines
991 B
Bash
Executable File
40 lines
991 B
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Pre-commit hook: ruff lint check on staged Python files.
|
|
# Catches syntax errors, unused imports, and basic issues before commit.
|
|
# To bypass in emergency: git commit --no-verify
|
|
#
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
REPO_ROOT=$(git rev-parse --show-toplevel)
|
|
cd "$REPO_ROOT"
|
|
|
|
STAGED_PY=$(git diff --cached --name-only --diff-filter=ACM -- '*.py')
|
|
if [ -z "$STAGED_PY" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
echo "ruff check on staged files..."
|
|
|
|
# Auto-fix what we can, then re-stage the fixed files
|
|
echo "$STAGED_PY" | xargs ruff check --fix --exit-zero
|
|
echo "$STAGED_PY" | xargs git add
|
|
|
|
# Now check for remaining unfixable issues
|
|
echo "$STAGED_PY" | xargs ruff check
|
|
RUFF_EXIT=$?
|
|
|
|
if [ $RUFF_EXIT -ne 0 ]; then
|
|
echo ""
|
|
echo -e "${RED}Pre-commit checks failed (unfixable issues). Commit blocked.${NC}"
|
|
echo -e "${YELLOW}To bypass (not recommended): git commit --no-verify${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}All checks passed.${NC}"
|
|
exit 0
|