ok
This commit is contained in:
86
skills/slot-backend-completion-report/scripts/report.sh
Executable file
86
skills/slot-backend-completion-report/scripts/report.sh
Executable file
@@ -0,0 +1,86 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user