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
parentda74bc7886cba77192260d84b2dd57466e4b5354 (diff)
downloadguix-f304c9c237aca7e9007d6e0cefd6ed858c5a9e47.tar.gz
guix-f304c9c237aca7e9007d6e0cefd6ed858c5a9e47.zip
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.
-rw-r--r--guix/derivations.scm33
-rw-r--r--guix/ui.scm9
-rw-r--r--tests/packages.scm11
3 files changed, 47 insertions, 6 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."
diff --git a/guix/ui.scm b/guix/ui.scm
index e1e75d8556..04c50f4827 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -249,6 +249,10 @@ interpreted."
;; FIXME: Server-provided error messages aren't i18n'd.
(leave (_ "build failed: ~a~%")
(nix-protocol-error-message c)))
+ ((derivation-missing-output-error? c)
+ (leave (_ "reference to invalid output '~a' of derivation '~a'~%")
+ (derivation-missing-output c)
+ (derivation-file-name (derivation-error-derivation c))))
((message-condition? c)
;; Normally '&message' error conditions have an i18n'd message.
(leave (_ "~a~%")
@@ -309,9 +313,8 @@ available for download."
(const #f)))
(define (built-or-substitutable? drv)
- (let ((out (derivation->output-path drv)))
- ;; If DRV has zero outputs, OUT is #f.
- (or (not out)
+ (or (null? (derivation-outputs drv))
+ (let ((out (derivation->output-path drv))) ;XXX: assume "out" exists
(or (valid-path? store out)
(substitutable? out)))))
diff --git a/tests/packages.scm b/tests/packages.scm
index ef34e76380..65e5cc3cdd 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -268,6 +268,17 @@
(package-derivation %store p)
#f)))
+(test-assert "reference to non-existent output"
+ ;; See <http://bugs.gnu.org/19630>.
+ (let* ((dep (dummy-package "dep"))
+ (p (dummy-package "p"
+ (inputs `(("dep" ,dep "non-existent"))))))
+ (guard (c ((derivation-missing-output-error? c)
+ (and (string=? (derivation-missing-output c) "non-existent")
+ (equal? (package-derivation %store dep)
+ (derivation-error-derivation c)))))
+ (package-derivation %store p))))
+
(test-assert "trivial"
(let* ((p (package (inherit (dummy-package "trivial"))
(build-system trivial-build-system)
>Mark H Weaver * gnu/packages/lisp.scm (ccl)[inputs]: Add default cases in 'match' forms. Fix pattern in "armhf-linux" case of sha256 field. 2015-04-18doc: Warn earlier about the risk of overwriting with the binary install.Ludovic Courtès Suggested by Pjotr Prins <pjotr.public12@thebird.nl>. * doc/guix.texi (Binary Installation): Move warning about overwriting higher up. 2015-04-18gnu: gnome-settings-daemon: Use wacom packages.Andy Wingo * gnu/packages/gnome.scm (gnome-settings-daemon): Use the wacom packages. Signed-off-by: Ludovic Courtès <ludo@gnu.org> 2015-04-18gnu: Add xf86-input-wacom.Andy Wingo * gnu/packages/xdisorg.scm (xf86-input-wacom): New variable. 2015-04-18gnu: Add libwacom.Andy Wingo * gnu/packages/xdisorg.scm (libwacom): New variable. Signed-off-by: Ludovic Courtès <ludo@gnu.org> 2015-04-18packages: Allow package lookups with version prefixes.Ludovic Courtès * gnu/packages.scm (find-packages-by-name): Sort MATCHING according to 'version>?'. Use 'string-prefix?' instead of 'string=?' to compare against VERSION. * doc/guix.texi (Invoking guix package): Add example and explanation. 2015-04-18gnu: ucommon: Update to 6.3.1.Andreas Enge * gnu/packages/telephony.scm (ucommon): Update to 6.3.1. 2015-04-18gnu: ccrtp: Update to 2.1.2.Andreas Enge * gnu/packages/telephony.scm (ccrtp): Update to 2.1.2. 2015-04-18gnu: sipwitch: Update to 1.9.7.Andreas Enge * gnu/packages/telephony.scm (sipwitch): Update to 1.9.7. 2015-04-18gnu: nano: Update to 2.4.1.Andreas Enge * gnu/packages/nano.scm (nano): Update to 2.4.1. 2015-04-18gnu: calibre: Update to 2.25.0.Andreas Enge * gnu/packages/ebook.scm (calibre): Update to 2.25.0. 2015-04-18gnu: Add MariaDB.宋文武 * gnu/packages/databases.scm (mariadb): New variable. 2015-04-18gnu: Add libaio.宋文武 * gnu/packages/linux.scm (libaio): New variable. 2015-04-18gnu: Add jemalloc.宋文武 * gnu/packages/jemalloc.scm: New file. * gnu-system.am (GNU_SYSTEM_MODULES): Add it. 2015-04-18gnu: gst-plugins-good: Add more inputs and remove unneeded ones.宋文武 * gnu/packages/gstreamer.scm (gst-plugins-good): Move gst-plugins-base from 'native-inputs' to 'inputs'. [inputs]: Add aalib, jack, libavc1394, libcaca, libdv, libiec61833, libshout, libsoup, libvpx, orc, taglib and wavpack. Remove glib, gstreamer, libogg, libx11, libxext, libxv, and zlib. [arguments]: Remove. 2015-04-18gnu: ntp: Update to 4.2.8p2.Mark H Weaver * gnu/packages/ntp.scm (ntp): Update to 4.2.8p2. 2015-04-18gnu: tor: Update to 0.2.5.12.Mark H Weaver * gnu/packages/tor.scm (tor): Update to 0.2.5.12. 2015-04-17Merge branch 'core-updates'Mark H Weaver 2015-04-17gnu: ffmpeg: Drop old version 2.2.Andreas Enge * gnu/packages/video.scm (ffmpeg-2.2): Remove variable. (ffmpeg)[arguments]: Drop LDFLAGS environment variable needed only for older versions. 2015-04-17monads: Optimize 'sequence'.Ludovic Courtès * guix/monads.scm (sequence): Rewrite as a macro. This yields a 10% improvement in wall-clock time for 'guix system build'. 2015-04-17gnu: gnome-vfs: Tolerate 'test-async-cancel' failures, take two.Mark H Weaver * gnu/packages/gnome.scm (gnome-vfs)[arguments]: Remove 'XFAIL_TESTS' make flag, which caused 'make check' to fail if the test unexpectedly passed. Add 'patch-test-async-cancel-to-never-fail' phase.