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