Skip to content

Commit 003d178

Browse files
committed
fix: do not miss new messages while expunging the folder
This should fix flaky `test_verified_group_vs_delete_server_after`.
1 parent 90c3087 commit 003d178

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

src/imap.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::contact::{Contact, ContactId, Modifier, Origin};
3232
use crate::context::Context;
3333
use crate::events::EventType;
3434
use crate::headerdef::{HeaderDef, HeaderDefMap};
35+
use crate::imap::select_folder::NewlySelected;
3536
use crate::login_param::{CertificateChecks, LoginParam, ServerLoginParam};
3637
use crate::message::{self, Message, MessageState, MessengerMessage, MsgId, Viewtype};
3738
use crate::mimeparser;
@@ -548,10 +549,11 @@ impl Imap {
548549
.await
549550
.with_context(|| format!("Failed to select folder {folder:?}"))?;
550551

551-
if !new_emails && !fetch_existing_msgs {
552+
if !session.should_fetch && !new_emails && !fetch_existing_msgs {
552553
info!(context, "No new emails in folder {folder:?}.");
553554
return Ok(false);
554555
}
556+
session.should_fetch = false;
555557

556558
let uid_validity = get_uidvalidity(context, folder).await?;
557559
let old_uid_next = get_uid_next(context, folder).await?;
@@ -1131,9 +1133,18 @@ impl Session {
11311133
return Ok(());
11321134
}
11331135

1134-
self.select_folder(context, folder)
1136+
if self
1137+
.select_folder(context, folder)
11351138
.await
1136-
.context("failed to select folder")?;
1139+
.context("failed to select folder")?
1140+
== NewlySelected::Yes
1141+
{
1142+
info!(
1143+
context,
1144+
"Folder {folder} was unselected before, should fetch."
1145+
);
1146+
self.should_fetch = true;
1147+
}
11371148

11381149
let mailbox = self
11391150
.selected_mailbox

src/imap/idle.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ impl Session {
3131

3232
self.select_folder(context, folder).await?;
3333

34-
if self.server_sent_unsolicited_exists(context)? {
34+
if self.server_sent_unsolicited_exists(context)? || self.should_fetch {
35+
self.should_fetch = false;
3536
return Ok(self);
3637
}
3738

src/imap/session.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ pub(crate) struct Session {
4040
pub selected_mailbox: Option<Mailbox>,
4141

4242
pub selected_folder_needs_expunge: bool,
43+
44+
/// Flag that is set to `true`
45+
/// when we select a folder and detect that it has new messages.
46+
pub should_fetch: bool,
4347
}
4448

4549
impl Deref for Session {
@@ -67,6 +71,7 @@ impl Session {
6771
selected_folder: None,
6872
selected_mailbox: None,
6973
selected_folder_needs_expunge: false,
74+
should_fetch: false,
7075
}
7176
}
7277

0 commit comments

Comments
 (0)