3
0
Fork 0
forked from mirrors/nixpkgs

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.
This commit is contained in:
sternenseemann 2023-07-25 01:53:30 +02:00
parent 8ef139fe52
commit 9c35f44999
3 changed files with 29 additions and 1 deletions

View file

@ -624,7 +624,7 @@ let
unmatchedDefns = []; unmatchedDefns = [];
} }
else if optionDecls != [] then 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 # Raw options can only be merged into submodules. Merging into
# attrsets might be nice, but ambiguous. Suppose we have # attrsets might be nice, but ambiguous. Suppose we have
# attrset as a `attrsOf submodule`. User declares option # attrset as a `attrsOf submodule`. User declares option

View file

@ -365,6 +365,9 @@ checkConfigError \
config.set \ config.set \
./declare-set.nix ./declare-enable-nested.nix ./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 # Test that types.optionType merges types correctly
checkConfigOutput '^10$' config.theOption.int ./optionTypeMerging.nix checkConfigOutput '^10$' config.theOption.int ./optionTypeMerging.nix
checkConfigOutput '^"hello"$' config.theOption.str ./optionTypeMerging.nix checkConfigOutput '^"hello"$' config.theOption.str ./optionTypeMerging.nix

View file

@ -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;
}