fix(cli): 程序名只替换模板占位符,不再改写用户数据(M82 r2 复审 P2)
r1 把 `rename` 套在**插值后的整条文本**上,于是用户数据被改坏:账户名恰好是 `ull` 会变成
`unlucky-launcher`,路径 `D:/tmp/ull/.ULL/...` 会变成 `D:/tmp/unlucky-launcher/.ULL/...`,
回显的子命令 `ull` 也会被改名。
改成模板占位符:文案里写 `%prog%`,**只在渲染时**(print_report / print_error / 帮助)替换成
argv[0] 的 basename。占位符只存在于静态模板里,插值进来的账户名 / 路径 / 子命令碰不到它。
用 `%prog%` 而不是 `{prog}`:这些模板要活在 `format!` 里,`{prog}` 会被 format! 当成参数名
编译失败。
同时补上 r1 漏的反方向:**stdout 的正常输出**(Report.human 与 warnings)现在也做替换,
以前只有 stderr 的错误做了,两边不一致。
回归测试:`user_data_that_says_ull_is_never_rewritten` 断言「账户名 `ull`」「路径 `\ull\`」
「未知命令 `ull`」在 fill 之后逐字不变。
占位符替换覆盖 21 个文件的 63 处文案;测试夹具里形如 `ull-mcp-diagnose-<pid>` 的临时目录名
已回滚为字面量(那不是文案)。
This commit is contained in:
1 parent
c9e6236a87
commit
2f8bbd1746
20 files changed
+99
-105
No files matched your search
@@ -77,11 +77,11 @@ pub fn print_report(
|
||||
}
|
||||
if !quiet {
|
||||
for line in &outcome.report.human {
|
||||
writeln!(out, "{line}")?;
|
||||
writeln!(out, "{}", fill_program(line))?;
|
||||
}
|
||||
}
|
||||
for warning in &outcome.warnings {
|
||||
writeln!(err, "提示: {warning}")?;
|
||||
writeln!(err, "提示: {}", fill_program(warning))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -101,16 +101,20 @@ pub fn print_error(
|
||||
writeln!(out, "{}", serde_json::to_string_pretty(&error.to_json())?)?;
|
||||
return Ok(());
|
||||
}
|
||||
writeln!(err, "错误: {}", rename_program(error.message()))?;
|
||||
writeln!(err, "错误: {}", fill_program(error.message()))?;
|
||||
if let Some(hint) = error.hint() {
|
||||
writeln!(err, "提示: {}", rename_program(hint))?;
|
||||
writeln!(err, "提示: {}", fill_program(hint))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// 文案里的 `ull` 按被调用的二进制名显示(M82):`unlucky-launcher lst` 不该把人指去敲 `ull`。
|
||||
fn rename_program(text: &str) -> String {
|
||||
crate::cli::program::rename(text, &crate::cli::program::name())
|
||||
/// 渲染文案里的程序名占位符(M82)。
|
||||
///
|
||||
/// **只替换占位符**,不对整条文本做词替换:消息里插值进来的账户名 / 路径 / 回显的子命令
|
||||
/// 一个字节都不动(r1 曾把账户名 `ull` 改成程序名、把 `D:/tmp/ull/.ULL` 改成
|
||||
/// `D:/tmp/unlucky-launcher/.ULL`)。
|
||||
fn fill_program(text: &str) -> String {
|
||||
crate::cli::program::fill(text)
|
||||
}
|
||||
|
||||
/// 长任务的实时进度行(**只进 stderr**,不参与 [`Report`])。
|
||||
|
||||
Reference in new issue
Block a user