aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build2/functions-path.cxx22
-rw-r--r--tests/value/buildfile2
-rw-r--r--tests/value/concat.test73
3 files changed, 82 insertions, 15 deletions
diff --git a/build2/functions-path.cxx b/build2/functions-path.cxx
index 81cd01f..4542858 100644
--- a/build2/functions-path.cxx
+++ b/build2/functions-path.cxx
@@ -48,23 +48,17 @@ namespace build2
concat_dir_path_string (dir_path l, string sr)
{
if (path::traits::is_separator (sr[0])) // '\0' if empty.
- {
sr.erase (0, 1);
- path pr (move (sr));
- pr.canonicalize (); // Convert to canonical directory separators.
- // If RHS is syntactically a directory (ends with a trailing slash),
- // then return it as dir_path, not path.
- //
- if (pr.to_directory () || pr.empty ())
- l /= path_cast<dir_path> (move (pr));
- else
- return value (path_cast<path> (move (l)) /= pr);
- }
- else
- l += sr;
+ path pr (move (sr));
+ pr.canonicalize (); // Convert to canonical directory separators.
- return value (move (l));
+ // If RHS is syntactically a directory (ends with a trailing slash), then
+ // return it as dir_path, not path.
+ //
+ return pr.to_directory () || pr.empty ()
+ ? value (move (l /= path_cast<dir_path> (move (pr))))
+ : value (path_cast<path> (move (l)) /= pr);
}
void
diff --git a/tests/value/buildfile b/tests/value/buildfile
index ce246a4..ac45282 100644
--- a/tests/value/buildfile
+++ b/tests/value/buildfile
@@ -2,4 +2,4 @@
# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
# license : MIT; see accompanying LICENSE file
-./: test{*}
+./: test{*} $b
diff --git a/tests/value/concat.test b/tests/value/concat.test
new file mode 100644
index 0000000..8cf6e38
--- /dev/null
+++ b/tests/value/concat.test
@@ -0,0 +1,73 @@
+# file : tests/value/concat.test
+# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+.include ../common.test
+
+: dir_path
+:
+{
+ : name
+ :
+ $* <<EOI >>/EOO
+ d = [dir_path] foo
+ f = bar
+ print $d/$f
+ EOI
+ foo/bar
+ EOO
+
+ : string
+ :
+ $* <<EOI >>/EOO
+ d = [dir_path] foo
+ f = [string] bar
+ print $d/$f
+ EOI
+ foo/bar
+ EOO
+
+ : leading-separator
+ :
+ $* <<EOI >>/EOO
+ d = [dir_path] foo
+ f = /bar
+ print $d/$f
+ EOI
+ foo/bar
+ EOO
+
+ : not-separated
+ :
+ $* <<EOI >>/EOO
+ d = [dir_path] foo
+ f = bar
+ print $d$f
+ EOI
+ foo/bar
+ EOO
+}
+
+: path
+:
+{
+ : separated
+ :
+ $* <<EOI >>/EOO
+ d = [path] foo
+ f = bar
+ print $d/$f
+ EOI
+ foo/bar
+ EOO
+
+ : not-separated
+ :
+ $* <<EOI >>/EOO
+ d = [path] foo
+ f = bar
+ print $d$f
+ EOI
+ foobar
+ EOO
+}