]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Set children-flags manually using the mailbox list output
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 25 Sep 2025 10:22:27 +0000 (13:22 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 30 Sep 2025 05:48:46 +0000 (05:48 +0000)
src/lib-storage/index/imapc/imapc-list.c

index b4c366e26a837de6fd8ceb96ed8bc6a83e915db2..c350e90dc90420cae7f87f001d5f72c4bfeb51dc 100644 (file)
@@ -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);