[PATCH 1/4] Add the option "--reply-to" to notmuch reply.

Mark Walters markwalters1009 at gmail.com
Fri Jan 6 05:34:14 PST 2012


    Possible values for this option are "sender" which replies just to
    sender and "all" (the default).

    More precisely reply to sender follows these rules:
    reply only to sender unless it was the user
    reply only to all people on the "to" line unless they were all the user
    reply to all people on the "cc" line

    Implementation details

    We continue parsing addresses beyond the ones we reply to because
    we want to make sure the from address is correct. (At the very least it
    is the same as it would be if we replied to all.)

    We overload the message variable in add_recipients_for_address_list so
    if it is NULL we parse the address (looking for the users address)
    but do not add to the message recipients list

    We add the variable reply_to_all to the function chain to keep track
    of whether we should reply to everyone.
---
 notmuch-reply.c |   48 +++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/notmuch-reply.c b/notmuch-reply.c
index f8d5f64..9a77fe6 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -212,7 +212,8 @@ add_recipients_for_address_list (GMimeMessage *message,
 		if (ret == NULL)
 		    ret = addr;
 	    } else {
-		g_mime_message_add_recipient (message, type, name, addr);
+		 if (message)
+		      g_mime_message_add_recipient (message, type, name, addr);
 	    }
 	}
     }
@@ -292,7 +293,8 @@ reply_to_header_is_redundant (notmuch_message_t *message)
 static const char *
 add_recipients_from_message (GMimeMessage *reply,
 			     notmuch_config_t *config,
-			     notmuch_message_t *message)
+			     notmuch_message_t *message,
+			     int reply_to_all)
 {
     struct {
 	const char *header;
@@ -332,9 +334,20 @@ add_recipients_from_message (GMimeMessage *reply,
 	    recipients = notmuch_message_get_header (message,
 						     reply_to_map[i].fallback);
 
-	addr = add_recipients_for_string (reply, config,
-					  reply_to_map[i].recipient_type,
-					  recipients);
+
+	/* We add the addresses if we are replying to all or we have not yet found
+	 * a non-user address. We have to keep parsing to make sure we do find the
+	 * correct from address for the user, but we pass a NULL message
+	 */
+	if ((reply_to_all) || (g_mime_message_get_all_recipients (reply) == NULL))
+	    addr = add_recipients_for_string (reply, config,
+					      reply_to_map[i].recipient_type,
+					      recipients);
+	else
+	     addr = add_recipients_for_string (NULL, config,
+					       reply_to_map[i].recipient_type,
+					       recipients);
+
 	if (from_addr == NULL)
 	    from_addr = addr;
     }
@@ -480,7 +493,8 @@ static int
 notmuch_reply_format_default(void *ctx,
 			     notmuch_config_t *config,
 			     notmuch_query_t *query,
-			     notmuch_show_params_t *params)
+			     notmuch_show_params_t *params,
+			     int reply_to_all)
 {
     GMimeMessage *reply;
     notmuch_messages_t *messages;
@@ -509,7 +523,7 @@ notmuch_reply_format_default(void *ctx,
 	    g_mime_message_set_subject (reply, subject);
 	}
 
-	from_addr = add_recipients_from_message (reply, config, message);
+	from_addr = add_recipients_from_message (reply, config, message, reply_to_all);
 
 	if (from_addr == NULL)
 	    from_addr = guess_from_received_header (config, message);
@@ -558,7 +572,8 @@ static int
 notmuch_reply_format_headers_only(void *ctx,
 				  notmuch_config_t *config,
 				  notmuch_query_t *query,
-				  unused (notmuch_show_params_t *params))
+				  unused (notmuch_show_params_t *params),
+				  int reply_to_all)
 {
     GMimeMessage *reply;
     notmuch_messages_t *messages;
@@ -598,7 +613,7 @@ notmuch_reply_format_headers_only(void *ctx,
 	g_mime_object_set_header (GMIME_OBJECT (reply),
 				  "References", references);
 
-	(void)add_recipients_from_message (reply, config, message);
+	(void)add_recipients_from_message (reply, config, message, reply_to_all);
 
 	reply_headers = g_mime_object_to_string (GMIME_OBJECT (reply));
 	printf ("%s", reply_headers);
@@ -620,7 +635,8 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
     notmuch_query_t *query;
     char *opt, *query_string;
     int i, ret = 0;
-    int (*reply_format_func)(void *ctx, notmuch_config_t *config, notmuch_query_t *query, notmuch_show_params_t *params);
+    int reply_to_all = 1;
+    int (*reply_format_func)(void *ctx, notmuch_config_t *config, notmuch_query_t *query, notmuch_show_params_t *params, int reply_to_all);
     notmuch_show_params_t params;
 
     reply_format_func = notmuch_reply_format_default;
@@ -654,6 +670,16 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
 		g_object_unref (session);
 		session = NULL;
 	    }
+	} else if (STRNCMP_LITERAL (argv[i], "--reply-to=") == 0) {
+	    opt = argv[i] + sizeof ("--reply-to=") - 1;
+	    if (strcmp (opt, "sender") == 0) {
+		 reply_to_all = 0;
+	    } else if (strcmp (opt, "all") == 0) {
+		 reply_to_all = 1;
+	    } else {
+		 fprintf (stderr, "Invalid value for --reply-to: %s\n", opt);
+		 return 1;
+	    }
 	} else {
 	    fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
 	    return 1;
@@ -689,7 +715,7 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
 	return 1;
     }
 
-    if (reply_format_func (ctx, config, query, &params) != 0)
+    if (reply_format_func (ctx, config, query, &params, reply_to_all) != 0)
 	return 1;
 
     notmuch_query_destroy (query);
-- 
1.7.2.3



More information about the notmuch mailing list