From 74e7ef35fee77139be31a3891033ff61496635f8 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 2 Apr 2020 18:01:45 +0200 Subject: [PATCH] nix-daemon.nix: Add option nix.registry This allows you to specify the system-wide flake registry. One use is to pin 'nixpkgs' to the Nixpkgs version used to build the system: nix.registry.nixpkgs.flake = nixpkgs; where 'nixpkgs' is a flake input. This ensures that commands like $ nix run nixpkgs#hello pull in a minimum of additional store paths. You can also use this to redirect flakes, e.g. nix.registry.nixpkgs.to = { type = "github"; owner = "my-org"; repo = "my-nixpkgs"; }; --- flake.nix | 3 +- nixos/modules/services/misc/nix-daemon.nix | 58 ++++++++++++++++++++++ pkgs/top-level/make-tarball.nix | 2 +- 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index a6828c98fb5..f16c5ea697a 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 17c3582db0f..8203cb13e50 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 bb0d7bc54e7..6bb243879e9 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 ];