From 1500252e6fa30fc8b615587bc13a8f470b071586 Mon Sep 17 00:00:00 2001 From: Nicolas Pierron Date: Tue, 19 May 2009 23:07:07 +0000 Subject: [PATCH] * options.nix: Remove attribute set comparison. Imported attribute sets are traverse assuming that no duplicate could exists. svn path=/nixpkgs/trunk/; revision=15659 --- pkgs/lib/options.nix | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/pkgs/lib/options.nix b/pkgs/lib/options.nix index 713c8f0b372..bd42b1dcf34 100644 --- a/pkgs/lib/options.nix +++ b/pkgs/lib/options.nix @@ -146,6 +146,7 @@ rec { || builtins.isList x ); + # Evaluate a list of option sets that would be merged with the # function "merge" which expects two arguments. The attribute named # "require" is used to imports option declarations and bindings. @@ -192,13 +193,27 @@ rec { cfg3 = noImportConditions cfg2; in cfg3; - getRequire = x: - toList (getAttr ["require"] [] (preprocess x)); + getRequire = x: toList (getAttr ["require"] [] (preprocess x)); + getRecusiveRequire = x: + fold (cfg: l: + if isPath cfg then + [ cfg ] ++ l + else + [ cfg ] ++ (getRecusiveRequire cfg) ++ l + ) [] (getRequire x); + + getRequireSets = x: filter (x: ! isPath x) (getRecusiveRequire x); + getRequirePaths = x: filter isPath (getRecusiveRequire x); rmRequire = x: removeAttrs (preprocess x) ["require"]; + + inlineRequiredSets = cfgs: + fold (cfg: l: [ cfg ] ++ (getRequireSets cfg) ++ l) [] cfgs; in merge "" ( map rmRequire ( - lib.uniqFlatten getRequire [] [] (toList opts) + inlineRequiredSets ( + lib.uniqFlatten getRequirePaths [] [] (toList opts) + ) ) );