about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-09-24T21·39+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-09-24T21·39+0000
commite347033f718e23d1ae6821207124465fedc73db1 (patch)
treebe95b4b29e760568c25f722f855ff569ade52ff7
parent0e705391dbe5340154d59106e591671923d107d0 (diff)
* The result of a concatenation with a derivation on the left-hand
  side should be a path, I guess.
* Handle paths that are in the store but not direct children of the
  store directory.
* Ugh, hack to prevent double context wrapping.

-rw-r--r--src/libexpr/eval.cc1
-rw-r--r--src/libexpr/primops.cc16
2 files changed, 13 insertions, 4 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 3334e4bbded8..416d43b33b7e 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -267,6 +267,7 @@ string coerceToStringWithContext(EvalState & state,
         if (a && evalString(state, a) == "derivation") {
             a = attrs.get(toATerm("outPath"));
             if (!a) throw TypeError("output path missing from derivation");
+            isPath = true;
             context = ATinsert(context, e);
             return evalPath(state, a);
         }
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 96ce4f71e645..9a856ca40d21 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -114,7 +114,9 @@ void toString(EvalState & state, Expr e,
     int n;
     Expr e2;
 
+    bool isWrapped = false;
     while (matchContext(e, es, e2)) {
+        isWrapped = true;
         e = e2;
         for (ATermIterator i(es); i; ++i)
             context = ATinsert(context, *i);
@@ -146,7 +148,7 @@ void toString(EvalState & state, Expr e,
     else if (matchPath(e, s)) {
         Path path(canonPath(aterm2String(s)));
 
-        if (!isStorePath(path)) {
+        if (!isInStore(path)) {
 
             if (isDerivation(path))
                 throw EvalError(format("file names are not allowed to end in `%1%'")
@@ -162,11 +164,17 @@ void toString(EvalState & state, Expr e,
                     % path % dstPath);
             }
 
-            path = dstPath;
+            result += dstPath;
+            context = ATinsert(context, makePath(toATerm(dstPath)));
         }
 
-        result += path;
-        context = ATinsert(context, makePath(toATerm(path)));
+        else {
+            result += path;
+            /* !!! smells hacky.  Check whether this is the Right
+               Thing To Do. */
+            if (!isWrapped)
+                context = ATinsert(context, makePath(toATerm(toStorePath(path))));
+        }
     }
     
     else if (matchList(e, es)) {