aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-11-21 14:23:18 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-11-21 14:23:18 +0000
commit06208d1d8677eaea1fb56dd09832f43154bbab5d (patch)
treea7e8ba6cb611048b5e35e9ad53a49554ed22a611
parent2e9042bd1e7e3a322f072f0bf98510698afa626a (diff)
* Uninstallation.
-rw-r--r--src/libexpr/primops.cc16
-rw-r--r--src/nix-env/main.cc11
2 files changed, 19 insertions, 8 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 097933115..481966af9 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(<str>)", outPath.c_str()));
attrs.set("drvPath", ATmake("Path(<str>)", drvPath.c_str()));
+ attrs.set("drvHash", ATmake("Str(<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 c391fc13c..73166964f 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<Path, DrvInfo> 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(<str>)), "
"Bind(\"drvPath\", Path(<str>)), "
+ "Bind(\"drvHash\", Str(<str>)), "
"Bind(\"outPath\", Path(<str>))"
"])",
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
}