From 7d9ca0de43f3b77a82993ef6074aa3e436930b83 Mon Sep 17 00:00:00 2001 From: Ajeet D'Souza <98ajeet@gmail.com> Date: Wed, 21 Apr 2021 01:18:12 +0530 Subject: [PATCH] Compile-time warning when git is missing (#187) --- build.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/build.rs b/build.rs index d9f3e37..04c6a5f 100644 --- a/build.rs +++ b/build.rs @@ -1,16 +1,50 @@ +use std::env; use std::process::Command; -fn main() { - let git_describe = Command::new("git") - .args(&["describe", "--tags", "--broken"]) - .output() - .ok() - .and_then(|proc| String::from_utf8(proc.stdout).ok()); +macro_rules! warn { + ($fmt:tt) => ({ + ::std::println!(::std::concat!("cargo:warning=", $fmt)); + }); + ($fmt:tt, $($arg:tt)*) => ({ + ::std::println!(::std::concat!("cargo:warning=", $fmt), $($arg)*); + }); +} - let version_info = match git_describe { - Some(description) if !description.is_empty() => description, - _ => format!("v{}", env!("CARGO_PKG_VERSION")), +fn git_version() -> Option { + let mut git = Command::new("git"); + git.args(&["describe", "--tags", "--broken"]); + + let output = match git.output() { + Err(e) => { + warn!("when retrieving version: git failed to start: {}", e); + return None; + } + Ok(output) if !output.status.success() => { + warn!( + "when retrieving version: git exited with code: {:?}", + output.status.code() + ); + return None; + } + Ok(output) => output, }; - println!("cargo:rustc-env=ZOXIDE_VERSION={}", version_info); + match String::from_utf8(output.stdout) { + Ok(version) => Some(version), + Err(e) => { + warn!("when retrieving version: git returned invalid utf-8: {}", e); + None + } + } +} + +fn crate_version() -> String { + warn!("falling back to crate version"); + // unwrap is safe here, since Cargo will always supply this variable. + format!("v{}", env::var("CARGO_PKG_VERSION").unwrap()) +} + +fn main() { + let version = git_version().unwrap_or_else(crate_version); + println!("cargo:rustc-env=ZOXIDE_VERSION={}", version); }