#![allow(clippy::needless_doctest_main)]
use std::process::Command;
pub const GIT_SHA1_LENGTH: usize = 40;
pub struct GitSHA1 {
sha1: String,
}
impl GitSHA1 {
pub fn read() -> Self {
let output = Command::new("git")
.args(&["rev-parse", "HEAD"])
.output()
.unwrap();
let sha1: String = String::from_utf8(output.stdout).unwrap().trim().into();
assert_eq!(sha1.len(), GIT_SHA1_LENGTH, "unexpected length of Git SHA1");
Self { sha1 }
}
#[allow(dead_code)] pub fn from_env(name: &str) -> Self {
let sha1: String = std::env::var(name)
.unwrap_or_else(|_| panic!("failed to fetch environment variable '{}'", name));
assert_eq!(sha1.len(), GIT_SHA1_LENGTH, "unexpected length of Git SHA1");
Self { sha1 }
}
pub fn set(&self, name: &str) {
println!("cargo:rustc-env={}={}", name, self.sha1);
}
#[allow(dead_code)] pub fn long(&self) -> String {
self.sha1.clone()
}
#[allow(dead_code)] pub fn short(&self, count: usize) -> String {
if count > self.sha1.len() {
panic!(
"number of digits ({}) exceed length of Git SHA1 ({})",
count,
self.sha1.len()
);
}
self.sha1.as_str()[..count].into()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn short_length_1() {
let s = GitSHA1::from_env("GIT_SHA1").short(1);
assert_eq!(s.len(), 1);
}
#[test]
#[should_panic(expected = "exceed length of Git SHA1")]
fn short_error() {
let sha1 = GitSHA1::from_env("GIT_SHA1");
sha1.short(41);
}
}