dovecot-2.1: imapc: Don't use separate indexes/ directory anymor...

dovecot at dovecot.org dovecot at dovecot.org
Fri Nov 4 21:10:59 EET 2011


details:   http://hg.dovecot.org/dovecot-2.1/rev/7e1981ecbe40
changeset: 13652:7e1981ecbe40
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Nov 04 21:20:19 2011 +0200
description:
imapc: Don't use separate indexes/ directory anymore. Fixes/cleanups to make it possible.

diffstat:

 src/lib-storage/index/imapc/imapc-list.c    |  31 +++++++++++++---------------
 src/lib-storage/index/imapc/imapc-storage.c |   1 +
 src/lib-storage/index/imapc/imapc-storage.h |   1 +
 src/lib-storage/list/mailbox-list-fs.c      |   2 +-
 src/lib-storage/list/mailbox-list-maildir.c |   2 +-
 src/lib-storage/mailbox-list.c              |  11 ++++++++-
 src/lib-storage/mailbox-list.h              |  10 +++-----
 7 files changed, 31 insertions(+), 27 deletions(-)

diffs (161 lines):

diff -r ebdb1d51ea14 -r 7e1981ecbe40 src/lib-storage/index/imapc/imapc-list.c
--- a/src/lib-storage/index/imapc/imapc-list.c	Fri Nov 04 21:17:09 2011 +0200
+++ b/src/lib-storage/index/imapc/imapc-list.c	Fri Nov 04 21:20:19 2011 +0200
@@ -205,16 +205,11 @@
 	} else if (list->index_list == NULL && !list->index_list_failed) {
 		memset(&list_set, 0, sizeof(list_set));
 		list_set.layout = MAILBOX_LIST_NAME_MAILDIRPLUSPLUS;
-		/* the root dir shouldn't actually ever be used. we just need
-		   it to be different from index_dir so the index directories
-		   get autocreated */
 		list_set.root_dir = dir;
-		list_set.index_dir = t_strconcat(dir, "/indexes", NULL);
-		list_set.escape_char = '%';
+		list_set.escape_char = IMAPC_LIST_ESCAPE_CHAR;
 
 		if (mailbox_list_create(list_set.layout, list->list.ns,
-					&list_set, MAILBOX_LIST_FLAG_SECONDARY |
-					MAILBOX_LIST_FLAG_OPTIONAL_BOXES,
+					&list_set, MAILBOX_LIST_FLAG_SECONDARY,
 					&list->index_list, &error) < 0) {
 			i_error("imapc: Couldn't create %s mailbox list: %s",
 				list_set.layout, error);
@@ -589,16 +584,18 @@
 	i_assert(list->sep != '\0');
 
 	vname = mailbox_list_default_get_vname(_list, name);
-	node = mailbox_tree_lookup(list->mailboxes, vname);
-	if (node != NULL)
-		node->flags |= MAILBOX_NONEXISTENT;
+	if (!list->refreshed_mailboxes) {
+		node = mailbox_tree_lookup(list->mailboxes, vname);
+		if (node != NULL)
+			node->flags |= MAILBOX_NONEXISTENT;
 
-	/* refresh the mailbox flags */
-	cmd = imapc_list_simple_context_init(&sctx, list);
-	imapc_command_sendf(cmd, "LIST \"\" %s", name);
-	imapc_simple_run(&sctx);
-	if (sctx.ret < 0)
-		return -1;
+		/* refresh the mailbox flags */
+		cmd = imapc_list_simple_context_init(&sctx, list);
+		imapc_command_sendf(cmd, "LIST \"\" %s", name);
+		imapc_simple_run(&sctx);
+		if (sctx.ret < 0)
+			return -1;
+	}
 
 	node = mailbox_tree_lookup(list->mailboxes, vname);
 	if (node == NULL)
@@ -610,7 +607,7 @@
 
 struct mailbox_list imapc_mailbox_list = {
 	.name = MAILBOX_LIST_NAME_IMAPC,
-	.props = MAILBOX_LIST_PROP_NO_ROOT,
+	.props = MAILBOX_LIST_PROP_NO_ROOT | MAILBOX_LIST_PROP_AUTOCREATE_DIRS,
 	.mailbox_name_max_length = MAILBOX_LIST_NAME_MAX_LENGTH,
 
 	{
diff -r ebdb1d51ea14 -r 7e1981ecbe40 src/lib-storage/index/imapc/imapc-storage.c
--- a/src/lib-storage/index/imapc/imapc-storage.c	Fri Nov 04 21:17:09 2011 +0200
+++ b/src/lib-storage/index/imapc/imapc-storage.c	Fri Nov 04 21:20:19 2011 +0200
@@ -288,6 +288,7 @@
 				struct mailbox_list_settings *set)
 {
 	set->layout = MAILBOX_LIST_NAME_IMAPC;
+	set->escape_char = IMAPC_LIST_ESCAPE_CHAR;
 }
 
 static struct mailbox *
diff -r ebdb1d51ea14 -r 7e1981ecbe40 src/lib-storage/index/imapc/imapc-storage.h
--- a/src/lib-storage/index/imapc/imapc-storage.h	Fri Nov 04 21:17:09 2011 +0200
+++ b/src/lib-storage/index/imapc/imapc-storage.h	Fri Nov 04 21:20:19 2011 +0200
@@ -5,6 +5,7 @@
 
 #define IMAPC_STORAGE_NAME "imapc"
 #define IMAPC_INDEX_PREFIX "dovecot.index"
+#define IMAPC_LIST_ESCAPE_CHAR '%'
 
 struct imap_arg;
 struct imapc_untagged_reply;
diff -r ebdb1d51ea14 -r 7e1981ecbe40 src/lib-storage/list/mailbox-list-fs.c
--- a/src/lib-storage/list/mailbox-list-fs.c	Fri Nov 04 21:17:09 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-fs.c	Fri Nov 04 21:20:19 2011 +0200
@@ -361,7 +361,7 @@
 		ret = fs_list_delete_maildir(list, name);
 	}
 
-	if (ret == 0 || (list->flags & MAILBOX_LIST_FLAG_OPTIONAL_BOXES) != 0)
+	if (ret == 0 || (list->props & MAILBOX_LIST_PROP_AUTOCREATE_DIRS) != 0)
 		mailbox_list_delete_finish(list, name);
 	return ret;
 }
diff -r ebdb1d51ea14 -r 7e1981ecbe40 src/lib-storage/list/mailbox-list-maildir.c
--- a/src/lib-storage/list/mailbox-list-maildir.c	Fri Nov 04 21:17:09 2011 +0200
+++ b/src/lib-storage/list/mailbox-list-maildir.c	Fri Nov 04 21:20:19 2011 +0200
@@ -410,7 +410,7 @@
 		ret = maildir_list_delete_maildir(list, name);
 	}
 
