diff --git a/hive-c0re/src/forge/pr_merge.rs b/hive-c0re/src/forge/pr_merge.rs index cad72a5e..74398dec 100644 --- a/hive-c0re/src/forge/pr_merge.rs +++ b/hive-c0re/src/forge/pr_merge.rs @@ -77,13 +77,6 @@ fn repo_agent_name(repo: &str) -> &str { repo.rsplit('/').next().unwrap_or(repo) } -/// Token-in-URL clone/push URL for a forge repo (`owner/name`). Mirrors -/// `push_config`'s pattern; the token is passed straight to git and never -/// stored as a named remote. -fn tokenised_repo_url(repo: &str, token: &str) -> String { - forge_git_url(token, repo) -} - /// Resolve a PR's head sha via `git ls-remote refs/pull//head` /// (Forgejo exposes PR heads there). Pure read, no mutation — the handler's /// primary drift gate (compare against the approved sha), and `mark_pr_merged` @@ -94,7 +87,7 @@ fn tokenised_repo_url(repo: &str, token: &str) -> String { pub async fn pr_head_sha(repo: &str, pr: u64) -> Result { let token = core_token() .ok_or_else(|| ForgeMergeError::Other(anyhow::anyhow!("forge core token absent")))?; - let url = tokenised_repo_url(repo, &token); + let url = forge_git_url(&token, repo); let refspec = format!("refs/pull/{pr}/head"); let out = crate::lifecycle::git_command() .args(["ls-remote", &url, &refspec]) @@ -139,7 +132,7 @@ pub fn config_repo(agent: &str) -> String { pub async fn fetch_pr_head_into_applied(repo: &str, pr: u64) -> Result<(), ForgeMergeError> { let token = core_token() .ok_or_else(|| ForgeMergeError::Other(anyhow::anyhow!("forge core token absent")))?; - let url = tokenised_repo_url(repo, &token); + let url = forge_git_url(&token, repo); let applied = Coordinator::agent_applied_dir(repo_agent_name(repo)); let refspec = format!("refs/pull/{pr}/head"); let out = crate::lifecycle::git_command() @@ -171,7 +164,7 @@ pub async fn fetch_pr_head_into_applied(repo: &str, pr: u64) -> Result<(), Forge pub async fn ff_push_to_main(repo: &str, sha: &str) -> Result<(), ForgeMergeError> { let token = core_token() .ok_or_else(|| ForgeMergeError::Other(anyhow::anyhow!("forge core token absent")))?; - let url = tokenised_repo_url(repo, &token); + let url = forge_git_url(&token, repo); let applied = Coordinator::agent_applied_dir(repo_agent_name(repo)); // Current `main` on the forge repo. @@ -300,7 +293,8 @@ pub async fn mark_pr_merged(repo: &str, pr: u64, sha: &str) -> Result<(), ForgeM #[cfg(test)] mod tests { - use super::{repo_agent_name, tokenised_repo_url}; + use super::repo_agent_name; + use crate::forge::forge_git_url; #[test] fn repo_agent_name_takes_trailing_segment() { @@ -310,10 +304,10 @@ mod tests { } #[test] - fn tokenised_repo_url_shape() { + fn forge_git_url_shape() { // Credentials are inserted between scheme and authority; fallback // base is `http://localhost:3000` when HIVE_FORGE_URL is unset. - let url = tokenised_repo_url("agent-configs/iris", "tok"); + let url = forge_git_url("tok", "agent-configs/iris"); assert!(url.contains("core:tok@"), "must embed credentials: {url}"); assert!( url.ends_with("/agent-configs/iris.git"),