lib/modules: Add a function to create an option alias that respects the priority
This commit adds a function `mkAliasOptionModuleWithPriority`. This function will make an alias to an existing option and copy over the priority. This functionality is needed for PRs like #53041. In that case `nixos-generate-config` added an option to `hardware-configuration.nix` with `mkDefault`. That option was then changed and an alias created for the old name. The end user should be able to set the non-alias option in their `configuration.nix` and have everything work correctly. Without this function, the priority for the option won't be copied over correctly and the end-user will get a message saying they have the same option set to two different values.
This commit is contained in:
parent
da00ec4b45
commit
b81b3ad1b0
@ -109,7 +109,7 @@ let
|
|||||||
mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions
|
mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions
|
||||||
mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule
|
mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule
|
||||||
mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
|
mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
|
||||||
mkAliasOptionModule doRename filterModules;
|
mkAliasOptionModule mkAliasOptionModuleWithPriority doRename filterModules;
|
||||||
inherit (options) isOption mkEnableOption mkSinkUndeclaredOptions
|
inherit (options) isOption mkEnableOption mkSinkUndeclaredOptions
|
||||||
mergeDefaultOption mergeOneOption mergeEqualOption getValues
|
mergeDefaultOption mergeOneOption mergeEqualOption getValues
|
||||||
getFiles optionAttrSetToDocList optionAttrSetToDocList'
|
getFiles optionAttrSetToDocList optionAttrSetToDocList'
|
||||||
|
@ -556,8 +556,21 @@ rec {
|
|||||||
#
|
#
|
||||||
mkAliasDefinitions = mkAliasAndWrapDefinitions id;
|
mkAliasDefinitions = mkAliasAndWrapDefinitions id;
|
||||||
mkAliasAndWrapDefinitions = wrap: option:
|
mkAliasAndWrapDefinitions = wrap: option:
|
||||||
mkIf (isOption option && option.isDefined) (wrap (mkMerge option.definitions));
|
mkAliasIfDef option (wrap (mkMerge option.definitions));
|
||||||
|
|
||||||
|
# Similar to mkAliasAndWrapDefinitions but copies over the priority from the
|
||||||
|
# option as well.
|
||||||
|
#
|
||||||
|
# If a priority is not set, it assumes a priority of 100.
|
||||||
|
mkAliasAndWrapDefsWithPriority = wrap: option:
|
||||||
|
let
|
||||||
|
defaultPrio = 100;
|
||||||
|
prio = option.highestPrio or defaultPrio;
|
||||||
|
defsWithPrio = map (mkOverride prio) option.definitions;
|
||||||
|
in mkAliasIfDef option (wrap (mkMerge defsWithPrio));
|
||||||
|
|
||||||
|
mkAliasIfDef = option:
|
||||||
|
mkIf (isOption option && option.isDefined);
|
||||||
|
|
||||||
/* Compatibility. */
|
/* Compatibility. */
|
||||||
fixMergeModules = modules: args: evalModules { inherit modules args; check = false; };
|
fixMergeModules = modules: args: evalModules { inherit modules args; check = false; };
|
||||||
@ -690,7 +703,16 @@ rec {
|
|||||||
use = id;
|
use = id;
|
||||||
};
|
};
|
||||||
|
|
||||||
doRename = { from, to, visible, warn, use }:
|
/* Like ‘mkAliasOptionModule’, but copy over the priority of the option as well. */
|
||||||
|
mkAliasOptionModuleWithPriority = from: to: doRename {
|
||||||
|
inherit from to;
|
||||||
|
visible = true;
|
||||||
|
warn = false;
|
||||||
|
use = id;
|
||||||
|
withPriority = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
doRename = { from, to, visible, warn, use, withPriority ? false }:
|
||||||
{ config, options, ... }:
|
{ config, options, ... }:
|
||||||
let
|
let
|
||||||
fromOpt = getAttrFromPath from options;
|
fromOpt = getAttrFromPath from options;
|
||||||
@ -708,7 +730,9 @@ rec {
|
|||||||
warnings = optional (warn && fromOpt.isDefined)
|
warnings = optional (warn && fromOpt.isDefined)
|
||||||
"The option `${showOption from}' defined in ${showFiles fromOpt.files} has been renamed to `${showOption to}'.";
|
"The option `${showOption from}' defined in ${showFiles fromOpt.files} has been renamed to `${showOption to}'.";
|
||||||
}
|
}
|
||||||
(mkAliasAndWrapDefinitions (setAttrByPath to) fromOpt)
|
(if withPriority
|
||||||
|
then mkAliasAndWrapDefsWithPriority (setAttrByPath to) fromOpt
|
||||||
|
else mkAliasAndWrapDefinitions (setAttrByPath to) fromOpt)
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ with lib;
|
|||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
# Create an alias for the "enable" option.
|
# Create an alias for the "enable" option.
|
||||||
(mkAliasOptionModule [ "enableAlias" ] [ "enable" ])
|
(mkAliasOptionModuleWithPriority [ "enableAlias" ] [ "enable" ])
|
||||||
|
|
||||||
# Disable the aliased option, but with a default (low) priority so it
|
# Disable the aliased option, but with a default (low) priority so it
|
||||||
# should be able to be overridden by the next import.
|
# should be able to be overridden by the next import.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user