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)
| 3668 | /// - GitLab: `title\n\nSee merge request group/project!42` |
| 3669 | /// - Azure DevOps: `Merged PR 42: title\n\n...` |
| 3670 | fn parse_squash_merge_format(message: &str) -> Option<u32> { |
| 3671 | let lines: Vec<&str> = message.lines().collect(); |
| 3672 | if lines.len() < 2 { |
| 3673 | return None; |
| 3674 | } |
| 3675 | |
| 3676 | // GitHub: first line has (#N), followed by blank line + bullet points |
| 3677 | if let Some(pr) = parse_pr_number(lines[0]) { |
| 3678 | if lines.len() >= 3 { |
| 3679 | let has_bullets = lines[2..].iter().any(|l| l.trim().starts_with("* ")); |
| 3680 | if has_bullets { |
| 3681 | return Some(pr); |
| 3682 | } |
| 3683 | } |
| 3684 | } |
| 3685 | |
| 3686 | // GitLab: body contains "See merge request ...!N" |
| 3687 | for line in &lines[1..] { |
| 3688 | if line.contains("See merge request") { |
| 3689 | return parse_pr_number(line); |
| 3690 | } |
| 3691 | } |
| 3692 | |
| 3693 | // Azure DevOps: "Merged PR N: title" |
| 3694 | if lines[0].starts_with("Merged PR ") { |
| 3695 | return parse_pr_number(lines[0]); |
| 3696 | } |
| 3697 | |
| 3698 | None |
| 3699 | } |
| 3700 | |
| 3701 | // ═══════════════════════════════════════════════════════════════════════ |
| 3702 | // Free Functions for Parallel Parsing |
no test coverage detected