summary refs log tree commit diff
diff options
context:
space:
mode:
authorsternenseemann <sternenseemann@systemli.org>2023-07-25 01:53:30 +0200
committersternenseemann <sternenseemann@systemli.org>2023-07-26 23:58:04 +0200
commit9c35f44999b38f07b674ff25cde17452ab4a1969 (patch)
treefbe8576b5fd723e2993e755e6cc820b0875c7f62
parent8ef139fe5251dd94b2464e8a21388deadd75aef6 (diff)
downloadnixpkgs-9c35f44999b38f07b674ff25cde17452ab4a1969.tar
nixpkgs-9c35f44999b38f07b674ff25cde17452ab4a1969.tar.gz
nixpkgs-9c35f44999b38f07b674ff25cde17452ab4a1969.tar.bz2
nixpkgs-9c35f44999b38f07b674ff25cde17452ab4a1969.tar.lz
nixpkgs-9c35f44999b38f07b674ff25cde17452ab4a1969.tar.xz
nixpkgs-9c35f44999b38f07b674ff25cde17452ab4a1969.tar.zst
nixpkgs-9c35f44999b38f07b674ff25cde17452ab4a1969.zip
lib/modules: handle typeless options in mergeModules
mkOption does not require a `type` argument and does not set the
resulting attribute if it is not given. Consequently, we need to be
prepared to merge options that have no type information.
-rw-r--r--lib/modules.nix2
-rwxr-xr-xlib/tests/modules.sh3
-rw-r--r--lib/tests/modules/merge-typeless-option.nix25
3 files changed, 29 insertions, 1 deletions
diff --git a/lib/modules.nix b/lib/modules.nix
index 0bedd28e877..8a145b8f11f 100644
--- a/lib/modules.nix
+++ b/lib/modules.nix
@@ -624,7 +624,7 @@ let
               unmatchedDefns = [];
             }
           else if optionDecls != [] then
-              if all (x: x.options.type.name == "submodule") optionDecls
+              if all (x: x.options.type.name or null == "submodule") optionDecls
               # Raw options can only be merged into submodules. Merging into
               # attrsets might be nice, but ambiguous. Suppose we have
               # attrset as a `attrsOf submodule`. User declares option
diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh
index c81febb4156..7cc15702569 100755
--- a/lib/tests/modules.sh
+++ b/lib/tests/modules.sh
@@ -365,6 +365,9 @@ checkConfigError \
   config.set \
   ./declare-set.nix ./declare-enable-nested.nix
 
+# Check that that merging of option collisions doesn't depend on type being set
+checkConfigError 'The option .group..*would be a parent of the following options, but its type .<no description>. does not support nested options.\n\s*- option.s. with prefix .group.enable..*' config.group.enable ./merge-typeless-option.nix
+
 # Test that types.optionType merges types correctly
 checkConfigOutput '^10$' config.theOption.int ./optionTypeMerging.nix
 checkConfigOutput '^"hello"$' config.theOption.str ./optionTypeMerging.nix
diff --git a/lib/tests/modules/merge-typeless-option.nix b/lib/tests/modules/merge-typeless-option.nix
new file mode 100644
index 00000000000..627d90b15db
--- /dev/null
+++ b/lib/tests/modules/merge-typeless-option.nix
@@ -0,0 +1,25 @@
+{ lib, ... }:
+
+let
+  typeless =
+    { lib, ... }:
+
+    {
+      options.group = lib.mkOption { };
+    };
+  childOfTypeless =
+    { lib, ... }:
+
+    {
+      options.group.enable = lib.mkEnableOption "nothing";
+    };
+in
+
+{
+  imports = [
+    typeless
+    childOfTypeless
+  ];
+
+  config.group.enable = false;
+}