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

Function parse_pr_number

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

3615/// - Bitbucket: `Merged in branch (pull request #42)`
3616/// - Azure DevOps: `Merged PR 42: title`
3617fn parse_pr_number(message: &str) -> Option<u32> {
3618 for line in message.lines() {
3619 let line = line.trim();
3620
3621 // GitHub: "(#N)" anywhere in the line
3622 if let Some(start) = line.rfind("(#") {
3623 if let Some(end) = line[start..].find(')') {
3624 if let Ok(n) = line[start + 2..start + end].parse::<u32>() {
3625 return Some(n);
3626 }
3627 }
3628 }
3629
3630 // GitHub: "Merge pull request #N"
3631 if let Some(idx) = line.find("pull request #") {
3632 let after = &line[idx + "pull request #".len()..];
3633 let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect();
3634 if let Ok(n) = num_str.parse::<u32>() {
3635 return Some(n);
3636 }
3637 }
3638
3639 // GitLab: "See merge request group/project!N" or just "!N"
3640 if let Some(idx) = line.rfind('!') {
3641 let after = &line[idx + 1..];
3642 let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect();
3643 if !num_str.is_empty() {
3644 if let Ok(n) = num_str.parse::<u32>() {
3645 // Verify it's a merge request reference, not a random "!"
3646 if line.contains("merge request") || line.ends_with(&format!("!{}", n)) {
3647 return Some(n);
3648 }
3649 }
3650 }
3651 }
3652
3653 // Azure DevOps: "Merged PR N: title"
3654 if let Some(rest) = line.strip_prefix("Merged PR ") {
3655 let num_str: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect();
3656 if let Ok(n) = num_str.parse::<u32>() {
3657 return Some(n);
3658 }
3659 }
3660 }
3661 None
3662}
3663
3664/// Detect squash merge format from various Git forges.
3665///

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