From bb63bd50e6d817e5ca52c1d1d21232164a64f993 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 13 Feb 2024 14:14:20 +0100 Subject: [PATCH] : Restore support for "impure = true" --- src/libstore/builtins/fetchurl.cc | 8 ++++---- tests/functional/fetchurl.sh | 2 +- tests/functional/impure-derivations.sh | 4 ++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/libstore/builtins/fetchurl.cc b/src/libstore/builtins/fetchurl.cc index a9f2e748e..559efcc17 100644 --- a/src/libstore/builtins/fetchurl.cc +++ b/src/libstore/builtins/fetchurl.cc @@ -20,9 +20,8 @@ void builtinFetchurl(const BasicDerivation & drv, const std::string & netrcData) if (!out) throw Error("'builtin:fetchurl' requires an 'out' output"); - auto dof = std::get_if(&out->raw); - if (!dof) - throw Error("'builtin:fetchurl' must be a fixed-output derivation"); + if (!(drv.type().isFixed() || drv.type().isImpure())) + throw Error("'builtin:fetchurl' must be a fixed-output or impure derivation"); auto getAttr = [&](const std::string & name) { auto i = drv.env.find(name); @@ -67,7 +66,8 @@ void builtinFetchurl(const BasicDerivation & drv, const std::string & netrcData) }; /* Try the hashed mirrors first. */ - if (dof->ca.method.getFileIngestionMethod() == FileIngestionMethod::Flat) + auto dof = std::get_if(&out->raw); + if (dof && dof->ca.method.getFileIngestionMethod() == FileIngestionMethod::Flat) for (auto hashedMirror : settings.hashedMirrors.get()) try { if (!hasSuffix(hashedMirror, "/")) hashedMirror += '/'; diff --git a/tests/functional/fetchurl.sh b/tests/functional/fetchurl.sh index 5a05cc5e1..a3620f52b 100644 --- a/tests/functional/fetchurl.sh +++ b/tests/functional/fetchurl.sh @@ -83,4 +83,4 @@ test -L $outPath/symlink requireDaemonNewerThan "2.20" expected=100 if [[ -v NIX_DAEMON_PACKAGE ]]; then expected=1; fi # work around the daemon not returning a 100 status correctly -expectStderr $expected nix-build --expr '{ url }: builtins.derivation { name = "nix-cache-info"; system = "x86_64-linux"; builder = "builtin:fetchurl"; inherit url; outputHashMode = "flat"; }' --argstr url file://$narxz 2>&1 | grep 'must be a fixed-output derivation' +expectStderr $expected nix-build --expr '{ url }: builtins.derivation { name = "nix-cache-info"; system = "x86_64-linux"; builder = "builtin:fetchurl"; inherit url; outputHashMode = "flat"; }' --argstr url file://$narxz 2>&1 | grep 'must be a fixed-output or impure derivation' diff --git a/tests/functional/impure-derivations.sh b/tests/functional/impure-derivations.sh index 39d053a04..54ed6f5dd 100644 --- a/tests/functional/impure-derivations.sh +++ b/tests/functional/impure-derivations.sh @@ -63,3 +63,7 @@ path5=$(nix build -L --no-link --json --file ./impure-derivations.nix contentAdd path6=$(nix build -L --no-link --json --file ./impure-derivations.nix inputAddressedAfterCA | jq -r .[].outputs.out) [[ $(< $path6) = X ]] [[ $(< $TEST_ROOT/counter) = 5 ]] + +# Test nix/fetchurl.nix. +path7=$(nix build -L --no-link --print-out-paths --expr "import { impure = true; url = file://$PWD/impure-derivations.sh; }") +cmp $path7 $PWD/impure-derivations.sh