use std::io;
use std::path::Path;
use std::process::Stdio;
pub fn git(cwd: &Path, args: &[&str]) -> io::Result<String> {
let out = crate::safegit::at(cwd)
.args(args)
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()?;
if out.status.success() {
Ok(String::from_utf8_lossy(&out.stdout).trim().to_string())
} else {
Err(io::Error::other(format!(
"git {}: {}",
args.join(" "),
String::from_utf8_lossy(&out.stderr).trim()
)))
}
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::TempDir;
#[test]
fn returns_trimmed_stdout_on_success() {
let tmp = TempDir::new().unwrap();
git(tmp.path(), &["init", "-q"]).unwrap();
let bare = git(tmp.path(), &["rev-parse", "--is-bare-repository"]).unwrap();
assert_eq!(bare, "false"); }
#[test]
fn a_nonzero_exit_carries_gits_stderr() {
let tmp = TempDir::new().unwrap();
let err = git(tmp.path(), &["rev-parse", "HEAD"]).unwrap_err();
assert!(err.to_string().contains("git rev-parse HEAD"));
}
}