forked from lix-project/lix
findAlongAttrPath(): Return position
This commit is contained in:
parent
84a3a5c3cd
commit
0b013a54dc
|
@ -32,7 +32,7 @@ static Strings parseAttrPath(const string & s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Value * findAlongAttrPath(EvalState & state, const string & attrPath,
|
std::pair<Value *, Pos> findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
Bindings & autoArgs, Value & vIn)
|
Bindings & autoArgs, Value & vIn)
|
||||||
{
|
{
|
||||||
Strings tokens = parseAttrPath(attrPath);
|
Strings tokens = parseAttrPath(attrPath);
|
||||||
|
@ -41,6 +41,7 @@ Value * findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
Error(format("attribute selection path '%1%' does not match expression") % attrPath);
|
Error(format("attribute selection path '%1%' does not match expression") % attrPath);
|
||||||
|
|
||||||
Value * v = &vIn;
|
Value * v = &vIn;
|
||||||
|
Pos pos = noPos;
|
||||||
|
|
||||||
for (auto & attr : tokens) {
|
for (auto & attr : tokens) {
|
||||||
|
|
||||||
|
@ -72,6 +73,7 @@ Value * findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
if (a == v->attrs->end())
|
if (a == v->attrs->end())
|
||||||
throw AttrPathNotFound("attribute '%1%' in selection path '%2%' not found", attr, attrPath);
|
throw AttrPathNotFound("attribute '%1%' in selection path '%2%' not found", attr, attrPath);
|
||||||
v = &*a->value;
|
v = &*a->value;
|
||||||
|
pos = *a->pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (apType == apIndex) {
|
else if (apType == apIndex) {
|
||||||
|
@ -85,11 +87,12 @@ Value * findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
throw AttrPathNotFound("list index %1% in selection path '%2%' is out of range", attrIndex, attrPath);
|
throw AttrPathNotFound("list index %1% in selection path '%2%' is out of range", attrIndex, attrPath);
|
||||||
|
|
||||||
v = v->listElems()[attrIndex];
|
v = v->listElems()[attrIndex];
|
||||||
|
pos = noPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return v;
|
return {v, pos};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -98,7 +101,7 @@ Pos findDerivationFilename(EvalState & state, Value & v, std::string what)
|
||||||
Value * v2;
|
Value * v2;
|
||||||
try {
|
try {
|
||||||
auto dummyArgs = state.allocBindings(0);
|
auto dummyArgs = state.allocBindings(0);
|
||||||
v2 = findAlongAttrPath(state, "meta.position", *dummyArgs, v);
|
v2 = findAlongAttrPath(state, "meta.position", *dummyArgs, v).first;
|
||||||
} catch (Error &) {
|
} catch (Error &) {
|
||||||
throw Error("package '%s' has no source location information", what);
|
throw Error("package '%s' has no source location information", what);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace nix {
|
||||||
|
|
||||||
MakeError(AttrPathNotFound, Error);
|
MakeError(AttrPathNotFound, Error);
|
||||||
|
|
||||||
Value * findAlongAttrPath(EvalState & state, const string & attrPath,
|
std::pair<Value *, Pos> findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
Bindings & autoArgs, Value & vIn);
|
Bindings & autoArgs, Value & vIn);
|
||||||
|
|
||||||
/* Heuristic to find the filename and lineno or a nix value. */
|
/* Heuristic to find the filename and lineno or a nix value. */
|
||||||
|
|
|
@ -309,7 +309,7 @@ static void _main(int argc, char * * argv)
|
||||||
state->eval(e, vRoot);
|
state->eval(e, vRoot);
|
||||||
|
|
||||||
for (auto & i : attrPaths) {
|
for (auto & i : attrPaths) {
|
||||||
Value & v(*findAlongAttrPath(*state, i, *autoArgs, vRoot));
|
Value & v(*findAlongAttrPath(*state, i, *autoArgs, vRoot).first);
|
||||||
state->forceValue(v);
|
state->forceValue(v);
|
||||||
getDerivations(*state, v, "", *autoArgs, drvs, false);
|
getDerivations(*state, v, "", *autoArgs, drvs, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -178,7 +178,7 @@ static void loadDerivations(EvalState & state, Path nixExprPath,
|
||||||
Value vRoot;
|
Value vRoot;
|
||||||
loadSourceExpr(state, nixExprPath, vRoot);
|
loadSourceExpr(state, nixExprPath, vRoot);
|
||||||
|
|
||||||
Value & v(*findAlongAttrPath(state, pathPrefix, autoArgs, vRoot));
|
Value & v(*findAlongAttrPath(state, pathPrefix, autoArgs, vRoot).first);
|
||||||
|
|
||||||
getDerivations(state, v, pathPrefix, autoArgs, elems, true);
|
getDerivations(state, v, pathPrefix, autoArgs, elems, true);
|
||||||
|
|
||||||
|
@ -408,7 +408,7 @@ static void queryInstSources(EvalState & state,
|
||||||
Value vRoot;
|
Value vRoot;
|
||||||
loadSourceExpr(state, instSource.nixExprPath, vRoot);
|
loadSourceExpr(state, instSource.nixExprPath, vRoot);
|
||||||
for (auto & i : args) {
|
for (auto & i : args) {
|
||||||
Value & v(*findAlongAttrPath(state, i, *instSource.autoArgs, vRoot));
|
Value & v(*findAlongAttrPath(state, i, *instSource.autoArgs, vRoot).first);
|
||||||
getDerivations(state, v, "", *instSource.autoArgs, elems, true);
|
getDerivations(state, v, "", *instSource.autoArgs, elems, true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -39,7 +39,7 @@ void processExpr(EvalState & state, const Strings & attrPaths,
|
||||||
state.eval(e, vRoot);
|
state.eval(e, vRoot);
|
||||||
|
|
||||||
for (auto & i : attrPaths) {
|
for (auto & i : attrPaths) {
|
||||||
Value & v(*findAlongAttrPath(state, i, autoArgs, vRoot));
|
Value & v(*findAlongAttrPath(state, i, autoArgs, vRoot).first);
|
||||||
state.forceValue(v);
|
state.forceValue(v);
|
||||||
|
|
||||||
PathSet context;
|
PathSet context;
|
||||||
|
|
|
@ -120,7 +120,7 @@ static int _main(int argc, char * * argv)
|
||||||
Path path = resolveExprPath(lookupFileArg(*state, args.empty() ? "." : args[0]));
|
Path path = resolveExprPath(lookupFileArg(*state, args.empty() ? "." : args[0]));
|
||||||
Value vRoot;
|
Value vRoot;
|
||||||
state->evalFile(path, vRoot);
|
state->evalFile(path, vRoot);
|
||||||
Value & v(*findAlongAttrPath(*state, attrPath, autoArgs, vRoot));
|
Value & v(*findAlongAttrPath(*state, attrPath, autoArgs, vRoot).first);
|
||||||
state->forceAttrs(v);
|
state->forceAttrs(v);
|
||||||
|
|
||||||
/* Extract the URI. */
|
/* Extract the URI. */
|
||||||
|
|
|
@ -348,7 +348,7 @@ struct CmdFlakeCheck : FlakeCommand
|
||||||
Activity act(*logger, lvlChatty, actUnknown,
|
Activity act(*logger, lvlChatty, actUnknown,
|
||||||
fmt("checking NixOS configuration '%s'", attrPath));
|
fmt("checking NixOS configuration '%s'", attrPath));
|
||||||
Bindings & bindings(*state->allocBindings(0));
|
Bindings & bindings(*state->allocBindings(0));
|
||||||
auto vToplevel = findAlongAttrPath(*state, "config.system.build.toplevel", bindings, v);
|
auto vToplevel = findAlongAttrPath(*state, "config.system.build.toplevel", bindings, v).first;
|
||||||
state->forceAttrs(*vToplevel, pos);
|
state->forceAttrs(*vToplevel, pos);
|
||||||
if (!state->isDerivation(*vToplevel))
|
if (!state->isDerivation(*vToplevel))
|
||||||
throw Error("attribute 'config.system.build.toplevel' is not a derivation");
|
throw Error("attribute 'config.system.build.toplevel' is not a derivation");
|
||||||
|
|
|
@ -250,7 +250,7 @@ struct InstallableAttrPath : InstallableValue
|
||||||
|
|
||||||
Value * toValue(EvalState & state) override
|
Value * toValue(EvalState & state) override
|
||||||
{
|
{
|
||||||
auto vRes = findAlongAttrPath(state, attrPath, *cmd.getAutoArgs(state), *v);
|
auto vRes = findAlongAttrPath(state, attrPath, *cmd.getAutoArgs(state), *v).first;
|
||||||
state.forceValue(*vRes);
|
state.forceValue(*vRes);
|
||||||
return vRes;
|
return vRes;
|
||||||
}
|
}
|
||||||
|
@ -360,7 +360,7 @@ std::tuple<std::string, FlakeRef, flake::EvalCache::Derivation> InstallableFlake
|
||||||
vOutputs = getFlakeOutputs(*state, lockedFlake);
|
vOutputs = getFlakeOutputs(*state, lockedFlake);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto * v = findAlongAttrPath(*state, attrPath, *emptyArgs, *vOutputs);
|
auto * v = findAlongAttrPath(*state, attrPath, *emptyArgs, *vOutputs).first;
|
||||||
state->forceValue(*v);
|
state->forceValue(*v);
|
||||||
|
|
||||||
auto drvInfo = getDerivation(*state, *v, false);
|
auto drvInfo = getDerivation(*state, *v, false);
|
||||||
|
@ -401,7 +401,7 @@ Value * InstallableFlake::toValue(EvalState & state)
|
||||||
|
|
||||||
for (auto & attrPath : getActualAttrPaths()) {
|
for (auto & attrPath : getActualAttrPaths()) {
|
||||||
try {
|
try {
|
||||||
auto * v = findAlongAttrPath(state, attrPath, *emptyArgs, *vOutputs);
|
auto * v = findAlongAttrPath(state, attrPath, *emptyArgs, *vOutputs).first;
|
||||||
state.forceValue(*v);
|
state.forceValue(*v);
|
||||||
return v;
|
return v;
|
||||||
} catch (AttrPathNotFound & e) {
|
} catch (AttrPathNotFound & e) {
|
||||||
|
|
|
@ -145,7 +145,7 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand
|
||||||
auto v = state->allocValue();
|
auto v = state->allocValue();
|
||||||
state->eval(state->parseExprFromString(*res.data, "/no-such-path"), *v);
|
state->eval(state->parseExprFromString(*res.data, "/no-such-path"), *v);
|
||||||
Bindings & bindings(*state->allocBindings(0));
|
Bindings & bindings(*state->allocBindings(0));
|
||||||
auto v2 = findAlongAttrPath(*state, settings.thisSystem, bindings, *v);
|
auto v2 = findAlongAttrPath(*state, settings.thisSystem, bindings, *v).first;
|
||||||
|
|
||||||
return store->parseStorePath(state->forceString(*v2));
|
return store->parseStorePath(state->forceString(*v2));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue