@@ -255,20 +255,19 @@ 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. find_reference ( & remote_branch_name) . or_else ( |_| {
259+ // If remote/HEAD doesn't exist, try to query the remote for its actual default branch
260+ let mut remote = repo. find_remote ( remote_name) ?;
261+ remote. connect ( git2:: Direction :: Fetch ) ?;
262+ let default_branch_buf = remote. default_branch ( ) ?;
263+ let default_branch = default_branch_buf. as_str ( ) . unwrap ( ) ;
264+
265+ // Convert "refs/heads/main" to "refs/remotes/origin/main"
266+ let branch_name = default_branch. strip_prefix ( "refs/heads/" )
267+ . unwrap_or ( default_branch) ;
268+ let remote_branch = format ! ( "refs/remotes/{remote_name}/{branch_name}" ) ;
269+ repo. find_reference ( & remote_branch)
270+ } ) . map_err ( |e| anyhow:: anyhow!( "Could not find remote tracking branch for {}: {}" , remote_name, e) ) ?;
272271
273272 find_merge_base_ref ( repo, & head_commit, & remote_ref)
274273}
0 commit comments