Skip to content

Commit c2de013

Browse files
committed
include git rev when installed from crates.io
1 parent ef02a6b commit c2de013

2 files changed

Lines changed: 38 additions & 10 deletions

File tree

crates/cargo-gpu/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ serde_json.workspace = true
2323
semver.workspace = true
2424
dunce.workspace = true
2525

26+
[build-dependencies]
27+
serde.workspace = true
28+
serde_json.workspace = true
29+
2630
[dev-dependencies]
2731
cargo-gpu-install = { workspace = true, features = ["test"] }
2832
test-log.workspace = true

crates/cargo-gpu/build.rs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
11
//! cargo-gpu build script.
22
3+
use serde_json::Value;
34
use std::ffi::OsStr;
45
use std::path::PathBuf;
56

67
fn main() {
8+
compute_version_extra();
9+
}
10+
11+
fn compute_version_extra() {
12+
let extra = version_crates_io()
13+
.or_else(version_git)
14+
.unwrap_or(String::from(" installed from unknown source"));
15+
16+
std::fs::write(
17+
PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("version_extra"),
18+
extra,
19+
)
20+
.unwrap();
21+
}
22+
23+
fn version_git() -> Option<String> {
724
if let Some(git_directory) = invoke_git(["rev-parse", "--git-dir"]) {
825
println!("cargo:rerun-if-changed={git_directory}/HEAD");
926
}
@@ -17,20 +34,15 @@ fn main() {
1734
"HEAD",
1835
]);
1936

20-
let extra = if let Some(git_rev) = git_rev
37+
if let Some(rev) = git_rev
2138
&& let Some(git_date) = git_date
2239
{
23-
let git_rev = git_rev.get(..8).unwrap_or(&git_rev);
40+
let rev = rev.get(..8).unwrap_or(&rev);
2441
let git_date = git_date.strip_suffix("\n").unwrap_or(&git_date);
25-
format!(" ({git_rev} {git_date})")
42+
Some(format!(" installed from repo at rev {rev} ({git_date})"))
2643
} else {
27-
" (installed from crates.io)".into()
28-
};
29-
std::fs::write(
30-
PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("version_extra"),
31-
extra,
32-
)
33-
.unwrap();
44+
None
45+
}
3446
}
3547

3648
fn invoke_git<I, S>(args: I) -> Option<String>
@@ -44,3 +56,15 @@ where
4456
.ok()
4557
.and_then(|output| String::from_utf8(output.stdout).ok())
4658
}
59+
60+
/// `cargo package` adds the `.cargo_vcs_info.json` file on it's own, let's just use that to resolve the rev
61+
fn version_crates_io() -> Option<String> {
62+
let json = std::fs::read_to_string(
63+
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(".cargo_vcs_info.json"),
64+
)
65+
.ok()?;
66+
let value = serde_json::from_str::<Value>(&json).ok()?;
67+
let rev = value.get("git")?.get("sha1")?.as_str()?;
68+
let rev = rev.get(..8).unwrap_or(rev);
69+
Some(format!(" installed from crates.io (rev {rev})"))
70+
}

0 commit comments

Comments
 (0)