diff --git a/lib/merge.py b/lib/merge.py index bac96da..a84e109 100644 --- a/lib/merge.py +++ b/lib/merge.py @@ -318,8 +318,10 @@ async def _cherry_pick_onto_main(branch: str) -> tuple[bool, str]: # Delete stale local branch if it exists from a previous failed attempt await _git("branch", "-D", clean_branch) rc, out = await _git("worktree", "add", "-b", clean_branch, worktree_path, "origin/main") - if rc != 0 and "could not lock config" in out: - await asyncio.sleep(random.uniform(0.5, 2.0)) + for _retry in range(3): + if rc == 0 or "could not lock config" not in out: + break + await asyncio.sleep(random.uniform(0.5, 2.0 * (_retry + 1))) await _git("branch", "-D", clean_branch) rc, out = await _git("worktree", "add", "-b", clean_branch, worktree_path, "origin/main") if rc != 0: @@ -577,6 +579,12 @@ async def _merge_reweave_pr(branch: str) -> tuple[bool, str]: await _git("worktree", "remove", "--force", worktree_path) await _git("branch", "-D", clean_branch) rc, out = await _git("worktree", "add", "-b", clean_branch, worktree_path, "origin/main") + for _retry in range(3): + if rc == 0 or "could not lock config" not in out: + break + await asyncio.sleep(random.uniform(0.5, 2.0 * (_retry + 1))) + await _git("branch", "-D", clean_branch) + rc, out = await _git("worktree", "add", "-b", clean_branch, worktree_path, "origin/main") if rc != 0: return False, f"worktree add failed: {out}"