use crate::error::RailResult;
use crate::git::SystemGit;
#[cfg(test)]
use crate::progress;
pub fn detect_default_base_ref(git: &SystemGit) -> RailResult<String> {
let output = git
.git_cmd()
.args(["symbolic-ref", "refs/remotes/origin/HEAD", "--short"])
.output();
if let Ok(out) = output
&& out.status.success()
{
let symref = String::from_utf8_lossy(&out.stdout).trim().to_string();
if !symref.is_empty() {
return Ok(symref);
}
}
if git.resolve_reference("origin/main").is_ok() {
return Ok("origin/main".to_string());
}
if git.resolve_reference("origin/master").is_ok() {
return Ok("origin/master".to_string());
}
Ok("HEAD~1".to_string())
}
#[cfg(test)]
mod tests {
use super::*;
use std::env;
#[test]
fn test_detect_default_base_ref() {
let current_dir = env::current_dir().unwrap();
let git = SystemGit::open(¤t_dir).expect("Should open git repo");
let base_ref = detect_default_base_ref(&git);
assert!(base_ref.is_ok(), "Should detect a default base ref");
let ref_str = base_ref.unwrap();
assert!(
ref_str.starts_with("origin/") || ref_str == "HEAD~1",
"Ref should be origin/* or HEAD~1, got: {}",
ref_str
);
progress!("Detected base ref: {}", ref_str);
}
#[test]
fn test_detect_returns_usable_ref() {
let current_dir = env::current_dir().unwrap();
let git = SystemGit::open(¤t_dir).expect("Should open git repo");
let base_ref = detect_default_base_ref(&git).expect("Should detect base ref");
assert!(!base_ref.is_empty(), "Base ref should not be empty: {}", base_ref);
}
}