11//! cargo-gpu build script.
22
3+ use serde_json:: Value ;
34use std:: ffi:: OsStr ;
45use std:: path:: PathBuf ;
56
67fn 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
3648fn invoke_git < I , S > ( args : I ) -> Option < String >
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