diff options
author | Carl Worth <cworth@cworth.org> | 2009-11-12 21:19:42 -0800 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2009-11-12 21:19:42 -0800 |
commit | c3c0966521a4d9e04281ae9ee0abcc33ace67c47 (patch) | |
tree | 42b2b20d388863748c88bdcbf1e37b17eaab81e1 /lib/thread.cc | |
parent | ec6d3506db0b614ff754293cfb83fe9e93dc66c8 (diff) |
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.
Diffstat (limited to 'lib/thread.cc')
-rw-r--r-- | lib/thread.cc | 34 |
1 files changed, 26 insertions, 8 deletions
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,12 +42,34 @@ 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); |