Skip to content
This repository was archived by the owner on Apr 10, 2026. It is now read-only.

Commit 4bbd1ab

Browse files
committed
add cargo xtask rust-gpu-rev <rev> for easy rust-gpu updating
1 parent 45bf124 commit 4bbd1ab

File tree

4 files changed

+106
-52
lines changed

4 files changed

+106
-52
lines changed

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ cargo-util-schemas = "0.8.2"
4343
semver = "1.0.26"
4444
dunce = "1.0.5"
4545
expect-test = "1.5.1"
46+
regex-lite = "0.1.9"
4647

4748

4849

crates/xtask/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ env_logger.workspace = true
1010
log.workspace = true
1111
tempfile.workspace = true
1212
toml.workspace = true
13+
regex-lite.workspace = true
1314

1415
[lints]
1516
workspace = true

crates/xtask/src/main.rs

Lines changed: 97 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
reason = "This is just a workflow tool"
77
)]
88

9-
use std::ffi::OsStr;
109
use anyhow::Context as _;
1110
use clap::Parser as _;
11+
use std::borrow::Cow;
12+
use std::ffi::OsStr;
13+
use std::path::{Path, PathBuf};
1214

1315
/// Path to the shader crate
1416
const SHADER_CRATE_PATH: &str = "crates/shader-crate-template";
@@ -36,6 +38,9 @@ enum Cli {
3638
git: Option<String>,
3739
},
3840
UpdateExpect,
41+
RustGpuRev {
42+
rev: String,
43+
},
3944
}
4045

4146
/// run some cmd
@@ -254,61 +259,101 @@ impl DependencyVersion {
254259

255260
/// Run the xtask.
256261
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+
}
266267

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+
}
277288

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+
])?;
289300

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 {
301306
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+
}
311356
}
357+
Ok(())
312358
}
313-
Ok(())
314359
}

0 commit comments

Comments
 (0)