Hooks: PHPUnit in Pre-Commit (#67) #70

Merged
greggy merged 3 commits from feature/issue-67-phpunit-precommit into main 2026-06-04 02:41:15 +02:00
Owner

Closes #67

Was

Der Pre-Commit-Hook (husky) ruft jetzt PHPUnit, bevor ein Commit landet. PHPUnit läuft nur, wenn PHP-relevante Dateien gestaged sind (Performance!).

Architektur

  • scripts/pre-commit-checks.sh (NEU, 77 Zeilen) — Zentrale Logik
    • Lint-Staged (HTML/CSS/JS/PHP) — unverändert
    • PHPUnit-Skip wenn keine PHP-Files gestaged
    • PHPUnit-Run mit composer install (lazy, nur wenn vendor/ fehlt)
    • Stale-Index Safety-Check (verhindert Tests mit gelöschten Files)
  • .husky/pre-commit (MODIFIZIERT, 3 Zeilen) — Delegiert an pre-commit-checks.sh
  • scripts/safe-commit.sh (MODIFIZIERT) — Nutzt gleiche Logik als Safety-Net (DRY)

Trigger-Filter (Performance-Optimum)

  • *.php, phpunit.xml, composer.json, composer.lock
  • → CSS/HTML/JS-only Commits überspringen PHPUnit komplett

Commits

  • 85cf4f3 chore(hooks): add shared pre-commit-checks script
  • b0f769d feat(hooks): run PHPUnit in pre-commit hook (#67)
  • 3f1f0f5 fix(hooks): use array-based file iteration for safety check

Verifizierte Szenarien (4/4 )

Szenario Erwartet Ergebnis
CSS-only commit PHPUnit skip Exit 0
PHP-Datei commit PHPUnit 18/18 grün Exit 0
Stale-Index (staged + deleted) Abbruch Exit 1
Filename mit Spaces Safety-Check korrekt Exit 0

Hinweise

  • Hook blockiert Commits bei Test-Failure (Exit-Code != 0)
  • Bypass via git commit --no-verify möglich (z.B. für triviale Doku-Commits)
Closes #67 ## Was Der Pre-Commit-Hook (`husky`) ruft jetzt PHPUnit, **bevor** ein Commit landet. PHPUnit läuft nur, wenn PHP-relevante Dateien gestaged sind (Performance!). ## Architektur - **`scripts/pre-commit-checks.sh` (NEU, 77 Zeilen)** — Zentrale Logik - Lint-Staged (HTML/CSS/JS/PHP) — unverändert - PHPUnit-Skip wenn keine PHP-Files gestaged - PHPUnit-Run mit `composer install` (lazy, nur wenn `vendor/` fehlt) - **Stale-Index Safety-Check** (verhindert Tests mit gelöschten Files) - **`.husky/pre-commit` (MODIFIZIERT, 3 Zeilen)** — Delegiert an `pre-commit-checks.sh` - **`scripts/safe-commit.sh` (MODIFIZIERT)** — Nutzt gleiche Logik als Safety-Net (DRY) ## Trigger-Filter (Performance-Optimum) - `*.php`, `phpunit.xml`, `composer.json`, `composer.lock` - → CSS/HTML/JS-only Commits überspringen PHPUnit komplett ## Commits - `85cf4f3` chore(hooks): add shared pre-commit-checks script - `b0f769d` feat(hooks): run PHPUnit in pre-commit hook (#67) - `3f1f0f5` fix(hooks): use array-based file iteration for safety check ## Verifizierte Szenarien (4/4 ✅) | Szenario | Erwartet | Ergebnis | |---|---|---| | CSS-only commit | PHPUnit skip | ✅ Exit 0 | | PHP-Datei commit | PHPUnit 18/18 grün | ✅ Exit 0 | | Stale-Index (staged + deleted) | Abbruch | ✅ Exit 1 | | Filename mit Spaces | Safety-Check korrekt | ✅ Exit 0 | ## Hinweise - Hook blockiert Commits bei Test-Failure (Exit-Code != 0) - Bypass via `git commit --no-verify` möglich (z.B. für triviale Doku-Commits)
greggy added 3 commits 2026-06-04 02:29:28 +02:00
Extrahiert die Pre-Commit-Checks (lint-staged + PHPUnit) in ein
gemeinsames Script, das sowohl vom Husky-Hook (.husky/pre-commit)
als auch von scripts/safe-commit.sh aufgerufen wird.

Logik:
- lint-staged laeuft immer (HTML/CSS/JS/JSON/MD/PHP-Syntax)
- PHPUnit laeuft nur, wenn PHP-relevante Dateien gestaged sind
  (*.php, phpunit.xml, composer.json, composer.lock)
- Safety-Check: alle gestaged PHP-Dateien muessen auf Disk existieren
- Bei Test-Fehler wird der Commit mit Exit-Code != 0 abgebrochen
- Composer-Deps werden nur bei Bedarf installiert (Cache-Hit)
feat(hooks): run PHPUnit in pre-commit hook (#67)
All checks were successful
Deploy Feature Branch to Test / PHP Syntax Check (push) Successful in 34s
Lint / PHP Syntax Check (push) Successful in 57s
Deploy Feature Branch to Test / CSS Lint (stylelint) (push) Successful in 1m41s
Deploy Feature Branch to Test / HTML Lint (htmlhint) (push) Successful in 1m39s
Lint / CSS Lint (stylelint) (push) Successful in 1m39s
Lint / HTML Lint (htmlhint) (push) Successful in 1m8s
Deploy Feature Branch to Test / Deploy to Test Environment (push) Successful in 30s
b0f769d186
Erweitert den Husky pre-commit-Hook um einen PHPUnit-Schritt.
Ausserdem wird scripts/safe-commit.sh aktualisiert, damit das
Safety-Net dieselbe Logik wie der Hook verwendet (kein doppelter Code).

Vorher: Hook rief nur 'npx lint-staged' auf.
Nachher: Hook ruft scripts/pre-commit-checks.sh auf, das
  - lint-staged ausfuehrt (unveraendert)
  - PHPUnit nur dann ausfuehrt, wenn PHP-relevante Dateien
    gestaged sind (Performance-Optimierung: Issue #67 Anforderung)
  - Bei Test-Fehler den Commit mit Exit-Code 1 abbricht

Closes #67
fix(hooks): use array-based file iteration for safety check
All checks were successful
Deploy Feature Branch to Test / PHP Syntax Check (push) Successful in 58s
Lint / PHP Syntax Check (push) Successful in 1m0s
Deploy Feature Branch to Test / HTML Lint (htmlhint) (push) Successful in 1m39s
Deploy Feature Branch to Test / CSS Lint (stylelint) (push) Successful in 1m42s
Deploy Feature Branch to Test / Deploy to Test Environment (push) Successful in 23s
Lint / HTML Lint (htmlhint) (push) Successful in 1m16s
Lint / CSS Lint (stylelint) (push) Successful in 1m21s
Lint / PHP Syntax Check (pull_request) Successful in 31s
Lint / CSS Lint (stylelint) (pull_request) Successful in 1m13s
Lint / HTML Lint (htmlhint) (pull_request) Successful in 1m4s
3f1f0f5788
mapfile + array prevents word-splitting issues with filenames
containing spaces or other shell-special characters. Affects both
the affected-files listing and the stale-index safety check.

Without this fix, a filename like 'My Module.php' would be split
into 'My' and 'Module.php', causing the disk-existence check to
look for wrong paths.
greggy merged commit b5073fd892 into main 2026-06-04 02:41:15 +02:00
Sign in to join this conversation.
No description provided.