From e28ea1239fe9413bdb59fd323167b7440b75fc0b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 28 Oct 2013 17:37:28 +0100 Subject: [PATCH] Fix evaluation of environment.variables --- lib/modules.nix | 7 +++++-- nixos/modules/config/shells-environment.nix | 9 +++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/modules.nix b/lib/modules.nix index 5c5820e92f4..9733929706f 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -143,7 +143,7 @@ rec { let # Process mkOverride properties, adding in the default # value specified in the option declaration (if any). - defsFinal = filterOverrides + defsFinal = filterOverrides' ((if opt ? default then [{ file = head opt.declarations; value = mkOptionDefault opt.default; }] else []) ++ defs); # Type-check the remaining definitions, and merge them if # possible. @@ -229,7 +229,7 @@ rec { Note that "z" has the default priority 100. */ - filterOverrides = defs: + filterOverrides' = defs: let defaultPrio = 100; getPrio = def: if def.value._type or "" == "override" then def.value.priority else defaultPrio; @@ -238,6 +238,9 @@ rec { strip = def: if def.value._type or "" == "override" then def // { value = def.value.content; } else def; in concatMap (def: if getPrio def == highestPrio then [(strip def)] else []) defs; + /* For use in options like environment.variables. */ + filterOverrides = defs: map (def: def.value) (filterOverrides' (map (def: { value = def; }) defs)); + /* Hack for backward compatibility: convert options of type optionSet to configOf. FIXME: remove eventually. */ fixupOptionType = loc: opt: diff --git a/nixos/modules/config/shells-environment.nix b/nixos/modules/config/shells-environment.nix index 5b8b6bc600c..4c40f33532f 100644 --- a/nixos/modules/config/shells-environment.nix +++ b/nixos/modules/config/shells-environment.nix @@ -26,10 +26,11 @@ in type = types.attrsOf (mkOptionType { name = "a string or a list of strings"; merge = xs: - if isList (head xs) then concatLists xs - else if builtins.lessThan 1 (length xs) then abort "variable in ‘environment.variables’ has multiple values" - else if !builtins.isString (head xs) then abort "variable in ‘environment.variables’ does not have a string value" - else head xs; + let xs' = filterOverrides xs; in + if isList (head xs') then concatLists xs' + else if builtins.lessThan 1 (length xs') then abort "variable in ‘environment.variables’ has multiple values" + else if !builtins.isString (head xs') then abort "variable in ‘environment.variables’ does not have a string value" + else head xs'; }); apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v); };