ralph/queue/repair/
apply.rs1use super::planning::{plan_queue_maintenance_repair, plan_queue_repair};
27use super::types::{QueueRepairPlan, RepairReport};
28use crate::config::Resolved;
29use crate::constants::queue::DEFAULT_MAX_DEPENDENCY_DEPTH;
30use crate::lock::DirLock;
31use crate::queue::{save_queue, validation};
32use anyhow::Result;
33use std::path::Path;
34
35pub fn apply_queue_repair_with_undo(
36 resolved: &Resolved,
37 _queue_lock: &DirLock,
38 operation: &str,
39) -> Result<RepairReport> {
40 apply_repair_plan_with_undo(
41 resolved,
42 operation,
43 plan_queue_repair(
44 &resolved.queue_path,
45 &resolved.done_path,
46 &resolved.id_prefix,
47 resolved.id_width,
48 )?,
49 )
50}
51
52pub fn apply_queue_maintenance_repair_with_undo(
53 resolved: &Resolved,
54 _queue_lock: &DirLock,
55 operation: &str,
56) -> Result<RepairReport> {
57 apply_repair_plan_with_undo(
58 resolved,
59 operation,
60 plan_queue_maintenance_repair(
61 &resolved.queue_path,
62 &resolved.done_path,
63 &resolved.id_prefix,
64 resolved.id_width,
65 )?,
66 )
67}
68
69fn apply_repair_plan_with_undo(
70 resolved: &Resolved,
71 operation: &str,
72 plan: QueueRepairPlan,
73) -> Result<RepairReport> {
74 let report = plan.report().clone();
75
76 if !plan.has_changes() {
77 return Ok(report);
78 }
79
80 validate_repair_plan(&plan, &resolved.id_prefix, resolved.id_width)?;
81 crate::undo::create_undo_snapshot(resolved, operation)?;
82 save_repair_plan(&resolved.queue_path, &resolved.done_path, &plan)?;
83 Ok(report)
84}
85
86fn validate_repair_plan(plan: &QueueRepairPlan, id_prefix: &str, id_width: usize) -> Result<()> {
87 validation::validate_queue_set(
88 &plan.active,
89 Some(&plan.done),
90 id_prefix,
91 id_width,
92 DEFAULT_MAX_DEPENDENCY_DEPTH,
93 )?;
94 Ok(())
95}
96
97fn save_repair_plan(queue_path: &Path, done_path: &Path, plan: &QueueRepairPlan) -> Result<()> {
98 if plan.queue_changed {
99 save_queue(queue_path, &plan.active)?;
100 }
101 if plan.done_changed {
102 save_queue(done_path, &plan.done)?;
103 }
104 Ok(())
105}