From 039f73f134546e59ec6f1b56b4aff5b81d889f64 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Wed, 6 Sep 2023 15:08:46 +0200 Subject: [PATCH] flake: fix `lib.trivial.version` when used from a flake A lot of fetchers from Nix's own `libfetchers` also provide the information that `lib.trivial` aims to expose with `version`/`versionSuffix`/`revision`. In fact you don't even need a `nixpkgs` channel to get a proper version suffix because of that! Unfortunately this isn't used currently. When using the nixpkgs flake, but not `nixpkgs.lib.nixosSystem` to build a NixOS configuration, the version will always be `YY.MMpre-git`. One example is e.g. `colmena` which evaluates configurations via `import (npkgs.path + "/nixos/lib/eval-config.nix")`. This patch ensures that the version suffix (i.e. the normalized last modified date + git revision) is correctly exposed in `lib.trivial`. Additionally, the change is injected into the following locations: * `lib`: with that, something like $ nix eval nixpkgs#lib.trivial.version 23.05.20230921.cf8bf79 is working fine (i.e. rather than `23.05pre-git`). * `legacyPackages` to make sure that e.g. `legacyPackages..nixos` has correct version info. This also applies to everything else using `pkgs.lib.trivial` for that purpose. * `overlays.default` which can be applied to a `nixpkgs` and changes the previous `pkgs.lib` from said `nixpkgs` to also contain the correct `version`/`revision`/etc.. This is useful for people using `nixpkgs` as flake input, but importing it manually with import inputs.nixpkgs { } Co-authored-by: Linus Heckemann --- flake.nix | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/flake.nix b/flake.nix index fa00bffcdf92..bf7480a6db2d 100644 --- a/flake.nix +++ b/flake.nix @@ -9,24 +9,31 @@ nixpkgs = self; }; - lib = import ./lib; + lib = (import ./lib).extend libVersionInfoOverlay; + + libVersionInfoOverlay = finalLib: prevLib: { + trivial = prevLib.trivial // { + versionSuffix = + ".${finalLib.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")}.${self.shortRev or "dirty"}"; + version = finalLib.trivial.release + finalLib.trivial.versionSuffix; + revisionWithDefault = default: self.rev or default; + }; + }; forAllSystems = lib.genAttrs lib.systems.flakeExposed; in { + overlays.setLibVersionInfo = final: prev: { + lib = prev.lib.extend libVersionInfoOverlay; + }; + lib = lib.extend (final: prev: { nixos = import ./nixos/lib { lib = final; }; nixosSystem = args: import ./nixos/lib/eval-config.nix ( - args // { - modules = args.modules ++ [{ - system.nixos.versionSuffix = - ".${final.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")}.${self.shortRev or "dirty"}"; - system.nixos.revision = final.mkIf (self ? rev) self.rev; - }]; - } // lib.optionalAttrs (! args?system) { + args // { inherit (self) lib; } // lib.optionalAttrs (! args?system) { # Allow system to be set modularly in nixpkgs.system. # We set it to null, to remove the "legacy" entrypoint's # non-hermetic default. @@ -53,7 +60,10 @@ # attribute it displays `omitted` instead of evaluating all packages, # which keeps `nix flake show` on Nixpkgs reasonably fast, though less # information rich. - legacyPackages = forAllSystems (system: import ./. { inherit system; }); + legacyPackages = forAllSystems (system: import ./. { + inherit system; + overlays = [ self.overlays.setLibVersionInfo ]; + }); nixosModules = { notDetected = ./nixos/modules/installer/scan/not-detected.nix;