diff options
Diffstat (limited to 'src/libexpr/get-drvs.cc')
-rw-r--r-- | src/libexpr/get-drvs.cc | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc new file mode 100644 index 000000000000..c158a71dff5c --- /dev/null +++ b/src/libexpr/get-drvs.cc @@ -0,0 +1,67 @@ +#include "get-drvs.hh" +#include "nixexpr-ast.hh" + + +bool getDerivation(EvalState & state, Expr e, DrvInfo & drv) +{ + ATermList es; + e = evalExpr(state, e); + if (!matchAttrs(e, es)) return false; + + ATermMap attrs; + queryAllAttrs(e, attrs, false); + + Expr a = attrs.get("type"); + if (!a || evalString(state, a) != "derivation") return false; + + a = attrs.get("name"); + if (!a) throw badTerm("derivation name missing", e); + drv.name = evalString(state, a); + + a = attrs.get("system"); + if (!a) + drv.system = "unknown"; + else + drv.system = evalString(state, a); + + drv.attrs = attrs; + + return true; +} + + +void getDerivations(EvalState & state, Expr e, DrvInfos & drvs) +{ + ATermList es; + DrvInfo drv; + + e = evalExpr(state, e); + + if (getDerivation(state, e, drv)) + drvs.push_back(drv); + + else if (matchAttrs(e, es)) { + ATermMap drvMap; + queryAllAttrs(e, drvMap); + for (ATermIterator i(drvMap.keys()); i; ++i) { + debug(format("evaluating attribute `%1%'") % aterm2String(*i)); + if (getDerivation(state, drvMap.get(*i), drv)) + drvs.push_back(drv); + else + ; + // parseDerivations(state, drvMap.get(*i), drvs); + } + } + + else if (matchList(e, es)) { + for (ATermIterator i(es); i; ++i) { + debug(format("evaluating list element")); + if (getDerivation(state, *i, drv)) + drvs.push_back(drv); + else + getDerivations(state, *i, drvs); + } + } +} + + |