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

Function parse_pr_number

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

3500/// - Bitbucket: `Merged in branch (pull request #42)`
3501/// - Azure DevOps: `Merged PR 42: title`
3502fn parse_pr_number(message: &str) -> Option<u32> {
3503 for line in message.lines() {
3504 let line = line.trim();
3505
3506 // GitHub: "(#N)" anywhere in the line
3507 if let Some(start) = line.rfind("(#") {
3508 if let Some(end) = line[start..].find(')') {
3509 if let Ok(n) = line[start + 2..start + end].parse::<u32>() {
3510 return Some(n);
3511 }
3512 }
3513 }
3514
3515 // GitHub: "Merge pull request #N"
3516 if let Some(idx) = line.find("pull request #") {
3517 let after = &line[idx + "pull request #".len()..];
3518 let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect();
3519 if let Ok(n) = num_str.parse::<u32>() {
3520 return Some(n);
3521 }
3522 }
3523
3524 // GitLab: "See merge request group/project!N" or just "!N"
3525 if let Some(idx) = line.rfind('!') {
3526 let after = &line[idx + 1..];
3527 let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect();
3528 if !num_str.is_empty() {
3529 if let Ok(n) = num_str.parse::<u32>() {
3530 // Verify it's a merge request reference, not a random "!"
3531 if line.contains("merge request") || line.ends_with(&format!("!{}", n)) {
3532 return Some(n);
3533 }
3534 }
3535 }
3536 }
3537
3538 // Azure DevOps: "Merged PR N: title"
3539 if let Some(rest) = line.strip_prefix("Merged PR ") {
3540 let num_str: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect();
3541 if let Ok(n) = num_str.parse::<u32>() {
3542 return Some(n);
3543 }
3544 }
3545 }
3546 None
3547}
3548
3549/// Detect squash merge format from various Git forges.
3550///

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