All pastes #1806812 Raw Edit

fer

public diff v1 · immutable
#1806812 ·published 2010-02-23 14:54 UTC
rendered paste body
From 0a1305bbcbf51f1b774cd5a3e06e1b02b36c9b1e Mon Sep 17 00:00:00 2001From: Fernando Herrera <fherrera@onirica.com>Date: Tue, 23 Feb 2010 15:49:52 +0100Subject: [PATCH] Add ">" before subject line is we are a recipient of the email--- Makefile         |    2 +- lib/notmuch.h    |   16 ++++++++++++ lib/thread.cc    |   72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ notmuch-search.c |   44 ++++++++++++++++++++++++++++++-- 4 files changed, 130 insertions(+), 4 deletions(-)diff --git a/Makefile b/Makefileindex 64b9d4a..4d652d0 100644--- a/Makefile+++ b/Makefile@@ -17,7 +17,7 @@ extra_cflags := extra_cxxflags :=  # Now smash together user's values with our extra values-FINAL_CFLAGS = $(CFLAGS) $(WARN_CFLAGS) $(CONFIGURE_CFLAGS) $(extra_cflags)+FINAL_CFLAGS = $(CFLAGS) $(WARN_CFLAGS) $(CONFIGURE_CFLAGS) $(extra_cflags) -g FINAL_CXXFLAGS = $(CXXFLAGS) $(WARN_CXXFLAGS) $(CONFIGURE_CXXFLAGS) $(extra_cflags) $(extra_cxxflags) FINAL_LDFLAGS = $(LDFLAGS) $(CONFIGURE_LDFLAGS) diff --git a/lib/notmuch.h b/lib/notmuch.hindex d3e50a7..64ccb0a 100644--- a/lib/notmuch.h+++ b/lib/notmuch.h@@ -547,6 +547,22 @@ notmuch_thread_get_matched_messages (notmuch_thread_t *thread); const char * notmuch_thread_get_authors (notmuch_thread_t *thread); +/* Get the recipients of 'thread'+ *+ * The returned string is a comma-separated list of the names of the+ * recipients 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_recipients (notmuch_thread_t *thread);+++ /* Get the subject of 'thread'  *  * The subject is taken from the first message (according to the querydiff --git a/lib/thread.cc b/lib/thread.ccindex 321937b..a87f005 100644--- a/lib/thread.cc+++ b/lib/thread.cc@@ -32,6 +32,8 @@ struct _notmuch_thread {     char *subject;     GHashTable *authors_hash;     char *authors;+    GHashTable *recipients_hash;+    char *recipients;     GHashTable *tags;      notmuch_message_list_t *message_list;@@ -46,6 +48,7 @@ static int _notmuch_thread_destructor (notmuch_thread_t *thread) {     g_hash_table_unref (thread->authors_hash);+    g_hash_table_unref (thread->recipients_hash);     g_hash_table_unref (thread->tags);     g_hash_table_unref (thread->message_hash); @@ -73,6 +76,28 @@ _thread_add_author (notmuch_thread_t *thread, 	thread->authors = talloc_strdup (thread, author); } +static void+_thread_add_recipient (notmuch_thread_t *thread,+		       const char *recipient)+{+    if (recipient == NULL)+	return;++    if (g_hash_table_lookup_extended (thread->recipients_hash,+				      recipient, NULL, NULL))+	return;++    printf ("Adding recipient: %s\n", recipient);+    g_hash_table_insert (thread->recipients_hash, xstrdup (recipient), NULL);++    if (thread->recipients)+	thread->recipients = talloc_asprintf (thread, "%s, %s",+					      thread->recipients,+					      recipient);+    else+	thread->recipients = talloc_strdup (thread, recipient);+}+ /* Add 'message' as a message that belongs to 'thread'.  *  * The 'thread' will talloc_steal the 'message' and hold onto a@@ -87,6 +112,8 @@ _thread_add_message (notmuch_thread_t *thread,     InternetAddressList *list;     InternetAddress *address;     const char *from, *author;+    const char *to, *cc, *recipient;+    int i;      _notmuch_message_list_add_message (thread->message_list, 				       talloc_steal (thread, message));@@ -112,6 +139,42 @@ _thread_add_message (notmuch_thread_t *thread, 	g_object_unref (G_OBJECT (list));     } +    to = notmuch_message_get_header (message, "to");+    list = internet_address_list_parse_string (to);+    if (list) {+        for (i = 0; i < internet_address_list_length (list); i++) {+	    address = internet_address_list_get_address (list, i);+	    if (address) {+	        recipient = internet_address_get_name (address);+	        if (recipient == NULL) {+		    InternetAddressMailbox *mailbox;+		    mailbox = INTERNET_ADDRESS_MAILBOX (address);+		    recipient = internet_address_mailbox_get_addr (mailbox);+	        }+	        _thread_add_recipient (thread, recipient);+	    }+        }+	g_object_unref (G_OBJECT (list));+    }++    cc = notmuch_message_get_header (message, "cc");+    list = internet_address_list_parse_string (to);+    if (list) {+        for (i = 0; i < internet_address_list_length (list); i++) {+	    address = internet_address_list_get_address (list, i);+	    if (address) {+	        recipient = internet_address_get_name (address);+	        if (recipient == NULL) {+		    InternetAddressMailbox *mailbox;+		    mailbox = INTERNET_ADDRESS_MAILBOX (address);+		    recipient = internet_address_mailbox_get_addr (mailbox);+	        }+	        _thread_add_recipient (thread, recipient);+	    }+        }+	g_object_unref (G_OBJECT (list));+    }+     if (! thread->subject) { 	const char *subject; 	subject = notmuch_message_get_header (message, "subject");@@ -251,6 +314,9 @@ _notmuch_thread_create (void *ctx,     thread->authors_hash = g_hash_table_new_full (g_str_hash, g_str_equal, 						  free, NULL);     thread->authors = NULL;+    thread->recipients_hash = g_hash_table_new_full (g_str_hash, g_str_equal,+						     free, NULL);+    thread->recipients = NULL;     thread->tags = g_hash_table_new_full (g_str_hash, g_str_equal, 					  free, NULL); @@ -326,6 +392,12 @@ notmuch_thread_get_authors (notmuch_thread_t *thread) }  const char *+notmuch_thread_get_recipients (notmuch_thread_t *thread)+{+    return thread->recipients;+}++const char * notmuch_thread_get_subject (notmuch_thread_t *thread) {     return thread->subject;diff --git a/notmuch-search.c b/notmuch-search.cindex dc44eb6..a9c7ce0 100644--- a/notmuch-search.c+++ b/notmuch-search.c@@ -20,8 +20,45 @@  #include "notmuch-client.h" +static int+is_for_me (notmuch_config_t *config, notmuch_thread_t *thread)+{+    static const char *user_name = NULL;+    static const char *primary_email = NULL;+    static char **other_emails = NULL;+    static size_t other_emails_lenght = 0;++    const char *recipients;++    if (user_name == NULL) {+        user_name = notmuch_config_get_user_name (config);+        primary_email = notmuch_config_get_user_primary_email (config);+        other_emails = notmuch_config_get_user_other_email (config, &other_emails_lenght);+    }++    recipients = notmuch_thread_get_recipients (thread);++    if (recipients == NULL) {+        return 0;+    } else if (user_name != NULL && strstr (recipients, user_name) != NULL) {+        return 1;+    } else if (primary_email != NULL && strstr (recipients, primary_email) != NULL) {+        return 1;+    } else if (other_emails != NULL) {+        int i;+        for (i = 0; i < (int) other_emails_lenght; i++) {+             if (other_emails[i] != NULL && strstr (recipients, other_emails[i]) != NULL) {+                 return 1;+             }+        }+    }++    return 0;+}+ static void-do_search_threads (const void *ctx,+do_search_threads (notmuch_config_t *config,+                   const void *ctx, 		   notmuch_query_t *query, 		   notmuch_sort_t sort) {@@ -46,12 +83,13 @@ do_search_threads (const void *ctx,  	relative_date = notmuch_time_relative_date (ctx, date); -	printf ("thread:%s %12s [%d/%d] %s; %s",+	printf ("thread:%s %12s [%d/%d] %s; %s%s", 		notmuch_thread_get_thread_id (thread), 		relative_date, 		notmuch_thread_get_matched_messages (thread), 		notmuch_thread_get_total_messages (thread), 		notmuch_thread_get_authors (thread),+		is_for_me (config, thread) ? ">" : "", 		notmuch_thread_get_subject (thread));  	printf (" (");@@ -132,7 +170,7 @@ notmuch_search_command (void *ctx, int argc, char *argv[])      notmuch_query_set_sort (query, sort); -    do_search_threads (ctx, query, sort);+    do_search_threads (config, ctx, query, sort);      notmuch_query_destroy (query);     notmuch_database_close (notmuch);-- 1.6.6