From: Samium Gromoff <[email protected]> > From: "Tobias C. Rittweiler" <[email protected]> >> Faré wrote >> >>> 2009/12/21 Samium Gromoff >>>> Fare, >>>> >>>> Please consider the patch in the 'missing-definition' branch in >>>> >>>> git://git.feelingofgreen.ru/asdf >>>> >>> Applied in my development repo, master branch: >>> http://common-lisp.net/project/xcvb/git/asdf.git >>> >>> Candidate for immediate release, if no one else disagrees. >> >> (The above link is pretty useless.) >> >> What does the patch do? > > I'm sorry, obviously the burden was upon me to properly describe > the proposed modification. > > Basically, ASDF:FIND-SYSTEM assumed that SYSTEM-DEFINITION-PATHNAME > returns a valid pathname. But, of course, the reality is that ASDF > doesn't have any leverage upon what is returned by the functions > in the ASDF:*SYSTEM-DEFINITION-SEARCH-FUNCTIONS* list. > > The implication is that if any function in that list screws up, > by returninig a bogus pathname, the subsequent call to LOAD > will fail with a relatively cryptic FILE-ERROR. > > The proposed modification intercedes before the precious information > is lost, by checking for presence of the referenced file, and > signalling a more structured condition in case it does not exist.
I guess I also should provide the patch inline: commit 2ca055895fb18aadcdbb3ab29f696c9fa63c1b62 Author: Samium Gromoff <[email protected]> Date: Mon Dec 21 15:07:37 2009 +0300 New condition, MISSING-DEFINITION, signalled when a sysdef locator fails. Thanks to Nikodemus Siivola for coming up with a portable way to check for file existence. Dead symlinks defeat all things like CL-FAD:FILE-EXISTS-P. diff --git a/asdf.lisp b/asdf.lisp index 4a85132..a1cc31c 100644 --- a/asdf.lisp +++ b/asdf.lisp @@ -109,6 +109,9 @@ #:*resolve-symlinks* #:operation-error #:compile-failed #:compile-warned #:compile-error + #:error-name + #:error-pathname + #:missing-definition #:error-component #:error-operation #:system-definition-error #:missing-component @@ -421,6 +424,14 @@ and NIL NAME and TYPE components" (:report (lambda (c s) (apply #'format s (format-control c) (format-arguments c))))) +(define-condition missing-definition (system-definition-error) + ((name :initarg :name :reader error-name) + (pathname :initarg :pathname :reader error-pathname)) + (:report (lambda (c s) + (format s "~@<Definition search function returned a wrong pathname ~A ~ + in search of a definition for system ~A.~@:>" + (error-pathname c) (error-name c))))) + (define-condition circular-dependency (system-definition-error) ((components :initarg :components :reader circular-dependency-components))) @@ -746,14 +757,17 @@ to `~a` which is not a directory.~@:>" (< (car in-memory) (safe-file-write-date on-disk)))) (let ((package (make-temporary-package))) (unwind-protect - (let ((*package* package)) - (asdf-message - "~&~@<; ~@;loading system definition from ~A into ~A~@:>~%" - ;; FIXME: This wants to be (ENOUGH-NAMESTRING - ;; ON-DISK), but CMUCL barfs on that. - on-disk - *package*) - (load on-disk)) + (with-open-file (asd on-disk :if-does-not-exist nil) + (if asd + (let ((*package* package)) + (asdf-message + "~&~@<; ~@;loading system definition from ~A into ~A~@:>~%" + ;; FIXME: This wants to be (ENOUGH-NAMESTRING + ;; ON-DISK), but CMUCL barfs on that. + on-disk + *package*) + (load asd)) + (error 'missing-definition :name name :pathname on-disk))) (delete-package package)))) (let ((in-memory (system-registered-p name))) (if in-memory regards, Samium Gromoff -- _deepfire-at-feelingofgreen.ru O< ascii ribbon campaign - stop html mail - www.asciiribbon.org _______________________________________________ asdf-devel mailing list [email protected] http://common-lisp.net/cgi-bin/mailman/listinfo/asdf-devel
