use std::process::Command;
pub fn get() -> Option<String> {
let toplevel = run_git(&["rev-parse", "--show-toplevel"])?;
let branch = run_git(&["branch", "--show-current"]).unwrap_or_default();
Some(path_to_id(&format!("{toplevel}\0{branch}")))
}
fn run_git(args: &[&str]) -> Option<String> {
let output = Command::new("git").args(args).output().ok()?;
if !output.status.success() {
return None;
}
let s = String::from_utf8_lossy(&output.stdout);
let s = s.trim();
if s.is_empty() {
return None;
}
Some(s.to_owned())
}
pub fn path_to_id(path: &str) -> String {
let mut hash: u64 = 14_695_981_039_346_656_037;
for byte in path.bytes() {
hash ^= u64::from(byte);
hash = hash.wrapping_mul(1_099_511_628_211);
}
format!("{hash:016x}")
}