diff options
author | John Ericson <John.Ericson@Obsidian.Systems> | 2017-12-09 14:27:24 -0500 |
---|---|---|
committer | John Ericson <John.Ericson@Obsidian.Systems> | 2017-12-09 20:02:45 -0500 |
commit | 965cc5da574c8ee2310d0cc0a7d75363f422b4c3 (patch) | |
tree | 5b308c7ad616868cd1d0d5494a8737e062c98359 /pkgs/top-level/splice.nix | |
parent | 43d5c5d6db3ce33f3cf1d17ba43c7374257466ec (diff) |
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.nix | 9 |
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 |