]> git.cworth.org Git - notmuch/commitdiff
Merge tag 'debian/0.17-3'
authorDavid Bremner <david@tethera.net>
Sun, 12 Jan 2014 23:56:25 +0000 (19:56 -0400)
committerDavid Bremner <david@tethera.net>
Sun, 12 Jan 2014 23:56:25 +0000 (19:56 -0400)
uploaded to Debian unstable

18 files changed:
devel/doxygen.cfg [new file with mode: 0644]
emacs/notmuch-lib.el
emacs/notmuch-show.el
emacs/notmuch-tree.el
emacs/notmuch.el
lib/notmuch.h
notmuch-insert.c
performance-test/download/notmuch-email-corpus-0.4.tar.xz.asc [new file with mode: 0644]
performance-test/perf-test-lib.sh
performance-test/version.sh
test/README
test/basic
test/emacs-tree
test/insert
test/notmuch-test
test/test-lib.sh
test/test.expected-output/test-verbose-no
test/test.expected-output/test-verbose-yes

diff --git a/devel/doxygen.cfg b/devel/doxygen.cfg
new file mode 100644 (file)
index 0000000..65d5fb5
--- /dev/null
@@ -0,0 +1,304 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "Notmuch 0.17"
+PROJECT_NUMBER         =
+PROJECT_BRIEF          =
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       =
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = YES
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                =
+TCL_SUBST              =
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = YES
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = YES
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = NO
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = NO
+GENERATE_TESTLIST      = NO
+GENERATE_BUGLIST       = NO
+GENERATE_DEPRECATEDLIST= NO
+ENABLED_SECTIONS       =
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = NO
+SHOW_FILES             = NO
+SHOW_NAMESPACES        = NO
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = lib/notmuch.h
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          =
+RECURSIVE              = NO
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = NO
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = YES
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4
+EXTRA_PACKAGES         =
+LATEX_HEADER           =
+LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = YES
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = NO
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             = __DOXYGEN__
+EXPAND_AS_DEFINED      =
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES               =
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = NO
+EXTERNAL_PAGES         = NO
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = NO
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = Helvetica
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = NO
+INCLUDED_BY_GRAPH      = NO
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = YES
+GENERATE_LEGEND        = NO
+DOT_CLEANUP            = YES
index 49fe64457b3a03e34241fb6741ebf82f19d9c7cd..2be409b39a1abe1fee91b514ce9f96347eb15644 100644 (file)
@@ -231,7 +231,8 @@ depending on the value of `notmuch-poll-script'."
   "Given a prefix key code, return a human-readable string representation.
 
 This is basically just `format-kbd-macro' but we also convert ESC to M-."
-  (let ((desc (format-kbd-macro (vector key))))
+  (let* ((key-vector (if (vectorp key) key (vector key)))
+        (desc (format-kbd-macro key-vector)))
     (if (string= desc "ESC")
        "M-"
       (concat desc " "))))
