mirror of
https://github.com/nix-community/home-manager.git
synced 2026-01-11 17:39:37 +08:00
This change brings the homeConfigurations output inline with how the nixosConfiguration output presents its attributes. The primary purpose is for exposing the graph attribute however there is no downside to exposing the rest along with it to prevent needing to add each desired attribute individually in the future if more are added.
1.7 KiB
1.7 KiB
{
configuration,
pkgs,
lib ? pkgs.lib,
minimal ? false,
# Whether to check that each option has a matching declaration.
check ? true,
# Extra arguments passed to specialArgs.
extraSpecialArgs ? { },
}:
let
collectFailed = cfg: map (x: x.message) (lib.filter (x: !x.assertion) cfg.assertions);
showWarnings =
res:
let
f = w: x: builtins.trace "warning: ${w}" x;
in
lib.foldr f res res.config.warnings;
extendedLib = import ./lib/stdlib-extended.nix lib;
hmModules = import ./modules.nix {
inherit check pkgs;
lib = extendedLib;
};
rawModule = extendedLib.evalModules {
modules = [ configuration ] ++ hmModules;
class = "homeManager";
specialArgs = {
modulesPath = builtins.toString ./.;
}
// extraSpecialArgs;
};
moduleChecks =
raw:
showWarnings (
let
failed = collectFailed raw.config;
failedStr = lib.concatStringsSep "\n" (map (x: "- ${x}") failed);
in
if failed == [ ] then
raw
else
throw ''
Failed assertions:
${failedStr}''
);
withExtraAttrs =
rawModule:
let
module = moduleChecks rawModule;
in
module
// {
activationPackage = module.config.home.activationPackage;
# For backwards compatibility. Please use activationPackage instead.
activation-script = module.config.home.activationPackage;
newsDisplay = rawModule.config.news.display;
newsEntries = lib.sort (a: b: a.time > b.time) (
lib.filter (a: a.condition) rawModule.config.news.entries
);
inherit (module._module.args) pkgs;
extendModules = args: withExtraAttrs (rawModule.extendModules args);
};
in
withExtraAttrs rawModule
configuration,
pkgs,
lib ? pkgs.lib,
minimal ? false,
# Whether to check that each option has a matching declaration.
check ? true,
# Extra arguments passed to specialArgs.
extraSpecialArgs ? { },
}:
let
collectFailed = cfg: map (x: x.message) (lib.filter (x: !x.assertion) cfg.assertions);
showWarnings =
res:
let
f = w: x: builtins.trace "warning: ${w}" x;
in
lib.foldr f res res.config.warnings;
extendedLib = import ./lib/stdlib-extended.nix lib;
hmModules = import ./modules.nix {
inherit check pkgs;
lib = extendedLib;
};
rawModule = extendedLib.evalModules {
modules = [ configuration ] ++ hmModules;
class = "homeManager";
specialArgs = {
modulesPath = builtins.toString ./.;
}
// extraSpecialArgs;
};
moduleChecks =
raw:
showWarnings (
let
failed = collectFailed raw.config;
failedStr = lib.concatStringsSep "\n" (map (x: "- ${x}") failed);
in
if failed == [ ] then
raw
else
throw ''
Failed assertions:
${failedStr}''
);
withExtraAttrs =
rawModule:
let
module = moduleChecks rawModule;
in
module
// {
activationPackage = module.config.home.activationPackage;
# For backwards compatibility. Please use activationPackage instead.
activation-script = module.config.home.activationPackage;
newsDisplay = rawModule.config.news.display;
newsEntries = lib.sort (a: b: a.time > b.time) (
lib.filter (a: a.condition) rawModule.config.news.entries
);
inherit (module._module.args) pkgs;
extendModules = args: withExtraAttrs (rawModule.extendModules args);
};
in
withExtraAttrs rawModule