aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/vcpkg_Files.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolsrc/src/vcpkg_Files.cpp')
-rw-r--r--toolsrc/src/vcpkg_Files.cpp224
1 files changed, 136 insertions, 88 deletions
diff --git a/toolsrc/src/vcpkg_Files.cpp b/toolsrc/src/vcpkg_Files.cpp
index 2669a9333..21896a53d 100644
--- a/toolsrc/src/vcpkg_Files.cpp
+++ b/toolsrc/src/vcpkg_Files.cpp
@@ -6,123 +6,171 @@ namespace vcpkg::Files
{
static const std::regex FILESYSTEM_INVALID_CHARACTERS_REGEX = std::regex(R"([\/:*?"<>|])");
- bool has_invalid_chars_for_filesystem(const std::string& s)
- {
- return std::regex_search(s, FILESYSTEM_INVALID_CHARACTERS_REGEX);
- }
-
- Expected<std::string> read_contents(const fs::path& file_path) noexcept
+ struct RealFilesystem final : Filesystem
{
- std::fstream file_stream(file_path, std::ios_base::in | std::ios_base::binary);
- if (file_stream.fail())
+ virtual Expected<std::string> read_contents(const fs::path& file_path) const override
{
- return std::errc::no_such_file_or_directory;
+ 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;
+ }
+
+ file_stream.seekg(0, file_stream.end);
+ auto length = file_stream.tellg();
+ file_stream.seekg(0, file_stream.beg);
+
+ if (length > SIZE_MAX)
+ {
+ return std::errc::file_too_large;
+ }
+
+ std::string output;
+ output.resize(static_cast<size_t>(length));
+ file_stream.read(&output[0], length);
+ file_stream.close();
+
+ return std::move(output);
}
+ virtual Expected<std::vector<std::string>> read_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;
+ }
- file_stream.seekg(0, file_stream.end);
- auto length = file_stream.tellg();
- file_stream.seekg(0, file_stream.beg);
+ std::vector<std::string> output;
+ std::string line;
+ while (std::getline(file_stream, line))
+ {
+ output.push_back(line);
+ }
+ file_stream.close();
- if (length > SIZE_MAX)
+ 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::file_too_large;
+ fs::path current_dir = starting_dir;
+ for (; !current_dir.empty(); current_dir = current_dir.parent_path())
+ {
+ const fs::path candidate = current_dir / filename;
+ if (exists(candidate))
+ {
+ break;
+ }
+ }
+
+ return current_dir;
}
- std::string output;
- output.resize(static_cast<size_t>(length));
- file_stream.read(&output[0], length);
- file_stream.close();
+ virtual std::vector<fs::path> get_files_recursive(const fs::path & dir) const override
+ {
+ std::vector<fs::path> ret;
- return std::move(output);
- }
+ fs::stdfs::recursive_directory_iterator b(dir), e{};
+ for (; b != e; ++b)
+ {
+ ret.push_back(b->path());
+ }
- 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::errc::no_such_file_or_directory;
+ return ret;
}
- std::vector<std::string> output;
- std::string line;
- while (std::getline(file_stream, line))
+ virtual std::vector<fs::path> get_files_non_recursive(const fs::path & dir) const override
{
- output.push_back(line);
- }
- file_stream.close();
+ std::vector<fs::path> ret;
- return std::move(output);
- }
+ fs::stdfs::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)
- {
- output << line << "\n";
+ 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_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;
- }
+ virtual void rename(const fs::path & oldpath, const fs::path & newpath) override
+ {
+ fs::stdfs::rename(oldpath, newpath);
+ }
+ virtual bool remove(const fs::path & path) override
+ {
+ return fs::stdfs::remove(path);
+ }
+ virtual bool remove(const fs::path & path, std::error_code& ec) override
+ {
+ return fs::stdfs::remove(path, ec);
+ }
+ virtual std::uintmax_t remove_all(const fs::path & path, std::error_code& ec) override
+ {
+ return fs::stdfs::remove_all(path, ec);
+ }
+ virtual bool exists(const fs::path & path) const override
+ {
+ return fs::stdfs::exists(path);
+ }
+ virtual bool is_directory(const fs::path & path) const override
+ {
+ return fs::stdfs::is_directory(path);
+ }
+ virtual bool is_regular_file(const fs::path & path) const override
+ {
+ return fs::stdfs::is_regular_file(path);
+ }
+ virtual bool is_empty(const fs::path & path) const override
+ {
+ return fs::stdfs::is_empty(path);
+ }
+ virtual bool create_directory(const fs::path & path, std::error_code & ec) override
+ {
+ return fs::stdfs::create_directory(path, ec);
+ }
+ virtual void copy(const fs::path & oldpath, const fs::path & newpath, fs::copy_options opts) override
+ {
+ fs::stdfs::copy(oldpath, newpath, opts);
+ }
+ virtual bool copy_file(const fs::path & oldpath, const fs::path & newpath, fs::copy_options opts, std::error_code & ec) override
+ {
+ return fs::stdfs::copy_file(oldpath, newpath, opts, ec);
+ }
- 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);
- }
+ virtual fs::file_status status(const fs::path& path, std::error_code& ec) const override
+ {
+ return fs::stdfs::status(path, ec);
+ }
+ virtual void write_contents(const fs::path& file_path, const std::string& data) override
+ {
+ FILE* f = nullptr;
+ auto ec = _wfopen_s(&f, file_path.native().c_str(), L"wb");
+ Checks::check_exit(VCPKG_LINE_INFO, ec == 0);
+ auto count = fwrite(data.data(), sizeof(data[0]), data.size(), f);
+ fclose(f);
- 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;
- }
+ Checks::check_exit(VCPKG_LINE_INFO, count == data.size());
+ }
+ };
- 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)