@@ -337,6 +338,28 @@ of its command symbol."
       (set-buffer-modified-p nil)
       (view-buffer (current-buffer) 'kill-buffer-if-not-modified))))
 
+(defun notmuch-subkeymap-help ()
+  "Show help for a subkeymap."
+  (interactive)
+  (let* ((key (this-command-keys-vector))
+       (prefix (make-vector (1- (length key)) nil))
+       (i 0))
+    (while (< i (length prefix))
+      (aset prefix i (aref key i))
+      (setq i (1+ i)))
+
+    (let* ((subkeymap (key-binding prefix))
+          (ua-keys (where-is-internal 'universal-argument nil t))
+          (prefix-string (notmuch-prefix-key-description prefix))
+          (desc-alist (notmuch-describe-keymap subkeymap ua-keys subkeymap prefix-string))
+          (desc-list (mapcar (lambda (arg) (concat (car arg) "\t" (cdr arg))) desc-alist))
+          (desc (mapconcat #'identity desc-list "\n")))
+      (with-help-window (help-buffer)
+       (with-current-buffer standard-output
+         (insert "\nPress 'q' to quit this window.\n\n")
+         (insert desc)))
+      (pop-to-buffer (help-buffer)))))
+
 (defvar notmuch-buffer-refresh-function nil
   "Function to call to refresh the current buffer.")
 (make-variable-buffer-local 'notmuch-buffer-refresh-function)
index 784644cd18f43e85dcbb009b883e9f2f0d59d233..1ac80cac9cba3559a002da14c78b4a6835047ff3 100644 (file)
@@ -1241,6 +1241,7 @@ reset based on the original query."
     (define-key map "t" 'notmuch-show-stash-to)
     (define-key map "l" 'notmuch-show-stash-mlarchive-link)
     (define-key map "L" 'notmuch-show-stash-mlarchive-link-and-go)
+    (define-key map "?" 'notmuch-subkeymap-help)
     map)
   "Submap for stash commands")
 (fset 'notmuch-show-stash-map notmuch-show-stash-map)
@@ -1251,6 +1252,7 @@ reset based on the original query."
     (define-key map "v" 'notmuch-show-view-part)
     (define-key map "o" 'notmuch-show-interactively-view-part)
     (define-key map "|" 'notmuch-show-pipe-part)
+    (define-key map "?" 'notmuch-subkeymap-help)
     map)
   "Submap for part commands")
 (fset 'notmuch-show-part-map notmuch-show-part-map)
index 8d59e65f6396ffedd5ef409c5c671d6b016ca883..1dde9a7af91c128886821823795e36ce772fd54d 100644 (file)
@@ -319,11 +319,13 @@ correct message properties."
   "Return the tags of the current message."
   (notmuch-tree-get-prop :tags))
 
-(defun notmuch-tree-get-message-id ()
+(defun notmuch-tree-get-message-id (&optional bare)
   "Return the message id of the current message."
   (let ((id (notmuch-tree-get-prop :id)))
     (if id
-       (notmuch-id-to-query id)
+       (if bare
+           id
+         (notmuch-id-to-query id))
       nil)))
 
 (defun notmuch-tree-get-match ()
index c9bc2f22c7d43a21598e2c189ef6fe3f0f738f5a..047175001c777d0e7fe9dfa26bdb69a0dd668a2d 100644 (file)
@@ -165,6 +165,7 @@ To enter a line break in customize, press \\[quoted-insert] C-j."
 (defvar notmuch-search-stash-map
   (let ((map (make-sparse-keymap)))
     (define-key map "i" 'notmuch-search-stash-thread-id)
+    (define-key map "?" 'notmuch-subkeymap-help)
     map)
   "Submap for stash commands")
 (fset 'notmuch-search-stash-map notmuch-search-stash-map)
index d30768d908ee72ac63121e1e2ac8df5cde2f87b1..02604c5645c3c881ec490c6ed82a9a02601873d7 100644 (file)
  * Author: Carl Worth <cworth@cworth.org>
  */
 
+/**
+ * @defgroup notmuch The notmuch API
+ *
+ * Not much of an email library, (just index and search)
+ *
+ * @{
+ */
+
 #ifndef NOTMUCH_H
 #define NOTMUCH_H
 
+#ifndef __DOXYGEN__
+
 #ifdef  __cplusplus
 # define NOTMUCH_BEGIN_DECLS  extern "C" {
 # define NOTMUCH_END_DECLS    }
@@ -49,19 +59,28 @@ NOTMUCH_BEGIN_DECLS
 #define LIBNOTMUCH_MINOR_VERSION       1
 #define LIBNOTMUCH_MICRO_VERSION       0
 
-/*
+#endif /* __DOXYGEN__ */
+
+/**
  * Check the version of the notmuch library being compiled against.
  *
  * Return true if the library being compiled against is of the
  * specified version or above. For example:
  *
+ * @code
  * #if LIBNOTMUCH_CHECK_VERSION(3, 1, 0)
  *     (code requiring libnotmuch 3.1.0 or above)
  * #endif
+ * @endcode
+ *
+ * LIBNOTMUCH_CHECK_VERSION has been defined since version 3.1.0; to
+ * check for versions prior to that, use:
  *
- * LIBNOTMUCH_CHECK_VERSION has been defined since version 3.1.0; you
- * can use #if !defined(NOTMUCH_CHECK_VERSION) to check for versions
- * prior to that.
+ * @code
+ * #if !defined(NOTMUCH_CHECK_VERSION)
+ *     (code requiring libnotmuch prior to 3.1.0)
+ * #endif
+ * @endcode
  */
 #define LIBNOTMUCH_CHECK_VERSION (major, minor, micro)                 \
     (LIBNOTMUCH_MAJOR_VERSION > (major) ||                                     \
@@ -69,72 +88,86 @@ NOTMUCH_BEGIN_DECLS
      (LIBNOTMUCH_MAJOR_VERSION == (major) && LIBNOTMUCH_MINOR_VERSION == (minor) && \
       LIBNOTMUCH_MICRO_VERSION >= (micro)))
 
+/**
+ * Notmuch boolean type.
+ */
 typedef int notmuch_bool_t;
 
-/* Status codes used for the return values of most functions.
+/**
+ * Status codes used for the return values of most functions.
  *
  * A zero value (NOTMUCH_STATUS_SUCCESS) indicates that the function
- * completed without error. Any other value indicates an error as
- * follows:
- *
- * NOTMUCH_STATUS_SUCCESS: No error occurred.
- *
- * NOTMUCH_STATUS_OUT_OF_MEMORY: Out of memory
- *
- * XXX: We don't really want to expose this lame XAPIAN_EXCEPTION
- * value. Instead we should map to things like DATABASE_LOCKED or
- * whatever.
- *
- * NOTMUCH_STATUS_READ_ONLY_DATABASE: An attempt was made to write to
- *     a database opened in read-only mode.
- *
- * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred
- *
- * NOTMUCH_STATUS_FILE_ERROR: An error occurred trying to read or
- *     write to a file (this could be file not found, permission
- *     denied, etc.)
- *
- * NOTMUCH_STATUS_FILE_NOT_EMAIL: A file was presented that doesn't
- *     appear to be an email message.
- *
- * NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID: A file contains a message ID
- *     that is identical to a message already in the database.
- *
- * NOTMUCH_STATUS_NULL_POINTER: The user erroneously passed a NULL
- *     pointer to a notmuch function.
- *
- * NOTMUCH_STATUS_TAG_TOO_LONG: A tag value is too long (exceeds
- *     NOTMUCH_TAG_MAX)
- *
- * NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW: The notmuch_message_thaw
- *     function has been called more times than notmuch_message_freeze.
- *
- * NOTMUCH_STATUS_UNBALANCED_ATOMIC: notmuch_database_end_atomic has
- *     been called more times than notmuch_database_begin_atomic.
- *
- * And finally:
- *
- * NOTMUCH_STATUS_LAST_STATUS: Not an actual status value. Just a way
- *     to find out how many valid status values there are.
+ * completed without error. Any other value indicates an error.
  */
 typedef enum _notmuch_status {
+    /**
+     * No error occurred.
+     */
     NOTMUCH_STATUS_SUCCESS = 0,
+    /**
+     * Out of memory.
+     */
     NOTMUCH_STATUS_OUT_OF_MEMORY,
+    /**
+     * An attempt was made to write to a database opened in read-only
+     * mode.
+     */
     NOTMUCH_STATUS_READ_ONLY_DATABASE,
+    /**
+     * A Xapian exception occurred.
+     */
     NOTMUCH_STATUS_XAPIAN_EXCEPTION,
+    /**
+     * An error occurred trying to read or write to a file (this could
+     * be file not found, permission denied, etc.)
+     *
+     * @todo We don't really want to expose this lame XAPIAN_EXCEPTION
+     * value. Instead we should map to things like DATABASE_LOCKED or
+     * whatever.
+     */
     NOTMUCH_STATUS_FILE_ERROR,
+    /**
+     * A file was presented that doesn't appear to be an email
+     * message.
+     */
     NOTMUCH_STATUS_FILE_NOT_EMAIL,
+    /**
+     * A file contains a message ID that is identical to a message
+     * already in the database.
+     */
     NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID,
+    /**
+     * The user erroneously passed a NULL pointer to a notmuch
+     * function.
+     */
     NOTMUCH_STATUS_NULL_POINTER,
+    /**
+     * A tag value is too long (exceeds NOTMUCH_TAG_MAX).
+     */
     NOTMUCH_STATUS_TAG_TOO_LONG,
+    /**
+     * The notmuch_message_thaw function has been called more times
+     * than notmuch_message_freeze.
+     */
     NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW,
+    /**
+     * notmuch_database_end_atomic has been called more times than
+     * notmuch_database_begin_atomic.
+     */
     NOTMUCH_STATUS_UNBALANCED_ATOMIC,
+    /**
+     * The operation is not supported.
+     */
     NOTMUCH_STATUS_UNSUPPORTED_OPERATION,
-
+    /**
+     * Not an actual status value. Just a way to find out how many
+     * valid status values there are.
+     */
     NOTMUCH_STATUS_LAST_STATUS
 } notmuch_status_t;
 
-/* Get a string representation of a notmuch_status_t value.
+/**
+ * Get a string representation of a notmuch_status_t value.
  *
  * The result is read-only.
  */
@@ -143,6 +176,7 @@ notmuch_status_to_string (notmuch_status_t status);
 
 /* Various opaque data types. For each notmuch_<foo>_t see the various
  * notmuch_<foo> functions below. */
+#ifndef __DOXYGEN__
 typedef struct _notmuch_database notmuch_database_t;
 typedef struct _notmuch_query notmuch_query_t;
 typedef struct _notmuch_threads notmuch_threads_t;
@@ -152,8 +186,10 @@ typedef struct _notmuch_message notmuch_message_t;
 typedef struct _notmuch_tags notmuch_tags_t;
 typedef struct _notmuch_directory notmuch_directory_t;
 typedef struct _notmuch_filenames notmuch_filenames_t;
+#endif /* __DOXYGEN__ */
 
-/* Create a new, empty notmuch database located at 'path'.
+/**
+ * Create a new, empty notmuch database located at 'path'.
  *
  * The path should be a top-level directory to a collection of
  * plain-text email messages (one message per file). This call will
@@ -189,12 +225,22 @@ typedef struct _notmuch_filenames notmuch_filenames_t;
 notmuch_status_t
 notmuch_database_create (const char *path, notmuch_database_t **database);
 
+/**
+ * Database open mode for notmuch_database_open.
+ */
 typedef enum {
+    /**
+     * Open database for reading only.
+     */
     NOTMUCH_DATABASE_MODE_READ_ONLY = 0,
+    /**
+     * Open database for reading and writing.
+     */
     NOTMUCH_DATABASE_MODE_READ_WRITE
 } notmuch_database_mode_t;
 
-/* Open an existing notmuch database located at 'path'.
+/**
+ * Open an existing notmuch database located at 'path'.
  *
  * The database should have been created at some time in the past,
  * (not necessarily by this process), by calling
@@ -230,7 +276,8 @@ notmuch_database_open (const char *path,
                       notmuch_database_mode_t mode,
                       notmuch_database_t **database);
 
-/* Close the given notmuch database.
+/**
+ * Close the given notmuch database.
  *
  * After notmuch_database_close has been called, calls to other
  * functions on objects derived from this database may either behave
@@ -244,12 +291,14 @@ notmuch_database_open (const char *path,
 void
 notmuch_database_close (notmuch_database_t *database);
 
-/* A callback invoked by notmuch_database_compact to notify the user
+/**
+ * A callback invoked by notmuch_database_compact to notify the user
  * of the progress of the compaction process.
  */
 typedef void (*notmuch_compact_status_cb_t)(const char *message, void *closure);
 
-/* Compact a notmuch database, backing up the original database to the
+/**
+ * Compact a notmuch database, backing up the original database to the
  * given path.
  *
  * The database will be opened with NOTMUCH_DATABASE_MODE_READ_WRITE
@@ -265,33 +314,41 @@ notmuch_database_compact (const char* path,
                          notmuch_compact_status_cb_t status_cb,
                          void *closure);
 
-/* Destroy the notmuch database, closing it if necessary and freeing
+/**
+ * Destroy the notmuch database, closing it if necessary and freeing
  * all associated resources.
  */
 void
 notmuch_database_destroy (notmuch_database_t *database);
 
-/* Return the database path of the given database.
+/**
+ * Return the database path of the given database.
  *
  * The return value is a string owned by notmuch so should not be
- * modified nor freed by the caller. */
+ * modified nor freed by the caller.
+ */
 const char *
 notmuch_database_get_path (notmuch_database_t *database);
 
-/* Return the database format version of the given database. */
+/**
+ * Return the database format version of the given database.
+ */
 unsigned int
 notmuch_database_get_version (notmuch_database_t *database);
 
-/* Does this database need to be upgraded before writing to it?
+/**
+ * Does this database need to be upgraded before writing to it?
  *
  * If this function returns TRUE then no functions that modify the
  * database (notmuch_database_add_message, notmuch_message_add_tag,
  * notmuch_directory_set_mtime, etc.) will work unless the function
- * notmuch_database_upgrade is called successfully first. */
+ * notmuch_database_upgrade is called successfully first.
+ */
 notmuch_bool_t
 notmuch_database_needs_upgrade (notmuch_database_t *database);
 
-/* Upgrade the current database.
+/**
+ * Upgrade the current database.
  *
  * After opening a database in read-write mode, the client should
  * check if an upgrade is needed (notmuch_database_needs_upgrade) and
@@ -310,7 +367,8 @@ notmuch_database_upgrade (notmuch_database_t *database,
                                                   double progress),
                          void *closure);
 
-/* Begin an atomic database operation.
+/**
+ * Begin an atomic database operation.
  *
  * Any modifications performed between a successful begin and a
  * notmuch_database_end_atomic will be applied to the database
@@ -331,7 +389,8 @@ notmuch_database_upgrade (notmuch_database_t *database,
 notmuch_status_t
 notmuch_database_begin_atomic (notmuch_database_t *notmuch);
 
-/* Indicate the end of an atomic database operation.
+/**
+ * Indicate the end of an atomic database operation.
  *
  * Return value:
  *
@@ -346,7 +405,8 @@ notmuch_database_begin_atomic (notmuch_database_t *notmuch);
 notmuch_status_t
 notmuch_database_end_atomic (notmuch_database_t *notmuch);
 
-/* Retrieve a directory object from the database for 'path'.
+/**
+ * Retrieve a directory object from the database for 'path'.
  *
  * Here, 'path' should be a path relative to the path of 'database'
  * (see notmuch_database_get_path), or else should be an absolute path
@@ -369,7 +429,8 @@ notmuch_database_get_directory (notmuch_database_t *database,
                                const char *path,
                                notmuch_directory_t **directory);
 
-/* Add a new message to the given notmuch database or associate an
+/**
+ * Add a new message to the given notmuch database or associate an
  * additional filename with an existing message.
  *
  * Here, 'filename' should be a path relative to the path of
@@ -420,7 +481,8 @@ notmuch_database_add_message (notmuch_database_t *database,
                              const char *filename,
                              notmuch_message_t **message);
 
-/* Remove a message filename from the given notmuch database. If the
+/**
+ * Remove a message filename from the given notmuch database. If the
  * message has no more filenames, remove the message.
  *
  * If the same message (as determined by the message ID) is still
@@ -448,7 +510,8 @@ notmuch_status_t
 notmuch_database_remove_message (notmuch_database_t *database,
                                 const char *filename);
 
-/* Find a message with the given message_id.
+/**
+ * Find a message with the given message_id.
  *
  * If a message with the given message_id is found then, on successful return
  * (NOTMUCH_STATUS_SUCCESS) '*message' will be initialized to a message
@@ -475,7 +538,8 @@ notmuch_database_find_message (notmuch_database_t *database,
                               const char *message_id,
                               notmuch_message_t **message);
 
-/* Find a message with the given filename.
+/**
+ * Find a message with the given filename.
  *
  * If the database contains a message with the given filename then, on
  * successful return (NOTMUCH_STATUS_SUCCESS) '*message' will be initialized to
@@ -502,7 +566,8 @@ notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,
                                           const char *filename,
                                           notmuch_message_t **message);
 
-/* Return a list of all tags found in the database.
+/**
+ * Return a list of all tags found in the database.
  *
  * This function creates a list of all tags found in the database. The
  * resulting list contains all tags from all messages found in the database.
@@ -512,7 +577,8 @@ notmuch_database_find_message_by_filename (notmuch_database_t *notmuch,
 notmuch_tags_t *
 notmuch_database_get_all_tags (notmuch_database_t *db);
 
-/* Create a new query for 'database'.
+/**
+ * Create a new query for 'database'.
  *
  * Here, 'database' should be an open database, (see
  * notmuch_database_open and notmuch_database_create).
@@ -540,19 +606,36 @@ notmuch_query_t *
 notmuch_query_create (notmuch_database_t *database,
                      const char *query_string);
 
-/* Sort values for notmuch_query_set_sort */
+/**
+ * Sort values for notmuch_query_set_sort.
+ */
 typedef enum {
+    /**
+     * Oldest first.
+     */
     NOTMUCH_SORT_OLDEST_FIRST,
+    /**
+     * Newest first.
+     */
     NOTMUCH_SORT_NEWEST_FIRST,
+    /**
+     * Sort by message-id.
+     */
     NOTMUCH_SORT_MESSAGE_ID,
+    /**
+     * Do not sort.
+     */
     NOTMUCH_SORT_UNSORTED
 } notmuch_sort_t;
 
-/* Return the query_string of this query. See notmuch_query_create. */
+/**
+ * Return the query_string of this query. See notmuch_query_create.
+ */
 const char *
 notmuch_query_get_query_string (notmuch_query_t *query);
 
-/* Exclude values for notmuch_query_set_omit_excluded. The strange
+/**
+ * Exclude values for notmuch_query_set_omit_excluded. The strange
  * order is to maintain backward compatibility: the old FALSE/TRUE
  * options correspond to the new
  * NOTMUCH_EXCLUDE_FLAG/NOTMUCH_EXCLUDE_TRUE options.
@@ -564,7 +647,8 @@ typedef enum {
     NOTMUCH_EXCLUDE_ALL
 } notmuch_exclude_t;
 
-/* Specify whether to omit excluded results or simply flag them.  By
+/**
+ * Specify whether to omit excluded results or simply flag them.  By
  * default, this is set to TRUE.
  *
  * If set to TRUE or ALL, notmuch_query_search_messages will omit excluded
@@ -594,21 +678,29 @@ void
 notmuch_query_set_omit_excluded (notmuch_query_t *query,
                                 notmuch_exclude_t omit_excluded);
 
-/* Specify the sorting desired for this query. */
+/**
+ * Specify the sorting desired for this query.
+ */
 void
 notmuch_query_set_sort (notmuch_query_t *query, notmuch_sort_t sort);
 
-/* Return the sort specified for this query. See notmuch_query_set_sort. */
+/**
+ * Return the sort specified for this query. See
+ * notmuch_query_set_sort.
+ */
 notmuch_sort_t
 notmuch_query_get_sort (notmuch_query_t *query);
 
-/* Add a tag that will be excluded from the query results by default.
+/**
+ * Add a tag that will be excluded from the query results by default.
  * This exclusion will be overridden if this tag appears explicitly in
- * the query. */
+ * the query.
+ */
 void
 notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag);
 
-/* Execute a query for threads, returning a notmuch_threads_t object
+/**
+ * Execute a query for threads, returning a notmuch_threads_t object
  * which can be used to iterate over the results. The returned threads
  * object is owned by the query and as such, will only be valid until
  * notmuch_query_destroy.
@@ -649,7 +741,8 @@ notmuch_query_add_tag_exclude (notmuch_query_t *query, const char *tag);
 notmuch_threads_t *
 notmuch_query_search_threads (notmuch_query_t *query);
 
-/* Execute a query for messages, returning a notmuch_messages_t object
+/**
+ * Execute a query for messages, returning a notmuch_messages_t object
  * which can be used to iterate over the results. The returned
  * messages object is owned by the query and as such, will only be
  * valid until notmuch_query_destroy.
@@ -690,7 +783,8 @@ notmuch_query_search_threads (notmuch_query_t *query);
 notmuch_messages_t *
 notmuch_query_search_messages (notmuch_query_t *query);
 
-/* Destroy a notmuch_query_t along with any associated resources.
+/**
+ * Destroy a notmuch_query_t along with any associated resources.
  *
  * This will in turn destroy any notmuch_threads_t and
  * notmuch_messages_t objects generated by this query, (and in
@@ -701,7 +795,8 @@ notmuch_query_search_messages (notmuch_query_t *query);
 void
 notmuch_query_destroy (notmuch_query_t *query);
 
-/* Is the given 'threads' iterator pointing at a valid thread.
+/**
+ * Is the given 'threads' iterator pointing at a valid thread.
  *
  * When this function returns TRUE, notmuch_threads_get will return a
  * valid object. Whereas when this function returns FALSE,
@@ -713,7 +808,8 @@ notmuch_query_destroy (notmuch_query_t *query);
 notmuch_bool_t
 notmuch_threads_valid (notmuch_threads_t *threads);
 
-/* Get the current thread from 'threads' as a notmuch_thread_t.
+/**
+ * Get the current thread from 'threads' as a notmuch_thread_t.
  *
  * Note: The returned thread belongs to 'threads' and has a lifetime
  * identical to it (and the query to which it belongs).
@@ -727,7 +823,8 @@ notmuch_threads_valid (notmuch_threads_t *threads);
 notmuch_thread_t *
 notmuch_threads_get (notmuch_threads_t *threads);
 
-/* Move the 'threads' iterator to the next thread.
+/**
+ * Move the 'threads' iterator to the next thread.
  *
  * If 'threads' is already pointing at the last thread then the
  * iterator will be moved to a point just beyond that last thread,
@@ -740,7 +837,8 @@ notmuch_threads_get (notmuch_threads_t *threads);
 void
 notmuch_threads_move_to_next (notmuch_threads_t *threads);
 
-/* Destroy a notmuch_threads_t object.
+/**
+ * Destroy a notmuch_threads_t object.
  *
  * It's not strictly necessary to call this function. All memory from
  * the notmuch_threads_t object will be reclaimed when the
@@ -749,7 +847,8 @@ notmuch_threads_move_to_next (notmuch_threads_t *threads);
 void
 notmuch_threads_destroy (notmuch_threads_t *threads);
 
-/* Return an estimate of the number of messages matching a search
+/**
+ * Return an estimate of the number of messages matching a search.
  *
  * This function performs a search and returns Xapian's best
  * guess as to number of matching messages.
@@ -759,8 +858,9 @@ notmuch_threads_destroy (notmuch_threads_t *threads);
  */
 unsigned
 notmuch_query_count_messages (notmuch_query_t *query);
-/* Return the number of threads matching a search.
+
+/**
+ * Return the number of threads matching a search.
  *
  * This function performs a search and returns the number of unique thread IDs
  * in the matching messages. This is the same as number of threads matching a
@@ -774,7 +874,8 @@ notmuch_query_count_messages (notmuch_query_t *query);
 unsigned
 notmuch_query_count_threads (notmuch_query_t *query);
 
-/* Get the thread ID of 'thread'.
+/**
+ * Get the thread ID of 'thread'.
  *
  * The returned string belongs to 'thread' and as such, should not be
  * modified by the caller and will only be valid for as long as the
@@ -784,7 +885,8 @@ notmuch_query_count_threads (notmuch_query_t *query);
 const char *
 notmuch_thread_get_thread_id (notmuch_thread_t *thread);
 
-/* Get the total number of messages in 'thread'.
+/**
+ * Get the total number of messages in 'thread'.
  *
  * This count consists of all messages in the database belonging to
  * this thread. Contrast with notmuch_thread_get_matched_messages() .
@@ -792,7 +894,8 @@ notmuch_thread_get_thread_id (notmuch_thread_t *thread);
 int
 notmuch_thread_get_total_messages (notmuch_thread_t *thread);
 
-/* Get a notmuch_messages_t iterator for the top-level messages in
+/**
+ * Get a notmuch_messages_t iterator for the top-level messages in
  * 'thread' in oldest-first order.
  *
  * This iterator will not necessarily iterate over all of the messages
@@ -804,7 +907,8 @@ notmuch_thread_get_total_messages (notmuch_thread_t *thread);
 notmuch_messages_t *
 notmuch_thread_get_toplevel_messages (notmuch_thread_t *thread);
 
-/* Get a notmuch_thread_t iterator for all messages in 'thread' in
+/**
+ * Get a notmuch_thread_t iterator for all messages in 'thread' in
  * oldest-first order.
  *
  * The returned list will be destroyed when the thread is destroyed.
@@ -812,7 +916,8 @@ notmuch_thread_get_toplevel_messages (notmuch_thread_t *thread);
 notmuch_messages_t *
 notmuch_thread_get_messages (notmuch_thread_t *thread);
 
-/* Get the number of messages in 'thread' that matched the search.
+/**
+ * Get the number of messages in 'thread' that matched the search.
  *
  * This count includes only the messages in this thread that were
  * matched by the search from which the thread was created and were
@@ -823,7 +928,8 @@ notmuch_thread_get_messages (notmuch_thread_t *thread);
 int
 notmuch_thread_get_matched_messages (notmuch_thread_t *thread);
 
-/* Get the authors of 'thread' as a UTF-8 string.
+/**
+ * Get the authors of 'thread' as a UTF-8 string.
  *
  * The returned string is a comma-separated list of the names of the
  * authors of mail messages in the query results that belong to this
@@ -837,7 +943,8 @@ notmuch_thread_get_matched_messages (notmuch_thread_t *thread);
 const char *
 notmuch_thread_get_authors (notmuch_thread_t *thread);
 
-/* Get the subject of 'thread' as a UTF-8 string.
+/**
+ * Get the subject of 'thread' as a UTF-8 string.
  *
  * The subject is taken from the first message (according to the query
  * order---see notmuch_query_set_sort) in the query results that
@@ -851,17 +958,20 @@ notmuch_thread_get_authors (notmuch_thread_t *thread);
 const char *
 notmuch_thread_get_subject (notmuch_thread_t *thread);
 
-/* Get the date of the oldest message in 'thread' as a time_t value.
+/**
+ * Get the date of the oldest message in 'thread' as a time_t value.
  */
 time_t
 notmuch_thread_get_oldest_date (notmuch_thread_t *thread);
 
-/* Get the date of the newest message in 'thread' as a time_t value.
+/**
+ * Get the date of the newest message in 'thread' as a time_t value.
  */
 time_t
 notmuch_thread_get_newest_date (notmuch_thread_t *thread);
 
-/* Get the tags for 'thread', returning a notmuch_tags_t object which
+/**
+ * Get the tags for 'thread', returning a notmuch_tags_t object which
  * can be used to iterate over all tags.
  *
  * Note: In the Notmuch database, tags are stored on individual
@@ -900,11 +1010,14 @@ notmuch_thread_get_newest_date (notmuch_thread_t *thread);
 notmuch_tags_t *
 notmuch_thread_get_tags (notmuch_thread_t *thread);
 
-/* Destroy a notmuch_thread_t object. */
+/**
+ * Destroy a notmuch_thread_t object.
+ */
 void
 notmuch_thread_destroy (notmuch_thread_t *thread);
 
-/* Is the given 'messages' iterator pointing at a valid message.
+/**
+ * Is the given 'messages' iterator pointing at a valid message.
  *
  * When this function returns TRUE, notmuch_messages_get will return a
  * valid object. Whereas when this function returns FALSE,
@@ -916,7 +1029,8 @@ notmuch_thread_destroy (notmuch_thread_t *thread);
 notmuch_bool_t
 notmuch_messages_valid (notmuch_messages_t *messages);
 
-/* Get the current message from 'messages' as a notmuch_message_t.
+/**
+ * Get the current message from 'messages' as a notmuch_message_t.
  *
  * Note: The returned message belongs to 'messages' and has a lifetime
  * identical to it (and the query to which it belongs).
@@ -930,7 +1044,8 @@ notmuch_messages_valid (notmuch_messages_t *messages);
 notmuch_message_t *
 notmuch_messages_get (notmuch_messages_t *messages);
 
-/* Move the 'messages' iterator to the next message.
+/**
+ * Move the 'messages' iterator to the next message.
  *
  * If 'messages' is already pointing at the last message then the
  * iterator will be moved to a point just beyond that last message,
@@ -943,7 +1058,8 @@ notmuch_messages_get (notmuch_messages_t *messages);
 void
 notmuch_messages_move_to_next (notmuch_messages_t *messages);
 
-/* Destroy a notmuch_messages_t object.
+/**
+ * Destroy a notmuch_messages_t object.
  *
  * It's not strictly necessary to call this function. All memory from
  * the notmuch_messages_t object will be reclaimed when the containing
@@ -952,7 +1068,8 @@ notmuch_messages_move_to_next (notmuch_messages_t *messages);
 void
 notmuch_messages_destroy (notmuch_messages_t *messages);
 
-/* Return a list of tags from all messages.
+/**
+ * Return a list of tags from all messages.
  *
  * The resulting list is guaranteed not to contain duplicated tags.
  *
@@ -967,7 +1084,8 @@ notmuch_messages_destroy (notmuch_messages_t *messages);
 notmuch_tags_t *
 notmuch_messages_collect_tags (notmuch_messages_t *messages);
 
-/* Get the message ID of 'message'.
+/**
+ * Get the message ID of 'message'.
  *
  * The returned string belongs to 'message' and as such, should not be
  * modified by the caller and will only be valid for as long as the
@@ -981,7 +1099,8 @@ notmuch_messages_collect_tags (notmuch_messages_t *messages);
 const char *
 notmuch_message_get_message_id (notmuch_message_t *message);
 
-/* Get the thread ID of 'message'.
+/**
+ * Get the thread ID of 'message'.
  *
  * The returned string belongs to 'message' and as such, should not be
  * modified by the caller and will only be valid for as long as the
@@ -995,7 +1114,8 @@ notmuch_message_get_message_id (notmuch_message_t *message);
 const char *
 notmuch_message_get_thread_id (notmuch_message_t *message);
 
-/* Get a notmuch_messages_t iterator for all of the replies to
+/**
+ * Get a notmuch_messages_t iterator for all of the replies to
  * 'message'.
  *
  * Note: This call only makes sense if 'message' was ultimately
@@ -1015,7 +1135,8 @@ notmuch_message_get_thread_id (notmuch_message_t *message);
 notmuch_messages_t *
 notmuch_message_get_replies (notmuch_message_t *message);
 
-/* Get a filename for the email corresponding to 'message'.
+/**
+ * Get a filename for the email corresponding to 'message'.
  *
  * The returned filename is an absolute filename, (the initial
  * component will match notmuch_database_get_path() ).
@@ -1033,7 +1154,8 @@ notmuch_message_get_replies (notmuch_message_t *message);
 const char *
 notmuch_message_get_filename (notmuch_message_t *message);
 
-/* Get all filenames for the email corresponding to 'message'.
+/**
+ * Get all filenames for the email corresponding to 'message'.
  *
  * Returns a notmuch_filenames_t iterator listing all the filenames
  * associated with 'message'. These files may not have identical
@@ -1045,31 +1167,40 @@ notmuch_message_get_filename (notmuch_message_t *message);
 notmuch_filenames_t *
 notmuch_message_get_filenames (notmuch_message_t *message);
 
-/* Message flags */
+/**
+ * Message flags.
+ */
 typedef enum _notmuch_message_flag {
     NOTMUCH_MESSAGE_FLAG_MATCH,
     NOTMUCH_MESSAGE_FLAG_EXCLUDED
 } notmuch_message_flag_t;
 
-/* Get a value of a flag for the email corresponding to 'message'. */
+/**
+ * Get a value of a flag for the email corresponding to 'message'.
+ */
 notmuch_bool_t
 notmuch_message_get_flag (notmuch_message_t *message,
                          notmuch_message_flag_t flag);
 
-/* Set a value of a flag for the email corresponding to 'message'. */
+/**
+ * Set a value of a flag for the email corresponding to 'message'.
+ */
 void
 notmuch_message_set_flag (notmuch_message_t *message,
                          notmuch_message_flag_t flag, notmuch_bool_t value);
 
-/* Get the date of 'message' as a time_t value.
+/**
+ * Get the date of 'message' as a time_t value.
  *
  * For the original textual representation of the Date header from the
  * message call notmuch_message_get_header() with a header value of
- * "date". */
+ * "date".
+ */
 time_t
 notmuch_message_get_date  (notmuch_message_t *message);
 
-/* Get the value of the specified header from 'message' as a UTF-8 string.
+/**
+ * Get the value of the specified header from 'message' as a UTF-8 string.
  *
  * Common headers are stored in the database when the message is
  * indexed and will be returned from the database.  Other headers will
@@ -1087,7 +1218,8 @@ notmuch_message_get_date  (notmuch_message_t *message);
 const char *
 notmuch_message_get_header (notmuch_message_t *message, const char *header);
 
-/* Get the tags for 'message', returning a notmuch_tags_t object which
+/**
+ * Get the tags for 'message', returning a notmuch_tags_t object which
  * can be used to iterate over all tags.
  *
  * The tags object is owned by the message and as such, will only be
@@ -1120,10 +1252,13 @@ notmuch_message_get_header (notmuch_message_t *message, const char *header);
 notmuch_tags_t *
 notmuch_message_get_tags (notmuch_message_t *message);
 
-/* The longest possible tag value. */
+/**
+ * The longest possible tag value.
+ */
 #define NOTMUCH_TAG_MAX 200
 
-/* Add a tag to the given message.
+/**
+ * Add a tag to the given message.
  *
  * Return value:
  *
@@ -1140,7 +1275,8 @@ notmuch_message_get_tags (notmuch_message_t *message);
 notmuch_status_t
 notmuch_message_add_tag (notmuch_message_t *message, const char *tag);
 
-/* Remove a tag from the given message.
+/**
+ * Remove a tag from the given message.
  *
  * Return value:
  *
@@ -1157,7 +1293,8 @@ notmuch_message_add_tag (notmuch_message_t *message, const char *tag);
 notmuch_status_t
 notmuch_message_remove_tag (notmuch_message_t *message, const char *tag);
 
-/* Remove all tags from the given message.
+/**
+ * Remove all tags from the given message.
  *
  * See notmuch_message_freeze for an example showing how to safely
  * replace tag values.
@@ -1168,7 +1305,8 @@ notmuch_message_remove_tag (notmuch_message_t *message, const char *tag);
 notmuch_status_t
 notmuch_message_remove_all_tags (notmuch_message_t *message);
 
-/* Add/remove tags according to maildir flags in the message filename(s)
+/**
+ * Add/remove tags according to maildir flags in the message filename(s).
  *
  * This function examines the filenames of 'message' for maildir
  * flags, and adds or removes tags on 'message' as follows when these
@@ -1202,7 +1340,8 @@ notmuch_message_remove_all_tags (notmuch_message_t *message);
 notmuch_status_t
 notmuch_message_maildir_flags_to_tags (notmuch_message_t *message);
 
-/* Rename message filename(s) to encode tags as maildir flags
+/**
+ * Rename message filename(s) to encode tags as maildir flags.
  *
  * Specifically, for each filename corresponding to this message:
  *
@@ -1238,7 +1377,8 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message);
 notmuch_status_t
 notmuch_message_tags_to_maildir_flags (notmuch_message_t *message);
 
-/* Freeze the current state of 'message' within the database.
+/**
+ * Freeze the current state of 'message' within the database.
  *
  * This means that changes to the message state, (via
  * notmuch_message_add_tag, notmuch_message_remove_tag, and
@@ -1281,7 +1421,8 @@ notmuch_message_tags_to_maildir_flags (notmuch_message_t *message);
 notmuch_status_t
 notmuch_message_freeze (notmuch_message_t *message);
 
-/* Thaw the current 'message', synchronizing any changes that may have
+/**
+ * Thaw the current 'message', synchronizing any changes that may have
  * occurred while 'message' was frozen into the notmuch database.
  *
  * See notmuch_message_freeze for an example of how to use this
@@ -1304,7 +1445,8 @@ notmuch_message_freeze (notmuch_message_t *message);
 notmuch_status_t
 notmuch_message_thaw (notmuch_message_t *message);
 
-/* Destroy a notmuch_message_t object.
+/**
+ * Destroy a notmuch_message_t object.
  *
  * It can be useful to call this function in the case of a single
  * query object with many messages in the result, (such as iterating
@@ -1315,7 +1457,8 @@ notmuch_message_thaw (notmuch_message_t *message);
 void
 notmuch_message_destroy (notmuch_message_t *message);
 
-/* Is the given 'tags' iterator pointing at a valid tag.
+/**
+ * Is the given 'tags' iterator pointing at a valid tag.
  *
  * When this function returns TRUE, notmuch_tags_get will return a
  * valid string. Whereas when this function returns FALSE,
@@ -1327,7 +1470,8 @@ notmuch_message_destroy (notmuch_message_t *message);
 notmuch_bool_t
 notmuch_tags_valid (notmuch_tags_t *tags);
 
-/* Get the current tag from 'tags' as a string.
+/**
+ * Get the current tag from 'tags' as a string.
  *
  * Note: The returned string belongs to 'tags' and has a lifetime
  * identical to it (and the query to which it ultimately belongs).
@@ -1338,7 +1482,8 @@ notmuch_tags_valid (notmuch_tags_t *tags);
 const char *
 notmuch_tags_get (notmuch_tags_t *tags);
 
-/* Move the 'tags' iterator to the next tag.
+/**
+ * Move the 'tags' iterator to the next tag.
  *
  * If 'tags' is already pointing at the last tag then the iterator
  * will be moved to a point just beyond that last tag, (where
@@ -1351,7 +1496,8 @@ notmuch_tags_get (notmuch_tags_t *tags);
 void
 notmuch_tags_move_to_next (notmuch_tags_t *tags);
 
-/* Destroy a notmuch_tags_t object.
+/**
+ * Destroy a notmuch_tags_t object.
  *
  * It's not strictly necessary to call this function. All memory from
  * the notmuch_tags_t object will be reclaimed when the containing
@@ -1360,7 +1506,8 @@ notmuch_tags_move_to_next (notmuch_tags_t *tags);
 void
 notmuch_tags_destroy (notmuch_tags_t *tags);
 
-/* Store an mtime within the database for 'directory'.
+/**
+ * Store an mtime within the database for 'directory'.
  *
  * The 'directory' should be an object retrieved from the database
  * with notmuch_database_get_directory for a particular path.
@@ -1400,35 +1547,44 @@ notmuch_status_t
 notmuch_directory_set_mtime (notmuch_directory_t *directory,
                             time_t mtime);
 
-/* Get the mtime of a directory, (as previously stored with
+/**
+ * Get the mtime of a directory, (as previously stored with
  * notmuch_directory_set_mtime).
  *
  * Returns 0 if no mtime has previously been stored for this
- * directory.*/
+ * directory.
+ */
 time_t
 notmuch_directory_get_mtime (notmuch_directory_t *directory);
 
-/* Get a notmuch_filenames_t iterator listing all the filenames of
+/**
+ * Get a notmuch_filenames_t iterator listing all the filenames of
  * messages in the database within the given directory.
  *
  * The returned filenames will be the basename-entries only (not
- * complete paths). */
+ * complete paths).
+ */
 notmuch_filenames_t *
 notmuch_directory_get_child_files (notmuch_directory_t *directory);
 
-/* Get a notmuch_filenams_t iterator listing all the filenames of
+/**
+ * Get a notmuch_filenams_t iterator listing all the filenames of
  * sub-directories in the database within the given directory.
  *
  * The returned filenames will be the basename-entries only (not
- * complete paths). */
+ * complete paths).
+ */
 notmuch_filenames_t *
 notmuch_directory_get_child_directories (notmuch_directory_t *directory);
 
-/* Destroy a notmuch_directory_t object. */
+/**
+ * Destroy a notmuch_directory_t object.
+ */
 void
 notmuch_directory_destroy (notmuch_directory_t *directory);
 
-/* Is the given 'filenames' iterator pointing at a valid filename.
+/**
+ * Is the given 'filenames' iterator pointing at a valid filename.
  *
  * When this function returns TRUE, notmuch_filenames_get will return
  * a valid string. Whereas when this function returns FALSE,
@@ -1440,7 +1596,8 @@ notmuch_directory_destroy (notmuch_directory_t *directory);
 notmuch_bool_t
 notmuch_filenames_valid (notmuch_filenames_t *filenames);
 
-/* Get the current filename from 'filenames' as a string.
+/**
+ * Get the current filename from 'filenames' as a string.
  *
  * Note: The returned string belongs to 'filenames' and has a lifetime
  * identical to it (and the directory to which it ultimately belongs).
@@ -1451,7 +1608,8 @@ notmuch_filenames_valid (notmuch_filenames_t *filenames);
 const char *
 notmuch_filenames_get (notmuch_filenames_t *filenames);
 
-/* Move the 'filenames' iterator to the next filename.
+/**
+ * Move the 'filenames' iterator to the next filename.
  *
  * If 'filenames' is already pointing at the last filename then the
  * iterator will be moved to a point just beyond that last filename,
@@ -1464,7 +1622,8 @@ notmuch_filenames_get (notmuch_filenames_t *filenames);
 void
 notmuch_filenames_move_to_next (notmuch_filenames_t *filenames);
 
-/* Destroy a notmuch_filenames_t object.
+/**
+ * Destroy a notmuch_filenames_t object.
  *
  * It's not strictly necessary to call this function. All memory from
  * the notmuch_filenames_t object will be reclaimed when the
@@ -1476,6 +1635,8 @@ notmuch_filenames_move_to_next (notmuch_filenames_t *filenames);
 void
 notmuch_filenames_destroy (notmuch_filenames_t *filenames);
 
+/* @} */
+
 NOTMUCH_END_DECLS
 
 #endif
index 2207b1e808d34d48e95875851e9d57cdc7adcb57..55384e33da391e4af2fc53a0cbe80a54b40c20bd 100644 (file)
@@ -295,7 +295,7 @@ copy_stdin (int fdin, int fdout)
  * The file is renamed to encode notmuch tags as maildir flags. */
 static void
 add_file_to_database (notmuch_database_t *notmuch, const char *path,
-                     tag_op_list_t *tag_ops)
+                     tag_op_list_t *tag_ops, notmuch_bool_t synchronize_flags)
 {
     notmuch_message_t *message;
     notmuch_status_t status;
@@ -323,11 +323,15 @@ add_file_to_database (notmuch_database_t *notmuch, const char *path,
 
     if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) {
        /* Don't change tags of an existing message. */
-       status = notmuch_message_tags_to_maildir_flags (message);
-       if (status != NOTMUCH_STATUS_SUCCESS)
-           fprintf (stderr, "Error: failed to sync tags to maildir flags\n");
+       if (synchronize_flags) {
+           status = notmuch_message_tags_to_maildir_flags (message);
+           if (status != NOTMUCH_STATUS_SUCCESS)
+               fprintf (stderr, "Error: failed to sync tags to maildir flags\n");
+       }
     } else {
-       tag_op_list_apply (message, tag_ops, TAG_FLAG_MAILDIR_SYNC);
+       tag_op_flag_t flags = synchronize_flags ? TAG_FLAG_MAILDIR_SYNC : 0;
+
+       tag_op_list_apply (message, tag_ops, flags);
     }
 
     notmuch_message_destroy (message);
@@ -335,7 +339,8 @@ add_file_to_database (notmuch_database_t *notmuch, const char *path,
 
 static notmuch_bool_t
 insert_message (void *ctx, notmuch_database_t *notmuch, int fdin,
-               const char *dir, tag_op_list_t *tag_ops)
+               const char *dir, tag_op_list_t *tag_ops,
+               notmuch_bool_t synchronize_flags)
 {
     char *tmppath;
     char *newpath;
@@ -377,7 +382,7 @@ insert_message (void *ctx, notmuch_database_t *notmuch, int fdin,
 
     /* Even if adding the message to the notmuch database fails,
      * the message is on disk and we consider the delivery completed. */
-    add_file_to_database (notmuch, newpath, tag_ops);
+    add_file_to_database (notmuch, newpath, tag_ops, synchronize_flags);
 
     return TRUE;
 
@@ -400,6 +405,7 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[])
     char *query_string = NULL;
     const char *folder = NULL;
     notmuch_bool_t create_folder = FALSE;
+    notmuch_bool_t synchronize_flags;
     const char *maildir;
     int opt_index;
     unsigned int i;
@@ -420,6 +426,7 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[])
 
     db_path = notmuch_config_get_database_path (config);
     new_tags = notmuch_config_get_new_tags (config, &new_tags_length);
+    synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
 
     tag_ops = tag_op_list_create (config);
     if (tag_ops == NULL) {
@@ -471,7 +478,8 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[])
                               NOTMUCH_DATABASE_MODE_READ_WRITE, &notmuch))
        return 1;
 
-    ret = insert_message (config, notmuch, STDIN_FILENO, maildir, tag_ops);
+    ret = insert_message (config, notmuch, STDIN_FILENO, maildir, tag_ops,
+                         synchronize_flags);
 
     notmuch_database_destroy (notmuch);
 
diff --git a/performance-test/download/notmuch-email-corpus-0.4.tar.xz.asc b/performance-test/download/notmuch-email-corpus-0.4.tar.xz.asc
new file mode 100644 (file)
index 0000000..72dedd8
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.15 (GNU/Linux)
+
+iQGcBAABCAAGBQJSdaDkAAoJEPIClx2kp54sQ54L/ikkvF1fy88hjLitN59v6g2J
+vw85YNRifNHyp/UXI6nt2eXFzyWJiRHuvHFoBgmEsJVxauOKw61Gs2zd53x9Ear4
+MGcQWyiM1cnwX/nD7GvxRQNh33f+FEamTjg+QhG47K0A2YdLWcDC7r9GMatGT11x
+5KE24WQGOqtgQn/9qNtJvkiKIehpRiDTaW/QJ7mTCYeJFjIHJUY8dxyfiTtkJ0z7
+cJ6omehvWSw4STbEg65XJgqykxMdltNEavfvSbAT73FgmkkyXxul0s5hDZ/esd0n
+re3dyDxGt085POiAgPti05a4tJI5EQC2wLBUFri0s2JdMtazcD6yVuHNbVzZ4Do3
+nL/sgwKGUq5wRrPqPWp6HXtZ9zG+/V7hFNrr/l42qGrLqsSh0bqvEnUiwczZLBGy
+NEs4G8VjmfS2cMKePsWaekBAvFUtb47PSB6JIPwpCNvKXDrcCb28eOQVB2atgj1h
+9SktOtWYJhWIQp2YW9iae30Z6lhCcdPRRHTFMQq2nQ==
+=eSMY
+-----END PGP SIGNATURE-----
index 9ee76613414c269c629ce21ceb4a3d8e76f21459..44708cfd8d909581be77ee06a516c150c1d6154f 100644 (file)
@@ -41,52 +41,70 @@ add_email_corpus ()
 {
     rm -rf ${MAIL_DIR}
 
-    case "$corpus_size" in
-       small)
-           mail_subdir="mail/enron/bailey-s"
-           check_for="${TEST_DIRECTORY}/corpus/$mail_subdir"
-           ;;
-       medium)
-           mail_subdir="mail/notmuch-archive"
-           check_for="${TEST_DIRECTORY}/corpus/$mail_subdir"
-           ;;
-       *)
-           mail_subdir=mail
-           check_for="${TEST_DIRECTORY}/corpus/$mail_subdir/enron/wolfe-j"
-    esac
+    CORPUS_DIR=${TEST_DIRECTORY}/corpus
+    mkdir -p "${CORPUS_DIR}"
 
-    MAIL_CORPUS="${TEST_DIRECTORY}/corpus/$mail_subdir"
-    TAG_CORPUS="${TEST_DIRECTORY}/corpus/tags"
+    MAIL_CORPUS="${CORPUS_DIR}/mail.${corpus_size}"
+    TAG_CORPUS="${CORPUS_DIR}/tags"
 
-    args=()
-    if [ ! -d "$TAG_CORPUS" ] ; then
-       args+=("notmuch-email-corpus/tags")
+    if command -v pixz > /dev/null; then
+       XZ=pixz
+    else
+       XZ=xz
     fi
 
-    if [ ! -d "$check_for" ] ; then
-       args+=("notmuch-email-corpus/$mail_subdir")
+    if [ ! -d "${CORPUS_DIR}/manifest" ]; then
+
+       printf "Unpacking manifests\n"
+       tar --extract --use-compress-program ${XZ} --strip-components=1 \
+           --directory ${TEST_DIRECTORY}/corpus \
+           --wildcards --file ../download/notmuch-email-corpus-${PERFTEST_VERSION}.tar.xz \
+           'notmuch-email-corpus/manifest/*'
     fi
 
-    if [[ ${#args[@]} > 0 ]]; then
-       if command -v pixz > /dev/null; then
-           XZ=pixz
+    file_list=$(mktemp file_listXXXXXX)
+    if [ ! -d "$TAG_CORPUS" ] ; then
+       echo "notmuch-email-corpus/tags" >> $file_list
+    fi
+
+    if [ ! -d "$MAIL_CORPUS" ] ; then
+       if [[ "$corpus_size" != "large" ]]; then
+           sed s,^,notmuch-email-corpus/, < \
+               ${TEST_DIRECTORY}/corpus/manifest/MANIFEST.${corpus_size} >> $file_list
        else
-           XZ=xz
+           echo "notmuch-email-corpus/mail" >> $file_list
        fi
+    fi
 
-       printf "Unpacking corpus\n"
-       mkdir -p "${TEST_DIRECTORY}/corpus"
+    if [[ -s $file_list ]]; then
 
+       printf "Unpacking corpus\n"
        tar --checkpoint=.5000 --extract --strip-components=1 \
            --directory ${TEST_DIRECTORY}/corpus \
            --use-compress-program ${XZ} \
            --file ../download/notmuch-email-corpus-${PERFTEST_VERSION}.tar.xz \
-           "${args[@]}"
+           --anchored --recursion \
+           --files-from $file_list
 
        printf "\n"
 
+       if [[ ! -d ${MAIL_CORPUS} ]]; then
+           printf "creating link farm\n"
+
+           if [[ "$corpus_size" = large ]]; then
+               cp -rl ${TEST_DIRECTORY}/corpus/mail ${MAIL_CORPUS}
+           else
+               while read -r file; do
+                   tdir=${MAIL_CORPUS}/$(dirname $file)
+                   mkdir -p $tdir
+                   ln ${TEST_DIRECTORY}/corpus/$file $tdir
+               done <${TEST_DIRECTORY}/corpus/manifest/MANIFEST.${corpus_size}
+           fi
+       fi
+
     fi
 
+    rm $file_list
     cp -lr $TAG_CORPUS $TMP_DIRECTORY/corpus.tags
     cp -lr $MAIL_CORPUS $MAIL_DIR
 }
index afafc737ad0d8a45be0d16048b03749713881639..f02527a7061f05c5135263e6ff483efafd5f2af4 100644 (file)
@@ -1,3 +1,3 @@
 # this should be both a valid Makefile fragment and valid POSIX(ish) shell.
 
-PERFTEST_VERSION=0.3
+PERFTEST_VERSION=0.4
index d12cff24e2bd7a0796446e76c9e1559da46db1d4..79a9b1b2f9a15aba7466e4e5b1b308663dd1296c 100644 (file)
@@ -76,6 +76,14 @@ the tests in one of the following ways.
        TEST_EMACS=my-special-emacs TEST_EMACSCLIENT=my-emacsclient ./emacs
        make test TEST_EMACS=my-special-emacs TEST_EMACSCLIENT=my-emacsclient
 
+Quiet Execution
+---------------
+
+Normally, when new script starts and when test PASSes you get a message
+printed on screen. This printing can be disabled by setting the
+NOTMUCH_TEST_QUIET variable to a non-null value. Message on test
+failures and skips are still printed.
+
 Skipping Tests
 --------------
 If, for any reason, you need to skip one or more tests, you can do so
index 64eb7d74eac5163483a199b0add3f59432a2a299..f7eed320a04509ff43eb5b03df2c9664fc5cf490 100755 (executable)
@@ -74,12 +74,12 @@ suppress_diff_date() {
 }
 
 test_begin_subtest "Ensure that test output is suppressed unless the test fails"
-output=$(cd $TEST_DIRECTORY; ./test-verbose 2>&1 | suppress_diff_date)
+output=$(cd $TEST_DIRECTORY; NOTMUCH_TEST_QUIET= ./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_DIRECTORY; ./test-verbose -v 2>&1 | suppress_diff_date)
+output=$(cd $TEST_DIRECTORY; NOTMUCH_TEST_QUIET= ./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
index 4bdfddd232af020c7e893f3e2f7a61a082d6efb9..8e9f37cbf9c6926f8de1b6e665d545ce90dae725 100755 (executable)
@@ -8,16 +8,14 @@ EXPECTED=$TEST_DIRECTORY/tree.expected-output
 add_email_corpus
 
 test_begin_subtest "Basic notmuch-tree view in emacs"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-           (notmuch-tree "tag:inbox")
+test_emacs '(notmuch-tree "tag:inbox")
            (notmuch-test-wait)
            (test-output)
            (delete-other-windows)'
 test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
 
 test_begin_subtest "Refreshed notmuch-tree view in emacs"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-           (notmuch-tree "tag:inbox")
+test_emacs '(notmuch-tree "tag:inbox")
            (notmuch-test-wait)
            (notmuch-tree-refresh-view)
            (notmuch-test-wait)
@@ -30,8 +28,7 @@ test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-tag-inbox
 # correctly.
 
 test_begin_subtest "Tag message in notmuch tree view (display)"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-           (notmuch-tree "tag:inbox")
+test_emacs '(notmuch-tree "tag:inbox")
            (notmuch-test-wait)
            (forward-line)
            (notmuch-tree-tag (list "+test_tag"))
@@ -44,8 +41,7 @@ output=$(notmuch search --output=messages 'tag:test_tag')
 test_expect_equal "$output" "id:877h1wv7mg.fsf@inf-8657.int-evry.fr"
 
 test_begin_subtest "Untag message in notmuch tree view"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-           (notmuch-tree "tag:inbox")
+test_emacs '(notmuch-tree "tag:inbox")
            (notmuch-test-wait)
            (forward-line)
            (notmuch-tree-tag (list "-test_tag"))
@@ -58,8 +54,7 @@ output=$(notmuch search --output=messages 'tag:test_tag')
 test_expect_equal "$output" ""
 
 test_begin_subtest "Tag thread in notmuch tree view"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-           (notmuch-tree "tag:inbox")
+test_emacs '(notmuch-tree "tag:inbox")
            (notmuch-test-wait)
            ;; move to a sizable thread
            (forward-line 26)
@@ -80,8 +75,7 @@ id:87iqd9rn3l.fsf@vertex.dottedmag
 id:20091117190054.GU3165@dottiness.seas.harvard.edu"
 
 test_begin_subtest "Untag thread in notmuch tree view"
-test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-           (notmuch-tree "tag:inbox")
+test_emacs '(notmuch-tree "tag:inbox")
            (notmuch-test-wait)
            ;; move to the same sizable thread as above
            (forward-line 26)
@@ -147,26 +141,20 @@ cp OUTPUT /tmp/mjwout
 test_expect_equal_file OUTPUT $EXPECTED/notmuch-tree-show-window
 
 test_begin_subtest "Stash id"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-                    (require (quote notmuch-tree))
-                    (notmuch-tree "id:1258498485-sup-142@elly")
+output=$(test_emacs '(notmuch-tree "id:1258498485-sup-142@elly")
                     (notmuch-test-wait)
                     (notmuch-show-stash-message-id)')
 test_expect_equal "$output" "\"Stashed: id:1258498485-sup-142@elly\""
 
 test_begin_subtest "Move to next matching message"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-                    (require (quote notmuch-tree))
-                    (notmuch-tree "from:cworth")
+output=$(test_emacs '(notmuch-tree "from:cworth")
                     (notmuch-test-wait)
                     (notmuch-tree-next-matching-message)
                     (notmuch-show-stash-message-id)')
 test_expect_equal "$output" "\"Stashed: id:878we4qdqf.fsf@yoom.home.cworth.org\""
 
 test_begin_subtest "Move to next thread"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-                    (require (quote notmuch-tree))
-                    (notmuch-tree "tag:inbox")
+output=$(test_emacs '(notmuch-tree "tag:inbox")
                     (notmuch-test-wait)
                     (forward-line 26)
                     (notmuch-tree-next-thread)
@@ -174,9 +162,7 @@ output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
 test_expect_equal "$output" "\"Stashed: id:1258471718-6781-1-git-send-email-dottedmag@dottedmag.net\""
 
 test_begin_subtest "Move to previous thread"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-                    (require (quote notmuch-tree))
-                    (notmuch-tree "tag:inbox")
+output=$(test_emacs '(notmuch-tree "tag:inbox")
                     (notmuch-test-wait)
                     (forward-line 26)
                     (notmuch-tree-prev-thread)
@@ -184,9 +170,7 @@ output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
 test_expect_equal "$output" "\"Stashed: id:20091117190054.GU3165@dottiness.seas.harvard.edu\""
 
 test_begin_subtest "Move to previous previous thread"
-output=$(test_emacs '(add-to-list (quote load-path) "'$PICK_DIR'")
-                    (require (quote notmuch-tree))
-                    (notmuch-tree "tag:inbox")
+output=$(test_emacs '(notmuch-tree "tag:inbox")
                     (notmuch-test-wait)
                     (forward-line 26)
                     (notmuch-tree-prev-thread)
index 550b41329b5968168367b801eb108fd2ee5b80d9..e8dc4c099ed149c1b76e938efc4b16346d7441fc 100755 (executable)
@@ -113,6 +113,16 @@ output=$(notmuch search --output=files id:$gen_msg_id)
 dirname=$(dirname "$output")
 test_expect_equal "$dirname" "$MAIL_DIR/cur"
 
+test_begin_subtest "Insert message with maildir sync off goes to new/"
+OLDCONFIG=$(notmuch config get maildir.synchronize_flags)
+notmuch config set maildir.synchronize_flags false
+gen_insert_msg
+notmuch insert +flagged < "$gen_msg_filename"
+output=$(notmuch search --output=files id:$gen_msg_id)
+dirname=$(dirname "$output")
+notmuch config set maildir.synchronize_flags $OLDCONFIG
+test_expect_equal "$dirname" "$MAIL_DIR/new"
+
 test_begin_subtest "Insert message into folder"
 gen_insert_msg
 notmuch insert --folder=Drafts < "$gen_msg_filename"
index 18593f61d23b14d8386e901eeaeec3b5305fc944..d6fdd3a5d7f3a07d2db111643c80e40fb29a5698 100755 (executable)
@@ -98,6 +98,7 @@ done
 trap - HUP INT TERM
 
 # Report results
+echo
 ./aggregate-results.sh test-results/*
 ev=$?
 
index efa9fb6ff6245b5183d6577b31e2650c2097e0f1..2fcaba656cffc39c51132784ca7bac79593a3a5b 100644 (file)
@@ -25,6 +25,9 @@ fi
 # Make sure echo builtin does not expand backslash-escape sequences by default.
 shopt -u xpg_echo
 
+this_test=${0##*/}
+this_test=${this_test%.sh}
+
 # if --tee was passed, write the output not only to the terminal, but
 # additionally to the file test-results/$BASENAME.out, too.
 case "$GIT_TEST_TEE_STARTED, $* " in
@@ -33,7 +36,7 @@ done,*)
        ;;
 *' --tee '*|*' --va'*)
        mkdir -p test-results
-       BASE=test-results/$(basename "$0" .sh)
+       BASE=test-results/$this_test
        (GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
         echo $? > $BASE.exit) | tee $BASE.out
        test "$(cat $BASE.exit)" = 0
@@ -187,7 +190,18 @@ then
        exit 0
 fi
 
-echo $(basename "$0"): "Testing ${test_description}"
+test_description_printed=
+print_test_description ()
+{
+       test -z "$test_description_printed" || return 0
+       echo
+       echo $this_test: "Testing ${test_description}"
+       test_description_printed=1
+}
+if [ -z "$NOTMUCH_TEST_QUIET" ]
+then
+       print_test_description
+fi
 
 exec 5>&1
 
@@ -748,6 +762,9 @@ test_ok_ () {
                return
        fi
        test_success=$(($test_success + 1))
+       if test -n "$NOTMUCH_TEST_QUIET"; then
+               return 0
+       fi
        say_color pass "%-6s" "PASS"
        echo " $test_subtest_name"
 }
@@ -758,6 +775,7 @@ test_failure_ () {
                return
        fi
        test_failure=$(($test_failure + 1))
+       print_test_description
        test_failure_message_ "FAIL" "$test_subtest_name" "$@"
        test "$immediate" = "" || { GIT_EXIT_OK=t; exit 1; }
        return 1
@@ -1009,7 +1027,7 @@ test_done () {
        GIT_EXIT_OK=t
        test_results_dir="$TEST_DIRECTORY/test-results"
        mkdir -p "$test_results_dir"
-       test_results_path="$test_results_dir/${0%.sh}"
+       test_results_path="$test_results_dir/$this_test"
 
        echo "total $test_count" >> $test_results_path
        echo "success $test_success" >> $test_results_path
@@ -1018,8 +1036,6 @@ test_done () {
        echo "failed $test_failure" >> $test_results_path
        echo "" >> $test_results_path
 
-       echo
-
        [ -n "$EMACS_SERVER" ] && test_emacs '(kill-emacs)'
 
        if [ "$test_failure" = "0" ]; then
@@ -1068,7 +1084,7 @@ test_emacs () {
        test -z "$missing_dependencies" || return
 
        if [ -z "$EMACS_SERVER" ]; then
-               emacs_tests="$(basename $0).el"
+               emacs_tests="${this_test}.el"
                if [ -f "$TEST_DIRECTORY/$emacs_tests" ]; then
                        load_emacs_tests="--eval '(load \"$emacs_tests\")'"
                else
@@ -1182,7 +1198,6 @@ else
        exec 4>test.output 3>&4
 fi
 
-this_test=${0##*/}
 for skp in $NOTMUCH_SKIP_TESTS
 do
        to_skip=
index 0bca7540f0e76d4e62ff3dc9b4bcdb2bbfb4b3bc..1a2ff6196bbefb28123f534e37e94257b6157db2 100644 (file)
@@ -1,3 +1,4 @@
+
 test-verbose: Testing the verbosity options of the test framework itself.
  PASS   print something in test_expect_success and pass
  FAIL   print something in test_expect_success and fail
index ebe5187444a0d5a7ecae776a1900d8024948ebf2..d25466e9dc00a9b6556a8d92ee659f89669ac133 100644 (file)
@@ -1,3 +1,4 @@
+
 test-verbose: Testing the verbosity options of the test framework itself.
 hello stdout
 hello stderr