-	if (ret == 0 || (list->flags & MAILBOX_LIST_FLAG_OPTIONAL_BOXES) != 0)
+	if (ret == 0 || (list->props & MAILBOX_LIST_PROP_AUTOCREATE_DIRS) != 0)
 		mailbox_list_delete_finish(list, name);
 	return ret;
 }
diff -r ebdb1d51ea14 -r 7e1981ecbe40 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Fri Nov 04 21:17:09 2011 +0200
+++ b/src/lib-storage/mailbox-list.c	Fri Nov 04 21:20:19 2011 +0200
@@ -1307,7 +1307,9 @@
 		enum mailbox_existence existence;
 		int ret;
 
-		box = mailbox_alloc(list, "INBOX", 0);
+		/* kludge: with imapc backend we can get here with
+		   list=Maildir++ (for indexes), but list->ns->list=imapc */
+		box = mailbox_alloc(list->ns->list, "INBOX", 0);
 		ret = mailbox_exists(box, FALSE, &existence);
 		mailbox_free(&box);
 		if (ret < 0) {
@@ -1730,8 +1732,13 @@
 					 MAILBOX_LIST_PATH_TYPE_MAILBOX);
 	index_dir = mailbox_list_get_path(list, name,
 					  MAILBOX_LIST_PATH_TYPE_INDEX);
-	if (*index_dir == '\0' || strcmp(index_dir, root_dir) == 0)
+	if (*index_dir == '\0')
 		return 0;
+	if (strcmp(index_dir, root_dir) == 0) {
+		if ((list->props & MAILBOX_LIST_PROP_AUTOCREATE_DIRS) == 0)
+			return 0;
+		/* the directory might not have been created yet */
+	}
 
 	if (name == NULL) {
 		return mailbox_list_mkdir_root(list, index_dir,
diff -r ebdb1d51ea14 -r 7e1981ecbe40 src/lib-storage/mailbox-list.h
--- a/src/lib-storage/mailbox-list.h	Fri Nov 04 21:17:09 2011 +0200
+++ b/src/lib-storage/mailbox-list.h	Fri Nov 04 21:20:19 2011 +0200
@@ -24,7 +24,9 @@
 	/* no support for \noselect directories, only mailboxes */
 	MAILBOX_LIST_PROP_NO_NOSELECT		= 0x04,
 	/* mail root directory isn't required */
-	MAILBOX_LIST_PROP_NO_ROOT		= 0x08
+	MAILBOX_LIST_PROP_NO_ROOT		= 0x08,
+	/* Automatically create mailbox directories when needed */
+	MAILBOX_LIST_PROP_AUTOCREATE_DIRS	= 0x10
 };
 
 enum mailbox_list_flags {
@@ -32,11 +34,7 @@
 	MAILBOX_LIST_FLAG_MAILBOX_FILES		= 0x01,
 	/* Namespace already has a mailbox list, don't assign this
 	   mailbox list to it. */
-	MAILBOX_LIST_FLAG_SECONDARY		= 0x02,
-	/* Don't assume that just because a mailbox directory doesn't exist
-	   its index/control directories don't exist (e.g. this is index-only
-	   mailbox list) */
-	MAILBOX_LIST_FLAG_OPTIONAL_BOXES	= 0x04
+	MAILBOX_LIST_FLAG_SECONDARY		= 0x02
 };
 
 enum mailbox_info_flags {


More information about the dovecot-cvs mailing list