summary refs log tree commit diff
path: root/lib/modules.nix
diff options
context:
space:
mode:
authorDanylo Hlynskyi <abcz2.uprola@gmail.com>2019-03-07 21:28:09 +0200
committerGitHub <noreply@github.com>2019-03-07 21:28:09 +0200
commit60e8fcf0e56ce881294b06bd1f40069016308162 (patch)
tree15d4e83548173c9ae881e42e6557573864b68a3b /lib/modules.nix
parentcf1de3c2df3d4ca558e81a62ba475ab8a4d9fce6 (diff)
downloadnixpkgs-60e8fcf0e56ce881294b06bd1f40069016308162.tar
nixpkgs-60e8fcf0e56ce881294b06bd1f40069016308162.tar.gz
nixpkgs-60e8fcf0e56ce881294b06bd1f40069016308162.tar.bz2
nixpkgs-60e8fcf0e56ce881294b06bd1f40069016308162.tar.lz
nixpkgs-60e8fcf0e56ce881294b06bd1f40069016308162.tar.xz
nixpkgs-60e8fcf0e56ce881294b06bd1f40069016308162.tar.zst
nixpkgs-60e8fcf0e56ce881294b06bd1f40069016308162.zip
module system: revert "remove types.optionSet", just deprecate (#56857)
The explicit remove helped to uncover some hidden uses of `optionSet`
in NixOps. However it makes life harder for end-users of NixOps - it will
be impossible to deploy 19.03 systems with old NixOps, but there is no
new release of NixOps with `optionSet` fixes.

Also, "deprecation" process isn't well defined. Even that `optionSet` was
declared "deprecated" for many years, it was never announced. Hence, I
leave "deprecation" announce. Then, 3 releases after announce,
we can announce removal of this feature.

This type has to be removed, not `throw`-ed in runtime, because it makes
some perfectly fine code to fail. For example:
```
$ nix-instantiate --eval -E '(import <nixpkgs/lib>).types' --strict
trace: `types.list` is deprecated; use `types.listOf` instead
error: types.optionSet is deprecated; use types.submodule instead
(use '--show-trace' to show detailed location information)
```
Diffstat (limited to 'lib/modules.nix')
-rw-r--r--lib/modules.nix18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index a41c9da610a..0869eae1982 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 = []; };