1 Return-Path: <amthrax@drake.mit.edu>
\r
2 X-Original-To: notmuch@notmuchmail.org
\r
3 Delivered-To: notmuch@notmuchmail.org
\r
4 Received: from localhost (localhost [127.0.0.1])
\r
5 by olra.theworths.org (Postfix) with ESMTP id 2003D431FC3
\r
6 for <notmuch@notmuchmail.org>; Fri, 2 Mar 2012 21:20:43 -0800 (PST)
\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org
\r
11 X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5
\r
12 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled
\r
13 Received: from olra.theworths.org ([127.0.0.1])
\r
14 by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)
\r
15 with ESMTP id pm21u82kkZ1Q for <notmuch@notmuchmail.org>;
\r
16 Fri, 2 Mar 2012 21:20:39 -0800 (PST)
\r
17 Received: from dmz-mailsec-scanner-2.mit.edu (DMZ-MAILSEC-SCANNER-2.MIT.EDU
\r
19 by olra.theworths.org (Postfix) with ESMTP id A5BB2431FCB
\r
20 for <notmuch@notmuchmail.org>; Fri, 2 Mar 2012 21:20:33 -0800 (PST)
\r
21 X-AuditID: 1209190d-b7fbf6d0000008ba-e4-4f51aa21dc8c
\r
22 Received: from mailhub-auth-2.mit.edu ( [18.7.62.36])
\r
23 by dmz-mailsec-scanner-2.mit.edu (Symantec Messaging Gateway) with SMTP
\r
24 id 97.77.02234.12AA15F4; Sat, 3 Mar 2012 00:20:33 -0500 (EST)
\r
25 Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103])
\r
26 by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id q235KWOr030588;
\r
27 Sat, 3 Mar 2012 00:20:32 -0500
\r
28 Received: from drake.mit.edu
\r
29 (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com
\r
30 [209.6.116.242]) (authenticated bits=0)
\r
31 (User authenticated as amdragon@ATHENA.MIT.EDU)
\r
32 by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q235KVc4022259
\r
33 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);
\r
34 Sat, 3 Mar 2012 00:20:32 -0500 (EST)
\r
35 Received: from amthrax by drake.mit.edu with local (Exim 4.77)
\r
36 (envelope-from <amthrax@drake.mit.edu>)
\r
37 id 1S3hOR-0000h7-EZ; Sat, 03 Mar 2012 00:20:31 -0500
\r
38 From: Austin Clements <amdragon@MIT.EDU>
\r
39 To: notmuch@notmuchmail.org
\r
40 Subject: [PATCH 5/5] show: Convert raw format to the new self-recursive style
\r
41 Date: Sat, 3 Mar 2012 00:20:25 -0500
\r
42 Message-Id: <1330752025-2542-6-git-send-email-amdragon@mit.edu>
\r
43 X-Mailer: git-send-email 1.7.7.3
\r
44 In-Reply-To: <1330752025-2542-1-git-send-email-amdragon@mit.edu>
\r
45 References: <1330752025-2542-1-git-send-email-amdragon@mit.edu>
\r
46 X-Brightmail-Tracker:
\r
47 H4sIAAAAAAAAA+NgFtrMIsWRmVeSWpSXmKPExsUixG6noqu4KtDfoH0ri8X1mzOZHRg9nq26
\r
48 xRzAGMVlk5Kak1mWWqRvl8CV0XRnFUvBN9+Kv5vfMTcw/rPrYuTkkBAwkTj2eCU7hC0mceHe
\r
49 erYuRi4OIYF9jBJbl99hgXDWM0rcXt7CDuHcY5LYeOQAE4Qzn1Gic9cPJpB+NgENiW37lzOC
\r
50 2CIC0hI7785m7WLk4GAWUJP406UCEhYW8JW4/mEO2DoWAVWJJzOfM4PYvAL2Eo+mT2OFOENB
\r
51 4tzqc2A1nAIOEi3Hj4HFhYBqfvR3skxg5F/AyLCKUTYlt0o3NzEzpzg1Wbc4OTEvL7VI10gv
\r
52 N7NELzWldBMjKGw4JXl3ML47qHSIUYCDUYmH9+LLAH8h1sSy4srcQ4ySHExKorzlywP9hfiS
\r
53 8lMqMxKLM+KLSnNSiw8xSnAwK4nwLvMEyvGmJFZWpRblw6SkOViUxHlVtd75CQmkJ5akZqem
\r
54 FqQWwWRlODiUJHijVgI1ChalpqdWpGXmlCCkmTg4QYbzAA33AKnhLS5IzC3OTIfIn2JUlBLn
\r
55 zQVJCIAkMkrz4Hphcf2KURzoFWHeAJAqHmBKgOt+BTSYCWjw4st+IINLEhFSUg2M01VlxD2P
\r
56 7VA7IO8619/lZd+/yxbffsZabZZ5lG1p5VAYFqlQ+7J7/4WSeVIlZ92jblysijykbbhs8WJW
\r
57 np4vcpxmv/deaGuRWLc02evHHK9pR9Ym8nyeKeVvNjGBrYhNMV37lFiuwv+Q4CT96LeV+bEC
\r
58 gRL3dtxdWfx/luLU/MctO3/JGsgpsRRnJBpqMRcVJwIAJION5sYCAAA=
\r
59 X-BeenThere: notmuch@notmuchmail.org
\r
60 X-Mailman-Version: 2.1.13
\r
62 List-Id: "Use and development of the notmuch mail system."
\r
63 <notmuch.notmuchmail.org>
\r
64 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,
\r
65 <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>
\r
66 List-Archive: <http://notmuchmail.org/pipermail/notmuch>
\r
67 List-Post: <mailto:notmuch@notmuchmail.org>
\r
68 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>
\r
69 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,
\r
70 <mailto:notmuch-request@notmuchmail.org?subject=subscribe>
\r
71 X-List-Received-Date: Sat, 03 Mar 2012 05:20:43 -0000
\r
73 This is fully compatible for root and leaf parts, but drops support
\r
74 for interior parts. Showing interior parts in raw has always been
\r
75 braindead broken, so I don't think anyone will miss this. Tests have
\r
76 been updated to reflect this.
\r
78 The diff looks complicated, but the change is simple. We delete
\r
79 format_headers_message_part_text, since it's no longer needed; move
\r
80 the special-case code for --part=0 that used to be in do_show_single
\r
81 to format_part_raw; and re-indent the code for formatting leaf parts
\r
84 notmuch-show.c | 165 ++++++++++++++++++++++----------------------------------
\r
85 test/multipart | 51 ++++--------------
\r
86 2 files changed, 76 insertions(+), 140 deletions(-)
\r
88 diff --git a/notmuch-show.c b/notmuch-show.c
\r
89 index 6f6052c..9c2f890 100644
\r
90 --- a/notmuch-show.c
\r
91 +++ b/notmuch-show.c
\r
94 #include "notmuch-client.h"
\r
97 -format_headers_message_part_text (GMimeMessage *message);
\r
99 static notmuch_status_t
\r
100 format_part_text (const void *ctx, mime_node_t *node,
\r
101 int indent, const notmuch_show_params_t *params);
\r
102 @@ -56,23 +53,16 @@ static const notmuch_show_format_t format_mbox = {
\r
103 .message_set_end = ""
\r
107 -format_part_content_raw (GMimeObject *part);
\r
108 +static notmuch_status_t
\r
109 +format_part_raw (unused (const void *ctx), mime_node_t *node,
\r
110 + unused (int indent),
\r
111 + unused (const notmuch_show_params_t *params));
\r
113 static const notmuch_show_format_t format_raw = {
\r
116 - "", NULL, format_headers_message_part_text, "\n",
\r
121 - format_part_content_raw,
\r
127 + .message_set_start = "",
\r
128 + .part = format_part_raw,
\r
129 + .message_set_sep = "",
\r
130 + .message_set_end = ""
\r
133 static const char *
\r
134 @@ -210,27 +200,6 @@ _is_from_line (const char *line)
\r
138 -format_headers_message_part_text (GMimeMessage *message)
\r
140 - InternetAddressList *recipients;
\r
141 - const char *recipients_string;
\r
143 - printf ("Subject: %s\n", g_mime_message_get_subject (message));
\r
144 - printf ("From: %s\n", g_mime_message_get_sender (message));
\r
145 - recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);
\r
146 - recipients_string = internet_address_list_to_string (recipients, 0);
\r
147 - if (recipients_string)
\r
148 - printf ("To: %s\n",
\r
149 - recipients_string);
\r
150 - recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_CC);
\r
151 - recipients_string = internet_address_list_to_string (recipients, 0);
\r
152 - if (recipients_string)
\r
153 - printf ("Cc: %s\n",
\r
154 - recipients_string);
\r
155 - printf ("Date: %s\n", g_mime_message_get_date_as_string (message));
\r
159 format_headers_json (const void *ctx, GMimeMessage *message)
\r
161 void *local = talloc_new (ctx);
\r
162 @@ -731,31 +700,70 @@ format_part_mbox (const void *ctx, mime_node_t *node, unused (int indent),
\r
163 return NOTMUCH_STATUS_SUCCESS;
\r
167 -format_part_content_raw (GMimeObject *part)
\r
168 +static notmuch_status_t
\r
169 +format_part_raw (unused (const void *ctx), mime_node_t *node,
\r
170 + unused (int indent),
\r
171 + unused (const notmuch_show_params_t *params))
\r
173 - if (! GMIME_IS_PART (part))
\r
175 + if (node->envelope_file) {
\r
176 + const char *filename;
\r
181 - GMimeStream *stream_stdout;
\r
182 - GMimeStream *stream_filter = NULL;
\r
183 - GMimeDataWrapper *wrapper;
\r
184 + filename = notmuch_message_get_filename (node->envelope_file);
\r
185 + if (filename == NULL) {
\r
186 + fprintf (stderr, "Error: Cannot get message filename.\n");
\r
187 + return NOTMUCH_STATUS_FILE_ERROR;
\r
190 - stream_stdout = g_mime_stream_file_new (stdout);
\r
191 - g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
\r
192 + file = fopen (filename, "r");
\r
193 + if (file == NULL) {
\r
194 + fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror (errno));
\r
195 + return NOTMUCH_STATUS_FILE_ERROR;
\r
198 - stream_filter = g_mime_stream_filter_new (stream_stdout);
\r
199 + while (!feof (file)) {
\r
200 + size = fread (buf, 1, sizeof (buf), file);
\r
201 + if (ferror (file)) {
\r
202 + fprintf (stderr, "Error: Read failed from %s\n", filename);
\r
204 + return NOTMUCH_STATUS_FILE_ERROR;
\r
207 - wrapper = g_mime_part_get_content_object (GMIME_PART (part));
\r
208 + if (fwrite (buf, size, 1, stdout) != 1) {
\r
209 + fprintf (stderr, "Error: Write failed\n");
\r
211 + return NOTMUCH_STATUS_FILE_ERROR;
\r
215 - if (wrapper && stream_filter)
\r
216 - g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);
\r
218 + } else if (GMIME_IS_PART (node->part)) {
\r
219 + GMimeStream *stream_stdout;
\r
220 + GMimeStream *stream_filter = NULL;
\r
221 + GMimeDataWrapper *wrapper;
\r
223 - if (stream_filter)
\r
224 - g_object_unref (stream_filter);
\r
225 + stream_stdout = g_mime_stream_file_new (stdout);
\r
226 + g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
\r
228 - if (stream_stdout)
\r
229 - g_object_unref(stream_stdout);
\r
230 + stream_filter = g_mime_stream_filter_new (stream_stdout);
\r
232 + wrapper = g_mime_part_get_content_object (GMIME_PART (node->part));
\r
234 + if (wrapper && stream_filter)
\r
235 + g_mime_data_wrapper_write_to_stream (wrapper, stream_filter);
\r
237 + if (stream_filter)
\r
238 + g_object_unref (stream_filter);
\r
240 + if (stream_stdout)
\r
241 + g_object_unref(stream_stdout);
\r
243 + fprintf (stderr, "Error: Raw only supports root and leaf parts\n");
\r
244 + return NOTMUCH_STATUS_FILE_ERROR;
\r
246 + return NOTMUCH_STATUS_SUCCESS;
\r
249 static notmuch_status_t
\r
250 @@ -891,50 +899,7 @@ do_show_single (void *ctx,
\r
252 notmuch_message_set_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH, 1);
\r
254 - /* Special case for --format=raw of full single message, just cat out file */
\r
255 - if (params->raw && 0 == params->part) {
\r
257 - const char *filename;
\r
262 - filename = notmuch_message_get_filename (message);
\r
263 - if (filename == NULL) {
\r
264 - fprintf (stderr, "Error: Cannot message filename.\n");
\r
268 - file = fopen (filename, "r");
\r
269 - if (file == NULL) {
\r
270 - fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror (errno));
\r
274 - while (!feof (file)) {
\r
275 - size = fread (buf, 1, sizeof (buf), file);
\r
276 - if (ferror (file)) {
\r
277 - fprintf (stderr, "Error: Read failed from %s\n", filename);
\r
282 - if (fwrite (buf, size, 1, stdout) != 1) {
\r
283 - fprintf (stderr, "Error: Write failed\n");
\r
295 - return show_message (ctx, format, message, 0, params) != NOTMUCH_STATUS_SUCCESS;
\r
298 + return show_message (ctx, format, message, 0, params) != NOTMUCH_STATUS_SUCCESS;
\r
301 /* Formatted output of threads */
\r
302 diff --git a/test/multipart b/test/multipart
\r
303 index a3036b4..cb16b43 100755
\r
304 --- a/test/multipart
\r
305 +++ b/test/multipart
\r
306 @@ -448,59 +448,30 @@ notmuch show --format=raw --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUT
\r
307 test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart
\r
309 test_begin_subtest "--format=raw --part=1, message body"
\r
310 -notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
\r
311 -# output should *not* include newline
\r
313 +notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >&OUTPUT
\r
314 cat <<EOF >EXPECTED
\r
315 -Subject: html message
\r
316 -From: Carl Worth <cworth@cworth.org>
\r
317 -To: cworth@cworth.org
\r
318 -Date: Fri, 05 Jan 2001 15:42:57 +0000
\r
320 -<p>This is an embedded message, with a multipart/alternative part.</p>
\r
321 -This is an embedded message, with a multipart/alternative part.
\r
322 -This is a text attachment.
\r
323 -And this message is signed.
\r
326 ------BEGIN PGP SIGNATURE-----
\r
327 -Version: GnuPG v1.4.11 (GNU/Linux)
\r
329 -iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
\r
330 -W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
\r
332 ------END PGP SIGNATURE-----
\r
333 +Error: Raw only supports root and leaf parts
\r
335 test_expect_equal_file OUTPUT EXPECTED
\r
337 test_begin_subtest "--format=raw --part=2, multipart/mixed"
\r
338 -notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
\r
339 +notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >&OUTPUT
\r
340 cat <<EOF >EXPECTED
\r
341 -Subject: html message
\r
342 -From: Carl Worth <cworth@cworth.org>
\r
343 -To: cworth@cworth.org
\r
344 -Date: Fri, 05 Jan 2001 15:42:57 +0000
\r
346 -<p>This is an embedded message, with a multipart/alternative part.</p>
\r
347 -This is an embedded message, with a multipart/alternative part.
\r
348 -This is a text attachment.
\r
349 -And this message is signed.
\r
352 +Error: Raw only supports root and leaf parts
\r
354 test_expect_equal_file OUTPUT EXPECTED
\r
356 test_begin_subtest "--format=raw --part=3, rfc822 part"
\r
357 -test_subtest_known_broken
\r
359 -notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
\r
360 -test_expect_equal_file OUTPUT embedded_message
\r
361 +notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >&OUTPUT
\r
362 +cat <<EOF >EXPECTED
\r
363 +Error: Raw only supports root and leaf parts
\r
365 +test_expect_equal_file OUTPUT EXPECTED
\r
367 test_begin_subtest "--format=raw --part=4, rfc822's html part"
\r
368 -notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
\r
369 +notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >&OUTPUT
\r
370 cat <<EOF >EXPECTED
\r
371 -<p>This is an embedded message, with a multipart/alternative part.</p>
\r
372 -This is an embedded message, with a multipart/alternative part.
\r
373 +Error: Raw only supports root and leaf parts
\r
375 test_expect_equal_file OUTPUT EXPECTED
\r