Author: eelco
Date: Thu Jan 26 13:13:00 2012
New Revision: 31851
URL: https://nixos.org/websvn/nix/?rev=31851&sc=1

Log:
* Fix importing a derivation.  This gave a segfault.

Modified:
   nix/trunk/src/libexpr/primops.cc

Modified: nix/trunk/src/libexpr/primops.cc
==============================================================================
--- nix/trunk/src/libexpr/primops.cc    Thu Jan 26 13:12:36 2012        (r31850)
+++ nix/trunk/src/libexpr/primops.cc    Thu Jan 26 13:13:00 2012        (r31851)
@@ -23,6 +23,18 @@
  *************************************************************/
 
 
+/* Decode a context string ‘!<name>!<path>’ into a pair <path,
+   name>. */
+std::pair<string, string> decodeContext(const string & s)
+{
+    if (s.at(0) == '!') {
+        size_t index = s.find("!", 1);
+        return std::pair<string, string>(string(s, index + 1), string(s, 1, 
index - 1));
+    } else
+        return std::pair<string, string>(s, "");
+}
+
+
 /* Load and evaluate an expression from path specified by the
    argument. */ 
 static void prim_import(EvalState & state, Value * * args, Value & v)
@@ -30,14 +42,17 @@
     PathSet context;
     Path path = state.coerceToPath(*args[0], context);
 
-    for (PathSet::iterator i = context.begin(); i != context.end(); ++i) {
-        assert(isStorePath(*i));
-        if (!store->isValidPath(*i))
+    foreach (PathSet::iterator, i, context) {
+        Path ctx = decodeContext(*i).first;
+        assert(isStorePath(ctx));
+        if (!store->isValidPath(ctx))
             throw EvalError(format("cannot import `%1%', since path `%2%' is 
not valid")
-                % path % *i);
-        if (isDerivation(*i))
+                % path % ctx);
+        if (isDerivation(ctx))
             try {
-                store->buildDerivations(singleton<PathSet>(*i));
+                /* !!! If using a substitute, we only need to fetch
+                   the selected output of this derivation. */
+                store->buildDerivations(singleton<PathSet>(ctx));
             } catch (Error & e) {
                 throw ImportError(e.msg());
             }
@@ -374,8 +389,8 @@
 
         /* Handle derivation outputs of the form ‘!<name>!<path>’. */
         else if (path.at(0) == '!') {
-            size_t index = path.find("!", 1);
-            drv.inputDrvs[string(path, index + 1)].insert(string(path, 1, 
index - 1));
+            std::pair<string, string> ctx = decodeContext(path);
+            drv.inputDrvs[ctx.first].insert(ctx.second);
         }
 
         /* Handle derivation contexts returned by
_______________________________________________
nix-commits mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-commits

Reply via email to