use git2::{Error, Remote};
use crate::auth::auth_callbacks;
pub fn remote_refs(repo_url: &str, username: &str, password: &str) -> Result<Vec<(String, bool, String)>, Error> {
let callbacks = auth_callbacks(username, password);
let mut remote = Remote::create_detached(repo_url)?; remote.connect_auth(git2::Direction::Fetch, Some(callbacks), None)?;
let result = remote.list()?.iter().map(|head| {
let ref_name = head.name();
let oid = head.oid();
if let Some(target) = head.symref_target() {
(ref_name.into(), true, target.into())
} else {
(ref_name.into(), false, oid.to_string())
}
}).collect();
Ok(result)
}
pub fn remote_default_branch(repo_url: &str, username: &str, password: &str) -> Result<Option<String>, Error> {
let branchs = remote_refs(repo_url, username, password)?;
let Some((_ref_name, _is_symref_target, default_branch)) = branchs.iter()
.find(|(ref_name, is_symref_target, _symref_target_or_oid)| {
ref_name == "HEAD" && *is_symref_target
}) else {
return Ok(None);
};
let default_branch = default_branch.replacen("refs/heads/", "", 1);
Ok(Some(default_branch))
}