summary refs log tree commit diff
path: root/pkgs/stdenv
diff options
context:
space:
mode:
authorDan Peebles <pumpkin@me.com>2017-04-28 18:01:52 -0400
committerDan Peebles <pumpkin@me.com>2017-04-28 18:12:18 -0400
commit32ae4bfc20af932972ac914df8cc7f1c9d57fe55 (patch)
tree1077a896f885aa312e8eefb2e7cf22f1de88f178 /pkgs/stdenv
parentce6eb0cbbe5398329a490b54dc2d259d9d48007b (diff)
downloadnixpkgs-32ae4bfc20af932972ac914df8cc7f1c9d57fe55.tar
nixpkgs-32ae4bfc20af932972ac914df8cc7f1c9d57fe55.tar.gz
nixpkgs-32ae4bfc20af932972ac914df8cc7f1c9d57fe55.tar.bz2
nixpkgs-32ae4bfc20af932972ac914df8cc7f1c9d57fe55.tar.lz
nixpkgs-32ae4bfc20af932972ac914df8cc7f1c9d57fe55.tar.xz
nixpkgs-32ae4bfc20af932972ac914df8cc7f1c9d57fe55.tar.zst
nixpkgs-32ae4bfc20af932972ac914df8cc7f1c9d57fe55.zip
stdenv-generic: add meta attribute checking
This is turned off by default but I think we should fix all packages to
respect it and then turn it on by default
Diffstat (limited to 'pkgs/stdenv')
-rw-r--r--pkgs/stdenv/generic/default.nix31
1 files changed, 31 insertions, 0 deletions
diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix
index 69bcd649059..4bcd7b3260d 100644
--- a/pkgs/stdenv/generic/default.nix
+++ b/pkgs/stdenv/generic/default.nix
@@ -18,6 +18,8 @@ let lib = import ../../../lib; in lib.makeOverridable (
 
 let
 
+  shouldCheckMeta = config.checkMeta or false;
+
   allowUnfree = config.allowUnfree or false || builtins.getEnv "NIXPKGS_ALLOW_UNFREE" == "1";
 
   whitelist = config.whitelistedLicenses or [];
@@ -151,6 +153,7 @@ let
         broken = remediate_whitelist "Broken";
         blacklisted = x: "";
         insecure = remediate_insecure;
+        unknown-meta = x: "";
       };
       remediate_whitelist = allow_attr: attrs:
         ''
@@ -202,6 +205,32 @@ let
 
           '' + ((builtins.getAttr reason remediation) attrs));
 
+      metaTypes = with lib.types; {
+        # These keys are documented
+        description = str;
+        longDescription = str;
+        branch = str;
+        homepage = str;
+        downloadPage = str;
+        license = either (listOf lib.types.attrs) lib.types.attrs;
+        maintainers = listOf str;
+        priority = int;
+        platforms = listOf str;
+        hydraPlatforms = listOf str;
+        broken = bool;
+
+        # Weirder stuff that doesn't appear in the documentation?
+        version = str;
+        updateWalker = bool;
+        executables = listOf str;
+      };
+
+      checkMetaAttr = k: v:
+        if metaTypes?${k} then
+          if metaTypes.${k}.check v then null else "key '${k}' has a value of an invalid type; expected ${metaTypes.${k}.description}"
+        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 [];
+
       # Check if a derivation is valid, that is whether it passes checks for
       # e.g brokenness or license.
       #
@@ -219,6 +248,8 @@ let
           { valid = false; reason = "broken"; errormsg = "is not supported on ‘${result.system}’"; }
         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; };
 
       outputs' =