[PATCH 1/4] Add the option "--reply-to" to notmuch reply.
Jani Nikula
jani at nikula.org
Sun Jan 8 04:47:33 PST 2012
On Fri, 6 Jan 2012 13:34:14 +0000, Mark Walters <markwalters1009 at gmail.com> wrote:
> 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))
Looking into this, it occurred to me g_mime_message_get_all_recipients()
allocates a new InternetAddressList when the return value is
non-NULL. Thus this leaks memory. OTOH allocating and deallocating for
this purpose seems suboptimal. I'll think this over.
BR,
Jani.
> + 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