diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index e3186a652..135ab90ff 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -348,6 +348,7 @@ impl MailBackend for ImapType { let f = &state.uid_store.mailboxes.lock().await[&mailbox_hash]; f.exists.lock().unwrap().clear(); f.unseen.lock().unwrap().clear(); + f.set_warm(true); if f.no_select { yield vec![]; return; diff --git a/melib/src/backends/imap/mailbox.rs b/melib/src/backends/imap/mailbox.rs index 7461e8142..baa918ca7 100644 --- a/melib/src/backends/imap/mailbox.rs +++ b/melib/src/backends/imap/mailbox.rs @@ -43,12 +43,31 @@ pub struct ImapMailbox { pub permissions: Arc>, pub exists: Arc>, pub unseen: Arc>, + pub warm: Arc>, } impl ImapMailbox { pub fn imap_path(&self) -> &str { &self.imap_path } + + /// Establish that mailbox contents have been fetched at least once during this execution + #[inline(always)] + pub fn set_warm(&self, new_value: bool) { + *self.warm.lock().unwrap() = new_value; + } + + /// Mailbox contents have been fetched at least once during this execution + #[inline(always)] + pub fn is_warm(&self) -> bool { + *self.warm.lock().unwrap() + } + + /// Mailbox contents have not been fetched at all during this execution + #[inline(always)] + pub fn is_cold(&self) -> bool { + !self.is_warm() + } } impl BackendMailbox for ImapMailbox { diff --git a/melib/src/backends/imap/watch.rs b/melib/src/backends/imap/watch.rs index b521970d5..fe7cd87c1 100644 --- a/melib/src/backends/imap/watch.rs +++ b/melib/src/backends/imap/watch.rs @@ -244,6 +244,20 @@ pub async fn examine_updates( uidvalidities.insert(mailbox_hash, select_response.uidvalidity); } } + if mailbox.is_cold() { + /* Mailbox hasn't been loaded yet */ + if let Ok(mut exists_lck) = mailbox.exists.lock() { + exists_lck.clear(); + exists_lck.set_not_yet_seen(select_response.exists); + } + if let Ok(mut unseen_lck) = mailbox.unseen.lock() { + unseen_lck.clear(); + unseen_lck.set_not_yet_seen(select_response.unseen); + } + mailbox.set_warm(true); + return Ok(()); + } + if debug!(select_response.recent > 0) { /* UID SEARCH RECENT */ conn.send_command(b"UID SEARCH RECENT").await?;