use crate::transaction_git::{GitContext, GitRequest, run_git_checked};
pub fn describe_merge_source(reference: &str, full_name: &str, oid: &str) -> Option<String> {
if let Some(name) = full_name.strip_prefix("refs/heads/") {
return Some(format!("{oid}\t\tbranch '{name}' of .\n"));
}
if let Some(name) = full_name.strip_prefix("refs/tags/") {
return Some(format!("{oid}\t\ttag '{name}' of .\n"));
}
if let Some(name) = full_name.strip_prefix("refs/remotes/") {
return Some(format!("{oid}\t\tremote-tracking branch '{name}' of .\n"));
}
if full_name.is_empty()
&& !reference.is_empty()
&& reference.bytes().all(|byte| { return byte.is_ascii_hexdigit(); })
{
return Some(format!("{oid}\t\tcommit '{reference}'\n"));
}
return None;
}
pub fn fetch_head_merge_heads(text: &str) -> Vec<String> {
let mut heads: Vec<String> = Vec::new();
for line in text.lines() {
let Some((name, rest)) = line.split_once('\t') else { continue };
let is_name: bool = (name.len() == 40 || name.len() == 64) && name.bytes().all(|byte| { return byte.is_ascii_hexdigit(); });
if is_name && rest.starts_with('\t') {
heads.push(String::from(name));
}
}
return heads;
}
pub fn default_merge_message(
context: &GitContext,
description: &str,
log: Option<bool>,
) -> Result<Vec<u8>, String> {
let mut arguments: Vec<&str> = vec!["fmt-merge-msg"];
match log {
Some(true) => arguments.push("--log"),
Some(false) => arguments.push("--no-log"),
None => {}
}
let mut request: GitRequest = GitRequest::new(std::path::Path::new("."), &arguments);
request.input = Some(description.as_bytes().to_vec());
let output = run_git_checked(context, &request).map_err(|error| { return error.to_string(); })?;
return Ok(output.stdout);
}
pub fn clean_message(context: &GitContext, message: &[u8]) -> Result<Vec<u8>, String> {
let mut request: GitRequest = GitRequest::new(std::path::Path::new("."), &["stripspace"]);
request.input = Some(message.to_vec());
let output = run_git_checked(context, &request).map_err(|error| { return error.to_string(); })?;
return Ok(output.stdout);
}
#[cfg(test)]
#[path = "merge_isolation_message_tests.rs"]
mod tests;