* [PATCH 0/4] Add a --body option to notmuch show
@ 2012-07-23 16:17 Mark Walters
2012-07-23 16:17 ` [PATCH 1/4] cli: add --body=true|false option to notmuch-show.c Mark Walters
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Mark Walters @ 2012-07-23 16:17 UTC (permalink / raw)
To: notmuch
After discussion on irc today here is another version of the omit body
patches. The conclusion on irc was that the option should just make
the body: field in the JSON output optional. The --body=false option
omits this field. The default remains --body=true including the body:
field in the output.
This version includes tests for the new functionality and updates the
manpage and the schemata.
The motivation for this patch is that some callers do not need the
body and omitting it gives a substantial speed up and substantial
reduction in amount of data output.
Previous related patches are at
id:"1342967879-20453-1-git-send-email-markwalters1009@gmail.com" and
id:"1341041595-5858-1-git-send-email-markwalters1009@gmail.com"
Best wishes
Mark
Mark Walters (4):
cli: add --body=true|false option to notmuch-show.c
test: add tests for the new --body=true|false option
man: update man page for the new --body=true|false option
schemata: update for --body=true|false option
devel/schemata | 2 +-
man/man1/notmuch-show.1 | 16 ++++++++++++++++
notmuch-client.h | 3 ++-
notmuch-reply.c | 2 +-
notmuch-show.c | 23 +++++++++++++++--------
test/json | 9 +++++++++
6 files changed, 44 insertions(+), 11 deletions(-)
--
1.7.9.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/4] cli: add --body=true|false option to notmuch-show.c
2012-07-23 16:17 [PATCH 0/4] Add a --body option to notmuch show Mark Walters
@ 2012-07-23 16:17 ` Mark Walters
2012-07-23 16:43 ` Austin Clements
2012-07-23 16:17 ` [PATCH 2/4] test: add tests for the new --body=true|false option Mark Walters
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Mark Walters @ 2012-07-23 16:17 UTC (permalink / raw)
To: notmuch
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 },
{ 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");
+
if (entire_thread == ENTIRE_THREAD_TRUE)
params.entire_thread = TRUE;
else
--
1.7.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/4] test: add tests for the new --body=true|false option
2012-07-23 16:17 [PATCH 0/4] Add a --body option to notmuch show Mark Walters
2012-07-23 16:17 ` [PATCH 1/4] cli: add --body=true|false option to notmuch-show.c Mark Walters
@ 2012-07-23 16:17 ` Mark Walters
2012-07-23 16:17 ` [PATCH 3/4] man: update man page " Mark Walters
2012-07-23 16:17 ` [PATCH 4/4] schemata: update for " Mark Walters
3 siblings, 0 replies; 7+ messages in thread
From: Mark Walters @ 2012-07-23 16:17 UTC (permalink / raw)
To: notmuch
---
test/json | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/test/json b/test/json
index 6439788..709b34f 100755
--- a/test/json
+++ b/test/json
@@ -7,6 +7,15 @@ add_message "[subject]=\"json-show-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:0
output=$(notmuch show --format=json "json-show-message")
test_expect_equal "$output" "[[[{\"id\": \"${gen_msg_id}\", \"match\": true, \"excluded\": false, \"filename\": \"${gen_msg_filename}\", \"timestamp\": 946728000, \"date_relative\": \"2000-01-01\", \"tags\": [\"inbox\",\"unread\"], \"headers\": {\"Subject\": \"json-show-subject\", \"From\": \"Notmuch Test Suite <test_suite@notmuchmail.org>\", \"To\": \"Notmuch Test Suite <test_suite@notmuchmail.org>\", \"Date\": \"Sat, 01 Jan 2000 12:00:00 +0000\"}, \"body\": [{\"id\": 1, \"content-type\": \"text/plain\", \"content\": \"json-show-message\n\"}]}, []]]]"
+# This should be the same output as above.
+test_begin_subtest "Show message: json --body=true"
+output=$(notmuch show --format=json --body=true "json-show-message")
+test_expect_equal "$output" "[[[{\"id\": \"${gen_msg_id}\", \"match\": true, \"excluded\": false, \"filename\": \"${gen_msg_filename}\", \"timestamp\": 946728000, \"date_relative\": \"2000-01-01\", \"tags\": [\"inbox\",\"unread\"], \"headers\": {\"Subject\": \"json-show-subject\", \"From\": \"Notmuch Test Suite <test_suite@notmuchmail.org>\", \"To\": \"Notmuch Test Suite <test_suite@notmuchmail.org>\", \"Date\": \"Sat, 01 Jan 2000 12:00:00 +0000\"}, \"body\": [{\"id\": 1, \"content-type\": \"text/plain\", \"content\": \"json-show-message\n\"}]}, []]]]"
+
+test_begin_subtest "Show message: json --body=false"
+output=$(notmuch show --format=json --body=false "json-show-message")
+test_expect_equal "$output" "[[[{\"id\": \"${gen_msg_id}\", \"match\": true, \"excluded\": false, \"filename\": \"${gen_msg_filename}\", \"timestamp\": 946728000, \"date_relative\": \"2000-01-01\", \"tags\": [\"inbox\",\"unread\"], \"headers\": {\"Subject\": \"json-show-subject\", \"From\": \"Notmuch Test Suite <test_suite@notmuchmail.org>\", \"To\": \"Notmuch Test Suite <test_suite@notmuchmail.org>\", \"Date\": \"Sat, 01 Jan 2000 12:00:00 +0000\"}}, []]]]"
+
test_begin_subtest "Search message: json"
add_message "[subject]=\"json-search-subject\"" "[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" "[body]=\"json-search-message\""
output=$(notmuch search --format=json "json-search-message" | notmuch_search_sanitize)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/4] man: update man page for the new --body=true|false option
2012-07-23 16:17 [PATCH 0/4] Add a --body option to notmuch show Mark Walters
2012-07-23 16:17 ` [PATCH 1/4] cli: add --body=true|false option to notmuch-show.c Mark Walters
2012-07-23 16:17 ` [PATCH 2/4] test: add tests for the new --body=true|false option Mark Walters
@ 2012-07-23 16:17 ` Mark Walters
2012-07-23 16:52 ` Austin Clements
2012-07-23 16:17 ` [PATCH 4/4] schemata: update for " Mark Walters
3 siblings, 1 reply; 7+ messages in thread
From: Mark Walters @ 2012-07-23 16:17 UTC (permalink / raw)
To: notmuch
---
man/man1/notmuch-show.1 | 16 ++++++++++++++++
1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/man/man1/notmuch-show.1 b/man/man1/notmuch-show.1
index 5fa590e..d781c47 100644
--- a/man/man1/notmuch-show.1
+++ b/man/man1/notmuch-show.1
@@ -154,6 +154,22 @@ The default is
.RE
+.RS 4
+.TP 4
+.B \-\-body=(true|false)
+
+If true,
+.B notmuch show
+includes the bodies of the messages in the output whereas, if false,
+they are omitted. It defaults to true. Note that
+.B --body=false
+is only implemented for the json format.
+
+This is useful if the caller is only interested in the headers as it
+is much faster and the amount of output data is substantially
+reduced.
+.RE
+
A common use of
.B notmuch show
is to display a single thread of email messages. For this, use a
--
1.7.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/4] schemata: update for --body=true|false option
2012-07-23 16:17 [PATCH 0/4] Add a --body option to notmuch show Mark Walters
` (2 preceding siblings ...)
2012-07-23 16:17 ` [PATCH 3/4] man: update man page " Mark Walters
@ 2012-07-23 16:17 ` Mark Walters
3 siblings, 0 replies; 7+ messages in thread
From: Mark Walters @ 2012-07-23 16:17 UTC (permalink / raw)
To: notmuch
Previously body: was a compulsory field in a message. The new
--body=false option causes notmuch show to omit this field so update
schemata to reflect this.
---
devel/schemata | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/devel/schemata b/devel/schemata
index 6677a1c..9cb25f5 100644
--- a/devel/schemata
+++ b/devel/schemata
@@ -47,7 +47,7 @@ message = {
tags: [string*],
headers: headers,
- body: [part]
+ body?: [part] # omitted if --body=false
}
# A MIME part (format_part_json)
--
1.7.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/4] cli: add --body=true|false option to notmuch-show.c
2012-07-23 16:17 ` [PATCH 1/4] cli: add --body=true|false option to notmuch-show.c Mark Walters
@ 2012-07-23 16:43 ` Austin Clements
0 siblings, 0 replies; 7+ messages in thread
From: Austin Clements @ 2012-07-23 16:43 UTC (permalink / raw)
To: Mark Walters; +Cc: notmuch
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
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/4] man: update man page for the new --body=true|false option
2012-07-23 16:17 ` [PATCH 3/4] man: update man page " Mark Walters
@ 2012-07-23 16:52 ` Austin Clements
0 siblings, 0 replies; 7+ messages in thread
From: Austin Clements @ 2012-07-23 16:52 UTC (permalink / raw)
To: Mark Walters; +Cc: notmuch
Quoth Mark Walters on Jul 23 at 5:17 pm:
> ---
> man/man1/notmuch-show.1 | 16 ++++++++++++++++
> 1 files changed, 16 insertions(+), 0 deletions(-)
>
> diff --git a/man/man1/notmuch-show.1 b/man/man1/notmuch-show.1
> index 5fa590e..d781c47 100644
> --- a/man/man1/notmuch-show.1
> +++ b/man/man1/notmuch-show.1
> @@ -154,6 +154,22 @@ The default is
>
> .RE
>
> +.RS 4
> +.TP 4
> +.B \-\-body=(true|false)
> +
> +If true,
"If true (the default)"?
> +.B notmuch show
> +includes the bodies of the messages in the output whereas, if false,
The "whereas" is a bit awkward. Perhaps just a semicolon? "... in
the output; if false, bodies are omitted."?
> +they are omitted. It defaults to true. Note that
"Note that" is unnecessary here.
> +.B --body=false
> +is only implemented for the json format.
> +
> +This is useful if the caller is only interested in the headers as it
s/is only interested in/only needs/?
The "it" is a bit awkward, since it's not the option that's much
faster, but the output. "as body-less output is much faster and
substantially reduces the amount of output"?
> +is much faster and the amount of output data is substantially
> +reduced.
> +.RE
> +
> A common use of
> .B notmuch show
> is to display a single thread of email messages. For this, use a
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-07-23 16:52 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-23 16:17 [PATCH 0/4] Add a --body option to notmuch show Mark Walters
2012-07-23 16:17 ` [PATCH 1/4] cli: add --body=true|false option to notmuch-show.c Mark Walters
2012-07-23 16:43 ` Austin Clements
2012-07-23 16:17 ` [PATCH 2/4] test: add tests for the new --body=true|false option Mark Walters
2012-07-23 16:17 ` [PATCH 3/4] man: update man page " Mark Walters
2012-07-23 16:52 ` Austin Clements
2012-07-23 16:17 ` [PATCH 4/4] schemata: update for " Mark Walters
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).