From 3b13bd5c841fc77b92d2c627001414f839d57514 Mon Sep 17 00:00:00 2001 From: adisbladis Date: Sat, 25 Nov 2023 11:56:52 +1300 Subject: [PATCH] stdenv: Avoid some list allocations in check-meta when checking licenses --- pkgs/stdenv/generic/check-meta.nix | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/pkgs/stdenv/generic/check-meta.nix b/pkgs/stdenv/generic/check-meta.nix index f2d9233b6fdd..0bcdf69773f8 100644 --- a/pkgs/stdenv/generic/check-meta.nix +++ b/pkgs/stdenv/generic/check-meta.nix @@ -22,11 +22,15 @@ let optionals remove unknownModule + isAttrs + isString ; inherit (lib.lists) any toList + isList + elem ; # If we're in hydra, we can dispense with the more verbose error @@ -59,11 +63,15 @@ let hasLicense = attrs: attrs ? meta.license; - hasAllowlistedLicense = assert areLicenseListsValid; attrs: - hasLicense attrs && any (l: builtins.elem l allowlist) (toList attrs.meta.license); + hasListedLicense = assert areLicenseListsValid; list: attrs: + length list > 0 && hasLicense attrs && ( + if isList attrs.meta.license then any (l: elem l list) attrs.meta.license + else elem attrs.meta.license list + ); - hasBlocklistedLicense = assert areLicenseListsValid; attrs: - hasLicense attrs && any (l: builtins.elem l blocklist) (toList attrs.meta.license); + hasAllowlistedLicense = attrs: hasListedLicense allowlist attrs; + + hasBlocklistedLicense = attrs: hasListedLicense blocklist attrs; allowBroken = config.allowBroken || builtins.getEnv "NIXPKGS_ALLOW_BROKEN" == "1"; @@ -71,11 +79,16 @@ let allowUnsupportedSystem = config.allowUnsupportedSystem || builtins.getEnv "NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM" == "1"; - isUnfree = licenses: any (l: !l.free or true) licenses; + isUnfree = licenses: + if isAttrs licenses then !licenses.free or true + # TODO: Returning false in the case of a string is a bug that should be fixed. + # In a previous implementation of this function the function body + # was `licenses: lib.lists.any (l: !l.free or true) licenses;` + # which always evaluates to `!true` for strings. + else if isString licenses then false + else lib.lists.any (l: !l.free or true) licenses; - hasUnfreeLicense = attrs: - hasLicense attrs && - isUnfree (toList attrs.meta.license); + hasUnfreeLicense = attrs: hasLicense attrs && isUnfree attrs.meta.license; hasNoMaintainers = attrs: attrs ? meta.maintainers && (length attrs.meta.maintainers) == 0;