summaryrefslogtreecommitdiffstats
path: root/lib/modules.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-03-30 20:35:25 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-03-30 20:35:25 +0200
commit0469f92fafbaad45d5aebc4b2bea64bc59ce2ce8 (patch)
treed18854c517274fbb60c923726099492456b766b7 /lib/modules.nix
parent0fdd641b21631dc64db71b81caf77418b88c46f8 (diff)
Bring back mkOrder
Diffstat (limited to 'lib/modules.nix')
-rw-r--r--lib/modules.nix34
1 files changed, 29 insertions, 5 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 6d9dc0e3ad3f..017c9255246f 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -155,8 +155,14 @@ 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);
+ # Sort mkOrder properties.
+ defsFinal =
+ # Avoid sorting if we don't have to.
+ if any (def: def.value._type or "" == "order") defsFinal'
+ then sortProperties defsFinal'
+ else defsFinal';
files = map (def: def.file) defsFinal;
# Type-check the remaining definitions, and merge them if
# possible.
@@ -180,7 +186,7 @@ rec {
};
/* Given a config set, expand mkMerge properties, and push down the
- mkIf properties into the children. The result is a list of
+ other properties into the children. The result is a list of
config sets that do not have properties at top-level. For
example,
@@ -201,7 +207,7 @@ 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
+ else # FIXME: handle mkOrder?
[ cfg ];
/* Given a config value, expand mkMerge properties, and discharge
@@ -253,6 +259,19 @@ 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;
+ /* Sort a list of properties. The sort priority of a property is
+ 1000 by default, but can be overriden by wrapping the property
+ using mkOrder. */
+ sortProperties = defs:
+ let
+ strip = def:
+ if def.value._type or "" == "order"
+ then def // { value = def.value.content; inherit (def.value) priority; }
+ else def;
+ defs' = map strip defs;
+ compare = a: b: (a.priority or 1000) < (b.priority or 1000);
+ in sort compare defs';
+
/* Hack for backward compatibility: convert options of type
optionSet to configOf. FIXME: remove eventually. */
fixupOptionType = loc: opt:
@@ -302,8 +321,13 @@ rec {
mkFixStrictness = id; # obsolete, no-op
- # FIXME: Add mkOrder back in. It's not currently used anywhere in
- # NixOS, but it should be useful.
+ mkOrder = priority: content:
+ { _type = "order";
+ inherit priority content;
+ };
+
+ mkBefore = mkOrder 500;
+ mkAfter = mkOrder 1500;
/* Compatibility. */