Skip to content

Commit 357b35f

Browse files
committed
Address review comments by querying for default branch
1 parent 3523908 commit 357b35f

File tree

1 file changed

+13
-14
lines changed

1 file changed

+13
-14
lines changed

src/utils/vcs.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)