nix: deduplicate home-manager merging
All checks were successful
Test / Create distribution (push) Successful in 44s
Test / Sandbox (push) Successful in 55s
Test / Sandbox (race detector) (push) Successful in 53s
Test / Fortify (race detector) (push) Successful in 50s
Test / Fpkg (push) Successful in 54s
Test / Fortify (push) Successful in 2m8s
Test / Flake checks (push) Successful in 1m7s

This becomes a problem when extraHomeConfig defines nixos module options.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
Ophestra 2025-06-07 04:29:32 +09:00
parent 9a7c81a44e
commit bf5772bd8a
Signed by: cat
SSH Key Fingerprint: SHA256:gQ67O0enBZ7UdZypgtspB2FDM1g3GVw8nX0XSdcFw8Q
3 changed files with 59 additions and 25 deletions

View File

@ -9,6 +9,7 @@ packages:
let let
inherit (lib) inherit (lib)
lists lists
attrsets
mkMerge mkMerge
mkIf mkIf
mapAttrs mapAttrs
@ -231,25 +232,48 @@ in
{ {
useUserPackages = false; # prevent users.users entries from being added useUserPackages = false; # prevent users.users entries from being added
users = mkMerge ( users =
foldlAttrs ( mkMerge
(foldlAttrs
(
acc: _: fid: acc: _: fid:
acc foldlAttrs
++ foldlAttrs ( (
acc': _: app: acc: _: app:
acc' (
++ [ let
key = getsubname fid app.identity;
in
{ {
${getsubname fid app.identity} = mkMerge [ usernames = acc.usernames // {
cfg.extraHomeConfig ${key} = true;
};
merge = acc.merge ++ [
{
${key} = mkMerge (
[
app.extraConfig app.extraConfig
{ home.packages = app.packages; } { home.packages = app.packages; }
]
++ lib.optional (!attrsets.hasAttrByPath [ key ] acc.usernames) cfg.extraHomeConfig
);
}
]; ];
} }
] )
) [ { ${getsubname fid 0} = cfg.extraHomeConfig; } ] cfg.apps )
) [ privPackages ] cfg.users {
); inherit (acc) usernames;
merge = acc.merge ++ [ { ${getsubname fid 0} = cfg.extraHomeConfig; } ];
}
cfg.apps
)
{
usernames = { };
merge = [ privPackages ];
}
cfg.users
).merge;
}; };
users = users =

View File

@ -95,14 +95,23 @@
stateDir = "/var/lib/fortify"; stateDir = "/var/lib/fortify";
users.alice = 0; users.alice = 0;
extraHomeConfig = { extraHomeConfig =
home.stateVersion = "23.05"; { config, ... }:
{
# To test merge deduplication:
options._fortify.stateVersion = lib.mkOption { type = lib.types.str; };
config = {
home = { inherit (config._fortify) stateVersion; };
_fortify.stateVersion = "23.05";
};
}; };
apps = { apps = {
"cat.gensokyo.extern.foot.noEnablements" = { "cat.gensokyo.extern.foot.noEnablements" = {
name = "ne-foot"; name = "ne-foot";
identity = 1; identity = 1;
shareUid = true;
verbose = true; verbose = true;
share = pkgs.foot; share = pkgs.foot;
packages = with pkgs; [ packages = with pkgs; [
@ -130,7 +139,8 @@
"cat.gensokyo.extern.Alacritty.x11" = { "cat.gensokyo.extern.Alacritty.x11" = {
name = "x11-alacritty"; name = "x11-alacritty";
identity = 3; identity = 1;
shareUid = true;
verbose = true; verbose = true;
share = pkgs.alacritty; share = pkgs.alacritty;
packages = with pkgs; [ packages = with pkgs; [

View File

@ -206,9 +206,9 @@ machine.wait_until_fails("pgrep foot", timeout=5)
# Test XWayland (foot does not support X): # Test XWayland (foot does not support X):
swaymsg("exec x11-alacritty") swaymsg("exec x11-alacritty")
wait_for_window(f"u0_a{aid(2)}@machine") wait_for_window(f"u0_a{aid(0)}@machine")
machine.send_chars("clear; glinfo && touch /tmp/x11-ok\n") machine.send_chars("clear; glinfo && touch /tmp/x11-ok\n")
machine.wait_for_file(tmpdir_path(2, "x11-ok"), timeout=15) machine.wait_for_file(tmpdir_path(0, "x11-ok"), timeout=15)
collect_state_ui("alacritty_x11") collect_state_ui("alacritty_x11")
check_state("x11-alacritty", 2) check_state("x11-alacritty", 2)
machine.send_chars("exit\n") machine.send_chars("exit\n")