diff --git a/flake.nix b/flake.nix
index a6828c98fb51..f16c5ea697ac 100644
--- a/flake.nix
+++ b/flake.nix
@@ -25,8 +25,9 @@
import ./nixos/lib/eval-config.nix (args // {
modules = modules ++
[ { system.nixos.versionSuffix =
- ".${lib.substring 0 8 self.lastModified}.${self.shortRev or "dirty"}";
+ ".${lib.substring 0 8 (self.lastModifiedDate or self.lastModified)}.${self.shortRev or "dirty"}";
system.nixos.revision = lib.mkIf (self ? rev) self.rev;
+ nix.registry.nixpkgs.flake = lib.mkDefault self;
}
];
});
diff --git a/nixos/modules/services/misc/nix-daemon.nix b/nixos/modules/services/misc/nix-daemon.nix
index 17c3582db0f6..8203cb13e506 100644
--- a/nixos/modules/services/misc/nix-daemon.nix
+++ b/nixos/modules/services/misc/nix-daemon.nix
@@ -376,6 +376,59 @@ in
If enabled (the default), checks that Nix can parse the generated nix.conf.
'';
};
+
+ registry = mkOption {
+ type = types.attrsOf (types.submodule (
+ let
+ inputAttrs = types.attrsOf (types.oneOf [types.str types.int types.bool types.package]);
+ in
+ { config, name, ... }:
+ { options = {
+ from = mkOption {
+ type = inputAttrs;
+ example = { type = "indirect"; id = "nixpkgs"; };
+ description = "The flake reference to be rewritten.";
+ };
+ to = mkOption {
+ type = inputAttrs;
+ example = { type = "github"; owner = "my-org"; repo = "my-nixpkgs"; };
+ description = "The flake reference to which is to be rewritten.";
+ };
+ flake = mkOption {
+ type = types.unspecified;
+ default = null;
+ example = literalExample "nixpkgs";
+ description = ''
+ The flake input to which is to be rewritten.
+ '';
+ };
+ exact = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether the reference needs to match exactly. If set,
+ a reference like nixpkgs does not
+ match with a reference like nixpkgs/nixos-20.03.
+ '';
+ };
+ };
+ config = {
+ from = mkDefault { type = "indirect"; id = name; };
+ to = mkIf (config.flake != null)
+ ({ type = "path";
+ path = config.flake.outPath;
+ } // lib.filterAttrs
+ (n: v: n == "lastModified" || n == "rev" || n == "revCount" || n == "narHash")
+ config.flake);
+ };
+ }
+ ));
+ default = {};
+ description = ''
+ A system-wide flake registry.
+ '';
+ };
+
};
};
@@ -390,6 +443,11 @@ in
environment.etc."nix/nix.conf".source = nixConf;
+ environment.etc."nix/registry.json".text = builtins.toJSON {
+ version = 2;
+ flakes = mapAttrsToList (n: v: { inherit (v) from to exact; }) cfg.registry;
+ };
+
# List of machines for distributed Nix builds in the format
# expected by build-remote.pl.
environment.etc."nix/machines" =
diff --git a/pkgs/top-level/make-tarball.nix b/pkgs/top-level/make-tarball.nix
index bb0d7bc54e78..6bb243879e9a 100644
--- a/pkgs/top-level/make-tarball.nix
+++ b/pkgs/top-level/make-tarball.nix
@@ -19,7 +19,7 @@ releaseTools.sourceTarball {
version = pkgs.lib.fileContents ../../.version;
versionSuffix = "pre${
if nixpkgs ? lastModified
- then builtins.substring 0 8 nixpkgs.lastModified
+ then builtins.substring 0 8 (nixpkgs.lastModifiedDate or nixpkgs.lastModified)
else toString nixpkgs.revCount}.${nixpkgs.shortRev or "dirty"}";
buildInputs = [ nix.out jq lib-tests pkgs.brotli ];