aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch-reply.c
diff options
context:
space:
mode:
authorGravatar Jed Brown <jed@59A2.org>2009-11-25 02:35:14 +0100
committerGravatar Carl Worth <cworth@cworth.org>2009-11-27 16:56:42 -0800
commitf47e54bc515599486eff34642a7f340626c57197 (patch)
treef961da5fe938fc4447139042421a0aa762cb01c7 /notmuch-reply.c
parent5d447f327f3eb2dcb8e1ccde3ff3f444c2060e64 (diff)
notmuch-reply.c: implement notmuch_reply_format_headers_only
This command only generates References, To, and Cc headers. The purpose is primarily for use in git send-email --notmuch id:<MESSAGE-ID> to get proper threading and address the relevant parties. Hooks for other SCMs may come later. Signed-off-by: Jed Brown <jed@59A2.org>
Diffstat (limited to 'notmuch-reply.c')
-rw-r--r--notmuch-reply.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 17eb38d9..e85568c0 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -283,6 +283,74 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t *config, notmuch_query_
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_query_t *query)
+{
+ GMimeMessage *reply;
+ notmuch_messages_t *messages;
+ notmuch_message_t *message;
+ const char *recipients, *in_reply_to, *orig_references, *references;
+ char *reply_headers;
+ unsigned int i;
+
+ for (messages = notmuch_query_search_messages (query);
+ notmuch_messages_has_more (messages);
+ notmuch_messages_advance (messages))
+ {
+ message = notmuch_messages_get (messages);
+
+ /* 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));
+
+ orig_references = notmuch_message_get_header (message, "references");
+
+ /* We print References first because git format-patch treats it specially.
+ * Git uses the first entry of References to create In-Reply-To.
+ */
+ references = talloc_asprintf (ctx, "%s%s%s",
+ in_reply_to,
+ orig_references ? orig_references : "",
+ orig_references ? " " : "");
+ g_mime_object_set_header (GMIME_OBJECT (reply),
+ "References", references);
+
+ for (i = 0; i < ARRAY_SIZE (reply_to_map); i++) {
+ const char *addr;
+
+ recipients = notmuch_message_get_header (message,
+ reply_to_map[i].header);
+ if ((recipients == NULL || recipients[0] == '\0') && reply_to_map[i].fallback)
+ 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);
+ }
+
+ g_mime_object_set_header (GMIME_OBJECT (reply), "Bcc",
+ notmuch_config_get_user_primary_email (config));
+
+ reply_headers = g_mime_object_to_string (GMIME_OBJECT (reply));
+ printf ("%s", reply_headers);
+ free (reply_headers);
+
+ g_object_unref (G_OBJECT (reply));
+ reply = NULL;
+
+ notmuch_message_destroy (message);
+ }
+ return 0;
+}
+
int
notmuch_reply_command (void *ctx, int argc, char *argv[])
{
@@ -304,6 +372,8 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
opt = argv[i] + sizeof ("--format=") - 1;
if (strcmp (opt, "default") == 0) {
reply_format_func = notmuch_reply_format_default;
+ } else if (strcmp (opt, "headers-only") == 0) {
+ reply_format_func = notmuch_reply_format_headers_only;
} else {
fprintf (stderr, "Invalid value for --format: %s\n", opt);
return 1;