Quoth Mark Walters on Jul 23 at 5:17 pm: > This option allows the caller to suppress the output of the bodies of > the messages. 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 (and in some cases a speed up > of more than a factor of 8); moreover it reduces the memory usage in > emacs hugely. > --- > notmuch-client.h | 3 ++- > notmuch-reply.c | 2 +- > notmuch-show.c | 23 +++++++++++++++-------- > 3 files changed, 18 insertions(+), 10 deletions(-) > > diff --git a/notmuch-client.h b/notmuch-client.h > index 0c17b79..f930798 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 output_body; > 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 output_body); > > 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..de21f3b 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, TRUE); > > /* End */ > printf ("}\n"); > diff --git a/notmuch-show.c b/notmuch-show.c > index 8f3c60e..c2ad4fb 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 output_body) > { > /* Any changes to the JSON format should be reflected in the file > * devel/schemata. */ > @@ -571,10 +571,12 @@ format_part_json (const void *ctx, mime_node_t *node, notmuch_bool_t first) > printf ("\"headers\": "); > format_headers_json (ctx, GMIME_MESSAGE (node->part), FALSE); > > - printf (", \"body\": ["); > - format_part_json (ctx, mime_node_child (node, 0), first); > - > - printf ("]}"); > + if (output_body) { > + printf (", \"body\": ["); > + format_part_json (ctx, mime_node_child (node, 0), first, TRUE); > + printf ("]"); > + } > + printf ("}"); > return; > } > > @@ -652,16 +654,16 @@ 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, TRUE); > > printf ("%s}", terminator); > } > > 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)) > + const notmuch_show_params_t *params) > { > - format_part_json (ctx, node, TRUE); > + format_part_json (ctx, node, TRUE, params->output_body); > > return NOTMUCH_STATUS_SUCCESS; > } > @@ -1004,6 +1006,7 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) > notmuch_show_params_t params = { > .part = -1, > .omit_excluded = TRUE, > + .output_body = TRUE, > .crypto = { > .verify = FALSE, > .decrypt = FALSE > @@ -1032,6 +1035,7 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) > { NOTMUCH_OPT_INT, ¶ms.part, "part", 'p', 0 }, > { NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.decrypt, "decrypt", 'd', 0 }, > { NOTMUCH_OPT_BOOLEAN, ¶ms.crypto.verify, "verify", 'v', 0 }, > + { NOTMUCH_OPT_BOOLEAN, ¶ms.output_body, "body", 'h', 0 }, Why 'h' for the short option? > { 0, 0, 0, 0, 0 } > }; > > @@ -1086,6 +1090,9 @@ notmuch_show_command (void *ctx, unused (int argc), unused (char *argv[])) > entire_thread = ENTIRE_THREAD_FALSE; > } > > + if (!params.output_body && format != &format_json) > + fprintf (stderr,"Warning: --body=false only implemented for format=json\n"); Missing space after comma. Should we consider how --part and --body interact? Maybe specifying --part is incompatible with --body=false? Or specifying a part > 0 is incompatible with --body=false? > + > if (entire_thread == ENTIRE_THREAD_TRUE) > params.entire_thread = TRUE; > else