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)
| 3981 | /// - Bitbucket: `Merged in branch (pull request #42)` |
| 3982 | /// - Azure DevOps: `Merged PR 42: title` |
| 3983 | fn parse_pr_number(message: &str) -> Option<u32> { |
| 3984 | for line in message.lines() { |
| 3985 | let line = line.trim(); |
| 3986 | |
| 3987 | // GitHub: "(#N)" anywhere in the line |
| 3988 | if let Some(start) = line.rfind("(#") { |
| 3989 | if let Some(end) = line[start..].find(')') { |
| 3990 | if let Ok(n) = line[start + 2..start + end].parse::<u32>() { |
| 3991 | return Some(n); |
| 3992 | } |
| 3993 | } |
| 3994 | } |
| 3995 | |
| 3996 | // GitHub: "Merge pull request #N" |
| 3997 | if let Some(idx) = line.find("pull request #") { |
| 3998 | let after = &line[idx + "pull request #".len()..]; |
| 3999 | let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect(); |
| 4000 | if let Ok(n) = num_str.parse::<u32>() { |
| 4001 | return Some(n); |
| 4002 | } |
| 4003 | } |
| 4004 | |
| 4005 | // GitLab: "See merge request group/project!N" or just "!N" |
| 4006 | if let Some(idx) = line.rfind('!') { |
| 4007 | let after = &line[idx + 1..]; |
| 4008 | let num_str: String = after.chars().take_while(|c| c.is_ascii_digit()).collect(); |
| 4009 | if !num_str.is_empty() { |
| 4010 | if let Ok(n) = num_str.parse::<u32>() { |
| 4011 | // Verify it's a merge request reference, not a random "!" |
| 4012 | if line.contains("merge request") || line.ends_with(&format!("!{}", n)) { |
| 4013 | return Some(n); |
| 4014 | } |
| 4015 | } |
| 4016 | } |
| 4017 | } |
| 4018 | |
| 4019 | // Azure DevOps: "Merged PR N: title" |
| 4020 | if let Some(rest) = line.strip_prefix("Merged PR ") { |
| 4021 | let num_str: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect(); |
| 4022 | if let Ok(n) = num_str.parse::<u32>() { |
| 4023 | return Some(n); |
| 4024 | } |
| 4025 | } |
| 4026 | } |
| 4027 | None |
| 4028 | } |
| 4029 | |
| 4030 | /// Detect squash merge format from various Git forges. |
| 4031 | /// |
no test coverage detected