From 945614775dc245692e0130bc43c5872f3f5ef2d9 Mon Sep 17 00:00:00 2001 From: aawsome <37850842+aawsome@users.noreply.github.com> Date: Mon, 23 Dec 2024 03:17:59 +0100 Subject: [PATCH] feat(commands): Add delete_unchanged option to forget (#386) --- crates/core/src/commands/forget.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/crates/core/src/commands/forget.rs b/crates/core/src/commands/forget.rs index 0e722fff..39a1b0d9 100644 --- a/crates/core/src/commands/forget.rs +++ b/crates/core/src/commands/forget.rs @@ -253,6 +253,12 @@ pub struct KeepOptions { #[cfg_attr(feature = "merge", merge(strategy=conflate::bool::overwrite_false))] #[serde(skip_serializing_if = "std::ops::Not::not")] pub keep_none: bool, + + /// Delete unchanged follow-up snapshots (i.e. with identical tree) + #[cfg_attr(feature = "clap", clap(long))] + #[cfg_attr(feature = "merge", merge(strategy=conflate::bool::overwrite_false))] + #[serde(skip_serializing_if = "std::ops::Not::not")] + pub delete_unchanged: bool, } /// Always return false @@ -589,6 +595,10 @@ impl KeepOptions { (true, vec!["snapshot"]) } else if sn.must_delete(now) { (false, vec!["snapshot"]) + } else if self.delete_unchanged + && iter.peek().is_some_and(|sn_next| sn_next.tree == sn.tree) + { + (false, vec!["unchanged"]) } else { let reasons = group_keep.matches(&sn, last.as_ref(), iter.peek().is_some(), latest_time);