Skip to content

Commit

Permalink
Auto merge of rust-lang#13329 - RalfJung:git-commit-rerun, r=Alexendo…
Browse files Browse the repository at this point in the history
…o,flip1995

rustc_tools_util: rerun when git commit changes

Fixes rust-lang#13312

changelog: none
  • Loading branch information
bors committed Oct 7, 2024
2 parents b013e69 + fba7ea7 commit 6f4bf90
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 29 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ path = "src/driver.rs"
[dependencies]
clippy_config = { path = "clippy_config" }
clippy_lints = { path = "clippy_lints" }
rustc_tools_util = "0.3.0"
rustc_tools_util = "0.4.0"
tempfile = { version = "3.3", optional = true }
termize = "0.1"
color-print = "0.3.4"
Expand All @@ -50,7 +50,7 @@ parking_lot = "0.12"
tokio = { version = "1", features = ["io-util"] }

[build-dependencies]
rustc_tools_util = "0.3.0"
rustc_tools_util = "0.4.0"

[features]
integration = ["tempfile"]
Expand Down
9 changes: 9 additions & 0 deletions rustc_tools_util/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## Version 0.4.0

* The commit hashes are now always 10 characters long [#13222](https://github.com/rust-lang/rust-clippy/pull/13222)
* `get_commit_date` and `get_commit_hash` now return `None` if the `git` command fails instead of `Some("")`
[#13217](https://github.com/rust-lang/rust-clippy/pull/13217)
* `setup_version_info` will now re-run when the git commit changes
[#13329](https://github.com/rust-lang/rust-clippy/pull/13329)
* New `rerun_if_git_changes` function was added [#13329](https://github.com/rust-lang/rust-clippy/pull/13329)

## Version 0.3.0

* Added `setup_version_info!();` macro for automated scripts.
Expand Down
2 changes: 1 addition & 1 deletion rustc_tools_util/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustc_tools_util"
version = "0.3.0"
version = "0.4.0"
description = "small helper to generate version information for git packages"
repository = "https://github.com/rust-lang/rust-clippy"
readme = "README.md"
Expand Down
4 changes: 2 additions & 2 deletions rustc_tools_util/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ build = "build.rs"
List rustc_tools_util as regular AND build dependency.
````toml
[dependencies]
rustc_tools_util = "0.3.0"
rustc_tools_util = "0.4.0"

[build-dependencies]
rustc_tools_util = "0.3.0"
rustc_tools_util = "0.4.0"
````

In `build.rs`, generate the data in your `main()`
Expand Down
75 changes: 51 additions & 24 deletions rustc_tools_util/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::path::PathBuf;
use std::process::Command;
use std::str;

/// This macro creates the version string during compilation from the
Expand Down Expand Up @@ -32,6 +34,7 @@ macro_rules! get_version_info {
#[macro_export]
macro_rules! setup_version_info {
() => {{
let _ = $crate::rerun_if_git_changes();
println!(
"cargo:rustc-env=GIT_HASH={}",
$crate::get_commit_hash().unwrap_or_default()
Expand Down Expand Up @@ -100,24 +103,52 @@ impl std::fmt::Debug for VersionInfo {
}

#[must_use]
pub fn get_commit_hash() -> Option<String> {
let output = std::process::Command::new("git")
.args(["rev-parse", "HEAD"])
.output()
.ok()?;
fn get_output(cmd: &str, args: &[&str]) -> Option<String> {
let output = Command::new(cmd).args(args).output().ok()?;
let mut stdout = output.status.success().then_some(output.stdout)?;
stdout.truncate(10);
// Remove trailing newlines.
while stdout.last().copied() == Some(b'\n') {
stdout.pop();
}
String::from_utf8(stdout).ok()
}

#[must_use]
pub fn rerun_if_git_changes() -> Option<()> {
// Make sure we get rerun when the git commit changes.
// We want to watch two files: HEAD, which tracks which branch we are on,
// and the file for that branch that tracks which commit is is on.

// First, find the `HEAD` file. This should work even with worktrees.
let git_head_file = PathBuf::from(get_output("git", &["rev-parse", "--git-path", "HEAD"])?);
if git_head_file.exists() {
println!("cargo::rerun-if-changed={}", git_head_file.display());
}

// Determine the name of the current ref.
// This will quit if HEAD is detached.
let git_head_ref = get_output("git", &["symbolic-ref", "-q", "HEAD"])?;
// Ask git where this ref is stored.
let git_head_ref_file = PathBuf::from(get_output("git", &["rev-parse", "--git-path", &git_head_ref])?);
// If this ref is packed, the file does not exist. However, the checked-out branch is never (?)
// packed, so we should always be able to find this file.
if git_head_ref_file.exists() {
println!("cargo::rerun-if-changed={}", git_head_ref_file.display());
}

Some(())
}

#[must_use]
pub fn get_commit_hash() -> Option<String> {
let mut stdout = get_output("git", &["rev-parse", "HEAD"])?;
stdout.truncate(10);
Some(stdout)
}

#[must_use]
pub fn get_commit_date() -> Option<String> {
let output = std::process::Command::new("git")
.args(["log", "-1", "--date=short", "--pretty=format:%cd"])
.output()
.ok()?;
let stdout = output.status.success().then_some(output.stdout)?;
String::from_utf8(stdout).ok()
get_output("git", &["log", "-1", "--date=short", "--pretty=format:%cd"])
}

#[must_use]
Expand All @@ -127,15 +158,11 @@ pub fn get_channel() -> String {
}

// if that failed, try to ask rustc -V, do some parsing and find out
if let Ok(output) = std::process::Command::new("rustc").arg("-V").output() {
if output.status.success() {
if let Ok(rustc_output) = str::from_utf8(&output.stdout) {
if rustc_output.contains("beta") {
return String::from("beta");
} else if rustc_output.contains("stable") {
return String::from("stable");
}
}
if let Some(rustc_output) = get_output("rustc", &["-V"]) {
if rustc_output.contains("beta") {
return String::from("beta");
} else if rustc_output.contains("stable") {
return String::from("stable");
}
}

Expand All @@ -151,7 +178,7 @@ mod test {
fn test_struct_local() {
let vi = get_version_info!();
assert_eq!(vi.major, 0);
assert_eq!(vi.minor, 3);
assert_eq!(vi.minor, 4);
assert_eq!(vi.patch, 0);
assert_eq!(vi.crate_name, "rustc_tools_util");
// hard to make positive tests for these since they will always change
Expand All @@ -162,7 +189,7 @@ mod test {
#[test]
fn test_display_local() {
let vi = get_version_info!();
assert_eq!(vi.to_string(), "rustc_tools_util 0.3.0");
assert_eq!(vi.to_string(), "rustc_tools_util 0.4.0");
}

#[test]
Expand All @@ -171,7 +198,7 @@ mod test {
let s = format!("{vi:?}");
assert_eq!(
s,
"VersionInfo { crate_name: \"rustc_tools_util\", major: 0, minor: 3, patch: 0 }"
"VersionInfo { crate_name: \"rustc_tools_util\", major: 0, minor: 4, patch: 0 }"
);
}
}

0 comments on commit 6f4bf90

Please sign in to comment.