aboutsummaryrefslogtreecommitdiff
path: root/xtask/src/main.rs
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-07-18 05:06:08 +0300
committerValentin Popov <valentin@popov.link>2026-07-18 05:06:08 +0300
commit598e983a8ed4ed2e0ae1081b7e0f5e41f9da6c3d (patch)
tree7011d7258e216fd1b07830f1e7a8c209ad279d57 /xtask/src/main.rs
parent75c2154b02307e1ef74c0bbc97289eece924fa93 (diff)
downloadfparkan-598e983a8ed4ed2e0ae1081b7e0f5e41f9da6c3d.tar.xz
fparkan-598e983a8ed4ed2e0ae1081b7e0f5e41f9da6c3d.zip
feat(xtask): persist corpus baseline reports
Diffstat (limited to 'xtask/src/main.rs')
-rw-r--r--xtask/src/main.rs80
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",