[PATCH] cli: Support --include-html and --body=false for --format=text

Jani Nikula jani at nikula.org
Thu Oct 25 11:55:51 PDT 2018


On Thu, 25 Oct 2018, mawww at kakoune.org wrote:
> text format is convenient for shell based parsing of notmuch output,
> adding support for --include-html and --body=false improves its
> usefulness to write complex shell based scripts.

It's debatable whether parsing the --format=text output correctly is
convenient or not. Particularly for notmuch show I think the text format
output is basically legacy, and I don't think we're all that fond of
adding new features to it.

In any case, this patch has two independent changes in one, and should
be split.

BR,
Jani.


> ---
>   NEWS                      |  9 +++++++++
>   doc/man1/notmuch-show.rst | 15 ++++++++-------
>   notmuch-show.c            | 20 +++++++++++++++-----
>   test/T190-multipart.sh    | 24 ++++++++++++++++++++++++
>   4 files changed, 56 insertions(+), 12 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index ca3ba99e..6d7e7162 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -1,3 +1,12 @@
> +Notmuch 0.29 (UNRELEASED)
> +=========================
> +
> +Command Line Interface
> +----------------------
> +
> +`notmuch show` now supports --include-html and --body=false with
> +--format=text
> +
>   Notmuch 0.28 (2018-10-12)
>   =========================
>
> diff --git a/doc/man1/notmuch-show.rst b/doc/man1/notmuch-show.rst
> index 8bfa87c6..a2708a04 100644
> --- a/doc/man1/notmuch-show.rst
> +++ b/doc/man1/notmuch-show.rst
> @@ -176,18 +176,19 @@ Supported options for **show** include
>   ``--body=(true|false)``
>       If true (the default) **notmuch show** includes the bodies of the
>       messages in the output; if false, bodies are omitted.
> -    ``--body=false`` is only implemented for the json and sexp formats
> -    and it is incompatible with ``--part > 0.``
> +    ``--body=false`` is only implemented for the text, json and sexp
> +    formats and it is incompatible with ``--part > 0.``
>
>       This is useful if the caller only needs the headers as body-less
>       output is much faster and substantially smaller.
>
>   ``--include-html``
> -    Include "text/html" parts as part of the output (currently only
> -    supported with ``--format=json`` and ``--format=sexp``). By 
> default,
> -    unless ``--part=N`` is used to select a specific part or
> -    ``--include-html`` is used to include all "text/html" parts, no
> -    part with content type "text/html" is included in the output.
> +    Include "text/html" parts as part of the output (currently
> +    only supported with ``--format=text``, ``--format=json`` and
> +    ``--format=sexp``). By default, unless ``--part=N`` is used to
> +    select a specific part or ``--include-html`` is used to include all
> +    "text/html" parts, no part with content type "text/html" is 
> included
> +    in the output.
>
>   A common use of **notmuch show** is to display a single thread of email
>   messages. For this, use a search term of "thread:<thread-id>" as can be
> diff --git a/notmuch-show.c b/notmuch-show.c
> index c3a3783a..07e9a5db 100644
> --- a/notmuch-show.c
> +++ b/notmuch-show.c
> @@ -574,12 +574,18 @@ format_part_text (const void *ctx, sprinter_t *sp, 
> mime_node_t *node,
>   	g_mime_stream_printf (stream, "Date: %s\n", date_string);
>   	g_mime_stream_printf (stream, "\fheader}\n");
>
> +	if (!params->output_body)
> +	{
> +	    g_mime_stream_printf (stream, "\f%s}\n", part_type);
> +	    return NOTMUCH_STATUS_SUCCESS;
> +	}
>   	g_mime_stream_printf (stream, "\fbody{\n");
>       }
>
>       if (leaf) {
>   	if (g_mime_content_type_is_type (content_type, "text", "*") &&
> -	    !g_mime_content_type_is_type (content_type, "text", "html"))
> +	    (params->include_html ||
> +	     ! g_mime_content_type_is_type (content_type, "text", "html")))
>   	{
>   	    show_text_part_content (node->part, stream, 0);
>   	} else {
> @@ -1204,15 +1210,19 @@ notmuch_show_command (notmuch_config_t *config, 
> int argc, char *argv[])
>   	    fprintf (stderr, "Warning: --body=false is incompatible with 
> --part > 0. Disabling.\n");
>   	    params.output_body = true;
>   	} else {
> -	    if (format != NOTMUCH_FORMAT_JSON && format != 
> NOTMUCH_FORMAT_SEXP)
> +	    if (format != NOTMUCH_FORMAT_TEXT &&
> +		format != NOTMUCH_FORMAT_JSON &&
> +		format != NOTMUCH_FORMAT_SEXP)
>   		fprintf (stderr,
> -			 "Warning: --body=false only implemented for format=json and 
> format=sexp\n");
> +			 "Warning: --body=false only implemented for format=text, 
> format=json and format=sexp\n");
>   	}
>       }
>
>       if (params.include_html &&
> -        (format != NOTMUCH_FORMAT_JSON && format != 
> NOTMUCH_FORMAT_SEXP)) {
> -	fprintf (stderr, "Warning: --include-html only implemented for 
> format=json and format=sexp\n");
> +        (format != NOTMUCH_FORMAT_TEXT &&
> +	 format != NOTMUCH_FORMAT_JSON &&
> +	 format != NOTMUCH_FORMAT_SEXP)) {
> +	fprintf (stderr, "Warning: --include-html only implemented for 
> format=text, format=json and format=sexp\n");
>       }
>
>       query_string = query_string_from_args (config, argc-opt_index, 
> argv+opt_index);
> diff --git a/test/T190-multipart.sh b/test/T190-multipart.sh
> index 3eeac1db..9ad141cb 100755
> --- a/test/T190-multipart.sh
> +++ b/test/T190-multipart.sh
> @@ -190,6 +190,21 @@ Non-text part: application/pgp-signature
>   EOF
>   test_expect_equal_file EXPECTED OUTPUT
>
> +test_begin_subtest "--format=text --part=0 --body=false, message 
> header"
> +notmuch show --format=text --part=0  --body=false 
> 'id:87liy5ap00.fsf at yoom.home.cworth.org' >OUTPUT
> +cat <<EOF >EXPECTED
> +message{ id:87liy5ap00.fsf at yoom.home.cworth.org depth:0 match:1 
> excluded:0 filename:${MAIL_DIR}/multipart
> +header{
> +Carl Worth <cworth at cworth.org> (2001-01-05) (attachment inbox signed 
> unread)
> +Subject: Multipart message
> +From: Carl Worth <cworth at cworth.org>
> +To: cworth at cworth.org
> +Date: Fri, 05 Jan 2001 15:43:57 +0000
> +header}
> +message}
> +EOF
> +test_expect_equal_file EXPECTED OUTPUT
> +
>   test_begin_subtest "--format=text --part=1, message body"
>   notmuch show --format=text --part=1 
> 'id:87liy5ap00.fsf at yoom.home.cworth.org' >OUTPUT
>   cat <<EOF >EXPECTED
> @@ -310,6 +325,15 @@ Non-text part: text/html
>   EOF
>   test_expect_equal_file EXPECTED OUTPUT
>
> +test_begin_subtest "--format=text --include-html --part=5, rfc822's 
> html part"
> +notmuch show --format=text --include-html --part=5 
> 'id:87liy5ap00.fsf at yoom.home.cworth.org' >OUTPUT
> +cat <<EOF >EXPECTED
> +part{ ID: 5, Content-type: text/html
> +<p>This is an embedded message, with a multipart/alternative part.</p>
> +part}
> +EOF
> +test_expect_equal_file EXPECTED OUTPUT
> +
>   test_begin_subtest "--format=text --part=6, rfc822's text part"
>   notmuch show --format=text --part=6 
> 'id:87liy5ap00.fsf at yoom.home.cworth.org' >OUTPUT
>   cat <<EOF >EXPECTED
> -- 
> 2.14.5
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> https://notmuchmail.org/mailman/listinfo/notmuch


More information about the notmuch mailing list