X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-reply.c;h=b380678e72046ca4501c6d08d5a5b0db46acdcda;hp=eb07405591fd55185337612c2b3a8e5259d633e1;hb=301a65b0f2f7e4551ded7104d779b8600a806b2b;hpb=b1aca0e502e97ab822da60aa4217d4b0bdb33543 diff --git a/notmuch-reply.c b/notmuch-reply.c index eb074055..b380678e 100644 --- a/notmuch-reply.c +++ b/notmuch-reply.c @@ -520,13 +520,17 @@ static GMimeMessage * create_reply_message(void *ctx, notmuch_config_t *config, notmuch_message_t *message, - notmuch_bool_t reply_all) + notmuch_bool_t reply_all, + notmuch_bool_t limited) { const char *subject, *from_addr = NULL; const char *in_reply_to, *orig_references, *references; - /* The 1 means we want headers in a "pretty" order. */ - GMimeMessage *reply = g_mime_message_new (1); + /* + * Use the below header order for limited headers, "pretty" order + * otherwise. + */ + GMimeMessage *reply = g_mime_message_new (limited ? 0 : 1); if (reply == NULL) { fprintf (stderr, "Out of memory\n"); return NULL; @@ -538,18 +542,21 @@ create_reply_message(void *ctx, g_mime_object_set_header (GMIME_OBJECT (reply), "In-Reply-To", in_reply_to); orig_references = notmuch_message_get_header (message, "references"); - if (!orig_references) - /* Treat errors like missing References headers. */ - orig_references = ""; - references = talloc_asprintf (ctx, "%s%s%s", - *orig_references ? orig_references : "", - *orig_references ? " " : "", - in_reply_to); + if (orig_references && *orig_references) + references = talloc_asprintf (ctx, "%s %s", orig_references, + in_reply_to); + else + references = talloc_strdup (ctx, in_reply_to); + g_mime_object_set_header (GMIME_OBJECT (reply), "References", references); from_addr = add_recipients_from_message (reply, config, message, reply_all); + /* The above is all that is needed for limited headers. */ + if (limited) + return reply; + /* * Sadly, there is no standard way to find out to which email * address a mail was delivered - what is in the headers depends @@ -592,116 +599,6 @@ create_reply_message(void *ctx, return reply; } -static int -notmuch_reply_format_default(void *ctx, - notmuch_config_t *config, - notmuch_message_t *message, - notmuch_show_params_t *params, - notmuch_bool_t reply_all, - unused (sprinter_t *sp)) -{ - GMimeMessage *reply; - mime_node_t *node; - - if (mime_node_open (ctx, message, ¶ms->crypto, &node)) - return 1; - - reply = create_reply_message (ctx, config, message, reply_all); - if (!reply) - return 1; - - show_reply_headers (reply); - format_part_reply (node); - - g_object_unref (G_OBJECT (reply)); - talloc_free (node); - - return 0; -} - -static int -notmuch_reply_format_sprinter(void *ctx, - notmuch_config_t *config, - notmuch_message_t *message, - notmuch_show_params_t *params, - notmuch_bool_t reply_all, - sprinter_t *sp) -{ - GMimeMessage *reply; - mime_node_t *node; - - if (mime_node_open (ctx, message, ¶ms->crypto, &node)) - return 1; - - reply = create_reply_message (ctx, config, message, reply_all); - if (!reply) - return 1; - - sp->begin_map (sp); - - /* The headers of the reply message we've created */ - sp->map_key (sp, "reply-headers"); - format_headers_sprinter (sp, reply, TRUE); - - /* Start the original */ - sp->map_key (sp, "original"); - format_part_sprinter (ctx, sp, node, TRUE, TRUE, FALSE); - - /* End */ - sp->end (sp); - - g_object_unref (G_OBJECT (reply)); - talloc_free (node); - - return 0; -} - -/* This format is currently tuned for a git send-email --notmuch hook */ -static int -notmuch_reply_format_headers_only(void *ctx, - notmuch_config_t *config, - notmuch_message_t *message, - unused (notmuch_show_params_t *params), - notmuch_bool_t reply_all, - unused (sprinter_t *sp)) -{ - GMimeMessage *reply; - const char *in_reply_to, *orig_references, *references; - - /* The 0 means we do not want headers in a "pretty" order. */ - reply = g_mime_message_new (0); - if (reply == NULL) { - fprintf (stderr, "Out of memory\n"); - return 1; - } - - in_reply_to = talloc_asprintf (ctx, "<%s>", - notmuch_message_get_message_id (message)); - - g_mime_object_set_header (GMIME_OBJECT (reply), "In-Reply-To", in_reply_to); - - orig_references = notmuch_message_get_header (message, "references"); - - /* - * We print In-Reply-To followed by References because git - * format-patch treats them specially. Git does not interpret the - * other headers specially. - */ - references = talloc_asprintf (ctx, "%s%s%s", - orig_references ? orig_references : "", - orig_references ? " " : "", - in_reply_to); - g_mime_object_set_header (GMIME_OBJECT (reply), "References", references); - - (void)add_recipients_from_message (reply, config, message, reply_all); - - show_reply_headers (reply); - - g_object_unref (G_OBJECT (reply)); - - return 0; -} - enum { FORMAT_DEFAULT, FORMAT_JSON, @@ -715,17 +612,12 @@ static int do_reply(notmuch_config_t *config, int format, notmuch_bool_t reply_all) { + GMimeMessage *reply; + mime_node_t *node; notmuch_messages_t *messages; notmuch_message_t *message; notmuch_status_t status; struct sprinter *sp = NULL; - int ret = 0; - int (*reply_format_func) (void *ctx, - notmuch_config_t *config, - notmuch_message_t *message, - notmuch_show_params_t *params, - notmuch_bool_t reply_all, - struct sprinter *sp); if (format == FORMAT_JSON || format == FORMAT_SEXP) { unsigned count; @@ -738,18 +630,11 @@ static int do_reply(notmuch_config_t *config, fprintf (stderr, "Error: search term did not match precisely one message (matched %d messages).\n", count); return 1; } - } - if (format == FORMAT_HEADERS_ONLY) { - reply_format_func = notmuch_reply_format_headers_only; - } else if (format == FORMAT_JSON) { - reply_format_func = notmuch_reply_format_sprinter; - sp = sprinter_json_create (config, stdout); - } else if (format == FORMAT_SEXP) { - reply_format_func = notmuch_reply_format_sprinter; - sp = sprinter_sexp_create (config, stdout); - } else { - reply_format_func = notmuch_reply_format_default; + if (format == FORMAT_JSON) + sp = sprinter_json_create (config, stdout); + else + sp = sprinter_sexp_create (config, stdout); } status = notmuch_query_search_messages_st (query, &messages); @@ -762,15 +647,40 @@ static int do_reply(notmuch_config_t *config, { message = notmuch_messages_get (messages); - ret = reply_format_func(config, config, message, params, reply_all, sp); + if (mime_node_open (config, message, ¶ms->crypto, &node)) + return 1; - notmuch_message_destroy (message); + reply = create_reply_message (config, config, message, reply_all, + format == FORMAT_HEADERS_ONLY); + if (!reply) + return 1; - if (ret) - break; + if (format == FORMAT_JSON || format == FORMAT_SEXP) { + sp->begin_map (sp); + + /* The headers of the reply message we've created */ + sp->map_key (sp, "reply-headers"); + format_headers_sprinter (sp, reply, TRUE); + + /* Start the original */ + sp->map_key (sp, "original"); + format_part_sprinter (config, sp, node, TRUE, TRUE, FALSE); + + /* End */ + sp->end (sp); + } else { + show_reply_headers (reply); + if (format == FORMAT_DEFAULT) + format_part_reply (node); + } + + g_object_unref (G_OBJECT (reply)); + talloc_free (node); + + notmuch_message_destroy (message); } - return ret; + return 0; } int