summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorVladimír Čunát <v@cunat.cz>2019-03-10 08:04:21 +0100
committerVladimír Čunát <v@cunat.cz>2019-03-10 08:04:21 +0100
commitbf47162c26641af76083b0d26ceb477be6a620ff (patch)
tree6aac7576850659e3c0e880036bcbeed56a70662b /lib
parent5d7ab319493974dbd8514d99941e6aa1108cc05f (diff)
parent213d6dd6ac1e440e95398448dae4bd6cf24989dd (diff)
Merge branch 'master' into staging-next
Hydra nixpkgs: ?compare=1508887
Diffstat (limited to 'lib')
-rw-r--r--lib/default.nix2
-rw-r--r--lib/modules.nix18
-rw-r--r--lib/options.nix4
-rw-r--r--lib/trivial.nix3
-rw-r--r--lib/types.nix6
5 files changed, 26 insertions, 7 deletions
diff --git a/lib/default.nix b/lib/default.nix
index dbb90081b2c3..688c117d52b4 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -59,7 +59,7 @@ let
stringLength sub substring tail;
inherit (trivial) id const concat or and bitAnd bitOr bitXor bitNot
boolToString mergeAttrs flip mapNullable inNixShell min max
- importJSON warn info nixpkgsVersion version mod compare
+ importJSON warn info showWarnings nixpkgsVersion version mod compare
splitByAndCompare functionArgs setFunctionArgs isFunction;
inherit (fixedPoints) fix fix' converge extends composeExtensions
makeExtensible makeExtensibleWithCustomName;
diff --git a/lib/modules.nix b/lib/modules.nix
index a41c9da610ac..0869eae1982b 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -476,8 +476,22 @@ rec {
optionSet to options of type submodule. FIXME: remove
eventually. */
fixupOptionType = loc: opt:
- if opt.type.getSubModules or null == null
- then opt // { type = opt.type or types.unspecified; }
+ let
+ options = opt.options or
+ (throw "Option `${showOption loc'}' has type optionSet but has no option attribute, in ${showFiles opt.declarations}.");
+ f = tp:
+ let optionSetIn = type: (tp.name == type) && (tp.functor.wrapped.name == "optionSet");
+ in
+ if tp.name == "option set" || tp.name == "submodule" then
+ throw "The option ${showOption loc} uses submodules without a wrapping type, in ${showFiles opt.declarations}."
+ else if optionSetIn "attrsOf" then types.attrsOf (types.submodule options)
+ else if optionSetIn "loaOf" then types.loaOf (types.submodule options)
+ else if optionSetIn "listOf" then types.listOf (types.submodule options)
+ else if optionSetIn "nullOr" then types.nullOr (types.submodule options)
+ else tp;
+ in
+ if opt.type.getSubModules or null == null
+ then opt // { type = f (opt.type or types.unspecified); }
else opt // { type = opt.type.substSubModules opt.options; options = []; };
diff --git a/lib/options.nix b/lib/options.nix
index 5cea99067aab..a16a980398d6 100644
--- a/lib/options.nix
+++ b/lib/options.nix
@@ -48,6 +48,8 @@ rec {
visible ? null,
# Whether the option can be set only once
readOnly ? null,
+ # Deprecated, used by types.optionSet.
+ options ? null
} @ attrs:
attrs // { _type = "option"; };
@@ -141,7 +143,7 @@ rec {
docOption = rec {
loc = opt.loc;
name = showOption opt.loc;
- description = opt.description or (throw "Option `${name}' has no description.");
+ description = opt.description or (lib.warn "Option `${name}' has no description." "This option has no description.");
declarations = filter (x: x != unknownModule) opt.declarations;
internal = opt.internal or false;
visible = opt.visible or true;
diff --git a/lib/trivial.nix b/lib/trivial.nix
index 3f0816b55405..2d682961035f 100644
--- a/lib/trivial.nix
+++ b/lib/trivial.nix
@@ -259,9 +259,10 @@ rec {
# TODO: figure out a clever way to integrate location information from
# something like __unsafeGetAttrPos.
- warn = msg: builtins.trace "WARNING: ${msg}";
+ warn = msg: builtins.trace "warning: ${msg}";
info = msg: builtins.trace "INFO: ${msg}";
+ showWarnings = warnings: res: lib.fold (w: x: warn w x) res warnings;
## Function annotations
diff --git a/lib/types.nix b/lib/types.nix
index 7a88e1b9e36b..b225119299da 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -469,8 +469,10 @@ rec {
# Obsolete alternative to configOf. It takes its option
# declarations from the ‘options’ attribute of containing option
# declaration.
- optionSet = builtins.throw "types.optionSet is deprecated; use types.submodule instead" "optionSet";
-
+ optionSet = mkOptionType {
+ name = builtins.trace "types.optionSet is deprecated; use types.submodule instead" "optionSet";
+ description = "option set";
+ };
# Augment the given type with an additional type check function.
addCheck = elemType: check: elemType // { check = x: elemType.check x && check x; };