mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 16:56:36 -04:00
Fix parent deck gathering
This commit is contained in:
parent
f0cc027db6
commit
7af0b08375
3 changed files with 33 additions and 20 deletions
|
@ -82,10 +82,6 @@ impl NativeDeckName {
|
||||||
.chain(self.components().skip(old_parent.components().count()))
|
.chain(self.components().skip(old_parent.components().count()))
|
||||||
.join("\x1f")
|
.join("\x1f")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn immediate_parent_name(&self) -> Option<&str> {
|
|
||||||
immediate_parent_name(self.as_native_str())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for NativeDeckName {
|
impl std::fmt::Display for NativeDeckName {
|
||||||
|
|
|
@ -9,7 +9,7 @@ use std::{
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
decks::NormalDeck,
|
decks::{immediate_parent_name, NormalDeck},
|
||||||
io::filename_is_safe,
|
io::filename_is_safe,
|
||||||
latex::extract_latex,
|
latex::extract_latex,
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
@ -172,23 +172,36 @@ impl Collection {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_parent_decks(&mut self, decks: &[Deck]) -> Result<Vec<Deck>> {
|
fn get_parent_decks(&mut self, decks: &[Deck]) -> Result<Vec<Deck>> {
|
||||||
let mut parent_names: HashSet<&str> =
|
let mut parent_names: HashSet<String> = decks
|
||||||
decks.iter().map(|deck| deck.name.as_native_str()).collect();
|
.iter()
|
||||||
|
.map(|deck| deck.name.as_native_str().to_owned())
|
||||||
|
.collect();
|
||||||
let mut parents = Vec::new();
|
let mut parents = Vec::new();
|
||||||
for deck in decks {
|
for deck in decks {
|
||||||
while let Some(parent_name) = deck.name.immediate_parent_name() {
|
self.add_parent_decks(deck.name.as_native_str(), &mut parent_names, &mut parents)?;
|
||||||
if parent_names.insert(parent_name) {
|
|
||||||
parents.push(
|
|
||||||
self.storage
|
|
||||||
.get_deck_by_name(parent_name)?
|
|
||||||
.ok_or(AnkiError::DatabaseCheckRequired)?,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Ok(parents)
|
Ok(parents)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn add_parent_decks(
|
||||||
|
&mut self,
|
||||||
|
name: &str,
|
||||||
|
parent_names: &mut HashSet<String>,
|
||||||
|
parents: &mut Vec<Deck>,
|
||||||
|
) -> 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<Vec<Notetype>> {
|
fn gather_notetypes(&mut self) -> Result<Vec<Notetype>> {
|
||||||
self.storage.get_notetypes_for_search_notes()
|
self.storage.get_notetypes_for_search_notes()
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,10 +67,7 @@ impl ExchangeData {
|
||||||
search: impl TryIntoSearch,
|
search: impl TryIntoSearch,
|
||||||
with_scheduling: bool,
|
with_scheduling: bool,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let mut zip_file = archive.by_name(Meta::new_legacy().collection_filename())?;
|
let tempfile = collection_to_tempfile(archive)?;
|
||||||
let mut tempfile = NamedTempFile::new()?;
|
|
||||||
io::copy(&mut zip_file, &mut tempfile)?;
|
|
||||||
|
|
||||||
let mut col = CollectionBuilder::new(tempfile.path()).build()?;
|
let mut col = CollectionBuilder::new(tempfile.path()).build()?;
|
||||||
col.maybe_upgrade_scheduler()?;
|
col.maybe_upgrade_scheduler()?;
|
||||||
|
|
||||||
|
@ -81,6 +78,13 @@ impl ExchangeData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn collection_to_tempfile(archive: &mut ZipArchive<File>) -> Result<NamedTempFile> {
|
||||||
|
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 {
|
impl Collection {
|
||||||
fn maybe_upgrade_scheduler(&mut self) -> Result<()> {
|
fn maybe_upgrade_scheduler(&mut self) -> Result<()> {
|
||||||
if self.scheduling_included()? {
|
if self.scheduling_included()? {
|
||||||
|
|
Loading…
Reference in a new issue