---
 notmuch-search.c | 32 ++++++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/notmuch-search.c b/notmuch-search.c
index c84ecc31262c..c3ca3246bceb 100644
--- a/notmuch-search.c
+++ b/notmuch-search.c
@@ -218,7 +218,8 @@ do_search_threads (sprinter_t *format,
 }

 static void
-print_address_list (sprinter_t *format, InternetAddressList *list)
+print_address_list (sprinter_t *format, GHashTable *addrs,
+                   InternetAddressList *list)
 {
     InternetAddress *address;
     int i;
@@ -234,7 +235,7 @@ print_address_list (sprinter_t *format, InternetAddressList 
*list)
            if (group_list == NULL)
                continue;

-           print_address_list (format, group_list);
+           print_address_list (format, addrs, group_list);
        } else {
            InternetAddressMailbox *mailbox;
            const char *name;
@@ -246,6 +247,11 @@ print_address_list (sprinter_t *format, 
InternetAddressList *list)
            name = internet_address_get_name (address);
            addr = internet_address_mailbox_get_addr (mailbox);

+           if (g_hash_table_lookup_extended (addrs, addr, NULL, NULL))
+               continue;
+
+           g_hash_table_insert (addrs, talloc_strdup (NULL, addr), NULL);
+
            if (name && *name)
                full_address = talloc_asprintf (NULL, "%s <%s>", name, addr);
            else
@@ -263,7 +269,7 @@ print_address_list (sprinter_t *format, InternetAddressList 
*list)
 }

 static void
-print_address_string (sprinter_t *format, const char *recipients)
+print_address_string (sprinter_t *format, GHashTable *addrs, const char 
*recipients)
 {
     InternetAddressList *list;

@@ -274,7 +280,13 @@ print_address_string (sprinter_t *format, const char 
*recipients)
     if (list == NULL)
        return;

-    print_address_list (format, list);
+    print_address_list (format, addrs, list);
+}
+
+static void
+_my_talloc_free_for_g_hash (void *ptr)
+{
+    talloc_free (ptr);
 }

 static int
@@ -288,8 +300,13 @@ do_search_messages (sprinter_t *format,
     notmuch_message_t *message;
     notmuch_messages_t *messages;
     notmuch_filenames_t *filenames;
+    GHashTable *addresses = NULL;
     int i;

+    if (output & OUTPUT_ADDRESS_ALL)
+       addresses = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                      _my_talloc_free_for_g_hash, NULL);
+
     if (offset < 0) {
        offset += notmuch_query_count_messages (query);
        if (offset < 0)
@@ -341,7 +358,7 @@ do_search_messages (sprinter_t *format,
                if (addrs == NULL || *addrs == '\0')
                    addrs = notmuch_message_get_header (message, "from");

-               print_address_string (format, addrs);
+               print_address_string (format, addresses, addrs);
            }

            if (output & OUTPUT_ADDRESS_TO) {
@@ -351,7 +368,7 @@ do_search_messages (sprinter_t *format,

                for (j = 0; j < ARRAY_SIZE (hdrs); j++) {
                    addrs = notmuch_message_get_header (message, hdrs[j]);
-                   print_address_string (format, addrs);
+                   print_address_string (format, addresses, addrs);
                }
            }
        }
@@ -359,6 +376,9 @@ do_search_messages (sprinter_t *format,
        notmuch_message_destroy (message);
     }

+    if (addresses)
+       g_hash_table_unref (addresses);
+
     notmuch_messages_destroy (messages);

     format->end (format);
-- 
2.1.0

Reply via email to