From: Austin Clements Date: Sat, 3 Mar 2012 05:20:25 +0000 (+1900) Subject: [PATCH 5/5] show: Convert raw format to the new self-recursive style X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=d4db3f15638c5a6c98d4370f11bcfaec442cb3c6;p=notmuch-archives.git [PATCH 5/5] show: Convert raw format to the new self-recursive style --- diff --git a/87/aa9f67105d97e808ddf9562652f0f2f56ce301 b/87/aa9f67105d97e808ddf9562652f0f2f56ce301 new file mode 100644 index 000000000..417867aa9 --- /dev/null +++ b/87/aa9f67105d97e808ddf9562652f0f2f56ce301 @@ -0,0 +1,379 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 2003D431FC3 + for ; Fri, 2 Mar 2012 21:20:43 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -0.7 +X-Spam-Level: +X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id pm21u82kkZ1Q for ; + Fri, 2 Mar 2012 21:20:39 -0800 (PST) +Received: from dmz-mailsec-scanner-2.mit.edu (DMZ-MAILSEC-SCANNER-2.MIT.EDU + [18.9.25.13]) + by olra.theworths.org (Postfix) with ESMTP id A5BB2431FCB + for ; Fri, 2 Mar 2012 21:20:33 -0800 (PST) +X-AuditID: 1209190d-b7fbf6d0000008ba-e4-4f51aa21dc8c +Received: from mailhub-auth-2.mit.edu ( [18.7.62.36]) + by dmz-mailsec-scanner-2.mit.edu (Symantec Messaging Gateway) with SMTP + id 97.77.02234.12AA15F4; Sat, 3 Mar 2012 00:20:33 -0500 (EST) +Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) + by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id q235KWOr030588; + Sat, 3 Mar 2012 00:20:32 -0500 +Received: from drake.mit.edu + (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com + [209.6.116.242]) (authenticated bits=0) + (User authenticated as amdragon@ATHENA.MIT.EDU) + by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q235KVc4022259 + (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); + Sat, 3 Mar 2012 00:20:32 -0500 (EST) +Received: from amthrax by drake.mit.edu with local (Exim 4.77) + (envelope-from ) + id 1S3hOR-0000h7-EZ; Sat, 03 Mar 2012 00:20:31 -0500 +From: Austin Clements +To: notmuch@notmuchmail.org +Subject: [PATCH 5/5] show: Convert raw format to the new self-recursive style +Date: Sat, 3 Mar 2012 00:20:25 -0500 +Message-Id: <1330752025-2542-6-git-send-email-amdragon@mit.edu> +X-Mailer: git-send-email 1.7.7.3 +In-Reply-To: <1330752025-2542-1-git-send-email-amdragon@mit.edu> +References: <1330752025-2542-1-git-send-email-amdragon@mit.edu> +X-Brightmail-Tracker: + H4sIAAAAAAAAA+NgFtrMIsWRmVeSWpSXmKPExsUixG6noqu4KtDfoH0ri8X1mzOZHRg9nq26 + xRzAGMVlk5Kak1mWWqRvl8CV0XRnFUvBN9+Kv5vfMTcw/rPrYuTkkBAwkTj2eCU7hC0mceHe + erYuRi4OIYF9jBJbl99hgXDWM0rcXt7CDuHcY5LYeOQAE4Qzn1Gic9cPJpB+NgENiW37lzOC + 2CIC0hI7785m7WLk4GAWUJP406UCEhYW8JW4/mEO2DoWAVWJJzOfM4PYvAL2Eo+mT2OFOENB + 4tzqc2A1nAIOEi3Hj4HFhYBqfvR3skxg5F/AyLCKUTYlt0o3NzEzpzg1Wbc4OTEvL7VI10gv + N7NELzWldBMjKGw4JXl3ML47qHSIUYCDUYmH9+LLAH8h1sSy4srcQ4ySHExKorzlywP9hfiS + 8lMqMxKLM+KLSnNSiw8xSnAwK4nwLvMEyvGmJFZWpRblw6SkOViUxHlVtd75CQmkJ5akZqem + FqQWwWRlODiUJHijVgI1ChalpqdWpGXmlCCkmTg4QYbzAA33AKnhLS5IzC3OTIfIn2JUlBLn + zQVJCIAkMkrz4Hphcf2KURzoFWHeAJAqHmBKgOt+BTSYCWjw4st+IINLEhFSUg2M01VlxD2P + 7VA7IO8619/lZd+/yxbffsZabZZ5lG1p5VAYFqlQ+7J7/4WSeVIlZ92jblysijykbbhs8WJW + np4vcpxmv/deaGuRWLc02evHHK9pR9Ym8nyeKeVvNjGBrYhNMV37lFiuwv+Q4CT96LeV+bEC + gRL3dtxdWfx/luLU/MctO3/JGsgpsRRnJBpqMRcVJwIAJION5sYCAAA= +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +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: Sat, 03 Mar 2012 05:20:43 -0000 + +This is fully compatible for root and leaf parts, but drops support +for interior parts. Showing interior parts in raw has always been +braindead broken, so I don't think anyone will miss this. Tests have +been updated to reflect this. + +The diff looks complicated, but the change is simple. We delete +format_headers_message_part_text, since it's no longer needed; move +the special-case code for --part=0 that used to be in do_show_single +to format_part_raw; and re-indent the code for formatting leaf parts +in format_part_raw. +--- + notmuch-show.c | 165 ++++++++++++++++++++++---------------------------------- + test/multipart | 51 ++++-------------- + 2 files changed, 76 insertions(+), 140 deletions(-) + +diff --git a/notmuch-show.c b/notmuch-show.c +index 6f6052c..9c2f890 100644 +--- a/notmuch-show.c ++++ b/notmuch-show.c +@@ -20,9 +20,6 @@ + + #include "notmuch-client.h" + +-static void +-format_headers_message_part_text (GMimeMessage *message); +- + static notmuch_status_t + format_part_text (const void *ctx, mime_node_t *node, + int indent, const notmuch_show_params_t *params); +@@ -56,23 +53,16 @@ static const notmuch_show_format_t format_mbox = { + .message_set_end = "" + }; + +-static void +-format_part_content_raw (GMimeObject *part); ++static notmuch_status_t ++format_part_raw (unused (const void *ctx), mime_node_t *node, ++ unused (int indent), ++ unused (const notmuch_show_params_t *params)); + + static const notmuch_show_format_t format_raw = { +- "", NULL, +- "", NULL, +- "", NULL, format_headers_message_part_text, "\n", +- "", +- NULL, +- NULL, +- NULL, +- format_part_content_raw, +- NULL, +- "", +- "", +- "", "", +- "" ++ .message_set_start = "", ++ .part = format_part_raw, ++ .message_set_sep = "", ++ .message_set_end = "" + }; + + static const char * +@@ -210,27 +200,6 @@ _is_from_line (const char *line) + } + + static void +-format_headers_message_part_text (GMimeMessage *message) +-{ +- InternetAddressList *recipients; +- const char *recipients_string; +- +- printf ("Subject: %s\n", g_mime_message_get_subject (message)); +- printf ("From: %s\n", g_mime_message_get_sender (message)); +- recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO); +- recipients_string = internet_address_list_to_string (recipients, 0); +- if (recipients_string) +- printf ("To: %s\n", +- recipients_string); +- recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC); +- recipients_string = internet_address_list_to_string (recipients, 0); +- if (recipients_string) +- printf ("Cc: %s\n", +- recipients_string); +- printf ("Date: %s\n", g_mime_message_get_date_as_string (message)); +-} +- +-static void + format_headers_json (const void *ctx, GMimeMessage *message) + { + void *local = talloc_new (ctx); +@@ -731,31 +700,70 @@ format_part_mbox (const void *ctx, mime_node_t *node, unused (int indent), + return NOTMUCH_STATUS_SUCCESS; + } + +-static void +-format_part_content_raw (GMimeObject *part) ++static notmuch_status_t ++format_part_raw (unused (const void *ctx), mime_node_t *node, ++ unused (int indent), ++ unused (const notmuch_show_params_t *params)) + { +- if (! GMIME_IS_PART (part)) +- return; ++ if (node->envelope_file) { ++ const char *filename; ++ FILE *file; ++ size_t size; ++ char buf[4096]; + +- GMimeStream *stream_stdout; +- GMimeStream *stream_filter = NULL; +- GMimeDataWrapper *wrapper; ++ filename = notmuch_message_get_filename (node->envelope_file); ++ if (filename == NULL) { ++ fprintf (stderr, "Error: Cannot get message filename.\n"); ++ return NOTMUCH_STATUS_FILE_ERROR; ++ } + +- stream_stdout = g_mime_stream_file_new (stdout); +- g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); ++ file = fopen (filename, "r"); ++ if (file == NULL) { ++ fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror (errno)); ++ return NOTMUCH_STATUS_FILE_ERROR; ++ } + +- stream_filter = g_mime_stream_filter_new (stream_stdout); ++ while (!feof (file)) { ++ size = fread (buf, 1, sizeof (buf), file); ++ if (ferror (file)) { ++ fprintf (stderr, "Error: Read failed from %s\n", filename); ++ fclose (file); ++ return NOTMUCH_STATUS_FILE_ERROR; ++ } + +- wrapper = g_mime_part_get_content_object (GMIME_PART (part)); ++ if (fwrite (buf, size, 1, stdout) != 1) { ++ fprintf (stderr, "Error: Write failed\n"); ++ fclose (file); ++ return NOTMUCH_STATUS_FILE_ERROR; ++ } ++ } + +- if (wrapper && stream_filter) +- g_mime_data_wrapper_write_to_stream (wrapper, stream_filter); ++ fclose (file); ++ } else if (GMIME_IS_PART (node->part)) { ++ GMimeStream *stream_stdout; ++ GMimeStream *stream_filter = NULL; ++ GMimeDataWrapper *wrapper; + +- if (stream_filter) +- g_object_unref (stream_filter); ++ stream_stdout = g_mime_stream_file_new (stdout); ++ g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE); + +- if (stream_stdout) +- g_object_unref(stream_stdout); ++ stream_filter = g_mime_stream_filter_new (stream_stdout); ++ ++ wrapper = g_mime_part_get_content_object (GMIME_PART (node->part)); ++ ++ if (wrapper && stream_filter) ++ g_mime_data_wrapper_write_to_stream (wrapper, stream_filter); ++ ++ if (stream_filter) ++ g_object_unref (stream_filter); ++ ++ if (stream_stdout) ++ g_object_unref(stream_stdout); ++ } else { ++ fprintf (stderr, "Error: Raw only supports root and leaf parts\n"); ++ return NOTMUCH_STATUS_FILE_ERROR; ++ } ++ return NOTMUCH_STATUS_SUCCESS; + } + + static notmuch_status_t +@@ -891,50 +899,7 @@ do_show_single (void *ctx, + + notmuch_message_set_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH, 1); + +- /* Special case for --format=raw of full single message, just cat out file */ +- if (params->raw && 0 == params->part) { +- +- const char *filename; +- FILE *file; +- size_t size; +- char buf[4096]; +- +- filename = notmuch_message_get_filename (message); +- if (filename == NULL) { +- fprintf (stderr, "Error: Cannot message filename.\n"); +- return 1; +- } +- +- file = fopen (filename, "r"); +- if (file == NULL) { +- fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror (errno)); +- return 1; +- } +- +- while (!feof (file)) { +- size = fread (buf, 1, sizeof (buf), file); +- if (ferror (file)) { +- fprintf (stderr, "Error: Read failed from %s\n", filename); +- fclose (file); +- return 1; +- } +- +- if (fwrite (buf, size, 1, stdout) != 1) { +- fprintf (stderr, "Error: Write failed\n"); +- fclose (file); +- return 1; +- } +- } +- +- fclose (file); +- +- return 0; +- +- } else { +- +- return show_message (ctx, format, message, 0, params) != NOTMUCH_STATUS_SUCCESS; +- +- } ++ return show_message (ctx, format, message, 0, params) != NOTMUCH_STATUS_SUCCESS; + } + + /* Formatted output of threads */ +diff --git a/test/multipart b/test/multipart +index a3036b4..cb16b43 100755 +--- a/test/multipart ++++ b/test/multipart +@@ -448,59 +448,30 @@ notmuch show --format=raw --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUT + test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart + + test_begin_subtest "--format=raw --part=1, message body" +-notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT +-# output should *not* include newline +-echo >>OUTPUT ++notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >&OUTPUT + cat <EXPECTED +-Subject: html message +-From: Carl Worth +-To: cworth@cworth.org +-Date: Fri, 05 Jan 2001 15:42:57 +0000 +- +-

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

