chore: 规范标点

This commit is contained in:
pluv committed 2026-10-03 14:43:43 +08:00
1 parent e54390a9f8
commit 15e79887fa
84 files changed
+5439 -5398

No files matched your search

+25 -25
View File
@@ -1,17 +1,17 @@
#!/usr/bin/env python3
"""confirm_check.py - 确认提示上的每一种回答都必须被正确处理
重点是 Ctrl-C。
重点是 Ctrl-C.
`confirm_tool` 用 fgets 读输入,而 SIGINT 会让 fgets 以 EINTR 失败、返回
NULL;代码把 NULL 当成"没人能回答,按默认值放行"。于是**在确认提示
上按 Ctrl-C 等于批准这次操作**。run_command 侥幸自己查了中断标志才没执行,
write_file / edit_file 没查,文件照写。
`confirm_tool` 用 fgets 读输入, 而 SIGINT 会让 fgets 以 EINTR 失败、返回
NULL; 代码把 NULL 当成"没人能回答, 按默认值放行". 于是**在确认提示
上按 Ctrl-C 等于批准这次操作**. run_command 侥幸自己查了中断标志才没执行,
write_file / edit_file 没查, 文件照写.
这个脚本把三种回答都跑一遍,直接看磁盘上有没有留下东西:
这个脚本把三种回答都跑一遍, 直接看磁盘上有没有留下东西:
Ctrl-C -> 必须拒绝
n -> 必须拒绝
y -> 必须执行(否则就是"修过头"了)
y -> 必须执行 (否则就是"修过头"了)
用法:
confirm_check.py <ligent 二进制> <mock base-url>
@@ -22,19 +22,19 @@ import select
import sys
import time
# 探针文件放在 build/ 下,别弄脏仓库根目录
# WRITE_TEST 写这一个;WRITE2_TEST 写 PROBE1 / PROBE2(一轮里两次)
# 探针文件放在 build/ 下, 别弄脏仓库根目录
# WRITE_TEST 写这一个; WRITE2_TEST 写 PROBE1 / PROBE2 (一轮里两次)
PROBE = "build/tmp/confirm_probe.txt"
PROBE1 = "build/tmp/confirm_probe1.txt"
PROBE2 = "build/tmp/confirm_probe2.txt"
# 只认稳定前缀:选项列表是会变的(现在是 Y/N/Always/neVer),
# 写死整串会在改提示文案时把测试弄坏。
# 只认稳定前缀:选项列表是会变的 (现在是 Y/N/Always/neVer),
# 写死整串会在改提示文案时把测试弄坏.
MARK = "继续?"
PROMPT_READY = b"\x1b[?2004h"
def run_case(binary, base, answer, wait_confirm=6.0):
"""跑一轮:触发 write_file → 等确认提示出现 → 回答 → 看文件在不在。"""
"""跑一轮:触发 write_file → 等确认提示出现 → 回答 → 看文件在不在. """
try:
os.unlink(PROBE)
except OSError:
@@ -69,7 +69,7 @@ def run_case(binary, base, answer, wait_confirm=6.0):
return True
def wait_for(text, seconds):
"""一直读到 text 出现(或超时)。按标记等,不靠 sleep 猜。"""
"""一直读到 text 出现 (或超时). 按标记等, 不靠 sleep 猜. """
end = time.time() + seconds
while time.time() < end:
if text.encode("utf-8") in bytes(out):
@@ -105,13 +105,13 @@ def run_case(binary, base, answer, wait_confirm=6.0):
def run_turn_scope(binary, base):
"""Always / neVer 的作用域必须是"这一轮",不是整个会话。
"""Always / neVer 的作用域必须是"这一轮", 不是整个会话.
一轮里让模型连写两个文件:第一次问、答 Always,第二次不该再问。
然后开新的一轮(下一条用户消息),必须**重新问** —— 会话级的开关是
/yolo,不是这个。
一轮里让模型连写两个文件:第一次问、答 Always, 第二次不该再问.
然后开新的一轮 (下一条用户消息), 必须**重新问** —— 会话级的开关是
/yolo, 不是这个.
全程按标记同步("继续?"出现 / 回到提示符),不靠 sleep 猜时间。
全程按标记同步 ("继续?"出现 / 回到提示符), 不靠 sleep 猜时间.
"""
for p in (PROBE1, PROBE2):
try:
@@ -183,14 +183,14 @@ def run_turn_scope(binary, base):
os.write(fd, "WRITE2_TEST 写两个文件\n".encode())
wait_for(has_prompt, 8.0)
os.write(fd, b"Always\n")
# 等这一轮彻底跑完(回到提示符),别用固定时长猜
# 等这一轮彻底跑完 (回到提示符), 别用固定时长猜
wait_for(lambda: state["ready"] > base_ready, 10.0)
pump(0.3)
first_turn_prompts = prompt_count()
both_written = os.path.exists(PROBE1) and os.path.exists(PROBE2)
# ---- 第二轮:换一条用户消息,必须重新问 ----
# ---- 第二轮:换一条用户消息, 必须重新问 ----
base_ready = state["ready"]
before = prompt_count()
os.write(fd, "WRITE_LAST_TEST 再来一轮\n".encode())
@@ -255,7 +255,7 @@ def main():
n1, both, again, n2 = run_turn_scope(binary, base)
check("Always:同一轮里只问一次", n1 == 1, "实际问了 %d 次" % n1)
check("Always:同轮的第二次改动被放行", both, "第二个文件没写")
check("新一轮会重新询问(作用域仅限本轮)", again and n2 >= 1,
check("新一轮会重新询问 (作用域仅限本轮)", again and n2 >= 1,
"新一轮没有询问")
for p in (PROBE, PROBE1, PROBE2):
@@ -263,11 +263,11 @@ def main():
os.unlink(p)
except OSError:
pass
# 这里**不要** rmtree("build/tmp"):那是 e2e 各段共用的临时目录,删掉它
# 会连带清掉别人放进去的东西(我就因此丢过两次日志),而它自己的三个文件
# 上面已经删干净了。测试辅助脚本只该收拾自己造的东西。
# 这里**不要** rmtree("build/tmp"):那是 e2e 各段共用的临时目录, 删掉它
# 会连带清掉别人放进去的东西 (我就因此丢过两次日志), 而它自己的三个文件
# 上面已经删干净了. 测试辅助脚本只该收拾自己造的东西.
print("\n%d 项检查,%d 项失败" % (checks, fails))
print("\n%d 项检查, %d 项失败" % (checks, fails))
return 1 if fails else 0