File name with newline: require 'ls' --dired switch

File name with newline: require 'ls' --dired switch

Previously the handling of newlines in file names tested for the
-b switch, but on systems such as Solaris 'ls' takes -b but not
--dired and the latter is needed to set the correct bounds of file
names containing a newline.

* lisp/dired.el (dired--check-use-ls-dired): New function.
(dired-internal-noselect, dired-insert-directory)
(dired--set-auto-toggle-b-switch): Use it.
(dired--remove-b-switch): Delete.

* test/lisp/dired-tests.el (dired-test-filename-with-newline-1)
(dired-test-filename-with-newline-2): Use the new function to skip
tests when 'ls' does not support the --dired switch (bug#81481).
This commit is contained in:
Stephen Berman 2026-07-30 23:13:29 +02:00
parent cba18a7f9c
commit 4f36e9e885
2 changed files with 19 additions and 19 deletions

View file

@ -1504,7 +1504,10 @@ The return value is the target column for the file names."
(dired-switches-escape-p dired-listing-switches)
(dired-switches-escape-p dired-actual-switches))
(when (and (dired--filename-with-newline-p)
(dired--ls-accept-b-switch-p))
;; Can't use `dired-use-ls-dired' because users could
;; set it to `t' even though their `ls' does not
;; support "--dired".
(dired--check-use-ls-dired))
(dired--display-filename-with-newline-warning buffer)))
(set-buffer old-buf)
buffer))
@ -1794,6 +1797,10 @@ BEG..END is the line where the file info is located."
"Return non-nil if the string SWITCHES contains -R or --recursive."
(dired-check-switches switches "R" "recursive"))
(defun dired--check-use-ls-dired ()
"Return non-nil if `ls' supports the \"--dired\" switch."
(eq 0 (call-process insert-directory-program nil nil nil "--dired" "-N")))
(defun dired-insert-directory (dir switches &optional file-list wildcard hdr)
"Insert a directory listing of DIR, Dired style.
Use SWITCHES to make the listings.
@ -1813,11 +1820,7 @@ If HDR is non-nil, insert a header line with the directory name."
(not (bound-and-true-p eshell-ls-use-in-dired))
(or remotep
(if (eq dired-use-ls-dired 'unspecified)
;; Check whether "ls --dired" gives exit code 0, and
;; save the answer in `dired-use-ls-dired'.
(or (setq dired-use-ls-dired
(eq 0 (call-process insert-directory-program
nil nil nil "--dired" "-N")))
(or (setq dired-use-ls-dired (dired--check-use-ls-dired))
(progn
(message "ls does not support --dired -N; \
see `dired-use-ls-dired' for more details.")
@ -4078,10 +4081,6 @@ newline character (regardless of whether Dired displays the character as
a literal newline or as \"\\n\")."
(directory-files default-directory nil "\n"))
(defun dired--ls-accept-b-switch-p ()
"Return non-nil if the `ls' used by Dired accepts the `b' switch."
(eq 0 (call-process insert-directory-program nil nil nil "-b")))
(defun dired--remove-b-switch ()
"Remove all variants of the `b' switch from `dired-actual-switches'.
This removes not only all occurrences of the short form `-b' but also
@ -4116,7 +4115,10 @@ otherwise remove the `b' switch unless it is in
(defun dired--set-auto-toggle-b-switch (symbol value)
"The :set function for user option `dired-auto-toggle-b-switch'."
(custom-set-default symbol value)
(when (dired--ls-accept-b-switch-p)
(when
;; Can't use `dired-use-ls-dired' because users could set it to
;; `t' even though their `ls' does not support "--dired".
(dired--check-use-ls-dired)
(if value
(add-hook 'post-command-hook #'dired--toggle-b-switch nil t)
(remove-hook 'post-command-hook #'dired--toggle-b-switch t))

View file

@ -660,10 +660,9 @@ The current directory at call time should not affect the result (Bug#50630)."
(ert-deftest dired-test-filename-with-newline-1 () ; bug#79528, bug#80499
"Test handling of file name with literal embedded newline."
;; File names with embedded newlines are not allowed on MS-Windows and
;; MS-DOS.
(skip-when (memq system-type '(windows-nt ms-dos)))
(skip-unless (dired--ls-accept-b-switch-p))
;; The handling of file names with embedded newlines requires an `ls'
;; that supports the "--dired" switch.
(skip-unless (dired--check-use-ls-dired))
(with-current-buffer "*Messages*"
(let ((inhibit-read-only t))
(erase-buffer)))
@ -696,10 +695,9 @@ The current directory at call time should not affect the result (Bug#50630)."
(ert-deftest dired-test-filename-with-newline-2 () ; bug#79528, bug#80499
"Test handling of file name with embedded newline using `b' switch."
;; File names with embedded newlines are not allowed on MS-Windows and
;; MS-DOS.
(skip-when (memq system-type '(windows-nt ms-dos)))
(skip-unless (dired--ls-accept-b-switch-p))
;; The handling of file names with embedded newlines requires an `ls'
;; that supports the "--dired" switch.
(skip-unless (dired--check-use-ls-dired))
(with-current-buffer "*Messages*"
(let ((inhibit-read-only t))
(erase-buffer)))