[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, ¶ms) != 0)
+ if (reply_format_func (ctx, config, query, ¶ms, reply_to_all) != 0)
return 1;
notmuch_query_destroy (query);
--
1.7.2.3
More information about the notmuch
mailing list