diff --git a/pkgs/stdenv/generic/check-meta.nix b/pkgs/stdenv/generic/check-meta.nix index 27f8c854ec7e3..cb5b6b7b50c72 100644 --- a/pkgs/stdenv/generic/check-meta.nix +++ b/pkgs/stdenv/generic/check-meta.nix @@ -662,7 +662,13 @@ let "Refusing to evaluate package '${getNameWithVersion attrs}' in ${pos_str meta} because it ${error.msg}" + lib.optionalString (!inHydra && error.remediation != "") "\n${error.remediation}"; in - if config ? handleEvalIssue then config.handleEvalIssue error.reason msg else throw msg; + if config ? handleEvalIssue then + if error.reason == "problem" then + error.handleProblem config.handleEvalIssue + else + config.handleEvalIssue error.reason msg + else + throw msg; giveWarning = acc: warning: diff --git a/pkgs/stdenv/generic/problems.nix b/pkgs/stdenv/generic/problems.nix index 08d4b6e30ec05..04fd0b09dba2f 100644 --- a/pkgs/stdenv/generic/problems.nix +++ b/pkgs/stdenv/generic/problems.nix @@ -485,6 +485,11 @@ rec { null else { + reason = "problem"; + # Only there for PR CI evaluation + handleProblem = + handleEvalIssue: + lib.foldl' (result: problem: handleEvalIssue problem.kind (fullMessage problem)) true errorProblems; msg = '' has problems: ${concatMapStringsSep "\n" (x: "- ${fullMessage x}") errorProblems} diff --git a/pkgs/test/problems/cases/handleEvalIssue/default.nix b/pkgs/test/problems/cases/handleEvalIssue/default.nix new file mode 100644 index 0000000000000..3d79a9e11b9a1 --- /dev/null +++ b/pkgs/test/problems/cases/handleEvalIssue/default.nix @@ -0,0 +1,30 @@ +{ + nixpkgs ? ../../../../.., +}: +let + pkgs = import nixpkgs { + system = "x86_64-linux"; + overlays = [ ]; + config = { + checkMeta = true; + handleEvalIssue = reason: errormsg: builtins.trace "reason: ${reason}, errormsg: ${errormsg}" true; + problems.matchers = [ + { + kind = "deprecated"; + handler = "error"; + } + { + kind = "removal"; + handler = "error"; + } + ]; + }; + }; +in +pkgs.stdenvNoCC.mkDerivation { + pname = "a"; + version = "0"; + meta.description = "Some package"; + meta.problems.removal.message = "To be removed."; + meta.problems.deprecated.message = "To be deprecated."; +} diff --git a/pkgs/test/problems/cases/handleEvalIssue/expected-stderr b/pkgs/test/problems/cases/handleEvalIssue/expected-stderr new file mode 100644 index 0000000000000..ddefa6b05314c --- /dev/null +++ b/pkgs/test/problems/cases/handleEvalIssue/expected-stderr @@ -0,0 +1,3 @@ +trace: reason: deprecated, errormsg: deprecated: To be deprecated. +trace: reason: removal, errormsg: removal: To be removed. +warning: you did not specify '--add-root'; the result might be removed by the garbage collector