From f304c9c237aca7e9007d6e0cefd6ed858c5a9e47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Sat, 24 Jan 2015 22:50:40 +0100 Subject: derivations: Raise an error for references to non-existent outputs. Fixes . Reported by Ricardo Wurmus . * 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. --- guix/derivations.scm | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'guix/derivations.scm') 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? @@ -97,6 +106,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." -- cgit v1.2.3