summaryrefslogtreecommitdiff
path: root/lib/thread.cc
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2009-11-12 21:19:42 -0800
committerCarl Worth <cworth@cworth.org>2009-11-12 21:19:42 -0800
commitc3c0966521a4d9e04281ae9ee0abcc33ace67c47 (patch)
tree42b2b20d388863748c88bdcbf1e37b17eaab81e1 /lib/thread.cc
parentec6d3506db0b614ff754293cfb83fe9e93dc66c8 (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.cc34
1 files changed, 26 insertions, 8 deletions
diff --git a/lib/thread.cc b/lib/thread.cc
index 197b5eb..4f0696b 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);