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

Function parse_pr_number

atomic-cli/src/commands/git/parallel.rs:3587–3632  ·  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

3585/// - Bitbucket: `Merged in branch (pull request #42)`
3586/// - Azure DevOps: `Merged PR 42: title`
3587fn parse_pr_number(message: &str) -> Option<u32> {
3588 for line in message.lines() {
3589 let line = line.trim();
3590
3591 // GitHub: "(#N)" anywhere in the line
3592 if let Some(start) = line.rfind("(#") {
3593 if let Some(end) = line[start..].find(')') {
3594 if let Ok(n) = line[start + 2..start + end].parse::<u32>() {
3595 return Some(n);
3596 }
3597 }
3598 }
3599
3600 // GitHub: "Merge pull request #N"
3601 if let Some(idx) = line.find("pull request #") {
3602 let after = &line[idx + "pull request #".len()..];
3603 let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect();
3604 if let Ok(n) = num_str.parse::<u32>() {
3605 return Some(n);
3606 }
3607 }
3608
3609 // GitLab: "See merge request group/project!N" or just "!N"
3610 if let Some(idx) = line.rfind('!') {
3611 let after = &line[idx + 1..];
3612 let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect();
3613 if !num_str.is_empty() {
3614 if let Ok(n) = num_str.parse::<u32>() {
3615 // Verify it's a merge request reference, not a random "!"
3616 if line.contains("merge request") || line.ends_with(&format!("!{}", n)) {
3617 return Some(n);
3618 }
3619 }
3620 }
3621 }
3622
3623 // Azure DevOps: "Merged PR N: title"
3624 if let Some(rest) = line.strip_prefix("Merged PR ") {
3625 let num_str: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect();
3626 if let Ok(n) = num_str.parse::<u32>() {
3627 return Some(n);
3628 }
3629 }
3630 }
3631 None
3632}
3633
3634/// Detect squash merge format from various Git forges.
3635///

Callers 2

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