Mercurial > dovecot > original-hg > dovecot-1.2
changeset 9067:e7792f4509e6 HEAD
Maildir: Make sure messages are removed from index if they are deleted externally from new/.
The problem happened when a message in new/ was indexed, deleted externally
and the mailbox was again opened as read-only. This caused a partial sync
in new/ directory, which didn't notice that the files were gone.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 20 May 2009 17:47:49 -0400 |
parents | a31fb9b7179a |
children | 0fdffcb66945 |
files | src/lib-storage/index/maildir/maildir-sync.c |
diffstat | 1 files changed, 13 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-sync.c Wed May 20 14:04:25 2009 -0400 +++ b/src/lib-storage/index/maildir/maildir-sync.c Wed May 20 17:47:49 2009 -0400 @@ -643,13 +643,10 @@ } } -static bool move_recent_messages(struct maildir_sync_context *ctx) +static bool have_recent_messages(struct maildir_sync_context *ctx) { const struct mail_index_header *hdr; - if (ctx->mbox->ibox.keep_recent) - return FALSE; - (void)maildir_uidlist_refresh(ctx->mbox->uidlist); /* if there are files in new/, we'll need to move them. we'll check @@ -673,9 +670,18 @@ if (*new_changed_r || *cur_changed_r) return 1; - if (move_recent_messages(ctx)) { - *new_changed_r = TRUE; - return 1; + if (have_recent_messages(ctx)) { + if (!ctx->mbox->ibox.keep_recent) { + *new_changed_r = TRUE; + return 1; + } else if (*new_changed_r) { + /* we have some recent messages and new/ has changed. + if messages had been externally deleted from new/, + we need to get them out of index. this requires that + we make sure they weren't just moved to cur/. */ + *cur_changed_r = TRUE; + return 1; + } } if (!ctx->mbox->ibox.keep_recent)