aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/vcpkg_Files.cpp
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-04-08 20:19:35 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-04-08 20:19:35 -0700
commitb34c40a4e674f5db538e84ca2b9509482ac140e7 (patch)
tree48a09d41e4760d97a20386dce00105cae54b1f17 /toolsrc/src/vcpkg_Files.cpp
parentc434dc99868989ca55aef5e445ac6a0a4c3430f7 (diff)
downloadvcpkg-b34c40a4e674f5db538e84ca2b9509482ac140e7.tar.gz
vcpkg-b34c40a4e674f5db538e84ca2b9509482ac140e7.zip
[vcpkg] Further work on filesystem abstraction layer.
Diffstat (limited to 'toolsrc/src/vcpkg_Files.cpp')
-rw-r--r--toolsrc/src/vcpkg_Files.cpp175
1 files changed, 95 insertions, 80 deletions
diff --git a/toolsrc/src/vcpkg_Files.cpp b/toolsrc/src/vcpkg_Files.cpp
index ece6ed474..4e83300f4 100644
--- a/toolsrc/src/vcpkg_Files.cpp
+++ b/toolsrc/src/vcpkg_Files.cpp
@@ -8,7 +8,7 @@ namespace vcpkg::Files
struct RealFilesystem : Filesystem
{
- Expected<std::string> read_contents(const fs::path& file_path) noexcept override
+ virtual Expected<std::string> read_contents(const fs::path& file_path) const override
{
std::fstream file_stream(file_path, std::ios_base::in | std::ios_base::binary);
if (file_stream.fail())
@@ -32,106 +32,121 @@ namespace vcpkg::Files
return std::move(output);
}
- };
-
- Filesystem & get_real_filesystem()
- {
- static RealFilesystem real_fs;
- return real_fs;
- }
+ virtual Expected<std::vector<std::string>> read_all_lines(const fs::path& file_path) const override
+ {
+ std::fstream file_stream(file_path, std::ios_base::in | std::ios_base::binary);
+ if (file_stream.fail())
+ {
+ return std::errc::no_such_file_or_directory;
+ }
- bool has_invalid_chars_for_filesystem(const std::string& s)
- {
- return std::regex_search(s, FILESYSTEM_INVALID_CHARACTERS_REGEX);
- }
+ std::vector<std::string> output;
+ std::string line;
+ while (std::getline(file_stream, line))
+ {
+ output.push_back(line);
+ }
+ file_stream.close();
- Expected<std::vector<std::string>> read_all_lines(const fs::path& file_path)
- {
- std::fstream file_stream(file_path, std::ios_base::in | std::ios_base::binary);
- if (file_stream.fail())
+ return std::move(output);
+ }
+ virtual fs::path find_file_recursively_up(const fs::path & starting_dir, const std::string & filename) const override
{
- return std::errc::no_such_file_or_directory;
+ fs::path current_dir = starting_dir;
+ for (; !current_dir.empty(); current_dir = current_dir.parent_path())
+ {
+ const fs::path candidate = current_dir / filename;
+ if (fs::exists(candidate))
+ {
+ break;
+ }
+ }
+
+ return current_dir;
}
- std::vector<std::string> output;
- std::string line;
- while (std::getline(file_stream, line))
+ virtual std::vector<fs::path> recursive_find_all_files_in_dir(const fs::path & dir) const override
{
- output.push_back(line);
- }
- file_stream.close();
+ std::vector<fs::path> ret;
- return std::move(output);
- }
+ fs::recursive_directory_iterator b(dir), e{};
+ for (; b != e; ++b)
+ {
+ ret.push_back(b->path());
+ }
- void write_all_lines(const fs::path& file_path, const std::vector<std::string>& lines)
- {
- std::fstream output(file_path, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
- for (const std::string& line : lines)
+ return ret;
+ }
+ virtual std::vector<fs::path> non_recursive_find_all_files_in_dir(const fs::path & dir) const override
{
- output << line << "\n";
+ std::vector<fs::path> ret;
+
+ fs::directory_iterator b(dir), e{};
+ for (; b != e; ++b)
+ {
+ ret.push_back(b->path());
+ }
+
+ return ret;
}
- output.close();
- }
- fs::path find_file_recursively_up(const fs::path& starting_dir, const std::string& filename)
- {
- fs::path current_dir = starting_dir;
- for (; !current_dir.empty(); current_dir = current_dir.parent_path())
+ virtual void write_all_lines(const fs::path & file_path, const std::vector<std::string>& lines) override
{
- const fs::path candidate = current_dir / filename;
- if (fs::exists(candidate))
+ std::fstream output(file_path, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc);
+ for (const std::string& line : lines)
{
- break;
+ output << line << "\n";
}
+ output.close();
}
- return current_dir;
- }
-
- void recursive_find_files_with_extension_in_dir(const fs::path& dir, const std::string& extension, std::vector<fs::path>* output)
- {
- recursive_find_matching_paths_in_dir(dir, [&extension](const fs::path& current)
- {
- return !fs::is_directory(current) && current.extension() == extension;
- }, output);
- }
-
- std::vector<fs::path> recursive_find_files_with_extension_in_dir(const fs::path& dir, const std::string& extension)
- {
- std::vector<fs::path> v;
- recursive_find_files_with_extension_in_dir(dir, extension, &v);
- return v;
- }
-
- void recursive_find_all_files_in_dir(const fs::path& dir, std::vector<fs::path>* output)
- {
- recursive_find_matching_paths_in_dir(dir, [](const fs::path& current)
- {
- return !fs::is_directory(current);
- }, output);
- }
-
- std::vector<fs::path> recursive_find_all_files_in_dir(const fs::path& dir)
- {
- std::vector<fs::path> v;
- recursive_find_all_files_in_dir(dir, &v);
- return v;
- }
+ virtual void rename(const fs::path & oldpath, const fs::path & newpath) override
+ {
+ fs::rename(oldpath, newpath);
+ }
+ virtual void remove(const fs::path & path) override
+ {
+ fs::remove(path);
+ }
+ virtual bool exists(const fs::path & path) const override
+ {
+ return fs::exists(path);
+ }
+ virtual bool is_directory(const fs::path & path) const override
+ {
+ return fs::is_directory(path);
+ }
+ virtual bool is_regular_file(const fs::path & path) const override
+ {
+ return fs::is_regular_file(path);
+ }
+ virtual bool is_empty(const fs::path & path) const override
+ {
+ return fs::is_empty(path);
+ }
+ virtual bool create_directory(const fs::path & path, std::error_code & ec) override
+ {
+ return fs::create_directory(path, ec);
+ }
+ virtual void copy(const fs::path & oldpath, const fs::path & newpath, fs::copy_options opts) override
+ {
+ fs::copy(oldpath, newpath, opts);
+ }
+ virtual void copy_file(const fs::path & oldpath, const fs::path & newpath, fs::copy_options opts, std::error_code & ec) override
+ {
+ fs::copy_file(oldpath, newpath, opts, ec);
+ }
+ };
- void non_recursive_find_all_files_in_dir(const fs::path& dir, std::vector<fs::path>* output)
+ Filesystem & get_real_filesystem()
{
- non_recursive_find_matching_paths_in_dir(dir, [](const fs::path& current)
- {
- return !fs::is_directory(current);
- }, output);
+ static RealFilesystem real_fs;
+ return real_fs;
}
- std::vector<fs::path> non_recursive_find_all_files_in_dir(const fs::path& dir)
+ bool has_invalid_chars_for_filesystem(const std::string& s)
{
- std::vector<fs::path> v;
- non_recursive_find_all_files_in_dir(dir, &v);
- return v;
+ return std::regex_search(s, FILESYSTEM_INVALID_CHARACTERS_REGEX);
}
void print_paths(const std::vector<fs::path>& paths)