|
| 1 | +use std::path::PathBuf; |
| 2 | +use std::process::Command; |
1 | 3 | use std::str;
|
2 | 4 |
|
3 | 5 | /// This macro creates the version string during compilation from the
|
@@ -32,6 +34,7 @@ macro_rules! get_version_info {
|
32 | 34 | #[macro_export]
|
33 | 35 | macro_rules! setup_version_info {
|
34 | 36 | () => {{
|
| 37 | + let _ = $crate::rerun_if_git_changes(); |
35 | 38 | println!(
|
36 | 39 | "cargo:rustc-env=GIT_HASH={}",
|
37 | 40 | $crate::get_commit_hash().unwrap_or_default()
|
@@ -99,20 +102,36 @@ impl std::fmt::Debug for VersionInfo {
|
99 | 102 | }
|
100 | 103 | }
|
101 | 104 |
|
| 105 | +#[must_use] |
| 106 | +pub fn rerun_if_git_changes() -> Option<()> { |
| 107 | + // Make sure we get rerun when the git commit changes. |
| 108 | + // First, find the `HEAD` file. This should work even with worktrees. |
| 109 | + let output = Command::new("git").args(["rev-parse", "--git-dir"]).output().ok()?; |
| 110 | + let stdout = output.status.success().then_some(output.stdout)?; |
| 111 | + let git_dir = PathBuf::from(String::from_utf8(stdout).ok()?.trim()); |
| 112 | + // Read the HEAD file to determine the name of the current ref. |
| 113 | + let git_head_file = git_dir.join("HEAD"); |
| 114 | + let git_head_ref = String::from_utf8(std::fs::read(&git_head_file).ok()?).ok()?; |
| 115 | + let git_head_ref = git_head_ref.strip_prefix("ref:")?.trim(); |
| 116 | + // Determine the file where the target of that ref is stored. |
| 117 | + let git_head_ref_file = git_dir.join(git_head_ref); |
| 118 | + |
| 119 | + println!("cargo::rerun-if-changed={}", git_head_file.display()); |
| 120 | + println!("cargo::rerun-if-changed={}", git_head_ref_file.display()); |
| 121 | + Some(()) |
| 122 | +} |
| 123 | + |
102 | 124 | #[must_use]
|
103 | 125 | pub fn get_commit_hash() -> Option<String> {
|
104 |
| - let output = std::process::Command::new("git") |
105 |
| - .args(["rev-parse", "HEAD"]) |
106 |
| - .output() |
107 |
| - .ok()?; |
| 126 | + let output = Command::new("git").args(["rev-parse", "HEAD"]).output().ok()?; |
108 | 127 | let mut stdout = output.status.success().then_some(output.stdout)?;
|
109 | 128 | stdout.truncate(10);
|
110 | 129 | String::from_utf8(stdout).ok()
|
111 | 130 | }
|
112 | 131 |
|
113 | 132 | #[must_use]
|
114 | 133 | pub fn get_commit_date() -> Option<String> {
|
115 |
| - let output = std::process::Command::new("git") |
| 134 | + let output = Command::new("git") |
116 | 135 | .args(["log", "-1", "--date=short", "--pretty=format:%cd"])
|
117 | 136 | .output()
|
118 | 137 | .ok()?;
|
|
0 commit comments