From d26e19671e2a50a25d37357aba301bef5df1818e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Tue, 22 Mar 2016 15:00:53 +0100 Subject: [PATCH] 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. --- guix/derivations.scm | 18 +++++++++++++++++- guix/gexp.scm | 5 ----- guix/ui.scm | 5 +++++ tests/derivations.scm | 9 +++++++++ 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/guix/derivations.scm b/guix/derivations.scm index 2af65b1dc0..2d8584e72d 100644 --- a/guix/derivations.scm +++ b/guix/derivations.scm @@ -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 diff --git a/guix/gexp.scm b/guix/gexp.scm index c408c94c43..b4d737ecae 100644 --- a/guix/gexp.scm +++ b/guix/gexp.scm @@ -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)) diff --git a/guix/ui.scm b/guix/ui.scm index 7b7bee0ac8..3b1887ccbf 100644 --- a/guix/ui.scm +++ b/guix/ui.scm @@ -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~%") diff --git a/tests/derivations.scm b/tests/derivations.scm index 4d3b82fe1a..a52142e0f1 100644 --- a/tests/derivations.scm +++ b/tests/derivations.scm @@ -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