From 65584c0435c30b6c0405f5f9b0beb1991a5dc3a2 Mon Sep 17 00:00:00 2001 From: David Bremner Date: Fri, 25 Sep 2015 09:32:13 +2100 Subject: [PATCH] Re: [PATCH v2 6/9] cli: change the data structure for notmuch address deduplication --- 9e/607fb30a07296d7541affbcd1ee20244822f7c | 169 ++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 9e/607fb30a07296d7541affbcd1ee20244822f7c diff --git a/9e/607fb30a07296d7541affbcd1ee20244822f7c b/9e/607fb30a07296d7541affbcd1ee20244822f7c new file mode 100644 index 000000000..ede6f3049 --- /dev/null +++ b/9e/607fb30a07296d7541affbcd1ee20244822f7c @@ -0,0 +1,169 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by arlo.cworth.org (Postfix) with ESMTP id 705EE6DE0C1E + for ; Thu, 24 Sep 2015 05:34:22 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Spam-Flag: NO +X-Spam-Score: 0.112 +X-Spam-Level: +X-Spam-Status: No, score=0.112 tagged_above=-999 required=5 tests=[AWL=0.112] + autolearn=disabled +Received: from arlo.cworth.org ([127.0.0.1]) + by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id BVL9venosmGo for ; + Thu, 24 Sep 2015 05:34:20 -0700 (PDT) +Received: from gitolite.debian.net (gitolite.debian.net [87.98.215.224]) + by arlo.cworth.org (Postfix) with ESMTPS id 3C4C06DE0B7C + for ; Thu, 24 Sep 2015 05:34:20 -0700 (PDT) +Received: from remotemail by gitolite.debian.net with local (Exim 4.80) + (envelope-from ) + id 1Zf5hQ-0006ga-I3; Thu, 24 Sep 2015 12:32:32 +0000 +Received: (nullmailer pid 9111 invoked by uid 1000); Thu, 24 Sep 2015 + 12:32:13 -0000 +From: David Bremner +To: Jani Nikula , notmuch@notmuchmail.org +Subject: Re: [PATCH v2 6/9] cli: change the data structure for notmuch + address deduplication +In-Reply-To: + +References: + +User-Agent: Notmuch/0.20.2+73~gd432116 (http://notmuchmail.org) Emacs/24.5.1 + (x86_64-pc-linux-gnu) +Date: Thu, 24 Sep 2015 09:32:13 -0300 +Message-ID: <87fv242e2a.fsf@zancas.localnet> +MIME-Version: 1.0 +Content-Type: text/plain +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.18 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Thu, 24 Sep 2015 12:34:22 -0000 + +Jani Nikula writes: + + +> + else +> + v = !!m1->name - !!m2->name; + +Is this really idiomatic? It seems a little difficult to follow to me. + +> /* Returns TRUE iff name and addr is duplicate. If not, stores the +> * name/addr pair in order to detect subsequent duplicates. */ +> static notmuch_bool_t +> is_duplicate (const search_context_t *ctx, const char *name, const char *addr) +> { +> char *key; +> + GList *list, *l; +> mailbox_t *mailbox; +> +> - key = talloc_asprintf (ctx->format, "%s <%s>", name, addr); +> - if (! key) +> - return FALSE; +> + list = g_hash_table_lookup (ctx->addresses, addr); +> + if (list) { +> + mailbox_t find = { +> + .name = name, +> + .addr = addr, +> + }; +> + +> + l = g_list_find_custom (list, &find, mailbox_compare); +> + if (l) { +> + mailbox = l->data; +> + mailbox->count++; +> + return TRUE; +> + } +> +> - mailbox = g_hash_table_lookup (ctx->addresses, key); +> - if (mailbox) { +> - mailbox->count++; +> - talloc_free (key); +> - return TRUE; +> + mailbox = new_mailbox (ctx->format, name, addr); +> + if (! mailbox) +> + return FALSE; +> + +> + /* +> + * XXX: It would be more efficient to prepend to the list, but +> + * then we'd have to store the changed list head back to the +> + * hash table. This check is here just to avoid the compiler +> + * warning for unused result. +> + */ +> + if (list != g_list_append (list, mailbox)) +> + INTERNAL_ERROR ("appending to list changed list head\n"); +> + +> + return FALSE; +> } +> +> + key = talloc_strdup (ctx->format, addr); +> + if (! key) +> + return FALSE; +> + +> mailbox = new_mailbox (ctx->format, name, addr); +> if (! mailbox) +> return FALSE; +> +> - g_hash_table_insert (ctx->addresses, key, mailbox); +> + list = g_list_append (NULL, mailbox); +> + if (! list) +> + return FALSE; +> + +> + g_hash_table_insert (ctx->addresses, key, list); +> +> return FALSE; +> } +> @@ -401,12 +445,21 @@ _talloc_free_for_g_hash (void *ptr) +> } +> +> static void +> -print_hash_value (unused (gpointer key), gpointer value, gpointer user_data) +> +_list_free_for_g_hash (void *ptr) +> +{ +> + g_list_free_full (ptr, _talloc_free_for_g_hash); +> +} +> + +> +static void +> +print_list_value (void *mailbox, void *context) +> { +> - const mailbox_t *mailbox = value; +> - search_context_t *ctx = user_data; +> + print_mailbox (context, mailbox); +> +} +> +> - print_mailbox (ctx, mailbox); +> +static void +> +print_hash_value (unused (void *key), void *list, void *context) +> +{ +> + g_list_foreach (list, print_list_value, context); +> } +> +> static int +> @@ -792,8 +845,9 @@ notmuch_address_command (notmuch_config_t *config, int argc, char *argv[]) +> argc - opt_index, argv + opt_index)) +> return EXIT_FAILURE; +> +> - ctx->addresses = g_hash_table_new_full (g_str_hash, g_str_equal, +> - _talloc_free_for_g_hash, _talloc_free_for_g_hash); +> + ctx->addresses = g_hash_table_new_full (strcase_hash, strcase_equal, +> + _talloc_free_for_g_hash, +> + _list_free_for_g_hash); +> +> ret = do_search_messages (ctx); +> +> -- +> 2.1.4 +> +> _______________________________________________ +> notmuch mailing list +> notmuch@notmuchmail.org +> http://notmuchmail.org/mailman/listinfo/notmuch -- 2.26.2