Make nix shell fallback to static outputs when needed

In case of pure input-addressed derivations, the build loop doesn't
guaranty that the realisations are stored in the db (if the output paths
are already there or can be substituted, the realisations won't be
registered). This caused `nix shell` to fail in some cases because it
was assuming that the realisations were always existing.

A better (but more involved) fix would probably to ensure that we always
register the realisations, but in the meantime this patches the surface
issue.

Fix #4721
This commit is contained in:
regnat 2021-04-21 17:33:21 +02:00
parent 8d651a1f68
commit 8d66f5f110

View file

@ -736,9 +736,18 @@ std::set<RealisedPath> toRealisedPaths(
output.first); output.first);
auto outputId = DrvOutput{outputHashes.at(output.first), output.first}; auto outputId = DrvOutput{outputHashes.at(output.first), output.first};
auto realisation = store->queryRealisation(outputId); auto realisation = store->queryRealisation(outputId);
if (!realisation) if (!realisation) {
throw Error("cannot operate on an output of unbuilt content-addresed derivation '%s'", outputId.to_string()); // TODO: remove this check once #4725 is fixed
res.insert(RealisedPath{*realisation}); // as well have the guaranty that if
// `output.second` exists, then the realisation
// will be there too
if (output.second)
res.insert(*output.second);
else
throw Error("cannot operate on an output of unbuilt content-addresed derivation '%s'", outputId.to_string());
} else {
res.insert(RealisedPath{*realisation});
}
} }
else { else {
// If ca-derivations isn't enabled, behave as if // If ca-derivations isn't enabled, behave as if