|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# Pre-commit hook for LifeContext |
| 4 | +# Place this file in .git/hooks/pre-commit with execute permissions |
| 5 | +# chmod +x .git/hooks/pre-commit |
| 6 | + |
| 7 | +set -e |
| 8 | + |
| 9 | +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 10 | +PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")" |
| 11 | + |
| 12 | +RED='\033[0;31m' |
| 13 | +GREEN='\033[0;32m' |
| 14 | +YELLOW='\033[1;33m' |
| 15 | +BLUE='\033[0;34m' |
| 16 | +NC='\033[0m' # No Color |
| 17 | + |
| 18 | +echo -e "${BLUE}========================================${NC}" |
| 19 | +echo -e "${BLUE} LifeContext Pre-Commit Checks${NC}" |
| 20 | +echo -e "${BLUE}========================================${NC}" |
| 21 | +echo "" |
| 22 | + |
| 23 | +# Check which files are staged |
| 24 | +STAGED_FILES=$(git diff --cached --name-only) |
| 25 | +STAGED_BACKEND=$(echo "$STAGED_FILES" | grep '^backend/' | wc -l) |
| 26 | +STAGED_FRONTEND=$(echo "$STAGED_FILES" | grep '^frontend/' | wc -l) |
| 27 | +STAGED_EXTENSION=$(echo "$STAGED_FILES" | grep '^Extension/' | wc -l) |
| 28 | + |
| 29 | +# Backend checks |
| 30 | +if [ $STAGED_BACKEND -gt 0 ]; then |
| 31 | + echo -e "${YELLOW}[1/3] Checking Backend files...${NC}" |
| 32 | + |
| 33 | + # Check Python syntax |
| 34 | + cd "$PROJECT_ROOT/backend" |
| 35 | + |
| 36 | + # Get staged Python files |
| 37 | + git diff --cached --name-only --diff-filter=d | grep '\.py$' | while read file; do |
| 38 | + if [ -f "$file" ]; then |
| 39 | + echo -n " Checking $file... " |
| 40 | + if python -m py_compile "$file" 2>/dev/null; then |
| 41 | + echo -e "${GREEN}✓${NC}" |
| 42 | + else |
| 43 | + echo -e "${RED}✗ Syntax Error${NC}" |
| 44 | + exit 1 |
| 45 | + fi |
| 46 | + fi |
| 47 | + done |
| 48 | + |
| 49 | + cd "$PROJECT_ROOT" |
| 50 | + echo "" |
| 51 | +fi |
| 52 | + |
| 53 | +# Frontend checks |
| 54 | +if [ $STAGED_FRONTEND -gt 0 ]; then |
| 55 | + echo -e "${YELLOW}[2/3] Checking Frontend files...${NC}" |
| 56 | + |
| 57 | + cd "$PROJECT_ROOT/frontend" |
| 58 | + |
| 59 | + # Check TypeScript syntax if modified |
| 60 | + if git diff --cached --name-only | grep -E '\.(ts|tsx|vue)$' >/dev/null; then |
| 61 | + echo -n " Running TypeScript check... " |
| 62 | + if npx tsc --noEmit 2>/dev/null; then |
| 63 | + echo -e "${GREEN}✓${NC}" |
| 64 | + else |
| 65 | + echo -e "${YELLOW}⚠ TypeScript issues (continuing)${NC}" |
| 66 | + fi |
| 67 | + fi |
| 68 | + |
| 69 | + cd "$PROJECT_ROOT" |
| 70 | + echo "" |
| 71 | +fi |
| 72 | + |
| 73 | +# Extension checks |
| 74 | +if [ $STAGED_EXTENSION -gt 0 ]; then |
| 75 | + echo -e "${YELLOW}[3/3] Checking Extension files...${NC}" |
| 76 | + |
| 77 | + cd "$PROJECT_ROOT/Extension" |
| 78 | + |
| 79 | + # Validate manifest.json if modified |
| 80 | + if git diff --cached --name-only | grep 'manifest.json' >/dev/null; then |
| 81 | + echo -n " Validating manifest.json... " |
| 82 | + if node -e "JSON.parse(require('fs').readFileSync('extension/manifest.json', 'utf8'))" 2>/dev/null; then |
| 83 | + echo -e "${GREEN}✓${NC}" |
| 84 | + else |
| 85 | + echo -e "${RED}✗ Invalid JSON${NC}" |
| 86 | + exit 1 |
| 87 | + fi |
| 88 | + fi |
| 89 | + |
| 90 | + cd "$PROJECT_ROOT" |
| 91 | + echo "" |
| 92 | +fi |
| 93 | + |
| 94 | +echo -e "${GREEN}========================================${NC}" |
| 95 | +echo -e "${GREEN}✅ Pre-commit checks passed!${NC}" |
| 96 | +echo -e "${GREEN}========================================${NC}" |
| 97 | +echo "" |
| 98 | + |
0 commit comments