#!/usr/bin/env zsh setopt ERR_EXIT PIPE_FAIL NOUNSET # Collect staged PHP and Twig files STAGED_PHP=() while IFS= read -r file; do [[ -n "$file" ]] && STAGED_PHP+=("$file") done < <(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.php$' || true) STAGED_TWIG=() while IFS= read -r file; do [[ -n "$file" ]] && STAGED_TWIG+=("$file") done < <(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.twig$' || true) if [[ ${#STAGED_PHP[@]} -eq 0 && ${#STAGED_TWIG[@]} -eq 0 ]]; then exit 0 fi # Use exec if the service is up, otherwise spin up a one-off container if docker compose exec -T php true 2>/dev/null; then DOCKER_CMD=(docker compose exec -T php) else echo "PHP service not running — using docker compose run..." DOCKER_CMD=(docker compose run --rm php) fi if [[ ${#STAGED_PHP[@]} -gt 0 ]]; then echo "PHP (${#STAGED_PHP[@]} file(s)): Rector → CS-Fixer → PHPStan" echo " → Rector" "${DOCKER_CMD[@]}" vendor/bin/rector process "${STAGED_PHP[@]}" git add "${STAGED_PHP[@]}" echo " → PHP-CS-Fixer" "${DOCKER_CMD[@]}" vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php "${STAGED_PHP[@]}" git add "${STAGED_PHP[@]}" echo " → PHPStan" "${DOCKER_CMD[@]}" vendor/bin/phpstan analyse "${STAGED_PHP[@]}" --no-progress fi if [[ ${#STAGED_TWIG[@]} -gt 0 ]]; then echo "Twig (${#STAGED_TWIG[@]} file(s)): Twig-CS-Fixer" echo " → Twig-CS-Fixer" "${DOCKER_CMD[@]}" vendor/bin/twig-cs-fixer fix "${STAGED_TWIG[@]}" git add "${STAGED_TWIG[@]}" fi