Detect squash merge format from various Git forges. Supported formats: - GitHub: `title (#42)\n\n* commit msg 1\n* commit msg 2` - GitLab: `title\n\nSee merge request group/project!42` - Azure DevOps: `Merged PR 42: title\n\n...`
(message: &str)
| 4034 | /// - GitLab: `title\n\nSee merge request group/project!42` |
| 4035 | /// - Azure DevOps: `Merged PR 42: title\n\n...` |
| 4036 | fn parse_squash_merge_format(message: &str) -> Option<u32> { |
| 4037 | let lines: Vec<&str> = message.lines().collect(); |
| 4038 | if lines.len() < 2 { |
| 4039 | return None; |
| 4040 | } |
| 4041 | |
| 4042 | // GitHub: first line has (#N), followed by blank line + bullet points |
| 4043 | if let Some(pr) = parse_pr_number(lines[0]) { |
| 4044 | if lines.len() >= 3 { |
| 4045 | let has_bullets = lines[2..].iter().any(|l| l.trim().starts_with("* ")); |
| 4046 | if has_bullets { |
| 4047 | return Some(pr); |
| 4048 | } |
| 4049 | } |
| 4050 | } |
| 4051 | |
| 4052 | // GitLab: body contains "See merge request ...!N" |
| 4053 | for line in &lines[1..] { |
| 4054 | if line.contains("See merge request") { |
| 4055 | return parse_pr_number(line); |
| 4056 | } |
| 4057 | } |
| 4058 | |
| 4059 | // Azure DevOps: "Merged PR N: title" |
| 4060 | if lines[0].starts_with("Merged PR ") { |
| 4061 | return parse_pr_number(lines[0]); |
| 4062 | } |
| 4063 | |
| 4064 | None |
| 4065 | } |
| 4066 | |
| 4067 | // ═══════════════════════════════════════════════════════════════════════ |
| 4068 | // Free Functions for Parallel Parsing |
no test coverage detected