From 764a7dbadffbda2ad142a9d9d0f8eeaee06202cd Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Mon, 2 Mar 2026 14:32:09 +0100 Subject: [PATCH] stdenv: Fix handleEvalIssue for error problems This was an oversight in https://github.com/NixOS/nixpkgs/pull/478539 that became apparent in https://github.com/NixOS/nixpkgs/pull/494416: If there's a failing problem in Nixpkgs packages, CI will call handleEvalIssue on it, but the problem error was missing a `.reason`. Though even if it did have a reason, we need to do more to make sure we don't break any code that uses it, so the new code uses the problem kind as the reason, which happens to match with the reason for all expected problem kinds. --- pkgs/stdenv/generic/check-meta.nix | 8 ++++- pkgs/stdenv/generic/problems.nix | 5 ++++ .../cases/handleEvalIssue/default.nix | 30 +++++++++++++++++++ .../cases/handleEvalIssue/expected-stderr | 3 ++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 pkgs/test/problems/cases/handleEvalIssue/default.nix create mode 100644 pkgs/test/problems/cases/handleEvalIssue/expected-stderr 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