From: Carl Hetherington Date: Mon, 9 Oct 2023 22:40:00 +0000 (+0200) Subject: Implement weakly_canonical for boost versions without it (e.g. the one on Ubuntu... X-Git-Tag: v1.8.84~6 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=6d1582f3c4b5afe57bdc3c34dada275a05a961a4;hp=d70c44e87632a69a2b8bc90db7ca4b06b7aa611d;p=libdcp.git Implement weakly_canonical for boost versions without it (e.g. the one on Ubuntu 16.04). --- diff --git a/src/filesystem.cc b/src/filesystem.cc index 0ebe7cf7..428bb029 100644 --- a/src/filesystem.cc +++ b/src/filesystem.cc @@ -144,7 +144,26 @@ dcp::filesystem::canonical(boost::filesystem::path const& path) boost::filesystem::path dcp::filesystem::weakly_canonical(boost::filesystem::path const& path) { +#ifdef DCPOMATIC_HAVE_WEAKLY_CANONICAL return dcp::filesystem::unfix_long_path(boost::filesystem::weakly_canonical(dcp::filesystem::fix_long_path(path))); +#else + boost::filesystem::path complete(boost::filesystem::system_complete(dcp::filesystem::fix_long_path(path))); + boost::filesystem::path result; + for (auto part: complete) { + if (part == "..") { + boost::system::error_code ec; + if (boost::filesystem::is_symlink(result, ec) || result.filename() == "..") { + result /= part; + } else { + result = result.parent_path(); + } + } else if (part != ".") { + result /= part; + } + } + + return dcp::filesystem::unfix_long_path(result.make_preferred()); +#endif } diff --git a/test/filesystem_test.cc b/test/filesystem_test.cc index fc13db99..90b7761e 100644 --- a/test/filesystem_test.cc +++ b/test/filesystem_test.cc @@ -95,3 +95,18 @@ BOOST_AUTO_TEST_CASE (windows_long_filename_test) } #endif + +BOOST_AUTO_TEST_CASE(weakly_canonical_test) +{ +#ifdef LIBDCP_WINDOWS + BOOST_CHECK(dcp::filesystem::weakly_canonical("c:\\a\\b\\c") == boost::filesystem::path("c:\\a\\b\\c")); + BOOST_CHECK(dcp::filesystem::weakly_canonical("c:\\a\\b\\..\\c") == boost::filesystem::path("c:\\a\\c")); + BOOST_CHECK(dcp::filesystem::weakly_canonical("c:\\a\\b\\..\\c\\.\\d") == boost::filesystem::path("c:\\a\\c\\d")); + BOOST_CHECK(dcp::filesystem::weakly_canonical("c:\\a\\..\\b\\..\\c") == boost::filesystem::path("c:\\c")); +#else + BOOST_CHECK(dcp::filesystem::weakly_canonical("/a/b/c") == boost::filesystem::path("/a/b/c")); + BOOST_CHECK(dcp::filesystem::weakly_canonical("/a/b/../c") == boost::filesystem::path("/a/c")); + BOOST_CHECK(dcp::filesystem::weakly_canonical("/a/b/../c/./d") == boost::filesystem::path("/a/c/d")); + BOOST_CHECK(dcp::filesystem::weakly_canonical("/a/../b/../c") == boost::filesystem::path("/c")); +#endif +} diff --git a/wscript b/wscript index 458d6132..d813c536 100644 --- a/wscript +++ b/wscript @@ -213,6 +213,15 @@ def configure(conf): lib=['boost_filesystem%s' % boost_lib_suffix, 'boost_system%s' % boost_lib_suffix], uselib_store='BOOST_FILESYSTEM') + conf.check_cxx(fragment=""" + #include \n + int main() { boost::filesystem::weakly_canonical("a/b/c"); }\n + """, + mandatory=False, + msg='Checking for boost::filesystem::weakly_canonical', + uselib='BOOST_FILESYSTEM', + define_name='LIBDCP_HAVE_WEAKLY_CANONICAL') + conf.check_cxx(fragment=""" #include \n int main() { boost::signals2::signal x; }\n