From 7b77035949bbd1934fe807734db37aedd905df32 Mon Sep 17 00:00:00 2001 From: Gabriel Arazas Date: Fri, 26 Jan 2024 17:39:12 +0800 Subject: [PATCH] flake-parts/setups/nixos: refactor --- modules/flake-parts/setups/nixos.nix | 162 ++++++++++++++------------- 1 file changed, 87 insertions(+), 75 deletions(-) diff --git a/modules/flake-parts/setups/nixos.nix b/modules/flake-parts/setups/nixos.nix index 8e24476e..fc427adc 100644 --- a/modules/flake-parts/setups/nixos.nix +++ b/modules/flake-parts/setups/nixos.nix @@ -329,12 +329,96 @@ let inputs.${config.homeManagerBranch}.nixosModules.home-manager ../../../configs/nixos/${name} + # Mapping the declarative home-manager users (if it has one) into NixOS + # users. + (lib.mkIf (config.homeManagerUsers.users != { }) + ( + let + setupConfig = config; + hasHomeManagerUsers = config.homeManagerUsers.users != { }; + inherit (config.homeManagerUsers) nixpkgsInstance; + isNixpkgs = state: hasHomeManagerUsers && nixpkgsInstance == state; + in + { config, lib, pkgs, ... }: { + config = lib.mkMerge [ + (lib.mkIf hasHomeManagerUsers { + users.users = + lib.mkMerge + (lib.mapAttrsToList + (name: hmUser: { ${name} = hmUser.userConfig; }) + setupConfig.homeManagerUsers.users); + + home-manager.users = lib.mkMerge + (lib.mapAttrsToList + (name: hmUser: { + ${name} = { lib, ... }: { + imports = + partsConfig.setups.home-manager.configs.${name}.modules + ++ hmUser.additionalModules; + }; + }) + setupConfig.homeManagerUsers.users); + }) + + (lib.mkIf (isNixpkgs "global") { + home-manager.useGlobalPkgs = lib.mkForce true; + + # Disable all options that are going to be blocked once + # `home-manager.useGlobalPkgs` is used. + home-manager.users = + lib.mkMerge + (lib.mapAttrsToList + (name: _: { + ${name} = { + nixpkgs.overlays = lib.mkForce null; + nixpkgs.config = lib.mkForce null; + }; + }) + setupConfig.homeManagerUsers.users); + + # Then apply all of the user overlays into the nixpkgs instance + # of the NixOS system. + nixpkgs.overlays = + let + hmUsersOverlays = + lib.mapAttrsToList + (name: _: + partsConfig.setups.home-manager.configs.${name}.overlays) + setupConfig.homeManagerUsers.users; + + overlays = lib.lists.flatten hmUsersOverlays; + in + # Most of the overlays are going to be imported from a + # variable anyways. This should massively reduce the step + # needed for nixpkgs to do its thing. + # + # Though, it becomes unpredictable due to the way how the + # overlay list is constructed. However, this is much more + # preferable than letting a massive list with duplicated + # overlays from different home-manager users to be applied. + lib.lists.unique overlays; + }) + + (lib.mkIf (isNixpkgs "separate") { + home-manager.useGlobalPkgs = lib.mkForce false; + home-manager.users = + lib.mkMerge + (lib.mapAttrsToList + (name: _: { + ${name} = { + nixpkgs.overlays = + partsConfig.setups.home-manager.configs.${name}.overlays; + }; + }) + setupConfig.homeManagerUsers.users); + }) + ]; + })) + + # Setting up the typical configuration. ( let setupConfig = config; - hasHomeManagerUsers = config.homeManagerUsers.users != { }; - inherit (config.homeManagerUsers) nixpkgsInstance; - isNixpkgs = state: hasHomeManagerUsers && nixpkgsInstance == state; in { config, lib, ... }: { config = lib.mkMerge [ @@ -346,78 +430,6 @@ let (lib.mkIf (setupConfig.domain != null) { networking.domain = lib.mkDefault setupConfig.domain; }) - - (lib.mkIf hasHomeManagerUsers { - users.users = - lib.mkMerge - (lib.mapAttrsToList - (name: hmUser: { ${name} = hmUser.userConfig; }) - setupConfig.homeManagerUsers.users); - - home-manager.users = lib.mkMerge - (lib.mapAttrsToList - (name: hmUser: { - ${name} = { lib, ... }: { - imports = - partsConfig.setups.home-manager.configs.${name}.modules - ++ hmUser.additionalModules; - }; - }) - setupConfig.homeManagerUsers.users); - }) - - (lib.mkIf (isNixpkgs "global") { - home-manager.useGlobalPkgs = lib.mkForce true; - - # Disable all options that are going to be blocked once - # `home-manager.useGlobalPkgs` is used. - home-manager.users = - lib.mkMerge - (lib.mapAttrsToList - (name: _: { - ${name} = { - nixpkgs.overlays = lib.mkForce null; - nixpkgs.config = lib.mkForce null; - }; - }) - setupConfig.homeManagerUsers.users); - - # Then apply all of the user overlays into the nixpkgs instance - # of the NixOS system. - nixpkgs.overlays = - let - hmUsersOverlays = - lib.mapAttrsToList - (name: _: - partsConfig.setups.home-manager.configs.${name}.overlays) - setupConfig.homeManagerUsers.users; - - overlays = lib.lists.flatten hmUsersOverlays; - in - # Most of the overlays are going to be imported from a - # variable anyways. This should massively reduce the step - # needed for nixpkgs to do its thing. - # - # Though, it becomes unpredictable due to the way how the - # overlay list is constructed. However, this is much more - # preferable than letting a massive list with duplicated - # overlays from different home-manager users to be applied. - lib.lists.unique overlays; - }) - - (lib.mkIf (isNixpkgs "separate") { - home-manager.useGlobalPkgs = lib.mkForce false; - home-manager.users = - lib.mkMerge - (lib.mapAttrsToList - (name: _: { - ${name} = { - nixpkgs.overlays = - partsConfig.setups.home-manager.configs.${name}.overlays; - }; - }) - setupConfig.homeManagerUsers.users); - }) ]; } )