From 91e798afd899f84654f25e3d7f5beb276c6bd5af Mon Sep 17 00:00:00 2001 From: ras0219 Date: Fri, 26 Jun 2020 12:16:02 -0700 Subject: [vcpkg] Implementation of --x-binarysource=nuget (and friends) (#12058) * [vcpkg] Initial implementation of --x-binarysource=nuget * [vcpkg] Remove double-double quoting of CMake arguments * [vcpkg] Update nuget.exe to 5.5.1 to support Azure DevOps Artifacts * [vcpkg] Enable batching of NuGet server calls with prefetch(). Add `interactive` binarysource. * [vcpkg] Add `nugetconfig` binary source * [vcpkg] Short circuit querying remote NuGet servers once all refs are found * [vcpkg] Add experimental help for binary caching * [vcpkg] Improved NuGet cache package descriptions and version formatting * [vcpkg] Rename `CmdLineBuilder::build()` to extract() * [vcpkg-help] Ascii-betize help topics * [vcpkg] Add tests for cmdlinebuilder. Improve handling of quotes and slashes. * [vcpkg] Addressing code review comments * [vcpkg] Add tests for vcpkg::reformat_version() * [vcpkg] Added test for vcpkg::generate_nuspec() * [vcpkg] Add tests for vcpkg::XmlSerializer * [vcpkg] Addressed code review comment * [vcpkg] Add test for vcpkg::Strings::find_first_of * [vcpkg] Fix machine-specific paths in test for vcpkg::generate_nuspec() Co-authored-by: Robert Schumacher --- toolsrc/include/vcpkg/base/strings.h | 2 + toolsrc/include/vcpkg/base/system.process.h | 12 ++++++ toolsrc/include/vcpkg/base/util.h | 13 +++++++ toolsrc/include/vcpkg/binarycaching.h | 12 +++++- toolsrc/include/vcpkg/binarycaching.private.h | 54 +++++++++++++++++++++++++++ toolsrc/include/vcpkg/build.h | 3 +- toolsrc/include/vcpkg/vcpkgcmdarguments.h | 1 + 7 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 toolsrc/include/vcpkg/binarycaching.private.h (limited to 'toolsrc/include') diff --git a/toolsrc/include/vcpkg/base/strings.h b/toolsrc/include/vcpkg/base/strings.h index 425d846df..17bef7675 100644 --- a/toolsrc/include/vcpkg/base/strings.h +++ b/toolsrc/include/vcpkg/base/strings.h @@ -175,6 +175,8 @@ namespace vcpkg::Strings std::vector split(const std::string& s, const char delimiter); + const char* find_first_of(StringView searched, StringView candidates); + std::vector find_all_enclosed(StringView input, StringView left_delim, StringView right_delim); StringView find_exactly_one_enclosed(StringView input, StringView left_tag, StringView right_tag); diff --git a/toolsrc/include/vcpkg/base/system.process.h b/toolsrc/include/vcpkg/base/system.process.h index 0e6a92444..91faa5985 100644 --- a/toolsrc/include/vcpkg/base/system.process.h +++ b/toolsrc/include/vcpkg/base/system.process.h @@ -23,6 +23,18 @@ namespace vcpkg::System const fs::path& cmake_script, const std::vector& pass_variables); + struct CmdLineBuilder + { + CmdLineBuilder& path_arg(const fs::path& p) { return string_arg(p.u8string()); } + CmdLineBuilder& string_arg(StringView s); + std::string extract() noexcept { return std::move(buf); } + + operator ZStringView() const { return buf; } + + private: + std::string buf; + }; + fs::path get_exe_path_of_current_process(); struct ExitCodeAndOutput diff --git a/toolsrc/include/vcpkg/base/util.h b/toolsrc/include/vcpkg/base/util.h index 89f2c51d6..a5b56028b 100644 --- a/toolsrc/include/vcpkg/base/util.h +++ b/toolsrc/include/vcpkg/base/util.h @@ -49,6 +49,19 @@ namespace vcpkg::Util } } + template> + std::vector filter(const Range& xs, Pred&& f) + { + std::vector ret; + + for (auto&& x : xs) + { + if (f(x)) ret.push_back(x); + } + + return ret; + } + template using FmapOut = std::remove_reference_t()(*std::declval().begin()))>; diff --git a/toolsrc/include/vcpkg/binarycaching.h b/toolsrc/include/vcpkg/binarycaching.h index 88f529c22..d343d6c42 100644 --- a/toolsrc/include/vcpkg/binarycaching.h +++ b/toolsrc/include/vcpkg/binarycaching.h @@ -8,6 +8,7 @@ namespace vcpkg::Dependencies { struct InstallPlanAction; + struct ActionPlan; } namespace vcpkg::Build { @@ -27,10 +28,17 @@ namespace vcpkg struct IBinaryProvider { virtual ~IBinaryProvider() = default; - virtual void prefetch() = 0; + /// Gives the BinaryProvider an opportunity to batch any downloading or server communication for executing + /// `plan`. + virtual void prefetch(const VcpkgPaths& paths, const Dependencies::ActionPlan& plan) = 0; + /// Attempts to restore the package referenced by `action` into the packages directory. virtual RestoreResult try_restore(const VcpkgPaths& paths, const Dependencies::InstallPlanAction& action) = 0; + /// Called upon a successful build of `action` virtual void push_success(const VcpkgPaths& paths, const Dependencies::InstallPlanAction& action) = 0; + /// Called upon a failure during the build of `action` virtual void push_failure(const VcpkgPaths& paths, const std::string& abi_tag, const PackageSpec& spec) = 0; + /// Requests the result of `try_restore()` without actually downloading the package. Used by CI to determine + /// missing packages. virtual RestoreResult precheck(const VcpkgPaths& paths, const Dependencies::InstallPlanAction& action, bool purge_tombstones) = 0; @@ -42,4 +50,6 @@ namespace vcpkg View args); ExpectedS> create_binary_provider_from_configs_pure(const std::string& env_string, View args); + + void help_topic_binary_caching(const VcpkgPaths& paths); } diff --git a/toolsrc/include/vcpkg/binarycaching.private.h b/toolsrc/include/vcpkg/binarycaching.private.h new file mode 100644 index 000000000..f1fd046de --- /dev/null +++ b/toolsrc/include/vcpkg/binarycaching.private.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include +#include +#include + +namespace vcpkg +{ + std::string reformat_version(const std::string& version, const std::string& abi_tag); + + struct NugetReference + { + explicit NugetReference(const Dependencies::InstallPlanAction& action) + : NugetReference(action.spec, + action.source_control_file_location.value_or_exit(VCPKG_LINE_INFO) + .source_control_file->core_paragraph->version, + action.abi_info.value_or_exit(VCPKG_LINE_INFO).package_abi) + { + } + + NugetReference(const PackageSpec& spec, const std::string& raw_version, const std::string& abi_tag) + : id(spec.dir()), version(reformat_version(raw_version, abi_tag)) + { + } + + std::string id; + std::string version; + + std::string nupkg_filename() const { return Strings::concat(id, '.', version, ".nupkg"); } + }; + + std::string generate_nuspec(const VcpkgPaths& paths, + const Dependencies::InstallPlanAction& action, + const NugetReference& ref); + + struct XmlSerializer + { + std::string buf; + int indent = 0; + + XmlSerializer& emit_declaration(); + XmlSerializer& open_tag(StringLiteral sl); + XmlSerializer& start_complex_open_tag(StringLiteral sl); + XmlSerializer& text_attr(StringLiteral name, StringView content); + XmlSerializer& finish_complex_open_tag(); + XmlSerializer& finish_self_closing_complex_tag(); + XmlSerializer& close_tag(StringLiteral sl); + XmlSerializer& text(StringView sv); + XmlSerializer& simple_tag(StringLiteral tag, StringView content); + XmlSerializer& line_break(); + }; + +} \ No newline at end of file diff --git a/toolsrc/include/vcpkg/build.h b/toolsrc/include/vcpkg/build.h index e2e28b08a..804cb6673 100644 --- a/toolsrc/include/vcpkg/build.h +++ b/toolsrc/include/vcpkg/build.h @@ -284,7 +284,8 @@ namespace vcpkg::Build struct AbiInfo { std::unique_ptr pre_build_info; - const Toolset* toolset; + Optional toolset; + Optional triplet_abi; std::string package_abi; Optional abi_tag_file; }; diff --git a/toolsrc/include/vcpkg/vcpkgcmdarguments.h b/toolsrc/include/vcpkg/vcpkgcmdarguments.h index 378aa9703..690245d08 100644 --- a/toolsrc/include/vcpkg/vcpkgcmdarguments.h +++ b/toolsrc/include/vcpkg/vcpkgcmdarguments.h @@ -92,6 +92,7 @@ namespace vcpkg void example(StringView example_text); void header(StringView name); void blank(); + void text(StringView text, int indent = 0); std::string m_str; }; -- cgit v1.2.3