diff options
Diffstat (limited to 'src/libstore/misc.cc')
-rw-r--r-- | src/libstore/misc.cc | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc index 33efe8bebc98..91cf25f27187 100644 --- a/src/libstore/misc.cc +++ b/src/libstore/misc.cc @@ -29,10 +29,55 @@ void computeFSClosure(const Path & storePath, } - Path findOutput(const Derivation & drv, string id) +Path findOutput(const Derivation & drv, string id) { for (DerivationOutputs::const_iterator i = drv.outputs.begin(); i != drv.outputs.end(); ++i) if (i->first == id) return i->second.path; throw Error(format("derivation has no output `%1%'") % id); } + + +void queryMissing(const PathSet & targets, + PathSet & willBuild, PathSet & willSubstitute) +{ + PathSet todo(targets.begin(), targets.end()), done; + + while (!todo.empty()) { + Path p = *(todo.begin()); + todo.erase(p); + if (done.find(p) != done.end()) continue; + done.insert(p); + + if (isDerivation(p)) { + if (!isValidPath(p)) continue; + Derivation drv = derivationFromPath(p); + + bool mustBuild = false; + for (DerivationOutputs::iterator i = drv.outputs.begin(); + i != drv.outputs.end(); ++i) + if (!isValidPath(i->second.path) && + querySubstitutes(noTxn, i->second.path).size() == 0) + mustBuild = true; + + if (mustBuild) { + willBuild.insert(p); + todo.insert(drv.inputSrcs.begin(), drv.inputSrcs.end()); + for (DerivationInputs::iterator i = drv.inputDrvs.begin(); + i != drv.inputDrvs.end(); ++i) + todo.insert(i->first); + } else + for (DerivationOutputs::iterator i = drv.outputs.begin(); + i != drv.outputs.end(); ++i) + todo.insert(i->second.path); + } + + else { + if (isValidPath(p)) continue; + if (querySubstitutes(noTxn, p).size() > 0) + willSubstitute.insert(p); + PathSet refs; + queryReferences(noTxn, p, todo); + } + } +} |