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)
| 3638 | /// - GitLab: `title\n\nSee merge request group/project!42` |
| 3639 | /// - Azure DevOps: `Merged PR 42: title\n\n...` |
| 3640 | fn parse_squash_merge_format(message: &str) -> Option<u32> { |
| 3641 | let lines: Vec<&str> = message.lines().collect(); |
| 3642 | if lines.len() < 2 { |
| 3643 | return None; |
| 3644 | } |
| 3645 | |
| 3646 | // GitHub: first line has (#N), followed by blank line + bullet points |
| 3647 | if let Some(pr) = parse_pr_number(lines[0]) { |
| 3648 | if lines.len() >= 3 { |
| 3649 | let has_bullets = lines[2..].iter().any(|l| l.trim().starts_with("* ")); |
| 3650 | if has_bullets { |
| 3651 | return Some(pr); |
| 3652 | } |
| 3653 | } |
| 3654 | } |
| 3655 | |
| 3656 | // GitLab: body contains "See merge request ...!N" |
| 3657 | for line in &lines[1..] { |
| 3658 | if line.contains("See merge request") { |
| 3659 | return parse_pr_number(line); |
| 3660 | } |
| 3661 | } |
| 3662 | |
| 3663 | // Azure DevOps: "Merged PR N: title" |
| 3664 | if lines[0].starts_with("Merged PR ") { |
| 3665 | return parse_pr_number(lines[0]); |
| 3666 | } |
| 3667 | |
| 3668 | None |
| 3669 | } |
| 3670 | |
| 3671 | // ═══════════════════════════════════════════════════════════════════════ |
| 3672 | // Free Functions for Parallel Parsing |
no test coverage detected