diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2021-03-15 16:49:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-15 16:49:44 +0100 |
commit | ccb8a403ee68b30e1346ee673b8f13ce56a747ad (patch) | |
tree | 63c3addb349dbb179014c9434fc1348849c5c372 | |
parent | c0073f62687a2459a93d7b8a07a3970629205fd8 (diff) | |
parent | 7ce10924c74e9e037b05558aeb5f0639df5955f6 (diff) |
Merge pull request #4587 from obsidiansystems/derivation-goal-detect-invalid-output
Throw error for derivation goal with bogus wanted output
-rw-r--r-- | src/libstore/build/derivation-goal.cc | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/libstore/build/derivation-goal.cc b/src/libstore/build/derivation-goal.cc index d624e58b9..2e7be517e 100644 --- a/src/libstore/build/derivation-goal.cc +++ b/src/libstore/build/derivation-goal.cc @@ -1250,9 +1250,12 @@ OutputPathMap DerivationGoal::queryDerivationOutputMap() void DerivationGoal::checkPathValidity() { bool checkHash = buildMode == bmRepair; + auto wantedOutputsLeft = wantedOutputs; for (auto & i : queryPartialDerivationOutputMap()) { InitialOutput & info = initialOutputs.at(i.first); info.wanted = wantOutput(i.first, wantedOutputs); + if (info.wanted) + wantedOutputsLeft.erase(i.first); if (i.second) { auto outputPath = *i.second; info.known = { @@ -1274,6 +1277,13 @@ void DerivationGoal::checkPathValidity() } } } + // If we requested all the outputs via the empty set, we are always fine. + // If we requested specific elements, the loop above removes all the valid + // ones, so any that are left must be invalid. + if (!wantedOutputsLeft.empty()) + throw Error("derivation '%s' does not have wanted outputs %s", + worker.store.printStorePath(drvPath), + concatStringsSep(", ", quoteStrings(wantedOutputsLeft))); } |