#!/bin/bash # 跑 verify 门禁 + 对 git diff 中改动的 PHP 做 docker php -l。 # 路径由「当前工作区 + git 仓库根 + Docker 挂载」动态推导,不写死 slot-xxx。 set -euo pipefail SLOT_ROOT="${SLOT_ROOT:-${WORKSPACE_ROOT:-$(pwd)}}" SLOT_DOCKER_HOST_ROOT="${SLOT_DOCKER_HOST_ROOT:-/Users/ray/Documents/project}" SLOT_DOCKER_CONTAINER_ROOT="${SLOT_DOCKER_CONTAINER_ROOT:-/app}" PHP_CONTAINER="${PHP_CONTAINER:-php82}" VERIFY_SCRIPT="${VERIFY_SCRIPT:-$HOME/.cursor/hooks/verify-slot-backend.sh}" host_repo_to_container_wd() { local repo="$1" if [[ "$repo" != "$SLOT_DOCKER_HOST_ROOT"* ]]; then echo "" return 1 fi echo "${SLOT_DOCKER_CONTAINER_ROOT}${repo#$SLOT_DOCKER_HOST_ROOT}" } collect_changed_php() { local root="$1" local d rel abs for d in "$root"/* "$root"/backend "$root"/backend/*; do [ -d "${d}/.git" ] || continue git -C "$d" diff --quiet 2>/dev/null && git -C "$d" diff --cached --quiet 2>/dev/null && continue while IFS= read -r rel; do [ -z "$rel" ] && continue [[ "$rel" != *.php ]] && continue [[ "$rel" == vendor/* ]] && continue abs="$d/$rel" [ -f "$abs" ] || continue printf '%s\n' "$abs" done < <( { git -C "$d" diff --name-only 2>/dev/null git -C "$d" diff --cached --name-only 2>/dev/null } | sort -u ) done | sort -u } echo "=== slot-backend-completion-report ===" echo "SLOT_ROOT=$SLOT_ROOT" echo "SLOT_DOCKER_HOST_ROOT=$SLOT_DOCKER_HOST_ROOT" echo "" echo "--- verify-slot-backend ---" SLOT_ROOT="$SLOT_ROOT" bash "$VERIFY_SCRIPT" || verify_exit=$? verify_exit=${verify_exit:-0} echo "" echo "--- php -l (docker) ---" syntax_fail=0 changed_php=() while IFS= read -r abs; do [ -z "$abs" ] && continue changed_php+=("$abs") done < <(collect_changed_php "$SLOT_ROOT" || true) if [ ${#changed_php[@]} -eq 0 ]; then echo "(no changed php files)" else for abs in "${changed_php[@]}"; do repo=$(git -C "$(dirname "$abs")" rev-parse --show-toplevel 2>/dev/null) || { echo "SKIP (no git repo): $abs" continue } rel="${abs#"$repo"/}" container_wd=$(host_repo_to_container_wd "$repo") || { echo "SKIP (outside docker mount): $abs" continue } if ! docker exec -w "$container_wd" "$PHP_CONTAINER" php -l "$rel"; then syntax_fail=1 fi done fi echo "" echo "=== summary ===" if [ "$verify_exit" -ne 0 ] || [ "$syntax_fail" -ne 0 ]; then echo "FAIL (verify=$verify_exit syntax=$syntax_fail)" exit 1 fi echo "PASS (verify + php -l)" exit 0