diff --git a/default.nix b/default.nix index 65526ab38..1703a7999 100644 --- a/default.nix +++ b/default.nix @@ -1,7 +1,9 @@ +{ nurpkgs ? import {} # For nixpkgs dependencies used by NUR itself + # Dependencies to call NUR repos with +, pkgs ? null }: -{ pkgs ? import {} }: let - inherit (pkgs) fetchgit fetchzip callPackages lib; + inherit (nurpkgs) fetchgit fetchzip lib; manifest = (builtins.fromJSON (builtins.readFile ./repos.json)).repos; lockedRevisions = (builtins.fromJSON (builtins.readFile ./repos.json.lock)).repos; @@ -40,9 +42,12 @@ let fetchSubmodules = submodules; }; - expressionPath = name: attr: (repoSource name attr) + "/" + (attr.file or ""); + createRepo = name: attr: import ./lib/evalRepo.nix { + inherit name pkgs lib; + inherit (attr) url; + src = repoSource name attr + "/" + (attr.file or ""); + }; - createRepo = (name: attr: callPackages (expressionPath name attr) {}); in { repos = lib.mapAttrs createRepo manifest; repo-sources = lib.mapAttrs repoSource manifest; diff --git a/lib/evalRepo.nix b/lib/evalRepo.nix new file mode 100644 index 000000000..b7383c249 --- /dev/null +++ b/lib/evalRepo.nix @@ -0,0 +1,34 @@ +{ name +, url +, src +, pkgs # Do not use this for anything other than passing it along as an argument to the repository +, lib +}: +let + + prettyName = "${name}"; + + # Arguments passed to each repositories default.nix + passedArgs = { + pkgs = if pkgs != null then pkgs else throw '' + NUR import call didn't receive a pkgs argument, but the evaluation of NUR's ${prettyName} repository requires it. + + This is either because + - You're trying to use a package from that repository, but didn't pass a `pkgs` argument to the NUR import. + In that case, refer to the installation instructions at https://github.com/nix-community/nur#installation on how to properly import NUR + + - You're trying to use a module/overlay from that repository, but it didn't properly declare their module. + In that case, inform the maintainer of the repository: ${url} + ''; + }; + + expr = import src; + args = builtins.functionArgs expr; + # True if not all arguments are either passed by default (e.g. pkgs) or defaulted (e.g. foo ? 10) + usesCallPackage = ! lib.all (arg: lib.elem arg (lib.attrNames passedArgs) || args.${arg}) (lib.attrNames args); + +in if usesCallPackage then lib.warn '' + NUR repository ${prettyName} is using the deprecated callPackage syntax which + might result in infinite recursion when used with NixOS modules. + '' (passedArgs.pkgs.callPackages src {}) + else expr (builtins.intersectAttrs args passedArgs)