MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / parse_pr_number

Function parse_pr_number

atomic-cli/src/commands/git/parallel.rs:3983–4028  ·  view source on GitHub ↗

Parse a PR/MR number from a commit message. Supports multiple forge formats: - GitHub: `(#42)` or `Merge pull request #42 from ...` - GitLab: `See merge request group/project!42` - Bitbucket: `Merged in branch (pull request #42)` - Azure DevOps: `Merged PR 42: title`

(message: &str)

Source from the content-addressed store, hash-verified

3981/// - Bitbucket: `Merged in branch (pull request #42)`
3982/// - Azure DevOps: `Merged PR 42: title`
3983fn parse_pr_number(message: &str) -> Option<u32> {
3984 for line in message.lines() {
3985 let line = line.trim();
3986
3987 // GitHub: "(#N)" anywhere in the line
3988 if let Some(start) = line.rfind("(#") {
3989 if let Some(end) = line[start..].find(')') {
3990 if let Ok(n) = line[start + 2..start + end].parse::<u32>() {
3991 return Some(n);
3992 }
3993 }
3994 }
3995
3996 // GitHub: "Merge pull request #N"
3997 if let Some(idx) = line.find("pull request #") {
3998 let after = &line[idx + "pull request #".len()..];
3999 let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect();
4000 if let Ok(n) = num_str.parse::<u32>() {
4001 return Some(n);
4002 }
4003 }
4004
4005 // GitLab: "See merge request group/project!N" or just "!N"
4006 if let Some(idx) = line.rfind('!') {
4007 let after = &line[idx + 1..];
4008 let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect();
4009 if !num_str.is_empty() {
4010 if let Ok(n) = num_str.parse::<u32>() {
4011 // Verify it's a merge request reference, not a random "!"
4012 if line.contains("merge request") || line.ends_with(&format!("!{}", n)) {
4013 return Some(n);
4014 }
4015 }
4016 }
4017 }
4018
4019 // Azure DevOps: "Merged PR N: title"
4020 if let Some(rest) = line.strip_prefix("Merged PR ") {
4021 let num_str: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect();
4022 if let Ok(n) = num_str.parse::<u32>() {
4023 return Some(n);
4024 }
4025 }
4026 }
4027 None
4028}
4029
4030/// Detect squash merge format from various Git forges.
4031///

Callers 4

try_squash_insertMethod · 0.85
forecast_commit_kindFunction · 0.85
classify_commitFunction · 0.85

Calls 4

linesMethod · 0.45
lenMethod · 0.45
is_emptyMethod · 0.45
containsMethod · 0.45

Tested by

no test coverage detected