diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/rust-analyzer/build.rs | 30 |
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 | ||
3 | use std::process::Command; | 3 | use std::{env, path::PathBuf, process::Command}; |
4 | 4 | ||
5 | fn main() { | 5 | fn 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 | ||
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 | |||
10 | fn rev() -> Option<String> { | 38 | fn 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()?; |