about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/primops.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 536345f2294c..6b4858d800f1 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -316,11 +316,15 @@ static Expr primBaseNameOf(EvalState & state, const ATermVector & args)
 
 
 /* Return the directory of the given path, i.e., everything before the
-   last slash. */
+   last slash.  Return either a path or a string depending on the type
+   of the argument. */
 static Expr primDirOf(EvalState & state, const ATermVector & args)
 {
     PathSet context;
-    return makeStr(dirOf(coerceToPath(state, args[0], context)), context);
+    Expr e = evalExpr(state, args[0]); ATerm dummy;
+    bool isPath = matchPath(e, dummy);
+    Path dir = dirOf(coerceToPath(state, e, context));
+    return isPath ? makePath(toATerm(dir)) : makeStr(dir, context);
 }