From f45e00008f9c163dbe5ad327c55d98b1d627f833 Mon Sep 17 00:00:00 2001 From: eatradish Date: Wed, 10 Sep 2025 10:57:42 +0800 Subject: [PATCH] feat: display git sha and is dirty in `oma --version` --- Cargo.lock | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 4 ++ build.rs | 21 +++++++ src/args.rs | 35 ++++++++++++ 4 files changed, 216 insertions(+) create mode 100644 build.rs diff --git a/Cargo.lock b/Cargo.lock index 20af46e31..e69f938d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -625,6 +625,38 @@ dependencies = [ "libbz2-rs-sys", ] +[[package]] +name = "camino" +version = "1.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0b03af37dad7a14518b7691d81acb0f8222604ad3d1b02f6b4bed5188c0cd5" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.16", +] + [[package]] name = "cassowary" version = "0.3.0" @@ -1158,6 +1190,37 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn", +] + [[package]] name = "dialoguer" version = "0.12.0" @@ -1706,6 +1769,19 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "git2" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "url", +] + [[package]] name = "glob" version = "0.3.3" @@ -2422,6 +2498,18 @@ version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +[[package]] +name = "libgit2-sys" +version = "0.18.2+1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + [[package]] name = "libloading" version = "0.8.8" @@ -2473,6 +2561,18 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-sys" +version = "1.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "link-cplusplus" version = "1.0.12" @@ -2825,6 +2925,15 @@ dependencies = [ "syn", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -2922,6 +3031,8 @@ dependencies = [ "tracing-appender", "tracing-subscriber", "unic-langid", + "vergen", + "vergen-git2", "which", ] @@ -4057,6 +4168,9 @@ name = "semver" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] [[package]] name = "sequoia-openpgp" @@ -4605,7 +4719,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" dependencies = [ "deranged", + "libc", "num-conv", + "num_threads", "powerfmt", "serde", "time-core", @@ -5126,6 +5242,46 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vergen" +version = "9.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b2bf58be11fc9414104c6d3a2e464163db5ef74b12296bda593cac37b6e4777" +dependencies = [ + "anyhow", + "cargo_metadata", + "derive_builder", + "regex", + "rustversion", + "vergen-lib", +] + +[[package]] +name = "vergen-git2" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f6ee511ec45098eabade8a0750e76eec671e7fb2d9360c563911336bea9cac1" +dependencies = [ + "anyhow", + "derive_builder", + "git2", + "rustversion", + "time", + "vergen", + "vergen-lib", +] + +[[package]] +name = "vergen-lib" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b07e6010c0f3e59fcb164e0163834597da68d1f864e2b8ca49f74de01e9c166" +dependencies = [ + "anyhow", + "derive_builder", + "rustversion", +] + [[package]] name = "version_check" version = "0.9.5" diff --git a/Cargo.toml b/Cargo.toml index 1fccf3071..789531caf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,6 +75,10 @@ rust-embed = "8.5.0" unic-langid = "0.9.5" sys-locale = "0.3" +[build-dependencies] +vergen-git2 = { version = "1.0.7", features = ["cargo"] } +vergen = "9.0.1" + [features] aosc = ["dep:oma-topics", "oma-refresh/aosc", "oma-pm/aosc", "oma-contents/aosc", "dep:oma-mirror", "reqwest/blocking", "dep:oma-tum"] mirror = [] diff --git a/build.rs b/build.rs new file mode 100644 index 000000000..8cbd9f3c7 --- /dev/null +++ b/build.rs @@ -0,0 +1,21 @@ +use std::error::Error; + +use vergen::{CargoBuilder, Emitter}; +use vergen_git2::Git2Builder; + +fn main() -> Result<(), Box> { + let git = Git2Builder::default() + .sha(true) + .dirty(true) + .describe(true, false, None) + .build()?; + + let cargo = CargoBuilder::default().features(true).debug(true).build()?; + + Emitter::default() + .add_instructions(&git)? + .add_instructions(&cargo)? + .emit()?; + + Ok(()) +} diff --git a/src/args.rs b/src/args.rs index e8732b6e5..1d58be0f4 100644 --- a/src/args.rs +++ b/src/args.rs @@ -74,6 +74,7 @@ pub fn dangerous_color(msg: impl Display) -> String { #[derive(Parser, Debug)] #[command( version, + long_version = long_version(), about = fl!("clap-about"), long_about = None, disable_version_flag = true, @@ -234,6 +235,40 @@ pub enum SubCmd { Why(Why), } +fn long_version() -> String { + let mut ver = crate_version!().to_string(); + + if env!("VERGEN_GIT_DESCRIBE").is_empty() && env!("VERGEN_GIT_SHA").is_empty() { + ver.push_str("-unknown"); + } + + if env!("VERGEN_GIT_DESCRIBE") + .strip_prefix('v') + .is_none_or(|describe_suffix| describe_suffix != ver) + { + ver.push('-'); + if env!("VERGEN_GIT_SHA").is_empty() { + ver.push_str("unknown"); + } else { + ver.push_str(env!("VERGEN_GIT_SHA")); + } + } + + if env!("VERGEN_GIT_DIRTY") == "true" { + ver.push_str("-dirty"); + } + + if env!("VERGEN_CARGO_DEBUG") == "true" { + ver.push_str("-debug"); + } + + let features = env!("VERGEN_CARGO_FEATURES"); + ver.push_str(" with features: "); + ver.push_str(features); + + ver +} + #[derive(Debug, Args)] pub struct Version;