From 0f8de87abd3df0fe1ce9fc86b42bba3823ca0838 Mon Sep 17 00:00:00 2001 From: timeshifter Date: Tue, 5 May 2026 17:52:41 +0200 Subject: [PATCH] extract todo module --- src/lib.rs | 1 + src/main.rs | 82 ++++++----------------------------------------------- src/todo.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 74 deletions(-) create mode 100644 src/todo.rs diff --git a/src/lib.rs b/src/lib.rs index 74cc132..b732169 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod cmd; +pub mod todo; pub mod zfs; diff --git a/src/main.rs b/src/main.rs index 21be4f4..48165dc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,8 @@ use serde::Deserialize; use zfs_backup::cmd::cryptsetup; use zfs_backup::cmd::zfs::zpool_import; -use zfs_backup::zfs::{Dataset, Snapshot, ZPool}; +use zfs_backup::todo; +use zfs_backup::zfs::ZPool; fn main() -> Result<()> { verify_running_as_root()?; @@ -80,7 +81,7 @@ fn do_backup( snapshot_tag: String, snapshot_interval: String, ) -> Result { - let todos = Todo::plan(local_pool, backup_pool, snapshot_tag, snapshot_interval) + let todos = todo::Todo::plan(local_pool, backup_pool, snapshot_tag, snapshot_interval) .context("planning todos")?; if todos.is_empty() { @@ -96,26 +97,26 @@ fn do_backup( Ok(false) } -fn execute_todos(local: &ZPool, remote: &ZPool, todos: Vec) -> Result<()> { +fn execute_todos(local: &ZPool, remote: &ZPool, todos: Vec) -> Result<()> { for todo in todos { todo.print(); match todo { - Todo::Absolute(dataset, snapshot) => { + todo::Todo::Absolute(dataset, snapshot) => { let handle = local.send_absolute(&dataset, &snapshot)?; remote.receive(handle)?; } - Todo::Incremental(dataset, common_snapshot, recent_snapshot) => { + todo::Todo::Incremental(dataset, common_snapshot, recent_snapshot) => { let handle = local.send_incremental(&dataset, &common_snapshot, &recent_snapshot)?; remote.receive(handle)?; } - Todo::UpToDate(_, _) => (), + todo::Todo::UpToDate(_, _) => (), } } Ok(()) } -fn ask_user_confirmation(todos: &Vec) -> Result { +fn ask_user_confirmation(todos: &Vec) -> Result { println!("Would to the following:"); for todo in todos { @@ -179,70 +180,3 @@ fn verify_running_as_root() -> Result<()> { } Ok(()) } - -enum Todo { - Absolute(Dataset, Snapshot), - Incremental(Dataset, Snapshot, Snapshot), - UpToDate(Dataset, Snapshot), -} - -impl Todo { - fn print(&self) { - match self { - Todo::Absolute(dataset, snapshot) => { - println!(" {dataset}@{snapshot} -> [new]") - } - Todo::Incremental(dataset, last_common_snapshot, recent_snapshot) => { - println!(" {dataset}@{last_common_snapshot} -> ...@{recent_snapshot}") - } - Todo::UpToDate(dataset, snapshot) => { - println!(" {dataset}@{snapshot} is already backed up") - } - } - } - - fn plan( - local: &ZPool, - remote: &ZPool, - snapshot_tag: String, - snapshot_interval: String, - ) -> Result> { - let mut result = vec![]; - - for local_dataset in &local.datasets { - let last_snapshot_with_tag = - local_dataset.find_last_snapshot_with_tag(&snapshot_tag, &snapshot_interval)?; - - let remote_dataset = local_dataset.change_pool_name(remote); - if !remote.contains(&remote_dataset) { - result.push(Todo::Absolute( - local_dataset.clone(), - last_snapshot_with_tag, - )); - continue; - } - - let remote_dataset = remote.get_matching_dataset(local_dataset).unwrap(); - - let last_common_snapshot = Snapshot::find_last_common_snapshot_with_tag( - local_dataset, - &remote_dataset, - &snapshot_tag, - ) - .unwrap(); - - let todo = if last_common_snapshot == last_snapshot_with_tag { - Todo::UpToDate(local_dataset.clone(), last_common_snapshot) - } else { - Todo::Incremental( - local_dataset.clone(), - last_common_snapshot, - last_snapshot_with_tag, - ) - }; - - result.push(todo); - } - Ok(result) - } -} diff --git a/src/todo.rs b/src/todo.rs new file mode 100644 index 0000000..1b429a8 --- /dev/null +++ b/src/todo.rs @@ -0,0 +1,73 @@ +use anyhow::Result; + +use crate::zfs::Snapshot; +use crate::zfs::ZPool; + +use crate::zfs::Dataset; + +pub enum Todo { + Absolute(Dataset, Snapshot), + Incremental(Dataset, Snapshot, Snapshot), + UpToDate(Dataset, Snapshot), +} + +impl Todo { + pub fn print(&self) { + match self { + Todo::Absolute(dataset, snapshot) => { + println!(" {dataset}@{snapshot} -> [new]") + } + Todo::Incremental(dataset, last_common_snapshot, recent_snapshot) => { + println!(" {dataset}@{last_common_snapshot} -> ...@{recent_snapshot}") + } + Todo::UpToDate(dataset, snapshot) => { + println!(" {dataset}@{snapshot} is already backed up") + } + } + } + + pub fn plan( + local: &ZPool, + remote: &ZPool, + snapshot_tag: String, + snapshot_interval: String, + ) -> Result> { + let mut result = vec![]; + + for local_dataset in &local.datasets { + let last_snapshot_with_tag = + local_dataset.find_last_snapshot_with_tag(&snapshot_tag, &snapshot_interval)?; + + let remote_dataset = local_dataset.change_pool_name(remote); + if !remote.contains(&remote_dataset) { + result.push(Todo::Absolute( + local_dataset.clone(), + last_snapshot_with_tag, + )); + continue; + } + + let remote_dataset = remote.get_matching_dataset(local_dataset).unwrap(); + + let last_common_snapshot = Snapshot::find_last_common_snapshot_with_tag( + local_dataset, + &remote_dataset, + &snapshot_tag, + ) + .unwrap(); + + let todo = if last_common_snapshot == last_snapshot_with_tag { + Todo::UpToDate(local_dataset.clone(), last_common_snapshot) + } else { + Todo::Incremental( + local_dataset.clone(), + last_common_snapshot, + last_snapshot_with_tag, + ) + }; + + result.push(todo); + } + Ok(result) + } +}