diff --git a/libs/git/commit/traverse.rs b/libs/git/commit/traverse.rs index 0507bac..6161554 100644 --- a/libs/git/commit/traverse.rs +++ b/libs/git/commit/traverse.rs @@ -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)); diff --git a/libs/service/git/blob.rs b/libs/service/git/blob.rs index fd724d1..95df351 100644 --- a/libs/service/git/blob.rs +++ b/libs/service/git/blob.rs @@ -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(); diff --git a/libs/service/git/commit.rs b/libs/service/git/commit.rs index 051f343..8e52421 100644 --- a/libs/service/git/commit.rs +++ b/libs/service/git/commit.rs @@ -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 }; diff --git a/libs/service/git/contributors.rs b/libs/service/git/contributors.rs index ad06ed1..f8c4585 100644 --- a/libs/service/git/contributors.rs +++ b/libs/service/git/contributors.rs @@ -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)?; diff --git a/libs/service/git/repo.rs b/libs/service/git/repo.rs index f65650e..8f0bd83 100644 --- a/libs/service/git/repo.rs +++ b/libs/service/git/repo.rs @@ -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)]