summaryrefslogtreecommitdiff
path: root/makima/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'makima/src/server')
-rw-r--r--makima/src/server/handlers/directives.rs39
1 files changed, 38 insertions, 1 deletions
diff --git a/makima/src/server/handlers/directives.rs b/makima/src/server/handlers/directives.rs
index 56278a8..992affe 100644
--- a/makima/src/server/handlers/directives.rs
+++ b/makima/src/server/handlers/directives.rs
@@ -931,6 +931,19 @@ pub async fn cleanup_directive(
.into_response();
}
+ // Auto-remove completed steps that were already included in a merged PR
+ if directive.pr_url.is_some() || directive.pr_branch.is_some() {
+ match crate::orchestration::directive::remove_already_merged_steps(pool, id).await {
+ Ok(count) if count > 0 => {
+ tracing::info!("Auto-removed {} completed steps already in PR for directive {} during cleanup", count, id);
+ }
+ Err(e) => {
+ tracing::warn!("Failed to auto-remove merged steps during cleanup for directive {}: {}", id, e);
+ }
+ _ => {}
+ }
+ }
+
// Get completed step tasks for branch name computation
let step_tasks = match repository::get_completed_step_tasks(pool, id).await {
Ok(tasks) => tasks,
@@ -1155,7 +1168,7 @@ pub async fn pick_up_orders(
};
// Verify directive ownership and get directive with steps
- let (directive, steps) =
+ let (directive, mut steps) =
match repository::get_directive_with_steps_for_owner(pool, auth.owner_id, id).await {
Ok(Some((d, s))) => (d, s),
Ok(None) => {
@@ -1175,6 +1188,30 @@ pub async fn pick_up_orders(
}
};
+ // Auto-remove completed steps that were already included in a PR
+ if directive.pr_url.is_some() || directive.pr_branch.is_some() {
+ match crate::orchestration::directive::remove_already_merged_steps(pool, id).await {
+ Ok(count) if count > 0 => {
+ tracing::info!("Auto-removed {} completed steps already in PR for directive {}", count, id);
+ // Re-fetch steps since some were removed
+ steps = match repository::list_directive_steps(pool, id).await {
+ Ok(s) => s,
+ Err(e) => {
+ tracing::error!("Failed to re-fetch steps after cleanup: {}", e);
+ return (
+ StatusCode::INTERNAL_SERVER_ERROR,
+ Json(ApiError::new("REFETCH_STEPS_FAILED", &e.to_string())),
+ ).into_response();
+ }
+ };
+ }
+ Err(e) => {
+ tracing::warn!("Failed to auto-remove merged steps for directive {}: {}", id, e);
+ }
+ _ => {}
+ }
+ }
+
// Reconcile existing orders: mark done if step completed, under_review if step in progress
match repository::reconcile_directive_orders(pool, auth.owner_id, id).await {
Ok(count) => {