From: Carl Worth Date: Fri, 13 Nov 2009 05:19:42 +0000 (-0800) Subject: notmuch search: Avoid printing duplicate author names. X-Git-Tag: 0.1~511 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=c3c0966521a4d9e04281ae9ee0abcc33ace67c47;p=notmuch.git notmuch search: Avoid printing duplicate author names. We add a hash to the thread object so that we can detect author names that have already been added to the list, and avoid adding them redundantly. This avoids the giant chain of "bugzilla-daemon, bugzilla-daemon, bugzilla-daemon, bugzilla-daemon, ..." author lists that we would get otherwise, for example. --- diff --git a/lib/thread.cc b/lib/thread.cc index 197b5ebd..4f0696b4 100644 --- a/lib/thread.cc +++ b/lib/thread.cc @@ -30,6 +30,7 @@ struct _notmuch_thread { notmuch_database_t *notmuch; char *thread_id; char *subject; + GHashTable *authors_hash; char *authors; GHashTable *tags; @@ -41,11 +42,33 @@ struct _notmuch_thread { static int _notmuch_thread_destructor (notmuch_thread_t *thread) { + g_hash_table_unref (thread->authors_hash); g_hash_table_unref (thread->tags); return 0; } +static void +_thread_add_author (notmuch_thread_t *thread, + const char *author) +{ + if (author == NULL) + return; + + if (g_hash_table_lookup_extended (thread->authors_hash, + author, NULL, NULL)) + return; + + g_hash_table_insert (thread->authors_hash, xstrdup (author), NULL); + + if (thread->authors) + thread->authors = talloc_asprintf (thread, "%s, %s", + thread->authors, + author); + else + thread->authors = talloc_strdup (thread, author); +} + static void _thread_add_message (notmuch_thread_t *thread, notmuch_message_t *message) @@ -68,14 +91,7 @@ _thread_add_message (notmuch_thread_t *thread, mailbox = INTERNET_ADDRESS_MAILBOX (address); author = internet_address_mailbox_get_addr (mailbox); } - if (author) { - if (thread->authors) - thread->authors = talloc_asprintf (thread, "%s, %s", - thread->authors, - author); - else - thread->authors = talloc_strdup (thread, author); - } + _thread_add_author (thread, author); } g_object_unref (G_OBJECT (list)); } @@ -150,6 +166,8 @@ _notmuch_thread_create (const void *ctx, thread->notmuch = notmuch; thread->thread_id = talloc_strdup (thread, thread_id); thread->subject = NULL; + thread->authors_hash = g_hash_table_new_full (g_str_hash, g_str_equal, + free, NULL); thread->authors = NULL; thread->tags = g_hash_table_new_full (g_str_hash, g_str_equal, free, NULL);