Better detect when buildPaths would be a no-op

`buildPaths` can be called even for stores where it's not defined in case it's
bound to be a no-op.
The “no-op detection” mechanism was only detecting the case wher `buildPaths`
was called on a set of (non-drv) paths that were already present on the store.

This commit extends this mechanism to also detect the case where `buildPaths`
is called on a set of derivation outputs which are already built on the store.

This only works with the ca-derivations flag. It could be possible to
extend this to also work without it, but it would add quite a bit of
complexity, and it's not used without it anyways.
This commit is contained in:
regnat 2020-11-06 09:51:17 +01:00
parent e3ddffb27e
commit 6e899278d3

View file

@ -729,9 +729,17 @@ void Store::buildPaths(const std::vector<StorePathWithOutputs> & paths, BuildMod
StorePathSet paths2; StorePathSet paths2;
for (auto & path : paths) { for (auto & path : paths) {
if (path.path.isDerivation()) if (path.path.isDerivation()) {
unsupported("buildPaths"); if (settings.isExperimentalFeatureEnabled("ca-derivations")) {
paths2.insert(path.path); for (auto & outputName : path.outputs) {
if (!queryRealisation({path.path, outputName}))
unsupported("buildPaths");
}
} else
unsupported("buildPaths");
} else
paths2.insert(path.path);
} }
if (queryValidPaths(paths2).size() != paths2.size()) if (queryValidPaths(paths2).size() != paths2.size())