mirror of
https://github.com/nix-community/nixvim.git
synced 2025-06-20 16:15:43 +02:00
lib/deprecation: implement aliases for mkRemovedPackageOptionModule
Allows most existing configs to continue building, now with warnings instead of assertions when the old `plugins.*.*Package` options are used. An assertion will still occur if there is a merge conflict, e.g: `plugins.a.fooPackage = null` and `plugins.b.fooPackage = pkgs.foo`.
This commit is contained in:
parent
ee9655637c
commit
d94956e5da
2 changed files with 93 additions and 10 deletions
|
@ -129,23 +129,62 @@ rec {
|
||||||
packageName,
|
packageName,
|
||||||
oldPackageName ? packageName,
|
oldPackageName ? packageName,
|
||||||
}:
|
}:
|
||||||
{ options, ... }:
|
{ config, options, ... }:
|
||||||
let
|
let
|
||||||
oldOptionPath = builtins.concatMap lib.toList [
|
cfg = config.dependencies.${packageName};
|
||||||
|
opt = options.dependencies.${packageName};
|
||||||
|
oldOptPath = builtins.concatMap lib.toList [
|
||||||
"plugins"
|
"plugins"
|
||||||
plugin
|
plugin
|
||||||
"${oldPackageName}Package"
|
"${oldPackageName}Package"
|
||||||
];
|
];
|
||||||
depOption = options.dependencies.${packageName};
|
oldOpt = lib.getAttrFromPath oldOptPath options;
|
||||||
depOptionLoc = lib.dropEnd 1 depOption.enable.loc;
|
|
||||||
|
|
||||||
instructions = ''
|
# We can't use `oldOpt.value` because that will use our `apply`, so we merge the definitions ourselves:
|
||||||
Please use the `${lib.showOption depOptionLoc}` top-level option instead:
|
oldDef = lib.modules.mergeDefinitions oldOpt.loc oldOpt.type oldOpt.definitionsWithLocations;
|
||||||
- `${depOption.enable} = false` to disable installing `${packageName}`
|
|
||||||
- `${depOption.package}` to choose which package to install for `${packageName}`.
|
# Conceptually similar to `mkDerivedConfig`, but uses our manually merged definition
|
||||||
'';
|
configFromOldDef =
|
||||||
|
{
|
||||||
|
predicate ? _: true,
|
||||||
|
apply ? lib.id,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (oldDef) mergedValue isDefined;
|
||||||
|
inherit (oldDef.defsFinal') highestPrio;
|
||||||
|
condition = isDefined && predicate mergedValue;
|
||||||
|
value = apply mergedValue;
|
||||||
|
in
|
||||||
|
lib.mkIf condition (lib.mkOverride highestPrio value);
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [ (lib.mkRemovedOptionModule oldOptionPath instructions) ];
|
options = lib.setAttrByPath oldOptPath (
|
||||||
|
lib.mkOption {
|
||||||
|
type = with lib.types; nullOr package;
|
||||||
|
description = "Alias of `${opt.enable}` and `${opt.package}`.";
|
||||||
|
visible = false;
|
||||||
|
apply =
|
||||||
|
let
|
||||||
|
value = if cfg.enable then cfg.package else null;
|
||||||
|
use = builtins.trace "Obsolete option `${oldOpt}' is used. It was replaced by `${opt.enable}' and `${opt.package}'.";
|
||||||
|
in
|
||||||
|
_: use value;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
config = lib.mkIf oldOpt.isDefined {
|
||||||
|
warnings = [
|
||||||
|
"The option `${oldOpt}' defined in ${lib.showFiles oldOpt.files} has been replaced by `${opt.enable}' and `${opt.package}'."
|
||||||
|
];
|
||||||
|
|
||||||
|
dependencies.${packageName} = {
|
||||||
|
enable = configFromOldDef {
|
||||||
|
apply = pkg: pkg != null;
|
||||||
|
};
|
||||||
|
package = configFromOldDef {
|
||||||
|
predicate = pkg: pkg != null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,4 +47,48 @@
|
||||||
))
|
))
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Integration test for `lib.nixvim.deprecation.mkRemovedPackageOptionModule`
|
||||||
|
removed-package-options =
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
test = {
|
||||||
|
buildNixvim = false;
|
||||||
|
warnings = expect: [
|
||||||
|
(expect "count" 2)
|
||||||
|
|
||||||
|
(expect "any" "The option `plugins.chatgpt.curlPackage' defined in `")
|
||||||
|
(expect "any" "has been replaced by `dependencies.curl.enable' and `dependencies.curl.package'.")
|
||||||
|
|
||||||
|
(expect "any" "The option `plugins.glow.glowPackage' defined in `")
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
plugins.chatgpt.curlPackage = null;
|
||||||
|
plugins.glow.glowPackage = pkgs.hello;
|
||||||
|
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = !lib.elem pkgs.curl config.extraPackages;
|
||||||
|
message = "Expected curl not to be installed.";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = config.dependencies.glow.enable;
|
||||||
|
message = "Expected `dependencies.glow` to be enabled.";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = lib.elem pkgs.hello config.extraPackages;
|
||||||
|
message = "Expected hello to be installed.";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = !lib.elem pkgs.glow config.extraPackages;
|
||||||
|
message = "Expected glow not to be installed.";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue