diff options
| author | soryu <soryu@soryu.co> | 2026-02-18 17:20:32 +0000 |
|---|---|---|
| committer | soryu <soryu@soryu.co> | 2026-02-18 17:20:32 +0000 |
| commit | 28b191cc0b0e69b864191673df9c141730c93e4f (patch) | |
| tree | e96fb3e21a37e5f3ef6c6937de13f87ad357d7d7 /makima/src/daemon/worktree/manager.rs | |
| parent | 720ebdac2f64ce18e1de68d070cd3fe46f44547c (diff) | |
| download | soryu-28b191cc0b0e69b864191673df9c141730c93e4f.tar.gz soryu-28b191cc0b0e69b864191673df9c141730c93e4f.zip | |
fix: prevent directive step failure when PR branch is deleted after merge
Stop using pr_branch as base branch for step tasks since it may be
auto-deleted by GitHub after PR merge. Instead always use
continue_from_task_id or fall back to base_branch. Also add a safety
net in create_worktree that detects when a base branch ref no longer
exists and falls back to the repo's default branch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'makima/src/daemon/worktree/manager.rs')
| -rw-r--r-- | makima/src/daemon/worktree/manager.rs | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/makima/src/daemon/worktree/manager.rs b/makima/src/daemon/worktree/manager.rs index c27bcf6..30618ea 100644 --- a/makima/src/daemon/worktree/manager.rs +++ b/makima/src/daemon/worktree/manager.rs @@ -484,7 +484,9 @@ impl WorktreeManager { "Creating worktree with new branch" ); - // Prefer origin/{base_branch} to get latest remote state + // Prefer origin/{base_branch} to get latest remote state. + // If neither origin/{base_branch} nor {base_branch} exist (e.g. PR branch + // was deleted after merge), fall back to the repo's default branch. let origin_ref = format!("origin/{}", base_branch); let has_origin_ref = Command::new("git") .args(["rev-parse", "--verify", &format!("refs/remotes/{}", origin_ref)]) @@ -494,10 +496,43 @@ impl WorktreeManager { .map(|o| o.status.success()) .unwrap_or(false); - let start_point = if has_origin_ref { - origin_ref.as_str() + let has_local_ref = if !has_origin_ref { + Command::new("git") + .args(["rev-parse", "--verify", &format!("refs/heads/{}", base_branch)]) + .current_dir(source_repo) + .output() + .await + .map(|o| o.status.success()) + .unwrap_or(false) } else { - base_branch + false // don't need to check — we already have origin ref + }; + + let start_point: String = if has_origin_ref { + origin_ref + } else if has_local_ref { + base_branch.to_string() + } else { + // Branch doesn't exist (likely deleted after PR merge) — use default branch + tracing::warn!( + task_id = %task_id, + base_branch = %base_branch, + "Base branch ref not found, falling back to default branch" + ); + let default_branch = self.detect_default_branch(source_repo).await?; + let default_origin = format!("origin/{}", default_branch); + let has_default_origin = Command::new("git") + .args(["rev-parse", "--verify", &format!("refs/remotes/{}", default_origin)]) + .current_dir(source_repo) + .output() + .await + .map(|o| o.status.success()) + .unwrap_or(false); + if has_default_origin { + default_origin + } else { + default_branch + } }; tracing::info!( |
