]> git.lizzy.rs Git - rust.git/blob - crates/rust-analyzer/build.rs
13b90389197fd356cef39c1dd262df27b42bb870
[rust.git] / crates / rust-analyzer / build.rs
1 //! Just embed git-hash to `--version`
2
3 use std::{env, path::PathBuf, process::Command};
4
5 fn main() {
6     set_rerun();
7
8     let rev =
9         env::var("RUST_ANALYZER_REV").ok().or_else(rev).unwrap_or_else(|| "???????".to_string());
10     println!("cargo:rustc-env=REV={}", rev)
11 }
12
13 fn set_rerun() {
14     println!("cargo:rerun-if-env-changed=RUST_ANALYZER_REV");
15
16     let mut manifest_dir = PathBuf::from(
17         env::var("CARGO_MANIFEST_DIR").expect("`CARGO_MANIFEST_DIR` is always set by cargo."),
18     );
19
20     while manifest_dir.parent().is_some() {
21         if manifest_dir.join(".git/HEAD").exists() {
22             let git_dir = manifest_dir.join(".git");
23
24             println!("cargo:rerun-if-changed={}", git_dir.join("HEAD").display());
25             // current branch ref
26             if let Ok(output) =
27                 Command::new("git").args(&["rev-parse", "--symbolic-full-name", "HEAD"]).output()
28             {
29                 if let Ok(ref_link) = String::from_utf8(output.stdout) {
30                     println!("cargo:rerun-if-changed={}", git_dir.join(ref_link).display());
31                 }
32             }
33             return;
34         }
35
36         manifest_dir.pop();
37     }
38     println!("cargo:warning=Could not find `.git/HEAD` from manifest dir!");
39 }
40
41 fn rev() -> Option<String> {
42     let output =
43         Command::new("git").args(&["describe", "--tags", "--exclude", "nightly"]).output().ok()?;
44     let stdout = String::from_utf8(output.stdout).ok()?;
45     Some(stdout)
46 }