@@ -255,20 +255,29 @@ pub fn git_repo_base_ref(repo: &git2::Repository, remote_name: &str) -> Result<O
255255
256256 // Try to find the remote tracking branch
257257 let remote_branch_name = format ! ( "refs/remotes/{remote_name}/HEAD" ) ;
258- let remote_ref = match repo. find_reference ( & remote_branch_name) {
259- Ok ( r) => r,
260- Err ( _) => {
261- // If remote/HEAD doesn't exist, try to find the default branch
262- // First try common default branch names
263- for branch in & [ "main" , "master" , "develop" ] {
264- let remote_branch = format ! ( "refs/remotes/{remote_name}/{branch}" ) ;
265- if let Ok ( r) = repo. find_reference ( & remote_branch) {
266- return find_merge_base_ref ( repo, & head_commit, & r) ;
267- }
268- }
269- bail ! ( "Could not find remote tracking branch for {}" , remote_name) ;
270- }
271- } ;
258+ let remote_ref = repo
259+ . find_reference ( & remote_branch_name)
260+ . or_else ( |_| {
261+ // If remote/HEAD doesn't exist, try to query the remote for its actual default branch
262+ let mut remote = repo. find_remote ( remote_name) ?;
263+ remote. connect ( git2:: Direction :: Fetch ) ?;
264+ let default_branch_buf = remote. default_branch ( ) ?;
265+ let default_branch = default_branch_buf. as_str ( ) . unwrap ( ) ;
266+
267+ // Convert "refs/heads/main" to "refs/remotes/origin/main"
268+ let branch_name = default_branch
269+ . strip_prefix ( "refs/heads/" )
270+ . unwrap_or ( default_branch) ;
271+ let remote_branch = format ! ( "refs/remotes/{remote_name}/{branch_name}" ) ;
272+ repo. find_reference ( & remote_branch)
273+ } )
274+ . map_err ( |e| {
275+ anyhow:: anyhow!(
276+ "Could not find remote tracking branch for {}: {}" ,
277+ remote_name,
278+ e
279+ )
280+ } ) ?;
272281
273282 find_merge_base_ref ( repo, & head_commit, & remote_ref)
274283}
0 commit comments