From 82ed7268485faa296c7704b4d5ef54f55e114142 Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Fri, 17 Apr 2026 15:56:08 +0800 Subject: [PATCH] fix(git): convert default_branch to full ref name (refs/heads/*) The database stores short branch names (e.g., "main"), but git2's push_ref() requires full reference names (e.g., "refs/heads/main"). This fixes all service-layer endpoints to convert default_branch to the full ref format. Fixed endpoints: - git_readme: convert to refs/heads/{branch} - git_commit_count: convert to refs/heads/{branch} - git_contributors: convert to refs/heads/{branch} - git_commit_log: convert to refs/heads/{branch} - git_commit_walk: convert to refs/heads/{branch} Resolves errors: - Internal("the given reference name 'main' is not valid") --- libs/service/git/blob.rs | 8 +++++++- libs/service/git/commit.rs | 24 ++++++++++++++++++++---- libs/service/git/contributors.rs | 8 +++++++- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/libs/service/git/blob.rs b/libs/service/git/blob.rs index 95df351..d028250 100644 --- a/libs/service/git/blob.rs +++ b/libs/service/git/blob.rs @@ -133,7 +133,13 @@ impl AppService { let repo = self .utils_find_repo(namespace.clone(), repo_name.clone(), ctx) .await?; - let rev = query.r#ref.unwrap_or_else(|| repo.default_branch.clone()); + let rev = query.r#ref.unwrap_or_else(|| { + if repo.default_branch.is_empty() { + "HEAD".to_string() + } else { + format!("refs/heads/{}", repo.default_branch) + } + }); let tree_oid: git::CommitOid = { let rev_clone = rev.clone(); diff --git a/libs/service/git/commit.rs b/libs/service/git/commit.rs index 126fefd..56d8ac3 100644 --- a/libs/service/git/commit.rs +++ b/libs/service/git/commit.rs @@ -786,7 +786,13 @@ impl AppService { let repo = self .utils_find_repo(namespace.clone(), repo_name.clone(), ctx) .await?; - let rev_clone = query.rev.clone().or_else(|| Some(repo.default_branch.clone())); + let rev_clone = query.rev.clone().or_else(|| { + if repo.default_branch.is_empty() { + None + } else { + Some(format!("refs/heads/{}", repo.default_branch)) + } + }); let rev_for_count = rev_clone.clone(); let commits = git_spawn!(repo, domain -> { @@ -853,11 +859,15 @@ 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 default_ref = if repo.default_branch.is_empty() { + None + } else { + Some(format!("refs/heads/{}", repo.default_branch)) + }; let count = git_spawn!(repo, domain -> { let from_ref = from_clone.as_deref(); - let to_ref = to_clone.as_deref().or(Some(default_branch.as_str())); + let to_ref = to_clone.as_deref().or(default_ref.as_deref()); domain.commit_count(from_ref, to_ref) })?; @@ -1276,7 +1286,13 @@ impl AppService { } let repo = self.utils_find_repo(namespace, repo_name, ctx).await?; - let rev_clone = query.rev.clone(); + let rev_clone = query.rev.clone().or_else(|| { + if repo.default_branch.is_empty() { + None + } else { + Some(format!("refs/heads/{}", repo.default_branch)) + } + }); let limit = query.limit.unwrap_or(0); let first_parent_only = query.first_parent_only; let topological = query.topological; diff --git a/libs/service/git/contributors.rs b/libs/service/git/contributors.rs index f8c4585..c4c48e2 100644 --- a/libs/service/git/contributors.rs +++ b/libs/service/git/contributors.rs @@ -65,7 +65,13 @@ impl AppService { } let repo_clone = repo.clone(); - let ref_name_clone = query.ref_name.clone().or_else(|| Some(repo.default_branch.clone())); + let ref_name_clone = query.ref_name.clone().or_else(|| { + if repo.default_branch.is_empty() { + None + } else { + Some(format!("refs/heads/{}", repo.default_branch)) + } + }); let commits = tokio::task::spawn_blocking(move || { let domain = git::GitDomain::from_model(repo_clone)?;