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>
This commit is contained in:
Maximilian Bosch 2023-09-06 15:08:46 +02:00
parent 515794d98d
commit 039f73f134
No known key found for this signature in database
GPG Key ID: D006A998C6ABFDF1

View File

@ -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;