use std::{
fs,
path::{Path, PathBuf},
};
pub(super) fn git_branch(cwd: &Path) -> Option<String> {
let git_dir = find_git_dir(cwd)?;
let head = fs::read_to_string(git_dir.join("HEAD")).ok()?;
let head = head.trim();
head.strip_prefix("ref: refs/heads/")
.map(ToString::to_string)
.or_else(|| head.get(..7).map(ToString::to_string))
}
fn find_git_dir(cwd: &Path) -> Option<PathBuf> {
for dir in cwd.ancestors() {
let dot_git = dir.join(".git");
if dot_git.is_dir() {
return Some(dot_git);
}
if dot_git.is_file() {
let contents = fs::read_to_string(&dot_git).ok()?;
let path = contents.trim().strip_prefix("gitdir: ")?;
let path = Path::new(path);
return Some(if path.is_absolute() {
path.to_path_buf()
} else {
dir.join(path)
});
}
}
None
}