diff options
| author | soryu <soryu@soryu.co> | 2026-02-16 15:09:52 +0000 |
|---|---|---|
| committer | soryu <soryu@soryu.co> | 2026-02-16 15:09:59 +0000 |
| commit | 29ec8e53f2acf56fe4a2cd02d352144c697a6afc (patch) | |
| tree | ae4ad54a3c584fa2e9949f483c9f2b5edd9b819f /makima/src/daemon | |
| parent | b6a29bb563499b2fd6280c742bd2106d66393112 (diff) | |
| download | soryu-29ec8e53f2acf56fe4a2cd02d352144c697a6afc.tar.gz soryu-29ec8e53f2acf56fe4a2cd02d352144c697a6afc.zip | |
Fix bugs with restoring/continuing from tasks
Diffstat (limited to 'makima/src/daemon')
| -rw-r--r-- | makima/src/daemon/task/manager.rs | 65 |
1 files changed, 53 insertions, 12 deletions
diff --git a/makima/src/daemon/task/manager.rs b/makima/src/daemon/task/manager.rs index 9dc342e..b382507 100644 --- a/makima/src/daemon/task/manager.rs +++ b/makima/src/daemon/task/manager.rs @@ -4508,24 +4508,65 @@ impl TaskManagerInner { ); worktree_info } - Err(e) => { - return Err(DaemonError::Task(TaskError::SetupFailed( - format!("Cannot continue from task {}: worktree copy failed ({}), branch not found ({}), patch restore failed ({})", from_task_id, copy_err, branch_err, e) - ))); + Err(patch_err) => { + tracing::warn!( + task_id = %task_id, + from_task_id = %from_task_id, + error = %patch_err, + "Patch restore failed — falling back to fresh worktree" + ); + let msg = DaemonMessage::task_output( + task_id, + format!("Patch restore failed, starting fresh from {}\n", branch), + false, + ); + let _ = self.ws_tx.send(msg).await; + + self.worktree_manager + .create_worktree(&source_repo, task_id, &task_name, &branch) + .await + .map_err(|e| DaemonError::Task(TaskError::SetupFailed(e.to_string())))? } } } - Err(e) => { - return Err(DaemonError::Task(TaskError::SetupFailed( - format!("Cannot continue from task {}: worktree copy failed ({}), branch not found ({}), patch decode failed ({})", from_task_id, copy_err, branch_err, e) - ))); + Err(decode_err) => { + tracing::warn!( + task_id = %task_id, + from_task_id = %from_task_id, + error = %decode_err, + "Patch decode failed — falling back to fresh worktree" + ); + let msg = DaemonMessage::task_output( + task_id, + format!("Patch decode failed, starting fresh from {}\n", branch), + false, + ); + let _ = self.ws_tx.send(msg).await; + + self.worktree_manager + .create_worktree(&source_repo, task_id, &task_name, &branch) + .await + .map_err(|e| DaemonError::Task(TaskError::SetupFailed(e.to_string())))? } } } else { - // Step 4: No fallback available - return Err(DaemonError::Task(TaskError::SetupFailed( - format!("Cannot continue from task {}: worktree copy failed ({}), branch not found ({}), no patch data available", from_task_id, copy_err, branch_err) - ))); + // Step 4: Fall back to fresh worktree from base branch + tracing::warn!( + task_id = %task_id, + from_task_id = %from_task_id, + "All continue_from fallbacks failed — creating fresh worktree from base branch" + ); + let msg = DaemonMessage::task_output( + task_id, + format!("Source task worktree unavailable, starting fresh from {}\n", branch), + false, + ); + let _ = self.ws_tx.send(msg).await; + + self.worktree_manager + .create_worktree(&source_repo, task_id, &task_name, &branch) + .await + .map_err(|e| DaemonError::Task(TaskError::SetupFailed(e.to_string())))? } } } |
