fix(coexist): 复审 r1 返工——帮助文案跟上新落点 + 「替换了清单」进人读通道 + 导入建实例绑到内容目录(M216 P2/P3/§5)
P2-1 ② 改了缺省落点,CLI 自己的文档还在写旧行为 - `cli/help.rs`「目标目录缺省 = 数据根的共享游戏目录(.minecraft/)」→ 新实例目录 `<数据根>/instances/<实例名>`(并登记实例); - `cli/model.rs` 的 `PackImportArgs::target` 字段文档同步。 - 用例 `help_describes_the_new_default_target`(断言帮助含新落点、不含旧落点)。 P2-2 ③ 的「显式说明」进不了任何人读通道 - CLI:`human_lines` 原只遍历 `plan.warnings`,而运行期告警(含「已替换版本清单 …旧的那份 备份在 …」)在 `report.warnings` 里 ⇒ `ull install` 人读输出从没说过这句话。现在有 report 就 报 report.warnings(它开头就是 plan 告警的副本),`manifest=Replaced` 再单独打一行备份路径。 - GUI:`install.rs` 新增 `Job::journal_report`(把 `report.warnings` 与 `manifest` 的备份路径写进 安装日志),`install/routes.rs` 两处 `ensure_complete` 之前各加一行调用(tower 批的两行)。 此前 `report.manifest` 全仓零消费者。 - 用例 `a_replaced_manifest_is_said_out_loud_in_the_human_output`(走真 `InstallPlan` 排版)。 P3-1 缺省目录被占的 hint 删掉不成立的 `--overwrite` 那半句(它绕过不了这条预检)。 P3-2 GUI 落点改成委托 core 的 `pack_dir::instance_dir`(此前 presenter 自己拼 `data()/instances/…`); `convert::dir_name` 缩成 `#[cfg(test)]` 的委托入口(生产侧已无调用点,留着继续钉归一化判据)。 P3-3 补 `the_default_target_is_a_new_instance_dir_and_the_instance_is_bound_to_it`:不带 `--target` 跑通整条 CLI,断言落点、内容、登记、以及实例设置里的 `isolation`/`gameDir`。 §5 导入建出来的实例原先「导入成功但内容永远不会被启动用到」 - 新增 `pack_dir::bind_instance_dir`(`InstanceConfig.isolation = Custom` + `game_dir = 导入目录`) 与 `pack_dir::bind_created_instance`(判据+文案,CLI 与 GUI 同一份); - CLI 在缺省建实例后、GUI 在 `import.rs::run` 里各调一次;只在「我们新建了实例目录且档案是新建」 时绑(显式 `--target` / `--no-register` / 复用已有档案都不动); - 运行目录 = 导入目录(saves/mods/logs/config),**versions/libraries/assets 仍按 D20 恒共享**; - 未改 `derive_game_dir`。 - 用例:正向 `binding_an_imported_instance_points_it_at_the_import_dir`、反向 `a_freshly_registered_instance_still_inherits_the_global_mode`。
This commit is contained in:
1 parent
96f15c79fb
commit
4e1323212b
10 files changed
+359
-45
No files matched your search
@@ -197,3 +197,90 @@ fn help_lists_the_pack_command() {
|
||||
assert_eq!(code, 0);
|
||||
assert!(stdout.contains("pack import"), "总帮助里也要有:{stdout}");
|
||||
}
|
||||
|
||||
/// **M216 P3-3 + §5**:不带 `--target` 时落点是**新实例目录**(不是共享 `.minecraft` 根),
|
||||
/// 而且登记出来的实例被绑到那个目录(`isolation=custom` + `gameDir`),否则导入内容永远不会
|
||||
/// 被启动用到。
|
||||
///
|
||||
/// 抓得住:CLI 自己兜底回 `ctx.game().root()`(第一条断言会变成 `.minecraft`);不建实例目录而
|
||||
/// 直接铺共享根;不做绑定(`isolation` 仍是 `null`);绑定写错目录。抓不住:真实启动那一条
|
||||
/// `derive_game_dir` 的派生(core 的 `isolation.rs` 用例钉,这里只断言设置文件的内容)。
|
||||
#[test]
|
||||
fn the_default_target_is_a_new_instance_dir_and_the_instance_is_bound_to_it() {
|
||||
let data = TempDir::new("pack-default-target");
|
||||
let source = multimc_instance(data.path());
|
||||
let (code, stdout, stderr) = run_cli(&[
|
||||
"pack",
|
||||
"import",
|
||||
&source.display().to_string(),
|
||||
"--name",
|
||||
"My Pack",
|
||||
"--data-dir",
|
||||
&data.arg(),
|
||||
"--json",
|
||||
]);
|
||||
assert_eq!(code, 0, "stdout={stdout} stderr={stderr}");
|
||||
|
||||
let instance_dir = data.path().join(".ULL/data/instances/My-Pack");
|
||||
assert!(
|
||||
instance_dir.join("mods/a.jar").is_file(),
|
||||
"缺省落点应当是 <data>/instances/My-Pack:{stdout}"
|
||||
);
|
||||
assert!(
|
||||
!data.path().join(".minecraft/mods/a.jar").exists(),
|
||||
"不许再往共享 .minecraft 根铺:{stdout}"
|
||||
);
|
||||
|
||||
// 登记的实例被绑到这个目录(§5)。
|
||||
let profiles: Value = serde_json::from_str(
|
||||
&std::fs::read_to_string(data.path().join(".ULL/config/profiles.json"))
|
||||
.expect("profiles.json"),
|
||||
)
|
||||
.expect("profiles.json 是 JSON");
|
||||
assert_eq!(
|
||||
profiles["profiles"][0]["name"],
|
||||
Value::String("My Pack".into())
|
||||
);
|
||||
let id = profiles["profiles"][0]["id"]
|
||||
.as_str()
|
||||
.expect("登记出来的实例有 id")
|
||||
.to_string();
|
||||
let config: Value = serde_json::from_str(
|
||||
&std::fs::read_to_string(
|
||||
data.path()
|
||||
.join(".ULL/config/instances")
|
||||
.join(format!("{id}.json")),
|
||||
)
|
||||
.expect("实例设置文件"),
|
||||
)
|
||||
.expect("实例设置是 JSON");
|
||||
assert_eq!(
|
||||
config["isolation"],
|
||||
Value::String("custom".into()),
|
||||
"isolation 应当是 custom:{config}"
|
||||
);
|
||||
assert_eq!(
|
||||
config["gameDir"].as_str().map(Path::new),
|
||||
Some(instance_dir.as_path()),
|
||||
"gameDir 应当指向导入目录:{config}"
|
||||
);
|
||||
}
|
||||
|
||||
/// **M216 P2-1**:`--help` 里的缺省落点必须与新行为一致(写旧行为 = 用户照读会以为文件进了
|
||||
/// `.minecraft`)。
|
||||
///
|
||||
/// 抓得住:文案退回「共享游戏目录」;新落点没写进去。抓不住:`model.rs` 的字段文档
|
||||
/// (那是编译期文档,测试读不到)——所以断言落在这里只覆盖用户能看见的那一份。
|
||||
#[test]
|
||||
fn help_describes_the_new_default_target() {
|
||||
let (code, stdout, _) = run_cli(&["help", "pack"]);
|
||||
assert_eq!(code, 0);
|
||||
assert!(
|
||||
stdout.contains("instances/<实例名>"),
|
||||
"帮助里没写新缺省落点:{stdout}"
|
||||
);
|
||||
assert!(
|
||||
!stdout.contains("缺省 = 数据根的共享游戏目录"),
|
||||
"帮助里还留着旧缺省落点:{stdout}"
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user