about summary refs log tree commit diff
path: root/flake.nix
diff options
context:
space:
mode:
authorMaximilian Bosch <maximilian@mbosch.me>2023-09-06 15:08:46 +0200
committerMaximilian Bosch <maximilian@mbosch.me>2023-12-09 11:45:44 +0100
commit039f73f134546e59ec6f1b56b4aff5b81d889f64 (patch)
tree271168d6933347ec2086e1207ada079a7724ba7d /flake.nix
parent515794d98d984d57ad781735127993b8c5043ebf (diff)
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.<system>.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 <git@sphalerite.org>
Diffstat (limited to 'flake.nix')
-rw-r--r--flake.nix28
1 files changed, 19 insertions, 9 deletions
diff --git a/flake.nix b/flake.nix
index fa00bffcdf92f..bf7480a6db2d1 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;