mirror of
https://github.com/nix-community/home-manager.git
synced 2026-06-05 21:02:51 +00:00
Apply non-function stub attributes through overrideAttrs so derivation metadata and wrapper-facing fields remain visible to downstream consumers. Keep function-valued attributes like override on the outer attrset so they are not serialized into derivations and do not break unrelated tests.
138 lines
3.1 KiB
Nix
138 lines
3.1 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
inherit (lib) mkOption types;
|
|
|
|
stubType = types.submodule (
|
|
{ name, ... }:
|
|
{
|
|
options = {
|
|
name = mkOption {
|
|
type = types.str;
|
|
default = "dummy";
|
|
description = "The stub package name.";
|
|
};
|
|
|
|
outPath = mkOption {
|
|
type = types.nullOr types.str;
|
|
default = "@${name}@";
|
|
defaultText = lib.literalExpression ''"@''${name}@"'';
|
|
};
|
|
|
|
version = mkOption {
|
|
type = types.nullOr types.str;
|
|
default = null;
|
|
defaultText = lib.literalExpression "pkgs.\${name}.version or null";
|
|
};
|
|
|
|
buildScript = mkOption {
|
|
type = types.str;
|
|
default = defaultBuildScript;
|
|
};
|
|
|
|
extraAttrs = mkOption {
|
|
type = types.attrsOf types.anything;
|
|
default = { };
|
|
};
|
|
};
|
|
}
|
|
);
|
|
|
|
defaultBuildScript = "mkdir $out";
|
|
|
|
dummyPackage = pkgs.runCommandLocal "dummy" { meta.mainProgram = "dummy"; } defaultBuildScript;
|
|
|
|
mkStubPackage =
|
|
{
|
|
name ? "dummy",
|
|
outPath ? null,
|
|
version ? null,
|
|
buildScript ? defaultBuildScript,
|
|
extraAttrs ? { },
|
|
}:
|
|
let
|
|
pkg =
|
|
if name == "dummy" && buildScript == defaultBuildScript then
|
|
dummyPackage
|
|
else
|
|
pkgs.runCommandLocal name {
|
|
pname = name;
|
|
meta.mainProgram = name;
|
|
} buildScript;
|
|
|
|
drvExtraAttrs = lib.filterAttrs (_: v: !lib.isFunction v) extraAttrs;
|
|
|
|
outerExtraAttrs = lib.filterAttrs (_: lib.isFunction) extraAttrs;
|
|
|
|
overriddenPkg =
|
|
if drvExtraAttrs == { } then
|
|
pkg
|
|
else
|
|
pkg.overrideAttrs (old: lib.recursiveUpdate old drvExtraAttrs);
|
|
|
|
stubbedPkg =
|
|
overriddenPkg
|
|
// outerExtraAttrs
|
|
// lib.optionalAttrs (outPath != null) {
|
|
inherit outPath;
|
|
|
|
# Prevent getOutput from descending into outputs
|
|
outputSpecified = true;
|
|
|
|
# Allow the original package to be used in derivation inputs
|
|
__spliced = {
|
|
buildHost = overriddenPkg;
|
|
hostTarget = overriddenPkg;
|
|
};
|
|
}
|
|
// lib.optionalAttrs (version != null) { inherit version; };
|
|
in
|
|
stubbedPkg;
|
|
|
|
in
|
|
{
|
|
options.test = {
|
|
stubs = mkOption {
|
|
type = types.attrsOf stubType;
|
|
default = { };
|
|
description = "Package attributes that should be replaced by a stub package.";
|
|
};
|
|
|
|
stubOverlays = mkOption {
|
|
type = types.anything;
|
|
default = [ ];
|
|
internal = true;
|
|
};
|
|
|
|
unstubs = mkOption {
|
|
type = types.listOf types.anything;
|
|
default = [ ];
|
|
};
|
|
};
|
|
|
|
config = {
|
|
lib.test.mkStubPackage = mkStubPackage;
|
|
|
|
test.stubOverlays =
|
|
lib.optional (config.test.stubs != { }) (
|
|
_self: super:
|
|
lib.mapAttrs (
|
|
n: v:
|
|
builtins.traceVerbose "${n} - stubbed" (
|
|
mkStubPackage (
|
|
v
|
|
// lib.optionalAttrs (v.version == null) {
|
|
version = super.${n}.version or null;
|
|
}
|
|
)
|
|
)
|
|
) config.test.stubs
|
|
)
|
|
++ config.test.unstubs;
|
|
};
|
|
}
|