use std::path::Path;
use std::process::Command;
pub(crate) fn git(dir: &Path, args: &[&str]) -> String {
let output = Command::new("git")
.current_dir(dir)
.args(args)
.env("GIT_AUTHOR_NAME", "t")
.env("GIT_AUTHOR_EMAIL", "t@example.com")
.env("GIT_COMMITTER_NAME", "t")
.env("GIT_COMMITTER_EMAIL", "t@example.com")
.env("GIT_CONFIG_NOSYSTEM", "1")
.env("GIT_CONFIG_GLOBAL", "/dev/null")
.env_remove("GIT_DIR")
.env_remove("GIT_INDEX_FILE")
.env_remove("GIT_WORK_TREE")
.output()
.expect("spawn git");
assert!(
output.status.success(),
"git {args:?} failed: {}",
String::from_utf8_lossy(&output.stderr)
);
String::from_utf8(output.stdout)
.expect("git stdout is utf-8")
.trim()
.to_owned()
}
pub(crate) fn init(dir: &Path) {
git(dir, &["init", "-q", "-b", "main"]);
}
pub(crate) fn commit_all(dir: &Path, subject: &str) -> String {
git(dir, &["add", "-A"]);
git(dir, &["commit", "-q", "--allow-empty", "-m", subject]);
git(dir, &["rev-parse", "HEAD"])
}