aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/rust-analyzer/build.rs30
1 files changed, 29 insertions, 1 deletions
diff --git a/crates/rust-analyzer/build.rs b/crates/rust-analyzer/build.rs
index 05f9772c0..d4b010c04 100644
--- a/crates/rust-analyzer/build.rs
+++ b/crates/rust-analyzer/build.rs
@@ -1,12 +1,40 @@
1//! Just embed git-hash to `--version` 1//! Just embed git-hash to `--version`
2 2
3use std::process::Command; 3use std::{env, path::PathBuf, process::Command};
4 4
5fn main() { 5fn main() {
6 set_rerun();
7
6 let rev = rev().unwrap_or_else(|| "???????".to_string()); 8 let rev = rev().unwrap_or_else(|| "???????".to_string());
7 println!("cargo:rustc-env=REV={}", rev) 9 println!("cargo:rustc-env=REV={}", rev)
8} 10}
9 11
12fn 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
10fn rev() -> Option<String> { 38fn rev() -> Option<String> {
11 let output = Command::new("git").args(&["rev-parse", "HEAD"]).output().ok()?; 39 let output = Command::new("git").args(&["rev-parse", "HEAD"]).output().ok()?;
12 let stdout = String::from_utf8(output.stdout).ok()?; 40 let stdout = String::from_utf8(output.stdout).ok()?;