diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 7c93d8698de0..f314c02ff32b 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -1,7 +1,7 @@ # Operations on attribute sets. with { - inherit (builtins) head tail isString; + inherit (builtins) head tail; inherit (import ./trivial.nix) or; inherit (import ./default.nix) fold; inherit (import ./strings.nix) concatStringsSep; @@ -100,7 +100,7 @@ rec { (AttrSet -> Bool) -> AttrSet -> AttrSet Example: - collect builtins.isList { a = { b = ["b"]; }; c = [1]; } + collect isList { a = { b = ["b"]; }; c = [1]; } => [["b"] [1]] collect (x: x ? outPath) diff --git a/lib/default.nix b/lib/default.nix index fc92e04503b2..4b6027c437be 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -21,8 +21,6 @@ let in { inherit trivial lists strings stringsWithDeps attrsets sources options modules types meta debug maintainers licenses platforms systems; - # Pull in some builtins not included elsewhere. - inherit (builtins) pathExists readFile; } # !!! don't include everything at top-level; perhaps only the most # commonly used functions. diff --git a/lib/lists.nix b/lib/lists.nix index d0b09539bf69..2a1fa7205637 100644 --- a/lib/lists.nix +++ b/lib/lists.nix @@ -1,14 +1,16 @@ # General list operations. -let - inherit (import ./trivial.nix) deepSeq; +with import ./trivial.nix; + +let inc = builtins.add 1; dec = n: builtins.sub n 1; in rec { - inherit (builtins) head tail length isList add sub lessThan elemAt; + + inherit (builtins) head tail length isList elemAt; # Create a list consisting of a single element. `singleton x' is @@ -55,7 +57,7 @@ in rec { else [ (f (inc n) (elemAt list n)) ] ++ imap' (inc n); in imap' 0; - + # Concatenate a list of lists. concatLists = builtins.concatLists or (fold (x: y: x ++ y) []); @@ -72,7 +74,7 @@ in rec { then fold (x: y: (flatten x) ++ y) [] x else [x]; - + # Filter a list using a predicate; that is, return a list containing # every element from `list' for which `pred' returns true. filter = @@ -80,11 +82,11 @@ in rec { (pred: list: fold (x: y: if pred x then [x] ++ y else y) [] list); - + # Remove elements equal to 'e' from a list. Useful for buildInputs. remove = e: filter (x: x != e); - + # Return true if `list' has an element `x'. elem = builtins.elem or @@ -106,7 +108,7 @@ in rec { findFirst = pred: default: list: let found = filter pred list; in if found == [] then default else head found; - + # Return true iff function `pred' returns true for at least element # of `list'. @@ -136,16 +138,16 @@ in rec { # If argument is a list, return it; else, wrap it in a singleton # list. If you're using this, you should almost certainly # reconsider if there isn't a more "well-typed" approach. - toList = x: if builtins.isList x then x else [x]; + toList = x: if isList x then x else [x]; + - # Return a list of integers from `first' up to and including `last'. range = first: last: - if builtins.lessThan last first + if lessThan last first then [] - else [first] ++ range (builtins.add first 1) last; + else [first] ++ range (add first 1) last; + - # Partition the elements of a list in two lists, `right' and # `wrong', depending on the evaluation of a predicate. partition = pred: @@ -160,7 +162,7 @@ in rec { let len1 = length fst; len2 = length snd; - len = if builtins.lessThan len1 len2 then len1 else len2; + len = if lessThan len1 len2 then len1 else len2; zipListsWith' = n: if n != len then [ (f (elemAt fst n) (elemAt snd n)) ] @@ -207,7 +209,7 @@ in rec { [ (elemAt list n) ] ++ take' (inc n); in take' 0; - + # Remove the first (at most) N elements of a list. drop = count: list: let @@ -219,7 +221,8 @@ in rec { drop' (dec n) ++ [ (elemAt list n) ]; in drop' (dec len); - + + # Return the last element of a list. last = list: assert list != []; elemAt list (dec (length list)); @@ -237,5 +240,7 @@ in rec { else []; in zipTwoLists' 0; + deepSeqList = xs: y: if any (x: deepSeq x false) xs then y else y; + } diff --git a/lib/modules.nix b/lib/modules.nix index 071809daa58e..fa31ce6399ce 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -42,7 +42,7 @@ rec { closeModules = modules: args: let toClosureList = file: parentKey: imap (n: x: - if isAttrs x || builtins.isFunction x then + if isAttrs x || isFunction x then unifyModuleSyntax file "${parentKey}:anon-${toString n}" (applyIfFunction x args) else unifyModuleSyntax (toString x) (toString x) (applyIfFunction (import x) args)); @@ -74,7 +74,7 @@ rec { config = removeAttrs m ["key" "_file" "require" "imports"]; }; - applyIfFunction = f: arg: if builtins.isFunction f then f arg else f; + applyIfFunction = f: arg: if isFunction f then f arg else f; /* Merge a list of modules. This will recurse over the option declarations in all modules, combining them into a single set. @@ -260,7 +260,7 @@ rec { options' = opt.options or (throw "Option `${showOption loc'}' has type optionSet but has no option attribute."); coerce = x: - if builtins.isFunction x then x + if isFunction x then x else { config, ... }: { options = x; }; options = map coerce (flatten options'); f = tp: diff --git a/lib/options.nix b/lib/options.nix index 63798c4faa3b..71e02db58f69 100644 --- a/lib/options.nix +++ b/lib/options.nix @@ -34,12 +34,12 @@ rec { mergeDefaultOption = loc: defs: let list = getValues defs; in if length list == 1 then head list - else if all builtins.isFunction list then x: mergeDefaultOption loc (map (f: f x) list) + else if all isFunction list then x: mergeDefaultOption loc (map (f: f x) list) else if all isList list then concatLists list else if all isAttrs list then fold lib.mergeAttrs {} list - else if all builtins.isBool list then fold lib.or false list - else if all builtins.isString list then lib.concatStrings list - else if all builtins.isInt list && all (x: x == head list) list then head list + else if all isBool list then fold lib.or false list + else if all isString list then lib.concatStrings list + else if all isInt list && all (x: x == head list) list then head list else throw "Cannot merge definitions of `${showOption loc}' given in ${showFiles (getFiles defs)}."; /* Obsolete, will remove soon. Specify an option type or apply @@ -54,7 +54,7 @@ rec { mergeListOption = mergeTypedOption "list" isList concatLists; - mergeStringOption = mergeTypedOption "string" builtins.isString lib.concatStrings; + mergeStringOption = mergeTypedOption "string" isString lib.concatStrings; mergeOneOption = loc: defs: if defs == [] then abort "This case should never happen." diff --git a/lib/strings.nix b/lib/strings.nix index 024a9ac7d7a2..cd748f02cc63 100644 --- a/lib/strings.nix +++ b/lib/strings.nix @@ -7,7 +7,8 @@ inherit (builtins) add sub lessThan length; in rec { - inherit (builtins) stringLength substring head tail; + + inherit (builtins) stringLength substring head tail isString; # Concatenate a list of strings. diff --git a/lib/trivial.nix b/lib/trivial.nix index 8af3474f2a67..760a74ce6664 100644 --- a/lib/trivial.nix +++ b/lib/trivial.nix @@ -16,7 +16,7 @@ rec { or = x: y: x || y; and = x: y: x && y; mergeAttrs = x: y: x // y; - + # Take a function and evaluate it with its own returned value. fix = f: let result = f result; in result; @@ -26,7 +26,7 @@ rec { # `seq x y' evaluates x, then returns y. That is, it forces strict # evaluation of its first argument. seq = x: y: if x == null then y else y; - + # Like `seq', but recurses into lists and attribute sets to force evaluation # of all list elements/attributes. deepSeq = x: y: @@ -35,4 +35,10 @@ rec { else if builtins.isAttrs x then deepSeqAttrs x y else seq x y; + + # Pull in some builtins not included elsewhere. + inherit (builtins) + pathExists readFile isBool isFunction + isInt add sub lessThan; + } diff --git a/lib/types.nix b/lib/types.nix index 09b29a762e1d..bdd21f123952 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -48,19 +48,19 @@ rec { bool = mkOptionType { name = "boolean"; - check = builtins.isBool; + check = isBool; merge = loc: fold (x: y: x.value || y) false; }; int = mkOptionType { name = "integer"; - check = builtins.isInt; + check = isInt; merge = mergeOneOption; }; str = mkOptionType { name = "string"; - check = builtins.isString; + check = isString; merge = mergeOneOption; }; @@ -68,7 +68,7 @@ rec { # separator between the values). separatedString = sep: mkOptionType { name = "string"; - check = builtins.isString; + check = isString; merge = loc: defs: concatStringsSep sep (getValues defs); }; @@ -170,7 +170,7 @@ rec { functionTo = elemType: mkOptionType { name = "function that evaluates to a(n) ${elemType.name}"; - check = builtins.isFunction; + check = isFunction; merge = loc: defs: fnArgs: elemType.merge loc (map (fn: { inherit (fn) file; value = fn.value fnArgs; }) defs); getSubOptions = elemType.getSubOptions; @@ -183,10 +183,10 @@ rec { in mkOptionType rec { name = "submodule"; - check = x: isAttrs x || builtins.isFunction x; + check = x: isAttrs x || isFunction x; merge = loc: defs: let - coerce = def: if builtins.isFunction def then def else { config = def; }; + coerce = def: if isFunction def then def else { config = def; }; modules = opts' ++ map (def: { _file = def.file; imports = [(coerce def.value)]; }) defs; in (evalModules { inherit modules; args.name = last loc; prefix = loc; }).config; getSubOptions = prefix: (evalModules diff --git a/nixos/modules/config/shells-environment.nix b/nixos/modules/config/shells-environment.nix index e3fbdd7aaec1..0b4f75a35216 100644 --- a/nixos/modules/config/shells-environment.nix +++ b/nixos/modules/config/shells-environment.nix @@ -31,9 +31,9 @@ in res = (head defs').value; in if isList res then concatLists (getValues defs') - else if builtins.lessThan 1 (length defs') then + else if lessThan 1 (length defs') then throw "The option `${showOption loc}' is defined multiple times, in ${showFiles (getFiles defs)}." - else if !builtins.isString res then + else if !isString res then throw "The option `${showOption loc}' does not have a string value, in ${showFiles (getFiles defs)}." else res; }); diff --git a/nixos/modules/config/sysctl.nix b/nixos/modules/config/sysctl.nix index 31441bad6157..f987c9c9e944 100644 --- a/nixos/modules/config/sysctl.nix +++ b/nixos/modules/config/sysctl.nix @@ -6,7 +6,7 @@ let sysctlOption = mkOptionType { name = "sysctl option value"; - check = x: builtins.isBool x || builtins.isString x || builtins.isInt x; + check = x: isBool x || isString x || isInt x; merge = args: defs: (last defs).value; # FIXME: hacky way to allow overriding in configuration.nix. }; diff --git a/nixos/modules/hardware/network/b43.nix b/nixos/modules/hardware/network/b43.nix index 8f45bd4d3f1a..03f81f92ef0b 100644 --- a/nixos/modules/hardware/network/b43.nix +++ b/nixos/modules/hardware/network/b43.nix @@ -1,4 +1,6 @@ -{pkgs, config, ...}: +{ config, pkgs, ... }: + +with pkgs.lib; let kernelVersion = config.boot.kernelPackages.kernel.version; in @@ -8,9 +10,9 @@ let kernelVersion = config.boot.kernelPackages.kernel.version; in options = { - networking.enableB43Firmware = pkgs.lib.mkOption { + networking.enableB43Firmware = mkOption { default = false; - type = pkgs.lib.types.bool; + type = types.bool; description = '' Turn on this option if you want firmware for the NICs supported by the b43 module. ''; @@ -21,11 +23,11 @@ let kernelVersion = config.boot.kernelPackages.kernel.version; in ###### implementation - config = pkgs.lib.mkIf config.networking.enableB43Firmware { - assertions = [ { - assertion = builtins.lessThan 0 (builtins.compareVersions kernelVersion "3.2"); - message = "b43 firmware for kernels older than 3.2 not packaged yet!"; - } ]; + config = mkIf config.networking.enableB43Firmware { + assertions = singleton + { assertion = lessThan 0 (builtins.compareVersions kernelVersion "3.2"); + message = "b43 firmware for kernels older than 3.2 not packaged yet!"; + }; hardware.firmware = [ pkgs.b43Firmware_5_1_138 ]; }; diff --git a/nixos/modules/installer/cd-dvd/channel.nix b/nixos/modules/installer/cd-dvd/channel.nix index bcf3dbb3f735..9aca5b89d258 100644 --- a/nixos/modules/installer/cd-dvd/channel.nix +++ b/nixos/modules/installer/cd-dvd/channel.nix @@ -11,7 +11,7 @@ let # CD. These are installed into the "nixos" channel of the root # user, as expected by nixos-rebuild/nixos-install. channelSources = pkgs.runCommand "nixos-${config.system.nixosVersion}" - { expr = builtins.readFile ../../../lib/channel-expr.nix; } + { expr = readFile ../../../lib/channel-expr.nix; } '' mkdir -p $out/nixos cp -prd ${pkgs.path} $out/nixos/nixpkgs diff --git a/nixos/modules/services/misc/disnix.nix b/nixos/modules/services/misc/disnix.nix index 72b98d1f84a5..82526b154e7a 100644 --- a/nixos/modules/services/misc/disnix.nix +++ b/nixos/modules/services/misc/disnix.nix @@ -111,7 +111,7 @@ in // optionalAttrs (config.services.tomcat.enable) { tomcatPort = 8080; } // optionalAttrs (config.services.svnserve.enable) { svnBaseDir = config.services.svnserve.svnBaseDir; } // optionalAttrs (cfg.publishInfrastructure.enableAuthentication) ( - optionalAttrs (config.services.mysql.enable) { mysqlUsername = "root"; mysqlPassword = builtins.readFile config.services.mysql.rootPassword; }) + optionalAttrs (config.services.mysql.enable) { mysqlUsername = "root"; mysqlPassword = readFile config.services.mysql.rootPassword; }) ) ; @@ -152,7 +152,7 @@ in ${concatMapStrings (infrastructureAttrName: let infrastructureAttrValue = getAttr infrastructureAttrName (cfg.infrastructure); in - if builtins.isInt infrastructureAttrValue then + if isInt infrastructureAttrValue then ''${infrastructureAttrName}=${toString infrastructureAttrValue} \ '' else diff --git a/nixos/modules/services/networking/ssh/sshd.nix b/nixos/modules/services/networking/ssh/sshd.nix index 7a2335847e3a..85b6ab1efecf 100644 --- a/nixos/modules/services/networking/ssh/sshd.nix +++ b/nixos/modules/services/networking/ssh/sshd.nix @@ -19,7 +19,7 @@ let knownHostsFile = pkgs.writeText "ssh_known_hosts" ( flip concatMapStrings knownHosts (h: - "${concatStringsSep "," h.hostNames} ${builtins.readFile h.publicKeyFile}" + "${concatStringsSep "," h.hostNames} ${readFile h.publicKeyFile}" ) ); @@ -59,7 +59,7 @@ let mode = "0444"; source = pkgs.writeText "${u.name}-authorized_keys" '' ${concatStringsSep "\n" u.openssh.authorizedKeys.keys} - ${concatMapStrings (f: builtins.readFile f + "\n") u.openssh.authorizedKeys.keyFiles} + ${concatMapStrings (f: readFile f + "\n") u.openssh.authorizedKeys.keyFiles} ''; }; usersWithKeys = attrValues (flip filterAttrs config.users.extraUsers (n: u: diff --git a/nixos/modules/services/torrent/transmission.nix b/nixos/modules/services/torrent/transmission.nix index 063332d48628..68f9b0647c0e 100644 --- a/nixos/modules/services/torrent/transmission.nix +++ b/nixos/modules/services/torrent/transmission.nix @@ -15,7 +15,7 @@ let toOption = x: if x == true then "true" else if x == false then "false" - else if builtins.isInt x then toString x + else if isInt x then toString x else toString ''\"${x}\"''; # All lines in settings.json end with a ',' (comma), except for the last diff --git a/nixos/modules/services/web-servers/apache-httpd/default.nix b/nixos/modules/services/web-servers/apache-httpd/default.nix index d21b6da0e772..900948893489 100644 --- a/nixos/modules/services/web-servers/apache-httpd/default.nix +++ b/nixos/modules/services/web-servers/apache-httpd/default.nix @@ -17,8 +17,8 @@ let getPort = cfg: if cfg.port != 0 then cfg.port else if cfg.enableSSL then 443 else 80; extraModules = attrByPath ["extraModules"] [] mainCfg; - extraForeignModules = filter builtins.isAttrs extraModules; - extraApacheModules = filter (x: !(builtins.isAttrs x)) extraModules; # I'd prefer using builtins.isString here, but doesn't exist yet + extraForeignModules = filter isAttrs extraModules; + extraApacheModules = filter isString extraModules; makeServerInfo = cfg: { diff --git a/nixos/modules/system/activation/activation-script.nix b/nixos/modules/system/activation/activation-script.nix index e012c977164e..1545bcb8a1f9 100644 --- a/nixos/modules/system/activation/activation-script.nix +++ b/nixos/modules/system/activation/activation-script.nix @@ -71,7 +71,7 @@ in ${ let - set' = mapAttrs (n: v: if builtins.isString v then noDepEntry v else v) set; + set' = mapAttrs (n: v: if isString v then noDepEntry v else v) set; withHeadlines = addAttributeName set'; in textClosureMap id (withHeadlines) (attrNames withHeadlines) }