dovecot-2.2: imapc: Added imapc_features=gmail-labels-keyword

dovecot at dovecot.org dovecot at dovecot.org
Tue Jan 20 02:31:46 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/c18b2ffeb882
changeset: 18182:c18b2ffeb882
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jan 20 04:30:27 2015 +0200
description:
imapc: Added imapc_features=gmail-labels-keyword
This is a bit kludgy feature mainly intended for migrations from GMail.
Unfortunately I couldn't figure out any nicer way to do this for now.
GMail's "All Mail" folder contains all messages in all folders, but it also
contains some messages that don't exist in other folders. For migrations we
want to copy only those messages that don't exist elsewhere. This can now be
achieved with something like:

doveadm -o imapc_features='gmail-labels-keyword ...' \
  backup -F '-$GmailHaveLabels' mdbox:~/mdbox

Note that dsync can't handle inserting mails into folders, so if doveadm
backup is already run once and one of the existing mails loses all labels,
doveadm backup will delete the whole folder and start again.

diffstat:

 src/lib-storage/index/imapc/imapc-mailbox.c  |  16 +++++++++++++++-
 src/lib-storage/index/imapc/imapc-settings.c |   1 +
 src/lib-storage/index/imapc/imapc-settings.h |   7 ++++---
 src/lib-storage/index/imapc/imapc-sync.c     |  14 +++++++++++---
 4 files changed, 31 insertions(+), 7 deletions(-)

diffs (99 lines):

diff -r 35e4a6ae8d85 -r c18b2ffeb882 src/lib-storage/index/imapc/imapc-mailbox.c
--- a/src/lib-storage/index/imapc/imapc-mailbox.c	Tue Jan 20 04:07:09 2015 +0200
+++ b/src/lib-storage/index/imapc/imapc-mailbox.c	Tue Jan 20 04:30:27 2015 +0200
@@ -263,7 +263,7 @@
 	uint32_t fetch_uid, uid;
 	unsigned int i, j;
 	ARRAY_TYPE(const_string) keywords = ARRAY_INIT;
-	bool seen_flags = FALSE;
+	bool seen_flags = FALSE, have_labels = FALSE;
 
 	if (mbox == NULL || rseq == 0 || !imap_arg_get_list(reply->args, &list))
 		return;
@@ -293,6 +293,12 @@
 					array_append(&keywords, &atom, 1);
 				}
 			}
+		} else if (strcasecmp(atom, "X-GM-LABELS") == 0 &&
+			   IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_GMAIL_LABELS_KEYWORD)) {
+			if (!imap_arg_get_list(&list[i+1], &flags_list))
+				return;
+			if (flags_list[0].type != IMAP_ARG_EOL)
+				have_labels = TRUE;
 		}
 	}
 	/* FIXME: need to do something about recent flags */
@@ -351,6 +357,14 @@
 		mail_index_lookup_keywords(mbox->delayed_sync_view, lseq,
 					   &old_kws);
 
+		if (have_labels) {
+			/* add keyword for mails that have GMail labels.
+			   this can be used for "All Mail" mailbox migrations
+			   with dsync */
+			atom = "$GMailHaveLabels";
+			array_append(&keywords, &atom, 1);
+		}
+
 		array_append_zero(&keywords);
 		kw = mail_index_keywords_create(mbox->box.index,
 						array_idx(&keywords, 0));
diff -r 35e4a6ae8d85 -r c18b2ffeb882 src/lib-storage/index/imapc/imapc-settings.c
--- a/src/lib-storage/index/imapc/imapc-settings.c	Tue Jan 20 04:07:09 2015 +0200
+++ b/src/lib-storage/index/imapc/imapc-settings.c	Tue Jan 20 04:30:27 2015 +0200
@@ -80,6 +80,7 @@
 	{ "rfc822.size", IMAPC_FEATURE_RFC822_SIZE },
 	{ "guid-forced", IMAPC_FEATURE_GUID_FORCED },
 	{ "fetch-headers", IMAPC_FEATURE_FETCH_HEADERS },
+	{ "gmail-labels-keyword", IMAPC_FEATURE_GMAIL_LABELS_KEYWORD },
 	{ NULL, 0 }
 };
 
diff -r 35e4a6ae8d85 -r c18b2ffeb882 src/lib-storage/index/imapc/imapc-settings.h
--- a/src/lib-storage/index/imapc/imapc-settings.h	Tue Jan 20 04:07:09 2015 +0200
+++ b/src/lib-storage/index/imapc/imapc-settings.h	Tue Jan 20 04:30:27 2015 +0200
@@ -3,9 +3,10 @@
 
 /* <settings checks> */
 enum imapc_features {
-	IMAPC_FEATURE_RFC822_SIZE	= 0x01,
-	IMAPC_FEATURE_GUID_FORCED	= 0x02,
-	IMAPC_FEATURE_FETCH_HEADERS	= 0x04
+	IMAPC_FEATURE_RFC822_SIZE		= 0x01,
+	IMAPC_FEATURE_GUID_FORCED		= 0x02,
+	IMAPC_FEATURE_FETCH_HEADERS		= 0x04,
+	IMAPC_FEATURE_GMAIL_LABELS_KEYWORD	= 0x08
 };
 /* </settings checks> */
 
diff -r 35e4a6ae8d85 -r c18b2ffeb882 src/lib-storage/index/imapc/imapc-sync.c
--- a/src/lib-storage/index/imapc/imapc-sync.c	Tue Jan 20 04:07:09 2015 +0200
+++ b/src/lib-storage/index/imapc/imapc-sync.c	Tue Jan 20 04:30:27 2015 +0200
@@ -316,8 +316,13 @@
 		/* we'll resync existing messages' flags and add new messages.
 		   adding new messages requires sync locking to avoid
 		   duplicates. */
-		imapc_sync_cmd(ctx, t_strdup_printf(
-			"UID FETCH %u:* FLAGS", mbox->sync_fetch_first_uid));
+		string_t *cmd = t_str_new(64);
+
+		str_printfa(cmd, "UID FETCH %u:* (FLAGS", mbox->sync_fetch_first_uid);
+		if (IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_GMAIL_LABELS_KEYWORD))
+			str_append(cmd, " X-GM-LABELS");
+		str_append_c(cmd, ')');
+		imapc_sync_cmd(ctx, str_c(cmd));
 		mbox->sync_fetch_first_uid = 0;
 	}
 
@@ -352,7 +357,10 @@
 	mbox->sync_next_lseq = 1;
 	mbox->sync_next_rseq = 1;
 
-	imapc_sync_cmd(ctx, "UID FETCH 1:* FLAGS");
+	if (!IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_GMAIL_LABELS_KEYWORD))
+		imapc_sync_cmd(ctx, "UID FETCH 1:* FLAGS");
+	else
+		imapc_sync_cmd(ctx, "UID FETCH 1:* (FLAGS X-GM-LABELS)");
 }
 
 static int


More information about the dovecot-cvs mailing list