From deece156487af1d7dbb9d7aa76910f77f73a85bc Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 21 May 2022 13:31:29 +0000 Subject: [PATCH] imap: do not unnecessarily SELECT folder in move_delete_messages() If there are no MOVE/DELETE operations pending, the folder should not be SELECTed. When `only_fetch_mvbox` is enabled, `fetch_new_messages` skips most folders, but `move_delete_messages` always selects the folder even if there are no operations pending. Selecting all folders wastes time during folder scan and turns recent messages into non-recent. --- CHANGELOG.md | 7 +++++++ src/imap.rs | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de37b6566..dfb91790d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## Unreleased + +### Fixes +- do not unnecessarily SELECT folders if there are no operations planned on + them #3333 + + ## 1.83.0 ### Fixes diff --git a/src/imap.rs b/src/imap.rs index b6afedb47..00e4723cc 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -1030,9 +1030,14 @@ impl Imap { .await?; self.prepare(context).await?; - self.select_folder(context, Some(folder)).await?; for (target, rowid_set, uid_set) in UidGrouper::from(rows) { + // Select folder inside the loop to avoid selecting it if there are no pending + // MOVE/DELETE operations. This does not result in multiple SELECT commands + // being sent because `select_folder()` does nothing if the folder is already + // selected. + self.select_folder(context, Some(folder)).await?; + // Empty target folder name means messages should be deleted. if target.is_empty() { self.delete_message_batch(context, &uid_set, rowid_set)