1use git2::{Error, Remote};
2
3use crate::auth::auth_callbacks;
4
5pub fn remote_refs(repo_url: &str, username: &str, password: &str) -> Result<Vec<(String, bool, String)>, Error> {
9 let callbacks = auth_callbacks(username, password);
10 let mut remote = Remote::create_detached(repo_url)?; remote.connect_auth(git2::Direction::Fetch, Some(callbacks), None)?; let result = remote.list()?.iter().map(|head| {
16 let ref_name = head.name();
17 let oid = head.oid();
18 if let Some(target) = head.symref_target() {
19 (ref_name.into(), true, target.into())
20 } else {
21 (ref_name.into(), false, oid.to_string())
22 }
23 }).collect();
24 Ok(result)
25}
26
27pub fn remote_default_branch(repo_url: &str, username: &str, password: &str) -> Result<Option<String>, Error> {
31 let branchs = remote_refs(repo_url, username, password)?;
32 let Some((_ref_name, _is_symref_target, default_branch)) = branchs.iter()
33 .find(|(ref_name, is_symref_target, _symref_target_or_oid)| {
34 ref_name == "HEAD" && *is_symref_target
35 }) else {
36 return Ok(None);
37 };
38 let default_branch = default_branch.replacen("refs/heads/", "", 1);
39 Ok(Some(default_branch))
40}