emacs-31 a94a33827b4: Avoid an unusual error when visiting a directory in Dired
Stephen Berman via Mailing list for Emacs changes <[email protected]>
| Newsgroups | gmane.emacs.diffs |
|---|---|
| Message-ID | <[email protected]> |
branch: emacs-31 commit a94a33827b4048accf43b93d3cd7958b1832559f Author: Stephen Berman <[email protected]> Commit: Stephen Berman <[email protected]> Avoid an unusual error when visiting a directory in Dired * lisp/dired.el (dired-internal-noselect): Unset 'dired--ls-error-buffer' before calling 'dired-readin'. This is a safeguard to prevent an error when visiting a directory in Dired, which apparently happens when the variable somehow gets set even though 'ls' has not emitted an error message (bug#80499, Message #218). * test/lisp/dired-tests.el (dired-test-set-dired--ls-error-buffer): New test. --- lisp/dired.el | 18 ++++++++++++++---- test/lisp/dired-tests.el | 10 ++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lisp/dired.el b/lisp/dired.el index 9ce3f042f6b..26e698341d8 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -1459,10 +1459,20 @@ The return value is the target column for the file names." ;; (buffer-local), so we can call dired-readin: (let ((failed t)) (unwind-protect - (progn (dired-readin) - (unless (and dired--ls-error-buffer - (get-buffer "*ls error*")) - (setq failed nil))) + (progn + ;; `dired--ls-error-buffer' should only be set in + ;; `insert-directory', and if `ls' errors and the buffer + ;; displaying the error message pops ups, + ;; `dired--ls-error-buffer' is then unset. But if for + ;; some reason it gets set before the next Dired + ;; buffer-display command is invoked, this can raise an + ;; error, so ensure the variable is unset before reading + ;; the directory contents into a Dired buffer. + (setq dired--ls-error-buffer nil) + (dired-readin) + (unless (and dired--ls-error-buffer + (get-buffer "*ls error*")) + (setq failed nil))) ;; If either `dired-readin' failed (e.g. if parent directories ;; are inaccessible) or `ls' errored, don't leave the Dired ;; buffer around. diff --git a/test/lisp/dired-tests.el b/test/lisp/dired-tests.el index f77d56637fd..65ca58cc705 100644 --- a/test/lisp/dired-tests.el +++ b/test/lisp/dired-tests.el @@ -820,5 +820,15 @@ of the value of `dired-auto-toggle-b-switch'." (let ((dired-auto-toggle-b-switch nil)) (dired-test--filename-with-backslash-n))) +(ert-deftest dired-test-set-dired--ls-error-buffer () ; bug#80499, Message #218 + "Test visiting a directory after setting `dired--ls-error-buffer'." + (let ((dir (ert-resource-file (file-name-as-directory "test-dir")))) + (make-directory dir t) + (setq dired--ls-error-buffer (get-buffer-create "*ls error*")) + (find-file dir) + (should (equal list-buffers-directory dir)) + (kill-buffer (current-buffer)) + (delete-directory dir))) + (provide 'dired-tests) ;;; dired-tests.el ends here