mirror of
https://github.com/NixOS/nix
synced 2025-06-28 22:01:15 +02:00
Merge pull request #6346 from Ericson2314/impure-derivations-ng
Get rid of `impureOutputHash`; fix possible bug
This commit is contained in:
commit
0abc264f7d
3 changed files with 32 additions and 41 deletions
|
@ -185,41 +185,44 @@ Goal::Co DerivationGoal::haveDerivation()
|
||||||
if (!drv->type().hasKnownOutputPaths())
|
if (!drv->type().hasKnownOutputPaths())
|
||||||
experimentalFeatureSettings.require(Xp::CaDerivations);
|
experimentalFeatureSettings.require(Xp::CaDerivations);
|
||||||
|
|
||||||
if (drv->type().isImpure()) {
|
|
||||||
experimentalFeatureSettings.require(Xp::ImpureDerivations);
|
|
||||||
|
|
||||||
for (auto & [outputName, output] : drv->outputs) {
|
|
||||||
auto randomPath = StorePath::random(outputPathName(drv->name, outputName));
|
|
||||||
assert(!worker.store.isValidPath(randomPath));
|
|
||||||
initialOutputs.insert({
|
|
||||||
outputName,
|
|
||||||
InitialOutput {
|
|
||||||
.wanted = true,
|
|
||||||
.outputHash = impureOutputHash,
|
|
||||||
.known = InitialOutputStatus {
|
|
||||||
.path = randomPath,
|
|
||||||
.status = PathStatus::Absent
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
co_return gaveUpOnSubstitution();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto & i : drv->outputsAndOptPaths(worker.store))
|
for (auto & i : drv->outputsAndOptPaths(worker.store))
|
||||||
if (i.second.second)
|
if (i.second.second)
|
||||||
worker.store.addTempRoot(*i.second.second);
|
worker.store.addTempRoot(*i.second.second);
|
||||||
|
|
||||||
auto outputHashes = staticOutputHashes(worker.evalStore, *drv);
|
{
|
||||||
for (auto & [outputName, outputHash] : outputHashes)
|
bool impure = drv->type().isImpure();
|
||||||
initialOutputs.insert({
|
|
||||||
outputName,
|
if (impure) experimentalFeatureSettings.require(Xp::ImpureDerivations);
|
||||||
InitialOutput {
|
|
||||||
|
auto outputHashes = staticOutputHashes(worker.evalStore, *drv);
|
||||||
|
for (auto & [outputName, outputHash] : outputHashes) {
|
||||||
|
InitialOutput v{
|
||||||
.wanted = true, // Will be refined later
|
.wanted = true, // Will be refined later
|
||||||
.outputHash = outputHash
|
.outputHash = outputHash
|
||||||
|
};
|
||||||
|
|
||||||
|
/* TODO we might want to also allow randomizing the paths
|
||||||
|
for regular CA derivations, e.g. for sake of checking
|
||||||
|
determinism. */
|
||||||
|
if (impure) {
|
||||||
|
v.known = InitialOutputStatus {
|
||||||
|
.path = StorePath::random(outputPathName(drv->name, outputName)),
|
||||||
|
.status = PathStatus::Absent,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
initialOutputs.insert({
|
||||||
|
outputName,
|
||||||
|
std::move(v),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (impure) {
|
||||||
|
/* We don't yet have any safe way to cache an impure derivation at
|
||||||
|
this step. */
|
||||||
|
co_return gaveUpOnSubstitution();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
/* Check what outputs paths are not already valid. */
|
/* Check what outputs paths are not already valid. */
|
||||||
|
|
|
@ -843,16 +843,6 @@ DrvHash hashDerivationModulo(Store & store, const Derivation & drv, bool maskOut
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type.isImpure()) {
|
|
||||||
std::map<std::string, Hash> outputHashes;
|
|
||||||
for (const auto & [outputName, _] : drv.outputs)
|
|
||||||
outputHashes.insert_or_assign(outputName, impureOutputHash);
|
|
||||||
return DrvHash {
|
|
||||||
.hashes = outputHashes,
|
|
||||||
.kind = DrvHash::Kind::Deferred,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
auto kind = std::visit(overloaded {
|
auto kind = std::visit(overloaded {
|
||||||
[](const DerivationType::InputAddressed & ia) {
|
[](const DerivationType::InputAddressed & ia) {
|
||||||
/* This might be a "pesimistically" deferred output, so we don't
|
/* This might be a "pesimistically" deferred output, so we don't
|
||||||
|
@ -865,7 +855,7 @@ DrvHash hashDerivationModulo(Store & store, const Derivation & drv, bool maskOut
|
||||||
: DrvHash::Kind::Deferred;
|
: DrvHash::Kind::Deferred;
|
||||||
},
|
},
|
||||||
[](const DerivationType::Impure &) -> DrvHash::Kind {
|
[](const DerivationType::Impure &) -> DrvHash::Kind {
|
||||||
assert(false);
|
return DrvHash::Kind::Deferred;
|
||||||
}
|
}
|
||||||
}, drv.type().raw);
|
}, drv.type().raw);
|
||||||
|
|
||||||
|
|
|
@ -526,6 +526,4 @@ void writeDerivation(Sink & out, const StoreDirConfig & store, const BasicDeriva
|
||||||
*/
|
*/
|
||||||
std::string hashPlaceholder(const OutputNameView outputName);
|
std::string hashPlaceholder(const OutputNameView outputName);
|
||||||
|
|
||||||
extern const Hash impureOutputHash;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue