[PATCH] cli: add --headers_only option to notmuch-show.c

Subject: [PATCH] cli: add --headers_only option to notmuch-show.c

Date: Sat, 30 Jun 2012 08:33:15 +0100

To: notmuch@notmuchmail.org

Cc:

From: Mark Walters


This option just outputs the headers of a message (i.e. it omits the
bodies). Currently this is only implemented for format=json.

This is used by notmuch-pick.el (although not needed) because it gives a
speed-up of at least a factor of a two; moreover it reduces the memory
usage in emacs hugely.
---

Currently notmuch-show outputs on a thread includes all headers and
all text/plain parts (more precisely all text/* except text/html): the
client has to fetch any other parts it wants.

This patch allows notmuch show to just output the headers: omitting
all the body parts. Jamie suggested in
id:"87zk80ilt9.fsf@servo.finestructure.net" that we always omit all
body parts and leave it to the client to fetch them. 

My feeling is that this could make some uses much slower (a view
expressed by Peter in id:"20120620110139.GA2356@hili.localdomain").

What do people think?

Best wishes

Mark


 notmuch-client.h |    3 ++-
 notmuch-reply.c  |    2 +-
 notmuch-show.c   |   15 +++++++++++----
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index 0c17b79..17efde2 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -87,6 +87,7 @@ typedef struct notmuch_crypto {
 typedef struct notmuch_show_params {
     notmuch_bool_t entire_thread;
     notmuch_bool_t omit_excluded;
+    notmuch_bool_t headers_only;
     notmuch_bool_t raw;
     int part;
     notmuch_crypto_t crypto;
@@ -176,7 +177,7 @@ notmuch_status_t
 show_one_part (const char *filename, int part);
 
 void
-format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first);
+format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first, notmuch_bool_t headers_only);
 
 void
 format_headers_json (const void *ctx, GMimeMessage *message, notmuch_bool_t reply);
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 3a038ed..07c3bef 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -620,7 +620,7 @@ notmuch_reply_format_json(void *ctx,
     /* Start the original */
     printf (", \"original\": ");
 
-    format_part_json (ctx, node, TRUE);
+    format_part_json (ctx, node, TRUE, FALSE);
 
     /* End */
     printf ("}\n");
diff --git a/notmuch-show.c b/notmuch-show.c
index 8f3c60e..195e318 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -559,7 +559,7 @@ format_part_text (const void *ctx, mime_node_t *node,
 }
 
 void
-format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first)
+format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first, notmuch_bool_t headers_only)
 {
     /* Any changes to the JSON format should be reflected in the file
      * devel/schemata. */
@@ -572,7 +572,8 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first)
 	format_headers_json (ctx, GMIME_MESSAGE (node->part), FALSE);
 
 	printf (", \"body\": [");
-	format_part_json (ctx, mime_node_child (node, 0), first);
+	if (!headers_only)
+	    format_part_json (ctx, mime_node_child (node, 0), first, FALSE);
 
 	printf ("]}");
 	return;
@@ -652,7 +653,7 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first)
     talloc_free (local);
 
     for (i = 0; i < node->nchildren; i++)
-	format_part_json (ctx, mime_node_child (node, i), i == 0);
+	format_part_json (ctx, mime_node_child (node, i), i == 0, FALSE);
 
     printf ("%s}", terminator);
 }
@@ -661,7 +662,7 @@ static notmuch_status_t
 format_part_json_entry (const void *ctx, mime_node_t *node, unused (int indent),
 			unused (const notmuch_show_params_t *params))
 {
-    format_part_json (ctx, node, TRUE);
+    format_part_json (ctx, node, TRUE, params->headers_only);
 
     return NOTMUCH_STATUS_SUCCESS;
 }
@@ -1010,6 +1011,7 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
 	}
     };
     int format_sel = NOTMUCH_FORMAT_NOT_SPECIFIED;
+    notmuch_bool_t headers_only = FALSE;
     int exclude = EXCLUDE_TRUE;
     int entire_thread = ENTIRE_THREAD_DEFAULT;
 
@@ -1032,6 +1034,7 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
 	{ NOTMUCH_OPT_INT, &params.part, "part", 'p', 0 },
 	{ NOTMUCH_OPT_BOOLEAN, &params.crypto.decrypt, "decrypt", 'd', 0 },
 	{ NOTMUCH_OPT_BOOLEAN, &params.crypto.verify, "verify", 'v', 0 },
+	{ NOTMUCH_OPT_BOOLEAN, &headers_only, "headers-only", 'h', 0 },
 	{ 0, 0, 0, 0, 0 }
     };
 
@@ -1086,6 +1089,10 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[]))
 	    entire_thread = ENTIRE_THREAD_FALSE;
     }
 
+    if (headers_only && format != &format_json)
+	fprintf (stderr,"Warning: --headers-only only implemented for format=json\n");
+    params.headers_only = headers_only;
+
     if (entire_thread == ENTIRE_THREAD_TRUE)
 	params.entire_thread = TRUE;
     else
-- 
1.7.9.1


Thread: