derivations: Raise an error when a module file is not found.

Suggested by Jookia.

* guix/derivations.scm (&file-search-error): New error condition.
(search-path*): Raise it when 'search-path' returns #f.
* guix/gexp.scm (search-path*): Remove.
* guix/ui.scm (call-with-error-handling): Add case for
'file-search-error?'.
* tests/derivations.scm ("build-expression->derivation and invalid
module name"): New test.
This commit is contained in:
Ludovic Courtès 2016-03-22 15:00:53 +01:00
parent 6985335faa
commit d26e19671e
4 changed files with 31 additions and 6 deletions

View file

@ -90,7 +90,11 @@ (define-module (guix derivations)
build-derivations
built-derivations
file-search-error?
file-search-error-file-name
file-search-error-search-path
search-path*
module->source-file-name
build-expression->derivation)
@ -1036,10 +1040,22 @@ (define* (imported-files store files ;deprecated
#:guile-for-build guile
#:local-build? #t)))
;; The "file not found" error condition.
(define-condition-type &file-search-error &error
file-search-error?
(file file-search-error-file-name)
(path file-search-error-search-path))
(define search-path*
;; A memoizing version of 'search-path' so 'imported-modules' does not end
;; up looking for the same files over and over again.
(memoize search-path))
(memoize (lambda (path file)
"Search for FILE in PATH and memoize the result. Raise a
'&file-search-error' condition if it could not be found."
(or (search-path path file)
(raise (condition
(&file-search-error (file file)
(path path))))))))
(define (module->source-file-name module)
"Return the file name corresponding to MODULE, a Guile module name (a list

View file

@ -902,11 +902,6 @@ (define build
#:guile-for-build guile
#:local-build? #t)))
(define search-path*
;; A memoizing version of 'search-path' so 'imported-modules' does not end
;; up looking for the same files over and over again.
(memoize search-path))
(define* (imported-modules modules
#:key (name "module-import")
(system (%current-system))

View file

@ -461,6 +461,11 @@ (define (port-filename* port)
(leave (_ "reference to invalid output '~a' of derivation '~a'~%")
(derivation-missing-output c)
(derivation-file-name (derivation-error-derivation c))))
((file-search-error? c)
(leave (_ "file '~a' could not be found in these \
directories:~{ ~a~}~%")
(file-search-error-file-name c)
(file-search-error-search-path c)))
((message-condition? c)
;; Normally '&message' error conditions have an i18n'd message.
(leave (_ "~a~%")

View file

@ -570,6 +570,15 @@ (define %coreutils
(test-skip (if (%guile-for-build) 0 8))
(test-equal "build-expression->derivation and invalid module name"
'(file-search-error "guix/module/that/does/not/exist.scm")
(guard (c ((file-search-error? c)
(list 'file-search-error
(file-search-error-file-name c))))
(build-expression->derivation %store "foo" #t
#:modules '((guix module that
does not exist)))))
(test-assert "build-expression->derivation and derivation-prerequisites"
(let ((drv (build-expression->derivation %store "fail" #f)))
(any (match-lambda