ralph/cli/queue/
archive.rs1use anyhow::Result;
16use clap::Args;
17
18use crate::config::Resolved;
19use crate::queue;
20
21#[derive(Args)]
23#[command(
24 after_long_help = "Examples:\n ralph queue archive\n ralph queue archive --dry-run\n\nDry run:\n Shows what would be archived without modifying files."
25)]
26pub struct QueueArchiveArgs {
27 #[arg(long)]
29 pub dry_run: bool,
30}
31
32pub(crate) fn handle(resolved: &Resolved, force: bool, args: QueueArchiveArgs) -> Result<()> {
33 let _queue_lock = queue::acquire_queue_lock(&resolved.repo_root, "queue archive", force)?;
34
35 if !args.dry_run {
37 crate::undo::create_undo_snapshot(resolved, "queue archive")?;
38 }
39
40 let max_depth = resolved.config.queue.max_dependency_depth.unwrap_or(10);
41
42 if args.dry_run {
43 let mut active = queue::load_queue(&resolved.queue_path)?;
45 let mut done = queue::load_queue_or_default(&resolved.done_path)?;
46 let now = crate::timeutil::now_utc_rfc3339()?;
47 let report = queue::archive_terminal_tasks_in_memory(&mut active, &mut done, &now)?;
48
49 if report.moved_ids.is_empty() {
50 log::info!("Dry run: no terminal tasks to archive.");
51 } else {
52 log::info!(
53 "Dry run: would archive {} terminal task(s).",
54 report.moved_ids.len()
55 );
56 log::info!("Task IDs: {}", report.moved_ids.join(", "));
57 }
58 } else {
59 let report = queue::archive_terminal_tasks(
61 &resolved.queue_path,
62 &resolved.done_path,
63 &resolved.id_prefix,
64 resolved.id_width,
65 max_depth,
66 )?;
67 if report.moved_ids.is_empty() {
68 log::info!("No terminal tasks (done/rejected) to archive.");
69 } else {
70 log::info!(
71 "Archived {} terminal task(s) (done/rejected).",
72 report.moved_ids.len()
73 );
74 }
75 }
76 Ok(())
77}