OK, applied the revised fix, added tests, and pushed.

Note that Faré points out I mis-numbered the earlier version.

The latest version is now 3.3.3.1 and the incorrect 3.3.4 tag **has been removed**.

We now return you to your regularly scheduled Common Lisp.

Cheers,
R


On 25 Jun 2019, at 9:24, Robert Goldman wrote:

Generally this looks good, but why did you put the change in `with-current-directory` instead of in `call-with-current-directory`, since the former is just a thin wrapper around the latter?

They are both exported, so I think it would be better to put it there. That leaves us with the following (rather ugly) form:

```
(let ((dir (resolve-symlinks*
                     (get-pathname-defaults
                      (pathname-directory-pathname
                       (ensure-directory-pathname
                        dir)))))
       ...)
  ...)
```

It's redundant to call `pathname-directory-pathname` on `ensure-directory-pathname`, so we just need the latter.

I will push this after testing.


On 25 Jun 2019, at 0:26, Spenser Truex wrote:

Neil Lindquist <neillindqui...@gmail.com>
writes:

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.

May as well also do that for uiop:with-current-directory. I've attached
a diff, and have a test case below

Test case:
(uiop:with-current-directory ("/home/user")
    (run-program "ls" :output t))

Behaviour is simiar to DIRECTORY-FILES.
;=> Current: lists my /home dir
;=> With diff: lists my /home/user dir

~~~~~~~~~~ DIFF ~~~~~~~~~~~~~

498c498
<     `(call-with-current-directory ,dir #'(lambda () ,@body))))
---
`(call-with-current-directory (ensure-directory-pathname ,dir) #'(lambda
() ,@body))))

Coleslaw has been using a similar version of the above for awhile.

A patch for this new behavior and current/proposed results are below.
## 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.


--
Spenser Truex
use...@spensertruex.com
https://spensertruex.com/
San Francisco, USA


Reply via email to