unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] cli: add --headers_only option to notmuch-show.c
@ 2012-06-30  7:33 Mark Walters
  2012-07-07  1:22 ` Peter Wang
  0 siblings, 1 reply; 3+ messages in thread
From: Mark Walters @ 2012-06-30  7:33 UTC (permalink / raw)
  To: notmuch

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

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2012-07-07  6:21 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-30  7:33 [PATCH] cli: add --headers_only option to notmuch-show.c Mark Walters
2012-07-07  1:22 ` Peter Wang
2012-07-07  6:21   ` Jani Nikula

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).