emacs: make sure tagging on an empty query is harmless

Currently notmuch-tag throws a "wrong-type-argument stringp nil" if
passed a nil query-string. Catch this and provide a more useful error
message. This fixes a case in notmuch-tree (if you try to tag when at
the end of the buffer).

Secondly, as pointed out by David (dme)
`notmuch-search-find-stable-query-region' can return the query string
() if there are no messages in the region. This gets passed to notmuch
tag, and due to interactions in the optimize_query code in
notmuch-tag.c becomes, in the case tag-change is -inbox, "( () ) and
(tag:inbox)". This query matches some strange collection of messages
which then get archived. This should probably be fixed, but in any
case make `notmuch-search-find-stable-query-region' return a nil
query-string in this case.

This avoids data-loss (random tag removal) in this case.
This commit is contained in:
Mark Walters 2014-05-21 10:58:50 +01:00 committed by David Bremner
parent a33ec9ce40
commit 83f531ad7e
2 changed files with 6 additions and 2 deletions

View file

@ -387,6 +387,8 @@ notmuch-after-tag-hook will be run."
(unless (string-match-p "^[-+]\\S-+$" tag-change) (unless (string-match-p "^[-+]\\S-+$" tag-change)
(error "Tag must be of the form `+this_tag' or `-that_tag'"))) (error "Tag must be of the form `+this_tag' or `-that_tag'")))
tag-changes) tag-changes)
(unless query
(error "Nothing to tag!"))
(unless (null tag-changes) (unless (null tag-changes)
(run-hooks 'notmuch-before-tag-hook) (run-hooks 'notmuch-before-tag-hook)
(if (<= (length query) notmuch-tag-argument-limit) (if (<= (length query) notmuch-tag-argument-limit)

View file

@ -428,14 +428,16 @@ matched and unmatched messages in the current thread."
"Return the stable query for the current region. "Return the stable query for the current region.
If ONLY-MATCHED is non-nil, include only matched messages. If it If ONLY-MATCHED is non-nil, include only matched messages. If it
is nil, include both matched and unmatched messages." is nil, include both matched and unmatched messages. If there are
no messages in the region then return nil."
(let ((query-list nil) (all (not only-matched))) (let ((query-list nil) (all (not only-matched)))
(dolist (queries (notmuch-search-properties-in-region :query beg end)) (dolist (queries (notmuch-search-properties-in-region :query beg end))
(when (first queries) (when (first queries)
(push (first queries) query-list)) (push (first queries) query-list))
(when (and all (second queries)) (when (and all (second queries))
(push (second queries) query-list))) (push (second queries) query-list)))
(concat "(" (mapconcat 'identity query-list ") or (") ")"))) (when query-list
(concat "(" (mapconcat 'identity query-list ") or (") ")"))))
(defun notmuch-search-find-authors () (defun notmuch-search-find-authors ()
"Return the authors for the current thread" "Return the authors for the current thread"