#!/usr/bin/env bash # pre-commit-checks.sh – Pre-Commit Checks (Lint + PHPUnit) # Wird vom Husky-Hook (.husky/pre-commit) und von scripts/safe-commit.sh aufgerufen. # # Abbruch mit Exit-Code != 0 bei Fehler. set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$REPO_ROOT" # ───────────────────────────────────────────────────────────── # 1) lint-staged (HTML, CSS, JS, JSON, MD, PHP-Syntax) # ───────────────────────────────────────────────────────────── if command -v npx >/dev/null 2>&1 && [ -f "node_modules/.bin/lint-staged" ]; then echo "🔍 Pre-Commit: lint-staged laeuft..." if ! npx lint-staged; then echo "" echo "❌ Pre-Commit: lint-staged fehlgeschlagen. Commit abgebrochen." exit 1 fi echo "✅ Pre-Commit: lint-staged OK" fi # ───────────────────────────────────────────────────────────── # 2) PHPUnit nur, wenn PHP-relevante Dateien gestaged sind # - *.php Quellcode & Tests # - phpunit.xml Test-Konfiguration # - composer.json PHP-Abhaengigkeiten # - composer.lock Lock-File # ───────────────────────────────────────────────────────────── # PHP-relevante Files (Array-basiert, robust gegen Spaces/Newlines in Filenames) mapfile -t PHP_TOUCHED_ARR < <(git diff --cached --name-only --diff-filter=ACMR \ | grep -E '\.(php)$|^phpunit\.xml$|^composer\.(json|lock)$' || true) if [ "${#PHP_TOUCHED_ARR[@]}" -gt 0 ]; then echo "" echo "==> PHP-Dateien geaendert -> PHPUnit wird ausgefuehrt" echo " Betroffene Dateien:" printf ' - %s\n' "${PHP_TOUCHED_ARR[@]}" # Safety-Check: alle gestaged PHP-Dateien muessen auf der Disk existieren. # Sonst wuerde PHPUnit eine inkonsistente Codebasis testen (Staged != Working Tree). MISSING=() for f in "${PHP_TOUCHED_ARR[@]}"; do [ -f "$f" ] || MISSING+=("$f") done if [ "${#MISSING[@]}" -gt 0 ]; then echo "" echo "FEHLER: Gestaged PHP-Dateien existieren nicht auf der Disk:" printf ' - %s\n' "${MISSING[@]}" echo " Loesung: 'git restore --staged ' oder Working-Tree synchronisieren." exit 1 fi # Composer-Deps nur installieren, falls noetig (Cache-Hit fuer wiederholte Commits) if [ ! -f "vendor/bin/phpunit" ]; then echo "" echo "==> vendor/ fehlt -> composer install laeuft" if ! command -v composer >/dev/null 2>&1; then echo "FEHLER: 'composer' ist nicht installiert." echo " Installation: https://getcomposer.org/download/" exit 1 fi composer install --no-interaction --prefer-dist --no-progress fi echo "" echo "==> PHPUnit laeuft..." if ! vendor/bin/phpunit; then echo "" echo "FEHLER: PHPUnit-Tests fehlgeschlagen. Commit abgebrochen." echo " Behebe die Fehler und versuche es erneut." exit 1 fi echo "" echo "==> PHPUnit OK" fi