* renamimg mime_node_* to notmuch_mime_node_*
@ 2019-03-23 14:45 David Bremner
2019-03-24 3:32 ` WIP: support gzipped message files David Bremner
0 siblings, 1 reply; 4+ messages in thread
From: David Bremner @ 2019-03-23 14:45 UTC (permalink / raw)
To: notmuch; +Cc: Daniel Kahn Gillmor
I've started working on allowing gzipped message files. The access in
libnotmuch is relatively centralized in message-file.c, and I've managed
to convert that to allow gzipped files [1]. However this is still direct
file access in the notmuch CLI, and at least mime-node.c and
notmuch-show.c will need to be updated. notmuch-show looks like a simple
gzopen / gzreadline substitution can do the trick, but mime-node.c will
require the same slightly trick work as I already did in
lib/message-file.c (_message_file_open_stream). I'd like to avoid
duplicate that. There seems to be two approaches: export some of the
_notmuch_message_file API and re-use that in mime-node.c, or put the
mime_node_* functions in the library. I'm not sure yet which of these
options is cleaner; I'd prefer not to expose GMime types as part of the
libnotmuch API. Does anyone have any arguments either way? Perhaps some
other motivation for pushing the mime-node stuff into libnotmuch?
CC'ing dkg as the last person to meaningfully edit mime-node.c
[1]: the (very) WIP is available at https://salsa.debian.org/bremner/notmuch/tree/wip/gzip
^ permalink raw reply [flat|nested] 4+ messages in thread
* WIP: support gzipped message files
2019-03-23 14:45 renamimg mime_node_* to notmuch_mime_node_* David Bremner
@ 2019-03-24 3:32 ` David Bremner
2019-03-24 3:32 ` [WIP 1/2] WIP: open gzipped files David Bremner
2019-03-24 3:32 ` [WIP 2/2] WIP/notmuch-show: support " David Bremner
0 siblings, 2 replies; 4+ messages in thread
From: David Bremner @ 2019-03-24 3:32 UTC (permalink / raw)
To: David Bremner, notmuch
It turned out neither of the approaches I suggested really supported a
clean API. On the other hand, by adding some new functions to
util/gmime-extra.c, I've managed to avoid too much code duplication.
This version seems to be working, but it needs a few more tests and
the usual polishing. Feedback on the g_mime_stream_gzfile_* internal
api is particularly welcome. Looking at mime_node_open, there might be
a slight performance improvement to use open instead of fopen (because
gmime is going to buffer anyway). So it might make more sense to have
g_mime_stream_gzfile_new take a file descriptor.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [WIP 1/2] WIP: open gzipped files
2019-03-24 3:32 ` WIP: support gzipped message files David Bremner
@ 2019-03-24 3:32 ` David Bremner
2019-03-24 3:32 ` [WIP 2/2] WIP/notmuch-show: support " David Bremner
1 sibling, 0 replies; 4+ messages in thread
From: David Bremner @ 2019-03-24 3:32 UTC (permalink / raw)
To: David Bremner, notmuch
This is enough to get notmuch-{new,search} working, but there is still
some direct file access in (at least) notmuch-show
---
lib/message-file.c | 44 +++++++----------
test/T740-gzip.sh | 115 +++++++++++++++++++++++++++++++++++++++++++++
| 48 +++++++++++++++++++
| 2 +
4 files changed, 182 insertions(+), 27 deletions(-)
create mode 100755 test/T740-gzip.sh
diff --git a/lib/message-file.c b/lib/message-file.c
index 8f0dbbda..5500baa0 100644
--- a/lib/message-file.c
+++ b/lib/message-file.c
@@ -26,11 +26,12 @@
#include <glib.h> /* GHashTable */
+#include <zlib.h> /* gzopen and friends */
+
struct _notmuch_message_file {
- /* File object */
- FILE *file;
char *filename;
+ GMimeStream *stream;
/* Cache for decoded headers */
GHashTable *headers;
@@ -46,9 +47,6 @@ _notmuch_message_file_destructor (notmuch_message_file_t *message)
if (message->message)
g_object_unref (message->message);
- if (message->file)
- fclose (message->file);
-
return 0;
}
@@ -64,15 +62,14 @@ _notmuch_message_file_open_ctx (notmuch_database_t *notmuch,
if (unlikely (message == NULL))
return NULL;
- /* Only needed for error messages during parsing. */
message->filename = talloc_strdup (message, filename);
if (message->filename == NULL)
goto FAIL;
talloc_set_destructor (message, _notmuch_message_file_destructor);
- message->file = fopen (filename, "r");
- if (message->file == NULL)
+ message->stream = g_mime_stream_gzfile_open (filename);
+ if (!message->stream)
goto FAIL;
return message;
@@ -105,25 +102,24 @@ _notmuch_message_file_close (notmuch_message_file_t *message)
}
static bool
-_is_mbox (FILE *file)
+_is_mbox (GMimeStream *stream)
{
- char from_buf[5];
- bool ret = false;
+ char buf[5];
+ int bytes_read;
- /* Is this mbox? */
- if (fread (from_buf, sizeof (from_buf), 1, file) == 1 &&
- strncmp (from_buf, "From ", 5) == 0)
- ret = true;
+ bytes_read = g_mime_stream_read (stream, buf, sizeof (buf));
- rewind (file);
+ if (bytes_read != sizeof(buf))
+ return false;
- return ret;
+ g_mime_stream_reset (stream);
+
+ return (strncmp (buf, "From ", 5) == 0);
}
notmuch_status_t
_notmuch_message_file_parse (notmuch_message_file_t *message)
{
- GMimeStream *stream;
GMimeParser *parser;
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
static int initialized = 0;
@@ -132,8 +128,6 @@ _notmuch_message_file_parse (notmuch_message_file_t *message)
if (message->message)
return NOTMUCH_STATUS_SUCCESS;
- is_mbox = _is_mbox (message->file);
-
if (! initialized) {
g_mime_init (GMIME_ENABLE_RFC2047_WORKAROUNDS);
initialized = 1;
@@ -144,12 +138,9 @@ _notmuch_message_file_parse (notmuch_message_file_t *message)
if (! message->headers)
return NOTMUCH_STATUS_OUT_OF_MEMORY;
- stream = g_mime_stream_file_new (message->file);
-
- /* We'll own and fclose the FILE* ourselves. */
- g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream), false);
+ is_mbox = _is_mbox (message->stream);
- parser = g_mime_parser_new_with_stream (stream);
+ parser = g_mime_parser_new_with_stream (message->stream);
g_mime_parser_set_scan_from (parser, is_mbox);
message->message = g_mime_parser_construct_message (parser);
@@ -167,7 +158,7 @@ _notmuch_message_file_parse (notmuch_message_file_t *message)
}
DONE:
- g_object_unref (stream);
+ g_object_unref (message->stream);
g_object_unref (parser);
if (status) {
@@ -179,7 +170,6 @@ _notmuch_message_file_parse (notmuch_message_file_t *message)
message->message = NULL;
}
- rewind (message->file);
}
return status;
diff --git a/test/T740-gzip.sh b/test/T740-gzip.sh
new file mode 100755
index 00000000..26f22aa0
--- /dev/null
+++ b/test/T740-gzip.sh
@@ -0,0 +1,115 @@
+#!/usr/bin/env bash
+test_description='support for gzipped messages'
+. $(dirname "$0")/test-lib.sh || exit 1
+
+#######################################################################
+# notmuch new
+test_begin_subtest "Single new message"
+generate_message
+gzip -9 $gen_msg_filename
+output=$(NOTMUCH_NEW --debug)
+test_expect_equal "$output" "Added 1 new message to the database."
+
+test_begin_subtest "Single message (full-scan)"
+generate_message
+gzip -9 $gen_msg_filename
+output=$(NOTMUCH_NEW --debug --full-scan 2>&1)
+test_expect_equal "$output" "Added 1 new message to the database."
+
+test_begin_subtest "Multiple new messages, one gzipped"
+generate_message
+gzip -9 $gen_msg_filename
+generate_message
+output=$(NOTMUCH_NEW --debug)
+test_expect_equal "$output" "Added 2 new messages to the database."
+
+test_begin_subtest "Multiple new messages (full-scan)"
+generate_message
+gzip -9 $gen_msg_filename
+generate_message
+output=$(NOTMUCH_NEW --debug --full-scan 2>&1)
+test_expect_equal "$output" "Added 2 new messages to the database."
+
+test_begin_subtest "Renamed (gzipped) message"
+generate_message
+echo $gen_message_filename
+notmuch new > /dev/null
+gzip $gen_msg_filename
+output=$(NOTMUCH_NEW --debug)
+test_expect_equal "$output" "(D) add_files, pass 2: queuing passed file ${gen_msg_filename} for deletion from database
+No new mail. Detected 1 file rename."
+
+######################################################################
+# notmuch search
+
+test_begin_subtest "notmuch search with partially gzipped mail store"
+notmuch search '*' | notmuch_search_sanitize > OUTPUT
+cat <<EOF > EXPECTED
+thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Single new message (inbox unread)
+thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Single message (full-scan) (inbox unread)
+thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Multiple new messages, one gzipped (inbox unread)
+thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Multiple new messages, one gzipped (inbox unread)
+thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Multiple new messages (full-scan) (inbox unread)
+thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Multiple new messages (full-scan) (inbox unread)
+thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Renamed (gzipped) message (inbox unread)
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest "notmuch search --output=files with partially gzipped mail store"
+notmuch search --output=files '*' | notmuch_search_files_sanitize > OUTPUT
+cat <<EOF > EXPECTED
+MAIL_DIR/msg-001.gz
+MAIL_DIR/msg-002.gz
+MAIL_DIR/msg-003.gz
+MAIL_DIR/msg-004
+MAIL_DIR/msg-005.gz
+MAIL_DIR/msg-006
+MAIL_DIR/msg-007.gz
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+######################################################################
+# notmuch show
+
+test_begin_subtest "show un-gzipped message"
+notmuch show id:msg-006@notmuch-test-suite | notmuch_show_sanitize > OUTPUT
+cat <<EOF > EXPECTED
+\fmessage{ id:msg-006@notmuch-test-suite depth:0 match:1 excluded:0 filename:/XXX/mail/msg-006
+\fheader{
+Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-05) (inbox unread)
+Subject: Multiple new messages (full-scan)
+From: Notmuch Test Suite <test_suite@notmuchmail.org>
+To: Notmuch Test Suite <test_suite@notmuchmail.org>
+Date: Fri, 05 Jan 2001 15:43:51 +0000
+\fheader}
+\fbody{
+\fpart{ ID: 1, Content-type: text/plain
+This is just a test message (#6)
+\fpart}
+\fbody}
+\fmessage}
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest "show gzipped message"
+test_subtest_known_broken
+notmuch show id:msg-007@notmuch-test-suite | notmuch_show_sanitize > OUTPUT
+cat <<EOF > EXPECTED
+\fmessage{ id:msg-007@notmuch-test-suite depth:0 match:1 excluded:0 filename:/XXX/mail/msg-007.gz
+\fheader{
+Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-05) (inbox unread)
+Subject: Renamed (gzipped) message
+From: Notmuch Test Suite <test_suite@notmuchmail.org>
+To: Notmuch Test Suite <test_suite@notmuchmail.org>
+Date: Fri, 05 Jan 2001 15:43:50 +0000
+\fheader}
+\fbody{
+\fpart{ ID: 1, Content-type: text/plain
+This is just a test message (#7)
+\fpart}
+\fbody}
+\fmessage}
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_done
--git a/util/gmime-extra.c b/util/gmime-extra.c
index bc1e3c4d..accff8b5 100644
--- a/util/gmime-extra.c
+++ b/util/gmime-extra.c
@@ -1,6 +1,54 @@
#include "gmime-extra.h"
#include <string.h>
+static
+GMimeStream *
+_gzfile_finish (GMimeStream *file_stream) {
+ char buf[4];
+ int bytes_read;
+
+ if ((bytes_read = g_mime_stream_read (file_stream, buf, sizeof (buf))) < 0)
+ return NULL;
+
+ if (g_mime_stream_reset (file_stream))
+ return NULL;
+
+ /* check for gzipped input */
+ if (bytes_read >= 2 && buf[0] == 0x1f && (unsigned char)buf[1] == 0x8b) {
+ GMimeStream *gzstream;
+
+ gzstream = g_mime_stream_filter_new (file_stream);
+ g_mime_stream_filter_add ((GMimeStreamFilter *)gzstream, g_mime_filter_gzip_new(GMIME_FILTER_GZIP_MODE_UNZIP, 0));
+ return gzstream;
+ } else {
+ return file_stream;
+ }
+}
+
+GMimeStream *
+g_mime_stream_gzfile_new (FILE *file)
+{
+ GMimeStream *file_stream;
+
+ file_stream = g_mime_stream_file_new (file);
+ if (! file_stream)
+ return NULL;
+
+ return _gzfile_finish (file_stream);
+}
+
+GMimeStream *
+g_mime_stream_gzfile_open (const char *filename)
+{
+ GMimeStream *file_stream;
+
+ file_stream = g_mime_stream_fs_open (filename, 0, 0, NULL);
+ if (! file_stream)
+ return NULL;
+
+ return _gzfile_finish (file_stream);
+}
+
GMimeStream *
g_mime_stream_stdout_new()
{
--git a/util/gmime-extra.h b/util/gmime-extra.h
index 5d8c52f7..597b8892 100644
--- a/util/gmime-extra.h
+++ b/util/gmime-extra.h
@@ -8,6 +8,8 @@ extern "C" {
#endif
GMimeStream *g_mime_stream_stdout_new(void);
+GMimeStream *g_mime_stream_gzfile_open (const char *filename);
+GMimeStream *g_mime_stream_gzfile_new (FILE *file);
#if (GMIME_MAJOR_VERSION < 3)
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [WIP 2/2] WIP/notmuch-show: support gzipped files
2019-03-24 3:32 ` WIP: support gzipped message files David Bremner
2019-03-24 3:32 ` [WIP 1/2] WIP: open gzipped files David Bremner
@ 2019-03-24 3:32 ` David Bremner
1 sibling, 0 replies; 4+ messages in thread
From: David Bremner @ 2019-03-24 3:32 UTC (permalink / raw)
To: David Bremner, notmuch
This drops "file" from mime_node_context and just uses a local variable.
---
mime-node.c | 18 ++++++---------
notmuch-show.c | 50 +++++++++++++++++++++++++----------------
test/T740-gzip.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 94 insertions(+), 31 deletions(-)
diff --git a/mime-node.c b/mime-node.c
index 2a24e537..a77acef0 100644
--- a/mime-node.c
+++ b/mime-node.c
@@ -27,7 +27,6 @@
typedef struct mime_node_context {
/* Per-message resources. These are allocated internally and must
* be destroyed. */
- FILE *file;
GMimeStream *stream;
GMimeParser *parser;
GMimeMessage *mime_message;
@@ -48,9 +47,6 @@ _mime_node_context_free (mime_node_context_t *res)
if (res->stream)
g_object_unref (res->stream);
- if (res->file)
- fclose (res->file);
-
return 0;
}
@@ -62,6 +58,7 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
mime_node_context_t *mctx;
mime_node_t *root;
notmuch_status_t status;
+ FILE *file;
root = talloc_zero (ctx, mime_node_t);
if (root == NULL) {
@@ -80,8 +77,8 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
talloc_set_destructor (mctx, _mime_node_context_free);
/* Fast path */
- mctx->file = fopen (filename, "r");
- if (! mctx->file) {
+ file = fopen (filename, "r");
+ if (! file) {
/* Slow path - for some reason the first file in the list is
* not available anymore. This is clearly a problem in the
* database, but we are not going to let this problem be a
@@ -92,13 +89,13 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
notmuch_filenames_move_to_next (filenames))
{
filename = notmuch_filenames_get (filenames);
- mctx->file = fopen (filename, "r");
- if (mctx->file)
+ file = fopen (filename, "r");
+ if (file)
break;
}
talloc_free (filenames);
- if (! mctx->file) {
+ if (! file) {
/* Give up */
fprintf (stderr, "Error opening %s: %s\n", filename, strerror (errno));
status = NOTMUCH_STATUS_FILE_ERROR;
@@ -106,13 +103,12 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
}
}
- mctx->stream = g_mime_stream_file_new (mctx->file);
+ mctx->stream = g_mime_stream_gzfile_new (file);
if (!mctx->stream) {
fprintf (stderr, "Out of memory.\n");
status = NOTMUCH_STATUS_OUT_OF_MEMORY;
goto DONE;
}
- g_mime_stream_file_set_owner (GMIME_STREAM_FILE (mctx->stream), false);
mctx->parser = g_mime_parser_new_with_stream (mctx->stream);
if (!mctx->parser) {
diff --git a/notmuch-show.c b/notmuch-show.c
index 07e9a5db..5f63b07e 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -21,6 +21,7 @@
#include "notmuch-client.h"
#include "gmime-filter-reply.h"
#include "sprinter.h"
+#include "zlib-extra.h"
static const char *
_get_tags_as_string (const void *ctx, notmuch_message_t *message)
@@ -781,7 +782,7 @@ format_part_mbox (const void *ctx, unused (sprinter_t *sp), mime_node_t *node,
notmuch_message_t *message = node->envelope_file;
const char *filename;
- FILE *file;
+ gzFile file;
const char *from;
time_t date;
@@ -789,14 +790,14 @@ format_part_mbox (const void *ctx, unused (sprinter_t *sp), mime_node_t *node,
char date_asctime[26];
char *line = NULL;
- size_t line_size;
+ ssize_t line_size;
ssize_t line_len;
if (!message)
INTERNAL_ERROR ("format_part_mbox requires a root part");
filename = notmuch_message_get_filename (message);
- file = fopen (filename, "r");
+ file = gzopen (filename, "r");
if (file == NULL) {
fprintf (stderr, "Failed to open %s: %s\n",
filename, strerror (errno));
@@ -812,7 +813,7 @@ format_part_mbox (const void *ctx, unused (sprinter_t *sp), mime_node_t *node,
printf ("From %s %s", from, date_asctime);
- while ((line_len = getline (&line, &line_size, file)) != -1 ) {
+ while ((line_len = gz_getline (message, &line, &line_size, file)) != UTIL_EOF ) {
if (_is_from_line (line))
putchar ('>');
printf ("%s", line);
@@ -820,7 +821,7 @@ format_part_mbox (const void *ctx, unused (sprinter_t *sp), mime_node_t *node,
printf ("\n");
- fclose (file);
+ gzclose (file);
return NOTMUCH_STATUS_SUCCESS;
}
@@ -833,39 +834,50 @@ format_part_raw (unused (const void *ctx), unused (sprinter_t *sp),
if (node->envelope_file) {
/* Special case the entire message to avoid MIME parsing. */
const char *filename;
- FILE *file;
+ gzFile file = NULL;
size_t size;
char buf[4096];
+ notmuch_status_t ret = NOTMUCH_STATUS_FILE_ERROR;
filename = notmuch_message_get_filename (node->envelope_file);
if (filename == NULL) {
fprintf (stderr, "Error: Cannot get message filename.\n");
- return NOTMUCH_STATUS_FILE_ERROR;
+ goto DONE;
}
- file = fopen (filename, "r");
+ file = gzopen (filename, "r");
if (file == NULL) {
fprintf (stderr, "Error: Cannot open file %s: %s\n", filename, strerror (errno));
- return NOTMUCH_STATUS_FILE_ERROR;
+ goto DONE;
}
- 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;
+ while (!gzeof (file)) {
+ size = gzread (file, buf, 1);
+ if (size != 1) {
+ int zlib_status = 0;
+ gzerror (file, &zlib_status);
+ if (zlib_status == Z_OK)
+ break;
+ else {
+ fprintf (stderr, "Error: Read failed from %s\n", filename);
+ }
+ goto DONE;
}
if (fwrite (buf, size, 1, stdout) != 1) {
fprintf (stderr, "Error: Write failed\n");
- fclose (file);
- return NOTMUCH_STATUS_FILE_ERROR;
+ goto DONE;
}
}
- fclose (file);
- return NOTMUCH_STATUS_SUCCESS;
+ ret = NOTMUCH_STATUS_SUCCESS;
+
+ /* XXX This DONE is just for the special case of a node in a single file */
+ DONE:
+ if (file)
+ gzclose (file);
+
+ return ret;
}
GMimeStream *stream_filter = g_mime_stream_filter_new (params->out_stream);
diff --git a/test/T740-gzip.sh b/test/T740-gzip.sh
index 26f22aa0..e4c72b8a 100755
--- a/test/T740-gzip.sh
+++ b/test/T740-gzip.sh
@@ -91,8 +91,35 @@ This is just a test message (#6)
EOF
test_expect_equal_file EXPECTED OUTPUT
+test_begin_subtest "show un-gzipped message (format mbox)"
+notmuch show --format=mbox id:msg-006@notmuch-test-suite | notmuch_show_sanitize > OUTPUT
+cat <<EOF > EXPECTED
+From test_suite@notmuchmail.org Fri Jan 5 15:43:51 2001
+From: Notmuch Test Suite <test_suite@notmuchmail.org>
+To: Notmuch Test Suite <test_suite@notmuchmail.org>
+Message-Id: <msg-006@notmuch-test-suite>
+Subject: Multiple new messages (full-scan)
+Date: Fri, 05 Jan 2001 15:43:51 +0000
+
+This is just a test message (#6)
+
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest "show un-gzipped message (format raw)"
+notmuch show --format=raw id:msg-006@notmuch-test-suite | notmuch_show_sanitize > OUTPUT
+cat <<EOF > EXPECTED
+From: Notmuch Test Suite <test_suite@notmuchmail.org>
+To: Notmuch Test Suite <test_suite@notmuchmail.org>
+Message-Id: <msg-006@notmuch-test-suite>
+Subject: Multiple new messages (full-scan)
+Date: Fri, 05 Jan 2001 15:43:51 +0000
+
+This is just a test message (#6)
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
test_begin_subtest "show gzipped message"
-test_subtest_known_broken
notmuch show id:msg-007@notmuch-test-suite | notmuch_show_sanitize > OUTPUT
cat <<EOF > EXPECTED
\fmessage{ id:msg-007@notmuch-test-suite depth:0 match:1 excluded:0 filename:/XXX/mail/msg-007.gz
@@ -112,4 +139,32 @@ This is just a test message (#7)
EOF
test_expect_equal_file EXPECTED OUTPUT
+test_begin_subtest "show gzipped message (mbox)"
+notmuch show --format=mbox id:msg-007@notmuch-test-suite | notmuch_show_sanitize > OUTPUT
+cat <<EOF > EXPECTED
+From test_suite@notmuchmail.org Fri Jan 5 15:43:50 2001
+From: Notmuch Test Suite <test_suite@notmuchmail.org>
+To: Notmuch Test Suite <test_suite@notmuchmail.org>
+Message-Id: <msg-007@notmuch-test-suite>
+Subject: Renamed (gzipped) message
+Date: Fri, 05 Jan 2001 15:43:50 +0000
+
+This is just a test message (#7)
+
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
+test_begin_subtest "show gzipped message (raw)"
+notmuch show --format=raw id:msg-007@notmuch-test-suite | notmuch_show_sanitize > OUTPUT
+cat <<EOF > EXPECTED
+From: Notmuch Test Suite <test_suite@notmuchmail.org>
+To: Notmuch Test Suite <test_suite@notmuchmail.org>
+Message-Id: <msg-007@notmuch-test-suite>
+Subject: Renamed (gzipped) message
+Date: Fri, 05 Jan 2001 15:43:50 +0000
+
+This is just a test message (#7)
+EOF
+test_expect_equal_file EXPECTED OUTPUT
+
test_done
--
2.20.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-03-24 3:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-23 14:45 renamimg mime_node_* to notmuch_mime_node_* David Bremner
2019-03-24 3:32 ` WIP: support gzipped message files David Bremner
2019-03-24 3:32 ` [WIP 1/2] WIP: open gzipped files David Bremner
2019-03-24 3:32 ` [WIP 2/2] WIP/notmuch-show: support " David Bremner
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).