about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/primops.cc46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index dbb8f51b0243..f3d4f36537ec 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -8,11 +8,36 @@
    argument. */ 
 static Expr primImport(EvalState & state, const ATermVector & args)
 {
-    ATerm path;
-    Expr fn = evalExpr(state, args[0]);
-    if (!matchPath(fn, path))
-        throw Error("path expected");
-    return evalFile(state, aterm2String(path));
+    ATermList es;
+    Path path;
+
+    Expr arg = evalExpr(state, args[0]), arg2;
+    
+    if (matchPath(arg, arg2))
+        path = aterm2String(arg2);
+
+    else if (matchAttrs(arg, es)) {
+        Expr a = queryAttr(arg, "type");
+
+        /* If it is a derivation, we have to realise it and load the
+           Nix expression created at the derivation's output path. */
+        if (a && evalString(state, a) == "derivation") {
+            a = queryAttr(arg, "drvPath");
+            if (!a) throw Error("bad derivation in import");
+            Path drvPath = evalPath(state, a);
+
+            buildDerivations(singleton<PathSet>(drvPath));
+ 
+            a = queryAttr(arg, "outPath");
+            if (!a) throw Error("bad derivation in import");
+            path = evalPath(state, a);
+        }
+    }
+
+    if (path == "")
+        throw Error("path or derivation expected in import");
+    
+    return evalFile(state, path);
 }
 
 
@@ -339,7 +364,7 @@ static Expr primToString(EvalState & state, const ATermVector & args)
     ATerm s;
     if (matchStr(arg, s) || matchPath(arg, s) || matchUri(arg, s))
         return makeStr(s);
-    else throw Error("cannot coerce value to string");
+    throw Error("cannot coerce value to string");
 }
 
 
@@ -398,12 +423,19 @@ static Expr primCurrentSystem(EvalState & state, const ATermVector & args)
 }
 
 
+static Expr primCurrentTime(EvalState & state, const ATermVector & args)
+{
+    return ATmake("Int(<int>)", time(0));
+}
+
+
 void EvalState::addPrimOps()
 {
     addPrimOp("true", 0, primTrue);
     addPrimOp("false", 0, primFalse);
     addPrimOp("null", 0, primNull);
     addPrimOp("__currentSystem", 0, primCurrentSystem);
+    addPrimOp("__currentTime", 0, primCurrentTime);
 
     addPrimOp("import", 1, primImport);
     addPrimOp("derivation", 1, primDerivation);
@@ -413,3 +445,5 @@ void EvalState::addPrimOps()
 
     addPrimOp("map", 2, primMap);
 }
+
+