From 0b4d329f54fbba2c1a87ba22dab37051548bb8db Mon Sep 17 00:00:00 2001
From: theMackabu <theMackabu@gmail.com>
Date: Tue, 14 Nov 2023 12:11:59 -0800
Subject: [PATCH] add git hash and build date

---
 Cargo.lock                        |  1 +
 crates/maid/client/Cargo.toml     |  3 +++
 crates/maid/client/build.rs       | 29 +++++++++++++++++++++++++++++
 crates/maid/client/src/cli/mod.rs |  7 +++++++
 crates/maid/client/src/main.rs    |  3 ++-
 5 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 crates/maid/client/build.rs

diff --git a/Cargo.lock b/Cargo.lock
index 1f4d24f..f5aebb6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1162,6 +1162,7 @@ name = "maid"
 version = "1.1.0"
 dependencies = [
  "anyhow",
+ "chrono",
  "clap",
  "clap-verbosity-flag",
  "colored",
diff --git a/crates/maid/client/Cargo.toml b/crates/maid/client/Cargo.toml
index 79bf6c5..b120bfb 100644
--- a/crates/maid/client/Cargo.toml
+++ b/crates/maid/client/Cargo.toml
@@ -42,3 +42,6 @@ clap-verbosity-flag = "2.1.0"
 notify-debouncer-mini = "0.4.1"
 human_bytes = { version = "0.4.3", default-features = false }
 tungstenite = { version = "0.20.1", features = ["native-tls"] }
+
+[build-dependencies]
+chrono = "0.4.23"
\ No newline at end of file
diff --git a/crates/maid/client/build.rs b/crates/maid/client/build.rs
new file mode 100644
index 0000000..ed3cc8c
--- /dev/null
+++ b/crates/maid/client/build.rs
@@ -0,0 +1,29 @@
+use chrono::Datelike;
+use std::env;
+use std::process::Command;
+
+struct Env {}
+impl Env {
+    fn git() {
+        let output = Command::new("git").args(&["rev-parse", "--short=10", "HEAD"]).output().unwrap();
+        println!("cargo:rustc-env=GIT_HASH={}", String::from_utf8(output.stdout).unwrap());
+
+        let output_full = Command::new("git").args(&["rev-parse", "HEAD"]).output().unwrap();
+        println!("cargo:rustc-env=GIT_HASH_FULL={}", String::from_utf8(output_full.stdout).unwrap());
+    }
+
+    fn date() {
+        let date = chrono::Utc::now();
+        println!("cargo:rustc-env=BUILD_DATE={}-{}-{}", date.year(), date.month(), date.day());
+    }
+
+    fn misc() {
+        println!("cargo:rustc-env=TARGET={}", env::var("TARGET").unwrap());
+    }
+}
+
+fn main() {
+    Env::git();
+    Env::date();
+    Env::misc();
+}
diff --git a/crates/maid/client/src/cli/mod.rs b/crates/maid/client/src/cli/mod.rs
index 65c949a..f6e6b60 100644
--- a/crates/maid/client/src/cli/mod.rs
+++ b/crates/maid/client/src/cli/mod.rs
@@ -11,6 +11,13 @@ use human_bytes::human_bytes;
 use macros_rs::{crashln, fmtstr, string, ternary};
 use std::{env, path::Path, time::Instant};
 
+pub fn get_version(short: bool) -> String {
+    return match short {
+        true => format!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")),
+        false => format!("{} ({} {})", env!("CARGO_PKG_VERSION"), env!("GIT_HASH"), env!("BUILD_DATE")),
+    };
+}
+
 pub fn info(path: &String) {
     let values = helpers::maidfile::merge(path);
     let project_root = parse::file::find_maidfile_root(path);
diff --git a/crates/maid/client/src/main.rs b/crates/maid/client/src/main.rs
index 55e33be..3f4985a 100644
--- a/crates/maid/client/src/main.rs
+++ b/crates/maid/client/src/main.rs
@@ -10,10 +10,11 @@ mod task;
 
 use clap::{Parser, Subcommand};
 use clap_verbosity_flag::Verbosity;
+use macros_rs::str;
 use std::path::Path;
 
 #[derive(Parser)]
-#[command(version)]
+#[command(version = str!(cli::get_version(false)))]
 struct Cli {
     /// Run a task defined in maidfile
     #[arg(default_value = "", hide_default_value = true)]
-- 
GitLab