use std::{path::Path, process::Command};
use itertools::Itertools;
use tracing::debug;
pub fn init(path: &Path) {
let output = Command::new("git")
.arg("init")
.arg("--initial-branch=main")
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
let output = Command::new("git")
.arg("config")
.arg("user.email")
.arg("fake@knope.dev")
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
let output = Command::new("git")
.arg("config")
.arg("user.name")
.arg("Fake knope")
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
}
pub fn add_remote(path: &Path, remote: &str) {
let output = Command::new("git")
.arg("remote")
.arg("add")
.arg("origin")
.arg(remote)
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
}
pub fn add(path: &Path, file: &str) {
let output = Command::new("git")
.arg("add")
.arg(file)
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
}
pub fn commit(path: &Path, message: &str, author: &str) {
let output = Command::new("git")
.arg("commit")
.arg("--allow-empty")
.arg("-m")
.arg(message)
.arg("--author")
.arg(author)
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
}
pub fn tag(path: &Path, label: &str) {
let output = Command::new("git")
.arg("tag")
.arg(label)
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
}
pub fn create_branch(path: &Path, name: &str) {
let output = Command::new("git")
.arg("switch")
.arg("-c")
.arg(name)
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
debug!("{}", String::from_utf8_lossy(&output.stdout));
}
pub fn switch_branch(path: &Path, name: &str) {
let output = Command::new("git")
.arg("switch")
.arg(name)
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
debug!("{}", String::from_utf8_lossy(&output.stdout));
}
pub fn merge_branch(path: &Path, name: &str) {
let output = Command::new("git")
.arg("merge")
.arg("--no-ff")
.arg("--no-edit")
.arg(name)
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
debug!("{}", String::from_utf8_lossy(&output.stdout));
}
pub fn get_tags(path: &Path) -> Vec<String> {
let mut cmd = Command::new("git");
cmd.arg("tag").arg("--contains").arg("HEAD");
let output = cmd.current_dir(path).output().unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
String::from_utf8_lossy(&output.stdout)
.trim()
.lines()
.map(String::from)
.sorted()
.collect_vec()
}
pub fn add_all(path: &Path) {
let output = Command::new("git")
.arg("add")
.arg(".")
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
}
pub fn status(path: &Path) -> Vec<String> {
let output = Command::new("git")
.arg("status")
.arg("--porcelain")
.current_dir(path)
.output()
.unwrap();
assert!(
output.status.success(),
"{}",
String::from_utf8_lossy(&output.stderr)
);
String::from_utf8_lossy(&output.stdout)
.lines()
.map(String::from)
.sorted()
.collect()
}