Don't assume a total output map in two places in build.cc
Thanks @regnat for catching one of them. The other follows for many of the same reasons. I'm find fixing others on a need-to-fix basis, provided their are no regressions.
This commit is contained in:
parent
4c6aac8fdf
commit
2de201254e
1 changed files with 12 additions and 6 deletions
|
@ -1389,9 +1389,10 @@ void DerivationGoal::repairClosure()
|
||||||
std::map<StorePath, StorePath> outputsToDrv;
|
std::map<StorePath, StorePath> outputsToDrv;
|
||||||
for (auto & i : inputClosure)
|
for (auto & i : inputClosure)
|
||||||
if (i.isDerivation()) {
|
if (i.isDerivation()) {
|
||||||
auto depOutputs = worker.store.queryDerivationOutputMapAssumeTotal(i);
|
auto depOutputs = worker.store.queryDerivationOutputMap(i);
|
||||||
for (auto & j : depOutputs)
|
for (auto & j : depOutputs)
|
||||||
outputsToDrv.insert_or_assign(j.second, i);
|
if (j.second)
|
||||||
|
outputsToDrv.insert_or_assign(*j.second, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check each path (slow!). */
|
/* Check each path (slow!). */
|
||||||
|
@ -1459,11 +1460,16 @@ void DerivationGoal::inputsRealised()
|
||||||
`i' as input paths. Only add the closures of output paths
|
`i' as input paths. Only add the closures of output paths
|
||||||
that are specified as inputs. */
|
that are specified as inputs. */
|
||||||
assert(worker.store.isValidPath(drvPath));
|
assert(worker.store.isValidPath(drvPath));
|
||||||
auto outputs = worker.store.queryDerivationOutputMapAssumeTotal(depDrvPath);
|
auto outputs = worker.store.queryDerivationOutputMap(depDrvPath);
|
||||||
for (auto & j : wantedDepOutputs) {
|
for (auto & j : wantedDepOutputs) {
|
||||||
if (outputs.count(j) > 0)
|
if (outputs.count(j) > 0) {
|
||||||
worker.store.computeFSClosure(outputs.at(j), inputPaths);
|
auto optRealizedInput = outputs.at(j);
|
||||||
else
|
if (!optRealizedInput)
|
||||||
|
throw Error(
|
||||||
|
"derivation '%s' requires output '%s' from input derivation '%s', which is supposedly realized already, yet we still don't know what path corresponds to that output.",
|
||||||
|
worker.store.printStorePath(drvPath), j, worker.store.printStorePath(drvPath));
|
||||||
|
worker.store.computeFSClosure(*optRealizedInput, inputPaths);
|
||||||
|
} else
|
||||||
throw Error(
|
throw Error(
|
||||||
"derivation '%s' requires non-existent output '%s' from input derivation '%s'",
|
"derivation '%s' requires non-existent output '%s' from input derivation '%s'",
|
||||||
worker.store.printStorePath(drvPath), j, worker.store.printStorePath(drvPath));
|
worker.store.printStorePath(drvPath), j, worker.store.printStorePath(drvPath));
|
||||||
|
|
Loading…
Reference in a new issue