diff --git a/nixos.nix b/nixos.nix index 307355b..9add1a0 100644 --- a/nixos.nix +++ b/nixos.nix @@ -9,6 +9,7 @@ packages: let inherit (lib) lists + attrsets mkMerge mkIf mapAttrs @@ -238,15 +239,22 @@ in ++ foldlAttrs ( acc': _: app: acc' - ++ [ - { - ${getsubname fid app.identity} = mkMerge [ - cfg.extraHomeConfig - app.extraConfig - { home.packages = app.packages; } - ]; - } - ] + ++ ( + let + key = getsubname fid app.identity; + in + [ + { + ${key} = mkMerge ( + [ + cfg.extraHomeConfig + { home.packages = app.packages; } + ] + ++ (if (attrsets.hasAttrByPath [ key ] acc) then (if !app.shareUid then throw "unexpected username collision" else [ ]) else [ app.extraConfig ]) + ); + } + ] + ) ) [ { ${getsubname fid 0} = cfg.extraHomeConfig; } ] cfg.apps ) [ privPackages ] cfg.users ); diff --git a/test/configuration.nix b/test/configuration.nix index 0bee0b2..f530cb7 100644 --- a/test/configuration.nix +++ b/test/configuration.nix @@ -96,13 +96,19 @@ users.alice = 0; extraHomeConfig = { - home.stateVersion = "23.05"; + # To test merge deduplication: + options._fortify.noop = lib.mkEnableOption "nothing"; + + config = { + home.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 +136,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")