Files
ray zhou 2dd9f17da9 ok
2026-06-29 14:51:55 +08:00

87 lines
2.5 KiB
Bash
Executable File

#!/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