summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--lib/modules.nix7
-rw-r--r--nixos/modules/config/shells-environment.nix9
2 files changed, 10 insertions, 6 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 5c5820e92f45..9733929706f1 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 5b8b6bc600ca..4c40f33532f8 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);
     };