diff --git a/lib/merge.py b/lib/merge.py index f596446..4612133 100644 --- a/lib/merge.py +++ b/lib/merge.py @@ -302,12 +302,22 @@ async def _cherry_pick_onto_main(branch: str) -> tuple[bool, str]: if rc == 0 and rc2 == 0 and merge_base.strip() == main_sha.strip(): return True, "already up to date" - # Get extraction commits (oldest first) + # Get extraction commits (oldest first), skip merge commits from fork workflows rc, commits_out = await _git( - "log", f"origin/main..origin/{branch}", "--format=%H", "--reverse", + "log", f"origin/main..origin/{branch}", "--no-merges", "--format=%H", "--reverse", timeout=10, ) if rc != 0 or not commits_out.strip(): + # Check if branch has content but only merge commits (fork workflow edge case) + rc_diff, diff_out = await _git( + "diff", "--stat", f"origin/main...origin/{branch}", timeout=10, + ) + if rc_diff == 0 and diff_out.strip(): + db.audit("merge_manual_needed", detail=json.dumps({ + "pr": pr_number, "branch": branch, + "reason": "branch has content diff but only merge commits — needs manual merge", + })) + return False, f"branch {branch} has only merge commits but contains content — flagged for manual merge" return False, f"no commits found on {branch}" commit_list = [c.strip() for c in commits_out.strip().split("\n") if c.strip()]