From 41d0b94dcd2b4208e5d3e7483c88ce9b664ce565 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Wed, 19 Aug 2026 11:10:51 +0200 Subject: fix(worker): give a moved message a fresh maildir name mbsync's manual, under "the more efficient default UID mapping scheme": "it is important that the MUA renames files when moving them between Maildir folders", and "the general expectation is that a completely new filename is generated as if the message was new". qtmaildir is that MUA and did not rename. moveMessages() kept QFileInfo(from).fileName() verbatim, `,U=` included. That infix is mbsync's per-folder IMAP UID, so carrying it across a folder boundary makes it a claim about a folder the file is no longer in; moving a message out and back then reinserts a UID the server has since reassigned. Reported by the user as `Maildir error: duplicate UID 1`, and measured on the real Maildir: four collisions in one folder, eight distinct messages, none lost. freshMaildirName() regenerates the unique part and keeps ONLY the `:2,` suffix. Keeping the flags is not a contradiction of "as if the message was new": they record seen, flagged and replied, and maildir.synchronize_flags is true, so dropping them would mark every deleted message unread and lose Important on the way to the trash. Two things fell out of the change and both were defects waiting to happen. The already-in-the-destination guard compared full PATHS, which worked only because the name was carried across; with a fresh name it can never be true, so a message already in the destination would be renamed on every move. It compares directories now. And test_mainwindow's folderHasMessageFile() matched on the filename stem, so all fifty-odd assertions using it began reporting "the file is not there" about files that were there. It reads the Message-ID out of each file instead, which is what those assertions always meant. Three mutations fail: the old name carried across, the flags dropped, and the uniqueness counter frozen so two messages moved in one batch collide. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'CHANGELOG.md') diff --git a/CHANGELOG.md b/CHANGELOG.md index d17b46c..8ddbe50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,28 @@ point at which they are stable. ## [Unreleased] +### Fixed + +- Moving a message between folders now gives its file a fresh Maildir name. + 0.26.0 carried the old name across, including mbsync's `,U=` UID infix, + which belongs to the folder the file came from. Moving a message out and + back reinserted a UID the server had since reassigned, and mbsync refused + the folder with `Maildir error: duplicate UID`. If you saw that error, see + Upgrading below. + +### Upgrading + +If a sync reported `Maildir error: duplicate UID in ` after +deleting or restoring mail with 0.26.0, that folder holds two files claiming +one UID. No mail is lost; mbsync simply refuses to sync the folder until it is +resolved. Stop any running sync, then strip the `,U=` infix from the newer +of each pair and reindex: + + notmuch new + +mbsync re-derives the UID on the next sync. The code no longer creates this +state. + ### Added - The message pane's right-click menu offers **Select all**. Chromium's own menu -- cgit v1.2.3