chore: 规范标点
This commit is contained in:
1 parent
e54390a9f8
commit
15e79887fa
84 files changed
+5439
-5398
No files matched your search
+25
-25
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user