From 9e522a3a06edf0b9ef2a23927a35b53086aed035 Mon Sep 17 00:00:00 2001 From: Jani Nikula Date: Thu, 24 Sep 2015 21:34:30 +0300 Subject: [PATCH] Re: [PATCH v2 6/9] cli: change the data structure for notmuch address deduplication --- 28/96c6f28e2e1dc2f573df43df7acc3b05ba0222 | 212 ++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 28/96c6f28e2e1dc2f573df43df7acc3b05ba0222 diff --git a/28/96c6f28e2e1dc2f573df43df7acc3b05ba0222 b/28/96c6f28e2e1dc2f573df43df7acc3b05ba0222 new file mode 100644 index 000000000..dfe0cc50b --- /dev/null +++ b/28/96c6f28e2e1dc2f573df43df7acc3b05ba0222 @@ -0,0 +1,212 @@ +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 82B9E6DE0B7C + for ; Thu, 24 Sep 2015 11:34:54 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at cworth.org +X-Spam-Flag: NO +X-Spam-Score: -0.144 +X-Spam-Level: +X-Spam-Status: No, score=-0.144 tagged_above=-999 required=5 + tests=[AWL=-0.168, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, + RCVD_IN_MSPIKE_WL=-0.01, URIBL_SBL=0.644, URIBL_SBL_A=0.1] + 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 NBZ1QLCyxlg9 for ; + Thu, 24 Sep 2015 11:34:52 -0700 (PDT) +Received: from mail-wi0-f174.google.com (mail-wi0-f174.google.com + [209.85.212.174]) + by arlo.cworth.org (Postfix) with ESMTPS id 9DCC56DE0B64 + for ; Thu, 24 Sep 2015 11:34:51 -0700 (PDT) +Received: by wiclk2 with SMTP id lk2so125067381wic.1 + for ; Thu, 24 Sep 2015 11:34:49 -0700 (PDT) +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20130820; + h=x-gm-message-state:from:to:subject:in-reply-to:references + :user-agent:date:message-id:mime-version:content-type; + bh=AbjQtlAGaBJ7UpHzwYDcPbI+XjKqIo8M9MaZdTgxqDQ=; + b=luQgGMFqrXZc8Zyzn21LO8p7nJmUB4V+eIGNsiDAcwJmzTOoqiv2UK0gdXeRB6AfkR + PNDwj9k7TywwCR4NGv2nREhNlxtYqk7X4mlZ5KJH5Gd32uvTYZt/gF64lN0YJWxsHvv2 + nsaF9tWk2FVE4UHVdrn2jZ+z2UyUQiepti6XOI0jWPfpiNdX+/K1bRJaCTFreH1zajor + rOqqnY8eFnwTCenWB4DSflRJpWE2H9OwlmO/txqE4Uy4hzly3rCepjyyjDwd5T0RtbQv + b/DVazpfyzjQyfxj8b+ZKCJHzsh9VFRNK0t+yHAJLzRSh9F4mWOmuogUZ6FzUhQWNILF + yRCQ== +X-Gm-Message-State: + ALoCoQkmzFWDH7PeSVSxjElnnYSyDjjz6qpObdf8KjHfZ9DXRGmL6LVDpYJFDztbJHgemVfvuX/Q +X-Received: by 10.194.116.67 with SMTP id ju3mr1165206wjb.143.1443119689474; + Thu, 24 Sep 2015 11:34:49 -0700 (PDT) +Received: from localhost (mobile-access-bcee63-221.dhcp.inet.fi. + [188.238.99.221]) + by smtp.gmail.com with ESMTPSA id jj8sm169536wid.2.2015.09.24.11.34.48 + (version=TLSv1/SSLv3 cipher=OTHER); + Thu, 24 Sep 2015 11:34:48 -0700 (PDT) +From: Jani Nikula +To: David Bremner , notmuch@notmuchmail.org +Subject: Re: [PATCH v2 6/9] cli: change the data structure for notmuch address + deduplication +In-Reply-To: <87fv242e2a.fsf@zancas.localnet> +References: + + <87fv242e2a.fsf@zancas.localnet> +User-Agent: Notmuch/0.20.2+66~gb33abd9 (http://notmuchmail.org) Emacs/24.4.1 + (x86_64-pc-linux-gnu) +Date: Thu, 24 Sep 2015 21:34:30 +0300 +Message-ID: <87612zwts9.fsf@nikula.org> +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 18:34:54 -0000 + +On Thu, 24 Sep 2015, David Bremner wrote: +> Jani Nikula writes: +> +> +>> + else +>> + v = !!m1->name - !!m2->name; +> +> Is this really idiomatic? It seems a little difficult to follow to me. + +Probably depends on whether you're accustomed to using !! for +"normalizing" zero and non-zero to 0 and 1, respectively. + +The alternative seemed a bit too verbose for my liking: + + if (m1->name && m2->name) + v = strcmp (m1->name, m2->name); + else if (!m1->name && !m2->name) + v = 0; + else if (m1->name) + v = 1; + else + v = -1; + +I can live with that if you think the verbosity is in order here. (Or am +I missing an obvious better alternative?) + +BR, +Jani. + + +> +>> /* 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