feat(xtask): persist corpus baseline reports
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
Test / Lint (push) Failing after 2m1s
Test / Test (push) Skipped
Test / Render parity (push) Skipped

This commit is contained in:
2026-07-18 06:06:08 +04:00
parent 75c2154b02
commit 598e983a8e
+66 -14
View File
@@ -127,15 +127,10 @@ fn run(args: &[String]) -> Result<(), String> {
run_stage_tests(options.stage, TestSuite::Licensed, Some(&roots)) run_stage_tests(options.stage, TestSuite::Licensed, Some(&roots))
} }
[cmd, subcmd, rest @ ..] if cmd == "corpus" && subcmd == "baseline" => { [cmd, subcmd, rest @ ..] if cmd == "corpus" && subcmd == "baseline" => {
let root = parse_root(rest)?; run_corpus_baseline(&parse_corpus_baseline_options(rest)?)
let manifest =
discover(&root, DiscoverOptions::default()).map_err(|e| e.to_string())?;
let report = report(&root, &manifest).map_err(|e| e.to_string())?;
println!("{}", render_report_json(&report));
Ok(())
} }
_ => Err( _ => Err(
"usage: cargo xtask ci | policy | shader-provenance | acceptance report --suite synthetic|licensed [--stage 0..5|all] [--manifest corpora.toml] [--out <path>] | acceptance audit [--roadmap <path>] [--coverage <path>] [--out <path>] [--strict] | native-smoke audit --dir <path> [--expected-commit <sha>] [--expected-shader-manifest-hash <sha256>] | package --target <triple> --app viewer|game|headless|cli | test synthetic|licensed [--stage 0..5|all] [--manifest corpora.toml] | corpus baseline --root <path>" "usage: cargo xtask ci | policy | shader-provenance | acceptance report --suite synthetic|licensed [--stage 0..5|all] [--manifest corpora.toml] [--out <path>] | acceptance audit [--roadmap <path>] [--coverage <path>] [--out <path>] [--strict] | native-smoke audit --dir <path> [--expected-commit <sha>] [--expected-shader-manifest-hash <sha256>] | package --target <triple> --app viewer|game|headless|cli | test synthetic|licensed [--stage 0..5|all] [--manifest corpora.toml] | corpus baseline --root <path> [--out <path>]"
.to_string(), .to_string(),
), ),
} }
@@ -754,17 +749,56 @@ fn validate_licensed_part(kind: &str, root: &Path) -> Result<(), String> {
} }
} }
fn parse_root(args: &[String]) -> Result<PathBuf, String> { #[derive(Clone, Debug, Eq, PartialEq)]
struct CorpusBaselineOptions {
root: PathBuf,
out: Option<PathBuf>,
}
fn parse_corpus_baseline_options(args: &[String]) -> Result<CorpusBaselineOptions, String> {
let mut root = None;
let mut out = None;
let mut iter = args.iter(); let mut iter = args.iter();
while let Some(arg) = iter.next() { while let Some(arg) = iter.next() {
if arg == "--root" { match arg.as_str() {
return iter "--root" => {
.next() root = Some(
.map(PathBuf::from) iter.next()
.ok_or_else(|| "--root requires a path".to_string()); .map(PathBuf::from)
.ok_or_else(|| "--root requires a path".to_string())?,
);
}
"--out" => {
out = Some(
iter.next()
.map(PathBuf::from)
.ok_or_else(|| "--out requires a path".to_string())?,
);
}
other => return Err(format!("unknown corpus baseline option: {other}")),
} }
} }
Err("missing --root".to_string()) Ok(CorpusBaselineOptions {
root: root.ok_or_else(|| "missing --root".to_string())?,
out,
})
}
fn run_corpus_baseline(options: &CorpusBaselineOptions) -> Result<(), String> {
let manifest =
discover(&options.root, DiscoverOptions::default()).map_err(|error| error.to_string())?;
let baseline = report(&options.root, &manifest).map_err(|error| error.to_string())?;
let json = render_report_json(&baseline);
if let Some(out) = &options.out {
if let Some(parent) = out.parent() {
fs::create_dir_all(parent).map_err(|error| format!("{}: {error}", parent.display()))?;
}
fs::write(out, json).map_err(|error| format!("{}: {error}", out.display()))?;
println!("{}", out.display());
} else {
println!("{json}");
}
Ok(())
} }
#[derive(Clone, Debug, Eq, PartialEq)] #[derive(Clone, Debug, Eq, PartialEq)]
@@ -3008,6 +3042,24 @@ mod tests {
); );
} }
#[test]
fn parses_corpus_baseline_output_option() {
let options = parse_corpus_baseline_options(&strings(&[
"--root",
"C:/GOG Games/Parkan - Iron Strategy",
"--out",
"target/fparkan/corpus/part1.json",
]));
assert_eq!(
options,
Ok(CorpusBaselineOptions {
root: PathBuf::from("C:/GOG Games/Parkan - Iron Strategy"),
out: Some(PathBuf::from("target/fparkan/corpus/part1.json")),
})
);
}
#[test] #[test]
fn parses_acceptance_report_options() { fn parses_acceptance_report_options() {
let parsed = parse_acceptance_options(&strings(&[ let parsed = parse_acceptance_options(&strings(&[