Merge remote-tracking branch 'tweag/fuzzyMatching' into flakes

This commit is contained in:
Eelco Dolstra 2019-05-03 12:46:16 +02:00
commit f662850b60

View file

@ -161,21 +161,10 @@ const Registries EvalState::getFlakeRegistries()
} }
static FlakeRef lookupFlake(EvalState & state, const FlakeRef & flakeRef, const Registries & registries, static FlakeRef lookupFlake(EvalState & state, const FlakeRef & flakeRef, const Registries & registries,
std::vector<FlakeRef> pastSearches = {}) std::vector<FlakeRef> pastSearches = {});
{
if (registries.empty() && !flakeRef.isDirect())
throw Error("indirect flake reference '%s' is not allowed", flakeRef);
for (std::shared_ptr<FlakeRegistry> registry : registries) { FlakeRef updateFlakeRef(EvalState & state, const FlakeRef & newRef, const Registries & registries, std::vector<FlakeRef> pastSearches)
auto i = registry->entries.find(flakeRef); {
if (i != registry->entries.end()) {
auto newRef = i->second;
if (std::get_if<FlakeRef::IsAlias>(&flakeRef.data)) {
if (flakeRef.ref || flakeRef.rev) {
newRef.ref = flakeRef.ref;
newRef.rev = flakeRef.rev;
}
}
std::string errorMsg = "found cycle in flake registries: "; std::string errorMsg = "found cycle in flake registries: ";
for (FlakeRef oldRef : pastSearches) { for (FlakeRef oldRef : pastSearches) {
errorMsg += oldRef.to_string(); errorMsg += oldRef.to_string();
@ -186,6 +175,27 @@ static FlakeRef lookupFlake(EvalState & state, const FlakeRef & flakeRef, const
pastSearches.push_back(newRef); pastSearches.push_back(newRef);
return lookupFlake(state, newRef, registries, pastSearches); return lookupFlake(state, newRef, registries, pastSearches);
} }
static FlakeRef lookupFlake(EvalState & state, const FlakeRef & flakeRef, const Registries & registries,
std::vector<FlakeRef> pastSearches)
{
if (registries.empty() && !flakeRef.isDirect())
throw Error("indirect flake reference '%s' is not allowed", flakeRef);
for (std::shared_ptr<FlakeRegistry> registry : registries) {
auto i = registry->entries.find(flakeRef);
if (i != registry->entries.end()) {
auto newRef = i->second;
return updateFlakeRef(state, newRef, registries, pastSearches);
}
auto j = registry->entries.find(flakeRef.baseRef());
if (j != registry->entries.end()) {
auto newRef = j->second;
newRef.ref = flakeRef.ref;
newRef.rev = flakeRef.rev;
return updateFlakeRef(state, newRef, registries, pastSearches);
}
} }
if (!flakeRef.isDirect()) if (!flakeRef.isDirect())