From 828e97775a6ab46eed51d4e6dc9e252dd71b4a8a Mon Sep 17 00:00:00 2001 From: DavHau Date: Mon, 9 Jun 2025 14:26:57 +0700 Subject: [PATCH] lib: mkOfflineFlakeLock init copied from the clan-core-flake module I plan to re-use this function to improve the clan test framework to allow cli execution --- lib/default.nix | 5 +++ lib/flakes.nix | 40 +++++++++++++++++++++++ pkgs/clan-core-flake/flake-module.nix | 46 ++++----------------------- 3 files changed, 52 insertions(+), 39 deletions(-) create mode 100644 lib/flakes.nix diff --git a/lib/default.nix b/lib/default.nix index 857a8d14b..34e5012d3 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -51,6 +51,11 @@ lib.fix (clanLib: { jsonschema = import ./jsonschema { inherit lib; }; facts = import ./facts.nix { inherit lib; }; + # flakes + flakes = clanLib.callLib ./flakes.nix { + clan-core = self; + }; + # deprecated # remove when https://git.clan.lol/clan/clan-core/pulls/3212 is implemented inherit (self.inputs.nix-select.lib) select; diff --git a/lib/flakes.nix b/lib/flakes.nix new file mode 100644 index 000000000..cf74ac17a --- /dev/null +++ b/lib/flakes.nix @@ -0,0 +1,40 @@ +{ + lib, + clan-core, + ... +}: +{ + # A flake lock for offline use. + # All flake inputs are locked to an existing store path + mkOfflineFlakeLock = + flakePath: + let + flakeLock = lib.importJSON (flakePath + "/flake.lock"); + flakeInputs = builtins.removeAttrs clan-core.inputs [ "self" ]; + inputsToPaths = + flakeLock: + flakeLock + // { + nodes = + flakeLock.nodes + // (lib.flip lib.mapAttrs flakeInputs ( + name: _: + # remove follows and let 'nix flake lock' re-compute it later + # (lib.removeAttrs flakeLock.nodes.${name} ["inputs"]) + flakeLock.nodes.${name} + // { + locked = { + inherit (flakeLock.nodes.${name}.locked) narHash; + lastModified = + # lol, nixpkgs has a different timestamp on the fs??? + if name == "nixpkgs" then 0 else 1; + path = "${clan-core.inputs.${name}}"; + type = "path"; + }; + } + )); + }; + lockAttrs = inputsToPaths flakeLock; + in + builtins.toFile "offline-flake.lock" (builtins.toJSON lockAttrs); +} diff --git a/pkgs/clan-core-flake/flake-module.nix b/pkgs/clan-core-flake/flake-module.nix index fc5007468..81f20e8d5 100644 --- a/pkgs/clan-core-flake/flake-module.nix +++ b/pkgs/clan-core-flake/flake-module.nix @@ -1,47 +1,15 @@ -{ self, inputs, ... }: +{ self, ... }: +let + inherit (self.clanLib.flakes) + mkOfflineFlakeLock + ; +in { perSystem = { - lib, pkgs, ... }: - let - # A flake lock for offline use. - # All flake inputs are locked to an existing store path - clanCoreLockFile = - clanCore: - let - flakeLock = lib.importJSON (clanCore + "/flake.lock"); - flakeInputs = builtins.removeAttrs inputs [ "self" ]; - flakeLockVendoredDeps = - flakeLock: - flakeLock - // { - nodes = - flakeLock.nodes - // (lib.flip lib.mapAttrs flakeInputs ( - name: _: - # remove follows and let 'nix flake lock' re-compute it later - # (lib.removeAttrs flakeLock.nodes.${name} ["inputs"]) - flakeLock.nodes.${name} - // { - locked = { - inherit (flakeLock.nodes.${name}.locked) narHash; - lastModified = - # lol, nixpkgs has a different timestamp on the fs??? - if name == "nixpkgs" then 0 else 1; - path = "${inputs.${name}}"; - type = "path"; - }; - } - )); - }; - clanCoreLock = flakeLockVendoredDeps flakeLock; - clanCoreLockFile = builtins.toFile "clan-core-flake.lock" (builtins.toJSON clanCoreLock); - in - clanCoreLockFile; - in { packages.clan-core-flake = let @@ -65,7 +33,7 @@ export NIX_STORE_DIR=$HOME cp -r ${clanCore} $out chmod +w -R $out - cp ${clanCoreLockFile clanCore} $out/flake.lock + cp ${mkOfflineFlakeLock clanCore} $out/flake.lock nix flake lock $out --extra-experimental-features 'nix-command flakes' clanCoreHash=$(nix hash path ${clanCore} --extra-experimental-features 'nix-command') '';