Hello,
I recently noticed that uiop's DIRECTORY-FILES does not ensure that
the path is always interpreted as a directory. On sbcl (and
presumably other implementations), if the path does not have a
trailing slash, the files in the parent directory are instead
returned. This does not appear to be the indented behavior, given
that SUBDIRECTORIES ensures that the path is a directory. A patch for
this new behavior and current/proposed results are below.
Neil Lindquist
## Patch ##
--- a/uiop/filesystem.lisp
+++ b/uiop/filesystem.lisp
@@ -209,7 +209,7 @@ Subdirectories should NOT be returned.
override the default at your own risk.
DIRECTORY-FILES tries NOT to resolve symlinks if the implementation
permits this,
but the behavior in presence of symlinks is not portable. Use IOlib
to handle such situations."
- (let ((dir (pathname directory)))
+ (let ((dir (ensure-directory-pathname directory))))
(when (logical-pathname-p dir)
;; Because of the filtering we do below,
;; logical pathnames have restrictions on wild patterns.
## Current behavior ##
CL-USER> (uiop:directory-files "doc")
(#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/README.md"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/asdf-driver.asd"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/backward-driver.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/common-lisp.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/configuration.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/driver.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/filesystem.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/image.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/launch-program.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/lisp-build.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/os.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/package.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/pathname.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/run-program.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/stream.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/uiop.asd"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/utility.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/version.lisp")
## Proposed Behavior ##
COMMON-LISP-USER> (uiop:directory-files "doc")
(#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/doc/.gitignore"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/doc/Makefile"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/doc/docstrings.lisp"
#P"C:/Users/Neil/Documents/coding/lisp/asdf/uiop/doc/template.texinfo")