|
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +# Pre-commit Git hook for development environment |
| 4 | +# Install with: git config core.hooksPath .githooks |
| 5 | + |
| 6 | +echo "Running pre-commit hooks..." |
| 7 | + |
| 8 | +# Check for Python syntax errors |
| 9 | +echo "Checking Python syntax..." |
| 10 | +FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.py$') |
| 11 | +if [ -n "$FILES" ]; then |
| 12 | + python -m flake8 $FILES |
| 13 | + if [ $? -ne 0 ]; then |
| 14 | + echo "Python syntax check failed! Fix errors before committing." |
| 15 | + exit 1 |
| 16 | + fi |
| 17 | +fi |
| 18 | + |
| 19 | +# Check JavaScript syntax |
| 20 | +echo "Checking JavaScript syntax..." |
| 21 | +FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.js$') |
| 22 | +if [ -n "$FILES" ]; then |
| 23 | + if command -v npx >/dev/null 2>&1; then |
| 24 | + npx eslint $FILES |
| 25 | + if [ $? -ne 0 ]; then |
| 26 | + echo "JavaScript syntax check failed! Fix errors before committing." |
| 27 | + exit 1 |
| 28 | + fi |
| 29 | + else |
| 30 | + echo "npx not found, skipping JavaScript syntax check" |
| 31 | + fi |
| 32 | +fi |
| 33 | + |
| 34 | +# Check for Docker Compose syntax errors |
| 35 | +echo "Checking Docker Compose syntax..." |
| 36 | +FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep -E 'compose\.ya?ml$') |
| 37 | +if [ -n "$FILES" ]; then |
| 38 | + if command -v docker-compose >/dev/null 2>&1; then |
| 39 | + docker-compose -f $FILES config >/dev/null |
| 40 | + if [ $? -ne 0 ]; then |
| 41 | + echo "Docker Compose syntax check failed! Fix errors before committing." |
| 42 | + exit 1 |
| 43 | + fi |
| 44 | + else |
| 45 | + echo "docker-compose not found, skipping Docker Compose syntax check" |
| 46 | + fi |
| 47 | +fi |
| 48 | + |
| 49 | +# Check for large files |
| 50 | +echo "Checking for large files..." |
| 51 | +# Block files larger than 10MB |
| 52 | +git diff --cached --name-only | while read FILE; do |
| 53 | + FILE_SIZE=$(git cat-file -s :$FILE) |
| 54 | + if [ $FILE_SIZE -gt 10485760 ]; then |
| 55 | + echo "Error: $FILE is larger than 10MB. Consider using Git LFS for large files." |
| 56 | + exit 1 |
| 57 | + fi |
| 58 | +done |
| 59 | + |
| 60 | +# Prevent committing to main branch directly |
| 61 | +BRANCH=$(git rev-parse --abbrev-ref HEAD) |
| 62 | +if [ "$BRANCH" = "main" ]; then |
| 63 | + echo "You can't commit directly to the main branch!" |
| 64 | + echo "Please create a feature branch and use a pull request instead." |
| 65 | + exit 1 |
| 66 | +fi |
| 67 | + |
| 68 | +# Check for .env files |
| 69 | +echo "Checking for .env files..." |
| 70 | +if git diff --cached --name-only | grep -q "\.env$"; then |
| 71 | + echo "Warning: You're attempting to commit an .env file!" |
| 72 | + echo "Environment files may contain sensitive information." |
| 73 | + read -p "Do you want to continue? (y/n): " response |
| 74 | + if [ "$response" != "y" ]; then |
| 75 | + exit 1 |
| 76 | + fi |
| 77 | +fi |
| 78 | + |
| 79 | +echo "Pre-commit hooks completed successfully!" |
| 80 | +exit 0 |
0 commit comments