diff --git a/nixos.nix b/nixos.nix index 307355b..cde560c 100644 --- a/nixos.nix +++ b/nixos.nix @@ -9,6 +9,7 @@ packages: let inherit (lib) lists + attrsets mkMerge mkIf mapAttrs @@ -231,25 +232,48 @@ in { useUserPackages = false; # prevent users.users entries from being added - users = mkMerge ( - foldlAttrs ( - acc: _: fid: - acc - ++ foldlAttrs ( - acc': _: app: - acc' - ++ [ - { - ${getsubname fid app.identity} = mkMerge [ - cfg.extraHomeConfig - app.extraConfig - { home.packages = app.packages; } - ]; - } - ] - ) [ { ${getsubname fid 0} = cfg.extraHomeConfig; } ] cfg.apps - ) [ privPackages ] cfg.users - ); + users = + mkMerge + (foldlAttrs + ( + acc: _: fid: + foldlAttrs + ( + acc: _: app: + ( + let + key = getsubname fid app.identity; + in + { + usernames = acc.usernames // { + ${key} = true; + }; + merge = acc.merge ++ [ + { + ${key} = mkMerge ( + [ + cfg.extraHomeConfig + { home.packages = app.packages; } + ] + ++ lib.optional (!attrsets.hasAttrByPath [ key ] acc.usernames) app.extraConfig + ); + } + ]; + } + ) + ) + { + inherit (acc) usernames; + merge = acc.merge ++ [ { ${getsubname fid 0} = cfg.extraHomeConfig; } ]; + } + cfg.apps + ) + { + usernames = { }; + merge = [ privPackages ]; + } + cfg.users + ).merge; }; users = diff --git a/test/configuration.nix b/test/configuration.nix index 0bee0b2..4bd1ea5 100644 --- a/test/configuration.nix +++ b/test/configuration.nix @@ -95,14 +95,23 @@ stateDir = "/var/lib/fortify"; users.alice = 0; - extraHomeConfig = { - home.stateVersion = "23.05"; - }; + extraHomeConfig = + { 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 = { "cat.gensokyo.extern.foot.noEnablements" = { name = "ne-foot"; identity = 1; + shareUid = true; verbose = true; share = pkgs.foot; packages = with pkgs; [ @@ -130,7 +139,8 @@ "cat.gensokyo.extern.Alacritty.x11" = { name = "x11-alacritty"; - identity = 3; + identity = 1; + shareUid = true; verbose = true; share = pkgs.alacritty; packages = with pkgs; [ diff --git a/test/test.py b/test/test.py index b912d6e..4b67b6f 100644 --- a/test/test.py +++ b/test/test.py @@ -206,9 +206,9 @@ machine.wait_until_fails("pgrep foot", timeout=5) # Test XWayland (foot does not support X): 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.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") check_state("x11-alacritty", 2) machine.send_chars("exit\n")