Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ let
pushDownProperties dischargeProperties filterOverrides
sortProperties fixupOptionType mkIf mkAssert mkMerge mkOverride
mkOptionDefault mkDefault mkImageMediaOverride mkForce mkVMOverride
mkTransform
mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions
mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule
mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
Expand Down
34 changes: 29 additions & 5 deletions lib/modules.nix
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,7 @@ rec {
) defs;

# Process mkOverride properties.
defs'' = filterOverrides' defs';
defs'' = filterOverrides' loc type defs';

# Sort mkOrder properties.
defs''' =
Expand Down Expand Up @@ -681,6 +681,8 @@ rec {
map (mapAttrs (n: v: mkIf cfg.condition v)) (pushDownProperties cfg.content)
else if cfg._type or "" == "override" then
map (mapAttrs (n: v: mkOverride cfg.priority v)) (pushDownProperties cfg.content)
else if cfg._type or "" == "transform" then
map (mapAttrs (n: v: mkTransform v)) (pushDownProperties cfg.content)
else # FIXME: handle mkOrder?
[ cfg ];

Expand Down Expand Up @@ -727,13 +729,28 @@ rec {

Note that "z" has the default priority 100.
*/
filterOverrides = defs: (filterOverrides' defs).values;

filterOverrides' = defs:
filterOverrides = loc: type: defs: (
filterOverrides'
(throw "filterOverrides does not support mkTransform. Use filterOverrides'.")
(throw "filterOverrides does not support mkTransform. Use filterOverrides'.")
defs
).values;

filterOverrides' = loc: type: defs:
let
getPrio = def: if def.value._type or "" == "override" then def.value.priority else defaultPriority;
highestPrio = foldl' (prio: def: min (getPrio def) prio) 9999 defs;
strip = def: if def.value._type or "" == "override" then def // { value = def.value.content; } else def;
lowerPrioDefs = filter (def: getPrio def > highestPrio) defs;
strip = def:
if def.value._type or "" == "override"
then def // { value = def.value.content or (
def.value.function (
builtins.addErrorContext
"while evaluating lower priority options as input to mkTransform"
(mergeDefinitions loc type lowerPrioDefs).mergedValue
)
); }
else def;
in {
values = concatMap (def: if getPrio def == highestPrio then [(strip def)] else []) defs;
inherit highestPrio;
Expand Down Expand Up @@ -802,6 +819,13 @@ rec {
mkForce = mkOverride 50;
mkVMOverride = mkOverride 10; # used by ‘nixos-rebuild build-vm’

# Produce a value based on merged lower priority values.
mkTransform = priority: function:
{
_type = "override";
inherit priority function;
};

mkFixStrictness = lib.warn "lib.mkFixStrictness has no effect and will be removed. It returns its argument unmodified, so you can just remove any calls." id;

mkOrder = priority: content:
Expand Down
4 changes: 4 additions & 0 deletions lib/tests/modules.sh
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@ checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-if-foo-e
checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-foo-if-enable.nix
checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-foo-enable-if.nix

# Check mkTransform
checkConfigOutput '42' config.value ./declare-int-positive-value.nix ./define-value-int-positive.nix
checkConfigOutput '84' config.value ./declare-int-positive-value.nix ./define-value-int-force-twice.nix ./define-value-int-positive.nix

# Check disabledModules with config definitions and option declarations.
set -- config.enable ./define-enable.nix ./declare-enable.nix
checkConfigOutput '^true$' "$@"
Expand Down