InstallableFlake: Handle missing attr in getCursors
Handle the case where none of getActualAttrPaths() actually exists, in which case instead of returning an empty vector. This fixes the case where the user misspells the attribute name in nix search. Instead of getting no search results, now it shows an error with suggestions. Also remove InstallableFlake::getCursor() override since it's now equivalent to the base class version.
This commit is contained in:
parent
90e630a542
commit
b26562c629
|
@ -696,46 +696,28 @@ InstallableFlake::getCursors(EvalState & state)
|
||||||
|
|
||||||
std::vector<ref<eval_cache::AttrCursor>> res;
|
std::vector<ref<eval_cache::AttrCursor>> res;
|
||||||
|
|
||||||
for (auto & attrPath : getActualAttrPaths()) {
|
|
||||||
auto attr = root->findAlongAttrPath(parseAttrPath(state, attrPath));
|
|
||||||
if (attr) res.push_back(ref(*attr));
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
ref<eval_cache::AttrCursor> InstallableFlake::getCursor(EvalState & state)
|
|
||||||
{
|
|
||||||
auto lockedFlake = getLockedFlake();
|
|
||||||
|
|
||||||
auto cache = openEvalCache(state, lockedFlake);
|
|
||||||
auto root = cache->getRoot();
|
|
||||||
|
|
||||||
Suggestions suggestions;
|
Suggestions suggestions;
|
||||||
|
|
||||||
auto attrPaths = getActualAttrPaths();
|
auto attrPaths = getActualAttrPaths();
|
||||||
|
|
||||||
for (auto & attrPath : attrPaths) {
|
for (auto & attrPath : attrPaths) {
|
||||||
debug("trying flake output attribute '%s'", attrPath);
|
debug("trying flake output attribute '%s'", attrPath);
|
||||||
|
|
||||||
auto attrOrSuggestions = root->findAlongAttrPath(
|
auto attr = root->findAlongAttrPath(parseAttrPath(state, attrPath));
|
||||||
parseAttrPath(state, attrPath),
|
if (attr) {
|
||||||
true
|
res.push_back(ref(*attr));
|
||||||
);
|
} else {
|
||||||
|
suggestions += attr.getSuggestions();
|
||||||
if (!attrOrSuggestions) {
|
}
|
||||||
suggestions += attrOrSuggestions.getSuggestions();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return *attrOrSuggestions;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (res.size() == 0)
|
||||||
throw Error(
|
throw Error(
|
||||||
suggestions,
|
suggestions,
|
||||||
"flake '%s' does not provide attribute %s",
|
"flake '%s' does not provide attribute %s",
|
||||||
flakeRef,
|
flakeRef,
|
||||||
showAttrPaths(attrPaths));
|
showAttrPaths(attrPaths));
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<flake::LockedFlake> InstallableFlake::getLockedFlake() const
|
std::shared_ptr<flake::LockedFlake> InstallableFlake::getLockedFlake() const
|
||||||
|
|
|
@ -198,10 +198,6 @@ struct InstallableFlake : InstallableValue
|
||||||
std::vector<ref<eval_cache::AttrCursor>>
|
std::vector<ref<eval_cache::AttrCursor>>
|
||||||
getCursors(EvalState & state) override;
|
getCursors(EvalState & state) override;
|
||||||
|
|
||||||
/* Get a cursor to the first attrpath in getActualAttrPaths() that
|
|
||||||
exists, or throw an exception with suggestions if none exists. */
|
|
||||||
ref<eval_cache::AttrCursor> getCursor(EvalState & state) override;
|
|
||||||
|
|
||||||
std::shared_ptr<flake::LockedFlake> getLockedFlake() const;
|
std::shared_ptr<flake::LockedFlake> getLockedFlake() const;
|
||||||
|
|
||||||
FlakeRef nixpkgsFlakeRef() const override;
|
FlakeRef nixpkgsFlakeRef() const override;
|
||||||
|
|
Loading…
Reference in a new issue