use std::path::Path;
use anyhow::Result;
pub enum MergeOutcome {
Completed,
Conflicted,
}
pub fn merge_no_ff(workdir: &Path, git_dir: &Path, branch: &str) -> Result<MergeOutcome> {
run_merge_cmd(workdir, git_dir, &["merge", "--no-ff", branch, "--no-edit"])
}
pub fn continue_merge(workdir: &Path, git_dir: &Path) -> Result<MergeOutcome> {
run_merge_cmd(workdir, git_dir, &["merge", "--continue"])
}
fn run_merge_cmd(workdir: &Path, git_dir: &Path, args: &[&str]) -> Result<MergeOutcome> {
match super::run_git(workdir, args) {
Ok(()) => Ok(MergeOutcome::Completed),
Err(e) => {
if merge_is_in_progress(git_dir) {
Ok(MergeOutcome::Conflicted)
} else {
Err(e)
}
}
}
}
pub fn merge_abort(workdir: &Path) -> Result<()> {
super::run_git(workdir, &["merge", "--abort"])
}
pub fn merge_is_in_progress(git_dir: &Path) -> bool {
git_dir.join("MERGE_HEAD").exists()
}