Skip to content

rustc_tools_util: rerun when git commit changes #13329

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 }"
);
}
}