about summary refs log tree commit diff
path: root/pkgs/top-level/splice.nix
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2017-12-09 14:27:24 -0500
committerJohn Ericson <John.Ericson@Obsidian.Systems>2017-12-09 20:02:45 -0500
commit965cc5da574c8ee2310d0cc0a7d75363f422b4c3 (patch)
tree5b308c7ad616868cd1d0d5494a8737e062c98359 /pkgs/top-level/splice.nix
parent43d5c5d6db3ce33f3cf1d17ba43c7374257466ec (diff)
downloadnixlib-965cc5da574c8ee2310d0cc0a7d75363f422b4c3.tar
nixlib-965cc5da574c8ee2310d0cc0a7d75363f422b4c3.tar.gz
nixlib-965cc5da574c8ee2310d0cc0a7d75363f422b4c3.tar.bz2
nixlib-965cc5da574c8ee2310d0cc0a7d75363f422b4c3.tar.lz
nixlib-965cc5da574c8ee2310d0cc0a7d75363f422b4c3.tar.xz
nixlib-965cc5da574c8ee2310d0cc0a7d75363f422b4c3.tar.zst
nixlib-965cc5da574c8ee2310d0cc0a7d75363f422b4c3.zip
top-level: Fix splicing in the presence of evaluation errors
 - No more `or {}`, this was misleading at best since those values
   wouldn't be used unless the attr they are defined from was present
   anyways.

 - `tryEval` for get outputs. This ensures that if some derivations fail, they
   won't take out the others. This benefited from the `or {}` before, but that
   was never good enough. `tryEval` is strictly better.
Diffstat (limited to 'pkgs/top-level/splice.nix')
-rw-r--r--pkgs/top-level/splice.nix9
1 files changed, 6 insertions, 3 deletions
diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix
index b13fa86a9958..d2c339b04df8 100644
--- a/pkgs/top-level/splice.nix
+++ b/pkgs/top-level/splice.nix
@@ -37,12 +37,15 @@ let
       inherit name;
       value = let
         defaultValue = mash.${name};
-        buildValue = buildPkgs.${name} or {};
-        runValue = runPkgs.${name} or {};
+        buildValue = buildPkgs.${name};
+        runValue = runPkgs.${name};
         augmentedValue = defaultValue
           // (lib.optionalAttrs (buildPkgs ? ${name}) { nativeDrv = buildValue; })
           // (lib.optionalAttrs (runPkgs ? ${name}) { crossDrv = runValue; });
         # Get the set of outputs of a derivation
+        tryGetOutputs = value0: let
+          eval = builtins.tryEval value0;
+        in getOutputs (if eval.success then eval.value else {});
         getOutputs = value: lib.genAttrs
           (value.outputs or (lib.optional (value ? out) "out"))
           (output: value.${output});
@@ -54,7 +57,7 @@ let
         # The derivation along with its outputs, which we recur
         # on to splice them together.
         else if lib.isDerivation defaultValue then augmentedValue
-          // splicer (getOutputs buildValue) (getOutputs runValue)
+          // splicer (tryGetOutputs buildValue) (getOutputs runValue)
         # Just recur on plain attrsets
         else if lib.isAttrs defaultValue then splicer buildValue runValue
         # Don't be fancy about non-derivations. But we could have used used