about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/eval.cc38
-rw-r--r--src/test-builder-2.sh5
-rw-r--r--src/test.cc13
3 files changed, 44 insertions, 12 deletions
diff --git a/src/eval.cc b/src/eval.cc
index c96cf6467ecc..e6a3478a1551 100644
--- a/src/eval.cc
+++ b/src/eval.cc
@@ -165,7 +165,7 @@ static Hash computeDerived(Hash sourceHash, string targetName,
 
     /* Register targetHash -> targetPath.  !!! this should be in
        values.cc. */
-    setDB(nixDB, dbNFs, sourceHash, targetName);
+    setDB(nixDB, dbRefs, targetHash, targetName);
 
     /* Register that targetHash was produced by evaluating
        sourceHash; i.e., that targetHash is a normal form of
@@ -227,6 +227,34 @@ static Hash evalExternal(Expr e)
 }
 
 
+/* Evaluate a list of arguments into normal form. */
+void evalArgs(ATermList args, ATermList & argsNF, Environment & env)
+{
+    argsNF = ATempty;
+
+    while (!ATisEmpty(args)) {
+        ATerm eName, eVal, arg = ATgetFirst(args);
+        if (!ATmatch(arg, "Tup(<term>, <term>)", &eName, &eVal))
+            throw badTerm("invalid argument", arg);
+
+        string name = evalString(eName);
+        eVal = evalValue(eVal).e;
+
+        char * s;
+        if (ATmatch(eVal, "Str(<str>)", &s)) {
+            env[name] = s;
+        } else if (ATmatch(eVal, "External(<str>)", &s)) {
+            env[name] = queryValuePath(parseHash(s));
+        } else throw badTerm("invalid argument value", eVal);
+
+        argsNF = ATappend(argsNF,
+            ATmake("Tup(Str(<str>), <term>)", name.c_str(), eVal));
+
+        args = ATgetNext(args);
+    }
+}
+
+
 /* Evaluate an expression. */
 EvalResult evalValue(Expr e)
 {
@@ -263,12 +291,8 @@ EvalResult evalValue(Expr e)
         Hash prog = evalExternal(eProg);
 
         Environment env;
-        while (!ATisEmpty(args)) {
-            debug("arg");
-            Expr arg = ATgetFirst(args);
-            throw badTerm("foo", arg);
-            args = ATgetNext(args);
-        }
+        ATermList argsNF;
+        evalArgs(args, argsNF, env);
 
         Hash sourceHash = hashExpr(
             ATmake("Exec(Str(<str>), External(<str>), [])",
diff --git a/src/test-builder-2.sh b/src/test-builder-2.sh
index 25a66532ff4d..010e1c80576b 100644
--- a/src/test-builder-2.sh
+++ b/src/test-builder-2.sh
@@ -1,5 +1,8 @@
 #! /bin/sh
 
+echo "builder 2"
+
 mkdir $out || exit 1
 cd $out || exit 1
-echo "Hello World" > bla
+echo "Hallo Wereld" > bla
+cat $src >> bla
\ No newline at end of file
diff --git a/src/test.cc b/src/test.cc
index b37a16a1fe0c..bf7ee191f0b7 100644
--- a/src/test.cc
+++ b/src/test.cc
@@ -74,13 +74,18 @@ void runTests()
 
     Hash builder1 = addValue("./test-builder-1.sh");
 
-    evalTest(ATmake("Exec(Str(<str>), External(<str>), [])",
-        thisSystem.c_str(), ((string) builder1).c_str()));
+    Expr e1 = ATmake("Exec(Str(<str>), External(<str>), [])",
+        thisSystem.c_str(), ((string) builder1).c_str());
+
+    evalTest(e1);
 
     Hash builder2 = addValue("./test-builder-2.sh");
 
-    evalTest(ATmake("Exec(Str(<str>), External(<str>), [])",
-        thisSystem.c_str(), ((string) builder2).c_str()));
+    Expr e2 = ATmake(
+        "Exec(Str(<str>), External(<str>), [Tup(Str(\"src\"), <term>)])",
+        thisSystem.c_str(), ((string) builder2).c_str(), e1);
+
+    evalTest(e2);
 }