aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.dir-locals.el24
-rw-r--r--.gitignore1
-rw-r--r--TODO11
-rw-r--r--bindings/python/notmuch/database.py10
-rw-r--r--bindings/python/notmuch/tag.py12
-rw-r--r--compat/README2
-rw-r--r--completion/Makefile2
-rwxr-xr-xconfigure4
-rw-r--r--emacs/Makefile2
-rw-r--r--emacs/Makefile.local2
-rw-r--r--emacs/notmuch-hello.el2
-rw-r--r--emacs/notmuch-lib.el2
-rw-r--r--emacs/notmuch-maildir-fcc.el2
-rw-r--r--emacs/notmuch-show.el6
-rw-r--r--emacs/notmuch-wash.el2
-rw-r--r--emacs/notmuch.el6
-rw-r--r--gmime-filter-headers.h2
-rw-r--r--lib/Makefile2
-rw-r--r--lib/Makefile.local7
-rw-r--r--lib/database.cc12
-rw-r--r--lib/libsha1.c2
-rw-r--r--lib/libsha1.h2
-rw-r--r--lib/message.cc2
-rw-r--r--lib/notmuch.h4
-rw-r--r--notmuch-config.c2
-rw-r--r--notmuch-new.c31
-rw-r--r--notmuch-reply.c4
-rw-r--r--notmuch-show.c24
-rw-r--r--notmuch.16
-rw-r--r--notmuch.c2
-rw-r--r--packaging/debian4
-rw-r--r--test/Makefile2
-rw-r--r--test/README22
-rwxr-xr-xtest/basic10
-rw-r--r--test/corpus/cur/51:2,12
-rwxr-xr-xtest/crypto7
-rwxr-xr-xtest/emacs184
-rwxr-xr-xtest/emacs-large-search-buffer23
-rwxr-xr-xtest/maildir-sync10
-rwxr-xr-xtest/multipart15
-rwxr-xr-xtest/new9
-rwxr-xr-xtest/search-by-folder2
-rwxr-xr-xtest/search-folder-coherence1
-rwxr-xr-xtest/search-output2
-rwxr-xr-xtest/symbol-hiding4
-rw-r--r--test/test-lib.el31
-rwxr-xr-xtest/test-lib.sh95
-rwxr-xr-xtest/uuencode4
-rw-r--r--vim/README7
-rw-r--r--vim/plugin/notmuch.vim42
50 files changed, 424 insertions, 254 deletions
diff --git a/.dir-locals.el b/.dir-locals.el
index cbdb1f97..aea630bd 100644
--- a/.dir-locals.el
+++ b/.dir-locals.el
@@ -1,7 +1,23 @@
; emacs local configuration settings for notmuch source
; surmised by dkg on 2010-11-23 13:43:18-0500
+; amended by amdragon on 2011-06-06
-((c-mode . ((indent-tabs-mode . t)
- (tab-width . 8)
- (c-basic-offset . 4)
- (c-file-style . "linux"))))
+((c-mode
+ (indent-tabs-mode . t)
+ (tab-width . 8)
+ (c-basic-offset . 4)
+ (c-file-style . "linux"))
+ (c++-mode
+ (indent-tabs-mode . t)
+ (tab-width . 8)
+ (c-basic-offset . 4)
+ (c-file-style . "linux"))
+ (emacs-lisp-mode
+ (indent-tabs-mode . t)
+ (tab-width . 8))
+ (shell-mode
+ (indent-tabs-mode . t)
+ (tab-width . 8)
+ (sh-basic-offset . 4)
+ (sh-indentation . 4))
+ )
diff --git a/.gitignore b/.gitignore
index 217440d5..02ab0044 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ tags
*cscope*
.deps
notmuch
+notmuch.sym
notmuch-shared
notmuch.1.gz
libnotmuch.so*
diff --git a/TODO b/TODO
index 260ffe18..4dda6f46 100644
--- a/TODO
+++ b/TODO
@@ -15,7 +15,9 @@ result.) This may require removing the outer array from the current
"notmuch search --format=json" results.
Fix '*' to work by simply calling '+' or '-' on a region consisting of
-the entire buffer.
+the entire buffer, (this would avoid one race condition---while still
+leaving other race conditions---but could also potentially make '*' a
+very expensive operation).
Add a global keybinding table for notmuch, and then view-specific
tables that add to it.
@@ -29,7 +31,7 @@ Make 'notmuch-show-pipe-message have a private history.
Add support for a delete keybinding that adds a "deleted" tag to the
current message/thread and make searches not return deleted messages
-by default, (unless the user asks explicitly for deleted messags in
+by default, (unless the user asks explicitly for deleted messages in
the search query).
Add keybindings for next/previous thread.
@@ -119,7 +121,7 @@ Allow configuration for filename patterns that should be ignored when
indexing.
Replace the "notmuch part --part=id" command with "notmuch show
---part=id", (David Edmonson wants to rewrite some of "notmuch show" to
+--part=id", (David Edmondson wants to rewrite some of "notmuch show" to
provide more MIME-structure information in its output first).
Replace the "notmuch search-tags" command with "notmuch search
@@ -265,6 +267,9 @@ large so the detection could be potentially slow). 2. A "notmuch
search" syntax could be added to allow the user to find these files,
(and perhaps delete them or move them away as appropriate).
+Fix filesystem/notmuch-new race condition by not updating database
+mtime for a directory if it is the same as the current mtime.
+
Test suite
----------
Achieve 100% test coverage with the test suite.
diff --git a/bindings/python/notmuch/database.py b/bindings/python/notmuch/database.py
index 5deb2a5d..84cf79bb 100644
--- a/bindings/python/notmuch/database.py
+++ b/bindings/python/notmuch/database.py
@@ -195,7 +195,7 @@ class Database(object):
# Raise a NotmuchError if not initialized
self._verify_initialized_db()
- return notmuch_database_needs_upgrade(self._db)
+ return nmlib.notmuch_database_needs_upgrade(self._db)
def upgrade(self):
"""Upgrades the current database
@@ -501,7 +501,7 @@ class Query(object):
:param db: An open database which we derive the Query from.
:type db: :class:`Database`
:param querystr: The query string for the message.
- :type querystr: str
+ :type querystr: utf-8 encoded str or unicode
"""
self._db = None
self._query = None
@@ -517,7 +517,7 @@ class Query(object):
:param db: Database to create the query from.
:type db: :class:`Database`
:param querystr: The query string
- :type querystr: str
+ :type querystr: utf-8 encoded str or unicode
:returns: Nothing
:exception: :exc:`NotmuchError`
@@ -529,7 +529,9 @@ class Query(object):
raise NotmuchError(STATUS.NOT_INITIALIZED)
# create reference to parent db to keep it alive
self._db = db
-
+ if isinstance(querystr, unicode):
+ # xapian takes utf-8 encoded byte arrays
+ querystr = querystr.encode('utf-8')
# create query, return None if too little mem available
query_p = Query._create(db.db_p, querystr)
if query_p is None:
diff --git a/bindings/python/notmuch/tag.py b/bindings/python/notmuch/tag.py
index e123b0f3..65a9118a 100644
--- a/bindings/python/notmuch/tag.py
+++ b/bindings/python/notmuch/tag.py
@@ -23,10 +23,12 @@ from notmuch.globals import nmlib, STATUS, NotmuchError
class Tags(object):
"""Represents a list of notmuch tags
- This object provides an iterator over a list of notmuch tags. Do
- note that the underlying library only provides a one-time iterator
- (it cannot reset the iterator to the start). Thus iterating over
- the function will "exhaust" the list of tags, and a subsequent
+ This object provides an iterator over a list of notmuch tags (which
+ are unicode instances).
+
+ Do note that the underlying library only provides a one-time
+ iterator (it cannot reset the iterator to the start). Thus iterating
+ over the function will "exhaust" the list of tags, and a subsequent
iteration attempt will raise a :exc:`NotmuchError`
STATUS.NOT_INITIALIZED. Also note, that any function that uses
iteration (nearly all) will also exhaust the tags. So both::
@@ -83,7 +85,7 @@ class Tags(object):
raise NotmuchError(STATUS.NOT_INITIALIZED)
# No need to call nmlib.notmuch_tags_valid(self._tags);
# Tags._get safely returns None, if there is no more valid tag.
- tag = Tags._get (self._tags)
+ tag = Tags._get(self._tags).decode('utf-8')
if tag is None:
self._tags = None
raise StopIteration
diff --git a/compat/README b/compat/README
index cd32c56f..38e2e146 100644
--- a/compat/README
+++ b/compat/README
@@ -1,4 +1,4 @@
-notmuch/comapt
+notmuch/compat
This directory consists of two things:
diff --git a/completion/Makefile b/completion/Makefile
index b6859eac..de492a7c 100644
--- a/completion/Makefile
+++ b/completion/Makefile
@@ -1,4 +1,4 @@
-# See Makfefile.local for the list of files to be compiled in this
+# See Makefile.local for the list of files to be compiled in this
# directory.
all:
$(MAKE) -C .. all
diff --git a/configure b/configure
index cf525c9f..3999ce8f 100755
--- a/configure
+++ b/configure
@@ -22,7 +22,7 @@ if [ "$srcdir" != "." ]; then
fi
# Set several defaults (optionally specified by the user in
-# environemnt variables)
+# environment variables)
CC=${CC:-gcc}
CXX=${CXX:-g++}
CFLAGS=${CFLAGS:--O2}
@@ -608,7 +608,7 @@ includedir = ${INCLUDEDIR:=\$(prefix)/include}
# The directory to which man pages should be installed
mandir = ${MANDIR:=\$(prefix)/share/man}
-# The directory to which read-only (configuration) filesshould be installed
+# The directory to which read-only (configuration) files should be installed
sysconfdir = ${SYSCONFDIR:=\$(prefix)/etc}
# The directory to which emacs lisp files should be installed
diff --git a/emacs/Makefile b/emacs/Makefile
index b6859eac..de492a7c 100644
--- a/emacs/Makefile
+++ b/emacs/Makefile
@@ -1,4 +1,4 @@
-# See Makfefile.local for the list of files to be compiled in this
+# See Makefile.local for the list of files to be compiled in this
# directory.
all:
$(MAKE) -C .. all
diff --git a/emacs/Makefile.local b/emacs/Makefile.local
index 10227777..ce0c3f00 100644
--- a/emacs/Makefile.local
+++ b/emacs/Makefile.local
@@ -20,7 +20,7 @@ emacs_images := \
emacs_bytecode = $(emacs_sources:.el=.elc)
-%.elc: %.el
+%.elc: %.el $(global_deps)
$(call quiet,EMACS) --directory emacs -batch -f batch-byte-compile $<
ifeq ($(WITH_EMACS),1)
diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el
index 916cda1c..65fde75a 100644
--- a/emacs/notmuch-hello.el
+++ b/emacs/notmuch-hello.el
@@ -428,7 +428,7 @@ Complete list of currently available key bindings:
(let ((found-target-pos nil)
(final-target-pos nil))
(let* ((saved-alist
- ;; Filter out empty saved seaches if required.
+ ;; Filter out empty saved searches if required.
(if notmuch-show-empty-saved-searches
notmuch-saved-searches
(loop for elem in notmuch-saved-searches
diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
index a21dc145..f93c957d 100644
--- a/emacs/notmuch-lib.el
+++ b/emacs/notmuch-lib.el
@@ -88,7 +88,7 @@ the user hasn't set this variable with the old or new value."
(notmuch-config-get "user.primary_email"))
(defun notmuch-user-other-email ()
- "Return the user.primary_email value (as a list) from the notmuch configuration."
+ "Return the user.other_email value (as a list) from the notmuch configuration."
(split-string (notmuch-config-get "user.other_email") "\n"))
(defun notmuch-kill-this-buffer ()
diff --git a/emacs/notmuch-maildir-fcc.el b/emacs/notmuch-maildir-fcc.el
index b6c6e2a7..e6788685 100644
--- a/emacs/notmuch-maildir-fcc.el
+++ b/emacs/notmuch-maildir-fcc.el
@@ -163,7 +163,7 @@ will NOT be removed or replaced."
(make-directory (concat path "/new/") t)
(make-directory (concat path "/tmp/") t))
((file-regular-p path)
- (error "%s is a file. Can't creat maildir." path))
+ (error "%s is a file. Can't create maildir." path))
(t
(error "I don't know how to create a maildir here"))))
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 45298783..f96743b0 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -110,7 +110,7 @@ any given message."
"Use external viewers to view all attachments from the current message."
(interactive)
(with-current-notmuch-show-message
- ; We ovverride the mm-inline-media-tests to indicate which message
+ ; We override the mm-inline-media-tests to indicate which message
; parts are already sufficiently handled by the original
; presentation of the message in notmuch-show mode. These parts
; will be inserted directly into the temporary buffer of
@@ -791,7 +791,7 @@ The optional QUERY-CONTEXT is a notmuch search term. Only
messages from the thread matching this search term are shown if
non-nil.
-The optional BUFFER-NAME provides the neame of the buffer in
+The optional BUFFER-NAME provides the name of the buffer in
which the message thread is shown. If it is nil (which occurs
when the command is called interactively) the argument to the
function is used. "
@@ -909,7 +909,7 @@ more selectively, (such as '\\[notmuch-show-next-message]' and '\\[notmuch-show-
without removing any tags, and '\\[notmuch-show-archive-thread]' to archive an entire thread
without scrolling through with \\[notmuch-show-advance-and-archive]).
-You can add or remove arbitary tags from the current message with
+You can add or remove arbitrary tags from the current message with
'\\[notmuch-show-add-tag]' or '\\[notmuch-show-remove-tag]'.
All currently available key bindings:
diff --git a/emacs/notmuch-wash.el b/emacs/notmuch-wash.el
index 92f07c50..1f420b25 100644
--- a/emacs/notmuch-wash.el
+++ b/emacs/notmuch-wash.el
@@ -137,7 +137,7 @@ collapse the remaining lines into a button.")
(format label-format lines-count)))
(defun notmuch-wash-region-to-button (msg beg end type prefix)
- "Auxilary function to do the actual making of overlays and buttons
+ "Auxiliary function to do the actual making of overlays and buttons
BEG and END are buffer locations. TYPE should a string, either
\"citation\" or \"signature\". PREFIX is some arbitrary text to
diff --git a/emacs/notmuch.el b/emacs/notmuch.el
index 3311fe8b..f11ec24e 100644
--- a/emacs/notmuch.el
+++ b/emacs/notmuch.el
@@ -64,7 +64,7 @@
("authors" . "%-20s ")
("subject" . "%s ")
("tags" . "(%s)"))
- "Search result formating. Supported fields are:
+ "Search result formatting. Supported fields are:
date, count, authors, subject, tags
For example:
(setq notmuch-search-result-format \(\(\"authors\" . \"%-40s\"\)
@@ -493,7 +493,7 @@ the messages that are about to be tagged"
:group 'notmuch)
(defcustom notmuch-after-tag-hook nil
- "Hooks that are run before tags of a message are modified.
+ "Hooks that are run after tags of a message are modified.
'tags' will contain the tags that were added or removed as
a list of strings of the form \"+TAG\" or \"-TAG\".
@@ -836,7 +836,7 @@ non-authors is found, assume that all of the authors match."
(defun notmuch-search-operate-all (action)
"Add/remove tags from all matching messages.
-Tis command adds or removes tags from all messages matching the
+This command adds or removes tags from all messages matching the
current search terms. When called interactively, this command
will prompt for tags to be added or removed. Tags prefixed with
'+' will be added and tags prefixed with '-' will be removed.
diff --git a/gmime-filter-headers.h b/gmime-filter-headers.h
index 47d1d456..1d1a3ebb 100644
--- a/gmime-filter-headers.h
+++ b/gmime-filter-headers.h
@@ -39,7 +39,7 @@ typedef struct _GMimeFilterHeadersClass GMimeFilterHeadersClass;
* @parent_object: parent #GMimeFilter
* @saw_nl: previous char was a \n
* @line: temporary buffer for line unfolding
- * @line_size: size of currently allocated nemory for @line
+ * @line_size: size of currently allocated memory for @line
* @lineptr: pointer to the first unused character in @line
*
* A filter to decode rfc2047 encoded headers
diff --git a/lib/Makefile b/lib/Makefile
index b6859eac..de492a7c 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,4 +1,4 @@
-# See Makfefile.local for the list of files to be compiled in this
+# See Makefile.local for the list of files to be compiled in this
# directory.
all:
$(MAKE) -C .. all
diff --git a/lib/Makefile.local b/lib/Makefile.local
index a6076ab5..9210f0e5 100644
--- a/lib/Makefile.local
+++ b/lib/Makefile.local
@@ -72,7 +72,6 @@ $(dir)/libnotmuch.a: $(libnotmuch_modules)
$(call quiet,AR) rcs $@ $^
$(dir)/$(LIBNAME): $(libnotmuch_modules) notmuch.sym
- echo $(libnotmuch_modules)
$(call quiet,CXX $(CXXFLAGS)) $(libnotmuch_modules) $(FINAL_LIBNOTMUCH_LDFLAGS) $(LIBRARY_LINK_FLAG) -o $@
notmuch.sym: lib/notmuch.h
@@ -86,7 +85,7 @@ $(dir)/$(LINKER_NAME): $(dir)/$(SONAME)
install: install-$(dir)
-# The (often-reused) $dir works fine within targets/pre-requisites,
+# The (often-reused) $dir works fine within targets/prerequisites,
# but cannot be used reliably within commands, so copy its value to a
# variable that is not reused.
lib := $(dir)
@@ -100,4 +99,6 @@ install-$(dir): $(dir)/$(LIBNAME)
$(LIBRARY_INSTALL_POST_COMMAND)
SRCS := $(SRCS) $(libnotmuch_c_srcs) $(libnotmuch_cxx_srcs)
-CLEAN := $(CLEAN) $(libnotmuch_modules) $(dir)/$(SONAME) $(dir)/$(LINKER_NAME) $(dir)$(LIBNAME) libnotmuch.a notmuch.sym
+CLEAN += $(libnotmuch_modules) $(dir)/$(SONAME) $(dir)/$(LINKER_NAME)
+CLEAN += $(dir)/$(LIBNAME) $(dir)/libnotmuch.a notmuch.sym
+CLEAN += $(dir)/notmuch.h.gch
diff --git a/lib/database.cc b/lib/database.cc
index 7f79cf47..9c2f4ecd 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -69,7 +69,7 @@ typedef struct {
*
* Multiple terms of given prefix:
*
- * reference: All message IDs from In-Reply-To and Re ferences
+ * reference: All message IDs from In-Reply-To and References
* headers in the message.
*
* tag: Any tags associated with this message by the user.
@@ -137,7 +137,7 @@ typedef struct {
* ASCII integer. The initial database version
* was 1, (though a schema existed before that
* were no "version" database value existed at
- * all). Succesive versions are allocated as
+ * all). Successive versions are allocated as
* changes are made to the database (such as by
* indexing new fields).
*
@@ -148,7 +148,7 @@ typedef struct {
* incremented for each thread ID.
*
* thread_id_* A pre-allocated thread ID for a particular
- * message. This is actually an arbitarily large
+ * message. This is actually an arbitrarily large
* family of metadata name. Any particular name is
* formed by concatenating "thread_id_" with a message
* ID (or the SHA1 sum of a message ID if it is very
@@ -422,7 +422,7 @@ skip_space_and_comments (const char **str)
}
/* Parse an RFC 822 message-id, discarding whitespace, any RFC 822
- * comments, and the '<' and '>' delimeters.
+ * comments, and the '<' and '>' delimiters.
*
* If not NULL, then *next will be made to point to the first character
* not parsed, (possibly pointing to the final '\0' terminator.
@@ -1149,7 +1149,7 @@ _notmuch_database_filename_to_direntry (void *ctx,
/* Given a legal 'path' for the database, return the relative path.
*
- * The return value will be a pointer to the originl path contents,
+ * The return value will be a pointer to the original path contents,
* and will be either the original string (if 'path' was relative) or
* a portion of the string (if path was absolute and begins with the
* database path).
@@ -1476,7 +1476,7 @@ _notmuch_database_link_message_to_children (notmuch_database_t *notmuch,
* In all cases, we assign to the current message the first thread_id
* found (through either parent or child). We will also merge any
* existing, distinct threads where this message belongs to both,
- * (which is not uncommon when mesages are processed out of order).
+ * (which is not uncommon when messages are processed out of order).
*
* Finally, if no thread ID has been found through parent or child, we
* call _notmuch_message_generate_thread_id to generate a new thread
diff --git a/lib/libsha1.c b/lib/libsha1.c
index c39a5a17..5d16f6ab 100644
--- a/lib/libsha1.c
+++ b/lib/libsha1.c
@@ -174,7 +174,7 @@ void sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1])
if((ctx->count[0] += len) < len)
++(ctx->count[1]);
- while(len >= space) /* tranfer whole blocks if possible */
+ while(len >= space) /* transfer whole blocks if possible */
{
memcpy(((unsigned char*)ctx->wbuf) + pos, sp, space);
sp += space; len -= space; space = SHA1_BLOCK_SIZE; pos = 0;
diff --git a/lib/libsha1.h b/lib/libsha1.h
index c1c848fc..56f445a9 100644
--- a/lib/libsha1.h
+++ b/lib/libsha1.h
@@ -38,7 +38,7 @@ extern "C"
{
#endif
#if 0
-} /* Appleasing Emacs */
+} /* Appeasing Emacs */
#endif
#include <stdint.h>
diff --git a/lib/message.cc b/lib/message.cc
index 2a4954dd..d993cde8 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -862,7 +862,7 @@ _notmuch_message_add_term (notmuch_message_t *message,
/* Parse 'text' and add a term to 'message' for each parsed word. Each
* term will be added both prefixed (if prefix_name is not NULL) and
- * also unprefixed). */
+ * also non-prefixed). */
notmuch_private_status_t
_notmuch_message_gen_terms (notmuch_message_t *message,
const char *prefix_name,
diff --git a/lib/notmuch.h b/lib/notmuch.h
index e508309e..974be8d1 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -103,7 +103,7 @@ typedef enum _notmuch_status {
/* Get a string representation of a notmuch_status_t value.
*
- * The result is readonly.
+ * The result is read-only.
*/
const char *
notmuch_status_to_string (notmuch_status_t status);
@@ -510,7 +510,7 @@ notmuch_threads_move_to_next (notmuch_threads_t *threads);
*
* It's not strictly necessary to call this function. All memory from
* the notmuch_threads_t object will be reclaimed when the
- * containg query object is destroyed.
+ * containing query object is destroyed.
*/
void
notmuch_threads_destroy (notmuch_threads_t *threads);
diff --git a/notmuch-config.c b/notmuch-config.c
index 6e4c5c4c..485fa72a 100644
--- a/notmuch-config.c
+++ b/notmuch-config.c
@@ -69,7 +69,7 @@ static const char maildir_config_comment[] =
"\tsynchronize_flags Valid values are true and false.\n"
"\n"
"\tIf true, then the following maildir flags (in message filenames)\n"
- "\twill be syncrhonized with the corresponding notmuch tags:\n"
+ "\twill be synchronized with the corresponding notmuch tags:\n"
"\n"
"\t\tFlag Tag\n"
"\t\t---- -------\n"
diff --git a/notmuch-new.c b/notmuch-new.c
index 744f4ca3..7d17793b 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -213,6 +213,7 @@ _entries_resemble_maildir (struct dirent **entries, int count)
* information is lost from the database).
*
* o Tell the database to update its time of 'path' to 'fs_mtime'
+ * if fs_mtime isn't the current wall-clock time.
*/
static notmuch_status_t
add_files_recursive (notmuch_database_t *notmuch,
@@ -230,6 +231,7 @@ add_files_recursive (notmuch_database_t *notmuch,
notmuch_directory_t *directory;
notmuch_filenames_t *db_files = NULL;
notmuch_filenames_t *db_subdirs = NULL;
+ time_t stat_time;
struct stat st;
notmuch_bool_t is_maildir, new_directory;
const char **tag;
@@ -239,6 +241,7 @@ add_files_recursive (notmuch_database_t *notmuch,
path, strerror (errno));
return NOTMUCH_STATUS_FILE_ERROR;
}
+ stat_time = time (NULL);
/* This is not an error since we may have recursed based on a
* symlink to a regular file, not a directory, and we don't know
@@ -253,6 +256,25 @@ add_files_recursive (notmuch_database_t *notmuch,
new_directory = db_mtime ? FALSE : TRUE;
+ /* XXX This is a temporary workaround. If we don't update the
+ * database mtime until after processing messages in this
+ * directory, then a 0 mtime is *not* sufficient to indicate that
+ * this directory has no messages or subdirs in the database (for
+ * example, if an earlier run skipped the mtime update because
+ * fs_mtime == stat_time, or was interrupted before updating the
+ * mtime at the end). To address this, we record a (bogus)
+ * non-zero value before processing any child messages so that a
+ * later run won't mistake this for a new directory (and, for
+ * example, fail to detect removed files and subdirs).
+ *
+ * A better solution would be for notmuch_database_get_directory
+ * to indicate if it really created a new directory or not, either
+ * by a new out-argument, or by recording this information and
+ * providing an accessor.
+ */
+ if (new_directory)
+ notmuch_directory_set_mtime (directory, -1);
+
/* If the database knows about this directory, then we sort based
* on strcmp to match the database sorting. Otherwise, we can do
* inode-based sorting for faster filesystem operation. */
@@ -373,7 +395,7 @@ add_files_recursive (notmuch_database_t *notmuch,
/* If we're looking at a symlink, we only want to add it if it
* links to a regular file, (and not to a directory, say).
*
- * Similarly, if the file is of unknown type (due to filesytem
+ * Similarly, if the file is of unknown type (due to filesystem
* limitations), then we also need to look closer.
*
* In either case, a stat does the trick.
@@ -509,7 +531,12 @@ add_files_recursive (notmuch_database_t *notmuch,
notmuch_filenames_move_to_next (db_subdirs);
}
- if (! interrupted) {
+ /* If the directory's mtime is the same as the wall-clock time
+ * when we stat'ed the directory, we skip updating the mtime in
+ * the database because a message could be delivered later in this
+ * same second. This may lead to unnecessary re-scans, but it
+ * avoids overlooking messages. */
+ if (! interrupted && fs_mtime != stat_time) {
status = notmuch_directory_set_mtime (directory, fs_mtime);
if (status && ret == NOTMUCH_STATUS_SUCCESS)
ret = status;
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 27ef37bd..362e1987 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -278,7 +278,7 @@ add_recipients_from_message (GMimeMessage *reply,
* The munging is easy to detect, because it results in a
* redundant reply-to header, (with an address that already exists
* in either To or Cc). So in this case, we ignore the Reply-To
- * field and use the From header. Thie ensures the original sender
+ * field and use the From header. This ensures the original sender
* will get the reply even if not subscribed to the list. Note
* that the address in the Reply-To header will always appear in
* the reply.
@@ -362,7 +362,7 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message
* them indications to which email address this message was
* delivered.
* The Received: header is special in our get_header function
- * and is always concated.
+ * and is always concatenated.
*/
received = notmuch_message_get_header (message, "received");
if (received == NULL)
diff --git a/notmuch-show.c b/notmuch-show.c
index dda83a10..fb743008 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -454,19 +454,21 @@ format_part_start_text (GMimeObject *part, int *part_count)
static void
format_part_content_text (GMimeObject *part)
{
- GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);
+ const char *cid = g_mime_object_get_content_id (part);
GMimeContentType *content_type = g_mime_object_get_content_type (GMIME_OBJECT (part));
- printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));
-
- if (disposition &&
- strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
+ if (GMIME_IS_PART (part))
{
const char *filename = g_mime_part_get_filename (GMIME_PART (part));
- printf ("Attachment: %s (%s)\n", filename,
- g_mime_content_type_to_string (content_type));
+ if (filename)
+ printf (", Filename: %s", filename);
}
+ if (cid)
+ printf (", Content-id: %s", cid);
+
+ printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));
+
if (g_mime_content_type_is_type (content_type, "text", "*") &&
!g_mime_content_type_is_type (content_type, "text", "html"))
{
@@ -591,7 +593,6 @@ format_part_content_json (GMimeObject *part)
GMimeStream *stream_memory = g_mime_stream_mem_new ();
const char *cid = g_mime_object_get_content_id (part);
void *ctx = talloc_new (NULL);
- GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (part);
GByteArray *part_content;
printf (", \"content-type\": %s",
@@ -600,12 +601,11 @@ format_part_content_json (GMimeObject *part)
if (cid != NULL)
printf(", \"content-id\": %s", json_quote_str (ctx, cid));
- if (disposition &&
- strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)
+ if (GMIME_IS_PART (part))
{
const char *filename = g_mime_part_get_filename (GMIME_PART (part));
-
- printf (", \"filename\": %s", json_quote_str (ctx, filename));
+ if (filename)
+ printf (", \"filename\": %s", json_quote_str (ctx, filename));
}
if (g_mime_content_type_is_type (content_type, "text", "*") &&
diff --git a/notmuch.1 b/notmuch.1
index c1aa4e32..5a8c83dc 100644
--- a/notmuch.1
+++ b/notmuch.1
@@ -484,7 +484,7 @@ sup calls them).
The
.B part
-command can used to output a single part of a multi-part MIME message.
+command can used to output a single part of a multipart MIME message.
.RS 4
.TP 4
@@ -641,13 +641,13 @@ expression).
Finally, results can be restricted to only messages within a
particular time range, (based on the Date: header) with a syntax of:
- <intial-timestamp>..<final-timestamp>
+ <initial-timestamp>..<final-timestamp>
Each timestamp is a number representing the number of seconds since
1970\-01\-01 00:00:00 UTC. This is not the most convenient means of
expressing date ranges, but until notmuch is fixed to accept a more
convenient form, one can use the date program to construct
-timestamps. For example, with the bash shell the folowing syntax would
+timestamps. For example, with the bash shell the following syntax would
specify a date range to return messages from 2009\-10\-01 until the
current time:
diff --git a/notmuch.c b/notmuch.c
index 93f31944..3973e350 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -48,7 +48,7 @@ static int
notmuch_help_command (void *ctx, int argc, char *argv[]);
static const char search_terms_help[] =
- "\tSeveral notmuch commands accept a comman syntax for search\n"
+ "\tSeveral notmuch commands accept a common syntax for search\n"
"\tterms.\n"
"\n"
"\tThe search terms can consist of free-form text (and quoted\n"
diff --git a/packaging/debian b/packaging/debian
index a5866601..c8e8ddd4 100644
--- a/packaging/debian
+++ b/packaging/debian
@@ -1,2 +1,2 @@
-The debian packaging exists in the top-level "debian" directory within
-this source-code respository.
+The Debian packaging exists in the top-level "debian" directory within
+this source-code repository.
diff --git a/test/Makefile b/test/Makefile
index b6859eac..de492a7c 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,4 +1,4 @@
-# See Makfefile.local for the list of files to be compiled in this
+# See Makefile.local for the list of files to be compiled in this
# directory.
all:
$(MAKE) -C .. all
diff --git a/test/README b/test/README
index 07da480b..f9ac6073 100644
--- a/test/README
+++ b/test/README
@@ -41,6 +41,15 @@ The following command-line options are available when running tests:
As the names depend on the tests' file names, it is safe to
run the tests with this option in parallel.
+--root=<dir>::
+ This runs the testsuites specified under a seperate directory.
+ However, caution is advised, as not all tests are maintained
+ with this relocation in mind, so some tests may behave
+ differently.
+
+ Pointing this argument at a tmpfs filesystem can improve the
+ speed of the test suite for some users.
+
When invoking the test suite via "make test" any of the above options
can be specified as follows:
@@ -147,11 +156,18 @@ library for your script to use.
will generate a failure and print the difference of the two
strings.
+ test_expect_equal_file <output> <expected>
+
+ Identical to test_exepect_equal, except that <output> and
+ <expected> are files instead of strings. This is a much more
+ robust method to compare formatted textual information, since it
+ also notices whitespace and closing newline differences.
+
test_expect_equal_failure <output> <expected>
This works similar to test_expect_equal (see above) but is used to
mark a test that demonstrates a known breakage, (that is, the
- author of the test expectes "output" and "expected" to differ until
+ author of the test expects "output" and "expected" to differ until
the breakage is fixed). See test_expect_failure for details.
test_debug <script>
@@ -181,7 +197,7 @@ writing tests:
generate_message
Generates a message with an optional template. Most tests will
- actually prefere to call add_message. See below.
+ actually prefer to call add_message. See below.
add_message
@@ -197,6 +213,6 @@ writing tests:
This function should be called at the beginning of a test file
when a test needs to operate on a non-empty body of messages. It
- will intialize the mail database to a known state of 50 sample
+ will initialize the mail database to a known state of 50 sample
messages, (culled from the early history of the notmuch mailing
list).
diff --git a/test/basic b/test/basic
index d6e8c100..33bf7113 100755
--- a/test/basic
+++ b/test/basic
@@ -51,9 +51,9 @@ test_expect_code 2 'failure to clean up causes the test to fail' '
# Ensure that all tests are being run
test_begin_subtest 'Ensure that all available tests will be run by notmuch-test'
-eval $(sed -n -e '/^TESTS="$/,/^"$/p' notmuch-test ../notmuch-test)
+eval $(sed -n -e '/^TESTS="$/,/^"$/p' notmuch-test $TEST_DIRECTORY/notmuch-test)
tests_in_suite=$(for i in $TESTS; do echo $i; done | sort)
-available=$(ls -1 ../ | \
+available=$(ls -1 $TEST_DIRECTORY/ | \
sed -r -e "/^(aggregate-results.sh|Makefile|Makefile.local|notmuch-test)/d" \
-e "/^(README|test-lib.sh|test-lib.el|test-results|tmp.*|valgrind|corpus*)/d" \
-e "/^(emacs.expected-output|smtp-dummy|smtp-dummy.c|test-verbose|symbol-test.cc)/d" \
@@ -63,19 +63,19 @@ available=$(ls -1 ../ | \
| sort)
test_expect_equal "$tests_in_suite" "$available"
-EXPECTED=../test.expected-output
+EXPECTED=$TEST_DIRECTORY/test.expected-output
suppress_diff_date() {
sed -e 's/\(.*\-\-\- test-verbose\.4\.\expected\).*/\1/' \
-e 's/\(.*\+\+\+ test-verbose\.4\.\output\).*/\1/'
}
test_begin_subtest "Ensure that test output is suppressed unless the test fails"
-output=$(cd ..; ./test-verbose 2>&1 | suppress_diff_date)
+output=$(cd $TEST_DIRECTORY; ./test-verbose 2>&1 | suppress_diff_date)
expected=$(cat $EXPECTED/test-verbose-no | suppress_diff_date)
test_expect_equal "$output" "$expected"
test_begin_subtest "Ensure that -v does not suppress test output"
-output=$(cd ..; ./test-verbose -v 2>&1 | suppress_diff_date)
+output=$(cd $TEST_DIRECTORY; ./test-verbose -v 2>&1 | suppress_diff_date)
expected=$(cat $EXPECTED/test-verbose-yes | suppress_diff_date)
# Do not include the results of test-verbose in totals
rm $TEST_DIRECTORY/test-results/test-verbose-*
diff --git a/test/corpus/cur/51:2, b/test/corpus/cur/51:2,
new file mode 100644
index 00000000..f522f69e
--- /dev/null
+++ b/test/corpus/cur/51:2,
@@ -0,0 +1,12 @@
+From: "Aron Griffis" <agriffis@n01se.net>
+To: notmuch@notmuchmail.org
+Date: Tue, 17 Nov 2009 18:21:38 -0500
+Subject: [notmuch] archive
+Message-ID: <20091117232137.GA7669@griffis1.net>
+
+Just subscribed, I'd like to catch up on the previous postings,
+but the archive link seems to be bogus?
+
+Thanks,
+Aron
+
diff --git a/test/crypto b/test/crypto
index 8e920167..b49a4e05 100755
--- a/test/crypto
+++ b/test/crypto
@@ -12,7 +12,7 @@ add_gnupg_home ()
local output
[ -d ${GNUPGHOME} ] && return
mkdir -m 0700 "$GNUPGHOME"
- gpg --no-tty --import <../gnupg-secret-key.asc >"$GNUPGHOME"/import.log 2>&1
+ gpg --no-tty --import <$TEST_DIRECTORY/gnupg-secret-key.asc >"$GNUPGHOME"/import.log 2>&1
test_debug "cat $GNUPGHOME/import.log"
if (gpg --quick-random --version >/dev/null 2>&1) ; then
echo quick-random >> "$GNUPGHOME"/gpg.conf
@@ -168,8 +168,7 @@ Non-text part: application/pgp-encrypted
part{ ID: 4, Content-type: text/plain
This is a test encrypted message.
part}
- attachment{ ID: 5, Content-type: application/octet-stream
-Attachment: TESTATTACHMENT (application/octet-stream)
+ attachment{ ID: 5, Filename: TESTATTACHMENT, Content-type: application/octet-stream
Non-text part: application/octet-stream
attachment}
part}
@@ -318,7 +317,7 @@ test_expect_equal \
"$expected"
test_begin_subtest "signature verification with revoked key"
-# generate revokation certificate and load it to revoke key
+# generate revocation certificate and load it to revoke key
echo "y
1
Notmuch Test Suite key revocation (automated) $(date '+%F_%T%z')
diff --git a/test/emacs b/test/emacs
index 6f82b08e..53f455a3 100755
--- a/test/emacs
+++ b/test/emacs
@@ -1,91 +1,135 @@
#!/usr/bin/env bash
+
+# Note: do not use `setq' for setting variables in Emacs tests because
+# it affects other tests that may run in the same Emacs instance. Use
+# `let' instead so the scope of the changed variables is limited to a
+# single test.
+
test_description="emacs interface"
. test-lib.sh
-EXPECTED=../emacs.expected-output
+EXPECTED=$TEST_DIRECTORY/emacs.expected-output
add_email_corpus
test_begin_subtest "Basic notmuch-hello view in emacs"
-test_emacs '(notmuch-hello) (princ (buffer-string))' >OUTPUT
+test_emacs '(notmuch-hello)
+ (test-output)'
test_expect_equal_file OUTPUT $EXPECTED/notmuch-hello
test_begin_subtest "Saved search with 0 results"
-test_emacs '(setq notmuch-show-empty-saved-searches t) (setq notmuch-saved-searches '\''(("inbox" . "tag:inbox") ("unread" . "tag:unread") ("empty" . "tag:doesnotexist"))) (notmuch-hello) (princ (buffer-string))' >OUTPUT
+test_emacs '(let ((notmuch-show-empty-saved-searches t)
+ (notmuch-saved-searches
+ '\''(("inbox" . "tag:inbox")
+ ("unread" . "tag:unread")
+ ("empty" . "tag:doesnotexist"))))
+ (notmuch-hello)
+ (test-output))'
test_expect_equal_file OUTPUT $EXPECTED/notmuch-hello-with-empty
test_begin_subtest "No saved searches displayed (all with 0 results)"
-test_emacs '(setq notmuch-saved-searches '\''(("empty" . "tag:doesnotexist"))) (notmuch-hello) (princ (buffer-string))' >OUTPUT
+test_emacs '(let ((notmuch-saved-searches
+ '\''(("empty" . "tag:doesnotexist"))))
+ (notmuch-hello)
+ (test-output))'
test_expect_equal_file OUTPUT $EXPECTED/notmuch-hello-no-saved-searches
test_begin_subtest "Basic notmuch-search view in emacs"
-test_emacs '(notmuch-search "tag:inbox") (notmuch-test-wait) (princ (buffer-string))' >OUTPUT
+test_emacs '(notmuch-search "tag:inbox")
+ (notmuch-test-wait)
+ (test-output)'
test_expect_equal_file OUTPUT $EXPECTED/notmuch-search-tag-inbox
test_begin_subtest "Navigation of notmuch-hello to search results"
-test_emacs '(notmuch-hello) (goto-char (point-min)) (re-search-forward "inbox") (widget-button-press (point)) (notmuch-test-wait) (princ (buffer-string))' >OUTPUT
+test_emacs '(notmuch-hello)
+ (goto-char (point-min))
+ (re-search-forward "inbox")
+ (widget-button-press (point))
+ (notmuch-test-wait)
+ (test-output)'
test_expect_equal_file OUTPUT $EXPECTED/notmuch-hello-view-inbox
test_begin_subtest "Basic notmuch-show view in emacs"
maildir_storage_thread=$(notmuch search --output=threads id:20091117190054.GU3165@dottiness.seas.harvard.edu)
-test_emacs "(notmuch-show \"$maildir_storage_thread\") (princ (buffer-string))" >OUTPUT
+test_emacs "(notmuch-show \"$maildir_storage_thread\")
+ (test-output)"
test_expect_equal_file OUTPUT $EXPECTED/notmuch-show-thread-maildir-storage
test_begin_subtest "notmuch-show for message with invalid From"
-add_message "[subject]=\"message-with-invalid-from\"" "[from]=\"\\\"Invalid \\\" From\\\" <test_suite@notmuchmail.org>\""
+add_message "[subject]=\"message-with-invalid-from\"" \
+ "[from]=\"\\\"Invalid \\\" From\\\" <test_suite@notmuchmail.org>\""
thread=$(notmuch search --output=threads subject:message-with-invalid-from)
-output=$(test_emacs "(notmuch-show \"$thread\") (princ (buffer-string))")
-test_expect_equal "$output" \
-'"Invalid " From" <test_suite@notmuchmail.org> (2001-01-05) (inbox)
+test_emacs "(notmuch-show \"$thread\")
+ (test-output)"
+cat <<EOF >EXPECTED
+"Invalid " From" <test_suite@notmuchmail.org> (2001-01-05) (inbox)
Subject: message-with-invalid-from
To: Notmuch Test Suite <test_suite@notmuchmail.org>
Date: Tue, 05 Jan 2001 15:43:57 -0000
-This is just a test message (#1)'
+This is just a test message (#1)
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "Navigation of notmuch-search to thread view"
-test_emacs '(notmuch-search "tag:inbox") (notmuch-test-wait) (goto-char (point-min)) (re-search-forward "Working with Maildir") (notmuch-search-show-thread) (notmuch-test-wait) (princ (buffer-string))' >OUTPUT
+test_emacs '(notmuch-search "tag:inbox")
+ (notmuch-test-wait)
+ (goto-char (point-min))
+ (re-search-forward "Working with Maildir")
+ (notmuch-search-show-thread)
+ (notmuch-test-wait)
+ (test-output)'
test_expect_equal_file OUTPUT $EXPECTED/notmuch-show-thread-maildir-storage
test_begin_subtest "Add tag from search view"
os_x_darwin_thread=$(notmuch search --output=threads id:ddd65cda0911171950o4eea4389v86de9525e46052d3@mail.gmail.com)
-test_emacs "(notmuch-search \"$os_x_darwin_thread\") (notmuch-test-wait) (notmuch-search-add-tag \"tag-from-search-view\")"
+test_emacs "(notmuch-search \"$os_x_darwin_thread\")
+ (notmuch-test-wait)
+ (notmuch-search-add-tag \"tag-from-search-view\")"
output=$(notmuch search $os_x_darwin_thread | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2009-11-18 [4/4] Jjgod Jiang, Alexander Botero-Lowry; [notmuch] Mac OS X/Darwin compatibility issues (inbox tag-from-search-view unread)"
test_begin_subtest "Remove tag from search view"
-test_emacs "(notmuch-search \"$os_x_darwin_thread\") (notmuch-test-wait) (notmuch-search-remove-tag \"tag-from-search-view\")"
+test_emacs "(notmuch-search \"$os_x_darwin_thread\")
+ (notmuch-test-wait)
+ (notmuch-search-remove-tag \"tag-from-search-view\")"
output=$(notmuch search $os_x_darwin_thread | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2009-11-18 [4/4] Jjgod Jiang, Alexander Botero-Lowry; [notmuch] Mac OS X/Darwin compatibility issues (inbox unread)"
test_begin_subtest "Add tag from notmuch-show view"
-test_emacs "(notmuch-show \"$os_x_darwin_thread\") (notmuch-show-add-tag \"tag-from-show-view\")"
+test_emacs "(notmuch-show \"$os_x_darwin_thread\")
+ (notmuch-show-add-tag \"tag-from-show-view\")"
output=$(notmuch search $os_x_darwin_thread | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2009-11-18 [4/4] Jjgod Jiang, Alexander Botero-Lowry; [notmuch] Mac OS X/Darwin compatibility issues (inbox tag-from-show-view unread)"
test_begin_subtest "Remove tag from notmuch-show view"
-test_emacs "(notmuch-show \"$os_x_darwin_thread\") (notmuch-show-remove-tag \"tag-from-show-view\")"
+test_emacs "(notmuch-show \"$os_x_darwin_thread\")
+ (notmuch-show-remove-tag \"tag-from-show-view\")"
output=$(notmuch search $os_x_darwin_thread | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2009-11-18 [4/4] Jjgod Jiang, Alexander Botero-Lowry; [notmuch] Mac OS X/Darwin compatibility issues (inbox unread)"
test_begin_subtest "Message with .. in Message-Id:"
add_message [id]=123..456@example '[subject]="Message with .. in Message-Id"'
-test_emacs '(notmuch-search "id:\"123..456@example\"") (notmuch-test-wait) (notmuch-search-add-tag "search-add") (notmuch-search-add-tag "search-remove") (notmuch-search-remove-tag "search-remove") (notmuch-show "id:\"123..456@example\"") (notmuch-test-wait) (notmuch-show-add-tag "show-add") (notmuch-show-add-tag "show-remove") (notmuch-show-remove-tag "show-remove")'
+test_emacs '(notmuch-search "id:\"123..456@example\"")
+ (notmuch-test-wait)
+ (notmuch-search-add-tag "search-add")
+ (notmuch-search-add-tag "search-remove")
+ (notmuch-search-remove-tag "search-remove")
+ (notmuch-show "id:\"123..456@example\"")
+ (notmuch-test-wait)
+ (notmuch-show-add-tag "show-add")
+ (notmuch-show-add-tag "show-remove")
+ (notmuch-show-remove-tag "show-remove")'
output=$(notmuch search 'id:"123..456@example"' | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Message with .. in Message-Id (inbox search-add show-add)"
test_begin_subtest "Sending a message via (fake) SMTP"
-
-# Before we can send a message, we have to prepare the FCC maildir
-mkdir -p mail/sent/cur
-mkdir -p mail/sent/new
-mkdir -p mail/sent/tmp
-
-../smtp-dummy sent_message &
-smtp_dummy_pid=$!
-test_emacs "(setq message-send-mail-function 'message-smtpmail-send-it) (setq smtpmail-smtp-server \"localhost\") (setq smtpmail-smtp-service \"25025\") (notmuch-hello) (notmuch-mua-mail) (message-goto-to) (insert \"user@example.com\nDate: Fri, 29 Mar 1974 10:00:00 -0000\") (message-goto-subject) (insert \"Testing message sent via SMTP\") (message-goto-body) (insert \"This is a test that messages are sent via SMTP\") (message-send-and-exit)" >/dev/null 2>&1
-wait ${smtp_dummy_pid}
-
+emacs_deliver_message \
+ 'Testing message sent via SMTP' \
+ 'This is a test that messages are sent via SMTP' \
+ '(message-goto-to)
+ (kill-whole-line)
+ (insert "To: user@example.com\n")'
sed \
-e s',^User-Agent: Notmuch/.* Emacs/.*,User-Agent: Notmuch/XXX Emacs/XXX,' \
-e s',^Message-ID: <.*>$,Message-ID: <XXX>,' < sent_message >OUTPUT
@@ -93,7 +137,7 @@ cat <<EOF >EXPECTED
From: Notmuch Test Suite <test_suite@notmuchmail.org>
To: user@example.com
Subject: Testing message sent via SMTP
-Date: Fri, 29 Mar 1974 10:00:00 -0000
+Date: 01 Jan 2000 12:00:00 -0000
User-Agent: Notmuch/XXX Emacs/XXX
Message-ID: <XXX>
MIME-Version: 1.0
@@ -106,10 +150,12 @@ test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "Verify that sent messages are saved/searchable (via FCC)"
notmuch new > /dev/null
output=$(notmuch search 'subject:"testing message sent via SMTP"' | notmuch_search_sanitize)
-test_expect_equal "$output" "thread:XXX 1974-03-29 [1/1] Notmuch Test Suite; Testing message sent via SMTP (inbox)"
+test_expect_equal "$output" "thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; Testing message sent via SMTP (inbox)"
test_begin_subtest "notmuch-fcc-dirs set to nil"
-test_emacs "(setq notmuch-fcc-dirs nil) (notmuch-mua-mail) (princ (buffer-string))" > OUTPUT
+test_emacs "(let ((notmuch-fcc-dirs nil))
+ (notmuch-mua-mail)
+ (test-output))"
cat <<EOF >EXPECTED
From: Notmuch Test Suite <test_suite@notmuchmail.org>
To:
@@ -124,7 +170,9 @@ mkdir -p mail/sent-string/new
mkdir -p mail/sent-string/tmp
test_begin_subtest "notmuch-fcc-dirs set to a string"
-test_emacs "(setq notmuch-fcc-dirs \"sent-string\") (notmuch-mua-mail) (princ (buffer-string))" > OUTPUT
+test_emacs "(let ((notmuch-fcc-dirs \"sent-string\"))
+ (notmuch-mua-mail)
+ (test-output))"
cat <<EOF >EXPECTED
From: Notmuch Test Suite <test_suite@notmuchmail.org>
To:
@@ -143,7 +191,11 @@ mkdir -p mail/failure/new
mkdir -p mail/failure/tmp
test_begin_subtest "notmuch-fcc-dirs set to a list (with match)"
-test_emacs "(setq notmuch-fcc-dirs '((\"notmuchmail.org\" . \"sent-list-match\") (\".*\" . \"failure\"))) (notmuch-mua-mail) (princ (buffer-string))" > OUTPUT
+test_emacs "(let ((notmuch-fcc-dirs
+ '((\"notmuchmail.org\" . \"sent-list-match\")
+ (\".*\" . \"failure\"))))
+ (notmuch-mua-mail)
+ (test-output))"
cat <<EOF >EXPECTED
From: Notmuch Test Suite <test_suite@notmuchmail.org>
To:
@@ -159,7 +211,11 @@ mkdir -p mail/sent-list-catch-all/new
mkdir -p mail/sent-list-catch-all/tmp
test_begin_subtest "notmuch-fcc-dirs set to a list (catch-all)"
-test_emacs "(setq notmuch-fcc-dirs '((\"example.com\" . \"failure\") (\".*\" . \"sent-list-catch-all\"))) (notmuch-mua-mail) (princ (buffer-string))" > OUTPUT
+test_emacs "(let ((notmuch-fcc-dirs
+ '((\"example.com\" . \"failure\")
+ (\".*\" . \"sent-list-catch-all\"))))
+ (notmuch-mua-mail)
+ (test-output))"
cat <<EOF >EXPECTED
From: Notmuch Test Suite <test_suite@notmuchmail.org>
To:
@@ -170,7 +226,11 @@ EOF
test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "notmuch-fcc-dirs set to a list (no match)"
-test_emacs "(setq notmuch-fcc-dirs '((\"example.com\" . \"failure\") (\"nomatchhere.net\" . \"failure\"))) (notmuch-mua-mail) (princ (buffer-string))" > OUTPUT
+test_emacs "(let ((notmuch-fcc-dirs
+ '((\"example.com\" . \"failure\")
+ (\"nomatchhere.net\" . \"failure\"))))
+ (notmuch-mua-mail)
+ (test-output))"
cat <<EOF >EXPECTED
From: Notmuch Test Suite <test_suite@notmuchmail.org>
To:
@@ -180,9 +240,11 @@ EOF
test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "Reply within emacs"
-# We sed away everything before the ^From in the output to avoid getting
-# confused by messages such as "Parsing /home/cworth/.mailrc... done"
-test_emacs '(notmuch-search "subject:\"testing message sent via SMTP\"") (notmuch-test-wait) (notmuch-search-reply-to-thread) (princ (buffer-string))' | sed -ne '/^From/,$ p' | sed -e 's/^In-Reply-To: <.*>$/In-Reply-To: <XXX>/' >OUTPUT
+test_emacs '(notmuch-search "subject:\"testing message sent via SMTP\"")
+ (notmuch-test-wait)
+ (notmuch-search-reply-to-thread)
+ (test-output)'
+sed -i -e 's/^In-Reply-To: <.*>$/In-Reply-To: <XXX>/' OUTPUT
cat <<EOF >EXPECTED
From: Notmuch Test Suite <test_suite@notmuchmail.org>
To: user@example.com
@@ -190,24 +252,28 @@ Subject: Re: Testing message sent via SMTP
In-Reply-To: <XXX>
Fcc: $(pwd)/mail/sent
--text follows this line--
-On Fri, 29 Mar 1974 10:00:00 -0000, Notmuch Test Suite <test_suite@notmuchmail.org> wrote:
+On 01 Jan 2000 12:00:00 -0000, Notmuch Test Suite <test_suite@notmuchmail.org> wrote:
> This is a test that messages are sent via SMTP
EOF
test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "Save attachment from within emacs using notmuch-show-save-attachments"
# save as archive to test that Emacs does not re-compress .gz
-echo ./attachment1.gz | test_emacs '(notmuch-show "id:cf0c4d610911171136h1713aa59w9cf9aa31f052ad0a@mail.gmail.com") (notmuch-show-save-attachments)' > /dev/null 2>&1
-test_expect_equal_file "$EXPECTED/attachment" attachment1.gz
+test_emacs '(let ((standard-input "\"attachment1.gz\""))
+ (notmuch-show "id:cf0c4d610911171136h1713aa59w9cf9aa31f052ad0a@mail.gmail.com")
+ (notmuch-show-save-attachments))' > /dev/null 2>&1
+test_expect_equal_file attachment1.gz "$EXPECTED/attachment"
test_begin_subtest "Save attachment from within emacs using notmuch-show-save-part"
# save as archive to test that Emacs does not re-compress .gz
-echo ./attachment2.gz | test_emacs '(notmuch-show-save-part "id:cf0c4d610911171136h1713aa59w9cf9aa31f052ad0a@mail.gmail.com" 5)' > /dev/null 2>&1
-test_expect_equal_file "$EXPECTED/attachment" attachment2.gz
+test_emacs '(let ((standard-input "\"attachment2.gz\""))
+ (notmuch-show-save-part "id:cf0c4d610911171136h1713aa59w9cf9aa31f052ad0a@mail.gmail.com" 5))' > /dev/null 2>&1
+test_expect_equal_file attachment2.gz "$EXPECTED/attachment"
test_begin_subtest "View raw message within emacs"
-first_line=$(head -n1 $EXPECTED/raw-message-cf0c4d-52ad0a)
-test_emacs '(notmuch-show "id:cf0c4d610911171136h1713aa59w9cf9aa31f052ad0a@mail.gmail.com") (notmuch-show-view-raw-message) (princ (buffer-string))' | sed -ne "/$first_line/,\$ p" >OUTPUT
+test_emacs '(notmuch-show "id:cf0c4d610911171136h1713aa59w9cf9aa31f052ad0a@mail.gmail.com")
+ (notmuch-show-view-raw-message)
+ (test-output)'
test_expect_equal_file OUTPUT $EXPECTED/raw-message-cf0c4d-52ad0a
test_begin_subtest "Hiding/showing signature in notmuch-show view"
@@ -217,7 +283,7 @@ test_emacs "(notmuch-show \"$maildir_storage_thread\")
(button-activate (button-at (point)))
(search-backward \"Click/Enter to hide.\")
(button-activate (button-at (point)))
- (princ (buffer-string))" >OUTPUT
+ (test-output)"
test_expect_equal_file OUTPUT $EXPECTED/notmuch-show-thread-maildir-storage
test_begin_subtest "Detection and hiding of top-post quoting of message"
@@ -245,7 +311,7 @@ Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing in e-mail?"'
test_emacs "(notmuch-show \"top-posting\")
- (princ (visible-buffer-string))" >OUTPUT
+ (test-visible-output)"
echo "Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-05) (inbox)
Subject: The problem with top-posting
To: Notmuch Test Suite <test_suite@notmuchmail.org>
@@ -268,19 +334,17 @@ Thanks for the advice! I will be sure to put it to good use.
test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "Hiding message in notmuch-show view"
-output=$(test_emacs '(notmuch-show "id:f35dbb950911171438k5df6eb56k77b6c0944e2e79ae@mail.gmail.com")
- (notmuch-show-toggle-message)
- (princ (visible-buffer-string))')
-expected=$(cat $EXPECTED/notmuch-show-thread-with-hidden-messages)
-test_expect_equal "$output" "$expected"
+test_emacs '(notmuch-show "id:f35dbb950911171438k5df6eb56k77b6c0944e2e79ae@mail.gmail.com")
+ (notmuch-show-toggle-message)
+ (test-visible-output)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-show-thread-with-hidden-messages
test_begin_subtest "Hiding message with visible citation in notmuch-show view"
-output=$(test_emacs '(notmuch-show "id:f35dbb950911171438k5df6eb56k77b6c0944e2e79ae@mail.gmail.com")
- (search-forward "Click/Enter to show.")
- (button-activate (button-at (point)))
- (notmuch-show-toggle-message)
- (princ (visible-buffer-string))')
-expected=$(cat $EXPECTED/notmuch-show-thread-with-hidden-messages)
-test_expect_equal "$output" "$expected"
+test_emacs '(notmuch-show "id:f35dbb950911171438k5df6eb56k77b6c0944e2e79ae@mail.gmail.com")
+ (search-forward "Click/Enter to show.")
+ (button-activate (button-at (point)))
+ (notmuch-show-toggle-message)
+ (test-visible-output)'
+test_expect_equal_file OUTPUT $EXPECTED/notmuch-show-thread-with-hidden-messages
test_done
diff --git a/test/emacs-large-search-buffer b/test/emacs-large-search-buffer
index c78ce334..6095e9da 100755
--- a/test/emacs-large-search-buffer
+++ b/test/emacs-large-search-buffer
@@ -19,16 +19,25 @@ done
notmuch new > /dev/null
test_begin_subtest "Ensure that emacs doesn't drop results"
-expected="$(notmuch search '*' | sed -e 's/^thread:[0-9a-f]* //' -e 's/;//' -e 's/xx*/[BLOB]/')
-End of search results."
+notmuch search '*' > EXPEXTED
+sed -i -e 's/^thread:[0-9a-f]* //' -e 's/;//' -e 's/xx*/[BLOB]/' EXPEXTED
+echo 'End of search results.' >> EXPEXTED
-output=$(test_emacs '(notmuch-search "*") (notmuch-test-wait) (princ (buffer-string))' | sed -e s', *, ,g' -e 's/xxx*/[BLOB]/g')
-test_expect_equal "$output" "$expected"
+test_emacs '(notmuch-search "*")
+ (notmuch-test-wait)
+ (test-output)'
+sed -i -e s', *, ,g' -e 's/xxx*/[BLOB]/g' OUTPUT
+test_expect_equal_file OUTPUT EXPEXTED
test_begin_subtest "Ensure that emacs doesn't drop error messages"
-output=$(test_emacs '(notmuch-search "--this-option-does-not-exist") (notmuch-test-wait) (princ (buffer-string))')
-test_expect_equal "$output" "Error: Unexpected output from notmuch search:
+test_emacs '(notmuch-search "--this-option-does-not-exist")
+ (notmuch-test-wait)
+ (test-output)'
+cat <<EOF >EXPEXTED
+Error: Unexpected output from notmuch search:
Unrecognized option: --this-option-does-not-exist
-End of search results. (process returned 1)"
+End of search results. (process returned 1)
+EOF
+test_expect_equal_file OUTPUT EXPEXTED
test_done
diff --git a/test/maildir-sync b/test/maildir-sync
index 2b43127e..a60854f8 100755
--- a/test/maildir-sync
+++ b/test/maildir-sync
@@ -23,7 +23,6 @@ output=$(notmuch search subject:"Adding S flag" | notmuch_search_sanitize)
output+="
"
mv "${gen_msg_filename}" "${gen_msg_filename}S"
-increment_mtime "$(dirname "${gen_msg_filename}")"
output+=$(NOTMUCH_NEW)
output+="
"
@@ -66,7 +65,6 @@ test_expect_equal "$output" '[[[{"id": "adding-replied-tag@notmuch-test-suite",
test_expect_success 'notmuch reply works with renamed file (without notmuch new)' 'notmuch reply id:${gen_msg_id}'
test_begin_subtest "notmuch new detects no file rename after tag->flag synchronization"
-increment_mtime "$(dirname ${gen_msg_filename})"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail."
@@ -77,7 +75,6 @@ output=$(cd "$MAIL_DIR/cur"; ls message-to-move*)
test_expect_equal "$output" "message-to-move-to-cur:2,S"
test_begin_subtest "No rename should be detected by notmuch new"
-increment_mtime "$MAIL_DIR/cur"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail."
# (*) If notmuch new was not run we've got "Processed 1 file in almost
@@ -85,7 +82,7 @@ test_expect_equal "$output" "No new mail."
# test created directory document in the database but this document
# was not linked as subdirectory of $MAIL_DIR. Therefore notmuch new
# could not reach the cur/ directory and its files in it during
-# recurive traversal.
+# recursive traversal.
#
# XXX: The above sounds like a bug that should be fixed. If notmuch is
# creating new directories in the mail store, then it should be
@@ -97,7 +94,6 @@ output=$(notmuch search subject:"Removing S flag" | notmuch_search_sanitize)
output+="
"
mv "${gen_msg_filename}" "${gen_msg_filename%S}"
-increment_mtime "$(dirname "${gen_msg_filename}")"
output+=$(NOTMUCH_NEW)
output+="
"
@@ -110,7 +106,6 @@ test_begin_subtest "Removing info from filename leaves tags unchanged"
add_message [subject]='"Message to lose maildir info"' [filename]='message-to-lose-maildir-info' [dir]=cur
notmuch tag -unread subject:"Message to lose maildir info"
mv "$MAIL_DIR/cur/message-to-lose-maildir-info:2,S" "$MAIL_DIR/cur/message-without-maildir-info"
-increment_mtime "$MAIL_DIR/cur"
output=$(NOTMUCH_NEW)
output+="
"
@@ -134,7 +129,6 @@ mv $MAIL_DIR/cur/adding-replied-tag:2,RS $MAIL_DIR/cur/adding-replied-tag:2,S
mv $MAIL_DIR/cur/adding-s-flag:2,S $MAIL_DIR/cur/adding-s-flag:2,
mv $MAIL_DIR/cur/adding-with-s-flag:2,S $MAIL_DIR/cur/adding-with-s-flag:2,RS
mv $MAIL_DIR/cur/message-to-move-to-cur:2,S $MAIL_DIR/cur/message-to-move-to-cur:2,DS
-increment_mtime $MAIL_DIR/cur
notmuch dump dump.txt
NOTMUCH_NEW >/dev/null
notmuch restore dump.txt
@@ -144,7 +138,6 @@ test_expect_equal "$output" "$expected"
test_begin_subtest 'Adding flags to duplicate message tags the mail'
add_message [subject]='"Duplicated message"' [dir]=cur [filename]='duplicated-message:2,'
cp "$MAIL_DIR/cur/duplicated-message:2," "$MAIL_DIR/cur/duplicated-message-copy:2,RS"
-increment_mtime $MAIL_DIR/cur
NOTMUCH_NEW > output
notmuch search subject:"Duplicated message" | notmuch_search_sanitize >> output
test_expect_equal "$(< output)" "No new mail.
@@ -152,7 +145,6 @@ thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Duplicated message (inbox repl
test_begin_subtest "Adding duplicate message without flags does not remove tags"
cp "$MAIL_DIR/cur/duplicated-message-copy:2,RS" "$MAIL_DIR/cur/duplicated-message-another-copy:2,"
-increment_mtime $MAIL_DIR/cur
NOTMUCH_NEW > output
notmuch search subject:"Duplicated message" | notmuch_search_sanitize >> output
test_expect_equal "$(< output)" "No new mail.
diff --git a/test/multipart b/test/multipart
index 0879696e..22c42c6a 100755
--- a/test/multipart
+++ b/test/multipart
@@ -88,7 +88,6 @@ Content-Transfer-Encoding: base64
7w0K
--==-=-=--
EOF
-increment_mtime "$MAIL_DIR"
notmuch new > /dev/null
test_begin_subtest "--format=text --part=0, full message"
@@ -110,8 +109,7 @@ Date: Tue, 05 Jan 2001 15:43:57 -0000
Non-text part: text/html
part}
part}
- attachment{ ID: 5, Content-type: text/plain
-Attachment: attachment (text/plain)
+ attachment{ ID: 5, Filename: attachment, Content-type: text/plain
This is a text attachment.
attachment}
part{ ID: 6, Content-type: text/plain
@@ -148,8 +146,7 @@ Date: Tue, 05 Jan 2001 15:43:57 -0000
Non-text part: text/html
part}
part}
- attachment{ ID: 5, Content-type: text/plain
-Attachment: attachment (text/plain)
+ attachment{ ID: 5, Filename: attachment, Content-type: text/plain
This is a text attachment.
attachment}
part{ ID: 6, Content-type: text/plain
@@ -176,8 +173,7 @@ cat <<EOF >EXPECTED
Non-text part: text/html
part}
part}
- attachment{ ID: 5, Content-type: text/plain
-Attachment: attachment (text/plain)
+ attachment{ ID: 5, Filename: attachment, Content-type: text/plain
This is a text attachment.
attachment}
part{ ID: 6, Content-type: text/plain
@@ -209,11 +205,10 @@ Non-text part: text/html
EOF
test_expect_equal_file OUTPUT EXPECTED
-test_begin_subtest "--format=text --part=5, inline attachement"
+test_begin_subtest "--format=text --part=5, inline attachment"
notmuch show --format=text --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
cat <<EOF >EXPECTED
- attachment{ ID: 5, Content-type: text/plain
-Attachment: attachment (text/plain)
+ attachment{ ID: 5, Filename: attachment, Content-type: text/plain
This is a text attachment.
attachment}
EOF
diff --git a/test/new b/test/new
index 1b7296e8..49f390d6 100755
--- a/test/new
+++ b/test/new
@@ -52,10 +52,8 @@ generate_message
tmp_msg_filename=tmp/"$gen_msg_filename"
mkdir -p "$(dirname "$tmp_msg_filename")"
mv "$gen_msg_filename" "$tmp_msg_filename"
-increment_mtime "${MAIL_DIR}"
notmuch new > /dev/null
mv "$tmp_msg_filename" "$gen_msg_filename"
-increment_mtime "${MAIL_DIR}"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "Added 1 new message to the database."
@@ -65,7 +63,6 @@ test_begin_subtest "Renamed message"
generate_message
notmuch new > /dev/null
mv "$gen_msg_filename" "${gen_msg_filename}"-renamed
-increment_mtime "${MAIL_DIR}"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail. Detected 1 file rename."
@@ -73,7 +70,6 @@ test_expect_equal "$output" "No new mail. Detected 1 file rename."
test_begin_subtest "Deleted message"
rm "${gen_msg_filename}"-renamed
-increment_mtime "${MAIL_DIR}"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail. Removed 1 message."
@@ -87,7 +83,6 @@ generate_message [dir]=dir
notmuch new > /dev/null
mv "${MAIL_DIR}"/dir "${MAIL_DIR}"/dir-renamed
-increment_mtime "${MAIL_DIR}"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail. Detected 3 file renames."
@@ -96,7 +91,6 @@ test_expect_equal "$output" "No new mail. Detected 3 file renames."
test_begin_subtest "Deleted directory"
rm -rf "${MAIL_DIR}"/dir-renamed
-increment_mtime "${MAIL_DIR}"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail. Removed 3 messages."
@@ -115,7 +109,6 @@ test_expect_equal "$output" "Added 3 new messages to the database."
test_begin_subtest "Deleted directory (end of list)"
rm -rf "${MAIL_DIR}"/zzz
-increment_mtime "${MAIL_DIR}"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail. Removed 3 messages."
@@ -139,7 +132,6 @@ external_msg_filename="$PWD"/external/"$(basename "$gen_msg_filename")"
mkdir -p "$(dirname "$external_msg_filename")"
mv "$gen_msg_filename" "$external_msg_filename"
ln -s "$external_msg_filename" "$gen_msg_filename"
-increment_mtime "${MAIL_DIR}"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "Added 1 new message to the database."
@@ -157,7 +149,6 @@ test_expect_equal "$output" "Added 3 new messages to the database."
test_begin_subtest "Deleted two-level directory"
rm -rf "${MAIL_DIR}"/two
-increment_mtime "${MAIL_DIR}"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail. Removed 3 messages."
diff --git a/test/search-by-folder b/test/search-by-folder
index 4afa483d..5cc2ca8d 100755
--- a/test/search-by-folder
+++ b/test/search-by-folder
@@ -23,14 +23,12 @@ test_expect_equal "$output" "thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; B
test_begin_subtest "After removing duplicate instance of matching path"
rm -r "${MAIL_DIR}/bad/news"
-increment_mtime "${MAIL_DIR}/bad"
notmuch new
output=$(notmuch search folder:bad/news | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Bears (inbox unread)"
test_begin_subtest "After rename, old path returns nothing"
mv "${MAIL_DIR}/duplicate/bad/news" "${MAIL_DIR}/duplicate/bad/olds"
-increment_mtime "${MAIL_DIR}/duplicate/bad"
notmuch new
output=$(notmuch search folder:bad/news | notmuch_search_sanitize)
test_expect_equal "$output" ""
diff --git a/test/search-folder-coherence b/test/search-folder-coherence
index 9c312542..f8119cbb 100755
--- a/test/search-folder-coherence
+++ b/test/search-folder-coherence
@@ -36,7 +36,6 @@ test_expect_equal "$output" "thread:0000000000000001 2001-01-05 [1/1] Notmuch
test_begin_subtest "Remove folder:spam copy of email"
rm $dir/spam/$(basename $file_x)
-increment_mtime $dir/spam
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail. Detected 1 file rename."
diff --git a/test/search-output b/test/search-output
index 3c875cd1..10291c3b 100755
--- a/test/search-output
+++ b/test/search-output
@@ -207,6 +207,7 @@ MAIL_DIR/cur/22:2,
MAIL_DIR/cur/21:2,
MAIL_DIR/cur/19:2,
MAIL_DIR/cur/18:2,
+MAIL_DIR/cur/51:2,
MAIL_DIR/cur/20:2,
MAIL_DIR/cur/17:2,
MAIL_DIR/cur/16:2,
@@ -263,6 +264,7 @@ cat <<EOF >EXPECTED
"MAIL_DIR/cur/21:2,",
"MAIL_DIR/cur/19:2,",
"MAIL_DIR/cur/18:2,",
+"MAIL_DIR/cur/51:2,",
"MAIL_DIR/cur/20:2,",
"MAIL_DIR/cur/17:2,",
"MAIL_DIR/cur/16:2,",
diff --git a/test/symbol-hiding b/test/symbol-hiding
index bb555245..d0b31aec 100755
--- a/test/symbol-hiding
+++ b/test/symbol-hiding
@@ -12,13 +12,13 @@ test_description='exception symbol hiding'
. ./test-lib.sh
run_test(){
- result=$(LD_LIBRARY_PATH=../../lib ./symbol-test 2>&1)
+ result=$(LD_LIBRARY_PATH=$TEST_DIRECTORY/../lib ./symbol-test 2>&1)
}
output="A Xapian exception occurred opening database: Couldn't stat 'fakedb/.notmuch/xapian'
caught No chert database found at path \`./nonexistant'"
-g++ -o symbol-test -I../../lib ../symbol-test.cc -L../../lib -lnotmuch -lxapian
+g++ -o symbol-test -I$TEST_DIRECTORY/../lib $TEST_DIRECTORY/symbol-test.cc -L$TEST_DIRECTORY/../lib -lnotmuch -lxapian
mkdir -p fakedb/.notmuch
test_expect_success 'running test' run_test
test_begin_subtest 'checking output'
diff --git a/test/test-lib.el b/test/test-lib.el
index 94399962..a7839368 100644
--- a/test/test-lib.el
+++ b/test/test-lib.el
@@ -20,6 +20,30 @@
;;
;; Authors: Dmitry Kurochkin <dmitry.kurochkin@gmail.com>
+;; avoid crazy 10-column default of --batch
+(set-frame-width (window-frame (get-buffer-window)) 80)
+
+;; `read-file-name' by default uses `completing-read' function to read
+;; user input. It does not respect `standard-input' variable which we
+;; use in tests to provide user input. So replace it with a plain
+;; `read' call.
+(setq read-file-name-function (lambda (&rest _) (read)))
+
+(defun notmuch-test-wait ()
+ "Wait for process completion."
+ (while (get-buffer-process (current-buffer))
+ (sleep-for 0.1)))
+
+(defun test-output (&optional filename)
+ "Save current buffer to file FILENAME. Default FILENAME is OUTPUT."
+ (write-region (point-min) (point-max) (or filename "OUTPUT")))
+
+(defun test-visible-output (&optional filename)
+ "Save visible text in current buffer to file FILENAME. Default
+FILENAME is OUTPUT."
+ (let ((text (visible-buffer-string)))
+ (with-temp-file (or filename "OUTPUT") (insert text))))
+
(defun visible-buffer-string ()
"Same as `buffer-string', but excludes invisible text."
(visible-buffer-substring (point-min) (point-max)))
@@ -33,3 +57,10 @@
(setq str (concat str (buffer-substring start next-pos))))
(setq start next-pos)))
str))
+
+(defun orphan-watchdog (pid)
+ "Periodically check that the process with id PID is still
+running, quit if it terminated."
+ (if (not (process-attributes pid))
+ (kill-emacs)
+ (run-at-time "1 min" nil 'orphan-watchdog pid)))
diff --git a/test/test-lib.sh b/test/test-lib.sh
index a59d1c13..22e387e4 100755
--- a/test/test-lib.sh
+++ b/test/test-lib.sh
@@ -213,16 +213,6 @@ remove_cr () {
tr '\015' Q | sed -e 's/Q$//'
}
-# Notmuch helper functions
-increment_mtime_amount=0
-increment_mtime ()
-{
- dir="$1"
-
- increment_mtime_amount=$((increment_mtime_amount + 1))
- touch -d "+${increment_mtime_amount} seconds" "$dir"
-}
-
# Generate a new message in the mail directory, with a unique message
# ID and subject. The message is not added to the index.
#
@@ -364,9 +354,6 @@ Date: ${template[date]}
${additional_headers}
${template[body]}
EOF
-
- # Ensure that the mtime of the containing directory is updated
- increment_mtime "$(dirname "${gen_msg_filename}")"
}
# Generate a new message and add it to the database.
@@ -392,9 +379,22 @@ emacs_deliver_message ()
shift 2
# before we can send a message, we have to prepare the FCC maildir
mkdir -p "$MAIL_DIR"/sent/{cur,new,tmp}
- ../smtp-dummy sent_message &
+ $TEST_DIRECTORY/smtp-dummy sent_message &
smtp_dummy_pid=$!
- test_emacs "(setq message-send-mail-function 'message-smtpmail-send-it) (setq smtpmail-smtp-server \"localhost\") (setq smtpmail-smtp-service \"25025\") (notmuch-hello) (notmuch-mua-mail) (message-goto-to) (insert \"test_suite@notmuchmail.org\nDate: 01 Jan 2000 12:00:00 -0000\") (message-goto-subject) (insert \"${subject}\") (message-goto-body) (insert \"${body}\") $@ (message-send-and-exit)" >/dev/null 2>&1
+ test_emacs \
+ "(let ((message-send-mail-function 'message-smtpmail-send-it)
+ (smtpmail-smtp-server \"localhost\")
+ (smtpmail-smtp-service \"25025\"))
+ (notmuch-hello)
+ (notmuch-mua-mail)
+ (message-goto-to)
+ (insert \"test_suite@notmuchmail.org\nDate: 01 Jan 2000 12:00:00 -0000\")
+ (message-goto-subject)
+ (insert \"${subject}\")
+ (message-goto-body)
+ (insert \"${body}\")
+ $@
+ (message-send-and-exit))" >/dev/null 2>&1
wait ${smtp_dummy_pid}
notmuch new >/dev/null
}
@@ -408,12 +408,12 @@ emacs_deliver_message ()
add_email_corpus ()
{
rm -rf ${MAIL_DIR}
- if [ -d ../corpus.mail ]; then
- cp -a ../corpus.mail ${MAIL_DIR}
+ if [ -d $TEST_DIRECTORY/corpus.mail ]; then
+ cp -a $TEST_DIRECTORY/corpus.mail ${MAIL_DIR}
else
- cp -a ../corpus ${MAIL_DIR}
+ cp -a $TEST_DIRECTORY/corpus ${MAIL_DIR}
notmuch new >/dev/null
- cp -a ${MAIL_DIR} ../corpus.mail
+ cp -a ${MAIL_DIR} $TEST_DIRECTORY/corpus.mail
fi
}
@@ -424,7 +424,7 @@ test_begin_subtest ()
error "bug in test script: Missing test_expect_equal in ${BASH_SOURCE[1]}:${BASH_LINENO[0]}"
fi
test_subtest_name="$1"
- # Remember stdout and stderr file descriptios and redirect test
+ # Remember stdout and stderr file descriptors and redirect test
# output to the previously prepared file descriptors 3 and 4 (see
# below)
if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi
@@ -816,6 +816,8 @@ test_done () {
echo
+ [ -n "$EMACS_SERVER" ] && test_emacs '(kill-emacs)'
+
if [ "$test_failure" = "0" ]; then
if [ "$test_broken" = "0" ]; then
rm -rf "$remove_tmp"
@@ -826,25 +828,17 @@ test_done () {
fi
}
-test_emacs () {
+emacs_generate_script () {
# Construct a little test script here for the benefit of the user,
# (who can easily run "run_emacs" to get the same emacs environment
# for investigating any failures).
- cat <<EOF > run_emacs
+ cat <<EOF >"$TMP_DIRECTORY/run_emacs"
#!/bin/sh
export PATH=$PATH
export NOTMUCH_CONFIG=$NOTMUCH_CONFIG
-# We assume that the user will give a command-line argument only if
-# wanting to run in batch mode.
-if [ \$# -gt 0 ]; then
- BATCH=--batch
-fi
-
# Here's what we are using here:
#
-# --batch: Quit after given commands and print all (messages)
-#
# --no-init-file Don't load users ~/.emacs
#
# --no-site-file Don't load the site-wide startup stuff
@@ -852,24 +846,25 @@ fi
# --directory Ensure that the local elisp sources are found
#
# --load Force loading of notmuch.el and test-lib.el
-#
-# notmuch-test-wait Function for tests to use to wait for process completion
-#
-# message-signature Avoiding appending user's signature on messages
-#
-# set-frame-width 80 columns (avoids crazy 10-column default of --batch)
-
-emacs \$BATCH --no-init-file --no-site-file \
- --directory ../../emacs --load notmuch.el \
- --directory .. --load test-lib.el \
- --eval "(defun notmuch-test-wait ()
- (while (get-buffer-process (current-buffer))
- (sleep-for 0.1)))" \
- --eval "(setq message-signature nil)" \
- --eval "(progn (set-frame-width (window-frame (get-buffer-window)) 80) \$@)"
+
+emacs --no-init-file --no-site-file \
+ --directory "$TEST_DIRECTORY/../emacs" --load notmuch.el \
+ --directory "$TEST_DIRECTORY" --load test-lib.el \
+ "\$@"
EOF
- chmod a+x ./run_emacs
- ./run_emacs "$@"
+ chmod a+x "$TMP_DIRECTORY/run_emacs"
+}
+
+test_emacs () {
+ if [ -z "$EMACS_SERVER" ]; then
+ EMACS_SERVER="notmuch-test-suite-$$"
+ "$TMP_DIRECTORY/run_emacs" \
+ --daemon \
+ --eval "(setq server-name \"$EMACS_SERVER\")" \
+ --eval "(orphan-watchdog $$)" || return
+ fi
+
+ emacsclient --socket-name="$EMACS_SERVER" --eval "(progn $@)"
}
@@ -925,11 +920,11 @@ then
test ! -d "$symlink_target" &&
test "#!" != "$(head -c 2 < "$symlink_target")"
then
- symlink_target=../valgrind.sh
+ symlink_target=$TEST_DIRECTORY/valgrind.sh
fi
case "$base" in
*.sh|*.perl)
- symlink_target=../unprocessed-script
+ symlink_target=$TEST_DIRECTORY/unprocessed-script
esac
# create the link, or replace it if it is out of date
make_symlink "$symlink_target" "$GIT_VALGRIND/bin/$base" || exit
@@ -997,6 +992,8 @@ primary_email=test_suite@notmuchmail.org
other_email=test_suite_other@notmuchmail.org;test_suite@otherdomain.org
EOF
+emacs_generate_script
+
# Use -P to resolve symlinks in our working directory so that the cwd
# in subprocesses like git equals our $PWD (for pathname comparisons).
diff --git a/test/uuencode b/test/uuencode
index d0d16bdd..b3e1ac19 100755
--- a/test/uuencode
+++ b/test/uuencode
@@ -5,11 +5,11 @@ test_description="handling of uuencoded data"
add_message [subject]=uuencodetest '[date]="Sat, 01 Jan 2000 12:00:00 -0000"' \
'[body]="This message is used to ensure that notmuch correctly handles a
message containing a block of uuencoded data. First, we have a marker
-this content beforeuudata . Then we beging the uunencoded data itself:
+this content beforeuudata . Then we begin the uuencoded data itself:
begin 644 bogus-uuencoded-data
M0123456789012345678901234567890123456789012345678901234567890
-MOBVIOUSLY, THIS IS NOT ANY SORT OF USEFUL UUNECODED DATA.
+MOBVIOUSLY, THIS IS NOT ANY SORT OF USEFUL UUENCODED DATA.
MINSTEAD THIS IS JUST A WAY TO ENSURE THAT THIS BLOCK OF DATA
MIS CORRECTLY IGNORED WHEN NOTMUCH CREATES ITS INDEX. SO WE
MINCLUDE A DURINGUUDATA MARKER THAT SHOULD NOT RESULT IN ANY
diff --git a/vim/README b/vim/README
index 12ad2bb4..53f1c4e1 100644
--- a/vim/README
+++ b/vim/README
@@ -7,8 +7,9 @@ Dependencies:
notmuch:
Naturally, it expects you have notmuch installed and configured.
- mailx:
- To send mail, notmuch.vim uses the UNIX mailx command.
+ sendmail:
+ To send mail, notmuch.vim uses sendmail as default. Most modern MTAs
+ provide a compatibility binary, and so should work well.
To install:
@@ -37,7 +38,7 @@ Buffer types:
You are presented with the search results when you run :NotMuch.
Keybindings:
- <Space> - show the selected thread colapsing unmatched items
+ <Space> - show the selected thread collapsing unmatched items
<Enter> - show the entire selected thread
a - archive message (remove inbox tag)
f - filter the current search terms
diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim
index c731c471..21985c71 100644
--- a/vim/plugin/notmuch.vim
+++ b/vim/plugin/notmuch.vim
@@ -25,7 +25,7 @@
let s:notmuch_defaults = {
\ 'g:notmuch_cmd': 'notmuch' ,
- \ 'g:notmuch_sendmail': 'sendmail' ,
+ \ 'g:notmuch_sendmail': '/usr/sbin/sendmail' ,
\ 'g:notmuch_debug': 0 ,
\
\ 'g:notmuch_search_newest_first': 1 ,
@@ -58,7 +58,7 @@ let s:notmuch_defaults = {
\
\ 'g:notmuch_compose_insert_mode_start': 1 ,
\ 'g:notmuch_compose_header_help': 1 ,
- \ 'g:notmuch_compose_temp_file_dir': '~/.notmuch/compose/' ,
+ \ 'g:notmuch_compose_temp_file_dir': '~/.notmuch/compose' ,
\ }
" defaults for g:notmuch_initial_search_words
@@ -149,7 +149,7 @@ let g:notmuch_show_maps = {
\ 'b': ':call <SID>NM_show_fold_toggle(''b'', ''bdy'', !g:notmuch_show_fold_bodies)<CR>',
\ 'c': ':call <SID>NM_show_fold_toggle(''c'', ''cit'', !g:notmuch_show_fold_citations)<CR>',
\ 'h': ':call <SID>NM_show_fold_toggle(''h'', ''hdr'', !g:notmuch_show_fold_headers)<CR>',
- \ 'i': ':call <SID>NM_show_fold_toggle(''s'', ''sig'', !g:notmuch_show_fold_signatures)<CR>',
+ \ 'i': ':call <SID>NM_show_fold_toggle(''i'', ''sig'', !g:notmuch_show_fold_signatures)<CR>',
\
\ 'I': ':call <SID>NM_show_mark_read_thread()<CR>',
\ 'a': ':call <SID>NM_show_archive_thread()<CR>',
@@ -262,12 +262,12 @@ function! s:NM_cmd_search_fmtline(line)
return 'ERROR PARSING: ' . a:line
endif
let max = g:notmuch_search_from_column_width
- let flist = []
- for at in split(m[4], ", ")
- let p = min([stridx(at, "."), stridx(at, "@")])
- call insert(flist, tolower(at[0:p - 1]))
+ let flist = {}
+ for at in split(m[4], '[|,] ')
+ let p = split(at, '[@.]')
+ let flist[p[0]] = 1
endfor
- let from = join(flist, ", ")
+ let from = join(keys(flist), ", ")
return printf("%-12s %3s %-20.20s | %s (%s)", m[2], m[3], from, m[5], m[6])
endfunction
@@ -596,7 +596,7 @@ function! s:NM_show_advance_marking_read_and_archiving()
let filter = <SID>NM_combine_tags('tag:', advance_tags, 'OR', '()')
\ + ['AND']
\ + <SID>NM_combine_tags('', ids, 'OR', '()')
- call map(advance_tags, '"+" . v:val')
+ call map(advance_tags, '"-" . v:val')
call <SID>NM_tag(filter, advance_tags)
call <SID>NM_show_next(1, 1)
return
@@ -747,8 +747,11 @@ function! s:NM_cmd_show_parse(inlines)
elseif mode_type == 'cit'
if part_end || match(line, g:notmuch_show_citation_regexp) == -1
let outlnum = len(info['disp'])
- let foldinfo = [ mode_type, mode_start, outlnum-1, len(info['msgs']),
- \ printf('[ %d-line citation. Press "c" to show. ]', outlnum - mode_start) ]
+ if !part_end
+ let outlnum = outlnum - 1
+ endif
+ let foldinfo = [ mode_type, mode_start, outlnum, len(info['msgs']),
+ \ printf('[ %d-line citation. Press "c" to show. ]', 1 + outlnum - mode_start) ]
let mode_type = ''
endif
elseif mode_type == 'sig'
@@ -756,8 +759,8 @@ function! s:NM_cmd_show_parse(inlines)
if (outlnum - mode_start) > g:notmuch_show_signature_lines_max
let mode_type = ''
elseif part_end
- let foldinfo = [ mode_type, mode_start, outlnum-1, len(info['msgs']),
- \ printf('[ %d-line signature. Press "s" to show. ]', outlnum - mode_start) ]
+ let foldinfo = [ mode_type, mode_start, outlnum, len(info['msgs']),
+ \ printf('[ %d-line signature. Press "i" to show. ]', 1 + outlnum - mode_start) ]
let mode_type = ''
endif
endif
@@ -765,7 +768,7 @@ function! s:NM_cmd_show_parse(inlines)
if part_end
" FIXME: this is a hack for handling two folds being added for one line
- " we should handle addinga fold in a function
+ " we should handle adding a fold in a function
if len(foldinfo) && foldinfo[1] < foldinfo[2]
call add(info['folds'], foldinfo[0:3])
let info['foldtext'][foldinfo[1]] = foldinfo[4]
@@ -796,7 +799,14 @@ function! s:NM_cmd_show_parse(inlines)
endif
call add(info['disp'],
\ printf('--- %s ---', in_part))
- let part_start = len(info['disp']) + 1
+ " We don't yet handle nested parts, so pop
+ " multipart/* immediately so text/plain
+ " sub-parts are parsed properly
+ if match(in_part, '^multipart/') != -1
+ let in_part = ''
+ else
+ let part_start = len(info['disp']) + 1
+ endif
endif
elseif in_header
@@ -1314,7 +1324,7 @@ endfunction
function! s:NM_tag(filter, tags)
let filter = len(a:filter) ? a:filter : [<SID>NM_search_thread_id()]
if !len(filter)
- throw 'Eeek! I couldn''t find the thead id!'
+ throw 'Eeek! I couldn''t find the thread id!'
endif
let args = ['tag']
call extend(args, a:tags)