summaryrefslogtreecommitdiff
path: root/makima/src/daemon
diff options
context:
space:
mode:
Diffstat (limited to 'makima/src/daemon')
-rw-r--r--makima/src/daemon/task/manager.rs65
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())))?
}
}
}