diff options
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/eval.hh | 4 | ||||
-rw-r--r-- | src/libexpr/primops.cc | 16 |
2 files changed, 14 insertions, 6 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index b51a5b079..8ea0aec06 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -8,7 +8,7 @@ #include "nixexpr.hh" -typedef map<Path, PathSet> DrvPaths; +typedef map<Path, PathSet> DrvRoots; typedef map<Path, Hash> DrvHashes; struct EvalState; @@ -22,7 +22,7 @@ struct EvalState { ATermMap normalForms; ATermMap primOps; - DrvPaths drvPaths; + DrvRoots drvRoots; DrvHashes drvHashes; /* normalised derivation hashes */ Expr blackHole; diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 6588922c2..070ed1b54 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -17,12 +17,12 @@ static Expr primImport(EvalState & state, const ATermVector & args) static PathSet storeExprRootsCached(EvalState & state, const Path & nePath) { - DrvPaths::iterator i = state.drvPaths.find(nePath); - if (i != state.drvPaths.end()) + DrvRoots::iterator i = state.drvRoots.find(nePath); + if (i != state.drvRoots.end()) return i->second; else { PathSet paths = storeExprRoots(nePath); - state.drvPaths[nePath] = paths; + state.drvRoots[nePath] = paths; return paths; } } @@ -61,6 +61,8 @@ static Path copyAtom(EvalState & state, const Path & srcPath) Path drvPath = writeTerm(unparseStoreExpr(ne), ""); state.drvHashes[drvPath] = drvHash; + state.drvRoots[drvPath] = ne.closure.roots; + printMsg(lvlChatty, format("copied `%1%' -> closure `%2%'") % srcPath % drvPath); return drvPath; @@ -111,8 +113,14 @@ static void processBinding(EvalState & state, Expr e, StoreExpr & ne, if (!a) throw Error("derivation hash missing"); Hash drvHash = parseHash(evalString(state, a)); - state.drvHashes[drvPath] = drvHash; + a = queryAttr(e, "outPath"); + if (!a) throw Error("output path missing"); + PathSet drvRoots; + drvRoots.insert(evalPath(state, a)); + state.drvHashes[drvPath] = drvHash; + state.drvRoots[drvPath] = drvRoots; + ss.push_back(addInput(state, drvPath, ne)); } else throw Error("invalid derivation attribute"); |