# HG changeset patch # User Timo Sirainen # Date 1500988251 -10800 # Node ID 1534de10685154ee70e0a23e79196ab0bc311153 # Parent ae8fe0ac1f34329e939d18e88a4645665108a6c7 lib-storage: Add setting to disable \NoSelect mailboxes Enabled using mail_location = ...:NO-NOSELECT Trying to create \NoSelect "dir/" will result just creating "dir", similar to how Maildir++ layout already did it. Deleting a mailbox will delete all of its \NoSelect parents. diff -r ae8fe0ac1f34 -r 1534de106851 src/lib-storage/index/index-storage.c --- a/src/lib-storage/index/index-storage.c Tue Jul 25 15:54:37 2017 +0300 +++ b/src/lib-storage/index/index-storage.c Tue Jul 25 16:10:51 2017 +0300 @@ -574,6 +574,12 @@ bool create_parent_dir; int ret; + if ((box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) != 0) { + /* Layout doesn't support creating \NoSelect mailboxes. + Switch to creating a selectable mailbox. */ + directory = FALSE; + } + type = directory ? MAILBOX_LIST_PATH_TYPE_DIR : MAILBOX_LIST_PATH_TYPE_MAILBOX; if ((ret = mailbox_get_path_to(box, type, &path)) < 0) @@ -630,8 +636,7 @@ return -1; } - if (directory && - (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0) { + if (directory) { /* we only wanted to create the directory and it's done now */ return 0; } diff -r ae8fe0ac1f34 -r 1534de106851 src/lib-storage/list/mailbox-list-delete.c --- a/src/lib-storage/list/mailbox-list-delete.c Tue Jul 25 15:54:37 2017 +0300 +++ b/src/lib-storage/list/mailbox-list-delete.c Tue Jul 25 16:10:51 2017 +0300 @@ -276,7 +276,7 @@ const char *root_dir, *p; size_t len; - if (list->set.iter_from_index_dir && + if (list->set.iter_from_index_dir && !list->set.no_noselect && mailbox_list_path_is_index(list, type)) { /* Don't auto-rmdir parent index directories with ITERINDEX. Otherwise it'll get us into inconsistent state with a diff -r ae8fe0ac1f34 -r 1534de106851 src/lib-storage/list/mailbox-list-fs.c --- a/src/lib-storage/list/mailbox-list-fs.c Tue Jul 25 15:54:37 2017 +0300 +++ b/src/lib-storage/list/mailbox-list-fs.c Tue Jul 25 16:10:51 2017 +0300 @@ -255,17 +255,19 @@ const char *path; int ret; + ret = mailbox_list_get_path(list, name, + MAILBOX_LIST_PATH_TYPE_MAILBOX, &path); + if (ret < 0) + return -1; + i_assert(ret > 0); + if ((list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) != 0) { - ret = mailbox_list_get_path(list, name, - MAILBOX_LIST_PATH_TYPE_MAILBOX, - &path); - if (ret < 0) - return -1; - i_assert(ret > 0); ret = mailbox_list_delete_mailbox_file(list, name, path); } else { ret = fs_list_delete_maildir(list, name); } + if (ret == 0 && list->set.no_noselect) + mailbox_list_delete_until_root(list, path, MAILBOX_LIST_PATH_TYPE_MAILBOX); i_assert(ret <= 0); return mailbox_list_delete_finish_ret(list, name, ret == 0); diff -r ae8fe0ac1f34 -r 1534de106851 src/lib-storage/mailbox-list.c --- a/src/lib-storage/mailbox-list.c Tue Jul 25 15:54:37 2017 +0300 +++ b/src/lib-storage/mailbox-list.c Tue Jul 25 16:10:51 2017 +0300 @@ -146,6 +146,8 @@ list->root_permissions.dir_create_mode = (mode_t)-1; list->root_permissions.file_create_gid = (gid_t)-1; list->changelog_timestamp = (time_t)-1; + if (set->no_noselect) + list->props |= MAILBOX_LIST_PROP_NO_NOSELECT; /* copy settings */ if (set->root_dir != NULL) { @@ -178,6 +180,7 @@ list->set.index_control_use_maildir_name = set->index_control_use_maildir_name; list->set.iter_from_index_dir = set->iter_from_index_dir; + list->set.no_noselect = set->no_noselect; if (*set->mailbox_dir_name == '\0') list->set.mailbox_dir_name = ""; @@ -351,6 +354,9 @@ } else if (strcmp(key, "ITERINDEX") == 0) { set_r->iter_from_index_dir = TRUE; continue; + } else if (strcmp(key, "NO-NOSELECT") == 0) { + set_r->no_noselect = TRUE; + continue; } else { *error_r = t_strdup_printf("Unknown setting: %s", key); return -1; diff -r ae8fe0ac1f34 -r 1534de106851 src/lib-storage/mailbox-list.h --- a/src/lib-storage/mailbox-list.h Tue Jul 25 15:54:37 2017 +0300 +++ b/src/lib-storage/mailbox-list.h Tue Jul 25 16:10:51 2017 +0300 @@ -152,6 +152,8 @@ faster storage. This could perhaps be made the default at some point, but for now since it's less tested it's optional. */ bool iter_from_index_dir; + /* Avoid creating or listing \NoSelect mailboxes. */ + bool no_noselect; }; struct mailbox_permissions {