summaryrefslogtreecommitdiff
path: root/guix/derivations.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2015-01-24 22:50:40 +0100
committerLudovic Courtès <ludo@gnu.org>2015-01-24 22:57:49 +0100
commitf304c9c237aca7e9007d6e0cefd6ed858c5a9e47 (patch)
treeba6720f7db2bd14590d2aa89fa28245ff7ee40a0 /guix/derivations.scm
parentda74bc7886cba77192260d84b2dd57466e4b5354 (diff)
downloadgnu-guix-f304c9c237aca7e9007d6e0cefd6ed858c5a9e47.tar
gnu-guix-f304c9c237aca7e9007d6e0cefd6ed858c5a9e47.tar.gz
derivations: Raise an error for references to non-existent outputs.
Fixes <http://bugs.gnu.org/19630>. Reported by Ricardo Wurmus <ricardo.wurmus@mdc-berlin.de>. * guix/derivations.scm (&derivation-error, &derivation-missing-output-error): New error conditions. (derivation->output-path): Raise a '&derivation-missing-output-error' if OUTPUT is not an output of DRV. * guix/ui.scm (call-with-error-handling): Add case for 'derivation-missing-output-error?'. (show-what-to-build): Check whether (derivation-outputs drv) is empty. * tests/packages.scm ("reference to non-existent output"): Add test.
Diffstat (limited to 'guix/derivations.scm')
-rw-r--r--guix/derivations.scm33
1 files changed, 30 insertions, 3 deletions
diff --git a/guix/derivations.scm b/guix/derivations.scm
index 4c34fcb4b8..edf6b57e86 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -21,6 +21,8 @@
#:use-module (srfi srfi-9)
#:use-module (srfi srfi-9 gnu)
#:use-module (srfi srfi-26)
+ #:use-module (srfi srfi-34)
+ #:use-module (srfi srfi-35)
#:use-module (rnrs io ports)
#:use-module (rnrs bytevectors)
#:use-module (ice-9 match)
@@ -59,6 +61,13 @@
derivation-input-sub-derivations
derivation-input-output-paths
+ &derivation-error
+ derivation-error?
+ derivation-error-derivation
+ &derivation-missing-output-error
+ derivation-missing-output-error?
+ derivation-missing-output
+
derivation-name
derivation-output-names
fixed-output-derivation?
@@ -98,6 +107,18 @@
#:replace (build-derivations))
;;;
+;;; Error conditions.
+;;;
+
+(define-condition-type &derivation-error &nix-error
+ derivation-error?
+ (derivation derivation-error-derivation))
+
+(define-condition-type &derivation-missing-output-error &derivation-error
+ derivation-missing-output-error?
+ (output derivation-missing-output))
+
+;;;
;;; Nix derivations, as implemented in Nix's `derivations.cc'.
;;;
@@ -509,9 +530,15 @@ that form."
(cut write-derivation drv <>))))))
(define* (derivation->output-path drv #:optional (output "out"))
- "Return the store path of its output OUTPUT."
- (let ((outputs (derivation-outputs drv)))
- (and=> (assoc-ref outputs output) derivation-output-path)))
+ "Return the store path of its output OUTPUT. Raise a
+'&derivation-missing-output-error' condition if OUTPUT is not an output of
+DRV."
+ (let ((output* (assoc-ref (derivation-outputs drv) output)))
+ (if output*
+ (derivation-output-path output*)
+ (raise (condition (&derivation-missing-output-error
+ (derivation drv)
+ (output output)))))))
(define (derivation->output-paths drv)
"Return the list of name/path pairs of the outputs of DRV."