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)