Use latest UID list on COPY/MOVE (#1201)

This commit is contained in:
mdecimus
2025-04-27 20:03:57 +02:00
parent 9477f266a2
commit 1e56161209
2 changed files with 20 additions and 12 deletions

View File

@@ -275,17 +275,21 @@ impl SelectedMailbox {
if !sequence.is_saved_search() {
let mut ids = AHashMap::new();
let state = self.state.lock();
if state.id_to_imap.is_empty() {
return Ok(ids);
}
if is_uid {
for (id, imap_id) in &state.id_to_imap {
if sequence.contains(imap_id.uid, state.uid_max) {
ids.insert(*id, *imap_id);
let id_to_imap = state
.next_state
.as_ref()
.map(|s| &s.next_state.id_to_imap)
.unwrap_or(&state.id_to_imap);
if !state.id_to_imap.is_empty() {
for (id, imap_id) in id_to_imap {
if sequence.contains(imap_id.uid, state.uid_max) {
ids.insert(*id, *imap_id);
}
}
}
} else {
} else if !state.id_to_imap.is_empty() {
for (id, imap_id) in &state.id_to_imap {
if sequence.contains(imap_id.seqnum, state.total_messages as u32) {
ids.insert(*id, *imap_id);

View File

@@ -9,18 +9,18 @@ use std::{sync::Arc, time::Instant};
use directory::Permission;
use email::{
ingest::EmailIngest,
mailbox::{UidMailbox, JUNK_ID},
mailbox::{JUNK_ID, UidMailbox},
};
use imap_proto::{
protocol::copy_move::Arguments, receiver::Request, Command, ResponseCode, ResponseType,
StatusResponse,
Command, ResponseCode, ResponseType, StatusResponse, protocol::copy_move::Arguments,
receiver::Request,
};
use crate::{
core::{SelectedMailbox, Session, SessionData},
spawn_op,
};
use common::{listener::SessionStream, MailboxId};
use common::{MailboxId, listener::SessionStream};
use jmap::email::{bayes::EmailBayesTrain, copy::EmailCopy, set::TagManager};
use jmap_proto::{
error::set::SetErrorType,
@@ -31,7 +31,7 @@ use jmap_proto::{
};
use store::{
roaring::RoaringBitmap,
write::{assert::HashedValue, log::ChangeLogBuilder, BatchBuilder, ValueClass, F_VALUE},
write::{BatchBuilder, F_VALUE, ValueClass, assert::HashedValue, log::ChangeLogBuilder},
};
use super::ImapContext;
@@ -110,6 +110,10 @@ impl<T: SessionStream> SessionData<T> {
is_qresync: bool,
op_start: Instant,
) -> trc::Result<()> {
self.synchronize_messages(&src_mailbox)
.await
.imap_ctx(&arguments.tag, trc::location!())?;
// Convert IMAP ids to JMAP ids.
let ids = src_mailbox
.sequence_to_ids(&arguments.sequence_set, is_uid)