aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-07-19 16:06:10 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-07-20 13:33:13 +0200
commit57a30e101b36a064f09619bf4a3f0b8a3fdcdcad (patch)
treea9be7e2f1fc773ee7944d58be9b6593e26a10e88 /src
parentfc3568e2633bf3faa234509cfc6034be95f10b6e (diff)
nix search: Ignore top-level eval errors
$NIX_PATH may contain elements that don't evaluate to an attrset (like "nixos-config"), so ignore those.
Diffstat (limited to 'src')
-rw-r--r--src/nix/installables.cc6
-rw-r--r--src/nix/search.cc9
2 files changed, 13 insertions, 2 deletions
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index 4da736f4d..59162fdc1 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -16,6 +16,8 @@ Value * SourceExprCommand::getSourceExpr(EvalState & state)
{
if (vSourceExpr) return vSourceExpr;
+ auto sToplevel = state.symbols.create("_toplevel");
+
vSourceExpr = state.allocValue();
if (file != "") {
@@ -29,7 +31,9 @@ Value * SourceExprCommand::getSourceExpr(EvalState & state)
auto searchPath = state.getSearchPath();
- state.mkAttrs(*vSourceExpr, searchPath.size());
+ state.mkAttrs(*vSourceExpr, searchPath.size() + 1);
+
+ mkBool(*state.allocAttr(*vSourceExpr, sToplevel), true);
std::unordered_set<std::string> seen;
diff --git a/src/nix/search.cc b/src/nix/search.cc
index 8aac06ad2..970dcb983 100644
--- a/src/nix/search.cc
+++ b/src/nix/search.cc
@@ -54,6 +54,8 @@ struct CmdSearch : SourceExprCommand, MixJSON
auto jsonOut = json ? std::make_unique<JSONObject>(std::cout, true) : nullptr;
+ auto sToplevel = state->symbols.create("_toplevel");
+
doExpr = [&](Value * v, std::string attrPath, bool toplevel) {
debug("at attribute ā€˜%sā€™", attrPath);
@@ -123,7 +125,7 @@ struct CmdSearch : SourceExprCommand, MixJSON
if (j == attrs->end() || !state->forceBool(*j->value, *j->pos)) return;
}
- Bindings::iterator j = v->attrs->find(state->symbols.create("_toplevel"));
+ Bindings::iterator j = v->attrs->find(sToplevel);
bool toplevel2 = j != v->attrs->end() && state->forceBool(*j->value, *j->pos);
for (auto & i : *v->attrs) {
@@ -134,6 +136,11 @@ struct CmdSearch : SourceExprCommand, MixJSON
}
} catch (AssertionError & e) {
+ } catch (Error & e) {
+ if (!toplevel) {
+ e.addPrefix(fmt("While evaluating the attribute ā€˜%sā€™:\n", attrPath));
+ throw;
+ }
}
};