Skip to content

Commit

Permalink
Merge pull request #7667 from dramforever/flake-search-attr
Browse files Browse the repository at this point in the history
Better error message for nix search when attr is not found
  • Loading branch information
thufschmitt committed Feb 1, 2023
2 parents 6f0436a + 6b779e4 commit e32c5c2
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 43 deletions.
51 changes: 16 additions & 35 deletions src/libcmd/installables.cc
Original file line number Diff line number Diff line change
Expand Up @@ -379,10 +379,9 @@ Installable::getCursors(EvalState & state)
ref<eval_cache::AttrCursor>
Installable::getCursor(EvalState & state)
{
auto cursors = getCursors(state);
if (cursors.empty())
throw Error("cannot find flake attribute '%s'", what());
return cursors[0];
/* Although getCursors should return at least one element, in case it doesn't,
bound check to avoid an undefined behavior for vector[0] */
return getCursors(state).at(0);
}

static StorePath getDeriver(
Expand Down Expand Up @@ -696,46 +695,28 @@ InstallableFlake::getCursors(EvalState & state)

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;

auto attrPaths = getActualAttrPaths();

for (auto & attrPath : attrPaths) {
debug("trying flake output attribute '%s'", attrPath);

auto attrOrSuggestions = root->findAlongAttrPath(
parseAttrPath(state, attrPath),
true
);

if (!attrOrSuggestions) {
suggestions += attrOrSuggestions.getSuggestions();
continue;
auto attr = root->findAlongAttrPath(parseAttrPath(state, attrPath));
if (attr) {
res.push_back(ref(*attr));
} else {
suggestions += attr.getSuggestions();
}

return *attrOrSuggestions;
}

throw Error(
suggestions,
"flake '%s' does not provide attribute %s",
flakeRef,
showAttrPaths(attrPaths));
if (res.size() == 0)
throw Error(
suggestions,
"flake '%s' does not provide attribute %s",
flakeRef,
showAttrPaths(attrPaths));

return res;
}

std::shared_ptr<flake::LockedFlake> InstallableFlake::getLockedFlake() const
Expand Down
12 changes: 6 additions & 6 deletions src/libcmd/installables.hh
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,13 @@ struct Installable
return {};
}

/* Get a cursor to each value this Installable could refer to. However
if none exists, throw exception instead of returning empty vector. */
virtual std::vector<ref<eval_cache::AttrCursor>>
getCursors(EvalState & state);

/* Get the first and most preferred cursor this Installable could refer
to, or throw an exception if none exists. */
virtual ref<eval_cache::AttrCursor>
getCursor(EvalState & state);

Expand Down Expand Up @@ -193,15 +197,11 @@ struct InstallableFlake : InstallableValue

std::pair<Value *, PosIdx> toValue(EvalState & state) override;

/* Get a cursor to every attrpath in getActualAttrPaths() that
exists. */
/* Get a cursor to every attrpath in getActualAttrPaths()
that exists. However if none exists, throw an exception. */
std::vector<ref<eval_cache::AttrCursor>>
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;

FlakeRef nixpkgsFlakeRef() const override;
Expand Down
4 changes: 2 additions & 2 deletions src/nix/search.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ struct CmdSearch : InstallableCommand, MixJSON
Strings getDefaultFlakeAttrPaths() override
{
return {
"packages." + settings.thisSystem.get() + ".",
"legacyPackages." + settings.thisSystem.get() + "."
"packages." + settings.thisSystem.get(),
"legacyPackages." + settings.thisSystem.get()
};
}

Expand Down

0 comments on commit e32c5c2

Please sign in to comment.