forked from lix-project/lix
Merge pull request #4606 from obsidiansystems/avoid-stringify-store-path
Avoid some StorePath -> Path -> StorePath roundtrips
This commit is contained in:
commit
52b6e0f837
1 changed files with 15 additions and 20 deletions
|
@ -22,55 +22,53 @@ void Store::computeFSClosure(const StorePathSet & startPaths,
|
||||||
|
|
||||||
Sync<State> state_(State{0, paths_, 0});
|
Sync<State> state_(State{0, paths_, 0});
|
||||||
|
|
||||||
std::function<void(const Path &)> enqueue;
|
std::function<void(const StorePath &)> enqueue;
|
||||||
|
|
||||||
std::condition_variable done;
|
std::condition_variable done;
|
||||||
|
|
||||||
enqueue = [&](const Path & path) -> void {
|
enqueue = [&](const StorePath & path) -> void {
|
||||||
{
|
{
|
||||||
auto state(state_.lock());
|
auto state(state_.lock());
|
||||||
if (state->exc) return;
|
if (state->exc) return;
|
||||||
if (!state->paths.insert(parseStorePath(path)).second) return;
|
if (!state->paths.insert(path).second) return;
|
||||||
state->pending++;
|
state->pending++;
|
||||||
}
|
}
|
||||||
|
|
||||||
queryPathInfo(parseStorePath(path), {[&, pathS(path)](std::future<ref<const ValidPathInfo>> fut) {
|
queryPathInfo(path, {[&](std::future<ref<const ValidPathInfo>> fut) {
|
||||||
// FIXME: calls to isValidPath() should be async
|
// FIXME: calls to isValidPath() should be async
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto info = fut.get();
|
auto info = fut.get();
|
||||||
|
|
||||||
auto path = parseStorePath(pathS);
|
|
||||||
|
|
||||||
if (flipDirection) {
|
if (flipDirection) {
|
||||||
|
|
||||||
StorePathSet referrers;
|
StorePathSet referrers;
|
||||||
queryReferrers(path, referrers);
|
queryReferrers(path, referrers);
|
||||||
for (auto & ref : referrers)
|
for (auto & ref : referrers)
|
||||||
if (ref != path)
|
if (ref != path)
|
||||||
enqueue(printStorePath(ref));
|
enqueue(ref);
|
||||||
|
|
||||||
if (includeOutputs)
|
if (includeOutputs)
|
||||||
for (auto & i : queryValidDerivers(path))
|
for (auto & i : queryValidDerivers(path))
|
||||||
enqueue(printStorePath(i));
|
enqueue(i);
|
||||||
|
|
||||||
if (includeDerivers && path.isDerivation())
|
if (includeDerivers && path.isDerivation())
|
||||||
for (auto & i : queryDerivationOutputs(path))
|
for (auto & i : queryDerivationOutputs(path))
|
||||||
if (isValidPath(i) && queryPathInfo(i)->deriver == path)
|
if (isValidPath(i) && queryPathInfo(i)->deriver == path)
|
||||||
enqueue(printStorePath(i));
|
enqueue(i);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
for (auto & ref : info->references)
|
for (auto & ref : info->references)
|
||||||
if (ref != path)
|
if (ref != path)
|
||||||
enqueue(printStorePath(ref));
|
enqueue(ref);
|
||||||
|
|
||||||
if (includeOutputs && path.isDerivation())
|
if (includeOutputs && path.isDerivation())
|
||||||
for (auto & i : queryDerivationOutputs(path))
|
for (auto & i : queryDerivationOutputs(path))
|
||||||
if (isValidPath(i)) enqueue(printStorePath(i));
|
if (isValidPath(i)) enqueue(i);
|
||||||
|
|
||||||
if (includeDerivers && info->deriver && isValidPath(*info->deriver))
|
if (includeDerivers && info->deriver && isValidPath(*info->deriver))
|
||||||
enqueue(printStorePath(*info->deriver));
|
enqueue(*info->deriver);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +88,7 @@ void Store::computeFSClosure(const StorePathSet & startPaths,
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto & startPath : startPaths)
|
for (auto & startPath : startPaths)
|
||||||
enqueue(printStorePath(startPath));
|
enqueue(startPath);
|
||||||
|
|
||||||
{
|
{
|
||||||
auto state(state_.lock());
|
auto state(state_.lock());
|
||||||
|
@ -160,13 +158,10 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
|
||||||
};
|
};
|
||||||
|
|
||||||
auto checkOutput = [&](
|
auto checkOutput = [&](
|
||||||
const Path & drvPathS, ref<Derivation> drv, const Path & outPathS, ref<Sync<DrvState>> drvState_)
|
const StorePath & drvPath, ref<Derivation> drv, const StorePath & outPath, ref<Sync<DrvState>> drvState_)
|
||||||
{
|
{
|
||||||
if (drvState_->lock()->done) return;
|
if (drvState_->lock()->done) return;
|
||||||
|
|
||||||
auto drvPath = parseStorePath(drvPathS);
|
|
||||||
auto outPath = parseStorePath(outPathS);
|
|
||||||
|
|
||||||
SubstitutablePathInfos infos;
|
SubstitutablePathInfos infos;
|
||||||
querySubstitutablePathInfos({{outPath, getDerivationCA(*drv)}}, infos);
|
querySubstitutablePathInfos({{outPath, getDerivationCA(*drv)}}, infos);
|
||||||
|
|
||||||
|
@ -203,7 +198,7 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PathSet invalid;
|
StorePathSet invalid;
|
||||||
/* true for regular derivations, and CA derivations for which we
|
/* true for regular derivations, and CA derivations for which we
|
||||||
have a trust mapping for all wanted outputs. */
|
have a trust mapping for all wanted outputs. */
|
||||||
auto knownOutputPaths = true;
|
auto knownOutputPaths = true;
|
||||||
|
@ -213,7 +208,7 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (wantOutput(outputName, path.outputs) && !isValidPath(*pathOpt))
|
if (wantOutput(outputName, path.outputs) && !isValidPath(*pathOpt))
|
||||||
invalid.insert(printStorePath(*pathOpt));
|
invalid.insert(*pathOpt);
|
||||||
}
|
}
|
||||||
if (knownOutputPaths && invalid.empty()) return;
|
if (knownOutputPaths && invalid.empty()) return;
|
||||||
|
|
||||||
|
@ -223,7 +218,7 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
|
||||||
if (knownOutputPaths && settings.useSubstitutes && parsedDrv.substitutesAllowed()) {
|
if (knownOutputPaths && settings.useSubstitutes && parsedDrv.substitutesAllowed()) {
|
||||||
auto drvState = make_ref<Sync<DrvState>>(DrvState(invalid.size()));
|
auto drvState = make_ref<Sync<DrvState>>(DrvState(invalid.size()));
|
||||||
for (auto & output : invalid)
|
for (auto & output : invalid)
|
||||||
pool.enqueue(std::bind(checkOutput, printStorePath(path.path), drv, output, drvState));
|
pool.enqueue(std::bind(checkOutput, path.path, drv, output, drvState));
|
||||||
} else
|
} else
|
||||||
mustBuildDrv(path.path, *drv);
|
mustBuildDrv(path.path, *drv);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue