diff --git a/rslib/src/decks/name.rs b/rslib/src/decks/name.rs index fa22f6a50..2f8a30086 100644 --- a/rslib/src/decks/name.rs +++ b/rslib/src/decks/name.rs @@ -82,10 +82,6 @@ impl NativeDeckName { .chain(self.components().skip(old_parent.components().count())) .join("\x1f") } - - pub(crate) fn immediate_parent_name(&self) -> Option<&str> { - immediate_parent_name(self.as_native_str()) - } } impl std::fmt::Display for NativeDeckName { diff --git a/rslib/src/import_export/gather.rs b/rslib/src/import_export/gather.rs index a7ee4e2d5..2634751b5 100644 --- a/rslib/src/import_export/gather.rs +++ b/rslib/src/import_export/gather.rs @@ -9,7 +9,7 @@ use std::{ use itertools::Itertools; use crate::{ - decks::NormalDeck, + decks::{immediate_parent_name, NormalDeck}, io::filename_is_safe, latex::extract_latex, prelude::*, @@ -172,23 +172,36 @@ impl Collection { } fn get_parent_decks(&mut self, decks: &[Deck]) -> Result> { - let mut parent_names: HashSet<&str> = - decks.iter().map(|deck| deck.name.as_native_str()).collect(); + let mut parent_names: HashSet = decks + .iter() + .map(|deck| deck.name.as_native_str().to_owned()) + .collect(); let mut parents = Vec::new(); for deck in decks { - while let Some(parent_name) = deck.name.immediate_parent_name() { - if parent_names.insert(parent_name) { - parents.push( - self.storage - .get_deck_by_name(parent_name)? - .ok_or(AnkiError::DatabaseCheckRequired)?, - ) - } - } + self.add_parent_decks(deck.name.as_native_str(), &mut parent_names, &mut parents)?; } Ok(parents) } + fn add_parent_decks( + &mut self, + name: &str, + parent_names: &mut HashSet, + parents: &mut Vec, + ) -> Result<()> { + if let Some(parent_name) = immediate_parent_name(name) { + if parent_names.insert(parent_name.to_owned()) { + parents.push( + self.storage + .get_deck_by_name(parent_name)? + .ok_or(AnkiError::DatabaseCheckRequired)?, + ); + self.add_parent_decks(parent_name, parent_names, parents)?; + } + } + Ok(()) + } + fn gather_notetypes(&mut self) -> Result> { self.storage.get_notetypes_for_search_notes() } diff --git a/rslib/src/import_export/package/apkg/import/mod.rs b/rslib/src/import_export/package/apkg/import/mod.rs index bb2cb2622..d63641fdb 100644 --- a/rslib/src/import_export/package/apkg/import/mod.rs +++ b/rslib/src/import_export/package/apkg/import/mod.rs @@ -67,10 +67,7 @@ impl ExchangeData { search: impl TryIntoSearch, with_scheduling: bool, ) -> Result { - let mut zip_file = archive.by_name(Meta::new_legacy().collection_filename())?; - let mut tempfile = NamedTempFile::new()?; - io::copy(&mut zip_file, &mut tempfile)?; - + let tempfile = collection_to_tempfile(archive)?; let mut col = CollectionBuilder::new(tempfile.path()).build()?; col.maybe_upgrade_scheduler()?; @@ -81,6 +78,13 @@ impl ExchangeData { } } +fn collection_to_tempfile(archive: &mut ZipArchive) -> Result { + let mut zip_file = archive.by_name(Meta::new_legacy().collection_filename())?; + let mut tempfile = NamedTempFile::new()?; + io::copy(&mut zip_file, &mut tempfile)?; + Ok(tempfile) +} + impl Collection { fn maybe_upgrade_scheduler(&mut self) -> Result<()> { if self.scheduling_included()? {