diff --git a/lib/message-file.c b/lib/message-file.c index 67828827..483ba1e9 100644 --- a/lib/message-file.c +++ b/lib/message-file.c @@ -117,7 +117,7 @@ notmuch_message_file_close (notmuch_message_file_t *message) } static notmuch_bool_t -is_mbox (FILE *file) +_is_mbox (FILE *file) { char from_buf[5]; notmuch_bool_t ret = FALSE; @@ -139,13 +139,12 @@ _notmuch_message_file_parse (notmuch_message_file_t *message) GMimeParser *parser; notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; static int initialized = 0; + notmuch_bool_t is_mbox; if (message->message) return NOTMUCH_STATUS_SUCCESS; - /* We no longer support mboxes at all. */ - if (is_mbox (message->file)) - return NOTMUCH_STATUS_FILE_NOT_EMAIL; + is_mbox = _is_mbox (message->file); if (! initialized) { g_mime_init (GMIME_ENABLE_RFC2047_WORKAROUNDS); @@ -163,7 +162,7 @@ _notmuch_message_file_parse (notmuch_message_file_t *message) g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream), FALSE); parser = g_mime_parser_new_with_stream (stream); - g_mime_parser_set_scan_from (parser, FALSE); + g_mime_parser_set_scan_from (parser, is_mbox); message->message = g_mime_parser_construct_message (parser); if (! message->message) { @@ -171,6 +170,27 @@ _notmuch_message_file_parse (notmuch_message_file_t *message) goto DONE; } + if (is_mbox) { + if (! g_mime_parser_eos (parser)) { + /* This is a multi-message mbox. */ + status = NOTMUCH_STATUS_FILE_NOT_EMAIL; + goto DONE; + } + /* + * For historical reasons, we support single-message mboxes, + * but this behavior is likely to change in the future, so + * warn. + */ + static notmuch_bool_t mbox_warning = FALSE; + if (! mbox_warning) { + mbox_warning = TRUE; + fprintf (stderr, "\ +Warning: %s is an mbox containing a single message,\n\ +likely caused by misconfigured mail delivery. Support for single-message\n\ +mboxes is deprecated and may be removed in the future.\n", message->filename); + } + } + DONE: g_object_unref (stream); g_object_unref (parser); diff --git a/test/T050-new.sh b/test/T050-new.sh index 3c319542..ad46ee6d 100755 --- a/test/T050-new.sh +++ b/test/T050-new.sh @@ -163,6 +163,22 @@ rm -rf "${MAIL_DIR}"/two output=$(NOTMUCH_NEW) test_expect_equal "$output" "No new mail. Removed 3 messages." +test_begin_subtest "Support single-message mbox (deprecated)" +cat > "${MAIL_DIR}"/mbox_file1 < +To: Notmuch Test Suite +Subject: Test mbox message 1 + +Body. +EOF +output=$(NOTMUCH_NEW 2>&1) +test_expect_equal "$output" \ +"Warning: ${MAIL_DIR}/mbox_file1 is an mbox containing a single message, +likely caused by misconfigured mail delivery. Support for single-message +mboxes is deprecated and may be removed in the future. +Added 1 new message to the database." + # This test requires that notmuch new has been run at least once. test_begin_subtest "Skip and report non-mail files" generate_message @@ -184,24 +200,14 @@ Subject: Test mbox message 2 Body 2. EOF -cat > "${MAIL_DIR}"/mbox_file1 < -To: Notmuch Test Suite -Subject: Test mbox message 1 - -Body. -EOF output=$(NOTMUCH_NEW 2>&1) test_expect_equal "$output" \ "Note: Ignoring non-mail file: ${MAIL_DIR}/.git/config Note: Ignoring non-mail file: ${MAIL_DIR}/.ignored_hidden_file Note: Ignoring non-mail file: ${MAIL_DIR}/ignored_file Note: Ignoring non-mail file: ${MAIL_DIR}/mbox_file -Note: Ignoring non-mail file: ${MAIL_DIR}/mbox_file1 Added 1 new message to the database." rm "${MAIL_DIR}"/mbox_file -rm "${MAIL_DIR}"/mbox_file1 test_begin_subtest "Ignore files and directories specified in new.ignore" generate_message diff --git a/test/test-lib.sh b/test/test-lib.sh index 8697d6a7..17deaaba 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -1081,15 +1081,14 @@ export NOTMUCH_CONFIG=$NOTMUCH_CONFIG # Here's what we are using here: # -# --no-init-file Don't load users ~/.emacs -# -# --no-site-file Don't load the site-wide startup stuff +# --quick Use minimal customization. This implies --no-init-file, +# --no-site-file and (emacs 24) --no-site-lisp # # --directory Ensure that the local elisp sources are found # # --load Force loading of notmuch.el and test-lib.el -exec ${TEST_EMACS} --no-init-file --no-site-file \ +exec ${TEST_EMACS} --quick \ --directory "$TEST_DIRECTORY/../emacs" --load notmuch.el \ --directory "$TEST_DIRECTORY" --load test-lib.el \ "\$@"