From c18a8d2d43f22ccf0b21461b1f0d3395d4e50c1f Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 24 Jul 2017 14:45:54 +0300 Subject: Change dir_path/string concatenation semantics --- build2/functions-path.cxx | 22 ++++++-------- tests/value/buildfile | 2 +- tests/value/concat.test | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 tests/value/concat.test 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 (move (pr)); - else - return value (path_cast (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 (move (pr)))) + : value (path_cast (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 + : + $* <>/EOO + d = [dir_path] foo + f = bar + print $d/$f + EOI + foo/bar + EOO + + : string + : + $* <>/EOO + d = [dir_path] foo + f = [string] bar + print $d/$f + EOI + foo/bar + EOO + + : leading-separator + : + $* <>/EOO + d = [dir_path] foo + f = /bar + print $d/$f + EOI + foo/bar + EOO + + : not-separated + : + $* <>/EOO + d = [dir_path] foo + f = bar + print $d$f + EOI + foo/bar + EOO +} + +: path +: +{ + : separated + : + $* <>/EOO + d = [path] foo + f = bar + print $d/$f + EOI + foo/bar + EOO + + : not-separated + : + $* <>/EOO + d = [path] foo + f = bar + print $d$f + EOI + foobar + EOO +} -- cgit v1.1