iter56-收尾

This commit is contained in:
DKChan committed 2026-11-08 03:47:33 +08:00
1 parent 5ec4a311bb
commit cedc2e0b5d
21 files changed
+1065 -529

No files matched your search

+21 -9
View File
@@ -20,6 +20,8 @@ gate_game_path() {
# 杀整棵进程树(<pid>)——递归杀子进程后杀本进程。macOS/Linux 走 pgrep -P;
# Windows 侧 MSYS kill 对其可见进程有效,带 wrapper 树的场景仍由调用方原 taskkill /T 逻辑负责。
# 注意:Windows Git Bash 实测无 pgrep/pkill(2026-11-08 修复批)——本函数在 Windows 退化成只杀
# 顶格进程,引擎子进程残留由调用方段末 kill_orphans 清场兜底(probe_gate/render_gate 均有段后清点)。
gate_kill_tree() {
local p c
kill -9 "$1" 2>/dev/null
@@ -29,26 +31,36 @@ gate_kill_tree() {
# 带超时执行(coreutils timeout 的纯 bash 替代,双平台同语义):
# gate_run_timeout <秒> <日志路径> <命令...>
# 命令输出重定向到日志;退出码=命令退出码,超时=124(与 coreutils 语义一致,判据与既有闸一致)。
# 实现=后台启动+守卫落标志文件(probe_gate run_suite 同款手法:taskkill 强杀后 wait 报 0 的
# 假绿以标志文件纠偏);超时先杀整树再回 124。
# 实现=后台启动+守卫轮询(守卫每 0.2 秒醒一次,看两样:停止文件在不在/到点没;
# 命令先完时父流程放停止文件,守卫看见即自己退场——没有嵌套长 sleep,从机制上无孤儿可留;
# 2026-11-08 修复批:旧版 mktemp 建标志文件「建时即真」致退出码恒 124+守卫被杀留孤儿 sleep
# 占输出管道至满档);到点未见停止文件=真超时:落标志文件+杀整树+回 124。
gate_run_timeout() {
local t="$1" log="$2"; shift 2
local kf
kf="$(mktemp "${TMPDIR:-/tmp}/gatetime_XXXXXX")"
local kf stop
kf="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.kf" # 只赋路径、不建文件——建时即真=旧缺陷病根(probe_gate run_suite 同款)
stop="${TMPDIR:-/tmp}/gatetime.$$.$RANDOM.stop"
rm -f "$kf" "$stop"
"$@" >"$log" 2>&1 &
local pid=$!
( sleep "$t" 2>/dev/null
touch "$kf"
gate_kill_tree "$pid"
( end=$((SECONDS+t))
until [ -f "$stop" ] || [ "$SECONDS" -ge "$end" ]; do
sleep 0.2 2>/dev/null || sleep 1
done
if [ ! -f "$stop" ]; then
touch "$kf"
gate_kill_tree "$pid"
fi
true ) &
local guard=$!
wait "$pid"; local st=$?
kill "$guard" 2>/dev/null; wait "$guard" 2>/dev/null
touch "$stop" # 放停止文件=通知守卫收工,0.2 秒内自退,无需 kill
wait "$guard" 2>/dev/null
if [ -f "$kf" ]; then
gate_kill_tree "$pid"
st=124
fi
rm -f "$kf"
rm -f "$kf" "$stop"
return "$st"
}
+2 -2
View File
@@ -2,7 +2,7 @@
# 合回前置检查钩子(git pre-merge-commit,2026-11-06 用户裁)——主工作区 git merge 落合并提交前
# 跑最小验证面:tools/run_all_gates.sh --premerge(冒烟测试+单元与集成全套件 4 分片,热导入缓存约 2 分钟)。
# 语义(git 2.45.2.windows.1 本机实测):本钩子拦的是「合并提交」不是「合并动作」——exit≠0 时合并结果
# 已进暂存区、仓库停 MERGE_HEAD 待提交态;处置二选一:修红后 git commit 续合,或 git merge --abort 放弃。
# 已进暂存区、仓库停 MERGE_HEAD 待提交态;处置唯一:git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合:该路径 pre-merge-commit/post-merge 两钩子零触发)。
# 快进合并不触发本钩子(git 语义)——本仓合回铁规恒 --no-ff,漏写时远端 CI 兜底仍在。
# --no-verify 可整体跳过(实测)——仅属用户,agent 禁用(worktree-guard 在案)。
# 仅主工作区触发(worktree 内合并不触发,与 post-merge 同款 git-dir 判别)。
@@ -18,7 +18,7 @@ RC=$?
if [ "$RC" -ne 0 ]; then
echo "" >&2
echo "[pre-merge-commit] ✗ 前置检查红(读数如上)——合并提交未落,仓库停 MERGE_HEAD 待提交态。" >&2
echo " 处置二选一:① 修红后 git commit 续合本合并;② 放弃整次合并=git merge --abort。" >&2
echo " 处置唯一:git merge --abort 放弃 → 回 worktree 处理 → 重新 git merge --no-ff(禁 git commit 续合:两合回钩子零触发)。" >&2
exit 1
fi
echo "[pre-merge-commit] ✓ 前置检查绿——合并提交继续。"