From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id 019BA6DE01F4 for ; Wed, 24 Oct 2018 18:53:47 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -0.001 X-Spam-Level: X-Spam-Status: No, score=-0.001 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id te0OZ0KDAP0F for ; Wed, 24 Oct 2018 18:53:45 -0700 (PDT) X-Greylist: delayed 575 seconds by postgrey-1.36 at arlo; Wed, 24 Oct 2018 18:53:45 PDT Received: from 10.mo69.mail-out.ovh.net (10.mo69.mail-out.ovh.net [46.105.73.241]) by arlo.cworth.org (Postfix) with ESMTPS id 86CA06DE0140 for ; Wed, 24 Oct 2018 18:53:45 -0700 (PDT) Received: from player776.ha.ovh.net (unknown [10.109.160.153]) by mo69.mail-out.ovh.net (Postfix) with ESMTP id D50C62E333 for ; Thu, 25 Oct 2018 03:44:06 +0200 (CEST) Received: from RCM-web5.webmail.mail.ovh.net (unknown.telstraglobal.net [210.176.38.190]) (Authenticated sender: mawww@kakoune.org) by player776.ha.ovh.net (Postfix) with ESMTPSA id 97A6140008C for ; Thu, 25 Oct 2018 03:44:05 +0200 (CEST) Received: from unknown.telstraglobal.net ([210.176.38.190]) via unknown.telstraglobal.net ([210.176.38.190]) by mail.ovh.net with HTTP (HTTP/1.1 POST); Thu, 25 Oct 2018 03:44:05 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Thu, 25 Oct 2018 12:44:05 +1100 From: mawww@kakoune.org To: notmuch@notmuchmail.org Subject: [PATCH] cli: Support --include-html and --body=false for --format=text Message-ID: <31d73dc7587ea4ee45c176e345f7cb3d@kakoune.org> X-Sender: mawww@kakoune.org User-Agent: Roundcube Webmail/1.3.7 X-Originating-IP: 210.176.38.190 X-Webmail-UserID: mawww@kakoune.org X-Ovh-Tracer-Id: 2298243188389648149 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedtkedrgeekgdeglecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecu X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Oct 2018 01:53:47 -0000 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. --- 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:" 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@yoom.home.cworth.org' >OUTPUT +cat <EXPECTED + message{ id:87liy5ap00.fsf@yoom.home.cworth.org depth:0 match:1 excluded:0 filename:${MAIL_DIR}/multipart + header{ +Carl Worth (2001-01-05) (attachment inbox signed unread) +Subject: Multipart message +From: Carl Worth +To: cworth@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@yoom.home.cworth.org' >OUTPUT cat <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@yoom.home.cworth.org' >OUTPUT +cat <EXPECTED + part{ ID: 5, Content-type: text/html +

This is an embedded message, with a multipart/alternative part.

+ 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@yoom.home.cworth.org' >OUTPUT cat <EXPECTED -- 2.14.5