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)
| 3500 | /// - Bitbucket: `Merged in branch (pull request #42)` |
| 3501 | /// - Azure DevOps: `Merged PR 42: title` |
| 3502 | fn 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 | /// |
no test coverage detected