From 9c35f44999b38f07b674ff25cde17452ab4a1969 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Tue, 25 Jul 2023 01:53:30 +0200 Subject: [PATCH] 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. --- lib/modules.nix | 2 +- lib/tests/modules.sh | 3 +++ lib/tests/modules/merge-typeless-option.nix | 25 +++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 lib/tests/modules/merge-typeless-option.nix diff --git a/lib/modules.nix b/lib/modules.nix index 0bedd28e877e..8a145b8f11f3 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 c81febb4156f..7cc157025696 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 .. 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 000000000000..627d90b15db2 --- /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; +}