From: Michael Albinus Date: Fri, 17 Mar 2017 09:25:46 +0000 (+0100) Subject: Fix Bug#26127 X-Git-Tag: emacs-26.0.90~559 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=6b2f3ba02ab1cf54e2bdbb0207843cf86de48191;p=emacs.git Fix Bug#26127 * lisp/filenotify.el (file-notify--rm-descriptor): Check, that there is a function which could be called. (Bug#26127) * test/lisp/filenotify-tests.el (file-notify--test-cleanup): Clear also `file-notify-descriptors'. (file-notify--test-make-temp-name): Move up. (file-notify-test02-rm-watch): New test. (file-notify-test03-events, file-notify-test04-autorevert) (file-notify-test05-file-validity) (file-notify-test06-dir-validity) (file-notify-test07-many-events, file-notify-test08-backup) (file-notify-test09-watched-file-in-watched-dir) (file-notify-test10-sufficient-resources): Rename. --- diff --git a/lisp/filenotify.el b/lisp/filenotify.el index 1de5420f1e7..7eb6229976a 100644 --- a/lisp/filenotify.el +++ b/lisp/filenotify.el @@ -62,9 +62,10 @@ If it is registered in `file-notify-descriptors', a stopped event is sent." (when (consp registered) ;; Send `stopped' event. - (funcall - (cdr (assoc file (cdr registered))) - `(,descriptor stopped ,(if file (expand-file-name file dir) dir))) + (when (consp (assoc file (cdr registered))) + (funcall + (cdr (assoc file (cdr registered))) + `(,descriptor stopped ,(if file (expand-file-name file dir) dir)))) ;; Modify `file-notify-descriptors'. (if (not file) diff --git a/test/lisp/filenotify-tests.el b/test/lisp/filenotify-tests.el index dcd83a3ef3b..72080322379 100644 --- a/test/lisp/filenotify-tests.el +++ b/test/lisp/filenotify-tests.el @@ -150,6 +150,9 @@ Return nil when any other file notification watch is still active." (tramp-cleanup-connection (tramp-dissect-file-name temporary-file-directory) nil 'keep-password))) + (when (hash-table-p file-notify-descriptors) + (clrhash file-notify-descriptors)) + (setq file-notify--test-tmpfile nil file-notify--test-tmpfile1 nil file-notify--test-desc nil @@ -332,6 +335,58 @@ This returns only for the local case and gfilenotify; otherwise it is nil. (file-notify--deftest-remote file-notify-test01-add-watch "Check `file-notify-add-watch' for remote files.") +(defun file-notify--test-make-temp-name () + "Create a temporary file name for test." + (expand-file-name + (make-temp-name "file-notify-test") temporary-file-directory)) + +;; This test is inspired by Bug#26127. +(ert-deftest file-notify-test02-rm-watch () + "Check `file-notify-rm-watch'." + (skip-unless (file-notify--test-local-enabled)) + + (unwind-protect + (progn + ;; Check, that `file-notify-rm-watch' works. + (should + (setq file-notify--test-desc + (file-notify-add-watch + temporary-file-directory '(change) #'ignore))) + (file-notify-rm-watch file-notify--test-desc) + + ;; Check, that any parameter is accepted. + (condition-case err + (progn + (file-notify-rm-watch nil) + (file-notify-rm-watch 0) + (file-notify-rm-watch "foo") + (file-notify-rm-watch 'foo)) + (error (ert-fail err))) + + ;; Check, that no error is returned removing a watch descriptor twice. + (setq file-notify--test-tmpfile (file-notify--test-make-temp-name) + file-notify--test-tmpfile1 (file-notify--test-make-temp-name)) + (should + (setq file-notify--test-desc + (file-notify-add-watch + file-notify--test-tmpfile '(change) #'ignore))) + (should + (setq file-notify--test-desc1 + (file-notify-add-watch + file-notify--test-tmpfile1 '(change) #'ignore))) + (file-notify-rm-watch file-notify--test-desc) + (file-notify-rm-watch file-notify--test-desc) + (file-notify-rm-watch file-notify--test-desc1) + + ;; The environment shall be cleaned up. + (file-notify--test-cleanup-p)) + + ;; Cleanup. + (file-notify--test-cleanup))) + +(file-notify--deftest-remote file-notify-test02-rm-watch + "Check `file-notify-rm-watch' for remote files.") + (defun file-notify--test-event-test () "Ert test function to be called by `file-notify--test-event-handler'. We cannot pass arguments, so we assume that `file-notify--test-event' @@ -368,11 +423,6 @@ and the event to `file-notify--test-events'." file-notify--test-results (append file-notify--test-results `(,result)))))) -(defun file-notify--test-make-temp-name () - "Create a temporary file name for test." - (expand-file-name - (make-temp-name "file-notify-test") temporary-file-directory)) - (defun file-notify--test-with-events-check (events) "Check whether received events match one of the EVENTS alternatives." (let (result) @@ -436,7 +486,7 @@ delivered." ;; One of the possible event sequences shall match. (should (file-notify--test-with-events-check events)))) -(ert-deftest file-notify-test02-events () +(ert-deftest file-notify-test03-events () "Check file creation/change/removal notifications." (skip-unless (file-notify--test-local-enabled)) @@ -658,7 +708,7 @@ delivered." ;; Cleanup. (file-notify--test-cleanup))) -(file-notify--deftest-remote file-notify-test02-events +(file-notify--deftest-remote file-notify-test03-events "Check file creation/change/removal notifications for remote files.") (require 'autorevert) @@ -666,7 +716,7 @@ delivered." auto-revert-remote-files t auto-revert-stop-on-user-input nil) -(ert-deftest file-notify-test03-autorevert () +(ert-deftest file-notify-test04-autorevert () "Check autorevert via file notification." (skip-unless (file-notify--test-local-enabled)) @@ -752,10 +802,10 @@ delivered." (ignore-errors (kill-buffer buf)) (file-notify--test-cleanup)))) -(file-notify--deftest-remote file-notify-test03-autorevert +(file-notify--deftest-remote file-notify-test04-autorevert "Check autorevert via file notification for remote files.") -(ert-deftest file-notify-test04-file-validity () +(ert-deftest file-notify-test05-file-validity () "Check `file-notify-valid-p' for files." (skip-unless (file-notify--test-local-enabled)) @@ -864,10 +914,10 @@ delivered." ;; Cleanup. (file-notify--test-cleanup))) -(file-notify--deftest-remote file-notify-test04-file-validity +(file-notify--deftest-remote file-notify-test05-file-validity "Check `file-notify-valid-p' via file notification for remote files.") -(ert-deftest file-notify-test05-dir-validity () +(ert-deftest file-notify-test06-dir-validity () "Check `file-notify-valid-p' for directories." (skip-unless (file-notify--test-local-enabled)) @@ -922,10 +972,10 @@ delivered." ;; Cleanup. (file-notify--test-cleanup))) -(file-notify--deftest-remote file-notify-test05-dir-validity +(file-notify--deftest-remote file-notify-test06-dir-validity "Check `file-notify-valid-p' via file notification for remote directories.") -(ert-deftest file-notify-test06-many-events () +(ert-deftest file-notify-test07-many-events () "Check that events are not dropped." :tags '(:expensive-test) (skip-unless (file-notify--test-local-enabled)) @@ -993,10 +1043,10 @@ delivered." ;; Cleanup. (file-notify--test-cleanup))) -(file-notify--deftest-remote file-notify-test06-many-events +(file-notify--deftest-remote file-notify-test07-many-events "Check that events are not dropped for remote directories.") -(ert-deftest file-notify-test07-backup () +(ert-deftest file-notify-test08-backup () "Check that backup keeps file notification." (skip-unless (file-notify--test-local-enabled)) @@ -1072,10 +1122,10 @@ delivered." ;; Cleanup. (file-notify--test-cleanup))) -(file-notify--deftest-remote file-notify-test07-backup +(file-notify--deftest-remote file-notify-test08-backup "Check that backup keeps file notification for remote files.") -(ert-deftest file-notify-test08-watched-file-in-watched-dir () +(ert-deftest file-notify-test09-watched-file-in-watched-dir () "Watches a directory and a file in that directory separately. Checks that the callbacks are only called with events with descriptors that were issued when registering the watches. This @@ -1205,10 +1255,10 @@ the file watch." ;; Cleanup. (file-notify--test-cleanup))) -(file-notify--deftest-remote file-notify-test08-watched-file-in-watched-dir - "Check `file-notify-test08-watched-file-in-watched-dir' for remote files.") +(file-notify--deftest-remote file-notify-test09-watched-file-in-watched-dir + "Check `file-notify-test09-watched-file-in-watched-dir' for remote files.") -(ert-deftest file-notify-test09-sufficient-resources () +(ert-deftest file-notify-test10-sufficient-resources () "Check that file notification does not use too many resources." :tags '(:expensive-test) (skip-unless (file-notify--test-local-enabled)) @@ -1249,8 +1299,8 @@ the file watch." ;; Cleanup. (file-notify--test-cleanup))) -(file-notify--deftest-remote file-notify-test09-sufficient-resources - "Check `file-notify-test09-sufficient-resources' for remote files.") +(file-notify--deftest-remote file-notify-test10-sufficient-resources + "Check `file-notify-test10-sufficient-resources' for remote files.") (defun file-notify-test-all (&optional interactive) "Run all tests for \\[file-notify]."