~ruther/guix-local

d26e19671e2a50a25d37357aba301bef5df1818e — Ludovic Courtès 10 years ago 6985335
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.
4 files changed, 31 insertions(+), 6 deletions(-)

M guix/derivations.scm
M guix/gexp.scm
M guix/ui.scm
M tests/derivations.scm
M guix/derivations.scm => guix/derivations.scm +17 -1
@@ 90,7 90,11 @@
            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 @@ system, imported, and appears under FINAL-PATH in the resulting store path."
                                  #: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

M guix/gexp.scm => guix/gexp.scm +0 -5
@@ 902,11 902,6 @@ system, imported, and appears under FINAL-PATH in the resulting store path."
                      #: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))

M guix/ui.scm => guix/ui.scm +5 -0
@@ 461,6 461,11 @@ interpreted."
             (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~%")

M tests/derivations.scm => tests/derivations.scm +9 -0
@@ 570,6 570,15 @@

(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