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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.