diff --git a/Cargo.lock b/Cargo.lock index 22a04a8c55..9d1a653097 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -304,6 +304,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "compile-time" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e55ede5279d4d7c528906853743abeb26353ae1e6c440fcd6d18316c2c2dd903" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "rustc_version", + "semver", + "time", +] + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -733,6 +747,7 @@ dependencies = [ "bytesize", "chrono", "clap", + "compile-time", "crossbeam-channel", "crossterm", "dirs", @@ -1379,6 +1394,15 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.32" @@ -1426,6 +1450,12 @@ dependencies = [ "log", ] +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + [[package]] name = "serde" version = "1.0.197" diff --git a/Cargo.toml b/Cargo.toml index a759d57c8c..6751f18740 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ readme = "README.md" license = "MIT" categories = ["command-line-utilities"] keywords = ["git", "gui", "cli", "terminal", "ui"] +build = "build.rs" [dependencies] anyhow = "1.0" @@ -64,6 +65,9 @@ which = "6.0" pretty_assertions = "1.4" tempfile = "3" +[build-dependencies] +compile-time = "0.2" + [badges] maintenance = { status = "actively-developed" } diff --git a/Makefile b/Makefile index 32498b5253..9fbc87f5a7 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ debug: RUST_BACKTRACE=true cargo run --features=timing -- ${ARGS} build-release: - cargo build --release --locked + GITUI_RELEASE=1 cargo build --release --locked release-mac: build-release strip target/release/gitui @@ -42,7 +42,7 @@ build-linux-musl-debug: cargo build --target=x86_64-unknown-linux-musl build-linux-musl-release: - cargo build --release --target=x86_64-unknown-linux-musl + GITUI_RELEASE=1 cargo build --release --target=x86_64-unknown-linux-musl test-linux-musl: cargo test --workspace --target=x86_64-unknown-linux-musl @@ -64,9 +64,9 @@ build-linux-arm-debug: cargo build --target=arm-unknown-linux-gnueabihf build-linux-arm-release: - cargo build --release --target=aarch64-unknown-linux-gnu - cargo build --release --target=armv7-unknown-linux-gnueabihf - cargo build --release --target=arm-unknown-linux-gnueabihf + GITUI_RELEASE=1 cargo build --release --target=aarch64-unknown-linux-gnu + GITUI_RELEASE=1 cargo build --release --target=armv7-unknown-linux-gnueabihf + GITUI_RELEASE=1 cargo build --release --target=arm-unknown-linux-gnueabihf test: cargo test --workspace @@ -100,4 +100,4 @@ licenses: cargo bundle-licenses --format toml --output THIRDPARTY.toml clean: - cargo clean \ No newline at end of file + cargo clean diff --git a/build.rs b/build.rs new file mode 100644 index 0000000000..67ef0960a7 --- /dev/null +++ b/build.rs @@ -0,0 +1,38 @@ +fn get_git_hash() -> String { + use std::process::Command; + + let commit = Command::new("git") + .arg("rev-parse") + .arg("--short") + .arg("--verify") + .arg("HEAD") + .output(); + if let Ok(commit_output) = commit { + let commit_string = + String::from_utf8_lossy(&commit_output.stdout); + + return commit_string.lines().next().unwrap_or("").into(); + } + + panic!("Can not get git commit: {}", commit.unwrap_err()); +} + +fn main() { + let build_name = if std::env::var("GITUI_RELEASE").is_ok() { + format!( + "{} {} ({})", + env!("CARGO_PKG_VERSION"), + compile_time::date_str!(), + get_git_hash() + ) + } else { + format!( + "nightly {} ({})", + compile_time::date_str!(), + get_git_hash() + ) + }; + + println!("cargo:warning=buildname '{}'", build_name); + println!("cargo:rustc-env=GITUI_BUILD_NAME={}", build_name); +} diff --git a/src/args.rs b/src/args.rs index 2effe5fcc7..74654220c1 100644 --- a/src/args.rs +++ b/src/args.rs @@ -2,7 +2,7 @@ use crate::bug_report; use anyhow::{anyhow, Result}; use asyncgit::sync::RepoPath; use clap::{ - crate_authors, crate_description, crate_name, crate_version, Arg, + crate_authors, crate_description, crate_name, Arg, Command as ClapApp, }; use simplelog::{Config, LevelFilter, WriteLogger}; @@ -63,7 +63,7 @@ pub fn process_cmdline() -> Result { fn app() -> ClapApp { ClapApp::new(crate_name!()) .author(crate_authors!()) - .version(crate_version!()) + .version(env!("GITUI_BUILD_NAME")) .about(crate_description!()) .help_template( "\ diff --git a/src/main.rs b/src/main.rs index 84a7a82e4f..260938110d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,7 +43,6 @@ mod string_utils; mod strings; mod tabs; mod ui; -mod version; mod watcher; use crate::{app::App, args::process_cmdline}; diff --git a/src/popups/help.rs b/src/popups/help.rs index 9933d5c753..d472257a3f 100644 --- a/src/popups/help.rs +++ b/src/popups/help.rs @@ -6,7 +6,6 @@ use crate::{ app::Environment, keys::{key_match, SharedKeyConfig}, strings, ui, - version::Version, }; use anyhow::Result; use asyncgit::hash; @@ -70,7 +69,10 @@ impl DrawableComponent for HelpPopup { f.render_widget( Paragraph::new(Line::from(vec![Span::styled( - Cow::from(format!("gitui {}", Version::new(),)), + Cow::from(format!( + "gitui {}", + env!("GITUI_BUILD_NAME"), + )), Style::default(), )])) .alignment(Alignment::Right), diff --git a/src/version.rs b/src/version.rs deleted file mode 100644 index 02af65c2c8..0000000000 --- a/src/version.rs +++ /dev/null @@ -1,35 +0,0 @@ -use std::{env, fmt}; - -/// version type -#[derive(Default)] -pub struct Version { - major: u32, - minor: u32, - patch: u32, -} - -impl Version { - /// read version at compile time from env variables - pub fn new() -> Self { - let mut res = Self::default(); - let major_str = env!("CARGO_PKG_VERSION_MAJOR"); - if let Ok(major) = major_str.parse::() { - res.major = major; - } - let minor_str = env!("CARGO_PKG_VERSION_MINOR"); - if let Ok(minor) = minor_str.parse::() { - res.minor = minor; - } - let patch_str = env!("CARGO_PKG_VERSION_PATCH"); - if let Ok(patch) = patch_str.parse::() { - res.patch = patch; - } - res - } -} - -impl fmt::Display for Version { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "v{}.{}.{}", self.major, self.minor, self.patch) - } -}