CI / fmt (rustfmt --check) (push) Waiting to run
CI / clippy (ubuntu-latest) (push) Waiting to run
CI / clippy (windows-latest) (push) Waiting to run
CI / test (ubuntu-latest) (push) Waiting to run
CI / test (windows-latest) (push) Waiting to run
CI / build release (ubuntu-latest) (push) Waiting to run
CI / build release (windows-latest) (push) Waiting to run
CI / runtime smoke (ubuntu x64, xvfb) (push) Waiting to run
CI / runtime smoke (macos arm64, probe) (push) Skipped
CI / update-e2e (windows x64) (push) Waiting to run
GPU evidence / GPU 判据自测(不需 GPU;跳过 ≠ 已验证) (push) Waiting to run
GPU evidence / GPU 证据 — 探测可用产物与硬件适配器 (push) Waiting to run
Guards / core 零 UI 守门 (push) Waiting to run
Guards / presenter 零 UI 守门 (push) Waiting to run
Guards / design 零第三方依赖守门 (push) Waiting to run
Guards / unsafe 落点守门(集合必须恰好等于期望) (push) Waiting to run
Guards / 文件行数 ≤400 守门 (push) Waiting to run
Guards / 依赖许可与来源(cargo-deny) (push) Waiting to run
Release guard / 发布标记语义守门(push tag → 稳定版) (push) Waiting to run
Signing status(播报,不是门禁) / 判据自测(三行/退出码/变异重放/接线) (push) Waiting to run
Signing status(播报,不是门禁) / 签名就绪度(播报) (push) Waiting to run
Release / 选槽位(默认四个:Windows 两档 + Linux 两档) (push) Waiting to run
本批内容见 CHANGELOG.md 的 0.2.4 段。按 D41 用孤儿快照推 main,保留「公开史只有里程碑」的模型。
82 lines
3.1 KiB
Rust
82 lines
3.1 KiB
Rust
//! CLI 侧夹具:一个「别的启动器铺好了 `.minecraft`」的数据根。
|
||
//!
|
||
//! 快照工具**复用 core 测试那一份**(`crates/core/tests/adopt/snapshot.rs`,全节点:目录/文件/链接
|
||
//! 各记形状与 mtime)。以前 CLI 自己抄了一份 walk,两份都漏了目录节点——复审 r1 的 R5 正是这个洞,
|
||
//! 所以这里直接 `#[path]` 引用同一份源码:判据只有一处,不会再漂。
|
||
|
||
#[path = "../../../core/tests/adopt/snapshot.rs"]
|
||
mod snapshot;
|
||
|
||
pub use snapshot::{assert_unchanged, snapshot, snapshot_opt, Node};
|
||
|
||
use std::path::Path;
|
||
|
||
/// 造一份「别的启动器已经铺好的」数据根(`<root>/.minecraft` + `<root>/.ULL`):
|
||
///
|
||
/// | 路径 | 用意 |
|
||
/// | --- | --- |
|
||
/// | `versions/1.20.1/` | 正常版本(清单 + jar),可登记、可 `launch --dry-run` |
|
||
/// | `versions/1.20.1-orphan/` | 缺父版本 ⇒ 不可登记 |
|
||
/// | `libraries/` `assets/` | 恒共享层(登记不该碰) |
|
||
/// | `mods/` `saves/` | 玩家数据(登记不该碰) |
|
||
/// | `launcher_profiles.json` | 别的启动器的元数据(连读都不该读,更不该写) |
|
||
pub fn foreign_data_root(root: &Path) {
|
||
let minecraft = root.join(".minecraft");
|
||
let versions = minecraft.join("versions");
|
||
write_version(&versions, "1.20.1", MANIFEST_OK, true);
|
||
write_version(&versions, "1.20.1-orphan", MANIFEST_ORPHAN, true);
|
||
write_file(
|
||
&minecraft.join("libraries/com/mojang/brigadier/1.0.18/brigadier-1.0.18.jar"),
|
||
b"library-bytes",
|
||
);
|
||
write_file(
|
||
&minecraft.join("assets/indexes/5.json"),
|
||
b"{\"objects\":{}}",
|
||
);
|
||
write_file(&minecraft.join("mods/jei.jar"), b"mod-bytes");
|
||
write_file(&minecraft.join("saves/World/level.dat"), b"save-bytes");
|
||
write_file(
|
||
&minecraft.join("launcher_profiles.json"),
|
||
br#"{"profiles":{"1.20.1":{"name":"1.20.1","lastVersionId":"1.20.1"}}}"#,
|
||
);
|
||
}
|
||
|
||
fn write_version(versions: &Path, id: &str, manifest: &str, jar: bool) {
|
||
let dir = versions.join(id);
|
||
std::fs::create_dir_all(&dir).expect("建版本目录");
|
||
std::fs::write(dir.join(format!("{id}.json")), manifest.as_bytes()).expect("写清单");
|
||
if jar {
|
||
std::fs::write(dir.join(format!("{id}.jar")), b"junk").expect("写 jar");
|
||
}
|
||
}
|
||
|
||
fn write_file(path: &Path, bytes: &[u8]) {
|
||
if let Some(parent) = path.parent() {
|
||
std::fs::create_dir_all(parent).expect("建父目录");
|
||
}
|
||
std::fs::write(path, bytes).expect("写文件");
|
||
}
|
||
|
||
const MANIFEST_OK: &str = r#"{
|
||
"id": "1.20.1",
|
||
"type": "release",
|
||
"mainClass": "net.minecraft.client.main.Main",
|
||
"assets": "5",
|
||
"assetIndex": { "id": "5" },
|
||
"arguments": {
|
||
"game": ["--username", "${auth_player_name}", "--version", "${version_name}",
|
||
"--gameDir", "${game_directory}"],
|
||
"jvm": ["-Djava.library.path=${natives_directory}", "-cp", "${classpath}"]
|
||
},
|
||
"libraries": [],
|
||
"downloads": { "client": { "size": 4, "url": "http://example.invalid/client.jar" } }
|
||
}"#;
|
||
|
||
const MANIFEST_ORPHAN: &str = r#"{
|
||
"id": "1.20.1-orphan",
|
||
"type": "release",
|
||
"inheritsFrom": "1.20.1-not-on-disk",
|
||
"mainClass": "net.minecraft.client.main.Main",
|
||
"libraries": []
|
||
}"#;
|