lib/modules: Only interpret class declaration in non-shorthand mode

This is to avoid stealing keys from submodules. `class` might be
common enough that reinterpreting existing `class` attributes in
configurations as a declaration leads to fairly widespread problems.
This commit is contained in:
Robert Hensing 2023-04-10 17:26:25 +02:00
parent 1f4a58ef03
commit 84b1b01702
4 changed files with 19 additions and 1 deletions

View File

@ -511,7 +511,7 @@ let
imports = m.require or [] ++ m.imports or [];
options = {};
config = addFreeformType (removeAttrs m ["_file" "key" "disabledModules" "require" "imports" "freeformType"]);
class = m.class or null;
class = null;
};
applyModuleArgsIfFunction = key: f: args@{ config, options, lib, ... }:

View File

@ -255,6 +255,8 @@ checkConfigError 'A definition for option .* is not of type .*' \
## Freeform modules
# Assigning without a declared option should work
checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix
# Shorthand modules interpret `meta` and `class` as config items
checkConfigOutput '^true$' options._module.args.value.result ./freeform-attrsOf.nix ./define-freeform-keywords-shorthand.nix
# No freeform assignments shouldn't make it error
checkConfigOutput '^{ }$' config ./freeform-attrsOf.nix
# but only if the type matches

View File

@ -25,6 +25,7 @@
./module-class-is-nixos.nix
{ _file = "foo.nix#darwinModules.default";
class = "darwin";
config = {};
imports = [];
}
];

View File

@ -0,0 +1,15 @@
{ config, ... }: {
class = { "just" = "data"; };
a = "one";
b = "two";
meta = "meta";
_module.args.result =
let r = builtins.removeAttrs config [ "_module" ];
in builtins.trace (builtins.deepSeq r r) (r == {
a = "one";
b = "two";
class = { "just" = "data"; };
meta = "meta";
});
}