pub fn parse_remote_url_org_repo(url: &str) -> Option<(String, String)> {
let url = url.trim();
if url.is_empty() {
return None;
}
let path = if let Some(rest) = url
.strip_prefix("ssh://")
.or_else(|| url.strip_prefix("git://"))
{
rest.split_once('/')?.1
} else if url.contains("://") {
let after_scheme = url.split_once("://")?.1;
after_scheme.split_once('/')?.1
} else if let Some(colon_pos) = url.find(':') {
let before_colon = &url[..colon_pos];
if before_colon.contains('/') {
return None;
}
&url[colon_pos + 1..]
} else {
return None;
};
extract_org_repo_from_path(path)
}
fn extract_org_repo_from_path(path: &str) -> Option<(String, String)> {
let path = path.trim_start_matches('/');
let segments: Vec<&str> = path.split('/').filter(|s| !s.is_empty()).collect();
if segments.len() < 2 {
return None;
}
let org = segments[segments.len() - 2];
let repo_raw = segments[segments.len() - 1];
let repo = repo_raw.strip_suffix(".git").unwrap_or(repo_raw);
if org.is_empty() || repo.is_empty() {
return None;
}
Some((org.to_string(), repo.to_string()))
}
#[cfg(test)]
#[path = "git_url_tests.rs"]
mod git_url_tests;