From ace1743f7f78bb13f99553d6e97ad1beecf1ba99 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 13 Apr 2015 15:50:17 +0200 Subject: Add separate type to represent directory paths --- build/context.txx | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'build/context.txx') diff --git a/build/context.txx b/build/context.txx index 53081b1..218c65e 100644 --- a/build/context.txx +++ b/build/context.txx @@ -46,7 +46,7 @@ namespace build template fs_status - rmdir (const path& d, const T& t) + rmdir (const dir_path& d, const T& t) { bool w (d == work); // Don't try to remove working directory. rmdir_status rs; @@ -97,4 +97,42 @@ namespace build return rs; } + + template + basic_path + relative (const basic_path& p) + { + typedef basic_path path; + + const dir_path& b (*relative_base); + + if (b.empty ()) + return p; + + if (p.sub (b)) + return p.leaf (b); + + // If base is a sub-path of {src,out}_root and this path is also a + // sub-path of it, then use '..' to form a relative path. + // + // Don't think this is a good heuristic. For example, why shouldn't + // we display paths from imported projects as relative if they are + // more readable than absolute? + // + /* + if ((work.sub (src_root) && p.sub (src_root)) || + (work.sub (out_root) && p.sub (out_root))) + return p.relative (work); + */ + + if (p.root_directory () == b.root_directory ()) + { + path r (p.relative (b)); + + if (r.string ().size () < p.string ().size ()) + return r; + } + + return p; + } } -- cgit v1.1