From 2f4c5874747c58be04764a7c9a62f3b352e4f9fb Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Thu, 12 Nov 2009 09:59:47 -0800 Subject: [PATCH] notmuch search: Print the names of author of matched emails. It's important to have the names present for determining whether a thread is worth reading or not. We may want to think about abbreviating the list somehow if it is excessively long (or redundant as in bugzilla-daemon, bugzilla-daemon, bugzilla-daemon, etc.). --- lib/notmuch.h | 14 ++++++++++++++ lib/thread.cc | 35 +++++++++++++++++++++++++++++++++++ notmuch-search.c | 3 ++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/notmuch.h b/lib/notmuch.h index 40a1dca7..4004af90 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -451,6 +451,20 @@ notmuch_threads_destroy (notmuch_threads_t *threads); const char * notmuch_thread_get_thread_id (notmuch_thread_t *thread); +/* Get the authors of 'thread' + * + * The returned string is a comma-separated list of the names of the + * authors of mail messages in the query results that belong to this + * thread. + * + * The returned string belongs to 'thread' and as such, should not be + * modified by the caller and will only be valid for as long as the + * thread is valid, (which is until notmuch_thread_destroy or until + * the query from which it derived is destroyed). + */ +const char * +notmuch_thread_get_authors (notmuch_thread_t *thread); + /* Get the subject of 'thread' * * The subject is taken from the first message (according to the query diff --git a/lib/thread.cc b/lib/thread.cc index b67dfade..e85e2afd 100644 --- a/lib/thread.cc +++ b/lib/thread.cc @@ -23,12 +23,14 @@ #include +#include #include /* GHashTable */ struct _notmuch_thread { notmuch_database_t *notmuch; char *thread_id; char *subject; + char *authors; GHashTable *tags; notmuch_bool_t has_message; @@ -75,6 +77,7 @@ _notmuch_thread_create (const void *talloc_owner, thread->notmuch = notmuch; thread->thread_id = talloc_strdup (thread, thread_id); thread->subject = NULL; + thread->authors = NULL; thread->tags = g_hash_table_new_full (g_str_hash, g_str_equal, free, NULL); @@ -98,6 +101,32 @@ _notmuch_thread_add_message (notmuch_thread_t *thread, notmuch_tags_t *tags; const char *tag; time_t date; + InternetAddressList *list; + InternetAddress *address; + const char *from, *author; + + from = notmuch_message_get_header (message, "from"); + list = internet_address_list_parse_string (from); + if (list) { + address = internet_address_list_get_address (list, 0); + if (address) { + author = internet_address_get_name (address); + if (author == NULL) { + InternetAddressMailbox *mailbox; + 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); + } + } + g_object_unref (G_OBJECT (list)); + } if (! thread->subject) { const char *subject; @@ -124,6 +153,12 @@ _notmuch_thread_add_message (notmuch_thread_t *thread, thread->has_message = 1; } +const char * +notmuch_thread_get_authors (notmuch_thread_t *thread) +{ + return thread->authors; +} + const char * notmuch_thread_get_subject (notmuch_thread_t *thread) { diff --git a/notmuch-search.c b/notmuch-search.c index 3873a067..38ca75d6 100644 --- a/notmuch-search.c +++ b/notmuch-search.c @@ -64,9 +64,10 @@ notmuch_search_command (void *ctx, int argc, char *argv[]) date = notmuch_thread_get_oldest_date (thread); relative_date = notmuch_time_relative_date (ctx, date); - printf ("thread:%s %12s %s", + printf ("thread:%s %12s %s; %s", notmuch_thread_get_thread_id (thread), relative_date, + notmuch_thread_get_authors (thread), notmuch_thread_get_subject (thread)); printf (" (");