diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-09-24T21·39+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-09-24T21·39+0000 |
commit | e347033f718e23d1ae6821207124465fedc73db1 (patch) | |
tree | be95b4b29e760568c25f722f855ff569ade52ff7 | |
parent | 0e705391dbe5340154d59106e591671923d107d0 (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.cc | 1 | ||||
-rw-r--r-- | src/libexpr/primops.cc | 16 |
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)) { |