Open
fix: 统一 CLI 模板的空值输出并保留布尔值 #34
fix: 统一 CLI 模板的空值输出并保留布尔值 #34
Open
liuxingsenAdd on 10 days ago
liuxingsenCollaborators
10 days ago

当前PR是否有AI参与:

[ ] 否

[x] 是
__1. AI Agent 平台: OpenAI Codex(会话元数据 cli_version: 0.155.1)
__2. AI 模型: gpt-6-astra
__3. Prompt上下文 : 升级指定仿真实例,继续比较真实设备与仿真的 DBus、Redfish、Web、CLI 接口;复现缺陷、修复、验证并提交任务 Issue 和 PR。模型参与实现、测试和代码复核。

PR功能描述 / 为什么需要这个合入:

响应含 JSON null 时,CLI 模板把它输出成 userdata: NULL;context 中 false 也会因 or 回退而丢失。VNC 信息查询可复现空字段泄漏内部类型。

修改方案:

将 cjson.null 与 nil 都输出为空,context 按 nil 判断缺失而保留 false/0;echo 与普通/转义插值使用一致转换。版本只升至 1.140.2。

验证方案:

验证 JSON null、缺失、false、0、函数返回 null、字面 、转义输出和 echo;确认正常 CLI 字段格式保持。

测试建议:

验证 JSON null、缺失、false、0、函数返回 null、字面 、转义输出和 echo;确认正常 CLI 字段格式保持。

自验证报告:

使用仿真实例真实 Lua/cjson/工具库运行生产模板引擎:新增 5 项回归全通过,其中 4 项在原引擎失败。完整相关集 13 项中 10 项通过,3 项 include 旧用例在修复前后均因尾部换行差异失败,未声称全绿。隔离运行真实 ipmcget -t vnc -d info,空字段不再打印 userdata: NULL,有效字段保持。pre-commit 通过。

最终部署验证(2026-10-29):使用提交 5ad8c696 的引擎,22000 完整冷启动后经普通 CLI 入口完成 35 条只读查询,VNC 空字段不再显示 userdata: NULL;布尔 false 与真正 nil 的 5 项新增回归均通过。现有完整模板测试仍有 3 项基线换行差异,未将其描述为全套通过。

该PR关联的issue

fixes #7

希望检视人员了解:

仅修复显示层,不把空字段视作已实现远程控制台功能,不伪造设备属性;实机只进行只读查询。 请维护者人工检视;未合入 PR,未执行合入机器人命令。

likedislike
Merge blocked
LliuxingsenCollaborators
10 days ago Created pull request, commit 472191b1
LliuxingsenCollaborators
10 days ago Associated issue: 统一 CLI 模板的空值输出并保留布尔值
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Set WeliveWelove,DataSculptor,huanghan,aaronlee as approver
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Added label: sig/sig-interface
openUBMC-robot
openUBMC-robotCollaborators
10 days ago Comments:

欢迎来到 openUBMC 社区

Hey @xiaoxinglxs , 感谢你对社区的贡献.

机器人使用手册

有关指令的使用,可以点击 说明文档 或 论坛 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。您可以自助配置此仓库的 PR 合并规则,更多详情,请参阅机器人自助配置使用手册。

联系指引

有疑问可以联系 SIG: sig-interface ,
维护者是: @DataSculptor, @WeliveWelove, @aaronlee, @huanghan ,
优秀贡献者是: @PLUS_ONE .

likedislike
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Added label: ai-co-authored
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Added label: openUBMC-cla/yes
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Added label: ai-includes-code
Oopenubmc-ci-botCollaborators
10 days ago Added label: ci-running
openubmc-ci-botCollaborators
10 days ago Comments:

CI已开始运行,查看流水线详情:流水线链接

likedislike
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Added label: ai-compliance-successful
openUBMC-robot
openUBMC-robotCollaborators
10 days ago Comments:

/ai review

likedislike
atomgit-bot
atomgit-botCollaborators
10 days ago Comments:

代码审查

审查结论

发现清单(按优先级)

  • P3 × 2:VIEW_ENV 中 false 值遮蔽 _G 全局的风险(置信度 0.3);echo 的 nil 分支缺少覆盖且用例名与实参不符(置信度 0.4)。
  • P0/P1/P2 无:未发现编译/语法、安全、数据一致性或高概率运行时回归问题。

逐文件复核

