]> git.lizzy.rs Git - rust.git/blob - crates/rust-analyzer/build.rs
Improve server version info
[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     let _ = set_rerun();
7
8     let rev = rev().unwrap_or_else(|| "???????".to_string());
9     println!("cargo:rustc-env=REV={}", rev)
10 }
11
12 fn set_rerun() {
13     let mut manifest_dir = PathBuf::from(
14         env::var("CARGO_MANIFEST_DIR").expect("`CARGO_MANIFEST_DIR` is always set by cargo."),
15     );
16
17     while manifest_dir.parent().is_some() {
18         if manifest_dir.join(".git/HEAD").exists() {
19             let git_dir = manifest_dir.join(".git");
20
21             println!("cargo:rerun-if-changed={}", git_dir.join("HEAD").display());
22             // current branch ref
23             if let Ok(output) =
24                 Command::new("git").args(&["rev-parse", "--symbolic-full-name", "HEAD"]).output()
25             {
26                 if let Ok(ref_link) = String::from_utf8(output.stdout) {
27                     println!("cargo:rerun-if-changed={}", git_dir.join(ref_link).display());
28                 }
29             }
30             return;
31         }
32
33         manifest_dir.pop();
34     }
35     println!("cargo:warning=Could not find `.git/HEAD` from manifest dir!");
36 }
37
38 fn rev() -> Option<String> {
39     let output = Command::new("git").args(&["rev-parse", "HEAD"]).output().ok()?;
40     let stdout = String::from_utf8(output.stdout).ok()?;
41     let short_hash = stdout.get(0..7)?;
42     Some(short_hash.to_owned())
43 }