emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/no-ls-lisp-advice 6cc1418fc3e 2/5: (file-expand-wildcards): Hand


From: Stefan Monnier
Subject: scratch/no-ls-lisp-advice 6cc1418fc3e 2/5: (file-expand-wildcards): Handle patterns ending in "/"
Date: Sat, 9 Dec 2023 23:59:03 -0500 (EST)

branch: scratch/no-ls-lisp-advice
commit 6cc1418fc3e8107cab2c9824c367ba7762235aef
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    (file-expand-wildcards): Handle patterns ending in "/"
    
    The bug was encountered via the ls-lisp advice on Dired but
    it actually affects all uses of `file-expand-wildcards`,
    so better fix it there.
    
    * lisp/files.el (file-expand-wildcards): Fix bug#60819.
    * lisp/ls-lisp.el (ls-lisp--dired): Undo commit b365a7cc32e2.
    * test/lisp/files-tests.el (files-tests--expand-wildcards): New test.
---
 lisp/files.el            | 51 +++++++++++++++++++++++++++---------------------
 lisp/ls-lisp.el          | 16 +--------------
 test/lisp/files-tests.el |  4 ++++
 3 files changed, 34 insertions(+), 37 deletions(-)

diff --git a/lisp/files.el b/lisp/files.el
index 047854d3939..3c1d0c30e67 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -7547,27 +7547,34 @@ default directory.  However, if FULL is non-nil, they 
are absolute."
       (dolist (dir (nreverse dirs))
        (when (or (null dir)    ; Possible if DIRPART is not wild.
                  (file-accessible-directory-p dir))
-         (let ((this-dir-contents
-                ;; Filter out "." and ".."
-                (delq nil
-                       (mapcar (lambda (name)
-                                 (unless (string-match "\\`\\.\\.?\\'"
-                                                       (file-name-nondirectory 
name))
-                                   name))
-                              (directory-files
-                                (or dir ".") full
-                                (if regexp
-                                    ;; We're matching each file name
-                                    ;; element separately.
-                                    (concat "\\`" nondir "\\'")
-                                 (wildcard-to-regexp nondir)))))))
-           (setq contents
-                 (nconc
-                  (if (and dir (not full))
-                       (mapcar (lambda (name) (concat dir name))
-                              this-dir-contents)
-                    this-dir-contents)
-                  contents)))))
+          (if (equal "" nondir)
+              ;; `nondir' is "" when the pattern ends in "/".  Basically ""
+              ;; refers to the directory itself, like ".", but it's not
+              ;; among the names returned by `directory-files', so we have
+              ;; to special-case it.
+              (push (or dir nondir) contents)
+           (let ((this-dir-contents
+                  ;; Filter out "." and ".."
+                  (delq nil
+                         (mapcar (lambda (name)
+                                   (unless (string-match "\\`\\.\\.?\\'"
+                                                         
(file-name-nondirectory
+                                                          name))
+                                     name))
+                                (directory-files
+                                  (or dir ".") full
+                                  (if regexp
+                                      ;; We're matching each file name
+                                      ;; element separately.
+                                      (concat "\\`" nondir "\\'")
+                                  (wildcard-to-regexp nondir)))))))
+             (setq contents
+                   (nconc
+                    (if (and dir (not full))
+                        (mapcar (lambda (name) (concat dir name))
+                                this-dir-contents)
+                      this-dir-contents)
+                    contents))))))
       contents)))
 
 (defcustom find-sibling-rules nil
@@ -7757,7 +7764,7 @@ need to be passed verbatim to shell commands."
     (purecopy "ls"))
   "Absolute or relative name of the `ls'-like program.
 This is used by `insert-directory' and `dired-insert-directory'
-(thus, also by `dired').  For Dired, this should ideally point to
+\(thus, also by `dired').  For Dired, this should ideally point to
 GNU ls, or another version of ls that supports the \"--dired\"
 flag.  See `dired-use-ls-dired'.
 
diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el
index c576819c5d0..1066f38c050 100644
--- a/lisp/ls-lisp.el
+++ b/lisp/ls-lisp.el
@@ -483,22 +483,8 @@ not contain `d', so that a full listing is expected."
       (if (not dir-wildcard)
           (funcall orig-fun dir-or-list switches)
         (let* ((default-directory (car dir-wildcard))
-               (wildcard (cdr dir-wildcard))
-               (files (file-expand-wildcards wildcard))
+               (files (file-expand-wildcards (cdr dir-wildcard)))
                (dir (car dir-wildcard)))
-          ;; When the wildcard ends in a slash, file-expand-wildcards
-          ;; returns nil; fix that by treating the wildcards as
-          ;; specifying only directories whose names match the
-          ;; widlcard.
-          (if (and (null files)
-                   (directory-name-p wildcard))
-              (setq files
-                    (delq nil
-                          (mapcar (lambda (fname)
-                                   (if (file-accessible-directory-p fname)
-                                        fname))
-                                 (file-expand-wildcards
-                                   (directory-file-name wildcard))))))
           (if files
               (let ((inhibit-read-only t)
                     (buf
diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el
index 3e499fff468..24b144c4247 100644
--- a/test/lisp/files-tests.el
+++ b/test/lisp/files-tests.el
@@ -2101,5 +2101,9 @@ Prompt users for any modified buffer with 
`buffer-offer-save' non-nil."
       (should (documentation 'bar))
       (should (documentation 'zot)))))
 
+(ert-deftest files-tests--expand-wildcards ()
+  (should (file-expand-wildcards
+           (concat (directory-file-name default-directory) "*/"))))
+
 (provide 'files-tests)
 ;;; files-tests.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]