diff options
Diffstat (limited to 'toolsrc/src/vcpkg_Files.cpp')
| -rw-r--r-- | toolsrc/src/vcpkg_Files.cpp | 224 |
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) |
