|
6 | 6 | reason = "This is just a workflow tool" |
7 | 7 | )] |
8 | 8 |
|
9 | | -use std::ffi::OsStr; |
10 | 9 | use anyhow::Context as _; |
11 | 10 | use clap::Parser as _; |
| 11 | +use std::borrow::Cow; |
| 12 | +use std::ffi::OsStr; |
| 13 | +use std::path::{Path, PathBuf}; |
12 | 14 |
|
13 | 15 | /// Path to the shader crate |
14 | 16 | const SHADER_CRATE_PATH: &str = "crates/shader-crate-template"; |
@@ -36,6 +38,9 @@ enum Cli { |
36 | 38 | git: Option<String>, |
37 | 39 | }, |
38 | 40 | UpdateExpect, |
| 41 | + RustGpuRev { |
| 42 | + rev: String, |
| 43 | + }, |
39 | 44 | } |
40 | 45 |
|
41 | 46 | /// run some cmd |
@@ -254,61 +259,101 @@ impl DependencyVersion { |
254 | 259 |
|
255 | 260 | /// Run the xtask. |
256 | 261 | fn main() -> anyhow::Result<()> { |
257 | | - env_logger::builder().init(); |
258 | | - let cli = Cli::parse(); |
259 | | - match &cli { |
260 | | - Cli::TestBuild { |
261 | | - rust_gpu_version, |
262 | | - glam_version, |
263 | | - } => { |
264 | | - log::info!("installing cargo gpu"); |
265 | | - cmd(["cargo", "install", "--path", "crates/cargo-gpu"])?; |
| 262 | + env_logger::builder() |
| 263 | + .filter_level(log::LevelFilter::Info) |
| 264 | + .init(); |
| 265 | + Cli::parse().run() |
| 266 | +} |
266 | 267 |
|
267 | | - log::info!("setup project"); |
268 | | - let mut overwriter = ShaderCrateTemplateCargoTomlWriter::default(); |
269 | | - let dir = tempfile::TempDir::with_prefix("test-shader-output")?; |
270 | | - overwriter.replace_output_dir(dir.path())?; |
271 | | - if let Some(rust_gpu_version) = rust_gpu_version.as_ref() { |
272 | | - overwriter.set_spirv_std_version(rust_gpu_version)?; |
273 | | - } |
274 | | - if let Some(glam_version) = glam_version.as_ref() { |
275 | | - overwriter.set_dependency_glam(glam_version)?; |
276 | | - } |
| 268 | +impl Cli { |
| 269 | + fn run(&self) -> anyhow::Result<()> { |
| 270 | + match &self { |
| 271 | + Cli::TestBuild { |
| 272 | + rust_gpu_version, |
| 273 | + glam_version, |
| 274 | + } => { |
| 275 | + log::info!("installing cargo gpu"); |
| 276 | + cmd(["cargo", "install", "--path", "crates/cargo-gpu"])?; |
| 277 | + |
| 278 | + log::info!("setup project"); |
| 279 | + let mut overwriter = ShaderCrateTemplateCargoTomlWriter::default(); |
| 280 | + let dir = tempfile::TempDir::with_prefix("test-shader-output")?; |
| 281 | + overwriter.replace_output_dir(dir.path())?; |
| 282 | + if let Some(rust_gpu_version) = rust_gpu_version.as_ref() { |
| 283 | + overwriter.set_spirv_std_version(rust_gpu_version)?; |
| 284 | + } |
| 285 | + if let Some(glam_version) = glam_version.as_ref() { |
| 286 | + overwriter.set_dependency_glam(glam_version)?; |
| 287 | + } |
277 | 288 |
|
278 | | - log::info!("building with auto-install"); |
279 | | - cmd([ |
280 | | - "cargo", |
281 | | - "gpu", |
282 | | - "build", |
283 | | - "--shader-crate", |
284 | | - SHADER_CRATE_PATH, |
285 | | - "--auto-install-rust-toolchain", |
286 | | - "--rebuild-codegen", |
287 | | - "--force-overwrite-lockfiles-v4-to-v3", |
288 | | - ])?; |
| 289 | + log::info!("building with auto-install"); |
| 290 | + cmd([ |
| 291 | + "cargo", |
| 292 | + "gpu", |
| 293 | + "build", |
| 294 | + "--shader-crate", |
| 295 | + SHADER_CRATE_PATH, |
| 296 | + "--auto-install-rust-toolchain", |
| 297 | + "--rebuild-codegen", |
| 298 | + "--force-overwrite-lockfiles-v4-to-v3", |
| 299 | + ])?; |
289 | 300 |
|
290 | | - cmd(["ls", "-lah", dir.path().to_str().unwrap()])?; |
291 | | - //NOTE: manifest.json is the default value here, which should be valid |
292 | | - cmd(["cat", dir.path().join("manifest.json").to_str().unwrap()])?; |
293 | | - } |
294 | | - Cli::SetDependency { |
295 | | - package, |
296 | | - version, |
297 | | - git, |
298 | | - } => { |
299 | | - let mut overwriter = ShaderCrateTemplateCargoTomlWriter::new(true); |
300 | | - overwriter.set_dependency( |
| 301 | + cmd(["ls", "-lah", dir.path().to_str().unwrap()])?; |
| 302 | + //NOTE: manifest.json is the default value here, which should be valid |
| 303 | + cmd(["cat", dir.path().join("manifest.json").to_str().unwrap()])?; |
| 304 | + } |
| 305 | + Cli::SetDependency { |
301 | 306 | package, |
302 | | - &DependencyVersion::parse(version.clone(), git.clone())?, |
303 | | - )?; |
304 | | - } |
305 | | - Cli::UpdateExpect => { |
306 | | - let status = std::process::Command::new("cargo") |
307 | | - .args(["nextest", "run"]) |
308 | | - .env("UPDATE_EXPECT", "1") |
309 | | - .status()?; |
310 | | - anyhow::ensure!(status.success()); |
| 307 | + version, |
| 308 | + git, |
| 309 | + } => { |
| 310 | + let mut overwriter = ShaderCrateTemplateCargoTomlWriter::new(true); |
| 311 | + overwriter.set_dependency( |
| 312 | + package, |
| 313 | + &DependencyVersion::parse(version.clone(), git.clone())?, |
| 314 | + )?; |
| 315 | + } |
| 316 | + Cli::UpdateExpect => { |
| 317 | + let status = std::process::Command::new("cargo") |
| 318 | + .args(["nextest", "run"]) |
| 319 | + .env("UPDATE_EXPECT", "1") |
| 320 | + .status()?; |
| 321 | + anyhow::ensure!(status.success()); |
| 322 | + } |
| 323 | + Cli::RustGpuRev { rev } => { |
| 324 | + let root = PathBuf::from(concat!(env!("CARGO_MANIFEST_DIR"), "/../..")); |
| 325 | + let rev_regex = regex_lite::Regex::new(r#"rev\s*=\s*"[0-9a-f]*""#)?; |
| 326 | + let rev_replace = format!("rev = \"{rev}\""); |
| 327 | + let replace_rev = |file: &Path, dep: &str| -> anyhow::Result<()> { |
| 328 | + log::info!("patching file `{}` dep `{dep}`", file.display()); |
| 329 | + let content = std::fs::read_to_string(file)?; |
| 330 | + let content = content |
| 331 | + // unlike `.lines()`, includes the `\n` or `\r\n` at the end of the line |
| 332 | + .split_inclusive("\n") |
| 333 | + .map(|line| { |
| 334 | + if line.starts_with(dep) { |
| 335 | + let replace = rev_regex.replace(line, &rev_replace); |
| 336 | + assert!( |
| 337 | + matches!(replace, Cow::Owned(..)), |
| 338 | + "rev not found in line:\n{line}" |
| 339 | + ); |
| 340 | + replace |
| 341 | + } else { |
| 342 | + Cow::Borrowed(line) |
| 343 | + } |
| 344 | + }) |
| 345 | + .collect::<String>(); |
| 346 | + std::fs::write(file, content.as_bytes())?; |
| 347 | + Ok(()) |
| 348 | + }; |
| 349 | + replace_rev(&root.join("Cargo.toml"), "spirv-builder")?; |
| 350 | + replace_rev( |
| 351 | + &root.join("crates/shader-crate-template/Cargo.toml"), |
| 352 | + "spirv-std", |
| 353 | + )?; |
| 354 | + Cli::UpdateExpect.run()?; |
| 355 | + } |
311 | 356 | } |
| 357 | + Ok(()) |
312 | 358 | } |
313 | | - Ok(()) |
314 | 359 | } |
0 commit comments