#![allow(clippy::needless_doctest_main)]
use std::process::Command;
#[allow(dead_code)]
pub const GIT_SHA1_LENGTH: usize = 40;
pub struct GitSHA1 {
default: String,
sha1: Option<String>,
}
impl GitSHA1 {
#[allow(dead_code)] pub fn use_default(mut self, default: &str) -> Self {
self.default = default.into();
self
}
pub fn read() -> Self {
let sha1: Option<String> = Command::new("git")
.args(&["rev-parse", "HEAD"])
.output()
.map_or(None, |out| {
Some(String::from_utf8(out.stdout).unwrap().trim().into())
});
Self {
default: String::new(),
sha1,
}
}
#[allow(dead_code)] pub fn from_env(name: &str) -> Self {
Self {
default: String::new(),
sha1: std::env::var(name).ok(),
}
}
pub fn set(&self, name: &str) {
println!(
"cargo:rustc-env={}={}",
name,
self.sha1.as_ref().unwrap_or(&self.default)
);
}
#[allow(dead_code)] pub fn long(&self) -> String {
self.sha1.as_ref().unwrap_or(&self.default).clone()
}
#[allow(dead_code)] pub fn short(&self, count: usize) -> String {
match &self.sha1 {
None => self.default.clone(),
Some(s) => {
let count = usize::min(s.len(), count);
s.as_str()[..count].into()
}
}
}
}