Repository: mesos Updated Branches: refs/heads/master 602e40c8c -> b08fccf8f
Switched path::join() to be variadic Review: https://reviews.apache.org/r/25818 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/b08fccf8 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/b08fccf8 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/b08fccf8 Branch: refs/heads/master Commit: b08fccf8f5ea325b8c38055b5f2c03509744dd9b Parents: 602e40c Author: Cody Maloney <[email protected]> Authored: Wed Oct 1 17:10:03 2014 -0700 Committer: Adam B <[email protected]> Committed: Wed Oct 1 17:10:03 2014 -0700 ---------------------------------------------------------------------- 3rdparty/libprocess/3rdparty/Makefile.am | 1 + 3rdparty/libprocess/3rdparty/stout/Makefile.am | 1 + .../3rdparty/stout/include/stout/path.hpp | 77 ++++++++------------ .../3rdparty/stout/include/stout/strings.hpp | 6 ++ .../3rdparty/stout/tests/path_tests.cpp | 39 ++++++++++ 5 files changed, 79 insertions(+), 45 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/b08fccf8/3rdparty/libprocess/3rdparty/Makefile.am ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/3rdparty/Makefile.am b/3rdparty/libprocess/3rdparty/Makefile.am index bd1dc8d..256df0b 100644 --- a/3rdparty/libprocess/3rdparty/Makefile.am +++ b/3rdparty/libprocess/3rdparty/Makefile.am @@ -162,6 +162,7 @@ stout_tests_SOURCES = \ $(STOUT)/tests/none_tests.cpp \ $(STOUT)/tests/option_tests.cpp \ $(STOUT)/tests/os_tests.cpp \ + $(STOUT)/tests/path_tests.cpp \ $(STOUT)/tests/protobuf_tests.cpp \ $(STOUT)/tests/protobuf_tests.pb.cc \ $(STOUT)/tests/protobuf_tests.pb.h \ http://git-wip-us.apache.org/repos/asf/mesos/blob/b08fccf8/3rdparty/libprocess/3rdparty/stout/Makefile.am ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/3rdparty/stout/Makefile.am b/3rdparty/libprocess/3rdparty/stout/Makefile.am index 2ee5a0b..125b3fa 100644 --- a/3rdparty/libprocess/3rdparty/stout/Makefile.am +++ b/3rdparty/libprocess/3rdparty/stout/Makefile.am @@ -29,6 +29,7 @@ EXTRA_DIST = \ tests/net_tests.cpp \ tests/none_tests.cpp \ tests/option_tests.cpp \ + tests/path_tests.cpp \ tests/os_tests.cpp \ tests/os/sendfile_tests.cpp \ tests/os/setns_tests.cpp \ http://git-wip-us.apache.org/repos/asf/mesos/blob/b08fccf8/3rdparty/libprocess/3rdparty/stout/include/stout/path.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/path.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/path.hpp index bc6920a..63433ef 100644 --- a/3rdparty/libprocess/3rdparty/stout/include/stout/path.hpp +++ b/3rdparty/libprocess/3rdparty/stout/include/stout/path.hpp @@ -15,59 +15,34 @@ #define __STOUT_PATH_HPP__ #include <string> +#include <utility> #include <vector> #include "strings.hpp" namespace path { -inline std::string join(const std::string& path1, const std::string& path2) -{ - return - strings::remove(path1, "/", strings::SUFFIX) + "/" + - strings::remove(path2, "/", strings::PREFIX); -} - - -inline std::string join( - const std::string& path1, - const std::string& path2, - const std::string& path3) -{ - return join(path1, join(path2, path3)); -} - - -inline std::string join( - const std::string& path1, - const std::string& path2, - const std::string& path3, - const std::string& path4) -{ - return join(path1, join(path2, path3, path4)); -} - -inline std::string join( - const std::string& path1, - const std::string& path2, - const std::string& path3, - const std::string& path4, - const std::string& path5) +template<typename ...T> +std::string join(const std::string& path, T&&... tail) { - return join(path1, join(path2, join(path3, join(path4, path5)))); -} - + std::string tailJoined = strings::join( + "/", + strings::trim(std::forward<T>(tail), "/")...); + + // The first path chunk is special in that if it starts with a '/', + // we want to keep that. + if (path.empty()) { + return tailJoined; + } -inline std::string join( - const std::string& path1, - const std::string& path2, - const std::string& path3, - const std::string& path4, - const std::string& path5, - const std::string& path6) -{ - return join(path1, join(path2, path3, path4, path5, path6)); + // If the first chunk ends with a '/', don't append another using + // join. This also handles the case with the first path part is just + // '/'. + if (path.back() == '/') { + return path + tailJoined; + } + return strings::join("/", path, tailJoined); } @@ -79,7 +54,19 @@ inline std::string join(const std::vector<std::string>& paths) std::string result = paths[0]; for (size_t i = 1; i < paths.size(); ++i) { - result = join(result, paths[i]); + const std::string &path = paths[i]; + + // Don't insert extra '/' for empty paths. + if (path.empty()) { + continue; + } + + // If result is empty, fill it. + if (result.empty()) { + result = path; + continue; + } + result = join(result, path); } return result; } http://git-wip-us.apache.org/repos/asf/mesos/blob/b08fccf8/3rdparty/libprocess/3rdparty/stout/include/stout/strings.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/strings.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/strings.hpp index 14567f1..01e47ff 100644 --- a/3rdparty/libprocess/3rdparty/stout/include/stout/strings.hpp +++ b/3rdparty/libprocess/3rdparty/stout/include/stout/strings.hpp @@ -286,6 +286,12 @@ std::string join( } +// Ensure std::string doesn't fall into the iterable case +inline std::string join(const std::string &seperator, const std::string &str) { + return str; +} + + // Use duck-typing to join any iterable. template <typename Iterable> inline std::string join(const std::string& separator, const Iterable& i) http://git-wip-us.apache.org/repos/asf/mesos/blob/b08fccf8/3rdparty/libprocess/3rdparty/stout/tests/path_tests.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/3rdparty/stout/tests/path_tests.cpp b/3rdparty/libprocess/3rdparty/stout/tests/path_tests.cpp new file mode 100644 index 0000000..aedf935 --- /dev/null +++ b/3rdparty/libprocess/3rdparty/stout/tests/path_tests.cpp @@ -0,0 +1,39 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <gtest/gtest.h> + +#include <string> +#include <vector> + +#include <stout/path.hpp> + +using std::string; +using std::vector; + + +TEST(PathTest, Join) +{ + EXPECT_EQ("a/b/c", path::join("a", "b", "c")); + EXPECT_EQ("a/b/c", path::join(string("a"), string("b"), string("c"))); + EXPECT_EQ("a/b/c", path::join(string("a"), "b", string("c"))); + EXPECT_EQ("a/b/c", path::join(vector<string>({"a", "b", "c"}))); + EXPECT_EQ("", path::join(vector<string>())); + EXPECT_EQ("", path::join(vector<string>({"", "", ""}))); + EXPECT_EQ("/asdf", path::join("/", "asdf")); + EXPECT_EQ("/", path::join("", "/", "")); + EXPECT_EQ("a/b/c", path::join("a/", "b/", "c/")); + EXPECT_EQ("/a/b/c", path::join("/a", "/b", "/c")); + EXPECT_EQ("/a/b/c", path::join("/a/", "/b/", "/c/")); + EXPECT_EQ("a/b/c", path::join("a/", "/b/", "/c/")); +}
