diff options
author | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2019-09-20 09:22:11 +0300 |
---|---|---|
committer | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2019-09-20 10:26:08 +0300 |
commit | 93de60b6d1bbc0695e918d04e8dc949cb773a7d9 (patch) | |
tree | f2bba2413466fad14592e5fd6d5fb2b68fca2885 | |
parent | fb7b038ee1ab9b8b762890190a88eb324ecc92f8 (diff) |
maildir: allow Maildir stores as root_folder
Allow top level directories that are not valid maildir folders but
include maildir folders as root_folder of an account.
-rw-r--r-- | melib/src/backends/maildir/backend.rs | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/melib/src/backends/maildir/backend.rs b/melib/src/backends/maildir/backend.rs index f010c70c..a3004f57 100644 --- a/melib/src/backends/maildir/backend.rs +++ b/melib/src/backends/maildir/backend.rs @@ -37,7 +37,7 @@ use std::sync::mpsc::channel; //use std::sync::mpsc::sync_channel; //use std::sync::mpsc::SyncSender; //use std::time::Duration; -use fnv::{FnvHashMap, FnvHasher}; +use fnv::{FnvHashMap, FnvHashSet, FnvHasher}; use std::collections::hash_map::DefaultHasher; use std::ffi::OsStr; use std::fs; @@ -600,21 +600,14 @@ impl MaildirType { std::process::exit(1); } - match MaildirFolder::new( + if let Ok(f) = MaildirFolder::new( root_path.to_str().unwrap().to_string(), root_path.file_name().unwrap().to_str().unwrap().to_string(), None, Vec::with_capacity(0), settings, ) { - Ok(f) => { - folders.insert(f.hash, f); - } - Err(e) => { - eprint!("{}: ", settings.name()); - eprintln!("{}", e.to_string()); - std::process::exit(1); - } + folders.insert(f.hash, f); } if folders.is_empty() { @@ -633,6 +626,10 @@ impl MaildirType { folders.get_mut(&root_hash).map(|f| f.children = children); } folders.retain(|_, f| is_subscribed(f.path())); + let keys = folders.keys().cloned().collect::<FnvHashSet<FolderHash>>(); + for f in folders.values_mut() { + f.children.retain(|c| keys.contains(c)); + } let hash_indexes = Arc::new(Mutex::new(FnvHashMap::with_capacity_and_hasher( folders.len(), |