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