diff --git a/Makefile.local b/Makefile.local index d1b0585f..0a122ab0 100644 --- a/Makefile.local +++ b/Makefile.local @@ -19,9 +19,12 @@ DATE:=$(shell date +%F) endif VERSION:=$(shell cat ${srcdir}/version) +ELPA_VERSION:=$(subst ~,_,$(VERSION)) ifeq ($(filter release release-message pre-release update-versions,$(MAKECMDGOALS)),) ifeq ($(IS_GIT),yes) VERSION:=$(shell git --git-dir=${srcdir}/.git describe --abbrev=7 --match '[0-9.]*'|sed -e s/_/~/ -e s/-/+/ -e s/-/~/) +# drop the ~g$sha1 part +ELPA_VERSION:=$(word 1,$(subst ~, ,$(VERSION))) # Write the file 'version.stamp' in case its contents differ from $(VERSION) FILE_VERSION:=$(shell test -f version.stamp && read vs < version.stamp || vs=; echo $$vs) ifneq ($(FILE_VERSION),$(VERSION)) diff --git a/NEWS b/NEWS index 846572be..c023c03e 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,58 @@ +Notmuch 0.23.5 (2017-01-09) +=========================== + +Build system +------------ + +Fix quoting bug in configure. This had introduced a RUNPATH into the +notmuch binary in cases where it was not not needed. + +Notmuch 0.23.4 (2016-12-24) +=========================== + +Command Line Interface +---------------------- + +Improve error handling in notmuch insert + + Database lock errors no longer prevent message file delivery to the + filesystem. Certain errors during `notmuch insert` most likely to + be temporary return EX_TEMPFAIL. + +Emacs +----- + +Restore autoload cookie for notmuch-search. + +Notmuch 0.23.3 (2016-11-27) +=========================== + +Command Line Interface +---------------------- + +Treat disappearing files during notmuch new as non-fatal. + +Test Suite +---------- + +Fix incompatibility (related to signature size) with gnupg 2.1.16. + +Notmuch 0.23.2 (2016-11-20) +=========================== + +Emacs +----- + +Fix notmuch-interesting-buffer and notmuch-cycle-notmuch-buffers. + + notmuch-tree-mode and notmuch-message-mode buffers are now + considered interesting by `notmuch-interesting-buffer` and + `notmuch-cycle-notmuch-buffers`. + +Restore compatibility with Emacs 23. + + Notmuch support for Emacs 23 is now deprecated. + Notmuch 0.23.1 (2016-10-23) =========================== diff --git a/bindings/python/notmuch/version.py b/bindings/python/notmuch/version.py index 4bbe0cdc..1397fefd 100644 --- a/bindings/python/notmuch/version.py +++ b/bindings/python/notmuch/version.py @@ -1,3 +1,3 @@ # this file should be kept in sync with ../../../version -__VERSION__ = '0.23.1' +__VERSION__ = '0.23.5' SOVERSION = '4' diff --git a/configure b/configure index 2a0ce9eb..f1773044 100755 --- a/configure +++ b/configure @@ -274,7 +274,7 @@ if [ -z "$LIBDIR" ] ; then libdir_expanded="${PREFIX}/lib" else # very non-general variable expansion - libdir_expanded=$(echo "$LIBDIR" | sed "s|\\${prefix}|${PREFIX}|g; s|\\$prefix/|${PREFIX}/|; s|//*|/|g") + libdir_expanded=$(printf %s "$LIBDIR" | sed "s|\${prefix}|${PREFIX}|; s|\$prefix\>|${PREFIX}|; s|//*|/|g") fi cat < Mon, 09 Jan 2017 06:24:39 -0400 + +notmuch (0.23.4-1) unstable; urgency=medium + + * Improve error handling in notmuch insert + * Restore autoload cookie for notmuch-search (notmuch-emacs) + + -- David Bremner Sat, 24 Dec 2016 17:47:48 +0900 + +notmuch (0.23.3-3) unstable; urgency=medium + + * Disable gdb using tests on kfreebsd-*, due to apparent gdb breakage + + -- David Bremner Mon, 05 Dec 2016 08:25:32 -0400 + +notmuch (0.23.3-2) unstable; urgency=medium + + * Add missing depends to notmuch-emacs. Thanks to micah for the + report. + + -- David Bremner Thu, 01 Dec 2016 08:06:59 -0400 + +notmuch (0.23.3-1) unstable; urgency=medium + + * Re-enable test suite + * Fix test suite compatibility with gnupg 2.1.16. Fixes: "FTBFS: + Tests failures", thanks to Lucas Nussbaum (Closes: #844915). + * Bug fix: "race condition in `notmuch new`?", thanks to Paul Wise + (Closes: #843127). + + -- David Bremner Sat, 26 Nov 2016 08:37:39 -0400 + +notmuch (0.23.2-1) unstable; urgency=medium + + * New upstream bugfix release + * Convert notmuch-emacs to dh-elpa, new binary package elpa-notmuch + * Bug fix: "maintainer script(s) do not start on #!", thanks to + treinen@debian.org; (Closes: #843287). + + -- David Bremner Thu, 10 Nov 2016 22:36:04 -0400 + notmuch (0.23.1-1~bpo8+1) jessie-backports; urgency=medium * Rebuild for jessie-backports. diff --git a/debian/control b/debian/control index 4027a79b..e71a6716 100644 --- a/debian/control +++ b/debian/control @@ -17,11 +17,12 @@ Build-Depends: python-all (>= 2.6.6-3~), python3-all (>= 3.1.2-7~), dh-python, + dh-elpa (>= 1.3), python-sphinx (>= 1.0), ruby, ruby-dev (>>1:1.9.3~), emacs24-nox | emacs24 (>=24~) | emacs24-lucid (>=24~) | emacs23-nox | emacs23 (>=23~) | emacs23-lucid (>=23~), - gdb [!s390x !ia64 !armel !ppc64el !mips !mipsel !mips64el], + gdb [!s390x !ia64 !armel !ppc64el !mips !mipsel !mips64el !kfreebsd-any], dtach (>= 0.8), gpgsm , gnupg , @@ -111,13 +112,13 @@ Description: Ruby interface to the notmuch mail search and index library Package: notmuch-emacs Architecture: all -Section: mail -Breaks: notmuch (<<0.6~254~) -Replaces: notmuch (<<0.6~254~) -Depends: ${misc:Depends}, notmuch (>= ${source:Version}), - emacs23 (>= 23~) | emacs23-nox (>=23~) | emacs23-lucid (>=23~) | - emacs24 (>= 24~) | emacs24-nox (>=24~) | emacs24-lucid (>=24~), - emacsen-common (>= 2.0.8) +Depends: elpa-notmuch +Description: thread-based email index, search and tagging (transitional package) + This dummy package help ease transition to the new package elpa-notmuch + +Package: elpa-notmuch +Architecture: all +Depends: ${misc:Depends}, ${elpa:Depends} Description: thread-based email index, search and tagging (emacs interface) Notmuch is a system for indexing, searching, reading, and tagging large collections of email messages in maildir or mh format. It uses diff --git a/debian/elpa-notmuch.elpa b/debian/elpa-notmuch.elpa new file mode 100644 index 00000000..b4e9e172 --- /dev/null +++ b/debian/elpa-notmuch.elpa @@ -0,0 +1 @@ +emacs/*.el diff --git a/debian/elpa-test b/debian/elpa-test new file mode 100644 index 00000000..e3346c16 --- /dev/null +++ b/debian/elpa-test @@ -0,0 +1 @@ +disable=true diff --git a/debian/notmuch-emacs.dirs b/debian/notmuch-emacs.dirs deleted file mode 100644 index caeb4003..00000000 --- a/debian/notmuch-emacs.dirs +++ /dev/null @@ -1 +0,0 @@ -usr/share/emacs/site-lisp/notmuch diff --git a/debian/notmuch-emacs.emacsen-compat b/debian/notmuch-emacs.emacsen-compat deleted file mode 100644 index 573541ac..00000000 --- a/debian/notmuch-emacs.emacsen-compat +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/debian/notmuch-emacs.emacsen-install b/debian/notmuch-emacs.emacsen-install deleted file mode 100755 index cce95c34..00000000 --- a/debian/notmuch-emacs.emacsen-install +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh -# /usr/lib/emacsen-common/packages/install/notmuch-emacs -set -e - -FLAVOR=$1 -PACKAGE=notmuch - -case "${FLAVOR}" in - emacs) - return 0 - ;; - xemacs*|emacs2[12]) - # patches welcome. - echo install/${PACKAGE}: skipping install for unsupported emacsen flavor ${FLAVOR} - exit 0 - ;; - *) - echo install/${PACKAGE}: Handling install for emacsen flavor ${FLAVOR} -esac - - -elc_dir=/usr/share/${FLAVOR}/site-lisp/${PACKAGE} -el_dir=/usr/share/emacs/site-lisp/${PACKAGE} - -byte_compile_options="--quick --directory=${el_dir} -batch -f batch-byte-compile" - -echo install/${PACKAGE}: byte-compiling for ${FLAVOR} - -[ -d ${elc_dir} ] || mkdir ${elc_dir} - -# Create symlinks to the .el files (see section 6E in debian-emacs -# polcy). This makes complation easy, and also allows find-function -# and find-library to work properly. -(cd ${elc_dir} && ln -sf ${el_dir}/*.el .) - -# Byte compile them -(cd ${elc_dir} - set +e - ${FLAVOR} ${byte_compile_options} *.el > Install.log 2>&1 - if test $? -ne 0 - then - cat Install.log - exit 1 - fi - set -e - gzip -9f Install.log) - -exit 0; diff --git a/debian/notmuch-emacs.emacsen-remove b/debian/notmuch-emacs.emacsen-remove deleted file mode 100755 index a5553209..00000000 --- a/debian/notmuch-emacs.emacsen-remove +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -# /usr/lib/emacsen-common/packages/remove/notmuch - -set -e - -FLAVOR=$1 -PACKAGE=notmuch -elc_dir=/usr/share/${FLAVOR}/site-lisp/${PACKAGE} - -case "${FLAVOR}" in - emacs) - return 0 - ;; - xemacs*|emacs2[12]) - # patches welcome. - echo install/${PACKAGE}: skipping removal for unsupported emacsen flavor ${FLAVOR} - exit 0 - ;; - *) - echo remove/${PACKAGE}: Handling removal for emacsen flavor ${FLAVOR} -esac - -echo remove/${PACKAGE}: Handling removal of emacsen flavor ${FLAVOR} - -echo emacsen-common: purging byte-compiled files for ${FLAVOR} -rm -f ${elc_dir}/*.elc -rm -f ${elc_dir}/*.el -rm -f ${elc_dir}/Install.log* -if test -e "${elc_dir}" -then - rmdir --ignore-fail-on-non-empty "${elc_dir}" -fi - -exit 0; diff --git a/debian/notmuch-emacs.install b/debian/notmuch-emacs.install deleted file mode 100644 index c73aecef..00000000 --- a/debian/notmuch-emacs.install +++ /dev/null @@ -1 +0,0 @@ -usr/share/emacs/site-lisp/notmuch/*.el diff --git a/debian/notmuch-emacs.postinst b/debian/notmuch-emacs.postinst deleted file mode 100644 index 1237237d..00000000 --- a/debian/notmuch-emacs.postinst +++ /dev/null @@ -1,7 +0,0 @@ -dir="/var/lib/emacsen-common/state/package/installed" -mkdir -p -m 0755 ${dir} -touch ${dir}/notmuch-emacs -#DEBHELPER# -if [ -d /0755 ]; then - rmdir /0755 || true -fi diff --git a/debian/notmuch-emacs.prerm b/debian/notmuch-emacs.prerm deleted file mode 100644 index 5e2758d3..00000000 --- a/debian/notmuch-emacs.prerm +++ /dev/null @@ -1,3 +0,0 @@ -#DEBHELPER# -dir="/var/lib/emacsen-common/state/package/installed" -rm -f ${dir}/notmuch-emacs diff --git a/debian/rules b/debian/rules index 04f0062a..a915179b 100755 --- a/debian/rules +++ b/debian/rules @@ -3,7 +3,7 @@ python3_all = py3versions -s | xargs -n1 | xargs -t -I {} env {} %: - dh $@ --with python2,python3 + dh $@ --with python2,python3,elpa override_dh_auto_configure: ./configure --prefix=/usr \ @@ -12,8 +12,7 @@ override_dh_auto_configure: --mandir=/usr/share/man \ --infodir=/usr/share/info \ --sysconfdir=/etc \ - --localstatedir=/var \ - --emacslispdir=/usr/share/emacs/site-lisp/notmuch + --localstatedir=/var override_dh_auto_build: dh_auto_build -- V=1 diff --git a/doc/conf.py b/doc/conf.py index 8b932966..356a2b2b 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -12,7 +12,7 @@ master_doc = 'index' # General information about the project. project = u'notmuch' -copyright = u'2009-2016, Carl Worth and many others' +copyright = u'2009-2017, Carl Worth and many others' location = os.path.dirname(__file__) diff --git a/doc/man1/notmuch-insert.rst b/doc/man1/notmuch-insert.rst index 9e7afc36..9847e674 100644 --- a/doc/man1/notmuch-insert.rst +++ b/doc/man1/notmuch-insert.rst @@ -60,6 +60,13 @@ indexing to Notmuch database, changing tags, and synchronizing tags to maildir flags. The ``--keep`` option may be used to settle for successful message file delivery. +This command supports the following special exit status code for +errors most likely to be temporary in nature, e.g. failure to get a +database write lock. + +``75 (EX_TEMPFAIL)`` + A temporary failure occured; the user is invited to retry. + The exit status of the **post-insert** hook does not affect the exit status of the **insert** command. diff --git a/doc/man1/notmuch-new.rst b/doc/man1/notmuch-new.rst index 787ed78f..7f0b2237 100644 --- a/doc/man1/notmuch-new.rst +++ b/doc/man1/notmuch-new.rst @@ -43,6 +43,14 @@ Supported options for **new** include ``--quiet`` Do not print progress or results. +EXIT STATUS +=========== + +This command supports the following special exit status code + +``75 (EX_TEMPFAIL)`` + A temporary failure occured; the user is invited to retry. + SEE ALSO ======== diff --git a/emacs/.gitignore b/emacs/.gitignore index 9fa1c44e..8e15eed7 100644 --- a/emacs/.gitignore +++ b/emacs/.gitignore @@ -1,3 +1,4 @@ .eldeps* *.elc notmuch-version.el +notmuch-pkg.el diff --git a/emacs/Makefile.local b/emacs/Makefile.local index 2d6aedbd..dfa7c1f1 100644 --- a/emacs/Makefile.local +++ b/emacs/Makefile.local @@ -3,6 +3,7 @@ dir := emacs emacs_sources := \ $(dir)/notmuch-lib.el \ + $(dir)/notmuch-compat.el \ $(dir)/notmuch-parser.el \ $(dir)/notmuch.el \ $(dir)/notmuch-query.el \ @@ -27,6 +28,12 @@ $(dir)/notmuch-version.el: $(srcdir)/$(dir)/notmuch-version.el.tmpl @sed -e 's/%AG%/Generated file (from $( $@ +$(dir)/notmuch-pkg.el: $(srcdir)/$(dir)/notmuch-pkg.el.tmpl + @sed -e 's/%AG%/Generated file (from $( $@ + +all: $(dir)/notmuch-pkg.el +install-emacs: $(dir)/notmuch-pkg.el emacs_images := \ $(srcdir)/$(dir)/notmuch-logo.png @@ -84,4 +91,4 @@ endif mkdir -p "$(DESTDIR)$(emacsetcdir)" install -m0644 $(emacs_images) "$(DESTDIR)$(emacsetcdir)" -CLEAN := $(CLEAN) $(emacs_bytecode) $(dir)/notmuch-version.el +CLEAN := $(CLEAN) $(emacs_bytecode) $(dir)/notmuch-version.el $(dir)/notmuch-pkg.el diff --git a/emacs/notmuch-address.el b/emacs/notmuch-address.el index 10eaab19..34793dbe 100644 --- a/emacs/notmuch-address.el +++ b/emacs/notmuch-address.el @@ -136,11 +136,11 @@ toggles the setting in this buffer." (interactive) (if (local-variable-p 'notmuch-address-command) (kill-local-variable 'notmuch-address-command) - (setq-local notmuch-address-command 'internal)) + (notmuch-setq-local notmuch-address-command 'internal)) (if (boundp 'company-idle-delay) (if (local-variable-p 'company-idle-delay) (kill-local-variable 'company-idle-delay) - (setq-local company-idle-delay nil)))) + (notmuch-setq-local company-idle-delay nil)))) (defun notmuch-address-matching (substring) "Returns a list of completion candidates matching SUBSTRING. diff --git a/emacs/notmuch-company.el b/emacs/notmuch-company.el index 168315ff..5d75c145 100644 --- a/emacs/notmuch-company.el +++ b/emacs/notmuch-company.el @@ -28,6 +28,7 @@ ;;; Code: (eval-when-compile (require 'cl)) +(require 'notmuch-lib) (defvar notmuch-company-last-prefix nil) (make-variable-buffer-local 'notmuch-company-last-prefix) @@ -53,7 +54,7 @@ ;; internal completion) can still be accessed via standard company ;; functions, e.g., company-complete. (unless (eq notmuch-address-command 'internal) - (setq-local company-idle-delay nil))) + (notmuch-setq-local company-idle-delay nil))) ;;;###autoload (defun notmuch-company (command &optional arg &rest _ignore) diff --git a/emacs/notmuch-compat.el b/emacs/notmuch-compat.el new file mode 100644 index 00000000..c3d827af --- /dev/null +++ b/emacs/notmuch-compat.el @@ -0,0 +1,73 @@ +;; Compatibility functions for emacs 23 and 24 pre 24.4 + +;; The functions in this file are copied from eamcs 24.4 and are +;; Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2014 Free Software +;; Foundation, Inc. + +(if (fboundp 'setq-local) + (defalias 'notmuch-setq-local 'setq-local) + (defmacro notmuch-setq-local (var val) + "Set variable VAR to value VAL in current buffer. + +Backport of setq-local for emacs without setq-local (pre 24.3)." + `(set (make-local-variable ',var) ,val))) + +(if (fboundp 'read-char-choice) + (defalias 'notmuch-read-char-choice 'read-char-choice) + (defun notmuch-read-char-choice (prompt chars &optional inhibit-keyboard-quit) + "Read and return one of CHARS, prompting for PROMPT. +Any input that is not one of CHARS is ignored. + +If optional argument INHIBIT-KEYBOARD-QUIT is non-nil, ignore +keyboard-quit events while waiting for a valid input. + +This is an exact copy of this function from emacs 24 for use on +emacs 23, except with the one emacs 24 only function it calls +inlined." + (unless (consp chars) + (error "Called `read-char-choice' without valid char choices")) + (let (char done show-help (helpbuf " *Char Help*")) + (let ((cursor-in-echo-area t) + (executing-kbd-macro executing-kbd-macro) + (esc-flag nil)) + (save-window-excursion ; in case we call help-form-show + (while (not done) + (unless (get-text-property 0 'face prompt) + (setq prompt (propertize prompt 'face 'minibuffer-prompt))) + (setq char (let ((inhibit-quit inhibit-keyboard-quit)) + (read-key prompt))) + (and show-help (buffer-live-p (get-buffer helpbuf)) + (kill-buffer helpbuf)) + (cond + ((not (numberp char))) + ;; If caller has set help-form, that's enough. + ;; They don't explicitly have to add help-char to chars. + ((and help-form + (eq char help-char) + (setq show-help t) + ;; This is an inlined copy of help-form-show as that + ;; was introduced in emacs 24 too. + (let ((msg (eval help-form))) + (if (stringp msg) + (with-output-to-temp-buffer " *Char Help*" + (princ msg)))))) + ((memq char chars) + (setq done t)) + ((and executing-kbd-macro (= char -1)) + ;; read-event returns -1 if we are in a kbd macro and + ;; there are no more events in the macro. Attempt to + ;; get an event interactively. + (setq executing-kbd-macro nil)) + ((not inhibit-keyboard-quit) + (cond + ((and (null esc-flag) (eq char ?\e)) + (setq esc-flag t)) + ((memq char '(?\C-g ?\e)) + (keyboard-quit)))))))) + ;; Display the question with the answer. But without cursor-in-echo-area. + (message "%s%s" prompt (char-to-string char)) + char))) + +;; End of compatibility functions + +(provide 'notmuch-compat) diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index 2f015b0d..23bd81c1 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -27,6 +27,7 @@ (require 'mm-view) (require 'mm-decode) (require 'cl) +(require 'notmuch-compat) (unless (require 'notmuch-version nil t) (defconst notmuch-emacs-version "unknown" diff --git a/emacs/notmuch-maildir-fcc.el b/emacs/notmuch-maildir-fcc.el index ea75bb9e..a754b60c 100644 --- a/emacs/notmuch-maildir-fcc.el +++ b/emacs/notmuch-maildir-fcc.el @@ -249,7 +249,7 @@ If CREATE is non-nil then create the folder if necessary." ;; typo, or just the user want a new folder, let the user decide ;; how to deal with it. (error - (let ((response (read-char-choice + (let ((response (notmuch-read-char-choice "Insert failed: (r)etry, (c)reate folder, (i)gnore, or (e)dit the header? " '(?r ?c ?i ?e)))) (case response @@ -335,7 +335,7 @@ if needed." ;; fix it in some way. (let* ((prompt (format "Fcc %s is not a maildir: (r)etry, (c)reate folder, (i)gnore, or (e)dit the header? " fcc-header)) - (response (read-char-choice prompt '(?r ?c ?i ?e)))) + (response (notmuch-read-char-choice prompt '(?r ?c ?i ?e)))) (case response (?r (notmuch-maildir-fcc-file-fcc fcc-header)) (?c (if (file-writable-p fcc-header) diff --git a/emacs/notmuch-pkg.el.tmpl b/emacs/notmuch-pkg.el.tmpl new file mode 100644 index 00000000..de97baac --- /dev/null +++ b/emacs/notmuch-pkg.el.tmpl @@ -0,0 +1,6 @@ +;; %AG% +(define-package + "notmuch" + %VERSION% + "Emacs based front-end (MUA) for notmuch" + nil) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 9c7f2020..46f14fea 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -931,8 +931,8 @@ PROMPT is the string to prompt with." "Return the current query in this search buffer" notmuch-search-query-string) -;;;###autoload (put 'notmuch-search 'notmuch-doc "Search for messages.") +;;;###autoload (defun notmuch-search (&optional query oldest-first target-thread target-line) "Display threads matching QUERY in a notmuch-search buffer. @@ -1058,8 +1058,9 @@ current search results AND that are tagged with the given tag." (with-current-buffer b (memq major-mode '(notmuch-show-mode notmuch-search-mode + notmuch-tree-mode notmuch-hello-mode - message-mode)))) + notmuch-message-mode)))) ;;;###autoload (defun notmuch-cycle-notmuch-buffers () diff --git a/notmuch-client.h b/notmuch-client.h index 9ce2aef1..d026e600 100644 --- a/notmuch-client.h +++ b/notmuch-client.h @@ -25,6 +25,7 @@ #define _GNU_SOURCE /* for getline */ #endif #include +#include #include "compat.h" @@ -114,6 +115,16 @@ chomp_newline (char *str) str[strlen(str)-1] = '\0'; } +/* Exit status code indicating temporary failure; user is invited to + * retry. + * + * For example, file(s) in the mail store were removed or renamed + * after notmuch new scanned the directories but before indexing the + * file(s). If the file was renamed, the indexing might not be + * complete, and the user is advised to re-run notmuch new. + */ +#define NOTMUCH_EXIT_TEMPFAIL EX_TEMPFAIL + /* Exit status code indicating the requested format version is too old * (support for that version has been dropped). CLI code should use * notmuch_exit_if_unsupported_format rather than directly exiting @@ -478,6 +489,9 @@ print_status_database (const char *loc, const notmuch_database_t *database, notmuch_status_t status); +int +status_to_exit (notmuch_status_t status); + #include "command-line-arguments.h" extern char *notmuch_requested_db_uuid; diff --git a/notmuch-insert.c b/notmuch-insert.c index 131f09e2..bc96af0e 100644 --- a/notmuch-insert.c +++ b/notmuch-insert.c @@ -532,19 +532,20 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[]) action.sa_flags = 0; sigaction (SIGINT, &action, NULL); - if (notmuch_database_open (notmuch_config_get_database_path (config), - NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much)) - return EXIT_FAILURE; - - notmuch_exit_if_unmatched_db_uuid (notmuch); - /* Write the message to the Maildir new directory. */ newpath = maildir_write_new (config, STDIN_FILENO, maildir); if (! newpath) { - notmuch_database_destroy (notmuch); return EXIT_FAILURE; } + status = notmuch_database_open (notmuch_config_get_database_path (config), + NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much); + if (status) + return keep ? NOTMUCH_STATUS_SUCCESS : status_to_exit (status); + + notmuch_exit_if_unmatched_db_uuid (notmuch); + + /* Index the message. */ status = add_file (notmuch, newpath, tag_ops, synchronize_flags, keep); @@ -577,5 +578,5 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[]) notmuch_run_hook (db_path, "post-insert"); } - return status ? EXIT_FAILURE : EXIT_SUCCESS; + return status_to_exit (status); } diff --git a/notmuch-new.c b/notmuch-new.c index c55dea7b..cc680b41 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -53,6 +53,7 @@ typedef struct { int total_files; int processed_files; int added_messages, removed_messages, renamed_messages; + int vanished_files; struct timeval tv_start; _filename_list_t *removed_files; @@ -280,11 +281,13 @@ add_file (notmuch_database_t *notmuch, const char *filename, case NOTMUCH_STATUS_FILE_NOT_EMAIL: fprintf (stderr, "Note: Ignoring non-mail file: %s\n", filename); break; - /* Fatal issues. Don't process anymore. */ case NOTMUCH_STATUS_FILE_ERROR: + /* Someone renamed/removed the file between scandir and now. */ + state->vanished_files++; fprintf (stderr, "Unexpected error with file %s\n", filename); (void) print_status_database ("add_file", notmuch, status); - goto DONE; + break; + /* Fatal issues. Don't process anymore. */ case NOTMUCH_STATUS_READ_ONLY_DATABASE: case NOTMUCH_STATUS_XAPIAN_EXCEPTION: case NOTMUCH_STATUS_OUT_OF_MEMORY: @@ -1151,5 +1154,11 @@ notmuch_new_command (notmuch_config_t *config, int argc, char *argv[]) if (!no_hooks && !ret && !interrupted) ret = notmuch_run_hook (db_path, "post-new"); - return ret || interrupted ? EXIT_FAILURE : EXIT_SUCCESS; + if (ret || interrupted) + return EXIT_FAILURE; + + if (add_files_state.vanished_files) + return NOTMUCH_EXIT_TEMPFAIL; + + return EXIT_SUCCESS; } diff --git a/status.c b/status.c index 45d3fb4e..8bc2fe4b 100644 --- a/status.c +++ b/status.c @@ -36,3 +36,19 @@ print_status_database (const char *loc, } return status; } + +int +status_to_exit (notmuch_status_t status) +{ + switch (status) { + case NOTMUCH_STATUS_SUCCESS: + return EXIT_SUCCESS; + case NOTMUCH_STATUS_OUT_OF_MEMORY: + case NOTMUCH_STATUS_XAPIAN_EXCEPTION: + case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID: + case NOTMUCH_STATUS_FILE_ERROR: + return EX_TEMPFAIL; + default: + return EXIT_FAILURE; + } +} diff --git a/test/T070-insert.sh b/test/T070-insert.sh index c2485bb2..57472b91 100755 --- a/test/T070-insert.sh +++ b/test/T070-insert.sh @@ -189,7 +189,6 @@ notmuch config set new.tags $OLDCONFIG for code in OUT_OF_MEMORY XAPIAN_EXCEPTION FILE_NOT_EMAIL \ READ_ONLY_DATABASE UPGRADE_REQUIRED PATH_ERROR; do -gen_insert_msg cat < index-file-$code.gdb set breakpoint pending on set logging file index-file-$code.log @@ -201,15 +200,30 @@ continue end run EOF -test_begin_subtest "error exit when add_message returns $code" -gdb --batch-silent --return-child-result -x index-file-$code.gdb \ - --args notmuch insert < $gen_msg_filename -test_expect_equal $? 1 +done -test_begin_subtest "success exit with --keep when add_message returns $code" -gdb --batch-silent --return-child-result -x index-file-$code.gdb \ - --args notmuch insert --keep < $gen_msg_filename -test_expect_equal $? 0 +gen_insert_msg + +for code in FILE_NOT_EMAIL READ_ONLY_DATABASE UPGRADE_REQUIRED PATH_ERROR; do + test_expect_code 1 "EXIT_FAILURE when add_message returns $code" \ + "gdb --batch-silent --return-child-result \ + -ex 'set args insert < $gen_msg_filename' \ + -x index-file-$code.gdb notmuch" + test_expect_code 0 "success exit with --keep when add_message returns $code" \ + "gdb --batch-silent --return-child-result \ + -ex 'set args insert --keep < $gen_msg_filename' \ + -x index-file-$code.gdb notmuch" +done + +for code in OUT_OF_MEMORY XAPIAN_EXCEPTION ; do + test_expect_code 75 "EX_TEMPFAIL when add_message returns $code" \ + "gdb --batch-silent --return-child-result \ + -ex 'set args insert < $gen_msg_filename' \ + -x index-file-$code.gdb notmuch" + test_expect_code 0 "success exit with --keep when add_message returns $code" \ + "gdb --batch-silent --return-child-result \ + -ex 'set args insert --keep < $gen_msg_filename' \ + -x index-file-$code.gdb notmuch" done test_done diff --git a/test/T350-crypto.sh b/test/T350-crypto.sh index df2dc743..a1e5e206 100755 --- a/test/T350-crypto.sh +++ b/test/T350-crypto.sh @@ -59,7 +59,7 @@ expected='[[[{"id": "XXXXX", "content": "This is a test signed message.\n"}, {"id": 3, "content-type": "application/pgp-signature", - "content-length": 280}]}]}, + "content-length": "NONZERO"}]}]}, []]]]' test_expect_equal_json \ "$output" \ @@ -94,7 +94,7 @@ expected='[[[{"id": "XXXXX", "content": "This is a test signed message.\n"}, {"id": 3, "content-type": "application/pgp-signature", - "content-length": 280}]}]}, + "content-length": "NONZERO"}]}]}, []]]]' test_expect_equal_json \ "$output" \ @@ -127,7 +127,7 @@ expected='[[[{"id": "XXXXX", "content": "This is a test signed message.\n"}, {"id": 3, "content-type": "application/pgp-signature", - "content-length": 280}]}]}, + "content-length": "NONZERO"}]}]}, []]]]' test_expect_equal_json \ "$output" \ @@ -197,7 +197,7 @@ expected='[[[{"id": "XXXXX", "content-type": "multipart/encrypted", "content": [{"id": 2, "content-type": "application/pgp-encrypted", - "content-length": 11}, + "content-length": "NONZERO"}, {"id": 3, "content-type": "multipart/mixed", "content": [{"id": 4, @@ -205,7 +205,7 @@ expected='[[[{"id": "XXXXX", "content": "This is a test encrypted message.\n"}, {"id": 5, "content-type": "application/octet-stream", - "content-length": 28, + "content-length": "NONZERO", "content-transfer-encoding": "base64", "filename": "TESTATTACHMENT"}]}]}]}, []]]]' @@ -234,11 +234,9 @@ test_expect_equal_file OUTPUT TESTATTACHMENT test_begin_subtest "decryption failure with missing key" mv "${GNUPGHOME}"{,.bak} -# The length of the encrypted attachment varies so must be normalized. output=$(notmuch show --format=json --decrypt subject:"test encrypted message 001" \ | notmuch_json_show_sanitize \ - | sed -e 's|"created": [1234567890]*|"created": 946728000|' \ - | sed -e 's|"content-length": 6[1234567890]*|"content-length": 652|') + | sed -e 's|"created": [1234567890]*|"created": 946728000|') expected='[[[{"id": "XXXXX", "match": true, "excluded": false, @@ -255,10 +253,10 @@ expected='[[[{"id": "XXXXX", "content-type": "multipart/encrypted", "content": [{"id": 2, "content-type": "application/pgp-encrypted", - "content-length": 11}, + "content-length": "NONZERO"}, {"id": 3, "content-type": "application/octet-stream", - "content-length": 652}]}]}, + "content-length": "NONZERO"}]}]}, []]]]' test_expect_equal_json \ "$output" \ @@ -295,7 +293,7 @@ expected='[[[{"id": "XXXXX", "content-type": "multipart/encrypted", "content": [{"id": 2, "content-type": "application/pgp-encrypted", - "content-length": 11}, + "content-length": "NONZERO"}, {"id": 3, "content-type": "text/plain", "content": "This is another test encrypted message.\n"}]}]}, @@ -370,7 +368,7 @@ expected='[[[{"id": "XXXXX", "content": "This is a test signed message.\n"}, {"id": 3, "content-type": "application/pgp-signature", - "content-length": 280}]}]}, + "content-length": "NONZERO"}]}]}, []]]]' test_expect_equal_json \ "$output" \ diff --git a/test/T355-smime.sh b/test/T355-smime.sh index d9424125..a8be45e7 100755 --- a/test/T355-smime.sh +++ b/test/T355-smime.sh @@ -69,7 +69,7 @@ expected='[[[{"id": "XXXXX", "content-type": "text/plain", "content": "This is a test signed message.\n"}, {"id": 3, - "content-length": 1922, + "content-length": "NONZERO", "content-transfer-encoding": "base64", "content-type": "application/x-pkcs7-signature", "filename": "smime.p7s"}]}]}, diff --git a/test/test-lib.sh b/test/test-lib.sh index e7b83392..86e792a8 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -736,7 +736,8 @@ notmuch_json_show_sanitize () -e 's|"Date": "Fri, 05 Jan 2001 [^"]*0000"|"Date": "GENERATED_DATE"|g' \ -e 's|"filename": "signature.asc",||g' \ -e 's|"filename": "/[^"]*",|"filename": "YYYYY",|g' \ - -e 's|"timestamp": 97.......|"timestamp": 42|g' + -e 's|"timestamp": 97.......|"timestamp": 42|g' \ + -e 's|"content-length": [1-9][0-9]*|"content-length": "NONZERO"|g' } notmuch_emacs_error_sanitize () diff --git a/version b/version index 610e2872..f6de0017 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.23.1 +0.23.5