文件 结论
CHANGDELOG no issues(1.140.2 条目格式与既有条目一致,描述与实现相符)
mds/service.json no issues(仅 version 由 1.140.1 → 1.140.2,与 CHANGDELOG 同步;键名拼写未变,无新增拼写错误)
src/lualib/template/engine.lua 主逻辑改动正确:parser 对 {* *} 生成 template.output(...)、对 {{ }} 生成 template.escape(...)(escape 对非字符串委托 output),因此 cjson.null 在两处均被收敛为空串;echo 改用 template.output 后与插值口径一致;VIEW_ENV 按 nil 判定缺失,保留 false/0。仅余 1 条 P3 边界风险(false 遮蔽 _G 同名全局)
test/unit/test_template.lua 新增 5 个用例断言与实现一致(null→空、缺失→空、false/0 保留、函数返回 null、字面 <null> 转义、echo 组合);仅 1 条 P3 覆盖/命名问题(echo 的 nil 分支未覆盖)

总体风险判断

本次改动仅作用于 CLI 显示层,范围小、方向与 Issue #7 一致,cjson.null 的判定方式与仓库既有惯例(src/lualib/common.lua 中的 cjson.null 比较)保持一致,无破坏性契约变更。整体风险低,建议合入;上述两条 P3 属于可选改进,不阻塞合并。需注意的是,该测试文件中原有的 3 个 include 用例(尾随换行差异)在修复前后均失败,属于既有问题,不计入本次变更。

类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
Incorrect?
Oopenubmc-ci-botCollaborators
10 days ago Added label: limit_1k_suc
Oopenubmc-ci-botCollaborators
10 days ago Removed label: ci-running
openubmc-ci-botCollaborators
10 days ago Comments:
任务名称结果
pre-commit检查✅ SUCCESS
PR描述检查✅ SUCCESS
防投毒检查✅ SUCCESS
开源合规检查✅ SUCCESS
编译构建✅ SUCCESS
版本校验✅ SUCCESS
ipmi修改✅ SUCCESS
修改行数检查✅ SUCCESS
likedislike
Oopenubmc-ci-botCollaborators
10 days ago Added label: ci-successful
atomgit-bot
atomgit-botCollaborators10 days agoStart code review3
test/unit/test_template.lua
@@ -109,0 +139,4 @@
139+ 
140+function TestHtml:test_echo_formats_missing_and_boolean_values_consistently()
141+ local null = require('cjson').null
142+ lu.assertEquals(tmpl.process('{% echo(value, false, 0) %}', { value = null }), 'false0')
atomgit-bot
atomgit-bot10 days agoComments:

🔵 Low Priority

改动点:engine.lua:99 把 echo 从 tostring(...) 改为 template.output(...),这一改动的两个可观测行为变化是:①cjson.null 由 userdata: NULL 变为空串;②nil 由 nil 字面量变为空串。

新增用例 test_template.lua:140-142 名字是 test_echo_formats_missing_and_boolean_values_consistently,但实参只传了 cjson.null、false、0,并没有传真正「缺失」(nil / 上下文缺键)的值,因此上表第 ② 项(对既有模板输出影响最大的那条)没有任何断言覆盖。

失败模式:若后续有人回退/调整 echo 的 nil 处理(例如改回 tostring),测试仍然全绿,但 CLI 输出会重新出现 nil 字面量,属于静默回归。这是测试质量/覆盖缺口,不是运行时缺陷。

建议:在该用例中补充对真正缺失值(nil / context 无该键)的 echo 断言,例如断言 tmpl.process('{% echo(missing) %}', {}) == ''。

likedislike
Incorrect?
liuxingsenCollaborators
10 days ago Comments:

已补充两个实际缺失值断言:空 context 的 echo(missing) 输出空串,以及 echo(nil, false, 0) 输出 false0。真实来宾 Lua/cjson 上新增 5 项回归全部通过,pre-commit 通过。本轮只增加测试,生产 engine.lua 哈希保持不变。

对应提交:5ad8c6965717387ce7ed8d3f98568e4d8cb62951。

liuxingsenCollaborators
10 days ago Comments:

已补充两个实际缺失值断言:空 context 的 echo(missing) 输出空串,以及 echo(nil, false, 0) 输出 false0。真实来宾 Lua/cjson 上新增 5 项回归全部通过,pre-commit 通过。本轮只增加测试,生产 engine.lua 哈希保持不变。

对应提交:5ad8c6965717387ce7ed8d3f98568e4d8cb62951。

atomgit-bot
atomgit-botCollaborators10 days agoStart code review2
src/lualib/template/engine.lua
@@ -46,0 +44,4 @@
44+ if value ~= nil then
45+ return value
46+ end
47+ return t.template[k] or _G[k]
atomgit-bot
atomgit-bot10 days agoComments:

🔵 Low Priority

改动点:VIEW_ENV.__index(engine.lua:43-47)由 return t.context[k] or t.template[k] or _G[k] 改为「context[k] ~= nil 时直接返回」。这确实修好了 context 中 false 被丢弃的问题,但同时改变了回退语义:只要 context 里存在某个键且其值为 false,就再也不回退到 _G。

