Skip to content

Commit 1e56161

Browse files
committed
Use latest UID list on COPY/MOVE (#1201)
1 parent 9477f26 commit 1e56161

2 files changed

Lines changed: 20 additions & 12 deletions

File tree

crates/imap/src/core/message.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -275,17 +275,21 @@ impl SelectedMailbox {
275275
if !sequence.is_saved_search() {
276276
let mut ids = AHashMap::new();
277277
let state = self.state.lock();
278-
if state.id_to_imap.is_empty() {
279-
return Ok(ids);
280-
}
281278

282279
if is_uid {
283-
for (id, imap_id) in &state.id_to_imap {
284-
if sequence.contains(imap_id.uid, state.uid_max) {
285-
ids.insert(*id, *imap_id);
280+
let id_to_imap = state
281+
.next_state
282+
.as_ref()
283+
.map(|s| &s.next_state.id_to_imap)
284+
.unwrap_or(&state.id_to_imap);
285+
if !state.id_to_imap.is_empty() {
286+
for (id, imap_id) in id_to_imap {
287+
if sequence.contains(imap_id.uid, state.uid_max) {
288+
ids.insert(*id, *imap_id);
289+
}
286290
}
287291
}
288-
} else {
292+
} else if !state.id_to_imap.is_empty() {
289293
for (id, imap_id) in &state.id_to_imap {
290294
if sequence.contains(imap_id.seqnum, state.total_messages as u32) {
291295
ids.insert(*id, *imap_id);

crates/imap/src/op/copy_move.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@ use std::{sync::Arc, time::Instant};
99
use directory::Permission;
1010
use email::{
1111
ingest::EmailIngest,
12-
mailbox::{UidMailbox, JUNK_ID},
12+
mailbox::{JUNK_ID, UidMailbox},
1313
};
1414
use imap_proto::{
15-
protocol::copy_move::Arguments, receiver::Request, Command, ResponseCode, ResponseType,
16-
StatusResponse,
15+
Command, ResponseCode, ResponseType, StatusResponse, protocol::copy_move::Arguments,
16+
receiver::Request,
1717
};
1818

1919
use crate::{
2020
core::{SelectedMailbox, Session, SessionData},
2121
spawn_op,
2222
};
23-
use common::{listener::SessionStream, MailboxId};
23+
use common::{MailboxId, listener::SessionStream};
2424
use jmap::email::{bayes::EmailBayesTrain, copy::EmailCopy, set::TagManager};
2525
use jmap_proto::{
2626
error::set::SetErrorType,
@@ -31,7 +31,7 @@ use jmap_proto::{
3131
};
3232
use store::{
3333
roaring::RoaringBitmap,
34-
write::{assert::HashedValue, log::ChangeLogBuilder, BatchBuilder, ValueClass, F_VALUE},
34+
write::{BatchBuilder, F_VALUE, ValueClass, assert::HashedValue, log::ChangeLogBuilder},
3535
};
3636

3737
use super::ImapContext;
@@ -110,6 +110,10 @@ impl<T: SessionStream> SessionData<T> {
110110
is_qresync: bool,
111111
op_start: Instant,
112112
) -> trc::Result<()> {
113+
self.synchronize_messages(&src_mailbox)
114+
.await
115+
.imap_ctx(&arguments.tag, trc::location!())?;
116+
113117
// Convert IMAP ids to JMAP ids.
114118
let ids = src_mailbox
115119
.sequence_to_ids(&arguments.sequence_set, is_uid)

0 commit comments

Comments
 (0)