changeset 3334:9eaead79577c HEAD

Dirty flags weren't being updated correctly. Caused the same messages to be rewritten over and over again, or skipping some messages causing lost flag changes.
author Timo Sirainen <tss@iki.fi>
date Tue, 26 Apr 2005 11:11:37 +0300
parents 4cbb7b67bc98
children ae6f1b54cd59
files src/lib-storage/index/mbox/mbox-sync.c
diffstat 1 files changed, 22 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/mbox/mbox-sync.c	Sat Apr 23 23:21:42 2005 +0300
+++ b/src/lib-storage/index/mbox/mbox-sync.c	Tue Apr 26 11:11:37 2005 +0300
@@ -421,21 +421,34 @@
 		mbox_sync_apply_index_syncs(sync_ctx, &idx_mail,
 					    &keywords_changed);
 
+#define SYNC_FLAGS (MAIL_RECENT | MAIL_INDEX_MAIL_FLAG_DIRTY)
 		if ((idx_mail.flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0) {
 			/* flags are dirty. ignore whatever was in the mbox,
-			   but update recent flag state if needed. */
-			mbox_flags &= MAIL_RECENT;
-			mbox_flags |= idx_mail.flags & ~MAIL_RECENT;
+			   but update recent/dirty flag states if needed. */
+			mbox_flags &= SYNC_FLAGS;
+			mbox_flags |= idx_mail.flags & ~SYNC_FLAGS;
 		} else {
 			/* keep index's internal flags */
-			mbox_flags &= MAIL_FLAGS_MASK;
-			mbox_flags |= idx_mail.flags & ~MAIL_FLAGS_MASK;
+			mbox_flags &= MAIL_FLAGS_MASK | SYNC_FLAGS;
+			mbox_flags |= idx_mail.flags &
+				~(MAIL_FLAGS_MASK | SYNC_FLAGS);
 		}
 
-		if ((idx_mail.flags & ~MAIL_INDEX_MAIL_FLAG_DIRTY) ==
-		    (mbox_flags & ~MAIL_INDEX_MAIL_FLAG_DIRTY)) {
-			/* all flags are same, except possibly dirty flag */
-			if (idx_mail.flags != mbox_flags) {
+		if ((idx_mail.flags & ~SYNC_FLAGS) !=
+		    (mbox_flags & ~SYNC_FLAGS)) {
+			/* flags other than recent/dirty have changed */
+			mail_index_update_flags(sync_ctx->t, sync_ctx->idx_seq,
+						MODIFY_REPLACE, mbox_flags);
+		} else {
+			if (((idx_mail.flags ^ mbox_flags) &
+			     MAIL_RECENT) != 0) {
+				/* drop recent flag (it can only be dropped) */
+				mail_index_update_flags(sync_ctx->t,
+					sync_ctx->idx_seq,
+					MODIFY_REMOVE, MAIL_RECENT);
+			}
+			if (((idx_mail.flags ^ mbox_flags) &
+			     MAIL_INDEX_MAIL_FLAG_DIRTY) != 0) {
 				/* dirty flag state changed */
 				int dirty = (mbox_flags &
 					     MAIL_INDEX_MAIL_FLAG_DIRTY) != 0;
@@ -444,15 +457,6 @@
 					dirty ? MODIFY_ADD : MODIFY_REMOVE,
 					MAIL_INDEX_MAIL_FLAG_DIRTY);
 			}
-		} else if ((idx_mail.flags & ~MAIL_RECENT) !=
-			   (mbox_flags & ~MAIL_RECENT)) {
-			/* flags other than MAIL_RECENT have changed */
-			mail_index_update_flags(sync_ctx->t, sync_ctx->idx_seq,
-						MODIFY_REPLACE, mbox_flags);
-		} else if (((idx_mail.flags ^ mbox_flags) & MAIL_RECENT) != 0) {
-			/* drop recent flag */
-			mail_index_update_flags(sync_ctx->t, sync_ctx->idx_seq,
-						MODIFY_REMOVE, MAIL_RECENT);
 		}
 
 		if ((idx_mail.flags & MAIL_INDEX_MAIL_FLAG_DIRTY) == 0 &&