From dbae3bfe566c4c2d949ca6b2f84c6867f15e46ac Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 19 Jun 2018 17:21:34 -0700 Subject: [PATCH] Introduce archives.h/cpp --- toolsrc/include/vcpkg/base/archives.h | 9 ++ toolsrc/src/vcpkg/base/archives.cpp | 107 ++++++++++++++++++++++ toolsrc/src/vcpkg/commands.fetch.cpp | 103 +-------------------- toolsrc/vcpkglib/vcpkglib.vcxproj | 2 + toolsrc/vcpkglib/vcpkglib.vcxproj.filters | 6 ++ 5 files changed, 126 insertions(+), 101 deletions(-) create mode 100644 toolsrc/include/vcpkg/base/archives.h create mode 100644 toolsrc/src/vcpkg/base/archives.cpp diff --git a/toolsrc/include/vcpkg/base/archives.h b/toolsrc/include/vcpkg/base/archives.h new file mode 100644 index 00000000000..cfb9f84c0c8 --- /dev/null +++ b/toolsrc/include/vcpkg/base/archives.h @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +namespace vcpkg::Archives +{ + void extract_archive(const VcpkgPaths& paths, const fs::path& archive, const fs::path& to_path); +} diff --git a/toolsrc/src/vcpkg/base/archives.cpp b/toolsrc/src/vcpkg/base/archives.cpp new file mode 100644 index 00000000000..e2fca332deb --- /dev/null +++ b/toolsrc/src/vcpkg/base/archives.cpp @@ -0,0 +1,107 @@ +#include "pch.h" + +#include +#include + +namespace vcpkg::Archives +{ + void extract_archive(const VcpkgPaths& paths, const fs::path& archive, const fs::path& to_path) + { + Files::Filesystem& fs = paths.get_filesystem(); + const fs::path to_path_partial = to_path.u8string() + ".partial"; + + std::error_code ec; + fs.remove_all(to_path, ec); + fs.remove_all(to_path_partial, ec); + fs.create_directories(to_path_partial, ec); + const auto ext = archive.extension(); +#if defined(_WIN32) + if (ext == ".nupkg") + { + static bool recursion_limiter_sevenzip_old = false; + Checks::check_exit(VCPKG_LINE_INFO, !recursion_limiter_sevenzip_old); + recursion_limiter_sevenzip_old = true; + const auto nuget_exe = Commands::Fetch::get_tool_path(paths, Tools::NUGET); + + const std::string stem = archive.stem().u8string(); + // assuming format of [name].[version in the form d.d.d] + // This assumption may not always hold + std::smatch match; + const bool has_match = std::regex_match(stem, match, std::regex{R"###(^(.+)\.(\d+\.\d+\.\d+)$)###"}); + Checks::check_exit(VCPKG_LINE_INFO, + has_match, + "Could not deduce nuget id and version from filename: %s", + archive.u8string()); + + const std::string nugetid = match[1]; + const std::string version = match[2]; + + const auto code_and_output = System::cmd_execute_and_capture_output(Strings::format( + R"("%s" install %s -Version %s -OutputDirectory "%s" -Source "%s" -nocache -DirectDownload -NonInteractive -ForceEnglishOutput -PackageSaveMode nuspec)", + nuget_exe.u8string(), + nugetid, + version, + to_path_partial.u8string(), + paths.downloads.u8string())); + + Checks::check_exit(VCPKG_LINE_INFO, + code_and_output.exit_code == 0, + "Failed to extract '%s' with message:\n%s", + archive.u8string(), + code_and_output.output); + recursion_limiter_sevenzip_old = false; + } + else + { + static bool recursion_limiter_sevenzip = false; + Checks::check_exit(VCPKG_LINE_INFO, !recursion_limiter_sevenzip); + recursion_limiter_sevenzip = true; + const auto seven_zip = Commands::Fetch::get_tool_path(paths, Tools::SEVEN_ZIP); + const auto code_and_output = System::cmd_execute_and_capture_output(Strings::format( + R"("%s" x "%s" -o"%s" -y)", seven_zip.u8string(), archive.u8string(), to_path_partial.u8string())); + Checks::check_exit(VCPKG_LINE_INFO, + code_and_output.exit_code == 0, + "7zip failed while extracting '%s' with message:\n%s", + archive.u8string(), + code_and_output.output); + recursion_limiter_sevenzip = false; + } +#else + if (ext == ".gz" && ext.extension() != ".tar") + { + const auto code = System::cmd_execute( + Strings::format(R"(cd '%s' && tar xzf '%s')", to_path_partial.u8string(), archive.u8string())); + Checks::check_exit(VCPKG_LINE_INFO, code == 0, "tar failed while extracting %s", archive.u8string()); + } + else if (ext == ".zip") + { + const auto code = System::cmd_execute( + Strings::format(R"(cd '%s' && unzip -qqo '%s')", to_path_partial.u8string(), archive.u8string())); + Checks::check_exit(VCPKG_LINE_INFO, code == 0, "unzip failed while extracting %s", archive.u8string()); + } + else + { + Checks::exit_with_message(VCPKG_LINE_INFO, "Unexpected archive extension: %s", ext.u8string()); + } +#endif + + fs.rename(to_path_partial, to_path, ec); + + for (int i = 0; i < 5 && ec; i++) + { + i++; + using namespace std::chrono_literals; + std::this_thread::sleep_for(i * 100ms); + fs.rename(to_path_partial, to_path, ec); + } + + Checks::check_exit(VCPKG_LINE_INFO, + !ec, + "Failed to do post-extract rename-in-place.\n" + "fs.rename(%s, %s, %s)", + to_path_partial.u8string(), + to_path.u8string(), + ec.message()); + } + +} diff --git a/toolsrc/src/vcpkg/commands.fetch.cpp b/toolsrc/src/vcpkg/commands.fetch.cpp index 0656989c56f..be3aabfb6aa 100644 --- a/toolsrc/src/vcpkg/commands.fetch.cpp +++ b/toolsrc/src/vcpkg/commands.fetch.cpp @@ -1,5 +1,6 @@ #include "pch.h" +#include #include #include #include @@ -236,106 +237,6 @@ namespace vcpkg::Commands::Fetch return nullopt; } - - static void extract_archive(const VcpkgPaths& paths, const fs::path& archive, const fs::path& to_path) - { - Files::Filesystem& fs = paths.get_filesystem(); - const fs::path to_path_partial = to_path.u8string() + ".partial"; - - std::error_code ec; - fs.remove_all(to_path, ec); - fs.remove_all(to_path_partial, ec); - fs.create_directories(to_path_partial, ec); - const auto ext = archive.extension(); -#if defined(_WIN32) - if (ext == ".nupkg") - { - static bool recursion_limiter_sevenzip_old = false; - Checks::check_exit(VCPKG_LINE_INFO, !recursion_limiter_sevenzip_old); - recursion_limiter_sevenzip_old = true; - const auto nuget_exe = get_tool_path(paths, Tools::NUGET); - - const std::string stem = archive.stem().u8string(); - // assuming format of [name].[version in the form d.d.d] - // This assumption may not always hold - std::smatch match; - const bool has_match = std::regex_match(stem, match, std::regex{R"###(^(.+)\.(\d+\.\d+\.\d+)$)###"}); - Checks::check_exit(VCPKG_LINE_INFO, - has_match, - "Could not deduce nuget id and version from filename: %s", - archive.u8string()); - - const std::string nugetid = match[1]; - const std::string version = match[2]; - - const auto code_and_output = System::cmd_execute_and_capture_output(Strings::format( - R"("%s" install %s -Version %s -OutputDirectory "%s" -Source "%s" -nocache -DirectDownload -NonInteractive -ForceEnglishOutput -PackageSaveMode nuspec)", - nuget_exe.u8string(), - nugetid, - version, - to_path_partial.u8string(), - paths.downloads.u8string())); - - Checks::check_exit(VCPKG_LINE_INFO, - code_and_output.exit_code == 0, - "Failed to extract '%s' with message:\n%s", - archive.u8string(), - code_and_output.output); - recursion_limiter_sevenzip_old = false; - } - else - { - static bool recursion_limiter_sevenzip = false; - Checks::check_exit(VCPKG_LINE_INFO, !recursion_limiter_sevenzip); - recursion_limiter_sevenzip = true; - const auto seven_zip = get_tool_path(paths, Tools::SEVEN_ZIP); - const auto code_and_output = System::cmd_execute_and_capture_output(Strings::format( - R"("%s" x "%s" -o"%s" -y)", seven_zip.u8string(), archive.u8string(), to_path_partial.u8string())); - Checks::check_exit(VCPKG_LINE_INFO, - code_and_output.exit_code == 0, - "7zip failed while extracting '%s' with message:\n%s", - archive.u8string(), - code_and_output.output); - recursion_limiter_sevenzip = false; - } -#else - if (ext == ".gz" && ext.extension() != ".tar") - { - const auto code = System::cmd_execute( - Strings::format(R"(cd '%s' && tar xzf '%s')", to_path_partial.u8string(), archive.u8string())); - Checks::check_exit(VCPKG_LINE_INFO, code == 0, "tar failed while extracting %s", archive.u8string()); - } - else if (ext == ".zip") - { - const auto code = System::cmd_execute( - Strings::format(R"(cd '%s' && unzip -qqo '%s')", to_path_partial.u8string(), archive.u8string())); - Checks::check_exit(VCPKG_LINE_INFO, code == 0, "unzip failed while extracting %s", archive.u8string()); - } - else - { - Checks::exit_with_message(VCPKG_LINE_INFO, "Unexpected archive extension: %s", ext.u8string()); - } -#endif - - fs.rename(to_path_partial, to_path, ec); - - for (int i = 0; i < 5 && ec; i++) - { - i++; - using namespace std::chrono_literals; - std::this_thread::sleep_for(i * 100ms); - fs.rename(to_path_partial, to_path, ec); - } - - Checks::check_exit(VCPKG_LINE_INFO, - !ec, - "Failed to do post-extract rename-in-place.\n" - "fs.rename(%s, %s, %s)", - to_path_partial.u8string(), - to_path.u8string(), - ec.message()); - } - static fs::path fetch_tool(const VcpkgPaths& paths, const std::string& tool_name, const ToolData& tool_data) { const std::array& version = tool_data.version; @@ -367,7 +268,7 @@ namespace vcpkg::Commands::Fetch if (tool_data.is_archive) { System::println("Extracting %s...", tool_name); - extract_archive(paths, tool_data.download_path, tool_data.tool_dir_path); + Archives::extract_archive(paths, tool_data.download_path, tool_data.tool_dir_path); System::println("Extracting %s... done.", tool_name); } else diff --git a/toolsrc/vcpkglib/vcpkglib.vcxproj b/toolsrc/vcpkglib/vcpkglib.vcxproj index 720a1043fd9..7e825b51348 100644 --- a/toolsrc/vcpkglib/vcpkglib.vcxproj +++ b/toolsrc/vcpkglib/vcpkglib.vcxproj @@ -137,6 +137,7 @@ + @@ -193,6 +194,7 @@ Create Create + diff --git a/toolsrc/vcpkglib/vcpkglib.vcxproj.filters b/toolsrc/vcpkglib/vcpkglib.vcxproj.filters index 29901792929..d4e179d19d1 100644 --- a/toolsrc/vcpkglib/vcpkglib.vcxproj.filters +++ b/toolsrc/vcpkglib/vcpkglib.vcxproj.filters @@ -204,6 +204,9 @@ Source Files\vcpkg\base + + Source Files\vcpkg\base + @@ -353,5 +356,8 @@ Header Files\vcpkg\base + + Header Files\vcpkg\base + \ No newline at end of file