Merge pull request #34444 from obsidiansystems/meta-check

lib: Fix #30902
This commit is contained in:
John Ericson
2018-03-18 13:51:03 -04:00
committed by GitHub
7 changed files with 65 additions and 22 deletions
+19 -14
View File
@@ -1,11 +1,9 @@
# Checks derivation meta and attrs for problems (like brokenness,
# licenses, etc).
{ lib, config, system, meta, derivationArg, mkDerivationArg }:
{ lib, config, hostPlatform, meta }:
let
attrs = mkDerivationArg; # TODO: probably get rid of passing this one
# See discussion at https://github.com/NixOS/nixpkgs/pull/25304#issuecomment-298385426
# for why this defaults to false, but I (@copumpkin) want to default it to true soon.
shouldCheckMeta = config.checkMeta or false;
@@ -123,7 +121,7 @@ let
'';
handleEvalIssue = { reason , errormsg ? "" }:
handleEvalIssue = attrs: { reason , errormsg ? "" }:
let
msg = ''
Package ${attrs.name or "«name-missing»"} in ${pos_str} ${errormsg}, refusing to evaluate.
@@ -146,7 +144,7 @@ let
license = either (listOf lib.types.attrs) (either lib.types.attrs str);
maintainers = listOf (attrsOf str);
priority = int;
platforms = listOf str;
platforms = listOf (either str lib.systems.parsed.types.system);
hydraPlatforms = listOf str;
broken = bool;
@@ -175,6 +173,11 @@ let
else "key '${k}' is unrecognized; expected one of: \n\t [${lib.concatMapStringsSep ", " (x: "'${x}'") (lib.attrNames metaTypes)}]";
checkMeta = meta: if shouldCheckMeta then lib.remove null (lib.mapAttrsToList checkMetaAttr meta) else [];
checkPlatform = attrs: let
raw = attrs.meta.platforms;
uniform = map (x: if builtins.isString x then { system = x; } else { parsed = x; }) raw;
in lib.any (pat: lib.matchAttrs pat hostPlatform) uniform;
# Check if a derivation is valid, that is whether it passes checks for
# e.g brokenness or license.
#
@@ -188,19 +191,21 @@ let
{ valid = false; reason = "blacklisted"; errormsg = "has a blacklisted license (${showLicense attrs.meta.license})"; }
else if !allowBroken && attrs.meta.broken or false then
{ valid = false; reason = "broken"; errormsg = "is marked as broken"; }
else if !allowUnsupportedSystem && !allowBroken && attrs.meta.platforms or null != null && !lib.lists.elem system attrs.meta.platforms then
{ valid = false; reason = "broken"; errormsg = "is not supported on ${system}"; }
else if !allowUnsupportedSystem && !allowBroken && attrs.meta.platforms or null != null && !(checkPlatform attrs) then
{ valid = false; reason = "broken"; errormsg = "is not supported on ${hostPlatform.config}"; }
else if !(hasAllowedInsecure attrs) then
{ valid = false; reason = "insecure"; errormsg = "is marked as insecure"; }
else let res = checkMeta (attrs.meta or {}); in if res != [] then
{ valid = false; reason = "unknown-meta"; errormsg = "has an invalid meta attrset:${lib.concatMapStrings (x: "\n\t - " + x) res}"; }
else { valid = true; };
validity = checkValidity attrs;
assertValidity = attrs: let
validity = checkValidity attrs;
in validity // {
# Throw an error if trying to evaluate an non-valid derivation
handled = if !validity.valid
then handleEvalIssue attrs (removeAttrs validity ["valid"])
else true;
};
in validity // {
# Throw an error if trying to evaluate an non-valid derivation
handled = if !validity.valid
then handleEvalIssue (removeAttrs validity ["valid"])
else true;
}
in assertValidity
+3 -4
View File
@@ -204,12 +204,11 @@ rec {
});
validity = import ./check-meta.nix {
inherit lib config meta derivationArg;
mkDerivationArg = attrs;
inherit lib config meta;
# Nix itself uses the `system` field of a derivation to decide where
# to build it. This is a bit confusing for cross compilation.
inherit (stdenv) system;
};
inherit (stdenv) hostPlatform;
} attrs;
# The meta attribute is passed in the resulting attribute set,
# but it's not part of the actual derivation, i.e., it's not