+-This is an embedded message, with a multipart/alternative part. +-This is a text attachment. +-And this message is signed. +- +--Carl +------BEGIN PGP SIGNATURE----- +-Version: GnuPG v1.4.11 (GNU/Linux) +- +-iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD +-W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE +-=zkga +------END PGP SIGNATURE----- ++Error: Raw only supports root and leaf parts + EOF + test_expect_equal_file OUTPUT EXPECTED + + test_begin_subtest "--format=raw --part=2, multipart/mixed" +-notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT ++notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >&OUTPUT + cat <EXPECTED +-Subject: html message +-From: Carl Worth +-To: cworth@cworth.org +-Date: Fri, 05 Jan 2001 15:42:57 +0000 +- +-

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

+-This is an embedded message, with a multipart/alternative part. +-This is a text attachment. +-And this message is signed. +- +--Carl ++Error: Raw only supports root and leaf parts + EOF + test_expect_equal_file OUTPUT EXPECTED + + test_begin_subtest "--format=raw --part=3, rfc822 part" +-test_subtest_known_broken +- +-notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT +-test_expect_equal_file OUTPUT embedded_message ++notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >&OUTPUT ++cat <EXPECTED ++Error: Raw only supports root and leaf parts ++EOF ++test_expect_equal_file OUTPUT EXPECTED + + test_begin_subtest "--format=raw --part=4, rfc822's html part" +-notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT ++notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >&OUTPUT + cat <EXPECTED +-

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

+-This is an embedded message, with a multipart/alternative part. ++Error: Raw only supports root and leaf parts + EOF + test_expect_equal_file OUTPUT EXPECTED + +-- +1.7.7.3 +