From 623f3d321e91ea5426f604a4aeeaffcf95a23a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Mon, 8 Dec 2025 18:20:36 +0000 Subject: [PATCH] turn 'derivation has incorrect deferred output' into warning this breaks nix develop when using a stable nix version Update src/libstore/derivations.cc Co-authored-by: John Ericson --- src/libstore-tests/derivation/invariants.cc | 2 ++ src/libstore/derivations.cc | 27 ++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/libstore-tests/derivation/invariants.cc b/src/libstore-tests/derivation/invariants.cc index 6d7cee968..cacdca0cd 100644 --- a/src/libstore-tests/derivation/invariants.cc +++ b/src/libstore-tests/derivation/invariants.cc @@ -174,6 +174,7 @@ TEST_F(FillInOutputPathsTest, throwsOnIncorrectInputAddressedPath) ASSERT_THROW(drv.fillInOutputPaths(*store), Error); } +#if 0 TEST_F(FillInOutputPathsTest, throwsOnIncorrectEnvVar) { auto wrongPath = StorePath{"c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-wrong-name"}; @@ -195,6 +196,7 @@ TEST_F(FillInOutputPathsTest, throwsOnIncorrectEnvVar) ASSERT_THROW(drv.fillInOutputPaths(*store), Error); } +#endif TEST_F(FillInOutputPathsTest, preservesDeferredWithInputDrvs) { diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc index 842ef9056..67ab6ba62 100644 --- a/src/libstore/derivations.cc +++ b/src/libstore/derivations.cc @@ -1230,7 +1230,7 @@ static void processDerivationOutputPaths(Store & store, auto && drv, std::string std::optional hashesModulo; for (auto & [outputName, output] : drv.outputs) { - auto envHasRightPath = [&](const StorePath & actual) { + auto envHasRightPath = [&](const StorePath & actual, bool isDeferred = false) { if constexpr (fillIn) { auto j = drv.env.find(outputName); /* Fill in mode: fill in missing or empty environment @@ -1248,12 +1248,20 @@ static void processDerivationOutputPaths(Store & store, auto && drv, std::string "derivation has missing environment variable '%s', should be '%s' but is not present", outputName, store.printStorePath(actual)); - if (j->second != store.printStorePath(actual)) - throw Error( - "derivation has incorrect environment variable '%s', should be '%s' but is actually '%s'", - outputName, - store.printStorePath(actual), - j->second); + if (j->second != store.printStorePath(actual)) { + if (isDeferred) + warn( + "derivation has incorrect environment variable '%s', should be '%s' but is actually '%s'\nThis will be an error in future versions of Nix; compatibility of CA derivations will be broken.", + outputName, + store.printStorePath(actual), + j->second); + else + throw Error( + "derivation has incorrect environment variable '%s', should be '%s' but is actually '%s'", + outputName, + store.printStorePath(actual), + j->second); + } }; auto hash = [&](const Output & outputVariant) { if (!hashesModulo) { @@ -1287,8 +1295,9 @@ static void processDerivationOutputPaths(Store & store, auto && drv, std::string else /* Validation mode: deferred outputs should have been filled in */ - throw Error( - "derivation has incorrect deferred output, should be '%s'", store.printStorePath(outPath)); + warn( + "derivation has incorrect deferred output, should be '%s'.\nThis will be an error in future versions of Nix; compatibility of CA derivations will be broken.", + store.printStorePath(outPath)); } else { /* Will never happen, based on where `hash` is called. */