From e849fbcf1b1321f8b1baa4978cdee68154a56c3d Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 2 Oct 2026 16:20:47 -0400 Subject: [PATCH] xtask: make version.rs compile here and register `cargo xtask version` version.rs (ported from PhotoCraft) called crate::cargo() and a two-argument crate::run() that don't exist in this xtask, so xtask didn't build at all. Co-Authored-By: Claude Opus 5.5 --- xtask/src/main.rs | 6 ++++++ xtask/src/version.rs | 35 ++++++++++++++--------------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 9d67a147a8..dd0f4c0817 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -15,6 +15,7 @@ type Command = fn(&[String]) -> anyhow::Result<()>; /// Every subcommand: name, one-line summary, entry point. const COMMANDS: &[(&str, &str, Command)] = &[ + ("version", "Print the workspace version, or `version set X.Y.Z[-pre]` to change it and refresh Cargo.lock", version_cmd), ("layers", "Enforce the crate dependency layering (plan/architecture.md §3)", gates::layers), ("wasm", "cargo check --target wasm32-unknown-unknown for every crate below L8", gates::wasm), ("deny", "Dependency licences, bans, sources and advisories (deny.toml; needs cargo-deny)", gates::deny), @@ -29,6 +30,11 @@ const COMMANDS: &[(&str, &str, Command)] = &[ ("demo-pdf", "Build dist/demo/printcraft-showcase.pdf (needs Google Chrome or Chromium)", demo_pdf::run), ]; +fn version_cmd(args: &[String]) -> anyhow::Result<()> { + let args: Vec<&str> = args.iter().map(String::as_str).collect(); + version::run(&gates::root(), &args).map_err(anyhow::Error::msg) +} + fn main() -> ExitCode { let args: Vec = std::env::args().skip(1).collect(); let Some(name) = args.first() else { diff --git a/xtask/src/version.rs b/xtask/src/version.rs index 489b626789..67cd4a665c 100644 --- a/xtask/src/version.rs +++ b/xtask/src/version.rs @@ -8,10 +8,7 @@ use std::path::Path; /// The `version = "…"` value inside `[workspace.package]`. pub fn read(manifest: &str) -> Result { let (_, line) = find_line(manifest)?; - let v = line - .split_once('=') - .map(|(_, v)| v.trim().trim_matches('"').to_string()) - .unwrap_or_default(); + let v = line.split_once('=').map(|(_, v)| v.trim().trim_matches('"').to_string()).unwrap_or_default(); if v.is_empty() { return Err("empty [workspace.package] version".into()); } @@ -48,20 +45,11 @@ pub fn validate(v: &str) -> Result<(), String> { None => (v, None), }; let nums: Vec<&str> = core.split('.').collect(); - if nums.len() != 3 - || nums.iter().any(|n| { - n.is_empty() - || !n.bytes().all(|b| b.is_ascii_digit()) - || (n.len() > 1 && n.starts_with('0')) - }) - { + if nums.len() != 3 || nums.iter().any(|n| n.is_empty() || !n.bytes().all(|b| b.is_ascii_digit()) || (n.len() > 1 && n.starts_with('0'))) { return bad(); } if let Some(p) = pre - && (p.is_empty() - || p.split('.').any(|id| { - id.is_empty() || !id.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'-') - })) + && (p.is_empty() || p.split('.').any(|id| id.is_empty() || !id.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'-'))) { return bad(); } @@ -104,12 +92,17 @@ pub fn run(root: &Path, args: &[&str]) -> Result<(), String> { std::fs::write(&tmp, updated).map_err(|e| format!("write {}: {e}", tmp.display()))?; std::fs::rename(&tmp, &path).map_err(|e| format!("replace {}: {e}", path.display()))?; // Refresh the workspace members' entries in Cargo.lock (no dependency upgrades). - let mut c = crate::cargo(); - c.args(["update", "--workspace", "--offline"]); - if crate::run(c, "cargo update --workspace --offline").is_err() { - let mut c = crate::cargo(); - c.args(["update", "--workspace"]); - crate::run(c, "cargo update --workspace")?; + let cargo_update = |extra: &[&str]| -> Result<(), String> { + let st = std::process::Command::new(env!("CARGO")) + .current_dir(root) + .args(["update", "--workspace"]) + .args(extra) + .status() + .map_err(|e| format!("cargo update: {e}"))?; + if st.success() { Ok(()) } else { Err(format!("cargo update --workspace {} failed", extra.join(" "))) } + }; + if cargo_update(&["--offline"]).is_err() { + cargo_update(&[])?; } println!("version: {old} -> {new}"); Ok(())