Include uv's target triple in version report (#18520)

When looking at https://github.com/astral-sh/uv/issues/18509 I realized
this would be useful

e.g.,

```
$ uv self version
0.0.0 (53b0f5d92 2023-10-19 x86_64-unknown-linux-gnu)
```

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Aria Desires <aria.desires@gmail.com>
This commit is contained in:
Zanie Blue
2026-03-18 23:11:16 -05:00
committed by GitHub
parent c2760647a8
commit 481d99bf6a
3 changed files with 92 additions and 37 deletions
+68 -28
View File
@@ -17,20 +17,36 @@ pub(crate) struct CommitInfo {
commits_since_last_tag: u32,
}
/// uv's version.
/// Version information for uv itself (e.g., in `uv self version`).
#[derive(Serialize)]
pub struct VersionInfo {
/// Name of the package (or "uv" if printing uv's own version)
pub package_name: Option<String>,
/// version, such as "0.5.1"
pub struct SelfVersionInfo {
/// Name of the package (always "uv").
package_name: String,
/// Version, such as "0.5.1".
version: String,
/// Information about the git commit we may have been built from.
///
/// `None` if not built from a git repo or if retrieval failed.
commit_info: Option<CommitInfo>,
/// The target triple for which uv was built (e.g., `x86_64-unknown-linux-gnu`).
target_triple: String,
}
impl VersionInfo {
/// Version information for a project (`uv version`).
#[derive(Serialize)]
pub struct ProjectVersionInfo {
/// Name of the package.
pub package_name: Option<String>,
/// Version, such as "0.5.1".
version: String,
/// Information about the git commit uv was built from.
///
/// Always `null` for project versions, kept for backwards compatibility.
// TODO(zanieb): Remove this field in a breaking release.
commit_info: Option<CommitInfo>,
}
impl ProjectVersionInfo {
pub fn new(package_name: Option<&PackageName>, version: &Version) -> Self {
Self {
package_name: package_name.map(ToString::to_string),
@@ -40,20 +56,35 @@ impl VersionInfo {
}
}
impl fmt::Display for VersionInfo {
/// Formatted version information: "<version>[+<commits>] (<commit> <date>)"
impl fmt::Display for SelfVersionInfo {
/// Formatted version information: "<version>[+<commits>] ([<commit> <date> ]<target>)"
///
/// This is intended for consumption by `clap` to provide `uv --version`,
/// and intentionally omits the name of the package
/// and intentionally omits the name of the package.
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.version)?;
if let Some(ci) = &self.commit_info {
write!(f, "{ci}")?;
if ci.commits_since_last_tag > 0 {
write!(f, "+{}", ci.commits_since_last_tag)?;
}
write!(
f,
" ({} {} {})",
ci.short_commit_hash, ci.commit_date, self.target_triple
)?;
} else {
write!(f, " ({})", self.target_triple)?;
}
Ok(())
}
}
impl fmt::Display for ProjectVersionInfo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.version)
}
}
impl fmt::Display for CommitInfo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.commits_since_last_tag > 0 {
@@ -64,14 +95,14 @@ impl fmt::Display for CommitInfo {
}
}
impl From<VersionInfo> for clap::builder::Str {
fn from(val: VersionInfo) -> Self {
impl From<SelfVersionInfo> for clap::builder::Str {
fn from(val: SelfVersionInfo) -> Self {
val.to_string().into()
}
}
/// Returns information about uv's version.
pub fn uv_self_version() -> VersionInfo {
pub fn uv_self_version() -> SelfVersionInfo {
// Environment variables are only read at compile-time
macro_rules! option_env_str {
($name:expr) => {
@@ -93,10 +124,14 @@ pub fn uv_self_version() -> VersionInfo {
.map_or(0, |value| value.parse::<u32>().unwrap_or(0)),
});
VersionInfo {
package_name: Some("uv".to_owned()),
// Set by `uv-cli/build.rs`
let target_triple = env!("RUST_HOST_TARGET").to_string();
SelfVersionInfo {
package_name: "uv".to_owned(),
version,
commit_info,
target_triple,
}
}
@@ -104,22 +139,23 @@ pub fn uv_self_version() -> VersionInfo {
mod tests {
use insta::{assert_json_snapshot, assert_snapshot};
use super::{CommitInfo, VersionInfo};
use super::{CommitInfo, SelfVersionInfo};
#[test]
fn version_formatting() {
let version = VersionInfo {
package_name: Some("uv".to_string()),
let version = SelfVersionInfo {
package_name: "uv".to_string(),
version: "0.0.0".to_string(),
commit_info: None,
target_triple: "x86_64-unknown-linux-gnu".to_string(),
};
assert_snapshot!(version, @"0.0.0");
assert_snapshot!(version, @"0.0.0 (x86_64-unknown-linux-gnu)");
}
#[test]
fn version_formatting_with_commit_info() {
let version = VersionInfo {
package_name: Some("uv".to_string()),
let version = SelfVersionInfo {
package_name: "uv".to_string(),
version: "0.0.0".to_string(),
commit_info: Some(CommitInfo {
short_commit_hash: "53b0f5d92".to_string(),
@@ -128,14 +164,15 @@ mod tests {
commit_date: "2023-10-19".to_string(),
commits_since_last_tag: 0,
}),
target_triple: "x86_64-unknown-linux-gnu".to_string(),
};
assert_snapshot!(version, @"0.0.0 (53b0f5d92 2023-10-19)");
assert_snapshot!(version, @"0.0.0 (53b0f5d92 2023-10-19 x86_64-unknown-linux-gnu)");
}
#[test]
fn version_formatting_with_commits_since_last_tag() {
let version = VersionInfo {
package_name: Some("uv".to_string()),
let version = SelfVersionInfo {
package_name: "uv".to_string(),
version: "0.0.0".to_string(),
commit_info: Some(CommitInfo {
short_commit_hash: "53b0f5d92".to_string(),
@@ -144,14 +181,15 @@ mod tests {
commit_date: "2023-10-19".to_string(),
commits_since_last_tag: 24,
}),
target_triple: "x86_64-unknown-linux-gnu".to_string(),
};
assert_snapshot!(version, @"0.0.0+24 (53b0f5d92 2023-10-19)");
assert_snapshot!(version, @"0.0.0+24 (53b0f5d92 2023-10-19 x86_64-unknown-linux-gnu)");
}
#[test]
fn version_serializable() {
let version = VersionInfo {
package_name: Some("uv".to_string()),
let version = SelfVersionInfo {
package_name: "uv".to_string(),
version: "0.0.0".to_string(),
commit_info: Some(CommitInfo {
short_commit_hash: "53b0f5d92".to_string(),
@@ -160,6 +198,7 @@ mod tests {
commit_date: "2023-10-19".to_string(),
commits_since_last_tag: 0,
}),
target_triple: "x86_64-unknown-linux-gnu".to_string(),
};
assert_json_snapshot!(version, @r#"
{
@@ -171,7 +210,8 @@ mod tests {
"commit_date": "2023-10-19",
"last_tag": "v0.0.1",
"commits_since_last_tag": 0
}
},
"target_triple": "x86_64-unknown-linux-gnu"
}
"#);
}