modules/dependencies: add packageFallback option

This commit is contained in:
sglre6355 2026-01-29 22:00:27 +00:00 committed by Matt Sturgeon
parent d354487c46
commit 6acc964664
2 changed files with 73 additions and 5 deletions

View file

@ -30,6 +30,16 @@ let
// lib.optionalAttrs (literalExpressionType.check properties.example) {
inherit (properties) example;
};
packageFallback = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
When enabled, the ${name} package will be added to the end of the `PATH` _(suffix)_ instead of the beginning _(prefix)_.
This can be useful if you want local versions (e.g. from a devshell) to override the Nixvim version.
'';
};
};
# Motivation:
@ -49,6 +59,17 @@ let
merge = lib.options.mergeEqualOption;
check = v: v ? _type && (v._type == "literalExpression" || v._type == "literalMD");
};
enabledPackages = lib.pipe cfg [
builtins.attrValues
(lib.filter (p: p.enable))
(lib.partition (p: p.packageFallback))
(lib.mapAttrs (_: map (p: p.package)))
(parts: {
prefix = parts.wrong;
suffix = parts.right;
})
];
in
{
options = {
@ -94,11 +115,8 @@ in
};
config = {
extraPackages = lib.pipe cfg [
builtins.attrValues
(builtins.filter (p: p.enable))
(map (p: p.package))
];
extraPackages = enabledPackages.prefix;
extraPackagesAfter = enabledPackages.suffix;
__depPackages = {
bat.default = "bat";

View file

@ -70,6 +70,56 @@ in
];
};
package-fallback-false =
{
lib,
pkgs,
config,
...
}:
{
dependencies.git = {
enable = true;
packageFallback = false;
};
assertions = [
{
assertion = lib.elem pkgs.git config.extraPackages;
message = "Expected git to be in extraPackages.";
}
{
assertion = !lib.elem pkgs.git config.extraPackagesAfter;
message = "Expected git not to be in extraPackagesAfter.";
}
];
};
package-fallback-true =
{
lib,
pkgs,
config,
...
}:
{
dependencies.git = {
enable = true;
packageFallback = true;
};
assertions = [
{
assertion = !lib.elem pkgs.git config.extraPackages;
message = "Expected git not to be in extraPackages.";
}
{
assertion = lib.elem pkgs.git config.extraPackagesAfter;
message = "Expected git to be in extraPackagesAfter.";
}
];
};
# Integration test for `lib.nixvim.deprecation.mkRemovedPackageOptionModule`
removed-package-options =
{