影响链:生成的视图代码里 template.*(如 template.output)走的是 env 表上的 raw 字段 template,不受影响;但视图 {% ... %} 代码里调用的 Lua 全局(ipairs/type/string/table/tostring 等)只能通过 __index → _G[k] 解析。若接口响应(context)中恰好含同名键且值为 false(例如 JSON {"type": false}、{"string": false}),改后 _G.type 会被 false 遮蔽。

失败模式:视图模板中若执行 {% for _, v in ipairs(list) do %} 或 {* type(v) *} 之类调用,会抛 attempt to call a boolean value 运行时报错,整条 CLI 命令失败;改前该场景会回退到全局函数而正常工作。触发需要「响应字段名与 Lua 全局同名 + 值为 false + 视图确实调用了该全局」,概率很低,故置信度给低。

建议:在保留 false 的同时避免遮蔽全局:当 context 取到的值为 boolean 且 _G[k] 存在时仍优先返回 _G[k],或显式限定只对业务数据键生效。

Suggestions
47
+ local value = t.context[k]
48
+ if value ~= nil then
49
+ if type(value) == 'boolean' and _G[k] ~= nil then
50
+ return _G[k]
51
+ end
52
+ return value
53
+ end
47
54
  return t.template[k] or _G[k]
Apply suggestion
likedislike
Incorrect?
liuxingsenCollaborators
10 days ago Comments:

已核对该兼容边界。context 在现有实现中本来优先于 template 和 _G(例如 true、0、字符串同名值均会遮蔽全局);本修复使 false 与其他真实业务值一致,仅 nil 代表缺失。建议的 boolean 特例会再次把名为 type/string 等字段中的合法 false 替换成全局对象,违背保留响应值的语义。Lua 环境无法根据后续是取值还是调用来选择不同值,因此暂不引入这种隐式特例。本项保留未解决,供维护者确认 context 命名空间的设计契约;未将解释当作已修复。

对应提交:5ad8c6965717387ce7ed8d3f98568e4d8cb62951。

LliuxingsenCollaborators
10 days ago Pre merge succeeded (commit_id: c5e86f55db35dac4986eb1e74c66a8eba5a8fb2c)
LliuxingsenCollaborators
10 days ago Force-pushed 1 commits:5ad8c696-fix: 统一 CLI 模板的空值输出并保留布尔值
LliuxingsenCollaborators
10 days ago Pre merge succeeded (commit_id: c5e86f55db35dac4986eb1e74c66a8eba5a8fb2c)
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Removed label: openUBMC-cla/yes
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Removed label: limit_1k_suc
openUBMC-robot
openUBMC-robotCollaborators
10 days ago Comments:

###注意:
当前PR代码已经发生变化(代码更新或者PR关闭),所以移除以下标签: limit_1k_suc.

likedislike
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Added label: openUBMC-cla/yes
openUBMC-robot
openUBMC-robotCollaborators
10 days ago Comments:

CLA 签署成功

xiaoxinglxs, 感谢您的代码贡献。 所有的代码贡献者都已完成了 CLA 签署。 👍

likedislike
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Added label: unresolved-reviews
openUBMC-robot
openUBMC-robotCollaborators
10 days ago Comments:

注意

当前PR有 2 条评论意见. 其中 2 条未处理完毕. 全部处理完后, 请评论 /check-pr 进行检查. 😄

likedislike
openUBMC-robot
openUBMC-robotCollaborators
10 days ago Comments:

注意

当前PR有 2 条评论意见. 其中 2 条未处理完毕. 全部处理完后, 请评论 /check-pr 进行检查. 😄

likedislike
openUBMC-robot
openUBMC-robotCollaborators
10 days ago Comments:

注意

当前PR有 2 条评论意见. 其中 2 条未处理完毕. 全部处理完后, 请评论 /check-pr 进行检查. 😄

likedislike
openUBMC-robotopenUBMC-robotCollaborators
10 days ago Removed label: ci-successful
Oopenubmc-ci-botCollaborators
10 days ago Added label: ci-running
openubmc-ci-botCollaborators
10 days ago Comments:

CI已开始运行,查看流水线详情:流水线链接

likedislike
Oopenubmc-ci-botCollaborators
10 days ago Added label: limit_1k_suc
Oopenubmc-ci-botCollaborators
10 days ago Removed label: ci-running
openubmc-ci-botCollaborators
10 days ago Comments:
任务名称结果
pre-commit检查✅ SUCCESS
PR描述检查✅ SUCCESS
防投毒检查✅ SUCCESS
开源合规检查✅ SUCCESS
编译构建✅ SUCCESS
版本校验✅ SUCCESS
ipmi修改✅ SUCCESS
修改行数检查✅ SUCCESS
likedislike
Oopenubmc-ci-botCollaborators
10 days ago Added label: ci-successful
LliuxingsenCollaborators
10 days ago Modify description of pull request