changeset 10371:b99a19d5a93c HEAD

dsync: Sync mailbox renames.
author Timo Sirainen <tss@iki.fi>
date Thu, 19 Nov 2009 14:19:39 -0500
parents ce18bbd3e964
children 0b101a864534
files src/dsync/dsync-brain-private.h src/dsync/dsync-brain.c
diffstat 2 files changed, 34 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/dsync/dsync-brain-private.h	Wed Nov 18 23:13:08 2009 -0500
+++ b/src/dsync/dsync-brain-private.h	Thu Nov 19 14:19:39 2009 -0500
@@ -12,7 +12,7 @@
 	DSYNC_STATE_SYNC_MSGS,
 	DSYNC_STATE_SYNC_MSGS_FLUSH,
 	DSYNC_STATE_SYNC_MSGS_FLUSH2,
-	DSYNC_STATE_SYNC_UPDATE_MAILBOX,
+	DSYNC_STATE_SYNC_UPDATE_MAILBOXES,
 	DSYNC_STATE_SYNC_FLUSH,
 	DSYNC_STATE_SYNC_FLUSH2,
 	DSYNC_STATE_SYNC_END
--- a/src/dsync/dsync-brain.c	Wed Nov 18 23:13:08 2009 -0500
+++ b/src/dsync/dsync-brain.c	Thu Nov 19 14:19:39 2009 -0500
@@ -416,6 +416,15 @@
 	return FALSE;
 }
 
+static bool dsync_mailbox_has_changes(struct dsync_brain *brain,
+				      const struct dsync_mailbox *box1,
+				      const struct dsync_mailbox *box2)
+{
+	if (strcmp(box1->name, box2->name) != 0)
+		return TRUE;
+	return dsync_mailbox_has_changed_msgs(brain, box1, box2);
+}
+
 static void
 dsync_brain_get_changed_mailboxes(struct dsync_brain *brain,
 				  ARRAY_TYPE(dsync_brain_mailbox) *brain_boxes,
@@ -439,9 +448,8 @@
 		ret = dsync_mailbox_guid_cmp(src_boxes[src], dest_boxes[dest]);
 		if (ret == 0) {
 			if ((full_sync ||
-			     dsync_mailbox_has_changed_msgs(brain,
-							    src_boxes[src],
-							    dest_boxes[dest])) &&
+			     dsync_mailbox_has_changes(brain, src_boxes[src],
+						       dest_boxes[dest])) &&
 			    !src_deleted && !dest_deleted) {
 				brain_box = array_append_space(brain_boxes);
 				brain_box->box = *src_boxes[src];
@@ -521,11 +529,30 @@
 }
 
 static void
-dsync_brain_msg_sync_update_mailbox(struct dsync_brain *brain)
+dsync_brain_sync_rename_mailbox(struct dsync_brain *brain,
+				const struct dsync_brain_mailbox *mailbox)
+{
+	if (mailbox->src->last_renamed > mailbox->dest->last_renamed) {
+		dsync_worker_rename_mailbox(brain->dest_worker,
+					    &mailbox->box.mailbox_guid,
+					    mailbox->src->name);
+	} else {
+		dsync_worker_rename_mailbox(brain->src_worker,
+					    &mailbox->box.mailbox_guid,
+					    mailbox->dest->name);
+	}
+}
+
+static void
+dsync_brain_sync_update_mailboxes(struct dsync_brain *brain)
 {
 	const struct dsync_brain_mailbox *mailbox;
 
 	array_foreach(&brain->mailbox_sync->mailboxes, mailbox) {
+		if (mailbox->src != NULL && mailbox->dest != NULL &&
+		    strcmp(mailbox->src->name, mailbox->dest->name) != 0)
+			dsync_brain_sync_rename_mailbox(brain, mailbox);
+
 		dsync_worker_update_mailbox(brain->src_worker, &mailbox->box);
 		dsync_worker_update_mailbox(brain->dest_worker, &mailbox->box);
 	}
@@ -584,8 +611,8 @@
 		break;
 	case DSYNC_STATE_SYNC_MSGS_FLUSH2:
 		break;
-	case DSYNC_STATE_SYNC_UPDATE_MAILBOX:
-		dsync_brain_msg_sync_update_mailbox(brain);
+	case DSYNC_STATE_SYNC_UPDATE_MAILBOXES:
+		dsync_brain_sync_update_mailboxes(brain);
 		brain->state++;
 		/* fall through */
 	case DSYNC_STATE_SYNC_FLUSH: