Fuzzymatching

Fixed issue #61
This commit is contained in:
Nick Van den Broeck 2019-04-30 12:47:15 +02:00
parent 4588a6ff3c
commit 9b3069a88c

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();
@ -185,6 +174,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);
} }
} }