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)
| 3553 | /// - GitLab: `title\n\nSee merge request group/project!42` |
| 3554 | /// - Azure DevOps: `Merged PR 42: title\n\n...` |
| 3555 | fn parse_squash_merge_format(message: &str) -> Option<u32> { |
| 3556 | let lines: Vec<&str> = message.lines().collect(); |
| 3557 | if lines.len() < 2 { |
| 3558 | return None; |
| 3559 | } |
| 3560 | |
| 3561 | // GitHub: first line has (#N), followed by blank line + bullet points |
| 3562 | if let Some(pr) = parse_pr_number(lines[0]) { |
| 3563 | if lines.len() >= 3 { |
| 3564 | let has_bullets = lines[2..].iter().any(|l| l.trim().starts_with("* ")); |
| 3565 | if has_bullets { |
| 3566 | return Some(pr); |
| 3567 | } |
| 3568 | } |
| 3569 | } |
| 3570 | |
| 3571 | // GitLab: body contains "See merge request ...!N" |
| 3572 | for line in &lines[1..] { |
| 3573 | if line.contains("See merge request") { |
| 3574 | return parse_pr_number(line); |
| 3575 | } |
| 3576 | } |
| 3577 | |
| 3578 | // Azure DevOps: "Merged PR N: title" |
| 3579 | if lines[0].starts_with("Merged PR ") { |
| 3580 | return parse_pr_number(lines[0]); |
| 3581 | } |
| 3582 | |
| 3583 | None |
| 3584 | } |
| 3585 | |
| 3586 | // ═══════════════════════════════════════════════════════════════════════ |
| 3587 | // Free Functions for Parallel Parsing |
no test coverage detected