I initially neglected to send this register an account w/ osicat-devel
and mailed the following exchange to Nikodemus directly
with the subject line: "osicat:list-directory vs. cl-fad:list-directory"
No doubt Nikodemus has plenty on his plate right now as it is and
needn't be solely responsible for fielding this verobisty :)
I should have taken the time to register an osicat-devel account.
Having done so I am now forwarding a transcript of my previous exchange.
--------------
On 12 August 2011 19:46, MON KEY wrote:
I noticed today that on SBCL these return differently:
(cl-fad:list-directory ".") (osicat:list-directory ".")
(cl-fad:list-directory "..") (osicat:list-directory "..")
Assuming this is a bug, then i'm pretty sure its origin is around the
reliance on osicat:with-directory-iterator.
osicat:call-with-directory-iterator binds *d-p-d* to the value of the
dir var before setting cwd in the protected form of its
unwind-protect.
Further up in osicat:call-with-directory-iterator there is a merge
with *d-p-d* via:
(osicat:absolute-pathname <PATHSPEC>)
When the PATHSPEC arg to osicat:list-directory is a dotted
namestring e.g. "." or ".." the merge with *d-p-d* in
osicat:call-with-directory-iterator will yield the equivalent of:
(merge-pathnames "." *default-pathname-defaults*)
such that for the duration of each #'one-iter *d-p-d* gets dynamically
funky bound.
--------------
On Fri, Aug 12, 2011 at 1:07 PM, Nikodemus Siivola wrote:
> The docstrings for many of the osicat functions mirror cl-fad's, so
> I am ssuming this is a bug, then i'm pretty sure its origin is around
Well, Osicat predates CL-FAD by a year or so, so not really.
A quick look at results from Osicat looks like just what I would
expect -- what exactly is the difference you think is a bug?
Possibly you're looking for :bare-pathnames t?
---------------
> On 12 August 2011 19:46, MON KEY wrote:
>> The docstrings for many of the osicat functions mirror cl-fad's, so
>> I am assuming this is a bug, then i'm pretty sure its origin is around
>
> Well, Osicat predates CL-FAD by a year or so, so not really.
Would you not agree that they are curiosly similar?
> Possibly you're looking for :bare-pathnames t?
No, I didn't find :bare-pathnames t necessarily applicable w/r/t
dotted-namestrings, and neither of the respcective below pairs do what
I would expect:
(osicat:list-directory ".")
(osicat:list-directory "." :bare-pathnames t)
(osicat:list-directory "..")
(osicat:list-directory ".." :bare-pathnames t)
Note however, that these forms do retrun what i would expect:
(osicat:list-directory "./")
(osicat:list-directory "." :bare-pathnames t)
(osicat:list-directory "../")
(osicat:list-directory "../" :bare-pathnames t)
When a namestring is given as a dotted-namestring and a trailing #\/
(solidus) is _not_ present, I would expect Osicat to resolve
dotted-namestrings their cl:truename before executing the inspection
PATHSPEC in the iterations.
When a namestring is given as a dotted-namestring and a trailing #\/
(solidus) _is_ present I would expect Osicat to _not_ resolve the
dotted-namestrings.
>
> A quick look at results from Osicat looks like just what I would
> expect -- what exactly is the difference you think is a bug?
>
Following evaulated from SBCL "1.0.47.1":
*default-pathname-defaults*
;=> #P"/home/me/long-path/here/subdir/sub-subdir/"
(cl:pathname-type #P".")
;=> NIL
(cl:pathname-name #P".")
;=> "."
(cl:pathname-name "..")
;=> "."
(cl:pathname-name "..")
;=> "."
(cl:pathname-name "../")
=> NIL
(cl:pathname-name "./")
=> NIL
(cl:pathname-type ".")
;=> NIL
(cl:pathname-type "..")
;=> ""
(cl:pathname-type "./")
;=> NIL
(cl:pathname-type "../")
;=> NIL
(cl:pathname-directory ".")
;=> NIL
(cl:pathname-directory "..")
;=> NIL
(pathname-directory "./")
;=> (:RELATIVE ".")
(pathname-directory "../")
;=> (:RELATIVE :UP)
(cl:truename ".")
;=> #P"/home/me/long-path/here/subdir/sub-subdir/"
(cl:truename "..")
;=> #p"/home/sp/hg-repos/cl-repo-hg/cl-mon-code/"
(cl:truename "./")
;=> #P"/home/me/long-path/here/subdir/sub-subdir/"
(cl:truename "../")
;=> #P"/home/me/long-path/here/subdir/"
(cl:probe-file ".")
;=> #P"/home/me/long-path/here/subdir/sub-subdir/"
(cl:probe-file "..")
;=> #P"/home/me/long-path/here/subdir/"
(directory ".")
;=> (#P"/home/me/long-path/here/subdir/sub-subdir/")
(directory "..")
;=> (#P"/home/me/long-path/here/subdir/")
(osicat:absolute-pathname ".")
;=> #P"/home/me/long-path/here/subdir/sub-subdir/."
(osicat:absolute-pathname "..")
;=> #P"/home/me/long-path/here/subdir/sub-subdir/.."
(osicat:file-kind ".")
;=> :DIRECTORY
(osicat:file-kind "..")
;=> :DIRECTORY
(osicat:file-kind (osicat:absolute-pathname ".."))
;=> :DIRECTORY
(osicat:file-kind (osicat:absolute-pathname "."))
;=> :DIRECTORY
(osicat:directory-pathname-p ".")
;=> NIL
(osicat:directory-pathname-p "..")
;=> NIL
(osicat:pathname-as-directory ".")
;=> #P"./"
(osicat:pathname-as-directory "..")
;=> #P"../"
(osicat:pathname-directory-pathname ".")
;=> #P""
(osicat:pathname-directory-pathname "..")
;=> #P""
Disregarding the following assertion from the README of Quicklisp's
dist of Osicat as to the extent of its Posixness:
,----
|
| Osicat is a lightweight operating system interface for Common Lisp
| on Unix-platforms. It is not a POSIX-style API, but rather a simple
| lispy accompaniment to the standard ANSI facilities.
|
`---- :SOURE osicat-20110619-git/README
It may be worth considering osicats behaviour w/r/t following from
POSIX.1-2008 apropos dotted namestrings:
,----
|
| 4.12 Pathname Resolution
| {...}
|
| The special filename dot shall refer to the directory specified by
| its predecessor. The special filename dot-dot shall refer to the
| parent directory of its predecessor directory. As a special case, in
| the root directory, dot-dot may refer to the root directory itself.
|
| The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008
|
`---- :SOURCE (URL `http://pubs.opengroup.org/onlinepubs/9699919799/')
Following may also be applicable:
(URL `http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#dot')
As mentioned on #lisp, I'm not interested in advocating that Osicat
be changed if it isn't broken.
The reliable portablility offered by Osicat underscores my interest in
it and I am currently in the process of converting the CL-FAD and SBCL
specific routines use in my code to use Osicat instead :) As such, my
concern/curiousity is to learn the rationale for its implementation so
as to avoid unnecessary future surprises.
AFAICT Osicat absolute-pathname treats the dotted namestring as
pathname-name whereas these:
(osicat:file-kind "..")
(osicat:file-kind ".")
consider them to be pathname-directory.
So long as Osicat allows pathspec args to take occur as a namestring
(as opposed to a #P"." or #P"..") then there remains a certain
ambiguity as to what type of pathname component the user intended the
dotted-namestring to resolve to.
To the extent with which the following behave similiarly:
(osicat:list-directory ".") shell> ls .
(osicat:list-directory ".") shell> ls ..
Osicats dotted-namestring seems sane.
However, barring `scandir` `readdir` where there isn't really a POSIX
equivalent to osicat:mapdir, osicat:walk-directory,
osicat:with-directory-iterator I would advocate that Osicat behave as
SBLC does and resolve the dotted-namestring to its cl:truename.
--
/s_P\