From: Timo Sirainen Date: Thu, 25 Sep 2025 10:22:27 +0000 (+0300) Subject: imapc: Set children-flags manually using the mailbox list output X-Git-Tag: 2.4.2~392 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9e259879d2186a4130b7b42c7e0d8e78b08d63a0;p=thirdparty%2Fdovecot%2Fcore.git imapc: Set children-flags manually using the mailbox list output --- diff --git a/src/lib-storage/index/imapc/imapc-list.c b/src/lib-storage/index/imapc/imapc-list.c index b4c366e26a..c350e90dc9 100644 --- a/src/lib-storage/index/imapc/imapc-list.c +++ b/src/lib-storage/index/imapc/imapc-list.c @@ -659,6 +659,17 @@ static int imapc_list_refresh(struct imapc_mailbox_list *list) return ctx.ret; } +static bool imapc_list_has_existing_children(struct mailbox_node *node) +{ + for (node = node->children; node != NULL; node = node->next) { + if ((node->flags & MAILBOX_NONEXISTENT) == 0) + return TRUE; + if (imapc_list_has_existing_children(node)) + return TRUE; + } + return FALSE; +} + static void imapc_list_build_match_tree(struct imapc_mailbox_list_iterate_context *ctx) { @@ -677,7 +688,13 @@ imapc_list_build_match_tree(struct imapc_mailbox_list_iterate_context *ctx) iter = mailbox_tree_iterate_init(list->mailboxes, NULL, 0); while ((node = mailbox_tree_iterate_next(iter, &vname)) != NULL) { - update_ctx.leaf_flags = node->flags; + /* We'll build our own children flags */ + update_ctx.leaf_flags = node->flags & + ENUM_NEGATE(MAILBOX_CHILDREN | MAILBOX_NOCHILDREN); + if (imapc_list_has_existing_children(node)) + update_ctx.leaf_flags |= MAILBOX_CHILDREN; + else + update_ctx.leaf_flags |= MAILBOX_NOCHILDREN; mailbox_list_iter_update(&update_ctx, vname); } mailbox_tree_iterate_deinit(&iter);