]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-reply.c
cli/reply: reuse create_reply_message() also for headers-only format
[notmuch] / notmuch-reply.c
index 5adbab624ad7a2cbb17a6a7b5a98b8feca8937f7..daad453efb0907aba71d7510a1c2745886cf3bab 100644 (file)
@@ -520,28 +520,43 @@ 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;
     }
 
-    subject = notmuch_message_get_header (message, "subject");
-    if (subject) {
-       if (strncasecmp (subject, "Re:", 3))
-           subject = talloc_asprintf (ctx, "Re: %s", subject);
-       g_mime_message_set_subject (reply, subject);
-    }
+    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");
+    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
@@ -572,25 +587,14 @@ create_reply_message(void *ctx,
     from_addr = talloc_asprintf (ctx, "%s <%s>",
                                 notmuch_config_get_user_name (config),
                                 from_addr);
-    g_mime_object_set_header (GMIME_OBJECT (reply),
-                             "From", from_addr);
-
-    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);
+    g_mime_object_set_header (GMIME_OBJECT (reply), "From", from_addr);
 
-    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);
-    g_mime_object_set_header (GMIME_OBJECT (reply),
-                             "References", references);
+    subject = notmuch_message_get_header (message, "subject");
+    if (subject) {
+       if (strncasecmp (subject, "Re:", 3))
+           subject = talloc_asprintf (ctx, "Re: %s", subject);
+       g_mime_message_set_subject (reply, subject);
+    }
 
     return reply;
 }
@@ -604,20 +608,20 @@ notmuch_reply_format_default(void *ctx,
                             unused (sprinter_t *sp))
 {
     GMimeMessage *reply;
-    mime_node_t *root;
+    mime_node_t *node;
+
+    if (mime_node_open (ctx, message, &params->crypto, &node))
+       return 1;
 
-    reply = create_reply_message (ctx, config, message, reply_all);
+    reply = create_reply_message (ctx, config, message, reply_all, FALSE);
     if (!reply)
        return 1;
 
     show_reply_headers (reply);
+    format_part_reply (node);
 
     g_object_unref (G_OBJECT (reply));
-
-    if (mime_node_open (ctx, message, &params->crypto, &root) == NOTMUCH_STATUS_SUCCESS) {
-       format_part_reply (root);
-       talloc_free (root);
-    }
+    talloc_free (node);
 
     return 0;
 }
@@ -633,10 +637,10 @@ notmuch_reply_format_sprinter(void *ctx,
     GMimeMessage *reply;
     mime_node_t *node;
 
-    if (mime_node_open (ctx, message, &params->crypto, &node) != NOTMUCH_STATUS_SUCCESS)
+    if (mime_node_open (ctx, message, &params->crypto, &node))
        return 1;
 
-    reply = create_reply_message (ctx, config, message, reply_all);
+    reply = create_reply_message (ctx, config, message, reply_all, FALSE);
     if (!reply)
        return 1;
 
@@ -645,7 +649,6 @@ notmuch_reply_format_sprinter(void *ctx,
     /* The headers of the reply message we've created */
     sp->map_key (sp, "reply-headers");
     format_headers_sprinter (sp, reply, TRUE);
-    g_object_unref (G_OBJECT (reply));
 
     /* Start the original */
     sp->map_key (sp, "original");
@@ -654,6 +657,9 @@ notmuch_reply_format_sprinter(void *ctx,
     /* End */
     sp->end (sp);
 
+    g_object_unref (G_OBJECT (reply));
+    talloc_free (node);
+
     return 0;
 }
 
@@ -667,34 +673,10 @@ notmuch_reply_format_headers_only(void *ctx,
                                  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");
+    reply = create_reply_message (ctx, config, message, reply_all, TRUE);
+    if (!reply)
        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);