dovecot-2.2: dsync: Don't try to rename namespace prefixes.
dovecot at dovecot.org
dovecot at dovecot.org
Mon Feb 9 19:58:49 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/1a0ece9b39e5
changeset: 18237:1a0ece9b39e5
user: Timo Sirainen <tss at iki.fi>
date: Mon Feb 09 21:58:13 2015 +0200
description:
dsync: Don't try to rename namespace prefixes.
diffstat:
src/doveadm/dsync/dsync-mailbox-tree-sync.c | 19 +++++++--
src/doveadm/dsync/test-dsync-mailbox-tree-sync.c | 46 ++++++++++++++++++++++++
2 files changed, 61 insertions(+), 4 deletions(-)
diffs (109 lines):
diff -r 0eb8d396949a -r 1a0ece9b39e5 src/doveadm/dsync/dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/dsync-mailbox-tree-sync.c Mon Feb 09 21:45:04 2015 +0200
+++ b/src/doveadm/dsync/dsync-mailbox-tree-sync.c Mon Feb 09 21:58:13 2015 +0200
@@ -759,6 +759,14 @@
return NULL;
}
+static bool sync_node_is_namespace_root(struct dsync_mailbox_tree *tree,
+ struct dsync_mailbox_node *node)
+{
+ if (node == &tree->root)
+ return TRUE;
+ return sync_node_is_namespace_prefix(tree, node);
+}
+
static bool sync_rename_directory(struct dsync_mailbox_tree_sync_ctx *ctx,
struct dsync_mailbox_node *local_node1,
struct dsync_mailbox_node *remote_node2)
@@ -766,15 +774,18 @@
struct dsync_mailbox_node *remote_node1, *local_node2;
/* see if we can find matching mailbox branches based on the nodes'
- child mailboxes (with GUIDs). */
+ child mailboxes (with GUIDs). we can then rename the entire branch.
+ don't try to do this for namespace prefixes though. */
remote_node1 = sync_find_branch(ctx->local_tree,
ctx->remote_tree, local_node1);
local_node2 = sync_find_branch(ctx->remote_tree, ctx->local_tree,
remote_node2);
if (remote_node1 == NULL || local_node2 == NULL ||
- remote_node1 == &ctx->remote_tree->root ||
- local_node2 == &ctx->local_tree->root ||
- node_names_equal(remote_node1, local_node2))
+ node_names_equal(remote_node1, local_node2) ||
+ sync_node_is_namespace_root(ctx->remote_tree, remote_node1) ||
+ sync_node_is_namespace_root(ctx->remote_tree, remote_node2) ||
+ sync_node_is_namespace_root(ctx->local_tree, local_node1) ||
+ sync_node_is_namespace_root(ctx->local_tree, local_node2))
return FALSE;
return sync_rename_lower_ts(ctx, local_node1, remote_node1,
diff -r 0eb8d396949a -r 1a0ece9b39e5 src/doveadm/dsync/test-dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c Mon Feb 09 21:45:04 2015 +0200
+++ b/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c Mon Feb 09 21:58:13 2015 +0200
@@ -11,6 +11,12 @@
#include <stdlib.h>
#define MAX_DEPTH 4
+#define TEST_NAMESPACE_NAME "INBOX"
+
+static struct mail_namespace inbox_namespace = {
+ .prefix = TEST_NAMESPACE_NAME"/",
+ .prefix_len = sizeof(TEST_NAMESPACE_NAME)-1 + 1
+};
char mail_namespace_get_sep(struct mail_namespace *ns ATTR_UNUSED)
{
@@ -212,11 +218,51 @@
dsync_mailbox_tree_deinit(&orig_tree2);
}
+static void
+test_tree_nodes_add_namespace(struct dsync_mailbox_node *node,
+ struct mail_namespace *ns)
+{
+ for (; node != NULL; node = node->next) {
+ node->ns = ns;
+ test_tree_nodes_add_namespace(node->first_child, ns);
+ }
+}
+
+static void
+test_tree_add_namespace(struct dsync_mailbox_tree *tree,
+ struct mail_namespace *ns)
+{
+ struct dsync_mailbox_node *node, *n;
+
+ node = dsync_mailbox_tree_get(tree, TEST_NAMESPACE_NAME);
+ node->existence = DSYNC_MAILBOX_NODE_EXISTS;
+ i_assert(tree->root.first_child == node);
+ i_assert(node->first_child == NULL);
+ node->first_child = node->next;
+ for (n = node->first_child; n != NULL; n = n->next)
+ n->parent = node;
+ node->next = NULL;
+
+ test_tree_nodes_add_namespace(&tree->root, ns);
+}
+
static void test_trees(struct dsync_mailbox_tree *tree1,
struct dsync_mailbox_tree *tree2)
{
+ struct dsync_mailbox_tree *tree1_dup, *tree2_dup;
+
+ tree1_dup = dsync_mailbox_tree_dup(tree1);
+ tree2_dup = dsync_mailbox_tree_dup(tree2);
+
+ /* test without namespace prefix */
test_trees_nofree(tree1, &tree2);
dsync_mailbox_tree_deinit(&tree1);
+
+ /* test with namespace prefix */
+ test_tree_add_namespace(tree1_dup, &inbox_namespace);
+ test_tree_add_namespace(tree2_dup, &inbox_namespace);
+ test_trees_nofree(tree1_dup, &tree2_dup);
+ dsync_mailbox_tree_deinit(&tree1_dup);
}
static void test_dsync_mailbox_tree_sync_creates(void)
More information about the dovecot-cvs
mailing list