#!/bin/sh
# pre-commit — 多任务并行防回退体检（7 项门禁），**fail-closed**。
#
# 门禁本体：.workbuddy/protect-check.py（REGISTRY=57 / CRLF / 品牌改名 /
#   math-mastery 署名 / mascot-v5 / physics-shell / t10-web-integrity）。
# 有 must 项 FAIL → 阻断提交；warn 项 FAIL 仅告警。
#
# 历史（2026-09-09）：原钩子仅存在于 .git/hooks/（不入版本控制），随 .git 目录
#   一起丢失。故改为把钩子源码入库 + 用 scripts/install-git-hooks.sh 安装。
#
# ── fail-closed 改版（team-lead 裁决 2-B · 2026-09-28）────────────────────────
# 原实现走 node 调 .workbuddy/protect-check.js。本机 node **派生不了任何子进程**
# （execSync/spawnSync 对 git.exe / cmd.exe 一律 EBUSY）⇒ 脚本在
# `git rev-parse --show-toplevel` 处抛错 → catch → 打印 SKIP → process.exit(0)。
# 结果：7 项门禁一项没跑，退出码却是 0 = **典型假通过**，全队提交裸奔。
#
# 新实现：
#   1) 直接调 protect-check.py（Python 派生进程在本机正常），**不再经 node**；
#   2) 任何「跑不起来」的路径（python 探测不到、门禁本体缺失、体检非零退出）
#      **一律 exit 1 阻断**，不存在 exit 0 的逃生口；
#   3) 仓库根仍用 git rev-parse --show-toplevel（钩子跑在 sh 里能起 git.exe；
#      起不来的那一个进程是 node，不是 sh）。
#
# 配套：.workbuddy/protect-check.py 的 t10-web-integrity 已收窄为「只比对本次
#   提交涉及的 web/ 文件」，否则在全任务线并行的仓库里，别人 web/ 一有 WIP
#   就会永久死锁（见该函数注释）。
#
# 注意：本文件是 .git/hooks/pre-commit 的**真源**，改完必须
#   sh scripts/install-git-hooks.sh 重装，别只改一处。

set -e

# 定位仓库根（钩子总在仓库根执行，但保险起见用 git 查）
ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
cd "$ROOT" || exit 1

# ── 门禁本体存在性：缺失即阻断（.workbuddy/ 被 .gitignore 排除 ⇒ 新建 clone /
#    git worktree 里都没有，此时**绝不能**放行）────────────────────────────
CHECKER=".workbuddy/protect-check.py"
if [ ! -f "$CHECKER" ]; then
  echo "⛔ pre-commit 阻断：缺少门禁本体 $CHECKER" >&2
  echo "      原因：.workbuddy/ 不入版本控制，新建 clone / git worktree 里不会有。" >&2
  echo "      处理：从主工作区复制 $CHECKER 过来，或联系维护者补齐。" >&2
  exit 1
fi

# ── python 探测：任何失败都 exit 1，不留「跳过」分支 ─────────────────────────
PY_BIN=""
for c in "$(command -v python 2>/dev/null || true)" \
         "$(command -v python3 2>/dev/null || true)"; do
  if [ -n "$c" ] && [ -x "$c" ]; then PY_BIN="$c"; break; fi
done
if [ -z "$PY_BIN" ]; then
  # managed python 的目录名带版本号（3.12.x → 3.13.x → …），写死版本号会在
  # 运行时升级后静默失配，故按版本号倒序扫描取最新。
  for c in $(ls -d "C:/Users/Administrator/.workbuddy/binaries/python/versions/"*/python.exe \
             2>/dev/null | sort -rV); do
    if [ -x "$c" ]; then PY_BIN="$c"; break; fi
  done
fi
if [ -z "$PY_BIN" ]; then
  echo "⛔ pre-commit 阻断：探测不到 python，无法执行防回退体检" >&2
  echo "      （宁可拦住，也不允许在未知状态下放行提交）" >&2
  exit 1
fi

# ── 实跑体检：非零退出即阻断 ─────────────────────────────────────────────────
if ! "$PY_BIN" "$CHECKER"; then
  echo "" >&2
  echo "⛔ pre-commit 阻断：防回退体检未通过（明细见上方）" >&2
  exit 1
fi

exit 0
