forked from lix-project/lix
* Cleanup: use the code shared with nix-env.
This commit is contained in:
parent
4eb637c799
commit
f848a45739
|
@ -8,6 +8,7 @@
|
||||||
#include "eval.hh"
|
#include "eval.hh"
|
||||||
#include "parser.hh"
|
#include "parser.hh"
|
||||||
#include "nixexpr-ast.hh"
|
#include "nixexpr-ast.hh"
|
||||||
|
#include "get-drvs.hh"
|
||||||
#include "help.txt.hh"
|
#include "help.txt.hh"
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,74 +33,24 @@ static int rootNr = 0;
|
||||||
static bool indirectRoot = false;
|
static bool indirectRoot = false;
|
||||||
|
|
||||||
|
|
||||||
/* Print out the paths of the resulting derivation(s). If the user
|
|
||||||
specified the `--add-root' flag, we register the derivation as a
|
|
||||||
garbage collection root and print out the path of the GC root
|
|
||||||
symlink instead. */
|
|
||||||
static void printDrvPaths(EvalState & state, Expr e)
|
|
||||||
{
|
|
||||||
ATermList es;
|
|
||||||
|
|
||||||
/* !!! duplication w.r.t. parseDerivations in nix-env */
|
|
||||||
|
|
||||||
if (matchAttrs(e, es)) {
|
|
||||||
Expr a = queryAttr(e, "type");
|
|
||||||
if (a && evalString(state, a) == "derivation") {
|
|
||||||
a = queryAttr(e, "drvPath");
|
|
||||||
if (a) {
|
|
||||||
Path drvPath = evalPath(state, a);
|
|
||||||
if (gcRoot == "")
|
|
||||||
printGCWarning();
|
|
||||||
else
|
|
||||||
drvPath = addPermRoot(drvPath,
|
|
||||||
makeRootName(gcRoot, rootNr),
|
|
||||||
indirectRoot);
|
|
||||||
cout << format("%1%\n") % drvPath;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
throw Error("bad derivation");
|
|
||||||
} else {
|
|
||||||
ATermMap drvMap;
|
|
||||||
queryAllAttrs(e, drvMap);
|
|
||||||
for (ATermIterator i(drvMap.keys()); i; ++i)
|
|
||||||
printDrvPaths(state, evalExpr(state, drvMap.get(*i)));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (matchList(e, es)) {
|
|
||||||
for (ATermIterator i(es); i; ++i)
|
|
||||||
printDrvPaths(state, evalExpr(state, *i));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ATermList formals;
|
|
||||||
ATerm body, pos;
|
|
||||||
if (matchFunction(e, formals, body, pos)) {
|
|
||||||
for (ATermIterator i(formals); i; ++i) {
|
|
||||||
Expr name, def;
|
|
||||||
if (matchNoDefFormal(*i, name))
|
|
||||||
throw Error(format("expression evaluates to a function with no-default arguments (`%1%')")
|
|
||||||
% aterm2String(name));
|
|
||||||
else if (!matchDefFormal(*i, name, def))
|
|
||||||
abort(); /* can't happen */
|
|
||||||
}
|
|
||||||
|
|
||||||
printDrvPaths(state, evalExpr(state,
|
|
||||||
makeCall(e, makeAttrs(ATermMap()))));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw Error("expression does not evaluate to one or more derivations");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void printResult(EvalState & state, Expr e, bool evalOnly)
|
static void printResult(EvalState & state, Expr e, bool evalOnly)
|
||||||
{
|
{
|
||||||
if (evalOnly)
|
if (evalOnly)
|
||||||
cout << format("%1%\n") % e;
|
cout << format("%1%\n") % e;
|
||||||
else
|
else {
|
||||||
printDrvPaths(state, e);
|
DrvInfos drvs;
|
||||||
|
getDerivations(state, e, drvs);
|
||||||
|
for (DrvInfos::iterator i = drvs.begin(); i != drvs.end(); ++i) {
|
||||||
|
Path drvPath = i->queryDrvPath(state);
|
||||||
|
if (gcRoot == "")
|
||||||
|
printGCWarning();
|
||||||
|
else
|
||||||
|
drvPath = addPermRoot(drvPath,
|
||||||
|
makeRootName(gcRoot, rootNr),
|
||||||
|
indirectRoot);
|
||||||
|
cout << format("%1%\n") % drvPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue