aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2021-12-02 10:16:00 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2021-12-02 10:19:27 +0200
commitbe57ba464fae756d5eb44cf4faf192536dec43ec (patch)
tree362b35157a2e8bd8de1e495ae0da67394c77d01a
parentd3568852ca0506666fbd1b613439a3916c76ed88 (diff)
Add $root_directory(<path>) function
-rw-r--r--libbuild2/functions-path.cxx43
-rw-r--r--tests/function/path/testscript22
2 files changed, 64 insertions, 1 deletions
diff --git a/libbuild2/functions-path.cxx b/libbuild2/functions-path.cxx
index 2953067..8362d2e 100644
--- a/libbuild2/functions-path.cxx
+++ b/libbuild2/functions-path.cxx
@@ -312,7 +312,11 @@ namespace build2
return ns;
};
- // directory
+ // $directory(<path>)
+ // $directory(<paths>)
+ //
+ // Return the directory part of the path or empty path if there is no
+ // directory. Directory of a root directory is an empty path.
//
f["directory"] += &path::directory;
@@ -346,6 +350,43 @@ namespace build2
return ns;
};
+ // $root_directory(<path>)
+ // $root_directory(<paths>)
+ //
+ // Return the root directory of the path or empty path if the directory is
+ // not absolute.
+ //
+ f["root_directory"] += &path::root_directory;
+
+ f["root_directory"] += [](paths v)
+ {
+ dir_paths r;
+ for (const path& p: v)
+ r.push_back (p.root_directory ());
+ return r;
+ };
+
+ f["root_directory"] += [](dir_paths v)
+ {
+ for (dir_path& p: v)
+ p = p.root_directory ();
+ return v;
+ };
+
+ f[".root_directory"] += [](names ns)
+ {
+ // For each path decide based on the presence of a trailing slash
+ // whether it is a directory. Return as list of directory names.
+ //
+ for (name& n: ns)
+ {
+ if (n.directory ())
+ n.dir = n.dir.root_directory ();
+ else
+ n = convert<path> (move (n)).root_directory ();
+ }
+ return ns;
+ };
// $leaf(<path>)
//
diff --git a/tests/function/path/testscript b/tests/function/path/testscript
index b0c97c9..142c866 100644
--- a/tests/function/path/testscript
+++ b/tests/function/path/testscript
@@ -49,6 +49,28 @@ if! $posix
$* <'print $path.directory(a/b c/d/)' >"a/ c/" : dir-names
}
+: root_directory
+:
+{
+ : posix
+ :
+ if $posix
+ {
+ $* <'print $root_directory([path] /a/b)' >'/' : basics
+ $* <'print $root_directory([path] /)' >'/' : root
+ }
+
+ : windows
+ :
+ if $windows
+ {
+ $* <'print $root_directory([path] "c:\\a\\b")' >'c:\' : basics
+ $* <'print $root_directory([path] "c:")' >'c:\' : root
+ }
+
+ $* <'print $root_directory([path] a/b)' >'' : relative
+}
+
: base
:
{