From cb2ccf7ee80e1575d77d3cd9d46e68d1b9e131bb Mon Sep 17 00:00:00 2001 From: argszero Date: Wed, 5 Aug 2026 03:29:04 +0800 Subject: [PATCH] =?UTF-8?q?emrg:=20build-release=20=E4=BA=8C=E5=8D=81?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E4=BF=AE=E5=A4=8D=20=E2=80=94=20smoke=20Wind?= =?UTF-8?q?ows=20daemon=20HOME=20=E5=90=8C=E6=AD=A5=20+=20=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=AF=8A=E6=96=AD=EF=BC=88rant=20#13=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:Windows 分支经 cmd 启动 emrgd.cmd → 原生 python.exe 的 Path.home() 读 USERPROFILE(真实用户目录),不认 Git Bash 的 $HOME(mktemp 隔离目录)。 daemon 去真实目录找 config.toml → FileNotFoundError 崩溃 → 不写 port 文件, smoke 在隔离目录轮询 15s 无果。 修复: - Windows 下同步 USERPROFILE/HOMEDRIVE/HOMEPATH 到隔离 $HOME(cygpath -w) - daemon 启动输出保留到 emrgd-debug.log(原 /dev/null 丢弃),失败时 cat 诊断 traceback,避免下次盲猜 daemon did not write port file --- packaging/smoke-test.sh | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/packaging/smoke-test.sh b/packaging/smoke-test.sh index 1b858042..b32c165d 100755 --- a/packaging/smoke-test.sh +++ b/packaging/smoke-test.sh @@ -21,6 +21,14 @@ smoke_home="$(mktemp -d)" trap 'rm -rf "$smoke_home"' EXIT export HOME="$smoke_home" mkdir -p "$HOME/.emrg" +# R114: Windows 下经 cmd 启动的原生 python.exe 不认 Git Bash 的 $HOME — +# Path.home() 读 USERPROFILE/HOMEDRIVE/HOMEPATH。隔离 HOME 冒烟必须同步这三个 +# 变量,否则 daemon 会把 config/port 写到真实用户目录(config 缺失 → 崩溃不写 port)。 +if [ -n "${WINDIR:-}" ]; then + export USERPROFILE="$(cygpath -w "$HOME")" + export HOMEDRIVE="${USERPROFILE:0:2}" + export HOMEPATH="${USERPROFILE:2}" +fi say() { printf '\n==> %s\n' "$*"; } ok() { PASS=$((PASS+1)); printf ' ✓ %s\n' "$*"; } @@ -51,18 +59,23 @@ model = "deepseek-chat" EOF # R101:Windows Git Bash 的 nohup 后台 bash 脚本会立即退出(无 POSIX 进程模型) # → 用 cmd //c start /b emrgd.cmd 后台启动;POSIX 保持 nohup emrgd +# R114:输出保留到 emrgd-debug.log(不丢 /dev/null),daemon 启动失败时可诊断。 if [ -n "${WINDIR:-}" ]; then # $HOME 在 Git Bash 是 POSIX 路径(/c/Users/...),cmd 需 Windows 路径(C:\Users\...)→ cygpath -m EMRGD_CMD="$(cygpath -m "$HOME/.emrg/install/bin/emrgd.cmd")" - (cd "$HOME" && cmd //c "start /b $EMRGD_CMD" >/dev/null 2>&1) + (cd "$HOME" && cmd //c "start /b $EMRGD_CMD" >"$HOME/.emrg/emrgd-debug.log" 2>&1) else - nohup emrgd >/dev/null 2>&1 & + nohup emrgd >"$HOME/.emrg/emrgd-debug.log" 2>&1 & fi for i in $(seq 1 30); do [ -f "$HOME/.emrg/emrgd.port" ] && break sleep 0.5 done if [ ! -f "$HOME/.emrg/emrgd.port" ]; then + echo " [debug] emrgd-debug.log:" >&2 + cat "$HOME/.emrg/emrgd-debug.log" 2>/dev/null || true + echo " [debug] emrgd.log (tail):" >&2 + tail -20 "$HOME/.emrg/emrgd.log" 2>/dev/null || true fail "daemon did not write port file" else port=$(head -1 "$HOME/.emrg/emrgd.port") @@ -116,9 +129,9 @@ say "5. emrg rant" if [ -n "${WINDIR:-}" ]; then # $HOME 在 Git Bash 是 POSIX 路径(/c/Users/...),cmd 需 Windows 路径(C:\Users\...)→ cygpath -m EMRGD_CMD="$(cygpath -m "$HOME/.emrg/install/bin/emrgd.cmd")" - (cd "$HOME" && cmd //c "start /b $EMRGD_CMD" >/dev/null 2>&1) + (cd "$HOME" && cmd //c "start /b $EMRGD_CMD" >"$HOME/.emrg/emrgd-debug2.log" 2>&1) else - nohup emrgd >/dev/null 2>&1 & + nohup emrgd >"$HOME/.emrg/emrgd-debug2.log" 2>&1 & fi sleep 1 if emrg rant "smoke-test" 2>&1 | grep -qi "daemon not running"; then