ibuffer-decompose-filter: Avoid side effects on error

* lisp/ibuf-ext.el (ibuffer-decompose-filter):
Update 'ibuffer-filtering-qualifiers' only if there is no error (Bug#24997).
* test/lisp/ibuffer-tests.el (ibuffer-test-Bug24997):
Update test result as pass.
This commit is contained in:
Tino Calancha 2016-12-07 20:47:34 +09:00
parent 586867e681
commit 7b1e97f0e6
2 changed files with 17 additions and 20 deletions

View file

@ -929,26 +929,24 @@ This means that the topmost filter on the filtering stack, which must
be a complex filter like (OR [name: foo] [mode: bar-mode]), will be
turned into two separate filters [name: foo] and [mode: bar-mode]."
(interactive)
(when (null ibuffer-filtering-qualifiers)
(unless ibuffer-filtering-qualifiers
(error "No filters in effect"))
(let ((lim (pop ibuffer-filtering-qualifiers)))
(pcase (car lim)
(`or
(setq ibuffer-filtering-qualifiers (append
(cdr lim)
ibuffer-filtering-qualifiers)))
(`saved
(let ((data (assoc (cdr lim) ibuffer-saved-filters)))
(unless data
(ibuffer-filter-disable)
(error "Unknown saved filter %s" (cdr lim)))
(setq ibuffer-filtering-qualifiers
(append (cdr data) ibuffer-filtering-qualifiers))))
(`not
(push (cdr lim)
ibuffer-filtering-qualifiers))
(_
(error "Filter type %s is not compound" (car lim)))))
(let* ((filters ibuffer-filtering-qualifiers)
(head (cdar filters))
(tail (cdr filters))
(value
(pcase (caar filters)
(`or (nconc head tail))
(`saved
(let ((data (assoc head ibuffer-saved-filters)))
(unless data
(ibuffer-filter-disable)
(error "Unknown saved filter %s" head))
(append (cadr data) tail)))
(`not (cons head tail))
(_
(error "Filter type %s is not compound" (caar filters))))))
(setq ibuffer-filtering-qualifiers value))
(ibuffer-update nil t))
;;;###autoload

View file

@ -34,7 +34,6 @@
(ert-deftest ibuffer-test-Bug24997 ()
"Test for http://debbugs.gnu.org/24997 ."
:expected-result :failed
(ibuffer)
(let ((orig ibuffer-filtering-qualifiers))
(unwind-protect