pub mod issue_handler;
pub mod pr_handler;
pub use issue_handler::IssueProtocolHandler;
pub use pr_handler::PrProtocolHandler;
pub(crate) fn detect_github_repo() -> Option<String> {
let output = std::process::Command::new("git")
.args(["remote", "get-url", "origin"])
.output()
.ok()?;
let url = String::from_utf8_lossy(&output.stdout).trim().to_string();
if url.is_empty() {
return None;
}
parse_github_owner_repo(&url)
}
fn parse_github_owner_repo(url: &str) -> Option<String> {
let url = url.trim();
let stripped = if let Some(path) = url.strip_prefix("https://github.com/") {
path
} else if let Some(path) = url.strip_prefix("git@github.com:") {
path
} else if let Some(path) = url.strip_prefix("ssh://git@github.com/") {
path
} else {
return None;
};
let stripped = stripped.strip_suffix(".git").unwrap_or(stripped);
let stripped = stripped.trim_end_matches('/');
let parts: Vec<&str> = stripped.split('/').collect();
if parts.len() == 2 && !parts[0].is_empty() && !parts[1].is_empty() {
Some(format!("{}/{}", parts[0], parts[1]))
} else {
None
}
}
pub(crate) fn github_token() -> Option<String> {
std::env::var("GITHUB_TOKEN")
.or_else(|_| std::env::var("GH_TOKEN"))
.ok()
.filter(|t| !t.is_empty())
}