use std::path::Path;
use std::process::{Command, Output};
use anyhow::{Context, Result, anyhow};
pub fn git_command(args: &[&str]) -> Command {
let mut cmd = Command::new("git");
cmd.args(args).env("LC_ALL", "C");
cmd
}
pub fn git_stdout(args: &[&str]) -> Result<String> {
let output = git_command(args)
.output()
.with_context(|| format!("Failed to run: git {}", args.join(" ")))?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
return Err(anyhow!("git {} failed: {}", args.join(" "), stderr.trim()));
}
Ok(String::from_utf8_lossy(&output.stdout).trim().to_string())
}
pub fn git_stdout_in(args: &[&str], dir: &Path) -> Result<String> {
let output = git_command(args)
.current_dir(dir)
.output()
.with_context(|| format!("Failed to run: git {}", args.join(" ")))?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
return Err(anyhow!("git {} failed: {}", args.join(" "), stderr.trim()));
}
Ok(String::from_utf8_lossy(&output.stdout).trim().to_string())
}
pub fn git_silent(args: &[&str]) -> Option<String> {
git_command(args)
.output()
.ok()
.filter(|o| o.status.success())
.and_then(|o| String::from_utf8(o.stdout).ok())
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty())
}
pub fn git_output(args: &[&str]) -> Result<Output> {
git_command(args)
.output()
.with_context(|| format!("Failed to run: git {}", args.join(" ")))
}