use std::{path::Path, process::Command};
use clingwrap::runner::{CommandError, CommandRunner};
pub fn is_git(dirname: &Path) -> bool {
dirname.exists() && git_head(dirname).is_ok()
}
pub fn git_head(dirname: &Path) -> Result<String, GitError> {
let stdout = git(&["rev-parse", "HEAD"], dirname)?;
let head = stdout.trim().into();
Ok(head)
}
pub fn git_is_clean(dirname: &Path) -> bool {
if let Ok(stdout) = git(&["status", "--short"], dirname) {
stdout.is_empty()
} else {
false }
}
fn git(args: &[&str], dirname: &Path) -> Result<String, GitError> {
let mut cmd = Command::new("git");
cmd.args(args).current_dir(dirname);
let mut runner = CommandRunner::new(cmd);
runner.capture_stdout();
runner.capture_stderr();
runner
.execute()
.map_err(GitError::Execute)
.map(|output| String::from_utf8_lossy(&output.stdout).into())
}
#[derive(Debug, thiserror::Error)]
pub enum GitError {
#[error("failed to run git")]
Execute(#[source] CommandError),
}