PATCH Error message for broken asd file links

Andreas Fuchs <[email protected]> Sat, 06 Oct 2007 14:37:51 +0200
Newsgroups gmane.lisp.cclan.general
Message-ID <[email protected]>
There's a strange interaction in ASDF on SBCL: if a user has defined a
system by manually loading a system definition, for example a file
containing this:

(asdf:defsystem "foo")

and has a broken link in one of the directories in the
asdf:*central-registry*, he'll get an error like the one in
http://paste.lisp.org/display/48735 when anything uses (asdf:find-system
"foo").

This is caused by PROBE-FILE on SBCL returning the symlink's pathname
for broken symlinks, and FILE-WRITE-DATE returning NIL for these broken
symlinks. I don't consider this a bug (the spec states that the file
must exist, not that OPEN of that file must not fail), so asdf needs to
be fixed (-:

IMO, as the system is already in memory, any error message from
find-system is inappropriate. It may still cause confusion for users
once they reload their lisp and get an error that the system isn't
found, so the attached patch warns that it can't compare the found
system defn to the one in memory. Maybe silent success would be a better
option. If the maintainers think so, please correct.

Cheers,
-- 
Andreas Fuchs, (http://|im:asf@|mailto:asf@)boinkor.net, antifuchs

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/

_______________________________________________
cclan-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cclan-list
warn-on-reloading-broken-symlink.patch (text/plain, 927 B)
diff --git a/contrib/asdf/asdf.lisp b/contrib/asdf/asdf.lisp
index 4005dc8..fa695a0 100644
--- a/contrib/asdf/asdf.lisp
+++ b/contrib/asdf/asdf.lisp
@@ -376,9 +376,14 @@ and NIL NAME and TYPE components"
   (let* ((name (coerce-name name))
          (in-memory (gethash name *defined-systems*))
          (on-disk (system-definition-pathname name)))
+    (when (and in-memory (null (file-write-date on-disk)))
+      (warn "~@<Can't check whether ~A is newer than the definition for ~A ~
+             that is already loaded.~@:>"
+            on-disk name))
     (when (and on-disk
                (or (not in-memory)
-                   (< (car in-memory) (file-write-date on-disk))))
+                   (and (file-write-date on-disk)
+                        (< (car in-memory) (file-write-date on-disk)))))
       (let ((package (make-temporary-package)))
         (unwind-protect
              (let ((*package* package))