From 5964c7120139d67df482e11e8b921b7cecc1c8db Mon Sep 17 00:00:00 2001 From: Alexander Weiss Date: Tue, 23 Aug 2022 09:33:35 +0200 Subject: [PATCH] backup/parent: Use ctime and mtime; add --ignore options --- src/archiver/parent.rs | 19 ++++++++++++++++--- src/commands/backup.rs | 10 +++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/archiver/parent.rs b/src/archiver/parent.rs index 098428d..1e06fd0 100644 --- a/src/archiver/parent.rs +++ b/src/archiver/parent.rs @@ -10,6 +10,8 @@ pub struct Parent { tree: Option, be: BE, node_idx: usize, + ignore_ctime: bool, + ignore_inode: bool, } pub enum ParentResult { @@ -19,7 +21,7 @@ pub enum ParentResult { } impl Parent { - pub async fn new(be: &BE, tree_id: Option) -> Self { + pub async fn new(be: &BE, tree_id: Option, ignore_ctime: bool, ignore_inode: bool) -> Self { // if tree_id is given, load tree from backend. Turn errors into None. // TODO: print warning when loading failed let tree = match tree_id { @@ -30,6 +32,8 @@ impl Parent { tree, be: be.clone(), node_idx: 0, + ignore_ctime, + ignore_inode, } } @@ -58,13 +62,20 @@ impl Parent { } pub fn is_parent(&mut self, node: &Node) -> ParentResult<&Node> { + // use new variables as the mutable borrow is used later + let ignore_ctime = self.ignore_ctime; + let ignore_inode = self.ignore_inode; + match self.p_node(node) { None => ParentResult::NotFound, Some(p_node) => { if p_node.node_type == node.node_type && p_node.meta.size == node.meta.size - && p_node.meta().ctime == node.meta.ctime - && (node.meta.inode == 0 || p_node.meta.inode == node.meta.inode) + && p_node.meta.mtime == node.meta.mtime + && (ignore_ctime || p_node.meta.ctime == node.meta.ctime) + && (ignore_inode + || p_node.meta.inode == 0 + || p_node.meta.inode == node.meta.inode) { ParentResult::Matched(p_node) } else { @@ -91,6 +102,8 @@ impl Parent { tree, be: self.be.clone(), node_idx: 0, + ignore_ctime: self.ignore_ctime, + ignore_inode: self.ignore_inode, }) } } diff --git a/src/commands/backup.rs b/src/commands/backup.rs index eef0d0a..eb2e5c3 100644 --- a/src/commands/backup.rs +++ b/src/commands/backup.rs @@ -31,6 +31,14 @@ pub(super) struct Opts { #[clap(long, short, conflicts_with = "parent")] force: bool, + /// Ignore ctime changes when checking for modified files + #[clap(long, conflicts_with = "force")] + ignore_ctime: bool, + + /// Ignore inode number changes when checking for modified files + #[clap(long, conflicts_with = "force")] + ignore_inode: bool, + /// Tags to add to backup (can be specified multiple times) #[clap(long, value_name = "TAG[,TAG,..]")] tag: Vec, @@ -119,7 +127,7 @@ pub(super) async fn execute( let index = IndexBackend::only_full_trees(&be, progress_counter()).await?; - let parent = Parent::new(&index, parent_tree).await; + let parent = Parent::new(&index, parent_tree, opts.ignore_ctime, opts.ignore_inode).await; let src = LocalSource::new(opts.ignore_opts, backup_path.to_path_buf())?;