Repository navigation
v0.1.16
变更记录
- fix(tools): BOM 生成器 Go 地板取不到就报错,不许兜底出假地板——v0.1.42 曾把 hertz 的 1.26.0 写成 1.24.0(#100)
背景
gen_matrix_go.py 生成 BOM 时版本取远端 tag、Go 地板取本地 clone,两路口径分裂:
- 版本:
gen_versions.latest_version→_remote_tags(远端) - 地板:
git -C <dir> show <tag>:go.mod(本地 clone 的 git 对象)
本地 clone 还没 fetch 到那个 tag 时(多仓并行发版、clone 刚建、网络不稳),
git show 直接失败 ⇒ 落到旧实现的兜底分支 return m.group(1) if m else "1.24.0"。
关键点:兜底值 1.24.0 不是「未知」而是一个具体的、看起来合法的地板 —— 它和
「真的是 1.24.0 的仓」在产物里长得一模一样,下游无从分辨。地板低报比不报更危险:
不报会让人去查,报一个具体数字会让人以为那就是事实。
已污染一个发布物
BOM v0.1.42 把 hertz 写成 Go: "1.24.0",而 hertz v0.8.4 / v0.8.5 的 go.mod
都是 go 1.26.0(触发条件:生成时本地 hertz clone 尚未 fetch 到 v0.8.5)。
v0.1.42 已发布、tag 不可撤,只能补发 v0.1.43 修正 —— 但根因仍在,下一个 BOM
版本只要再撞上「本地 clone 缺 tag」就会重犯。
改动
scripts/gen_matrix_go.py:go_floor()fail-loud —— 取不到go.mod、或
go.mod里没有go指令 ⇒ 抛 SystemExit,错误消息里带可执行的修复步骤
(git fetch --tags)与 issue 编号;不再有任何默认地板。这与
matrix.remote_tags已有的口径一致:「读到空」≠「事实为空」(#79)。scripts/gen_matrix_go.py:新增ensure_local_tag()—— 取地板前若本地缺该 tag,
补一次git fetch --tags(只在真缺时做,稳态零额外网络开销;fetch 失败不抛,
真因仍由go_floor报,它的消息里带 git 的原始 stderr,更可诊断)。scripts/gen_matrix_go_selftest.py(新):反证怎么构造 —— 把「取不到就报错」
改回「兜底」,自测必须失败。5 例覆盖:正常路径取到真地板 / 本地缺 tag 必须抛错
(且消息里不含任何看起来合法的地板值)/go.mod无go指令同样抛错 /
ensure_local_tag能从 origin 补取 / 稳态不做额外 fetch。无副作用、不联网、
不依赖工作区布局(临时目录造 fixture 仓,「远端」用本地 bare 仓当 origin)。
已接线进.github/workflows/audit.yml的 selftest job。
兼容性
- happy path 零行为变化 ——
gen_matrix_go.py --check实跑仍报
✓ oekit BOM 与远端 tag 一致(v0.1.43,35 模块)。 - 产物格式零变化(仍是
Go:字段),只有「取不到」时从「写假值」变成「报错退出」。
变异验证(实跑)
把兜底改回 return m.group(1) if m else "1.24.0" ⇒ 反证 1、2 两条用例立刻 FAIL
(应当抛 SystemExit,却正常返回了);还原后 5 例全绿。
关联 #100(产物侧已由 BOM v0.1.43 修正)。