87 lines
2.5 KiB
Bash
Executable File
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
|