From 06208d1d8677eaea1fb56dd09832f43154bbab5d Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 21 Nov 2003 14:23:18 +0000 Subject: [PATCH] * Uninstallation. --- src/libexpr/primops.cc | 16 +++++++++++----- src/nix-env/main.cc | 11 ++++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 0979331153..481966af9e 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -93,10 +93,16 @@ static string processBinding(EvalState & state, Expr e, StoreExpr & ne) Expr a = queryAttr(e, "type"); if (a && evalString(state, a) == "derivation") { a = queryAttr(e, "drvPath"); - if (a) { - Path drvPath = evalPath(state, a); - return addInput(state, drvPath, ne); - } + if (!a) throw badTerm("derivation name missing", e); + Path drvPath = evalPath(state, a); + + a = queryAttr(e, "drvHash"); + if (!a) throw badTerm("derivation hash missing", e); + Hash drvHash = parseHash(evalString(state, a)); + + state.drvHashes[drvPath] = drvHash; + + return addInput(state, drvPath, ne); } } @@ -199,13 +205,13 @@ Expr primDerivation(EvalState & state, Expr args) ? hashString((string) outHash + outPath) : hashDerivation(state, ne); Path drvPath = writeTerm(unparseStoreExpr(ne), "-d-" + drvName); - state.drvHashes[drvPath] = drvHash; printMsg(lvlChatty, format("instantiated `%1%' -> `%2%'") % drvName % drvPath); attrs.set("outPath", ATmake("Path()", outPath.c_str())); attrs.set("drvPath", ATmake("Path()", drvPath.c_str())); + attrs.set("drvHash", ATmake("Str()", ((string) drvHash).c_str())); attrs.set("type", ATmake("Str(\"derivation\")")); return makeAttrs(attrs); diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index c391fc13c0..73166964fe 100644 --- a/src/nix-env/main.cc +++ b/src/nix-env/main.cc @@ -14,6 +14,7 @@ struct DrvInfo string name; Path drvPath; Path outPath; + Hash drvHash; }; typedef map DrvInfos; @@ -36,6 +37,10 @@ bool parseDerivation(EvalState & state, Expr e, DrvInfo & drv) if (!a) throw badTerm("derivation path missing", e); drv.drvPath = evalPath(state, a); + a = queryAttr(e, "drvHash"); + if (!a) throw badTerm("derivation hash missing", e); + drv.drvHash = parseHash(evalString(state, a)); + a = queryAttr(e, "outPath"); if (!a) throw badTerm("output path missing", e); drv.outPath = evalPath(state, a); @@ -169,10 +174,12 @@ void createUserEnv(EvalState & state, const DrvInfos & drvs) "Bind(\"type\", Str(\"derivation\")), " "Bind(\"name\", Str()), " "Bind(\"drvPath\", Path()), " + "Bind(\"drvHash\", Str()), " "Bind(\"outPath\", Path())" "])", i->second.name.c_str(), i->second.drvPath.c_str(), + ((string) i->second.drvHash).c_str(), i->second.outPath.c_str()); inputs = ATinsert(inputs, t); } @@ -280,12 +287,10 @@ void uninstallDerivations(EvalState & state, Strings drvNames) if (j == nameMap.end()) throw Error(format("unknown derivation `%1%'") % *i); else - installedDrvs.erase(j->first); + installedDrvs.erase(j->second); } createUserEnv(state, installedDrvs); -#if 0 -#endif }