about summary refs log tree commit diff
diff options
context:
space:
mode:
-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 097933115342..481966af9e3e 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 c391fc13c06f..73166964fe9b 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
 }