diff options
| author | Valentin Popov <valentin@popov.link> | 2026-07-18 05:06:08 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-07-18 05:06:08 +0300 |
| commit | 598e983a8ed4ed2e0ae1081b7e0f5e41f9da6c3d (patch) | |
| tree | 7011d7258e216fd1b07830f1e7a8c209ad279d57 | |
| parent | 75c2154b02307e1ef74c0bbc97289eece924fa93 (diff) | |
| download | fparkan-598e983a8ed4ed2e0ae1081b7e0f5e41f9da6c3d.tar.xz fparkan-598e983a8ed4ed2e0ae1081b7e0f5e41f9da6c3d.zip | |
feat(xtask): persist corpus baseline reports
| -rw-r--r-- | xtask/src/main.rs | 80 |
1 files changed, 66 insertions, 14 deletions
diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 7814358..e2f4a53 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -127,15 +127,10 @@ fn run(args: &[String]) -> Result<(), String> { run_stage_tests(options.stage, TestSuite::Licensed, Some(&roots)) } [cmd, subcmd, rest @ ..] if cmd == "corpus" && subcmd == "baseline" => { - let root = parse_root(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(()) + run_corpus_baseline(&parse_corpus_baseline_options(rest)?) } _ => 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(), ), } @@ -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(); while let Some(arg) = iter.next() { - if arg == "--root" { - return iter - .next() - .map(PathBuf::from) - .ok_or_else(|| "--root requires a path".to_string()); + match arg.as_str() { + "--root" => { + root = Some( + iter.next() + .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}")), + } + } + 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}"); } - Err("missing --root".to_string()) + Ok(()) } #[derive(Clone, Debug, Eq, PartialEq)] @@ -3009,6 +3043,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] fn parses_acceptance_report_options() { let parsed = parse_acceptance_options(&strings(&[ "--suite", |
