[asdf-devel] bug in new ASDF
Robert Goldman
rpgoldman at sift.info
Mon Jul 13 17:30:52 UTC 2009
Robert Goldman wrote:
> Robert Goldman wrote:
>> I see the following when I try to load an asdf system now:
>>
>> Error loading #P"/Users/rpg/clinit.cl":
>> While searching for system `asdf-context`: `(MERGE-PATHNAMES systems/
>> /Users/rpg/lisp/asdf-install-systems/)`
>> evaluated to `/Users/rpg/lisp/asdf-install-systems/systems/` which is
>> not a directory.
>>
>> The problem with this error is that, in fact, that IS a directory:
>>
>> CL-USER(2): (probe-file "/Users/rpg/lisp/asdf-install-systems/systems/")
>> #P"/Users/rpg/lisp/asdf-install-systems/systems/"
>>
>> I'm looking in sysdef-central-registry-search and the logic seems to be
>> completely borked. It looks for a system definition and, if it doesn't
>> find one, it assumes that the directory name is bad. I believe the
>> logic should be:
>>
>> 1. Look at the directory and ensure that it exists.
>>
>> 2. If it does not exist, push it onto the bad list
>>
>> 3. Else merge in the system name and look for the system definition.
>>
>> The current logic merges in the system name first, so misdiagnoses.
>>
>> [I will now proceed to wrestle with git, which I am coming to loathe
>> with a consuming hatred, in order to attempt to verify that my diagnosis
>> is correct, and then send a patch. More soon.]
>>
>
> OK, I /have/ misdiagnosed this. The logic seems actually busted in
> directory-pathname-p. The problem is that, at least on allegro, you can
> get a valid directory pathname whose name component is neither NIL, nor
> :unspecific, but "" (the empty string).
>
> This seems like a place where wrestling with CL pathnames is very
> unpleasant.... What I'd really like to do here is resolve the pathname
> and just ask the bloody OS if this is a directory or not, instead of do
> these kind of seemingly random flailings with the pathname object:
>
> (defun directory-pathname-p (pathname)
> (and (member (pathname-name pathname) (list nil :unspecific))
> (member (pathname-type pathname) (list nil :unspecific))))
>
> This will now have to be
>
> (member (pathname-name pathname) (list nil "" :unspecific) :test 'equal)
>
> which seems like it's metastasizing complexity...
Yet worse. On the #lisp IRC antifuchs and Xach point out more possible
problems:
antifuchs: actually, a :name component of "." with :type
nil/:unspecific would make sense in posix
Xach: antifuchs: or :name nil and :type "" :-)
This suggests that fixing directory-pathname-p may be sufficiently
horrible that we should back out this attempted helpfulness.
The only alternative seems to me to be to figure out a way to ask the OS
whether a file name denotes a directory, which seems like such an
expensive thing that we may not want ASDF to do it inside an inner loop
like sysdef-central-registry-search.
Every time I look deeply into CL pathnames I regret them more....
More information about the asdf-devel
mailing list