Initial commit: git-issue-commit CLI tool
Some checks failed
CI / release (push) Has been cancelled
CI / test (push) Has been cancelled

This commit is contained in:
2026-01-29 19:59:24 +00:00
parent 958e5688cc
commit c1770f58b9

View File

@@ -0,0 +1,82 @@
pub fn detect_type_from_text(text: &str) -> String {
let text_lower = text.to_lowercase();
if text_lower.contains("fix") || text_lower.contains("bug") || text_lower.contains("error") {
return "fix".to_string();
}
if text_lower.contains("feature") || text_lower.contains("add") || text_lower.contains("new") {
return "feat".to_string();
}
if text_lower.contains("document") || text_lower.contains("doc") {
return "docs".to_string();
}
if text_lower.contains("test") {
return "test".to_string();
}
if text_lower.contains("refactor") {
return "refactor".to_string();
}
if text_lower.contains("performance") || text_lower.contains("optimize") {
return "perf".to_string();
}
if text_lower.contains("style") || text_lower.contains("format") {
return "style".to_string();
}
if text_lower.contains("ci") || text_lower.contains("workflow") {
return "ci".to_string();
}
if text_lower.contains("build") || text_lower.contains("dependenc") {
return "build".to_string();
}
if text_lower.contains("revert") || text_lower.contains("undo") {
return "revert".to_string();
}
"chore".to_string()
}
pub fn extract_scope_from_labels(labels: &[String]) -> Option<String> {
for label in labels {
let label_lower = label.to_lowercase();
if label_lower.contains("backend") || label_lower.contains("server") {
return Some("backend".to_string());
}
if label_lower.contains("frontend") || label_lower.contains("ui") || label_lower.contains("web") {
return Some("frontend".to_string());
}
if label_lower.contains("api") {
return Some("api".to_string());
}
if label_lower.contains("database") || label_lower.contains("db") {
return Some("db".to_string());
}
if label_lower.contains("auth") {
return Some("auth".to_string());
}
}
None
}
pub fn extract_scope_from_path(path: &str) -> Option<String> {
let parts: Vec<&str> = path.split('/').collect();
for &part in &parts {
match part {
"src" | "lib" => continue,
"tests" | "test" => return Some("test".to_string()),
"docs" | "documentation" => return Some("docs".to_string()),
"api" => return Some("api".to_string()),
"cli" => return Some("cli".to_string()),
_ => {
if part.ends_with(".rs") {
let module_name = part.trim_end_matches(".rs");
return Some(module_name.to_string());
}
}
}
}
parts.last()
.map(|s| s.trim_end_matches(".rs").to_string())
.filter(|s| !s.is_empty())
}