diff options
author | sternenseemann <sternenseemann@systemli.org> | 2023-07-25 01:53:30 +0200 |
---|---|---|
committer | sternenseemann <sternenseemann@systemli.org> | 2023-07-26 23:58:04 +0200 |
commit | 9c35f44999b38f07b674ff25cde17452ab4a1969 (patch) | |
tree | fbe8576b5fd723e2993e755e6cc820b0875c7f62 | |
parent | 8ef139fe5251dd94b2464e8a21388deadd75aef6 (diff) | |
download | nixpkgs-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.nix | 2 | ||||
-rwxr-xr-x | lib/tests/modules.sh | 3 | ||||
-rw-r--r-- | lib/tests/modules/merge-typeless-option.nix | 25 |
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; +} |