Notmuch 0.19 (2014-11-14)


This release improves the reliability of notmuch dump and the error handling for notmuch insert. The new notmuch address command is intended to make searching for email addresses more convenient. At the library level the revised handling of missing messages fixes at least one bug in threading. The release also includes several interface improvements to the emacs interface, most notably the ability to bind keyboard shortcuts to saved searches.

Command-Line Interface

Stopped notmuch dump failing if someone writes to the database

The dump command now takes the write lock when running. This prevents other processes from writing to the database during the dump which would cause the dump to fail. Note, if another notmuch process already has the write lock the dump will not start, so script callers should still check the return value.

notmuch insert requires successful message indexing for success status

Previously the notmuch insert subcommand indicated success even if the message indexing failed, as long as the message was delivered to file system. This could have lead to delivered messages missing tags, etc. notmuch insert is now more strict, also requiring successful indexing for success status. Use the new --keep option to revert to the old behaviour (keeping the delivered message file and returning success even if indexing fails).

notmuch insert has gained support for post-insert hook

The new post-insert hook is run after message delivery, similar to post-new. There's also a new option notmuch insert --no-hooks to skip the hook. See the notmuch-hooks(1) man page for details.

notmuch deliver is deprecated

With this release we believe that notmuch insert has reached parity with notmuch deliver. We recommend that all users of notmuch deliver switch to notmuch insert as the former is currently unmaintained.

notmuch search now supports --duplicate=N option with --output=messages

Complementing the notmuch search --duplicate=N --output=files options, the new --duplicate=N --output=messages combination limits output of message IDs to messages matching search terms that have at least N files associated with them.

Added notmuch address subcommand

This new subcommand searches for messages matching the given search terms, and prints the addresses from them. Duplicate addresses are filtered out. The --output option controls which of the following information is printed: sender addresses, recipient addresses and count of duplicate addresses.

Emacs Interface

Use the j key to access saved searches from anywhere in notmuch

j is now globally bound to notmuch-jump, which provides fast, interactive keyboard shortcuts to saved searches. For example, with the default saved searches j i from anywhere in notmuch will bring up the inbox.

Improved handling of the unread tag

Notmuch now marks an open message read (i.e., removes the unread tag) if point enters the message at any time in a show buffer regardless of how point got there (mouse click, cursor command, page up/down, notmuch commands such as n,N etc). This fixes various anomalies or bugs in the previous handling. Additionally it is possible to customize the mark read handling by setting notmuch-show-mark-read-function to a custom function.

Expanded default saved search settings

The default saved searches now include several more common searches, as well as shortcut keys for notmuch-jump.

Improved q binding in notmuch buffers

q will now bury rather than kill a notmuch search, show or tree buffer if there are multiple windows showing the buffer. If only a single window is showing the buffer, it is killed.

notmuch-show-stash-mlarchive-link-alist now supports functions

Some list archives may use a more complicated scheme for referring to messages than just concatenated URL and message ID. For example, patchwork requires a query to translate message ID to a patchwork patch ID. notmuch-show-stash-mlarchive-link-alist now supports functions to better cover such cases. See the help documentation for the variable for details.

Library changes

Introduced database version 3 with support for "database features."

Features are independent aspects of the database schema. Representing these independently of the database version number will let us evolve the database format faster and more incrementally, while maintaining better forwards and backwards compatibility.

Library users are no longer required to call notmuch_database_upgrade

Previously, library users were required to call notmuch_database_needs_upgrade and notmuch_database_upgrade before using a writable database. Even the CLI didn't get this right, and it is no longer required. Now, individual APIs may return NOTMUCH_STATUS_UPGRADE_REQUIRED if the database format is too out of date for that API.

Library users can now abort an atomic section by closing the database

Previously there was no supported way to abort an atomic section. Callers can now simply close the database, and any outstanding atomic section will be aborted.

Add return status to notmuch_database_close and notmuch_database_destroy

Bug fixes and performance improvements for thread linking

The database now represents missing-but-referenced messages ("ghost messages") similarly to how it represents regular messages. This enables an improved thread linking algorithm that performs better and fixes a bug that sometimes prevented notmuch from linking messages into the same thread.


The Perl script has been translated to Python; you'll need Python 2.7 or anything from the 3.x line. Most of the user-facing interface is the same, but nmbug help is now nmbug --help, and the following nmbug commands have slightly different interfaces: archive, commit, fetch, log, pull, push, and status. For details on the new interface for a given command, run nmbug COMMAND --help.


nmbug-status can now optionally load header and footer templates from the config file. Use something like:

  "meta": {
    "header": "<!DOCTYPE html>\n<html lang="en">\n...",
    "footer": "</body></html>",

Python Bindings

Add support for notmuch_query_add_tag_exclude

Build System

The notmuch binaries and libraries are now build with debugging symbols by default. Users concerned with disk space should change the defaults when configuring or use the strip(1) command.