fix(git): use repo.default_branch instead of HEAD to avoid master/branch mismatch
Some checks are pending
CI / Rust Lint & Check (push) Waiting to run
CI / Rust Tests (push) Waiting to run
CI / Frontend Lint & Type Check (push) Waiting to run
CI / Frontend Build (push) Blocked by required conditions

- Add #[serde(default)] to MergeAnalysisQuery.their_oid and MergeRefAnalysisQuery fields
  since they come from path parameters, not query strings
- git_readme/git_commit_count/git_contributors: default to repo.default_branch
  instead of HEAD to avoid errors when HEAD points to refs/heads/master but
  the actual default branch is main
This commit is contained in:
ZhenYi 2026-04-17 15:13:08 +08:00
parent be423aabb6
commit 2bd1339d6c
5 changed files with 19 additions and 3 deletions

View File

@ -199,6 +199,16 @@ impl GitDomain {
return Ok(CommitOid::from_git2(oid));
}
// "HEAD" — use repo.head() to get the actual OID
if rev == "HEAD" {
if let Ok(reference) = self.repo.head() {
if let Some(target) = reference.target() {
return Ok(CommitOid::from_git2(target));
}
}
return Err(GitError::InvalidOid("cannot resolve: HEAD (detached or empty)".into()));
}
if let Ok(reference) = self.repo.find_reference(rev) {
if let Some(target) = reference.target() {
return Ok(CommitOid::from_git2(target));

View File

@ -133,7 +133,7 @@ impl AppService {
let repo = self
.utils_find_repo(namespace.clone(), repo_name.clone(), ctx)
.await?;
let rev = query.r#ref.unwrap_or_else(|| "HEAD".to_string());
let rev = query.r#ref.unwrap_or_else(|| repo.default_branch.clone());
let tree_oid: git::CommitOid = {
let rev_clone = rev.clone();

View File

@ -853,9 +853,12 @@ impl AppService {
let repo = self.utils_find_repo(namespace, repo_name, ctx).await?;
let from_clone = from.clone();
let to_clone = to.clone();
let default_branch = repo.default_branch.clone();
let count = git_spawn!(repo, domain -> {
domain.commit_count(from_clone.as_deref(), to_clone.as_deref())
let from_ref = from_clone.as_deref();
let to_ref = to_clone.as_deref().or(Some(default_branch.as_str()));
domain.commit_count(from_ref, to_ref)
})?;
let response = CommitCountResponse { count };

View File

@ -65,7 +65,7 @@ impl AppService {
}
let repo_clone = repo.clone();
let ref_name_clone = query.ref_name.clone();
let ref_name_clone = query.ref_name.clone().or_else(|| Some(repo.default_branch.clone()));
let commits = tokio::task::spawn_blocking(move || {
let domain = git::GitDomain::from_model(repo_clone)?;

View File

@ -70,11 +70,14 @@ pub struct ConfigBoolResponse {
}
#[derive(Debug, Clone, Deserialize)]
pub struct MergeAnalysisQuery {
#[serde(default)]
pub their_oid: String,
}
#[derive(Debug, Clone, Deserialize, utoipa::ToSchema)]
pub struct MergeRefAnalysisQuery {
#[serde(default)]
pub ref_name: String,
#[serde(default)]
pub their_oid: String,
}
#[derive(Debug, Clone, Deserialize, utoipa::ToSchema)]