From 8b08827bdc19412e17edd1fd321c05dc11373f88 Mon Sep 17 00:00:00 2001 From: Alexander Weiss Date: Sun, 4 Jan 2026 23:05:10 +0100 Subject: [PATCH] fix: Use parents instead of parent; allow latest --- crates/core/src/commands/backup.rs | 21 ++++++++++++--------- crates/core/tests/integration/backup.rs | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/crates/core/src/commands/backup.rs b/crates/core/src/commands/backup.rs index eb6d31f15..7d2b5ef9d 100644 --- a/crates/core/src/commands/backup.rs +++ b/crates/core/src/commands/backup.rs @@ -47,13 +47,13 @@ pub struct ParentOptions { #[cfg_attr(feature = "merge", merge(strategy = conflate::option::overwrite_none))] pub group_by: Option, - /// Snapshot to use as parent + /// Snapshot to use as parent (can be specified multiple times; default: latest) #[cfg_attr( feature = "clap", - clap(long, value_name = "SNAPSHOT", conflicts_with = "force",) + clap(long = "parent", value_name = "SNAPSHOT", conflicts_with = "force",) )] #[cfg_attr(feature = "merge", merge(strategy = conflate::vec::append))] - pub parent: Vec, + pub parents: Vec, /// Skip writing of snapshot if nothing changed w.r.t. the parent snapshot. #[cfg_attr(feature = "clap", clap(long))] @@ -99,11 +99,11 @@ impl ParentOptions { snap: &SnapshotFile, backup_stdin: bool, ) -> (Vec, Parent) { + let group = SnapshotGroup::from_snapshot(snap, self.group_by.unwrap_or_default()); let parent = if backup_stdin || self.force { Vec::new() - } else if self.parent.is_empty() { + } else if self.parents.is_empty() { // get suitable snapshot group from snapshot and opts.group_by. This is used to filter snapshots for the parent detection - let group = SnapshotGroup::from_snapshot(snap, self.group_by.unwrap_or_default()); SnapshotFile::latest( repo.dbe(), |snap| snap.has_group(&group), @@ -113,10 +113,13 @@ impl ParentOptions { .into_iter() .collect() } else { - self.parent - .iter() - .filter_map(|parent| SnapshotFile::from_id(repo.dbe(), parent).ok()) - .collect() + SnapshotFile::from_strs( + repo.dbe(), + &self.parents, + |snap| snap.has_group(&group), + &repo.pb.progress_counter(""), + ) + .unwrap_or_default() }; let (parent_trees, parent_ids): (Vec<_>, _) = parent diff --git a/crates/core/tests/integration/backup.rs b/crates/core/tests/integration/backup.rs index 5c6b116c7..dbf7673e9 100644 --- a/crates/core/tests/integration/backup.rs +++ b/crates/core/tests/integration/backup.rs @@ -88,7 +88,7 @@ fn test_backup_with_tar_gz_passes( .tags([StringList::from_str("a,b")?]) .to_snapshot()?; let opts = - opts.parent_opts(ParentOptions::default().parent(vec![second_snapshot.id.to_string()])); + opts.parent_opts(ParentOptions::default().parents(vec![second_snapshot.id.to_string()])); let third_snapshot = repo.backup(&opts, paths, snap)?; insta_snapshotfile_redaction.bind(|| {