From e97e916521b2bbd3605350fe1a1e50dbbc8902b5 Mon Sep 17 00:00:00 2001 From: Pacman99 Date: Sat, 1 May 2021 17:46:30 -0700 Subject: [PATCH 1/5] lib: init generators section --- lib/generators.nix | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/generators.nix diff --git a/lib/generators.nix b/lib/generators.nix new file mode 100644 index 0000000..86f9d4d --- /dev/null +++ b/lib/generators.nix @@ -0,0 +1,46 @@ +{ lib }: +{ + mkHomeConfigurations = nixosConfigurations: + with lib; + let + mkHomes = host: config: + mapAttrs' (user: v: nameValuePair "${user}@${host}" v.home) + config.config.system.build.homes; + + hmConfigs = mapAttrs mkHomes nixosConfigurations; + + in + foldl recursiveUpdate { } (attrValues hmConfigs); + + mkDeployNodes = + /** + Synopsis: mkNodes _nixosConfigurations_ + + Generate the `nodes` attribute expected by deploy-rs + where _nixosConfigurations_ are `nodes`. + **/ + + deploy: lib.mapAttrs (_: config: { + hostname = config.config.networking.hostName; + + profiles.system = { + user = "root"; + path = deploy.lib.x86_64-linux.activate.nixos config; + }; + }); + + mkSuites = { suites, profiles }: + let + profileSet = lib.genAttrs' profiles (path: { + name = baseNameOf path; + value = lib.mkProfileAttrs (toString path); + }); + + definedSuites = suites profileSet; + + allProfiles = lib.collectProfiles profileSet; + in + lib.mapAttrs (_: v: lib.profileMap v) definedSuites // { + inherit allProfiles; + }; +} From c93e9fda0fada3e4a48f416d1f38c5a57852e492 Mon Sep 17 00:00:00 2001 From: Pacman99 Date: Sat, 1 May 2021 17:46:54 -0700 Subject: [PATCH 2/5] lib: init importers section --- lib/importers.nix | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 lib/importers.nix diff --git a/lib/importers.nix b/lib/importers.nix new file mode 100644 index 0000000..ea07373 --- /dev/null +++ b/lib/importers.nix @@ -0,0 +1,64 @@ +{ lib }: +let + recImport = { dir, _import ? base: import "${dir}/${base}.nix" }: + lib.mapFilterAttrs + (_: v: v != null) + (n: v: + if n != "default.nix" && lib.hasSuffix ".nix" n && v == "regular" + then + let name = lib.removeSuffix ".nix" n; in lib.nameValuePair (name) (_import name) + else + lib.nameValuePair ("") (null)) + (lib.safeReadDir dir); + + mkProfileAttrs = + /** + Synopsis: mkProfileAttrs _path_ + + Recursively collect the subdirs of _path_ containing a default.nix into attrs. + This sets a contract, eliminating ambiguity for _default.nix_ living under the + profile directory. + + Example: + let profiles = mkProfileAttrs ./profiles; in + assert profiles ? core.default; 0 + **/ + dir: + let + imports = + let + files = lib.safeReadDir dir; + + p = n: v: + v == "directory" + && n != "profiles"; + in + lib.filterAttrs p files; + + f = n: _: + lib.optionalAttrs + (lib.pathExists "${dir}/${n}/default.nix") + { default = "${dir}/${n}"; } + // mkProfileAttrs "${dir}/${n}"; + in + lib.mapAttrs f imports; + +in +{ + inherit recImport mkProfileAttrs; + + pathsIn = dir: + let + fullPath = name: "${toString dir}/${name}"; + in + map fullPath (lib.attrNames (lib.safeReadDir dir)); + + importHosts = dir: + recImport { + inherit dir; + _import = base: { + modules = import "${toString dir}/${base}.nix"; + }; + }; +} + From e837aaa8755d45028ba48b12bbac3231e86bf39b Mon Sep 17 00:00:00 2001 From: Pacman99 Date: Sat, 1 May 2021 17:47:43 -0700 Subject: [PATCH 3/5] lib: remove devos section --- lib/devos/default.nix | 30 ------------------- lib/devos/devosSystem.nix | 40 ------------------------- lib/devos/mkHosts.nix | 57 ------------------------------------ lib/devos/mkNodes.nix | 16 ---------- lib/devos/mkPackages.nix | 17 ----------- lib/devos/mkPkgs.nix | 25 ---------------- lib/devos/mkProfileAttrs.nix | 35 ---------------------- lib/devos/mkSuites.nix | 20 ------------- lib/devos/recImport.nix | 12 -------- 9 files changed, 252 deletions(-) delete mode 100644 lib/devos/default.nix delete mode 100644 lib/devos/devosSystem.nix delete mode 100644 lib/devos/mkHosts.nix delete mode 100644 lib/devos/mkNodes.nix delete mode 100644 lib/devos/mkPackages.nix delete mode 100644 lib/devos/mkPkgs.nix delete mode 100644 lib/devos/mkProfileAttrs.nix delete mode 100644 lib/devos/mkSuites.nix delete mode 100644 lib/devos/recImport.nix diff --git a/lib/devos/default.nix b/lib/devos/default.nix deleted file mode 100644 index 9a3118f..0000000 --- a/lib/devos/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ lib, utils }: -{ - # pkgImport :: Nixpkgs -> Overlays -> System -> Pkgs - pkgImport = nixpkgs: overlays: system: - import nixpkgs { - inherit system overlays; - config = { allowUnfree = true; }; - }; - - profileMap = list: map (profile: profile.default) (lib.flatten list); - - mkNodes = import ./mkNodes.nix { inherit lib; }; - - mkHosts = import ./mkHosts.nix { inherit lib; }; - - mkSuites = import ./mkSuites.nix { inherit lib; }; - - mkProfileAttrs = import ./mkProfileAttrs.nix { inherit lib; }; - - mkPkgs = import ./mkPkgs.nix { inherit lib utils; }; - - recImport = import ./recImport.nix { inherit lib; }; - - devosSystem = import ./devosSystem.nix { inherit lib; }; - - mkHomeConfigurations = import ./mkHomeConfigurations.nix { inherit lib; }; - - mkPackages = import ./mkPackages.nix { inherit lib; }; -} - diff --git a/lib/devos/devosSystem.nix b/lib/devos/devosSystem.nix deleted file mode 100644 index c48f68a..0000000 --- a/lib/devos/devosSystem.nix +++ /dev/null @@ -1,40 +0,0 @@ -{ lib }: - -# dependencies to return a builder -{ self, inputs }: - -{ modules, specialArgs, ... } @ args: -let inherit (specialArgs.channel.input.lib) nixosSystem; in -nixosSystem - (args // { - modules = - let - fullHostConfig = (nixosSystem (args // { inherit modules; })).config; - - isoConfig = (nixosSystem - (args // { - modules = modules ++ [ - (lib.modules.iso { inherit self inputs fullHostConfig; }) - ]; - })).config; - - hmConfig = (nixosSystem - (args // { - modules = modules ++ [ - (lib.modules.hmConfig) - ]; - })).config; - in - modules ++ [{ - system.build = { - iso = isoConfig.system.build.isoImage; - homes = hmConfig.home-manager.users; - }; - lib = { - inherit specialArgs; - testModule = { - imports = modules; - }; - }; - }]; - }) diff --git a/lib/devos/mkHosts.nix b/lib/devos/mkHosts.nix deleted file mode 100644 index 2fe4ed3..0000000 --- a/lib/devos/mkHosts.nix +++ /dev/null @@ -1,57 +0,0 @@ -{ lib }: - -{ self, nixos, inputs, dir, extern, suites, overrides, multiPkgs }: -let - defaultSystem = "x86_64-linux"; - - modules = with lib.modules; { - modOverrides = modOverrides { inherit overrides; }; - hmDefaults = hmDefaults { - inherit extern; - inherit (self) homeModules; - userSuites = suites.user; - }; - globalDefaults = globalDefaults { - inherit self nixos inputs multiPkgs; - }; - cachix = cachix { inherit self; }; - flakeModules = flakeModules { inherit self extern; }; - }; - - specialArgs = extern.specialArgs // { suites = suites.system; }; - - mkHostConfig = hostName: - let - local = { - require = [ - "${dir}/${hostName}.nix" - ]; - - networking = { inherit hostName; }; - - _module.args = { - self = self; - hosts = builtins.mapAttrs (_: host: host.config) - (removeAttrs hosts [ hostName ]); - }; - - lib = { inherit specialArgs; }; - lib.testModule = { - imports = builtins.attrValues modules; - }; - - }; - in - lib.os.devosSystem { - inherit self nixos inputs specialArgs; - system = defaultSystem; - modules = modules // { inherit local; }; - }; - - hosts = lib.os.recImport - { - inherit dir; - _import = mkHostConfig; - }; -in -hosts diff --git a/lib/devos/mkNodes.nix b/lib/devos/mkNodes.nix deleted file mode 100644 index 83906ce..0000000 --- a/lib/devos/mkNodes.nix +++ /dev/null @@ -1,16 +0,0 @@ -{ lib }: - -/** - Synopsis: mkNodes _nixosConfigurations_ - - Generate the `nodes` attribute expected by deploy-rs - where _nixosConfigurations_ are `nodes`. - **/ -deploy: lib.mapAttrs (_: config: { - hostname = config.config.networking.hostName; - - profiles.system = { - user = "root"; - path = deploy.lib.x86_64-linux.activate.nixos config; - }; -}) diff --git a/lib/devos/mkPackages.nix b/lib/devos/mkPackages.nix deleted file mode 100644 index d899268..0000000 --- a/lib/devos/mkPackages.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ lib }: - -{ overlay, overlays, pkgs }: -let - packagesNames = lib.attrNames (overlay null null) - ++ lib.attrNames (lib.concatAttrs - (lib.attrValues - (lib.mapAttrs (_: v: v null null) overlays) - ) - ); -in -lib.fold - (key: sum: lib.recursiveUpdate sum { - ${key} = pkgs.${key}; - }) -{ } - packagesNames diff --git a/lib/devos/mkPkgs.nix b/lib/devos/mkPkgs.nix deleted file mode 100644 index a7cf236..0000000 --- a/lib/devos/mkPkgs.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ lib, utils }: - -{ self, nixos, inputs, extern, overrides }: -(utils.lib.eachDefaultSystem - (system: - let - overridePkgs = lib.os.pkgImport inputs.override [ ] system; - overridesOverlay = overrides.packages; - - overlays = [ - (final: prev: { - lib = prev.lib.extend (lfinal: lprev: { - inherit lib; - inherit (lib) nixosSystem; - }); - }) - (overridesOverlay overridePkgs) - self.overlay - ] - ++ extern.overlays - ++ (lib.attrValues self.overlays); - in - { pkgs = lib.os.pkgImport nixos overlays system; } - ) -).pkgs diff --git a/lib/devos/mkProfileAttrs.nix b/lib/devos/mkProfileAttrs.nix deleted file mode 100644 index cdfc32e..0000000 --- a/lib/devos/mkProfileAttrs.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ lib }: - -let mkProfileAttrs = - /** - Synopsis: mkProfileAttrs _path_ - - Recursively collect the subdirs of _path_ containing a default.nix into attrs. - This sets a contract, eliminating ambiguity for _default.nix_ living under the - profile directory. - - Example: - let profiles = mkProfileAttrs ./profiles; in - assert profiles ? core.default; 0 - **/ - dir: - let - imports = - let - files = lib.safeReadDir dir; - - p = n: v: - v == "directory" - && n != "profiles"; - in - lib.filterAttrs p files; - - f = n: _: - lib.optionalAttrs - (lib.pathExists "${dir}/${n}/default.nix") - { default = "${dir}/${n}"; } - // mkProfileAttrs "${dir}/${n}"; - in - lib.mapAttrs f imports; -in mkProfileAttrs - diff --git a/lib/devos/mkSuites.nix b/lib/devos/mkSuites.nix deleted file mode 100644 index 45d8a10..0000000 --- a/lib/devos/mkSuites.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ lib }: - -{ suites, profiles } @ args: -let - inherit (lib) os; - - profileSet = lib.genAttrs' profiles (path: { - name = baseNameOf path; - value = os.mkProfileAttrs (toString path); - }); - - definedSuites = suites profileSet; - - allProfiles = lib.collectProfiles profileSet; -in -lib.mapAttrs (_: v: os.profileMap v) definedSuites // { - inherit allProfiles; -} - - diff --git a/lib/devos/recImport.nix b/lib/devos/recImport.nix deleted file mode 100644 index c96c935..0000000 --- a/lib/devos/recImport.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ lib }: - -{ dir, _import ? base: import "${dir}/${base}.nix" }: -lib.mapFilterAttrs - (_: v: v != null) - (n: v: - if n != "default.nix" && lib.hasSuffix ".nix" n && v == "regular" - then - let name = lib.removeSuffix ".nix" n; in lib.nameValuePair (name) (_import name) - else - lib.nameValuePair ("") (null)) - (lib.safeReadDir dir) From 496348b8afa4fea898d5c21147d56b9314c11a25 Mon Sep 17 00:00:00 2001 From: Pacman99 Date: Sun, 2 May 2021 01:12:29 -0700 Subject: [PATCH 4/5] lib: update namespaces and cleanup exports --- lib/flake.nix | 54 +++++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/lib/flake.nix b/lib/flake.nix index 2513311..fba02a8 100644 --- a/lib/flake.nix +++ b/lib/flake.nix @@ -10,31 +10,23 @@ outputs = inputs@{ self, nixpkgs, deploy, devshell, utils, ... }: let - lib = nixpkgs.lib.makeExtensible (self: - let - attrs = import ./attrs.nix { lib = nixpkgs.lib // self; }; - lists = import ./lists.nix { lib = nixpkgs.lib // self; }; - strings = import ./strings.nix { lib = nixpkgs.lib // self; }; - modules = import ./modules.nix { lib = nixpkgs.lib // self; }; - in - - utils.lib - - // - - { - os = import ./devos { - lib = nixpkgs.lib // self; - inherit utils; - }; + let combinedLib = nixpkgs.lib // self; in + with self; + utils.lib // { + attrs = import ./attrs.nix { lib = combinedLib; }; + lists = import ./lists.nix { lib = combinedLib; }; + strings = import ./strings.nix { lib = combinedLib; }; + modules = import ./modules.nix { lib = combinedLib; }; + importers = import ./importers.nix { lib = combinedLib; }; + generators = import ./generators.nix { lib = combinedLib; }; mkFlake = { __functor = import ./mkFlake { - lib = nixpkgs.lib // self; + lib = combinedLib; inherit deploy; }; - evalArgs = import ./mkFlake/evalArgs.nix { lib = nixpkgs.lib // self; }; + evalArgs = import ./mkFlake/evalArgs.nix { lib = combinedLib; }; }; pkgs-lib = import ./pkgs-lib { @@ -42,28 +34,26 @@ inherit deploy devshell; }; - inherit (attrs) - mapFilterAttrs - genAttrs' - safeReadDir - pathsToImportedAttrs - concatAttrs - filterPackages - importHosts; - inherit (lists) pathsIn collectProfiles unifyOverlays; + inherit (attrs) mapFilterAttrs genAttrs' safeReadDir concatAttrs; + inherit (lists) profileMap collectProfiles unifyOverlays; inherit (strings) rgxToString; - inherit modules; + inherit (importers) mkProfileAttrs pathsIn importHosts; + inherit (generators) mkSuites mkDeployNodes mkHomeConfigurations; } ); in { - lib = utils.lib // { + lib = with lib; utils.lib // { + inherit attrs lists modules importers generators; inherit (lib) - mkFlake pathsIn importHosts; + mkFlake + pathsIn + importHosts + mkDeployNodes + mkHomeConfigurations; }; - } // From 197d7929464757dbfcbbacbc1aef0586e9e20add Mon Sep 17 00:00:00 2001 From: Pacman99 Date: Sat, 1 May 2021 17:49:04 -0700 Subject: [PATCH 5/5] update to new lib format --- flake.lock | 2 +- lib/attrs.nix | 35 ----------------------------------- lib/lists.nix | 20 +++++++++----------- lib/mkFlake/default.nix | 7 +++---- lib/mkFlake/evalArgs.nix | 4 +--- lib/tests/lib.nix | 21 +-------------------- 6 files changed, 15 insertions(+), 74 deletions(-) diff --git a/flake.lock b/flake.lock index 484e301..795e0de 100644 --- a/flake.lock +++ b/flake.lock @@ -79,7 +79,7 @@ "utils": "utils_2" }, "locked": { - "narHash": "sha256-oTiKYoR210VwjomzfSn/pCJ3immdUDRUPbYTDGaPFn8=", + "narHash": "sha256-9JsKDtgLSmAkcaKRD4Ycttip1jpO9dVVaRwclWH0V8E=", "path": "./lib", "type": "path" }, diff --git a/lib/attrs.nix b/lib/attrs.nix index 93f7958..1061c0e 100644 --- a/lib/attrs.nix +++ b/lib/attrs.nix @@ -12,43 +12,8 @@ rec { # Generate an attribute set by mapping a function over a list of values. genAttrs' = values: f: lib.listToAttrs (map f values); - # Convert a list of file paths to attribute set where - # the key is the folder or filename stripped of nix - # extension and imported content of the file as value. - # - pathsToImportedAttrs = paths: - let - paths' = lib.filter - (path: lib.hasSuffix ".nix" path - || lib.pathExists "${path}/default.nix") - paths; - in - genAttrs' paths' (path: { - name = lib.removeSuffix ".nix" - # Safe as long this is just used as a name - (builtins.unsafeDiscardStringContext (baseNameOf path)); - value = import path; - }); - - importHosts = dir: - lib.os.recImport { - inherit dir; - _import = base: { - modules = import "${toString dir}/${base}.nix"; - }; - }; - concatAttrs = lib.fold (attr: sum: lib.recursiveUpdate sum attr) { }; - # Filter out packages that support given system and follow flake check requirements - filterPackages = system: packages: - let - # Everything that nix flake check requires for the packages output - filter = (n: v: with v; let platforms = meta.hydraPlatforms or meta.platforms or [ ]; in - lib.isDerivation v && !meta.broken && builtins.elem system platforms); - in - lib.filterAttrs filter packages; - safeReadDir = path: lib.optionalAttrs (builtins.pathExists (toString path)) (builtins.readDir (toString path)); } diff --git a/lib/lists.nix b/lib/lists.nix index 5e9c57b..4bef865 100644 --- a/lib/lists.nix +++ b/lib/lists.nix @@ -3,19 +3,17 @@ collectProfiles = set: let collectNestedProfiles = set: - lib.mapAttrsToList (n: v: - if builtins.isAttrs v then - [ v.default or null ] ++ collectNestedProfiles v - else null - ) set; + lib.mapAttrsToList + (n: v: + if builtins.isAttrs v then + [ v.default or null ] ++ collectNestedProfiles v + else null + ) + set; in - builtins.filter (x: x != null) (lib.flatten (collectNestedProfiles set)); + builtins.filter (x: x != null) (lib.flatten (collectNestedProfiles set)); - pathsIn = dir: - let - fullPath = name: "${toString dir}/${name}"; - in - map fullPath (lib.attrNames (lib.safeReadDir dir)); + profileMap = list: map (profile: profile.default) (lib.flatten list); unifyOverlays = channels: map (o: if builtins.isFunction (o null null) then o channels else o); } diff --git a/lib/mkFlake/default.nix b/lib/mkFlake/default.nix index ed99db0..5bd6419 100644 --- a/lib/mkFlake/default.nix +++ b/lib/mkFlake/default.nix @@ -1,6 +1,5 @@ { lib, deploy }: let - inherit (lib) os; inherit (builtins) mapAttrs attrNames attrValues head isFunction; in @@ -66,16 +65,16 @@ lib.systemFlake (lib.mergeAny modules = cfg.nixos.hostDefaults.externalModules ++ defaultModules; builder = args: args.specialArgs.channel.input.lib.nixosSystem (lib.mergeAny args { # So modules and functions can create their own version of the build - modules = [ { lib.builderArgs = args; } ]; + modules = [{ lib.builderArgs = args; }]; }); }; nixosModules = lib.exporter.modulesFromList cfg.nixos.hostDefaults.modules; homeModules = lib.exporter.modulesFromList cfg.home.modules; - homeConfigurations = os.mkHomeConfigurations self.nixosConfigurations; + homeConfigurations = lib.mkHomeConfigurations self.nixosConfigurations; - deploy.nodes = os.mkNodes deploy self.nixosConfigurations; + deploy.nodes = lib.mkDeployNodes deploy self.nixosConfigurations; overlays = lib.exporter.overlaysFromChannelsExporter { # since we can't detect overlays owned by self diff --git a/lib/mkFlake/evalArgs.nix b/lib/mkFlake/evalArgs.nix index ee42e22..bf36627 100644 --- a/lib/mkFlake/evalArgs.nix +++ b/lib/mkFlake/evalArgs.nix @@ -4,8 +4,6 @@ let argOpts = with lib; { config, ... }: let - inherit (lib) os; - cfg = config; inherit (config) self; @@ -188,7 +186,7 @@ let suites = mkOption { type = pathTo (functionTo attrs); default = _: { }; - apply = suites: os.mkSuites { + apply = suites: lib.mkSuites { inherit suites; inherit (config) profiles; }; diff --git a/lib/tests/lib.nix b/lib/tests/lib.nix index e992df6..78536e7 100644 --- a/lib/tests/lib.nix +++ b/lib/tests/lib.nix @@ -37,25 +37,6 @@ lib.runTests { ]; }; - testPathsToImportedAttrs = { - expr = - pathsToImportedAttrs [ - (toString ./testPathsToImportedAttrs/dir) - ./testPathsToImportedAttrs/foo.nix - ./testPathsToImportedAttrs/bar.nix - ./testPathsToImportedAttrs/t.nix - ./testPathsToImportedAttrs/f.nix - ]; - - expected = { - dir = { a = 5; }; - foo = { bar = 1; }; - bar = { foo = 2; }; - t = true; - f = false; - }; - }; - testRgxToString = lib.testAllTrue [ (rgxToString ".+x" "vxk" == "vx") (rgxToString "^fo" "foo" == "fo") @@ -72,7 +53,7 @@ lib.runTests { }; testSuites = { - expr = os.mkSuites { + expr = mkSuites { suites = { profiles, ... }: with profiles; { bar = [ foo ]; };