@@ -255,20 +255,19 @@ pub fn git_repo_base_ref(repo: &git2::Repository, remote_name: &str) -> Result<O
255
255
256
256
// Try to find the remote tracking branch
257
257
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) ) ?;
272
271
273
272
find_merge_base_ref ( repo, & head_commit, & remote_ref)
274
273
}
0 commit comments