void download_file(vcpkg::Files::Filesystem& fs, const std::string& url, const fs::path& download_path, const std::string& sha512) { const std::string download_path_part = download_path.u8string() + ".part"; std::error_code ec; fs.remove(download_path, ec); fs.remove(download_path_part, ec); #if defined(_WIN32) auto url_no_proto = url.substr(8); // drop https:// auto path_begin = Util::find(url_no_proto, '/'); std::string hostname(url_no_proto.begin(), path_begin); std::string path(path_begin, url_no_proto.end()); winhttp_download_file(fs, download_path_part.c_str(), hostname, path); #else const auto code = System::cmd_execute( Strings::format(R"(curl -L '%s' --create-dirs --output '%s')", url, download_path_part)); Checks::check_exit(VCPKG_LINE_INFO, code == 0, "Could not download %s", url); #endif verify_downloaded_file_hash(fs, url, download_path_part, sha512); fs.rename(download_path_part, download_path, ec); Checks::check_exit(VCPKG_LINE_INFO, !ec, "Failed to do post-download rename-in-place.\n" "fs.rename(%s, %s, %s)", download_path_part, download_path.u8string(), ec.message()); }
static LintStatus check_lib_files_are_available_if_dlls_are_available(const Build::BuildPolicies& policies, const size_t lib_count, const size_t dll_count, const fs::path& lib_dir) { if (policies.is_enabled(BuildPolicy::DLLS_WITHOUT_LIBS)) return LintStatus::SUCCESS; if (lib_count == 0 && dll_count != 0) { System::println(System::Color::warning, "Import libs were not present in %s", lib_dir.u8string()); System::println(System::Color::warning, "If this is intended, add the following line in the portfile:\n" " SET(%s enabled)", to_cmake_variable(BuildPolicy::DLLS_WITHOUT_LIBS)); return LintStatus::ERROR_DETECTED; } return LintStatus::SUCCESS; }
std::string get_file_hash(const Files::Filesystem& fs, const fs::path& path, const std::string& hash_type) { const std::string digest_size = get_digest_size(hash_type); Checks::check_exit(VCPKG_LINE_INFO, fs.exists(path), "File %s does not exist", path.u8string()); // Try hash-specific tools, like sha512sum { const auto ec_data = System::cmd_execute_and_capture_output( Strings::format(R"(sha%ssum "%s")", digest_size, path.u8string())); if (ec_data.exit_code == 0) { return parse_shasum_output(ec_data.output); } } // Try shasum { const auto ec_data = System::cmd_execute_and_capture_output( Strings::format(R"(shasum -a %s "%s")", digest_size, path.u8string())); if (ec_data.exit_code == 0) { return parse_shasum_output(ec_data.output); } } Checks::exit_with_message(VCPKG_LINE_INFO, "Could not hash file %s with %s", path.u8string(), hash_type); } std::string get_string_hash(const std::string& s, const std::string& hash_type) { const std::string digest_size = get_digest_size(hash_type); verify_has_only_allowed_chars(s); // Try hash-specific tools, like sha512sum { const auto ec_data = System::cmd_execute_and_capture_output(Strings::format(R"(echo -n "%s" | sha%ssum)", s, digest_size)); if (ec_data.exit_code == 0) { return parse_shasum_output(ec_data.output); } } // Try shasum { const auto ec_data = System::cmd_execute_and_capture_output( Strings::format(R"(echo -n "%s" | shasum -a %s)", s, digest_size)); if (ec_data.exit_code == 0) { return parse_shasum_output(ec_data.output); } } Checks::exit_with_message(VCPKG_LINE_INFO, "Could not hash input string with %s", hash_type); } #endif }
std::string get_file_hash(const Files::Filesystem& fs, const fs::path& path, const std::string& hash_type) { Checks::check_exit(VCPKG_LINE_INFO, fs.exists(path), "File %s does not exist", path.u8string()); return BCryptHasher{hash_type}.hash_file(path); }