summaryrefslogtreecommitdiff
path: root/makima/src/daemon/task/manager.rs
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-02-16 15:09:52 +0000
committersoryu <soryu@soryu.co>2026-02-16 15:09:59 +0000
commit29ec8e53f2acf56fe4a2cd02d352144c697a6afc (patch)
treeae4ad54a3c584fa2e9949f483c9f2b5edd9b819f /makima/src/daemon/task/manager.rs
parentb6a29bb563499b2fd6280c742bd2106d66393112 (diff)
downloadsoryu-29ec8e53f2acf56fe4a2cd02d352144c697a6afc.tar.gz
soryu-29ec8e53f2acf56fe4a2cd02d352144c697a6afc.zip
Fix bugs with restoring/continuing from tasks
Diffstat (limited to 'makima/src/daemon/task/manager.rs')
-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())))?
}
}
}