summary refs log tree commit diff
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)
downloadnixpkgs-0469f92fafbaad45d5aebc4b2bea64bc59ce2ce8.tar
nixpkgs-0469f92fafbaad45d5aebc4b2bea64bc59ce2ce8.tar.gz
nixpkgs-0469f92fafbaad45d5aebc4b2bea64bc59ce2ce8.tar.bz2
nixpkgs-0469f92fafbaad45d5aebc4b2bea64bc59ce2ce8.tar.lz
nixpkgs-0469f92fafbaad45d5aebc4b2bea64bc59ce2ce8.tar.xz
nixpkgs-0469f92fafbaad45d5aebc4b2bea64bc59ce2ce8.tar.zst
nixpkgs-0469f92fafbaad45d5aebc4b2bea64bc59ce2ce8.zip
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 6d9dc0e3ad3..017c9255246 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. */