aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/thread.cc
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-11-12 21:19:42 -0800
committerGravatar Carl 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 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);