From aac20fc3f35782583d8902a170ad720fb559a015 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Thu, 17 Feb 2022 17:23:38 +0100 Subject: [PATCH 01/14] manifest install: Add option to check stamp file --- include/vcpkg/base/hash.h | 1 + include/vcpkg/commands.setinstalled.h | 18 +++--- include/vcpkg/installedpaths.h | 1 + include/vcpkg/vcpkgpaths.h | 1 + locales/messages.json | 2 + src/vcpkg/base/hash.cpp | 2 + src/vcpkg/commands.setinstalled.cpp | 39 ++++++------- src/vcpkg/install.cpp | 84 +++++++++++++++++++++++---- src/vcpkg/vcpkgpaths.cpp | 6 ++ 9 files changed, 115 insertions(+), 39 deletions(-) diff --git a/include/vcpkg/base/hash.h b/include/vcpkg/base/hash.h index 3c3903e067..656be9bd27 100644 --- a/include/vcpkg/base/hash.h +++ b/include/vcpkg/base/hash.h @@ -17,6 +17,7 @@ namespace vcpkg::Hash struct Hasher { + void add_bytes(StringView data); virtual void add_bytes(const void* start, const void* end) noexcept = 0; // one may only call this once before calling `clear()` or the dtor diff --git a/include/vcpkg/commands.setinstalled.h b/include/vcpkg/commands.setinstalled.h index bb48b1d5e9..1ab72eb003 100644 --- a/include/vcpkg/commands.setinstalled.h +++ b/include/vcpkg/commands.setinstalled.h @@ -7,15 +7,15 @@ namespace vcpkg::Commands::SetInstalled { extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit_ex(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - const PortFileProvider::PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const CMakeVars::CMakeVarProvider& cmake_vars, - Dependencies::ActionPlan action_plan, - DryRun dry_run, - const Optional& pkgsconfig_path, - Triplet host_triplet); + void perform_ex(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + const PortFileProvider::PathsPortFileProvider& provider, + BinaryCache& binary_cache, + const CMakeVars::CMakeVarProvider& cmake_vars, + Dependencies::ActionPlan action_plan, + DryRun dry_run, + const Optional& pkgsconfig_path, + Triplet host_triplet); void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet default_triplet, diff --git a/include/vcpkg/installedpaths.h b/include/vcpkg/installedpaths.h index 94828d8d1f..1e8f9c9b5b 100644 --- a/include/vcpkg/installedpaths.h +++ b/include/vcpkg/installedpaths.h @@ -20,6 +20,7 @@ namespace vcpkg Path vcpkg_dir_info() const { return vcpkg_dir() / "info"; } Path vcpkg_dir_updates() const { return vcpkg_dir() / "updates"; } Path lockfile_path() const { return vcpkg_dir() / "vcpkg-lock.json"; } + Path hashfile_path() const { return vcpkg_dir() / "hash.txt"; } Path triplet_dir(Triplet t) const { return m_root / t.canonical_name(); } Path share_dir(const PackageSpec& p) const { return triplet_dir(p.triplet()) / "share" / p.name(); } Path usage_file(const PackageSpec& p) const { return share_dir(p) / "usage"; } diff --git a/include/vcpkg/vcpkgpaths.h b/include/vcpkg/vcpkgpaths.h index 680cda147e..7910ed0da9 100644 --- a/include/vcpkg/vcpkgpaths.h +++ b/include/vcpkg/vcpkgpaths.h @@ -159,6 +159,7 @@ namespace vcpkg const std::string& get_triplet_info(const Build::AbiInfo& abi_info) const; const Build::CompilerInfo& get_compiler_info(const Build::AbiInfo& abi_info) const; bool manifest_mode_enabled() const { return get_manifest().has_value(); } + std::string get_configuration_hash() const; const FeatureFlagSettings& get_feature_flags() const; void track_feature_flag_metrics() const; diff --git a/locales/messages.json b/locales/messages.json index 82b1fa222a..98eaf97916 100644 --- a/locales/messages.json +++ b/locales/messages.json @@ -91,6 +91,8 @@ "_ProcessorArchitectureW6432Malformed.comment": "example of {arch} is 'x64'.\n", "SeeURL": "See {url} for more information.", "_SeeURL.comment": "example of {url} is 'https://github.com/microsoft/vcpkg'.\n", + "StampNotChanged": "Installation skipped. Everything seems to be installed. To disable this check, don't pass the option `--{option}` to vcpkg.", + "_StampNotChanged.comment": "example of {option} is 'editable'.\n", "UnsupportedSystemName": "Error: Could not map VCPKG_CMAKE_SYSTEM_NAME '{system_name}' to a vcvarsall platform. Supported system names are '', 'Windows' and 'WindowsStore'.", "_UnsupportedSystemName.comment": "example of {system_name} is 'Darwin'.\n", "UnsupportedToolchain": "Error: in triplet {triplet}: Unable to find a valid toolchain combination.\n The requested target architecture was {arch}\n The selected Visual Studio instance is at {path}\n The available toolchain combinations are {list}\n", diff --git a/src/vcpkg/base/hash.cpp b/src/vcpkg/base/hash.cpp index a9f640ba00..112e8d92c9 100644 --- a/src/vcpkg/base/hash.cpp +++ b/src/vcpkg/base/hash.cpp @@ -43,6 +43,8 @@ namespace vcpkg::Hash } } + void Hasher::add_bytes(StringView data) { add_bytes(data.data(), data.data() + data.size()); } + template auto top_bits(UIntTy x) -> std::enable_if_t::value, uchar> { diff --git a/src/vcpkg/commands.setinstalled.cpp b/src/vcpkg/commands.setinstalled.cpp index b792014607..97f851f61e 100644 --- a/src/vcpkg/commands.setinstalled.cpp +++ b/src/vcpkg/commands.setinstalled.cpp @@ -35,15 +35,15 @@ namespace vcpkg::Commands::SetInstalled nullptr, }; - void perform_and_exit_ex(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - const PortFileProvider::PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const CMakeVars::CMakeVarProvider& cmake_vars, - Dependencies::ActionPlan action_plan, - DryRun dry_run, - const Optional& maybe_pkgsconfig, - Triplet host_triplet) + void perform_ex(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + const PortFileProvider::PathsPortFileProvider& provider, + BinaryCache& binary_cache, + const CMakeVars::CMakeVarProvider& cmake_vars, + Dependencies::ActionPlan action_plan, + DryRun dry_run, + const Optional& maybe_pkgsconfig, + Triplet host_triplet) { auto& fs = paths.get_filesystem(); @@ -136,8 +136,6 @@ namespace vcpkg::Commands::SetInstalled Install::print_usage_information(it->get()->package, printed_usages, fs, paths.installed()); } } - - Checks::exit_success(VCPKG_LINE_INFO); } void perform_and_exit(const VcpkgCmdArguments& args, @@ -178,15 +176,16 @@ namespace vcpkg::Commands::SetInstalled action.build_options = Build::default_build_package_options; } - perform_and_exit_ex(args, - paths, - provider, - binary_cache, - *cmake_vars, - std::move(action_plan), - dry_run ? DryRun::Yes : DryRun::No, - pkgsconfig, - host_triplet); + perform_ex(args, + paths, + provider, + binary_cache, + *cmake_vars, + std::move(action_plan), + dry_run ? DryRun::Yes : DryRun::No, + pkgsconfig, + host_triplet); + Checks::exit_success(VCPKG_LINE_INFO); } void SetInstalledCommand::perform_and_exit(const VcpkgCmdArguments& args, diff --git a/src/vcpkg/install.cpp b/src/vcpkg/install.cpp index 6ec88666c1..f441e0a765 100644 --- a/src/vcpkg/install.cpp +++ b/src/vcpkg/install.cpp @@ -510,6 +510,7 @@ namespace vcpkg::Install static constexpr StringLiteral OPTION_RECURSE = "recurse"; static constexpr StringLiteral OPTION_KEEP_GOING = "keep-going"; static constexpr StringLiteral OPTION_EDITABLE = "editable"; + static constexpr StringLiteral OPTION_CHECK_STAMP = "check-stamp"; static constexpr StringLiteral OPTION_XUNIT = "x-xunit"; static constexpr StringLiteral OPTION_USE_ARIA2 = "x-use-aria2"; static constexpr StringLiteral OPTION_CLEAN_AFTER_BUILD = "clean-after-build"; @@ -523,7 +524,7 @@ namespace vcpkg::Install static constexpr StringLiteral OPTION_ENFORCE_PORT_CHECKS = "enforce-port-checks"; static constexpr StringLiteral OPTION_ALLOW_UNSUPPORTED_PORT = "allow-unsupported"; - static constexpr std::array INSTALL_SWITCHES = {{ + static constexpr std::array INSTALL_SWITCHES = {{ {OPTION_DRY_RUN, "Do not actually build or install"}, {OPTION_USE_HEAD_VERSION, "Install the libraries on the command line using the latest upstream sources (classic mode)"}, @@ -534,6 +535,9 @@ namespace vcpkg::Install {OPTION_KEEP_GOING, "Continue installing packages on failure"}, {OPTION_EDITABLE, "Disable source re-extraction and binary caching for libraries on the command line (classic mode)"}, + {OPTION_CHECK_STAMP, + "If the configuration (triplets, manifest file, registries, selected features) is the same as the last time " + "install is skipped. Local port modifications are not detected anymore."}, {OPTION_USE_ARIA2, "Use aria2 to perform download tasks"}, {OPTION_CLEAN_AFTER_BUILD, "Clean buildtrees, packages and downloads after building each package"}, @@ -795,6 +799,12 @@ namespace vcpkg::Install "", "Error: The option --{option} is not supported in manifest mode."); + DECLARE_AND_REGISTER_MESSAGE(StampNotChanged, + (msg::option), + "", + "Installation skipped. Everything seems to be installed. To disable this check, don't " + "pass the option `--{option}` to vcpkg."); + void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet default_triplet, @@ -810,6 +820,7 @@ namespace vcpkg::Install const bool no_build_missing = Util::Sets::contains(options.switches, OPTION_ONLY_BINARYCACHING); const bool is_recursive = Util::Sets::contains(options.switches, (OPTION_RECURSE)); const bool is_editable = Util::Sets::contains(options.switches, (OPTION_EDITABLE)) || !args.cmake_args.empty(); + const bool check_stamp = Util::Sets::contains(options.switches, (OPTION_CHECK_STAMP)); const bool use_aria2 = Util::Sets::contains(options.switches, (OPTION_USE_ARIA2)); const bool clean_after_build = Util::Sets::contains(options.switches, (OPTION_CLEAN_AFTER_BUILD)); const bool clean_buildtrees_after_build = @@ -869,6 +880,11 @@ namespace vcpkg::Install Color::error, msgErrorInvalidClassicModeOption, msg::option = OPTION_MANIFEST_NO_DEFAULT_FEATURES); failure = true; } + if (Util::Sets::contains(options.switches, OPTION_CHECK_STAMP)) + { + msg::println(Color::error, msgErrorInvalidClassicModeOption, msg::option = OPTION_CHECK_STAMP); + failure = true; + } if (Util::Sets::contains(options.multisettings, OPTION_MANIFEST_FEATURE)) { msg::println(Color::error, msgErrorInvalidClassicModeOption, msg::option = OPTION_MANIFEST_FEATURE); @@ -1003,6 +1019,50 @@ namespace vcpkg::Install { extended_overlay_ports.push_back(paths.builtin_ports_directory().native()); } + + std::string hash; + { + auto timer = ElapsedTimer::create_started(); + auto hasher = Hash::get_hasher_for(Hash::Algorithm::Sha256); + for (auto&& path : args.overlay_ports) + { + for (auto&& file : fs.get_regular_files_recursive(path, VCPKG_LINE_INFO)) + { + hasher->add_bytes(fs.read_contents(file, VCPKG_LINE_INFO)); + } + } + hasher->add_bytes(paths.get_configuration_hash()); + hasher->add_bytes(Json::stringify(*manifest, Json::JsonStyle{}.with_spaces(0))); + hasher->add_bytes(default_triplet.to_string()); + hasher->add_bytes(host_triplet.to_string()); + hasher->add_bytes(fs.read_contents(paths.get_triplet_file_path(default_triplet), VCPKG_LINE_INFO)); + hasher->add_bytes(fs.read_contents(paths.get_triplet_file_path(host_triplet), VCPKG_LINE_INFO)); + hasher->add_bytes(fs.read_contents(paths.get_triplet_file_path(host_triplet), VCPKG_LINE_INFO)); + for (const auto& feature : features) + { + hasher->add_bytes(feature); + } + if (paths.get_registry_set().is_default_builtin_registry()) + { + auto maybe_git_sha = paths.get_current_git_sha(); + if (maybe_git_sha) + { + hasher->add_bytes(maybe_git_sha.value_or_exit(VCPKG_LINE_INFO)); + } + } + Debug::print("Time needed to compute hash for stamp: ", timer.elapsed().to_string(), "\n"); + hash = hasher->get_hash(); + if (fs.exists(paths.installed().hashfile_path(), VCPKG_LINE_INFO)) + { + if (check_stamp && fs.read_contents(paths.installed().hashfile_path(), VCPKG_LINE_INFO) == hash) + { + msg::println(msgStampNotChanged, msg::option = OPTION_CHECK_STAMP); + Checks::exit_success(VCPKG_LINE_INFO); + } + fs.remove(paths.installed().hashfile_path(), VCPKG_LINE_INFO); + } + } + auto oprovider = PortFileProvider::make_overlay_provider(paths, extended_overlay_ports); PackageSpec toplevel{manifest_scf.core_paragraph->name, default_triplet}; auto install_plan = Dependencies::create_versioned_install_plan(*verprovider, @@ -1015,6 +1075,7 @@ namespace vcpkg::Install host_triplet, unsupported_port_action) .value_or_exit(VCPKG_LINE_INFO); + for (const auto& warning : install_plan.warnings) { print2(Color::warning, warning, '\n'); @@ -1032,15 +1093,18 @@ namespace vcpkg::Install PortFileProvider::PathsPortFileProvider provider(paths, extended_overlay_ports); - Commands::SetInstalled::perform_and_exit_ex(args, - paths, - provider, - binary_cache, - var_provider, - std::move(install_plan), - dry_run ? Commands::DryRun::Yes : Commands::DryRun::No, - pkgsconfig, - host_triplet); + Commands::SetInstalled::perform_ex(args, + paths, + provider, + binary_cache, + var_provider, + std::move(install_plan), + dry_run ? Commands::DryRun::Yes : Commands::DryRun::No, + pkgsconfig, + host_triplet); + + fs.write_contents_and_dirs(paths.installed().hashfile_path(), hash, VCPKG_LINE_INFO); + Checks::exit_success(VCPKG_LINE_INFO); } PortFileProvider::PathsPortFileProvider provider(paths, args.overlay_ports); diff --git a/src/vcpkg/vcpkgpaths.cpp b/src/vcpkg/vcpkgpaths.cpp index 30a23b7be1..59d61e598f 100644 --- a/src/vcpkg/vcpkgpaths.cpp +++ b/src/vcpkg/vcpkgpaths.cpp @@ -1434,6 +1434,12 @@ namespace vcpkg return m_pimpl->m_env_cache.get_compiler_info(*this, abi_info); } + std::string VcpkgPaths::get_configuration_hash() const + { + return Hash::get_string_hash(Json::stringify(m_pimpl->m_config.serialize(), Json::JsonStyle{}.with_spaces(0)), + Hash::Algorithm::Sha512); + } + Filesystem& VcpkgPaths::get_filesystem() const { return m_pimpl->m_fs; } bool VcpkgPaths::use_git_default_registry() const { return m_pimpl->m_bundle.m_usegitregistry; } From 5db2fb84f87ad09b8335efc8c73788c6d9e6c150 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Mon, 25 Apr 2022 01:01:18 +0200 Subject: [PATCH 02/14] Check last_write_times instead of file hashes --- include/vcpkg/base/files.h | 3 ++ include/vcpkg/installedpaths.h | 4 +-- include/vcpkg/vcpkgpaths.h | 1 - src/vcpkg/base/files.cpp | 31 ++++++++++++++++ src/vcpkg/install.cpp | 66 ++++++++++++++++++++++++---------- src/vcpkg/vcpkgpaths.cpp | 7 ---- 6 files changed, 84 insertions(+), 28 deletions(-) diff --git a/include/vcpkg/base/files.h b/include/vcpkg/base/files.h index 68d5918c85..df93686e66 100644 --- a/include/vcpkg/base/files.h +++ b/include/vcpkg/base/files.h @@ -320,6 +320,9 @@ namespace vcpkg virtual FileType symlink_status(const Path& target, std::error_code& ec) const = 0; FileType symlink_status(const Path& target, LineInfo li) const noexcept; + virtual int64_t last_write_time(const Path& target, std::error_code& ec) const = 0; + int64_t last_write_time(const Path& target, LineInfo li) const noexcept; + virtual Path absolute(const Path& target, std::error_code& ec) const = 0; Path absolute(const Path& target, LineInfo li) const; diff --git a/include/vcpkg/installedpaths.h b/include/vcpkg/installedpaths.h index 1e8f9c9b5b..9769faa512 100644 --- a/include/vcpkg/installedpaths.h +++ b/include/vcpkg/installedpaths.h @@ -20,7 +20,7 @@ namespace vcpkg Path vcpkg_dir_info() const { return vcpkg_dir() / "info"; } Path vcpkg_dir_updates() const { return vcpkg_dir() / "updates"; } Path lockfile_path() const { return vcpkg_dir() / "vcpkg-lock.json"; } - Path hashfile_path() const { return vcpkg_dir() / "hash.txt"; } + Path stampfile_path() const { return vcpkg_dir() / "stampfile"; } Path triplet_dir(Triplet t) const { return m_root / t.canonical_name(); } Path share_dir(const PackageSpec& p) const { return triplet_dir(p.triplet()) / "share" / p.name(); } Path usage_file(const PackageSpec& p) const { return share_dir(p) / "usage"; } @@ -30,4 +30,4 @@ namespace vcpkg Path m_root; }; -} \ No newline at end of file +} diff --git a/include/vcpkg/vcpkgpaths.h b/include/vcpkg/vcpkgpaths.h index dafa245f4e..dad782e9e7 100644 --- a/include/vcpkg/vcpkgpaths.h +++ b/include/vcpkg/vcpkgpaths.h @@ -167,7 +167,6 @@ namespace vcpkg const std::string& get_triplet_info(const Build::AbiInfo& abi_info) const; const Build::CompilerInfo& get_compiler_info(const Build::AbiInfo& abi_info) const; bool manifest_mode_enabled() const { return get_manifest().has_value(); } - std::string get_configuration_hash() const; const FeatureFlagSettings& get_feature_flags() const; void track_feature_flag_metrics() const; diff --git a/src/vcpkg/base/files.cpp b/src/vcpkg/base/files.cpp index 944af8739b..9708df2788 100644 --- a/src/vcpkg/base/files.cpp +++ b/src/vcpkg/base/files.cpp @@ -1690,6 +1690,18 @@ namespace vcpkg return result; } + int64_t Filesystem::last_write_time(const Path& target, vcpkg::LineInfo li) const noexcept + { + std::error_code ec; + auto result = this->last_write_time(target, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {target}); + } + + return result; + } + void Filesystem::write_lines(const Path& file_path, const std::vector& lines, LineInfo li) { std::error_code ec; @@ -3038,6 +3050,25 @@ namespace vcpkg return FileType::unknown; #endif // ^^^ !_WIN32 } + + virtual int64_t last_write_time(const Path& target, std::error_code& ec) const override + { +#if defined(_WIN32) + auto result = stdfs::last_write_time(to_stdfs_path(target), ec); + return result.time_since_epoch().count(); +#else // ^^^ _WIN32 // !_WIN32 vvv + struct stat s; + if (::lstat(target.c_str(), &s) == 0) + { + ec.clear(); + return s.st_mtimespec.tv_sec * 1'000'000'000 + s.st_mtimespec.tv_nsec; + } + + ec.assign(errno, std::generic_category()); + return {}; +#endif // ^^^ !_WIN32 + } + virtual void write_contents(const Path& file_path, StringView data, std::error_code& ec) override { StatsTimer t(g_us_filesystem_stats); diff --git a/src/vcpkg/install.cpp b/src/vcpkg/install.cpp index a4a6b7814c..e585e0a6ec 100644 --- a/src/vcpkg/install.cpp +++ b/src/vcpkg/install.cpp @@ -1120,22 +1120,9 @@ namespace vcpkg::Install std::string hash; { - auto timer = ElapsedTimer::create_started(); auto hasher = Hash::get_hasher_for(Hash::Algorithm::Sha256); - for (auto&& path : args.overlay_ports) - { - for (auto&& file : fs.get_regular_files_recursive(path, VCPKG_LINE_INFO)) - { - hasher->add_bytes(fs.read_contents(file, VCPKG_LINE_INFO)); - } - } - hasher->add_bytes(paths.get_configuration_hash()); - hasher->add_bytes(Json::stringify(manifest->manifest, Json::JsonStyle{}.with_spaces(0))); hasher->add_bytes(default_triplet.to_string()); hasher->add_bytes(host_triplet.to_string()); - hasher->add_bytes(fs.read_contents(paths.get_triplet_file_path(default_triplet), VCPKG_LINE_INFO)); - hasher->add_bytes(fs.read_contents(paths.get_triplet_file_path(host_triplet), VCPKG_LINE_INFO)); - hasher->add_bytes(fs.read_contents(paths.get_triplet_file_path(host_triplet), VCPKG_LINE_INFO)); for (const auto& feature : features) { hasher->add_bytes(feature); @@ -1148,16 +1135,59 @@ namespace vcpkg::Install hasher->add_bytes(maybe_git_sha.value_or_exit(VCPKG_LINE_INFO)); } } - Debug::print("Time needed to compute hash for stamp: ", timer.elapsed().to_string(), "\n"); hash = hasher->get_hash(); - if (fs.exists(paths.installed().hashfile_path(), VCPKG_LINE_INFO)) + + auto have_file_change = [&]() { + auto last_install = fs.last_write_time(paths.installed().stampfile_path(), VCPKG_LINE_INFO); + for (auto&& path : args.overlay_ports) + { + if (fs.last_write_time(path, VCPKG_LINE_INFO) > last_install) + { + return true; + } + for (auto&& file : fs.get_files_recursive(path, VCPKG_LINE_INFO)) + { + if (fs.last_write_time(file, VCPKG_LINE_INFO) > last_install) + { + return true; + } + } + } + + if (fs.last_write_time(paths.get_manifest().value_or_exit(VCPKG_LINE_INFO).path, VCPKG_LINE_INFO) > + last_install) + { + return true; + } + auto config_file = paths.get_configuration().directory / "vcpkg-configuration.json"; + if (fs.exists(config_file, VCPKG_LINE_INFO)) + { + if (fs.last_write_time(config_file, VCPKG_LINE_INFO) > last_install) + { + return true; + } + } + if (fs.last_write_time(paths.get_triplet_file_path(default_triplet), VCPKG_LINE_INFO) > + last_install) + { + return true; + } + if (fs.last_write_time(paths.get_triplet_file_path(host_triplet), VCPKG_LINE_INFO) > last_install) + { + return true; + } + return false; + }; + + if (check_stamp && fs.exists(paths.installed().stampfile_path(), VCPKG_LINE_INFO)) { - if (check_stamp && fs.read_contents(paths.installed().hashfile_path(), VCPKG_LINE_INFO) == hash) + if (fs.read_contents(paths.installed().stampfile_path(), VCPKG_LINE_INFO) == hash && + !have_file_change()) { msg::println(msgStampNotChanged, msg::option = OPTION_CHECK_STAMP); Checks::exit_success(VCPKG_LINE_INFO); } - fs.remove(paths.installed().hashfile_path(), VCPKG_LINE_INFO); + fs.remove(paths.installed().stampfile_path(), VCPKG_LINE_INFO); } } @@ -1201,7 +1231,7 @@ namespace vcpkg::Install pkgsconfig, host_triplet); - fs.write_contents_and_dirs(paths.installed().hashfile_path(), hash, VCPKG_LINE_INFO); + fs.write_contents_and_dirs(paths.installed().stampfile_path(), hash, VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO); } diff --git a/src/vcpkg/vcpkgpaths.cpp b/src/vcpkg/vcpkgpaths.cpp index d56f93d86f..3574e452d3 100644 --- a/src/vcpkg/vcpkgpaths.cpp +++ b/src/vcpkg/vcpkgpaths.cpp @@ -1428,13 +1428,6 @@ namespace vcpkg return m_pimpl->m_env_cache.get_compiler_info(*this, abi_info); } - std::string VcpkgPaths::get_configuration_hash() const - { - return Hash::get_string_hash( - Json::stringify(m_pimpl->m_config.config.serialize(), Json::JsonStyle{}.with_spaces(0)), - Hash::Algorithm::Sha512); - } - Filesystem& VcpkgPaths::get_filesystem() const { return m_pimpl->m_fs; } bool VcpkgPaths::use_git_default_registry() const { return m_pimpl->m_bundle.m_usegitregistry; } From 35bff023bceaae4b15bce9aef0f03fcdb30f21ea Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Mon, 25 Apr 2022 01:16:48 +0200 Subject: [PATCH 03/14] Non apple unix --- src/vcpkg/base/files.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vcpkg/base/files.cpp b/src/vcpkg/base/files.cpp index 9708df2788..8a525ca45e 100644 --- a/src/vcpkg/base/files.cpp +++ b/src/vcpkg/base/files.cpp @@ -3061,7 +3061,11 @@ namespace vcpkg if (::lstat(target.c_str(), &s) == 0) { ec.clear(); +#ifdef __APPLE__ return s.st_mtimespec.tv_sec * 1'000'000'000 + s.st_mtimespec.tv_nsec; +#else + return s.st_mtim.tv_sec * 1'000'000'000 + s.st_mtim.tv_nsec; +#endif } ec.assign(errno, std::generic_category()); From 944317d0b4998d8acb561b9fa51e3141c9f94df1 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Mon, 25 Apr 2022 01:31:12 +0200 Subject: [PATCH 04/14] Fix warning --- src/vcpkg/base/hash.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/vcpkg/base/hash.cpp b/src/vcpkg/base/hash.cpp index 90a26c5198..c2f80b8b0d 100644 --- a/src/vcpkg/base/hash.cpp +++ b/src/vcpkg/base/hash.cpp @@ -40,16 +40,6 @@ namespace vcpkg::Hash return {}; } - const char* to_string(Algorithm algo) noexcept - { - switch (algo) - { - case Algorithm::Sha256: return "SHA256"; - case Algorithm::Sha512: return "SHA512"; - default: vcpkg::Checks::exit_fail(VCPKG_LINE_INFO); - } - } - void Hasher::add_bytes(StringView data) { add_bytes(data.data(), data.data() + data.size()); } template From ee3d870ace184d576236548bd5eba547f8ec56ba Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Mon, 25 Apr 2022 02:01:32 +0200 Subject: [PATCH 05/14] Format --- src/vcpkg/base/files.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vcpkg/base/files.cpp b/src/vcpkg/base/files.cpp index 8a525ca45e..5b249de49c 100644 --- a/src/vcpkg/base/files.cpp +++ b/src/vcpkg/base/files.cpp @@ -3056,7 +3056,7 @@ namespace vcpkg #if defined(_WIN32) auto result = stdfs::last_write_time(to_stdfs_path(target), ec); return result.time_since_epoch().count(); -#else // ^^^ _WIN32 // !_WIN32 vvv +#else // ^^^ _WIN32 // !_WIN32 vvv struct stat s; if (::lstat(target.c_str(), &s) == 0) { From d6321f4e0c3baa7f66de632a728f94dfb058e078 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Tue, 9 Aug 2022 19:20:23 +0200 Subject: [PATCH 06/14] Trigger Build From 8e2a24dd499ed46c73f8ea13346046239d664300 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Fri, 21 Oct 2022 20:14:30 +0200 Subject: [PATCH 07/14] Implement Compiler Info Cache --- include/vcpkg/base/jsonreader.h | 9 +++ include/vcpkg/build.h | 2 + include/vcpkg/installedpaths.h | 4 ++ src/vcpkg/base/json.cpp | 1 + src/vcpkg/build.cpp | 118 +++++++++++++++++++++++++++++++- 5 files changed, 132 insertions(+), 2 deletions(-) diff --git a/include/vcpkg/base/jsonreader.h b/include/vcpkg/base/jsonreader.h index 526b889746..9daedbd9e3 100644 --- a/include/vcpkg/base/jsonreader.h +++ b/include/vcpkg/base/jsonreader.h @@ -312,6 +312,15 @@ namespace vcpkg::Json static NaturalNumberDeserializer instance; }; + struct Int64Deserializer final : IDeserializer + { + virtual StringView type_name() const override { return "a 64-bit integer"; } + + virtual Optional visit_integer(Reader&, int64_t value) override { return value; } + + static Int64Deserializer instance; + }; + struct BooleanDeserializer final : IDeserializer { virtual StringView type_name() const override { return "a boolean"; } diff --git a/include/vcpkg/build.h b/include/vcpkg/build.h index 9d02c12cef..c8d8b6c1a9 100644 --- a/include/vcpkg/build.h +++ b/include/vcpkg/build.h @@ -376,6 +376,8 @@ namespace vcpkg std::string id; std::string version; std::string hash; + Path c_compiler_path; + Path cxx_compiler_path; }; struct AbiInfo diff --git a/include/vcpkg/installedpaths.h b/include/vcpkg/installedpaths.h index 9769faa512..26859a90e0 100644 --- a/include/vcpkg/installedpaths.h +++ b/include/vcpkg/installedpaths.h @@ -22,6 +22,10 @@ namespace vcpkg Path lockfile_path() const { return vcpkg_dir() / "vcpkg-lock.json"; } Path stampfile_path() const { return vcpkg_dir() / "stampfile"; } Path triplet_dir(Triplet t) const { return m_root / t.canonical_name(); } + Path compiler_info_cache_file(Triplet t) const + { + return vcpkg_dir() / "compiler_info_cache" / t.canonical_name(); + } Path share_dir(const PackageSpec& p) const { return triplet_dir(p.triplet()) / "share" / p.name(); } Path usage_file(const PackageSpec& p) const { return share_dir(p) / "usage"; } Path vcpkg_port_config_cmake(const PackageSpec& p) const { return share_dir(p) / "vcpkg-port-config.cmake"; } diff --git a/src/vcpkg/base/json.cpp b/src/vcpkg/base/json.cpp index dab95a2924..1041a41b8a 100644 --- a/src/vcpkg/base/json.cpp +++ b/src/vcpkg/base/json.cpp @@ -1019,6 +1019,7 @@ namespace vcpkg::Json } NaturalNumberDeserializer NaturalNumberDeserializer::instance; + Int64Deserializer Int64Deserializer::instance; BooleanDeserializer BooleanDeserializer::instance; ParagraphDeserializer ParagraphDeserializer::instance; IdentifierDeserializer IdentifierDeserializer::instance; diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 1daee0ed76..f2c017bc4c 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -493,6 +493,83 @@ namespace vcpkg }); } + struct CompilerInfoCache + { + CompilerInfo compiler_info; + int64_t c_compiler_last_write_time; + int64_t cxx_compiler_last_write_time; + }; + + struct CompilerInfoCacheDeserializer : Json::IDeserializer + { + StringView type_name() const override { return "CompilerInfoCache"; } + + constexpr static StringLiteral ID = "id"; + constexpr static StringLiteral VERSION = "version"; + constexpr static StringLiteral HASH = "hash"; + constexpr static StringLiteral C_COMPILER_PATH = "c_compiler_path"; + constexpr static StringLiteral CXX_COMPILER_PATH = "cxx_compiler_path"; + constexpr static StringLiteral C_COMPILER_PATH_LAST_WRITE_TIME = "c_compiler_path_last_write_time"; + constexpr static StringLiteral CXX_COMPILER_PATH_LAST_WRITE_TIME = "cxx_compiler_path_last_write_time"; + + virtual Span valid_fields() const override + { + static const StringView t[] = {ID, + VERSION, + HASH, + C_COMPILER_PATH, + CXX_COMPILER_PATH, + C_COMPILER_PATH_LAST_WRITE_TIME, + CXX_COMPILER_PATH_LAST_WRITE_TIME}; + return t; + } + + virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) override + { + CompilerInfoCache cache; + Json::StringDeserializer string_deserializer("a string"); + r.required_object_field(ID, obj, ID, cache.compiler_info.id, string_deserializer); + r.required_object_field(VERSION, obj, VERSION, cache.compiler_info.version, string_deserializer); + r.required_object_field(HASH, obj, HASH, cache.compiler_info.hash, string_deserializer); + r.required_object_field(C_COMPILER_PATH, + obj, + C_COMPILER_PATH, + cache.compiler_info.c_compiler_path, + Json::PathDeserializer::instance); + r.required_object_field(CXX_COMPILER_PATH, + obj, + CXX_COMPILER_PATH, + cache.compiler_info.cxx_compiler_path, + Json::PathDeserializer::instance); + r.required_object_field(C_COMPILER_PATH_LAST_WRITE_TIME, + obj, + C_COMPILER_PATH_LAST_WRITE_TIME, + cache.c_compiler_last_write_time, + Json::Int64Deserializer::instance); + r.required_object_field(CXX_COMPILER_PATH_LAST_WRITE_TIME, + obj, + CXX_COMPILER_PATH_LAST_WRITE_TIME, + cache.cxx_compiler_last_write_time, + Json::Int64Deserializer::instance); + return cache; + } + static CompilerInfoCacheDeserializer instance; + + static Json::Object serialize(const CompilerInfoCache& cache) + { + Json::Object obj; + obj.insert(ID, cache.compiler_info.id); + obj.insert(VERSION, cache.compiler_info.version); + obj.insert(HASH, cache.compiler_info.hash); + obj.insert(C_COMPILER_PATH, cache.compiler_info.c_compiler_path); + obj.insert(CXX_COMPILER_PATH, cache.compiler_info.cxx_compiler_path); + obj.insert(C_COMPILER_PATH_LAST_WRITE_TIME, Json::Value::integer(cache.c_compiler_last_write_time)); + obj.insert(CXX_COMPILER_PATH_LAST_WRITE_TIME, Json::Value::integer(cache.cxx_compiler_last_write_time)); + return obj; + } + }; + CompilerInfoCacheDeserializer CompilerInfoCacheDeserializer::instance; + const CompilerInfo& EnvCache::get_compiler_info(const VcpkgPaths& paths, const AbiInfo& abi_info) { Checks::check_exit(VCPKG_LINE_INFO, abi_info.pre_build_info != nullptr); @@ -513,7 +590,34 @@ namespace vcpkg return triplet_entry.compiler_info.get_lazy(toolchain_hash, [&]() -> CompilerInfo { if (m_compiler_tracking) { - return load_compiler_info(paths, abi_info); + auto cache_file = paths.installed().compiler_info_cache_file(abi_info.pre_build_info->triplet); + auto& fs = paths.get_filesystem(); + if (fs.exists(cache_file, VCPKG_LINE_INFO)) + { + auto json_object = Json::parse_object(fs.read_contents(cache_file, VCPKG_LINE_INFO), cache_file) + .value_or_exit(VCPKG_LINE_INFO); + Json::Reader reader; + CompilerInfoCache cache = reader.visit(json_object, CompilerInfoCacheDeserializer::instance) + .value_or_exit(VCPKG_LINE_INFO); + auto needs_update = [&](const Path& path, int64_t last_write_time) { + return !(fs.exists(path, VCPKG_LINE_INFO) && + fs.last_write_time(path, VCPKG_LINE_INFO) <= last_write_time); + }; + if (!needs_update(cache.compiler_info.c_compiler_path, cache.c_compiler_last_write_time) && + !needs_update(cache.compiler_info.cxx_compiler_path, cache.cxx_compiler_last_write_time)) + { + return cache.compiler_info; + } + } + auto compiler_info = load_compiler_info(paths, abi_info); + CompilerInfoCache cache; + cache.compiler_info = compiler_info; + cache.c_compiler_last_write_time = fs.last_write_time(compiler_info.c_compiler_path, VCPKG_LINE_INFO); + cache.cxx_compiler_last_write_time = + fs.last_write_time(compiler_info.cxx_compiler_path, VCPKG_LINE_INFO); + fs.write_contents_and_dirs( + cache_file, Json::stringify(CompilerInfoCacheDeserializer::serialize(cache)), VCPKG_LINE_INFO); + return compiler_info; } else { @@ -671,7 +775,17 @@ namespace vcpkg { compiler_info.id = s.substr(s_id_marker.size()).to_string(); } - Debug::print(s, '\n'); + static const StringLiteral s_c_compiler_marker = "#COMPILER_C_PATH#"; + if (Strings::starts_with(s, s_c_compiler_marker)) + { + compiler_info.c_compiler_path = s.substr(s_c_compiler_marker.size()).to_string(); + } + static const StringLiteral s_cxx_compiler_marker = "#COMPILER_CXX_PATH#"; + if (Strings::starts_with(s, s_cxx_compiler_marker)) + { + compiler_info.cxx_compiler_path = s.substr(s_cxx_compiler_marker.size()).to_string(); + } + Debug::println(s); const auto old_buf_size = buf.size(); Strings::append(buf, s, '\n'); const auto write_size = buf.size() - old_buf_size; From 1a20637087d3addf3dc9ddc338482e24ce22492b Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Sun, 23 Oct 2022 17:00:25 +0200 Subject: [PATCH 08/14] remove check-stamp-file code --- include/vcpkg/base/hash.h | 1 - include/vcpkg/base/messages.h | 5 -- include/vcpkg/commands.setinstalled.h | 24 +++--- include/vcpkg/installedpaths.h | 1 - locales/messages.en.json | 1 - locales/messages.json | 2 - src/vcpkg/base/hash.cpp | 2 - src/vcpkg/base/messages.cpp | 1 - src/vcpkg/commands.setinstalled.cpp | 50 ++++++------ src/vcpkg/install.cpp | 111 +++----------------------- 10 files changed, 51 insertions(+), 147 deletions(-) diff --git a/include/vcpkg/base/hash.h b/include/vcpkg/base/hash.h index 8d7b3263a1..373e65b7a1 100644 --- a/include/vcpkg/base/hash.h +++ b/include/vcpkg/base/hash.h @@ -19,7 +19,6 @@ namespace vcpkg::Hash struct Hasher { - void add_bytes(StringView data); virtual void add_bytes(const void* start, const void* end) noexcept = 0; // one may only call this once before calling `clear()` or the dtor diff --git a/include/vcpkg/base/messages.h b/include/vcpkg/base/messages.h index a54dcb2c5b..fab2f203eb 100644 --- a/include/vcpkg/base/messages.h +++ b/include/vcpkg/base/messages.h @@ -1567,11 +1567,6 @@ namespace vcpkg "", "Specify the target architecture triplet. See 'vcpkg help triplet'.\n(default: '{env_var}')"); DECLARE_MESSAGE(StartCodeUnitInContinue, (), "", "found start code unit in continue position"); - DECLARE_MESSAGE(StampNotChanged, - (msg::option), - "", - "Installation skipped. Everything seems to be installed. To disable this check, don't " - "pass the option `--{option}` to vcpkg."); DECLARE_MESSAGE(StoredBinaryCache, (msg::path), "", "Stored binary cache: \"{path}\""); DECLARE_MESSAGE(StoreOptionMissingSha, (), "", "--store option is invalid without a sha512"); DECLARE_MESSAGE(SuggestGitPull, (), "", "The result may be outdated. Run `git pull` to get the latest results."); diff --git a/include/vcpkg/commands.setinstalled.h b/include/vcpkg/commands.setinstalled.h index f466d8ba38..083efa79d3 100644 --- a/include/vcpkg/commands.setinstalled.h +++ b/include/vcpkg/commands.setinstalled.h @@ -8,18 +8,18 @@ namespace vcpkg::Commands::SetInstalled { extern const CommandStructure COMMAND_STRUCTURE; - void perform_ex(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - const PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const CMakeVars::CMakeVarProvider& cmake_vars, - ActionPlan action_plan, - DryRun dry_run, - const Optional& pkgsconfig_path, - Triplet host_triplet, - const KeepGoing keep_going, - const bool only_downloads, - const PrintUsage print_cmake_usage); + void perform_and_exit_ex(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + const PathsPortFileProvider& provider, + BinaryCache& binary_cache, + const CMakeVars::CMakeVarProvider& cmake_vars, + ActionPlan action_plan, + DryRun dry_run, + const Optional& pkgsconfig_path, + Triplet host_triplet, + const KeepGoing keep_going, + const bool only_downloads, + const PrintUsage print_cmake_usage); void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet default_triplet, diff --git a/include/vcpkg/installedpaths.h b/include/vcpkg/installedpaths.h index 26859a90e0..5585230bd2 100644 --- a/include/vcpkg/installedpaths.h +++ b/include/vcpkg/installedpaths.h @@ -20,7 +20,6 @@ namespace vcpkg Path vcpkg_dir_info() const { return vcpkg_dir() / "info"; } Path vcpkg_dir_updates() const { return vcpkg_dir() / "updates"; } Path lockfile_path() const { return vcpkg_dir() / "vcpkg-lock.json"; } - Path stampfile_path() const { return vcpkg_dir() / "stampfile"; } Path triplet_dir(Triplet t) const { return m_root / t.canonical_name(); } Path compiler_info_cache_file(Triplet t) const { diff --git a/locales/messages.en.json b/locales/messages.en.json index f764bb07a5..1b41e0a23a 100644 --- a/locales/messages.en.json +++ b/locales/messages.en.json @@ -408,7 +408,6 @@ "SpecifyDirectoriesWhenSearching": "Specify directories to be used when searching for ports.\n(also: '{env_var}')", "SpecifyHostArch": "Specify the host architecture triplet. See 'vcpkg help triplet'.\n(default: '{env_var}')", "SpecifyTargetArch": "Specify the target architecture triplet. See 'vcpkg help triplet'.\n(default: '{env_var}')", - "StampNotChanged": "Installation skipped. Everything seems to be installed. To disable this check, don't pass the option `--{option}` to vcpkg.", "StartCodeUnitInContinue": "found start code unit in continue position", "StoreOptionMissingSha": "--store option is invalid without a sha512", "StoredBinaryCache": "Stored binary cache: \"{path}\"", diff --git a/locales/messages.json b/locales/messages.json index d7b671113c..423589e4c7 100644 --- a/locales/messages.json +++ b/locales/messages.json @@ -653,8 +653,6 @@ "_SpecifyHostArch.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", "SpecifyTargetArch": "Specify the target architecture triplet. See 'vcpkg help triplet'.\n(default: '{env_var}')", "_SpecifyTargetArch.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", - "StampNotChanged": "Installation skipped. Everything seems to be installed. To disable this check, don't pass the option `--{option}` to vcpkg.", - "_StampNotChanged.comment": "An example of {option} is editable.", "StartCodeUnitInContinue": "found start code unit in continue position", "StoreOptionMissingSha": "--store option is invalid without a sha512", "StoredBinaryCache": "Stored binary cache: \"{path}\"", diff --git a/src/vcpkg/base/hash.cpp b/src/vcpkg/base/hash.cpp index 52207903d5..5b816d34a3 100644 --- a/src/vcpkg/base/hash.cpp +++ b/src/vcpkg/base/hash.cpp @@ -34,8 +34,6 @@ namespace vcpkg::Hash return {}; } - void Hasher::add_bytes(StringView data) { add_bytes(data.data(), data.data() + data.size()); } - template auto top_bits(UIntTy x) -> std::enable_if_t::value, uchar> { diff --git a/src/vcpkg/base/messages.cpp b/src/vcpkg/base/messages.cpp index d6601a3cab..aa399fc89c 100644 --- a/src/vcpkg/base/messages.cpp +++ b/src/vcpkg/base/messages.cpp @@ -783,7 +783,6 @@ namespace vcpkg REGISTER_MESSAGE(SpecifyHostArch); REGISTER_MESSAGE(SpecifyTargetArch); REGISTER_MESSAGE(StartCodeUnitInContinue); - REGISTER_MESSAGE(StampNotChanged); REGISTER_MESSAGE(StoredBinaryCache); REGISTER_MESSAGE(StoreOptionMissingSha); REGISTER_MESSAGE(SuggestGitPull); diff --git a/src/vcpkg/commands.setinstalled.cpp b/src/vcpkg/commands.setinstalled.cpp index 15eda24570..1d9d34b388 100644 --- a/src/vcpkg/commands.setinstalled.cpp +++ b/src/vcpkg/commands.setinstalled.cpp @@ -38,18 +38,18 @@ namespace vcpkg::Commands::SetInstalled nullptr, }; - void perform_ex(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - const PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const CMakeVars::CMakeVarProvider& cmake_vars, - ActionPlan action_plan, - DryRun dry_run, - const Optional& maybe_pkgsconfig, - Triplet host_triplet, - const KeepGoing keep_going, - const bool only_downloads, - const PrintUsage print_cmake_usage) + void perform_and_exit_ex(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + const PathsPortFileProvider& provider, + BinaryCache& binary_cache, + const CMakeVars::CMakeVarProvider& cmake_vars, + ActionPlan action_plan, + DryRun dry_run, + const Optional& maybe_pkgsconfig, + Triplet host_triplet, + const KeepGoing keep_going, + const bool only_downloads, + const PrintUsage print_cmake_usage) { auto& fs = paths.get_filesystem(); @@ -148,6 +148,8 @@ namespace vcpkg::Commands::SetInstalled } } } + + Checks::exit_success(VCPKG_LINE_INFO); } void perform_and_exit(const VcpkgCmdArguments& args, @@ -194,18 +196,18 @@ namespace vcpkg::Commands::SetInstalled action.build_options = default_build_package_options; } - perform_ex(args, - paths, - provider, - binary_cache, - *cmake_vars, - std::move(action_plan), - dry_run ? DryRun::Yes : DryRun::No, - pkgsconfig, - host_triplet, - keep_going, - only_downloads, - print_cmake_usage); + perform_and_exit_ex(args, + paths, + provider, + binary_cache, + *cmake_vars, + std::move(action_plan), + dry_run ? DryRun::Yes : DryRun::No, + pkgsconfig, + host_triplet, + keep_going, + only_downloads, + print_cmake_usage); } void SetInstalledCommand::perform_and_exit(const VcpkgCmdArguments& args, diff --git a/src/vcpkg/install.cpp b/src/vcpkg/install.cpp index a50aa15b9b..c406b1483d 100644 --- a/src/vcpkg/install.cpp +++ b/src/vcpkg/install.cpp @@ -564,7 +564,6 @@ namespace vcpkg static constexpr StringLiteral OPTION_RECURSE = "recurse"; static constexpr StringLiteral OPTION_KEEP_GOING = "keep-going"; static constexpr StringLiteral OPTION_EDITABLE = "editable"; - static constexpr StringLiteral OPTION_CHECK_STAMP = "check-stamp"; static constexpr StringLiteral OPTION_XUNIT = "x-xunit"; static constexpr StringLiteral OPTION_USE_ARIA2 = "x-use-aria2"; static constexpr StringLiteral OPTION_CLEAN_AFTER_BUILD = "clean-after-build"; @@ -579,7 +578,7 @@ namespace vcpkg static constexpr StringLiteral OPTION_ALLOW_UNSUPPORTED_PORT = "allow-unsupported"; static constexpr StringLiteral OPTION_NO_PRINT_USAGE = "no-print-usage"; - static constexpr std::array INSTALL_SWITCHES = { + static constexpr std::array INSTALL_SWITCHES = { {{OPTION_DRY_RUN, "Do not actually build or install"}, {OPTION_USE_HEAD_VERSION, "Install the libraries on the command line using the latest upstream sources (classic mode)"}, @@ -590,9 +589,6 @@ namespace vcpkg {OPTION_KEEP_GOING, "Continue installing packages on failure"}, {OPTION_EDITABLE, "Disable source re-extraction and binary caching for libraries on the command line (classic mode)"}, - {OPTION_CHECK_STAMP, - "If the configuration (triplets, manifest file, registries, selected features) is the same as the last time " - "install is skipped. Local port modifications are not detected anymore."}, {OPTION_USE_ARIA2, "Use aria2 to perform download tasks"}, {OPTION_CLEAN_AFTER_BUILD, "Clean buildtrees, packages and downloads after building each package"}, {OPTION_CLEAN_BUILDTREES_AFTER_BUILD, "Clean buildtrees after building each package"}, @@ -876,7 +872,6 @@ namespace vcpkg const bool no_build_missing = Util::Sets::contains(options.switches, OPTION_ONLY_BINARYCACHING); const bool is_recursive = Util::Sets::contains(options.switches, (OPTION_RECURSE)); const bool is_editable = Util::Sets::contains(options.switches, (OPTION_EDITABLE)) || !args.cmake_args.empty(); - const bool check_stamp = Util::Sets::contains(options.switches, (OPTION_CHECK_STAMP)); const bool use_aria2 = Util::Sets::contains(options.switches, (OPTION_USE_ARIA2)); const bool clean_after_build = Util::Sets::contains(options.switches, (OPTION_CLEAN_AFTER_BUILD)); const bool clean_buildtrees_after_build = @@ -940,11 +935,6 @@ namespace vcpkg msg::println_error(msgErrorInvalidClassicModeOption, msg::option = OPTION_MANIFEST_NO_DEFAULT_FEATURES); failure = true; } - if (Util::Sets::contains(options.switches, OPTION_CHECK_STAMP)) - { - msg::println(Color::error, msgErrorInvalidClassicModeOption, msg::option = OPTION_CHECK_STAMP); - failure = true; - } if (Util::Sets::contains(options.multisettings, OPTION_MANIFEST_FEATURE)) { msg::println_error(msgErrorInvalidClassicModeOption, msg::option = OPTION_MANIFEST_FEATURE); @@ -1079,79 +1069,6 @@ namespace vcpkg extended_overlay_ports.emplace_back(paths.builtin_ports_directory().native()); } - std::string hash; - { - auto hasher = Hash::get_hasher_for(Hash::Algorithm::Sha256); - hasher->add_bytes(default_triplet.to_string()); - hasher->add_bytes(host_triplet.to_string()); - for (const auto& feature : features) - { - hasher->add_bytes(feature); - } - if (paths.get_registry_set().is_default_builtin_registry()) - { - auto maybe_git_sha = paths.get_current_git_sha(); - if (maybe_git_sha) - { - hasher->add_bytes(maybe_git_sha.value_or_exit(VCPKG_LINE_INFO)); - } - } - hash = hasher->get_hash(); - - auto have_file_change = [&]() { - auto last_install = fs.last_write_time(paths.installed().stampfile_path(), VCPKG_LINE_INFO); - for (auto&& path : args.overlay_ports) - { - if (fs.last_write_time(path, VCPKG_LINE_INFO) > last_install) - { - return true; - } - for (auto&& file : fs.get_files_recursive(path, VCPKG_LINE_INFO)) - { - if (fs.last_write_time(file, VCPKG_LINE_INFO) > last_install) - { - return true; - } - } - } - - if (fs.last_write_time(paths.get_manifest().value_or_exit(VCPKG_LINE_INFO).path, VCPKG_LINE_INFO) > - last_install) - { - return true; - } - auto config_file = paths.get_configuration().directory / "vcpkg-configuration.json"; - if (fs.exists(config_file, VCPKG_LINE_INFO)) - { - if (fs.last_write_time(config_file, VCPKG_LINE_INFO) > last_install) - { - return true; - } - } - if (fs.last_write_time(paths.get_triplet_file_path(default_triplet), VCPKG_LINE_INFO) > - last_install) - { - return true; - } - if (fs.last_write_time(paths.get_triplet_file_path(host_triplet), VCPKG_LINE_INFO) > last_install) - { - return true; - } - return false; - }; - - if (check_stamp && fs.exists(paths.installed().stampfile_path(), VCPKG_LINE_INFO)) - { - if (fs.read_contents(paths.installed().stampfile_path(), VCPKG_LINE_INFO) == hash && - !have_file_change()) - { - msg::println(msgStampNotChanged, msg::option = OPTION_CHECK_STAMP); - Checks::exit_success(VCPKG_LINE_INFO); - } - fs.remove(paths.installed().stampfile_path(), VCPKG_LINE_INFO); - } - } - auto oprovider = make_manifest_provider(paths, extended_overlay_ports, manifest->path, std::move(manifest_scf)); PackageSpec toplevel{manifest_core.name, default_triplet}; @@ -1183,20 +1100,18 @@ namespace vcpkg PathsPortFileProvider provider(paths, std::move(oprovider)); - Commands::SetInstalled::perform_ex(args, - paths, - provider, - binary_cache, - var_provider, - std::move(install_plan), - dry_run ? Commands::DryRun::Yes : Commands::DryRun::No, - pkgsconfig, - host_triplet, - keep_going, - only_downloads, - print_cmake_usage); - fs.write_contents_and_dirs(paths.installed().stampfile_path(), hash, VCPKG_LINE_INFO); - Checks::exit_success(VCPKG_LINE_INFO); + Commands::SetInstalled::perform_and_exit_ex(args, + paths, + provider, + binary_cache, + var_provider, + std::move(install_plan), + dry_run ? Commands::DryRun::Yes : Commands::DryRun::No, + pkgsconfig, + host_triplet, + keep_going, + only_downloads, + print_cmake_usage); } PathsPortFileProvider provider(paths, make_overlay_provider(paths, args.overlay_ports)); From 2589952f4cc177e763428814d33ebfb9768e07f2 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Sun, 23 Oct 2022 17:02:08 +0200 Subject: [PATCH 09/14] no white space changes --- src/vcpkg/install.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vcpkg/install.cpp b/src/vcpkg/install.cpp index c406b1483d..16504a87f9 100644 --- a/src/vcpkg/install.cpp +++ b/src/vcpkg/install.cpp @@ -589,6 +589,7 @@ namespace vcpkg {OPTION_KEEP_GOING, "Continue installing packages on failure"}, {OPTION_EDITABLE, "Disable source re-extraction and binary caching for libraries on the command line (classic mode)"}, + {OPTION_USE_ARIA2, "Use aria2 to perform download tasks"}, {OPTION_CLEAN_AFTER_BUILD, "Clean buildtrees, packages and downloads after building each package"}, {OPTION_CLEAN_BUILDTREES_AFTER_BUILD, "Clean buildtrees after building each package"}, @@ -1099,7 +1100,6 @@ namespace vcpkg [&toplevel](auto&& action) { return action.spec == toplevel; }); PathsPortFileProvider provider(paths, std::move(oprovider)); - Commands::SetInstalled::perform_and_exit_ex(args, paths, provider, From e919aa10a5e34a4b6fc4c63fc07eb56794b93a64 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Sun, 30 Oct 2022 15:22:07 +0100 Subject: [PATCH 10/14] Move detect_compiler files to source code --- src/vcpkg/build.cpp | 122 ++++++++++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 49 deletions(-) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index ce19b93caf..0909886c29 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -733,14 +733,60 @@ namespace vcpkg static CompilerInfo load_compiler_info(const VcpkgPaths& paths, const AbiInfo& abi_info) { + static constexpr auto vcpkg_json = R"--( +{ + "name": "detect-compiler", + "version": "0", + "description": "None" +} +)--"; + static constexpr auto portfile_cmake = R"--( +set(VCPKG_BUILD_TYPE release) +vcpkg_configure_cmake( + SOURCE_PATH "${CMAKE_CURRENT_LIST_DIR}" + PREFER_NINJA + OPTIONS + "-DPACKAGES_DIR=${CURRENT_PACKAGES_DIR}" +) +)--"; + static constexpr auto cmakelists_txt = R"--( +cmake_minimum_required(VERSION 3.20) +project(detect_compiler NONE) + +if(CMAKE_GENERATOR STREQUAL "Ninja" AND CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(CMAKE_C_COMPILER_WORKS 1) + set(CMAKE_C_COMPILER_FORCED 1) + set(CMAKE_CXX_COMPILER_WORKS 1) + set(CMAKE_CXX_COMPILER_FORCED 1) +endif() + +enable_language(C) +enable_language(CXX) + +file(SHA1 "${CMAKE_CXX_COMPILER}" CXX_HASH) +file(SHA1 "${CMAKE_C_COMPILER}" C_HASH) +string(SHA1 COMPILER_HASH "${C_HASH}${CXX_HASH}") + +file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} +${CMAKE_CXX_COMPILER_VERSION} +${CMAKE_CXX_COMPILER_ID} +${CMAKE_C_COMPILER} +${CMAKE_CXX_COMPILER}") +)--"; auto triplet = abi_info.pre_build_info->triplet; msg::println(msgDetectCompilerHash, msg::triplet = triplet); auto buildpath = paths.buildtrees() / "detect_compiler"; + auto portpath = paths.buildtrees() / "detect_compiler-port"; + auto packagespath = paths.packages() / ("detect_compiler_" + triplet.canonical_name()); + auto& fs = paths.get_filesystem(); + fs.write_contents_and_dirs(portpath / "vcpkg.json", vcpkg_json, VCPKG_LINE_INFO); + fs.write_contents_and_dirs(portpath / "portfile.cmake", portfile_cmake, VCPKG_LINE_INFO); + fs.write_contents_and_dirs(portpath / "CMakeLists.txt", cmakelists_txt, VCPKG_LINE_INFO); std::vector cmake_args{ - {"CURRENT_PORT_DIR", paths.scripts / "detect_compiler"}, + {"CURRENT_PORT_DIR", portpath}, {"CURRENT_BUILDTREES_DIR", buildpath}, - {"CURRENT_PACKAGES_DIR", paths.packages() / ("detect_compiler_" + triplet.canonical_name())}, + {"CURRENT_PACKAGES_DIR", packagespath}, // The detect_compiler "port" doesn't depend on the host triplet, so always natively compile {"_HOST_TRIPLET", triplet.canonical_name()}, }; @@ -749,57 +795,26 @@ namespace vcpkg auto command = vcpkg::make_cmake_cmd(paths, paths.ports_cmake, std::move(cmake_args)); const auto& env = paths.get_action_env(abi_info); - auto& fs = paths.get_filesystem(); fs.create_directory(buildpath, VCPKG_LINE_INFO); auto stdoutlog = buildpath / ("stdout-" + triplet.canonical_name() + ".log"); - CompilerInfo compiler_info; - std::string buf; - ExpectedL rc = LocalizedString(); + auto result = flatten_out(cmd_execute_and_capture_output(command, default_working_directory, env), + command.command_line()); + CompilerInfo compiler_info; + if (result.has_value()) { - const auto out_file = fs.open_for_write(stdoutlog, VCPKG_LINE_INFO); - rc = cmd_execute_and_stream_lines( - command, - [&](StringView s) { - static const StringLiteral s_hash_marker = "#COMPILER_HASH#"; - if (Strings::starts_with(s, s_hash_marker)) - { - compiler_info.hash = s.substr(s_hash_marker.size()).to_string(); - } - static const StringLiteral s_version_marker = "#COMPILER_CXX_VERSION#"; - if (Strings::starts_with(s, s_version_marker)) - { - compiler_info.version = s.substr(s_version_marker.size()).to_string(); - } - static const StringLiteral s_id_marker = "#COMPILER_CXX_ID#"; - if (Strings::starts_with(s, s_id_marker)) - { - compiler_info.id = s.substr(s_id_marker.size()).to_string(); - } - static const StringLiteral s_c_compiler_marker = "#COMPILER_C_PATH#"; - if (Strings::starts_with(s, s_c_compiler_marker)) - { - compiler_info.c_compiler_path = s.substr(s_c_compiler_marker.size()).to_string(); - } - static const StringLiteral s_cxx_compiler_marker = "#COMPILER_CXX_PATH#"; - if (Strings::starts_with(s, s_cxx_compiler_marker)) - { - compiler_info.cxx_compiler_path = s.substr(s_cxx_compiler_marker.size()).to_string(); - } - Debug::println(s); - const auto old_buf_size = buf.size(); - Strings::append(buf, s, '\n'); - const auto write_size = buf.size() - old_buf_size; - Checks::msg_check_exit(VCPKG_LINE_INFO, - out_file.write(buf.c_str() + old_buf_size, 1, write_size) == write_size, - msgErrorWhileWriting, - msg::path = stdoutlog); - }, - default_working_directory, - env); - } // close out_file + auto lines = fs.read_lines(packagespath / "abi_info", VCPKG_LINE_INFO); + if (lines.size() == 5) + { + compiler_info.hash = lines[0]; + compiler_info.version = lines[1]; + compiler_info.id = lines[2]; + compiler_info.c_compiler_path = lines[3]; + compiler_info.cxx_compiler_path = lines[4]; + } + } - if (compiler_info.hash.empty() || !succeeded(rc)) + if (compiler_info.hash.empty() || !result.has_value()) { Debug::println("Compiler information tracking can be disabled by passing --", VcpkgCmdArguments::FEATURE_FLAGS_ARG, @@ -807,7 +822,16 @@ namespace vcpkg VcpkgCmdArguments::COMPILER_TRACKING_FEATURE); msg::println_error(msgErrorDetectingCompilerInfo, msg::path = stdoutlog); - msg::write_unlocalized_text_to_stdout(Color::none, buf); + if (result.has_value()) + { + msg::write_unlocalized_text_to_stdout(Color::none, *result.get()); + msg::write_unlocalized_text_to_stdout(Color::none, + fs.read_contents(packagespath / "abi_info", VCPKG_LINE_INFO)); + } + else + { + msg::println(result.error()); + } Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgErrorUnableToDetectCompilerInfo); } From 6d93b3a4d6b5855d15bfda48ad2399fda97dc205 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Sun, 30 Oct 2022 16:12:16 +0100 Subject: [PATCH 11/14] Change last_write_time check from <= to != --- src/vcpkg/build.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index 077984e23f..c36a964071 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -601,7 +601,7 @@ namespace vcpkg .value_or_exit(VCPKG_LINE_INFO); auto needs_update = [&](const Path& path, int64_t last_write_time) { return !(fs.exists(path, VCPKG_LINE_INFO) && - fs.last_write_time(path, VCPKG_LINE_INFO) <= last_write_time); + fs.last_write_time(path, VCPKG_LINE_INFO) != last_write_time); }; if (!needs_update(cache.compiler_info.c_compiler_path, cache.c_compiler_last_write_time) && !needs_update(cache.compiler_info.cxx_compiler_path, cache.cxx_compiler_last_write_time)) From 3c10a826e739e4bc81d4de091c819dff725a81d9 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Mon, 31 Oct 2022 15:27:23 +0100 Subject: [PATCH 12/14] fix wrong comparison --- src/vcpkg/build.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vcpkg/build.cpp b/src/vcpkg/build.cpp index c36a964071..047504981c 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/build.cpp @@ -600,8 +600,8 @@ namespace vcpkg CompilerInfoCache cache = reader.visit(json_object, CompilerInfoCacheDeserializer::instance) .value_or_exit(VCPKG_LINE_INFO); auto needs_update = [&](const Path& path, int64_t last_write_time) { - return !(fs.exists(path, VCPKG_LINE_INFO) && - fs.last_write_time(path, VCPKG_LINE_INFO) != last_write_time); + return !fs.exists(path, VCPKG_LINE_INFO) || + fs.last_write_time(path, VCPKG_LINE_INFO) != last_write_time; }; if (!needs_update(cache.compiler_info.c_compiler_path, cache.c_compiler_last_write_time) && !needs_update(cache.compiler_info.cxx_compiler_path, cache.cxx_compiler_last_write_time)) From 56e77553b91fe0191acaae9b6008ad38c0f23d04 Mon Sep 17 00:00:00 2001 From: Leander Schulten Date: Thu, 12 Oct 2023 18:23:02 +0200 Subject: [PATCH 13/14] Merge branch 'main' into check-stamp --- .github/workflows/build.yaml | 85 + .github/workflows/ci.yaml | 17 + .github/workflows/matchers.json | 44 + .github/workflows/pr.yaml | 68 + .gitignore | 31 +- .vscode/settings.json | 70 +- CMakeLists.txt | 334 +- CMakePresets.json | 205 + CMakeSettings.json | 230 - azure-pipelines/.npmrc-internal | 3 - azure-pipelines/Create-PRDiff.ps1 | 11 +- .../arch-independent-signing.signproj | 11 +- azure-pipelines/binary-signing.signproj | 4 +- .../index.yaml | 0 .../vcpkg-test-artifact-1-1.0.0.json | 0 .../vcpkg-test-artifact-2-1.0.0.json | 0 .../vcpkg-test-artifact-3-1.0.0.json | 0 azure-pipelines/e2e-assets/ci/ci.baseline.txt | 16 + .../extract/a-tar-with-plus-x.tar.gz | Bin 0 -> 118 bytes .../fetch/ninja.bat | 0 .../format-manifest/empty.json | 0 .../format-manifest/expected/empty.json | 0 .../expected/name-and-version.json | 0 .../format-manifest/expected/name.json | 0 .../format-manifest/expected/version.json | 0 .../format-manifest/name-and-version.json | 0 .../format-manifest/name.json | 0 .../format-manifest/version.json | 0 .../test-dll-port-template/build.cmd | 0 .../test-dll-port-template/portfile.cmake | 0 .../test-dll-port-template/test.c | 0 .../test-dll-port-template/test.def | 0 .../test-dll-port-template/test.h | 0 .../test-dll-port-template/vcpkg.json | 0 .../build.cmd | 0 .../portfile.cmake | 0 .../test-lib-port-template-dynamic-crt/test.c | 0 .../test-lib-port-template-dynamic-crt/test.h | 0 .../vcpkg.json | 0 .../ci/base-port/portfile.cmake | 0 .../ci/base-port/vcpkg.json | 0 .../ci/dep-on-feature-not-sup/portfile.cmake | 0 .../ci/dep-on-feature-not-sup/vcpkg.json | 0 .../ci/feature-not-sup/portfile.cmake | 0 .../ci/feature-not-sup/vcpkg.json | 0 .../ci/not-sup-host-b/portfile.cmake | 0 .../ci/not-sup-host-b/vcpkg.json | 0 .../compilertracking/x64-linux.cmake | 0 .../e2e-ports/control-file/CONTROL | 4 + .../control-file}/portfile.cmake | 0 .../env-passthrough/passthrough.cmake | 0 .../integrate-install/NoProps.vcxproj | 0 .../integrate-install/Project1.vcxproj | 0 .../integrate-install/Source.cpp | 0 .../integrate-install/VcpkgTriplet.vcxproj | 0 .../integrate-install/VcpkgTriplet2.vcxproj | 0 .../integrate-install/VcpkgUseStatic.vcxproj | 0 .../integrate-install/VcpkgUseStatic2.vcxproj | 0 .../VcpkgUseStaticManifestHost.vcxproj | 0 .../integrate-install/vcpkg.json | 0 .../llvm-lto-lib/llvm-lto-charset.lib | Bin .../llvm-lto-lib/portfile.cmake | 0 .../llvm-lto-lib/vcpkg.json | 0 .../vcpkg-configuration.json | 0 .../mismatched-version-database/vcpkg.json | 0 .../vcpkg_registry/ports/arrow/portfile.cmake | 0 .../vcpkg_registry/ports/arrow/vcpkg.json | 0 .../ports/bloom-filter/portfile.cmake | 0 .../ports/bloom-filter/vcpkg.json | 0 .../vcpkg_registry/versions/a-/arrow.json | 0 .../versions/b-/bloom-filter.json | 0 .../vcpkg_registry/versions/baseline.json | 0 .../overlays/absolute-paths/hash.in | 0 .../overlays/absolute-paths/portfile.cmake | 0 .../absolute-paths/source-comment.h.in | 0 .../overlays/absolute-paths/source.h.in | 0 .../overlays/absolute-paths/vcpkg.json | 0 .../overlays/broken-no-name/portfile.cmake | 0 .../overlays/broken-no-name/vcpkg.json | 0 .../overlays/broken-no-version/portfile.cmake | 0 .../overlays/broken-no-version/vcpkg.json | 0 .../classic-versions-a}/portfile.cmake | 0 .../overlays/classic-versions-a/vcpkg.json | 0 .../classic-versions-b/portfile.cmake | 0 .../overlays/classic-versions-b/vcpkg.json | 0 .../overlays/tool-control/CONTROL | 0 .../overlays/tool-control}/portfile.cmake | 0 .../overlays/tool-liba}/portfile.cmake | 0 .../overlays/tool-liba/vcpkg.json | 0 .../overlays/tool-libb/portfile.cmake | 0 .../overlays/tool-libb/vcpkg.json | 0 .../overlays/tool-manifest}/portfile.cmake | 0 .../overlays/tool-manifest/vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg-default-features-fail/vcpkg.json | 0 .../overlays/vcpkg-empty-port}/portfile.cmake | 0 .../overlays/vcpkg-empty-port/vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg-fail-if-depended-upon/vcpkg.json | 0 .../vcpkg-hello-world-1/portfile.cmake | 0 .../vcpkg-hello-world-1/src/CMakeLists.txt | 0 .../vcpkg-hello-world-1/src/hello-1.h | 0 .../vcpkg-hello-world-1/src/hello.cpp | 0 .../vcpkg-hello-world-1/src/hello.def | 0 .../overlays/vcpkg-hello-world-1/vcpkg.json | 0 .../vcpkg-hello-world-2/portfile.cmake | 0 .../vcpkg-hello-world-2/src/CMakeLists.txt | 0 .../vcpkg-hello-world-2/src/hello-2.h | 0 .../overlays/vcpkg-hello-world-2/src/hello.c | 0 .../vcpkg-hello-world-2/src/hello.def | 0 .../overlays/vcpkg-hello-world-2/vcpkg.json | 0 .../vcpkg-native-dependency}/portfile.cmake | 0 .../vcpkg-native-dependency/vcpkg.json | 0 .../vcpkg-never-builds/portfile.cmake | 0 .../overlays/vcpkg-never-builds/vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg-port-config.cmake | 0 .../vcpkg-touch-missing-dependency/vcpkg.json | 0 .../vcpkg_touch.cmake | 0 .../overlays/vcpkg-touch/portfile.cmake | 0 .../vcpkg-touch/vcpkg-port-config.cmake | 0 .../overlays/vcpkg-touch/vcpkg.json | 0 .../overlays/vcpkg-touch/vcpkg_touch.cmake | 0 .../vcpkg-uses-test-cmake/portfile.cmake | 0 .../overlays/vcpkg-uses-test-cmake/vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg.json | 0 .../overlays/vcpkg-uses-touch/portfile.cmake | 0 .../overlays/vcpkg-uses-touch/vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg.json | 0 .../overlays/wrong-pkgconfig/portfile.cmake | 0 .../overlays/wrong-pkgconfig/vcpkg.json | 0 .../wrong-pkgconfig/wrong-pkgconfig.pc.in | 0 .../triplets/x64-linux-e2e.cmake | 0 .../triplets/x64-osx-e2e.cmake | 0 .../triplets/x64-windows-e2e.cmake | 0 .../CMakeLists.txt | 0 .../portfile.cmake | 0 .../vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg-internal-e2e-test-port/vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg-internal-e2e-test-port2/vcpkg.json | 0 .../portfile.cmake | 0 .../vcpkg-internal-e2e-test-port3/vcpkg.json | 0 .../default-baseline-1/vcpkg.json | 0 .../default-baseline-2/vcpkg.json | 0 .../default-baseline-2/versions/z-/zlib.json | 0 .../version-files/ports/cat/portfile.cmake | 0 .../version-files/ports/cat/vcpkg.json | 0 .../version-files/ports/dog/portfile.cmake | 0 .../version-files/ports/dog/vcpkg.json | 0 .../version-files/ports/duck/portfile.cmake | 0 .../version-files/ports/duck/vcpkg.json | 0 .../version-files/ports/mouse/portfile.cmake | 0 .../version-files/ports/mouse/vcpkg.json | 0 .../ports_incomplete/cat/portfile.cmake | 0 .../ports_incomplete/cat/vcpkg.json | 0 .../ports_incomplete/dog/portfile.cmake | 0 .../ports_incomplete/dog/vcpkg.json | 0 .../ports_incomplete/duck/portfile.cmake | 0 .../ports_incomplete/duck/vcpkg.json | 0 .../ports_incomplete/ferret/portfile.cmake | 0 .../ports_incomplete/ferret/vcpkg.json | 0 .../ports_incomplete/fish/portfile.cmake | 0 .../ports_incomplete/fish/vcpkg.json | 0 .../ports_incomplete/mouse/portfile.cmake | 0 .../ports_incomplete/mouse/vcpkg.json | 0 .../ports/overlay-zlib/portfile.cmake | 0 .../ports/overlay-zlib/vcpkg.json | 0 .../ports/overlay/portfile.cmake | 0 .../ports/overlay/vcpkg.json | 0 .../transitive-constraints/vcpkg.json | 0 .../version-files/versions/baseline.json | 0 .../version-files/versions/c-/cat.json | 0 .../version-files/versions/d-/dog.json | 0 .../version-files/versions/d-/duck.json | 0 .../version-files/versions/m-/mouse.json | 0 .../versions_incomplete/baseline.json | 0 .../versions_incomplete/c-/cat.json | 0 .../versions_incomplete/d-/dog.json | 0 .../versions_incomplete/f-/fish.json | 0 .../versions_incomplete/m-/mouse.json | 0 .../without-default-baseline-2/vcpkg.json | 0 .../versions/z-/zlib.json | 0 .../version-date/portfile.cmake | 0 .../version-variable/version-date/vcpkg.json | 0 .../version-semver/portfile.cmake | 0 .../version-semver/vcpkg.json | 0 .../version-string/portfile.cmake | 0 .../version-string/vcpkg.json | 0 .../version-variable/version/portfile.cmake | 0 .../version-variable/version/vcpkg.json | 0 .../versions/baseline.json | 0 .../v-/vcpkg-internal-e2e-test-port.json | 0 .../e2e-projects/applocal/basic/build.bat | 5 + .../applocal/basic/installed/bin}/mylib.cpp | 5 +- .../applocal/basic/installed/bin/mylib.h | 8 + .../e2e-projects/applocal/basic/main.cpp | 6 + .../applocal/plugins-debug/build.bat | 8 + .../installed/debug/bin}/k4a.cpp | 5 +- .../plugins-debug/installed/debug/bin}/k4a.h | 8 +- .../depthengine_2_0.cpp | 11 + .../azure-kinect-sensor-sdk/k4adeploy.ps1 | 2 + .../applocal/plugins-debug/main.cpp | 6 + .../e2e-projects/applocal/plugins/build.bat | 8 + .../applocal/plugins/installed/bin/k4a.cpp | 8 + .../applocal/plugins/installed/bin/k4a.h | 8 + .../depthengine_2_0.cpp | 11 + .../azure-kinect-sensor-sdk/k4adeploy.ps1 | 2 + .../e2e-projects/applocal/plugins/main.cpp | 6 + .../no-patterns.json.in | 0 .../only-patterns.json.in | 0 .../e2e-registry-templates/removed.json.in | 18 + .../with-default.json.in | 0 .../with-redeclaration.json.in | 0 .../e2e-projects/export-project/vcpkg.json | 12 + .../vcpkg-empty-port}/portfile.cmake | 0 .../env-overlays/vcpkg-empty-port/vcpkg.json | 0 .../my-triplets/x64-windows-static.cmake | 0 .../vcpkg-configuration.json | 2 +- .../overlays-bad-paths/vcpkg.json | 0 .../another-vcpkg-empty-port}/portfile.cmake | 0 .../another-vcpkg-empty-port/vcpkg.json | 0 .../config-overlays/beicode/portfile.cmake | 0 .../config-overlays/beicode/vcpkg.json | 0 .../vcpkg-empty-port}/portfile.cmake | 0 .../env-overlays/vcpkg-empty-port/vcpkg.json | 0 .../fancy-config-embedded-triplet.cmake | 18 + .../vcpkg.json | 0 .../another-vcpkg-empty-port}/portfile.cmake | 0 .../another-vcpkg-empty-port/vcpkg.json | 0 .../config-overlays/beicode/portfile.cmake | 0 .../config-overlays/beicode/vcpkg.json | 0 .../vcpkg-empty-port/portfile.cmake | 1 + .../env-overlays/vcpkg-empty-port/vcpkg.json | 0 .../my-triplets/fancy-triplet.cmake | 18 + .../vcpkg-configuration.json | 0 .../overlays-project-with-config/vcpkg.json | 0 .../overlays-vcpkg-empty-port/vcpkg.json | 0 .../extra-ports/foo/portfile.cmake | 0 .../extra-ports/foo/vcpkg.json | 0 .../ports/bar/portfile.cmake | 0 .../ports/bar/vcpkg.json | 0 .../ports/baz/portfile.cmake | 0 .../ports/baz/vcpkg.json | 0 .../ports/foo/portfile.cmake | 0 .../ports/foo/vcpkg.json | 10 +- .../removed-ports/removed/portfile.cmake | 1 + .../removed-ports/removed/vcpkg.json | 4 + .../versions/b-/bar.json | 0 .../versions/b-/baz.json | 0 .../versions/baseline.json | 0 .../versions/f-/foo.json | 0 .../e2e-registry/versions/r-/removed.json | 9 + .../vcpkg-find-acquire-program/CONTROL | 4 - .../vcpkg-find-acquire-program/portfile.cmake | 21 - .../applocal-test/build/build.bat | 3 - .../e2e_projects/applocal-test/build/main.cpp | 8 - .../e2e_projects/applocal-test/build/mylib.h | 10 - .../plugins/azure_kinect_sensor_sdk/build.bat | 4 - .../depthengine_2_0.cpp | 7 - .../azure_kinect_sensor_sdk/depthengine_2_0.h | 10 - .../plugins/azure_kinect_sensor_sdk/main.exe | Bin 76288 -> 0 bytes .../my-triplets/x64-windows-static.cmake | 4 - .../my-triplets/x64-windows-static.cmake | 4 - .../end-to-end-tests-dir/artifacts.ps1 | 44 +- .../end-to-end-tests-dir/autocomplete.ps1 | 7 +- .../end-to-end-tests-dir/build-test-ports.ps1 | 19 +- .../end-to-end-tests-dir/bundles.ps1 | 8 +- azure-pipelines/end-to-end-tests-dir/ci.ps1 | 8 +- azure-pipelines/end-to-end-tests-dir/cli.ps1 | 149 + .../end-to-end-tests-dir/commands.export.ps1 | 67 + .../end-to-end-tests-dir/commands.extract.ps1 | 17 + .../end-to-end-tests-dir/compilertracking.ps1 | 2 +- .../end-to-end-tests-dir/e2e-registry.ps1 | 103 + azure-pipelines/end-to-end-tests-dir/edit.ps1 | 33 + .../end-to-end-tests-dir/env-passthrough.ps1 | 4 +- .../end-to-end-tests-dir/fetch.ps1 | 2 +- .../end-to-end-tests-dir/format-manifest.ps1 | 14 +- .../integrate-install.ps1 | 2 +- .../end-to-end-tests-dir/overlays.ps1 | 66 +- .../end-to-end-tests-dir/patterns.ps1 | 84 - .../post-build-checks.ps1 | 40 +- .../end-to-end-tests-dir/registries.ps1 | 10 +- .../end-to-end-tests-dir/regression-ports.ps1 | 2 +- .../end-to-end-tests-dir/upgrade.ps1 | 48 + .../end-to-end-tests-dir/vcpkg-root.ps1 | 6 +- .../end-to-end-tests-dir/version-variable.ps1 | 2 +- .../end-to-end-tests-dir/versions.ps1 | 8 +- .../end-to-end-tests-dir/z-applocalcpp.ps1 | 77 +- azure-pipelines/end-to-end-tests-prelude.ps1 | 33 +- azure-pipelines/end-to-end-tests.ps1 | 16 +- azure-pipelines/nuget-package.signproj | 36 + azure-pipelines/pipelines.yml | 183 - azure-pipelines/signing.yml | 207 +- azure-pipelines/vcpkg-alpine/Dockerfile | 6 +- azure-pipelines/vs-insertion/vcpkg.nuspec | 2 +- ce/.eslintignore | 1 - ce/.scripts/for-each.js | 76 - ce/.scripts/npm-run.js | 2 - ce/.scripts/set-versions.js | 47 - ce/.scripts/sync-versions.js | 133 - ce/.scripts/watch.js | 33 - ce/assets/NOTICE.txt | 1 - ce/assets/package.json | 38 - ce/assets/prepare-deploy.js | 10 - ce/ce.ps1 | 40 - ce/ce/.eslintrc.yaml | 10 - ce/ce/.npmignore | 20 - ce/ce/.npmrc | 2 - ce/ce/archivers/ZipUnpacker.ts | 73 - ce/ce/archivers/options.ts | 18 - ce/ce/archivers/tar.ts | 179 - ce/ce/archivers/unpacker.ts | 80 - ce/ce/archivers/unzip.ts | 797 --- ce/ce/cli/command.ts | 73 - ce/ce/cli/commands/help.ts | 77 - ce/ce/cli/commands/update.ts | 85 - ce/ce/cli/switches/debug.ts | 15 - ce/ce/cli/switches/verbose.ts | 14 - ce/ce/tsconfig.json | 18 - ce/common/config/rush/.npmrc | 2 - ce/common/config/rush/command-line.json | 162 - ce/common/config/rush/common-versions.json | 63 - ce/common/config/rush/deploy.json | 111 - ce/common/config/rush/experiments.json | 36 - ce/common/config/rush/pnpm-lock.yaml | 2258 -------- ce/common/config/rush/version-policies.json | 90 - ce/common/scripts/install-run-rush.js | 86 - ce/common/scripts/install-run-rushx.js | 18 - ce/common/scripts/install-run.js | 478 -- ce/custom/tar-stream/.gitignore | 2 - ce/custom/tar-stream/.npmrc | 2 - ce/custom/tar-stream/BufferList.js | 396 -- ce/custom/tar-stream/LICENSE | 21 - ce/custom/tar-stream/README.md | 168 - ce/custom/tar-stream/bl.js | 84 - ce/custom/tar-stream/extract.js | 257 - ce/custom/tar-stream/headers.js | 295 - ce/custom/tar-stream/index.js | 2 - ce/custom/tar-stream/pack.js | 255 - ce/custom/tar-stream/package.json | 58 - ce/getting-started.md | 84 - ce/projects.tsconfig.json | 11 - ce/rush.json | 66 - ce/test/.eslintignore | 3 - ce/test/.eslintrc.yaml | 10 - ce/test/.npmignore | 20 - ce/test/.npmrc | 2 - ce/test/LICENSE | 21 - ce/test/core/archive-tests.ts | 433 -- ce/test/core/i18n-tests.ts | 22 - ce/test/core/repo-tests.ts | 94 - ce/test/mocha-config.yaml | 16 - ce/test/package.json | 53 - ce/test/resources/big-compression.zip | Bin 1163 -> 0 bytes ce/test/resources/example-tar.tar | Bin 10240 -> 0 bytes ce/test/resources/example-tar.tar.bz2 | Bin 435 -> 0 bytes ce/test/resources/example-tar.tar.gz | Bin 441 -> 0 bytes ce/test/resources/example-tar.tar.xz | Bin 448 -> 0 bytes ce/test/resources/example-zip.zip | Bin 1898 -> 0 bytes ce/test/resources/test.directories.tar.gz | Bin 217 -> 0 bytes ce/test/resources/wrong-entry-sizes.zip | Bin 320 -> 0 bytes ce/test/tsconfig.json | 18 - cgmanifest.json | 6 +- cmake/Findfmt.cmake | 4 +- docs/command-guidelines.md | 30 + docs/localization.md | 8 +- docs/vcpkg-schema-definitions.schema.json | 129 +- docs/vcpkg.schema.json | 12 +- docs/vcpkg_catalog_release_process.md | 14 - docs/vcpkg_registry_release_process.md | 16 + docs/vcpkg_tool_release_process.md | 191 +- include/vcpkg-test/mockcmakevarprovider.h | 10 +- include/vcpkg-test/util.h | 63 +- include/vcpkg/archives.h | 69 +- include/vcpkg/base/cofffilereader.h | 2 + include/vcpkg/base/downloads.h | 29 +- include/vcpkg/base/expected.h | 8 +- include/vcpkg/base/file_sink.h | 19 + include/vcpkg/base/files.h | 285 +- include/vcpkg/base/fwd/files.h | 7 + include/vcpkg/base/fwd/format.h | 2 +- include/vcpkg/base/fwd/system.h | 2 + include/vcpkg/base/git.h | 2 +- include/vcpkg/base/hash.h | 2 +- include/vcpkg/base/json.h | 33 +- include/vcpkg/base/jsonreader.h | 28 +- include/vcpkg/base/lineinfo.h | 5 +- include/vcpkg/base/message-args.inc.h | 2 + include/vcpkg/base/message-data.inc.h | 1002 ++-- include/vcpkg/base/message_sinks.h | 12 - include/vcpkg/base/messages.h | 65 +- include/vcpkg/base/optional.h | 129 +- include/vcpkg/base/parallel-algorithms.h | 85 + include/vcpkg/base/parse.h | 1 + include/vcpkg/base/path.h | 63 + include/vcpkg/base/strings.h | 141 +- include/vcpkg/base/stringview.h | 29 +- include/vcpkg/base/system-headers.h | 7 +- include/vcpkg/base/system.h | 5 +- include/vcpkg/base/system.process.h | 26 +- include/vcpkg/base/unicode.h | 15 - include/vcpkg/base/util.h | 92 +- include/vcpkg/binarycaching.h | 168 +- include/vcpkg/binarycaching.private.h | 38 +- include/vcpkg/binaryparagraph.h | 12 +- include/vcpkg/cmakevars.h | 22 +- include/vcpkg/commands.acquire-project.h | 11 +- include/vcpkg/commands.acquire.h | 11 +- include/vcpkg/commands.activate.h | 11 +- include/vcpkg/commands.add-version.h | 13 +- include/vcpkg/commands.add.h | 11 +- include/vcpkg/commands.applocal.h | 13 - include/vcpkg/commands.autocomplete.h | 13 +- include/vcpkg/commands.bootstrap-standalone.h | 12 +- include/vcpkg/commands.build-external.h | 14 + include/vcpkg/{build.h => commands.build.h} | 82 +- include/vcpkg/commands.buildexternal.h | 19 - include/vcpkg/commands.cache.h | 13 - include/vcpkg/commands.check-support.h | 23 +- include/vcpkg/commands.ci-clean.h | 10 + include/vcpkg/commands.ci-verify-versions.h | 10 + include/vcpkg/commands.ci.h | 24 +- include/vcpkg/commands.ciclean.h | 13 - include/vcpkg/commands.civerifyversions.h | 13 - include/vcpkg/commands.contact.h | 15 +- include/vcpkg/commands.create.h | 16 +- include/vcpkg/commands.deactivate.h | 11 +- include/vcpkg/commands.depend-info.h | 55 + include/vcpkg/commands.dependinfo.h | 21 - include/vcpkg/commands.download.h | 11 + include/vcpkg/commands.edit.h | 14 +- include/vcpkg/commands.env.h | 24 +- include/vcpkg/commands.export.h | 17 + include/vcpkg/commands.fetch.h | 13 +- include/vcpkg/commands.find.h | 13 +- include/vcpkg/commands.format-manifest.h | 14 +- .../vcpkg/commands.generate-msbuild-props.h | 11 +- include/vcpkg/commands.h | 45 +- include/vcpkg/commands.hash.h | 12 +- include/vcpkg/commands.help.h | 16 + include/vcpkg/commands.info.h | 13 - include/vcpkg/commands.init-registry.h | 14 +- .../vcpkg/{install.h => commands.install.h} | 74 +- include/vcpkg/commands.integrate.h | 23 +- include/vcpkg/commands.interface.h | 37 - include/vcpkg/commands.list.h | 14 +- include/vcpkg/commands.new.h | 11 +- include/vcpkg/commands.owns.h | 14 +- include/vcpkg/commands.package-info.h | 11 + include/vcpkg/commands.portsdiff.h | 31 +- include/vcpkg/commands.regenerate.h | 9 +- include/vcpkg/commands.remove.h | 30 + include/vcpkg/commands.search.h | 12 +- include/vcpkg/commands.set-installed.h | 52 + include/vcpkg/commands.setinstalled.h | 41 - include/vcpkg/commands.update-baseline.h | 11 +- include/vcpkg/commands.update-registry.h | 10 + include/vcpkg/{update.h => commands.update.h} | 15 +- include/vcpkg/commands.upgrade.h | 24 +- include/vcpkg/commands.upload-metrics.h | 12 - include/vcpkg/commands.use.h | 11 +- include/vcpkg/commands.version.h | 15 +- include/vcpkg/commands.vsinstances.h | 10 + include/vcpkg/commands.xdownload.h | 13 - include/vcpkg/commands.xvsinstances.h | 14 - include/vcpkg/commands.z-applocal.h | 13 + include/vcpkg/commands.z-ce.h | 10 + include/vcpkg/commands.z-changelog.h | 10 + include/vcpkg/commands.z-extract.h | 63 + ...ap.h => commands.z-generate-message-map.h} | 9 +- .../vcpkg/commands.z-preregister-telemetry.h | 11 + include/vcpkg/commands.z-print-config.h | 14 + include/vcpkg/commands.z-upload-metrics.h | 11 + include/vcpkg/commands.zce.h | 11 - .../vcpkg/commands.zpreregistertelemetry.h | 11 - include/vcpkg/commands.zprintconfig.h | 14 - include/vcpkg/configuration.h | 16 +- include/vcpkg/configure-environment.h | 54 +- include/vcpkg/dependencies.h | 106 +- include/vcpkg/export.chocolatey.h | 2 +- include/vcpkg/export.h | 20 - include/vcpkg/export.ifw.h | 2 +- include/vcpkg/export.prefab.h | 2 +- include/vcpkg/fwd/binarycaching.h | 14 +- .../fwd/{install.h => commands.install.h} | 0 include/vcpkg/fwd/triplet.h | 2 + include/vcpkg/fwd/vcpkgcmdarguments.h | 11 +- include/vcpkg/fwd/vcpkgpaths.h | 1 - include/vcpkg/help.h | 17 - include/vcpkg/input.h | 28 +- include/vcpkg/installedpaths.h | 2 +- include/vcpkg/metrics.h | 12 +- include/vcpkg/packagespec.h | 60 +- include/vcpkg/paragraphparser.h | 10 +- include/vcpkg/paragraphs.h | 60 +- include/vcpkg/platform-expression.h | 5 +- include/vcpkg/portfileprovider.h | 36 +- include/vcpkg/registries.h | 113 +- include/vcpkg/remove.h | 29 - include/vcpkg/sourceparagraph.h | 84 +- include/vcpkg/spdx.h | 2 +- include/vcpkg/statusparagraph.h | 6 +- include/vcpkg/tools.h | 6 +- include/vcpkg/tools.test.h | 2 +- include/vcpkg/triplet.h | 32 +- include/vcpkg/vcpkgcmdarguments.h | 201 +- include/vcpkg/vcpkglib.h | 6 +- include/vcpkg/vcpkgpaths.h | 37 +- include/vcpkg/versions.h | 6 +- include/vcpkg/visualstudio.h | 4 +- locales/messages.cs.json | 568 +- locales/messages.de.json | 562 +- locales/messages.es.json | 582 +- locales/messages.fr.json | 584 +- locales/messages.it.json | 552 +- locales/messages.ja.json | 566 +- locales/messages.json | 747 ++- locales/messages.ko.json | 514 +- locales/messages.pl.json | 552 +- locales/messages.pt-BR.json | 564 +- locales/messages.ru.json | 584 +- locales/messages.tr.json | 574 +- locales/messages.zh-Hans.json | 530 +- locales/messages.zh-Hant.json | 554 +- src/closes-stdin.c | 7 + src/closes-stdout.c | 18 + src/localization/cs/messages.json.lcl | 3791 ++++++++----- src/localization/de/messages.json.lcl | 3769 ++++++++----- src/localization/es/messages.json.lcl | 3795 ++++++++----- src/localization/fr/messages.json.lcl | 3793 ++++++++----- src/localization/it/messages.json.lcl | 3773 ++++++++----- src/localization/ja/messages.json.lcl | 3783 ++++++++----- src/localization/ko/messages.json.lcl | 3985 ++++++++----- src/localization/pl/messages.json.lcl | 3779 ++++++++----- src/localization/pt-BR/messages.json.lcl | 4037 ++++++++----- src/localization/ru/messages.json.lcl | 3793 ++++++++----- src/localization/tr/messages.json.lcl | 3779 ++++++++----- src/localization/zh-Hans/messages.json.lcl | 3789 ++++++++----- src/localization/zh-Hant/messages.json.lcl | 3777 ++++++++----- src/reads-stdin.c | 38 + src/test-editor.c | 38 + src/vcpkg-test/archives.cpp | 18 + src/vcpkg-test/arguments.cpp | 56 +- src/vcpkg-test/binarycaching.cpp | 192 +- src/vcpkg-test/cgroup-parser.cpp | 77 +- src/vcpkg-test/ci-baseline.cpp | 54 +- src/vcpkg-test/cmd-parser.cpp | 79 +- src/vcpkg-test/commands.dependinfo.cpp | 267 + .../{export.cpp => commands.export.cpp} | 3 - src/vcpkg-test/commands.extract.cpp | 183 + .../{install.cpp => commands.install.cpp} | 2 +- src/vcpkg-test/configparser.cpp | 174 +- src/vcpkg-test/dependencies.cpp | 757 ++- src/vcpkg-test/dependinfo-graphs.cpp | 85 + src/vcpkg-test/files.cpp | 51 +- src/vcpkg-test/integrate.cpp | 72 +- src/vcpkg-test/json.cpp | 20 +- src/vcpkg-test/manifests.cpp | 314 +- src/vcpkg-test/messages.cpp | 7 +- src/vcpkg-test/metrics.cpp | 3 +- src/vcpkg-test/mockcmakevarsprovider.cpp | 14 +- src/vcpkg-test/new.cpp | 2 +- src/vcpkg-test/paragraph.cpp | 6 +- src/vcpkg-test/plan.cpp | 117 +- src/vcpkg-test/registries.cpp | 224 +- src/vcpkg-test/spdx.cpp | 6 +- src/vcpkg-test/specifier.cpp | 147 +- src/vcpkg-test/strings.cpp | 19 +- src/vcpkg-test/system.cpp | 1 + src/vcpkg-test/system.process.cpp | 76 + src/vcpkg-test/update.cpp | 11 +- src/vcpkg-test/util.cpp | 117 +- src/vcpkg-test/versionplan.cpp | 26 +- src/vcpkg-test/xunitwriter.cpp | 2 +- src/vcpkg.cpp | 55 +- src/vcpkg/archives.cpp | 152 +- src/vcpkg/base/checks.cpp | 10 +- src/vcpkg/base/chrono.cpp | 6 +- src/vcpkg/base/cmd-parser.cpp | 11 +- src/vcpkg/base/downloads.cpp | 120 +- src/vcpkg/base/files.cpp | 1118 ++-- src/vcpkg/base/hash.cpp | 6 +- src/vcpkg/base/json.cpp | 136 +- src/vcpkg/base/message_sinks.cpp | 5 +- src/vcpkg/base/messages.cpp | 46 +- src/vcpkg/base/parse.cpp | 4 +- src/vcpkg/base/strings.cpp | 100 +- src/vcpkg/base/stringview.cpp | 25 - src/vcpkg/base/system.cpp | 26 +- src/vcpkg/base/system.mac.cpp | 7 +- src/vcpkg/base/system.process.cpp | 1542 +++-- src/vcpkg/base/unicode.cpp | 36 +- src/vcpkg/base/xmlserializer.cpp | 1 + src/vcpkg/binarycaching.cpp | 2870 +++++----- src/vcpkg/binaryparagraph.cpp | 34 +- src/vcpkg/cgroup-parser.cpp | 2 +- src/vcpkg/ci-baseline.cpp | 2 +- src/vcpkg/cmakevars.cpp | 93 +- src/vcpkg/commands.acquire-project.cpp | 27 +- src/vcpkg/commands.acquire.cpp | 54 +- src/vcpkg/commands.activate.cpp | 39 +- src/vcpkg/commands.add-version.cpp | 275 +- src/vcpkg/commands.add.cpp | 63 +- src/vcpkg/commands.autocomplete.cpp | 160 +- src/vcpkg/commands.bootstrap-standalone.cpp | 45 +- src/vcpkg/commands.build-external.cpp | 51 + src/vcpkg/{build.cpp => commands.build.cpp} | 707 +-- src/vcpkg/commands.buildexternal.cpp | 49 - src/vcpkg/commands.cache.cpp | 76 - src/vcpkg/commands.check-support.cpp | 177 +- ...ands.ciclean.cpp => commands.ci-clean.cpp} | 26 +- ...ns.cpp => commands.ci-verify-versions.cpp} | 163 +- src/vcpkg/commands.ci.cpp | 258 +- src/vcpkg/commands.contact.cpp | 58 +- src/vcpkg/commands.cpp | 331 +- src/vcpkg/commands.create.cpp | 40 +- src/vcpkg/commands.deactivate.cpp | 26 +- src/vcpkg/commands.depend-info.cpp | 534 ++ src/vcpkg/commands.dependinfo.cpp | 420 -- ...ds.xdownload.cpp => commands.download.cpp} | 68 +- src/vcpkg/commands.edit.cpp | 112 +- src/vcpkg/commands.env.cpp | 93 +- src/vcpkg/{export.cpp => commands.export.cpp} | 419 +- src/vcpkg/commands.fetch.cpp | 35 +- src/vcpkg/commands.find.cpp | 86 +- src/vcpkg/commands.format-manifest.cpp | 48 +- src/vcpkg/commands.generate-msbuild-props.cpp | 45 +- src/vcpkg/commands.hash.cpp | 15 +- src/vcpkg/commands.help.cpp | 195 + src/vcpkg/commands.init-registry.cpp | 21 +- .../{install.cpp => commands.install.cpp} | 365 +- src/vcpkg/commands.integrate.cpp | 260 +- src/vcpkg/commands.list.cpp | 46 +- src/vcpkg/commands.new.cpp | 76 +- src/vcpkg/commands.owns.cpp | 37 +- ...nds.info.cpp => commands.package-info.cpp} | 53 +- src/vcpkg/commands.portsdiff.cpp | 235 +- src/vcpkg/commands.regenerate.cpp | 38 +- src/vcpkg/{remove.cpp => commands.remove.cpp} | 224 +- src/vcpkg/commands.search.cpp | 34 +- src/vcpkg/commands.set-installed.cpp | 345 ++ src/vcpkg/commands.setinstalled.cpp | 223 - src/vcpkg/commands.update-baseline.cpp | 52 +- src/vcpkg/commands.update-registry.cpp | 68 + src/vcpkg/{update.cpp => commands.update.cpp} | 25 +- src/vcpkg/commands.upgrade.cpp | 110 +- src/vcpkg/commands.upload-metrics.cpp | 29 - src/vcpkg/commands.use.cpp | 66 +- src/vcpkg/commands.version.cpp | 28 +- ...instances.cpp => commands.vsinstances.cpp} | 26 +- ...s.applocal.cpp => commands.z-applocal.cpp} | 168 +- src/vcpkg/commands.z-ce.cpp | 26 + src/vcpkg/commands.z-changelog.cpp | 121 + src/vcpkg/commands.z-extract.cpp | 175 + ...pp => commands.z-generate-message-map.cpp} | 29 +- ...p => commands.z-preregister-telemetry.cpp} | 26 +- ...config.cpp => commands.z-print-config.cpp} | 34 +- src/vcpkg/commands.z-upload-metrics.cpp | 33 + src/vcpkg/commands.zce.cpp | 14 - src/vcpkg/configuration.cpp | 107 +- src/vcpkg/configure-environment.cpp | 240 +- src/vcpkg/dependencies.cpp | 1582 +++--- src/vcpkg/export.chocolatey.cpp | 21 +- src/vcpkg/export.ifw.cpp | 24 +- src/vcpkg/export.prefab.cpp | 78 +- src/vcpkg/help.cpp | 193 - src/vcpkg/input.cpp | 113 +- src/vcpkg/metrics.cpp | 23 +- src/vcpkg/packagespec.cpp | 135 +- src/vcpkg/paragraphs.cpp | 237 +- src/vcpkg/platform-expression.cpp | 15 +- src/vcpkg/portfileprovider.cpp | 91 +- src/vcpkg/postbuildlint.cpp | 206 +- src/vcpkg/registries.cpp | 1468 +++-- src/vcpkg/sourceparagraph.cpp | 629 ++- src/vcpkg/spdx.cpp | 16 +- src/vcpkg/statusparagraph.cpp | 12 + src/vcpkg/statusparagraphs.cpp | 6 +- src/vcpkg/tools.cpp | 59 +- src/vcpkg/triplet.cpp | 96 +- src/vcpkg/vcpkgcmdarguments.cpp | 309 +- src/vcpkg/vcpkglib.cpp | 12 +- src/vcpkg/vcpkgpaths.cpp | 329 +- src/vcpkg/versions.cpp | 17 +- src/vcpkg/visualstudio.cpp | 6 +- src/vcpkg/xunitwriter.cpp | 2 +- {ce/ce => vcpkg-artifacts}/.eslintignore | 0 .../.eslintrc.yaml | 18 +- vcpkg-artifacts/.gitignore | 2 + {ce/assets => vcpkg-artifacts}/.npmrc | 0 {ce/ce => vcpkg-artifacts}/LICENSE | 0 {ce/ce => vcpkg-artifacts}/amf/Requires.ts | 0 {ce/ce => vcpkg-artifacts}/amf/contact.ts | 0 {ce/ce => vcpkg-artifacts}/amf/demands.ts | 0 {ce/ce => vcpkg-artifacts}/amf/exports.ts | 0 {ce/ce => vcpkg-artifacts}/amf/info.ts | 0 {ce/ce => vcpkg-artifacts}/amf/installer.ts | 2 +- .../amf/metadata-file.ts | 0 {ce/ce => vcpkg-artifacts}/amf/registries.ts | 0 .../amf/version-reference.ts | 0 {ce/ce => vcpkg-artifacts}/archivers/git.ts | 0 .../artifacts/SetOfDemands.ts | 0 .../artifacts/activation.ts | 17 +- .../artifacts/artifact.ts | 0 {ce/ce => vcpkg-artifacts}/cli/argument.ts | 4 +- {ce/ce => vcpkg-artifacts}/cli/artifacts.ts | 29 +- .../cli/command-line.ts | 12 +- vcpkg-artifacts/cli/command.ts | 33 + .../cli/commands/acquire-project.ts | 13 - .../cli/commands/acquire.ts | 15 +- .../cli/commands/activate.ts | 13 - .../cli/commands/add.ts | 13 - .../cli/commands/cache.ts | 13 - .../cli/commands/clean.ts | 28 - .../cli/commands/deactivate.ts | 13 - .../cli/commands/delete.ts | 14 - .../cli/commands/find.ts | 14 +- .../cli/commands/generate-msbuild-props.ts | 12 +- .../cli/commands/list.ts | 13 - .../cli/commands/regenerate-index.ts | 13 - .../cli/commands/remove.ts | 13 - vcpkg-artifacts/cli/commands/update.ts | 94 + .../cli/commands/use.ts | 15 +- .../cli/console-table.ts | 0 {ce/ce => vcpkg-artifacts}/cli/constants.ts | 0 {ce/ce => vcpkg-artifacts}/cli/format.ts | 0 {ce/ce => vcpkg-artifacts}/cli/project.ts | 19 +- {ce/ce => vcpkg-artifacts}/cli/styling.ts | 0 {ce/ce => vcpkg-artifacts}/cli/switch.ts | 8 +- vcpkg-artifacts/cli/switches/all.ts | 8 + .../cli/switches/clear.ts | 6 - vcpkg-artifacts/cli/switches/debug.ts | 8 + .../cli/switches/force.ts | 6 - .../cli/switches/installed.ts | 6 - .../cli/switches/json.ts | 7 - .../cli/switches/msbuild-props.ts | 8 - .../cli/switches/normalize.ts | 7 - .../cli/switches/project.ts | 5 - .../cli/switches/version.ts | 8 +- {ce/ce => vcpkg-artifacts}/constants.ts | 6 +- {ce/ce => vcpkg-artifacts}/exports.ts | 0 {ce/ce => vcpkg-artifacts}/fs/acquire.ts | 0 {ce/ce => vcpkg-artifacts}/fs/filesystem.ts | 0 .../fs/http-filesystem.ts | 0 .../fs/local-filesystem.ts | 0 {ce/ce => vcpkg-artifacts}/fs/streams.ts | 3 +- .../fs/unified-filesystem.ts | 0 .../fs/vsix-local-filesystem.ts | 0 {ce/common => vcpkg-artifacts}/header.txt | 0 {ce/ce => vcpkg-artifacts}/i18n.ts | 2 +- .../installers/espidf.ts | 0 {ce/ce => vcpkg-artifacts}/installers/git.ts | 2 +- .../installers/nuget.ts | 16 +- .../installers/untar.ts | 21 +- .../installers/unzip.ts | 15 +- {ce/ce => vcpkg-artifacts}/installers/util.ts | 0 .../interfaces/collections.ts | 0 .../interfaces/error-kind.ts | 0 .../interfaces/events.ts | 6 +- .../interfaces/metadata/contact.ts | 0 .../interfaces/metadata/demands.ts | 0 .../interfaces/metadata/exports.ts | 0 .../metadata/installers/Installer.ts | 0 .../interfaces/metadata/installers/git.ts | 0 .../interfaces/metadata/installers/nupkg.ts | 0 .../interfaces/metadata/installers/tar.ts | 0 .../metadata/installers/unpack-settings.ts | 0 .../metadata/installers/verifiable.ts | 0 .../interfaces/metadata/installers/zip.ts | 0 .../interfaces/metadata/version-reference.ts | 0 .../interfaces/validation-message.ts | 0 .../interfaces/validation.ts | 0 .../locales/messages.json | 101 +- {ce/ce => vcpkg-artifacts}/main.ts | 22 +- .../mediaquery/character-codes.ts | 0 .../mediaquery/media-query.ts | 0 .../mediaquery/scanner.ts | 2 +- vcpkg-artifacts/mocha-config.yaml | 9 + vcpkg-artifacts/package-lock.json | 4979 +++++++++++++++++ {ce/ce => vcpkg-artifacts}/package.json | 57 +- .../registries/ArtifactRegistry.ts | 2 +- .../registries/LocalRegistry.ts | 2 +- .../registries/RemoteRegistry.ts | 15 +- .../registries/artifact-index.ts | 0 .../registries/indexer.ts | 2 +- .../registries/registries.ts | 6 +- {ce/ce => vcpkg-artifacts}/session.ts | 5 +- .../test-resources}/cmake.json | 0 .../test-resources}/empty.json | 0 .../test-resources}/errors.json | 0 .../test-resources}/example-artifact.json | 0 .../example-before-2022-06-17-artifact.json | 0 .../test-resources}/large-file.txt | 0 .../gnu/gcc-arm-none-eabi-2019.04.0.json | 0 .../gnu/gcc-arm-none-eabi-2019.10.0.json | 0 .../gnu/gcc-arm-none-eabi-2020-10.0.json | 0 .../repo/sdks/microsoft/windows.arm.json | 0 .../repo/sdks/microsoft/windows.arm64.json | 0 .../repo/sdks/microsoft/windows.json | 0 .../repo/sdks/microsoft/windows.x64.json | 0 .../repo/sdks/microsoft/windows.x86.json | 0 .../repo/tools/kitware/cmake-3.15.0.json | 0 .../repo/tools/kitware/cmake-3.15.1.json | 0 .../repo/tools/kitware/cmake-3.17.0.json | 0 .../repo/tools/kitware/cmake-3.19.0.json | 0 .../repo/tools/kitware/cmake-3.20.0.json | 0 .../test-resources}/sample1.json | 0 .../test-resources}/small-file.txt | 0 .../topo-sort-registry/alpha.json | 0 .../topo-sort-registry/bravo.json | 0 .../topo-sort-registry/charlie.json | 0 .../topo-sort-registry/delta.json | 0 .../topo-sort-registry/echo.json | 0 .../topo-sort-registry/foxtrot.json | 0 .../test-resources}/validation-errors.json | 0 .../compilers/arm/gcc/gcc-2020.10.0.json | 0 .../index.yaml | 0 .../tools/arduino/arduino-cli-0.18.3.json | 0 .../tools/arduino/arduino-ide-1.18.15.json | 0 .../tools/compuphase/termite-3.4.0.json | 0 .../tools/kitware/cmake-3.20.1.json | 0 .../tools/microsoft/openocd-0.11.0-ms1.json | 0 .../tools/microsoft/openocd-0.11.0.json | 0 .../tools/ninja-build/ninja-1.10.2.json | 0 .../tools/raspberrypi/pico-sdk-1.3.0.json | 0 .../compilers/arm/gcc/gcc-2020.10.0.json | 0 .../index.yaml | 0 .../tools/arduino/arduino-cli-0.18.3.json | 0 .../tools/arduino/arduino-ide-1.18.15.json | 0 .../tools/compuphase/termite-3.4.0.json | 0 .../tools/kitware/cmake-3.20.1.json | 0 .../tools/microsoft/openocd-0.11.0-ms1.json | 0 .../tools/microsoft/openocd-0.11.0.json | 0 .../tools/ninja-build/ninja-1.10.2.json | 0 .../tools/raspberrypi/pico-sdk-1.3.0.json | 0 .../test/core/SuiteLocal.ts | 40 +- .../test/core/amf-tests.ts | 18 +- .../test/core/dependency-resolver-tests.ts | 4 +- .../test/core/index-tests.ts | 2 +- .../test/core/linq-tests.ts | 2 +- .../test/core/local-file-system-tests.ts | 14 +- .../test/core/media-query-tests.ts | 2 +- .../test/core/msbuild-tests.ts | 2 +- .../test/core/registry-resolver-tests.ts | 8 +- .../test/core/regression-tests.ts | 0 .../test/core/sample-tests.ts | 2 +- .../test/core/stream-tests.ts | 2 +- .../test/core/uniqueTempFolder.ts | 0 .../test/core/uri-tests.ts | 0 .../core/util/curly-replacements-tests.ts | 2 +- .../test/core/util/percentage-scaler-tests.ts | 2 +- .../test/sequence-equal.ts | 0 {ce/common => vcpkg-artifacts}/tsconfig.json | 12 +- {ce/ce => vcpkg-artifacts}/util/channels.ts | 1 - {ce/ce => vcpkg-artifacts}/util/checks.ts | 0 .../util/curly-replacements.ts | 0 {ce/ce => vcpkg-artifacts}/util/exceptions.ts | 0 {ce/ce => vcpkg-artifacts}/util/exec-cmd.ts | 0 {ce/ce => vcpkg-artifacts}/util/hash.ts | 0 {ce/ce => vcpkg-artifacts}/util/intersect.ts | 0 {ce/ce => vcpkg-artifacts}/util/linq.ts | 0 .../util/manual-promise.ts | 2 +- .../util/percentage-scaler.ts | 0 {ce/ce => vcpkg-artifacts}/util/promise.ts | 0 {ce/ce => vcpkg-artifacts}/util/text.ts | 0 {ce/ce => vcpkg-artifacts}/util/uri.ts | 0 {ce/ce => vcpkg-artifacts}/vcpkg.ts | 8 + {ce/ce => vcpkg-artifacts}/version.ts | 0 {ce/ce => vcpkg-artifacts}/yaml/BaseMap.ts | 0 {ce/ce => vcpkg-artifacts}/yaml/Coerce.ts | 0 .../yaml/CustomScalarMap.ts | 0 {ce/ce => vcpkg-artifacts}/yaml/Entity.ts | 0 {ce/ce => vcpkg-artifacts}/yaml/EntityMap.ts | 0 .../yaml/EntitySequence.ts | 2 +- {ce/ce => vcpkg-artifacts}/yaml/Options.ts | 0 {ce/ce => vcpkg-artifacts}/yaml/ScalarMap.ts | 0 .../yaml/ScalarSequence.ts | 0 {ce/ce => vcpkg-artifacts}/yaml/strings.ts | 0 {ce/ce => vcpkg-artifacts}/yaml/yaml-types.ts | 25 +- {ce/ce => vcpkg-artifacts}/yaml/yaml.ts | 0 vcpkg-init/mint-standalone-bundle.ps1 | 10 +- vcpkg-init/vcpkg-scripts-sha.txt | 2 +- 890 files changed, 61090 insertions(+), 41380 deletions(-) create mode 100644 .github/workflows/build.yaml create mode 100644 .github/workflows/ci.yaml create mode 100644 .github/workflows/matchers.json create mode 100644 .github/workflows/pr.yaml create mode 100644 CMakePresets.json delete mode 100644 CMakeSettings.json delete mode 100644 azure-pipelines/.npmrc-internal rename azure-pipelines/{e2e_artifacts_registry => e2e-artifacts-registry}/index.yaml (100%) rename azure-pipelines/{e2e_artifacts_registry => e2e-artifacts-registry}/vcpkg-test-artifact-1/vcpkg-test-artifact-1-1.0.0.json (100%) rename azure-pipelines/{e2e_artifacts_registry => e2e-artifacts-registry}/vcpkg-test-artifact-2/vcpkg-test-artifact-2-1.0.0.json (100%) rename azure-pipelines/{e2e_artifacts_registry => e2e-artifacts-registry}/vcpkg-test-artifact-3/vcpkg-test-artifact-3-1.0.0.json (100%) create mode 100644 azure-pipelines/e2e-assets/ci/ci.baseline.txt create mode 100644 azure-pipelines/e2e-assets/extract/a-tar-with-plus-x.tar.gz rename azure-pipelines/{e2e_assets => e2e-assets}/fetch/ninja.bat (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/format-manifest/empty.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/format-manifest/expected/empty.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/format-manifest/expected/name-and-version.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/format-manifest/expected/name.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/format-manifest/expected/version.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/format-manifest/name-and-version.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/format-manifest/name.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/format-manifest/version.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-dll-port-template/build.cmd (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-dll-port-template/portfile.cmake (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-dll-port-template/test.c (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-dll-port-template/test.def (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-dll-port-template/test.h (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-dll-port-template/vcpkg.json (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-lib-port-template-dynamic-crt/build.cmd (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-lib-port-template-dynamic-crt/portfile.cmake (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-lib-port-template-dynamic-crt/test.c (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-lib-port-template-dynamic-crt/test.h (100%) rename azure-pipelines/{e2e_assets => e2e-assets}/test-lib-port-template-dynamic-crt/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/ci/base-port/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/ci/base-port/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/ci/dep-on-feature-not-sup/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/ci/dep-on-feature-not-sup/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/ci/feature-not-sup/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/ci/feature-not-sup/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/ci/not-sup-host-b/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/ci/not-sup-host-b/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/compilertracking/x64-linux.cmake (100%) create mode 100644 azure-pipelines/e2e-ports/control-file/CONTROL rename azure-pipelines/{e2e_ports/overlays/classic-versions-a => e2e-ports/control-file}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/env-passthrough/passthrough.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/NoProps.vcxproj (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/Project1.vcxproj (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/Source.cpp (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/VcpkgTriplet.vcxproj (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/VcpkgTriplet2.vcxproj (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/VcpkgUseStatic.vcxproj (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/VcpkgUseStatic2.vcxproj (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/VcpkgUseStaticManifestHost.vcxproj (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/integrate-install/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/llvm-lto-lib/llvm-lto-charset.lib (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/llvm-lto-lib/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/llvm-lto-lib/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg-configuration.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg_registry/ports/arrow/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg_registry/ports/arrow/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg_registry/ports/bloom-filter/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg_registry/ports/bloom-filter/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg_registry/versions/a-/arrow.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg_registry/versions/b-/bloom-filter.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/mismatched-version-database/vcpkg_registry/versions/baseline.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/absolute-paths/hash.in (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/absolute-paths/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/absolute-paths/source-comment.h.in (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/absolute-paths/source.h.in (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/absolute-paths/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/broken-no-name/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/broken-no-name/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/broken-no-version/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/broken-no-version/vcpkg.json (100%) rename azure-pipelines/{e2e_ports/overlays/tool-control => e2e-ports/overlays/classic-versions-a}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/classic-versions-a/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/classic-versions-b/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/classic-versions-b/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/tool-control/CONTROL (100%) rename azure-pipelines/{e2e_ports/overlays/tool-liba => e2e-ports/overlays/tool-control}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports/overlays/tool-manifest => e2e-ports/overlays/tool-liba}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/tool-liba/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/tool-libb/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/tool-libb/vcpkg.json (100%) rename azure-pipelines/{e2e_ports/overlays/vcpkg-empty-port => e2e-ports/overlays/tool-manifest}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/tool-manifest/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-clean-after-build-test-port/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-clean-after-build-test-port/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-default-features-fail-require-other-feature/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-default-features-fail-require-other-feature/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-default-features-fail/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-default-features-fail/vcpkg.json (100%) rename azure-pipelines/{e2e_ports/overlays/vcpkg-native-dependency => e2e-ports/overlays/vcpkg-empty-port}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-empty-port/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-fail-if-depended-upon/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-fail-if-depended-upon/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-1/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-1/src/CMakeLists.txt (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-1/src/hello-1.h (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-1/src/hello.cpp (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-1/src/hello.def (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-1/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-2/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-2/src/CMakeLists.txt (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-2/src/hello-2.h (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-2/src/hello.c (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-2/src/hello.def (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-hello-world-2/vcpkg.json (100%) rename azure-pipelines/{e2e_ports/vcpkg-internal-e2e-test-port => e2e-ports/overlays/vcpkg-native-dependency}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-native-dependency/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-never-builds/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-never-builds/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-touch-missing-dependency/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-touch-missing-dependency/vcpkg-port-config.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-touch-missing-dependency/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-touch-missing-dependency/vcpkg_touch.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-touch/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-touch/vcpkg-port-config.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-touch/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-touch/vcpkg_touch.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-uses-test-cmake/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-uses-test-cmake/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-uses-touch-missing-dependency/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-uses-touch-missing-dependency/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-uses-touch/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-uses-touch/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-uses-vcpkg-common-functions/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/vcpkg-uses-vcpkg-common-functions/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/wrong-pkgconfig/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/wrong-pkgconfig/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/overlays/wrong-pkgconfig/wrong-pkgconfig.pc.in (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/triplets/x64-linux-e2e.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/triplets/x64-osx-e2e.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/triplets/x64-windows-e2e.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/vcpkg-internal-dll-with-no-exports/CMakeLists.txt (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/vcpkg-internal-dll-with-no-exports/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/vcpkg-internal-dll-with-no-exports/vcpkg.json (100%) rename azure-pipelines/{e2e_ports/vcpkg-internal-e2e-test-port2 => e2e-ports/vcpkg-internal-e2e-test-port}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/vcpkg-internal-e2e-test-port/vcpkg.json (100%) rename azure-pipelines/{e2e_ports/vcpkg-internal-e2e-test-port3 => e2e-ports/vcpkg-internal-e2e-test-port2}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/vcpkg-internal-e2e-test-port2/vcpkg.json (100%) rename azure-pipelines/{e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port => e2e-ports/vcpkg-internal-e2e-test-port3}/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/vcpkg-internal-e2e-test-port3/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/default-baseline-1/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/default-baseline-2/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/default-baseline-2/versions/z-/zlib.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports/cat/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports/cat/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports/dog/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports/dog/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports/duck/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports/duck/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports/mouse/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports/mouse/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/cat/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/cat/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/dog/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/dog/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/duck/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/duck/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/ferret/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/ferret/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/fish/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/fish/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/mouse/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/ports_incomplete/mouse/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/transitive-constraints/ports/overlay-zlib/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/transitive-constraints/ports/overlay-zlib/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/transitive-constraints/ports/overlay/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/transitive-constraints/ports/overlay/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/transitive-constraints/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions/baseline.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions/c-/cat.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions/d-/dog.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions/d-/duck.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions/m-/mouse.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions_incomplete/baseline.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions_incomplete/c-/cat.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions_incomplete/d-/dog.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions_incomplete/f-/fish.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/versions_incomplete/m-/mouse.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/without-default-baseline-2/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-files/without-default-baseline-2/versions/z-/zlib.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-variable/version-date/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-variable/version-date/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-variable/version-semver/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-variable/version-semver/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-variable/version-string/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-variable/version-string/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-variable/version/portfile.cmake (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/version-variable/version/vcpkg.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/versions/baseline.json (100%) rename azure-pipelines/{e2e_ports => e2e-ports}/versions/v-/vcpkg-internal-e2e-test-port.json (100%) create mode 100644 azure-pipelines/e2e-projects/applocal/basic/build.bat rename azure-pipelines/{e2e_projects/applocal-test/build => e2e-projects/applocal/basic/installed/bin}/mylib.cpp (56%) create mode 100644 azure-pipelines/e2e-projects/applocal/basic/installed/bin/mylib.h create mode 100644 azure-pipelines/e2e-projects/applocal/basic/main.cpp create mode 100644 azure-pipelines/e2e-projects/applocal/plugins-debug/build.bat rename azure-pipelines/{e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk => e2e-projects/applocal/plugins-debug/installed/debug/bin}/k4a.cpp (54%) rename azure-pipelines/{e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk => e2e-projects/applocal/plugins-debug/installed/debug/bin}/k4a.h (54%) create mode 100644 azure-pipelines/e2e-projects/applocal/plugins-debug/installed/tools/azure-kinect-sensor-sdk/depthengine_2_0.cpp create mode 100644 azure-pipelines/e2e-projects/applocal/plugins-debug/installed/tools/azure-kinect-sensor-sdk/k4adeploy.ps1 create mode 100644 azure-pipelines/e2e-projects/applocal/plugins-debug/main.cpp create mode 100644 azure-pipelines/e2e-projects/applocal/plugins/build.bat create mode 100644 azure-pipelines/e2e-projects/applocal/plugins/installed/bin/k4a.cpp create mode 100644 azure-pipelines/e2e-projects/applocal/plugins/installed/bin/k4a.h create mode 100644 azure-pipelines/e2e-projects/applocal/plugins/installed/tools/azure-kinect-sensor-sdk/depthengine_2_0.cpp create mode 100644 azure-pipelines/e2e-projects/applocal/plugins/installed/tools/azure-kinect-sensor-sdk/k4adeploy.ps1 create mode 100644 azure-pipelines/e2e-projects/applocal/plugins/main.cpp rename azure-pipelines/{e2e_projects/registries-package-patterns => e2e-projects/e2e-registry-templates}/no-patterns.json.in (100%) rename azure-pipelines/{e2e_projects/registries-package-patterns => e2e-projects/e2e-registry-templates}/only-patterns.json.in (100%) create mode 100644 azure-pipelines/e2e-projects/e2e-registry-templates/removed.json.in rename azure-pipelines/{e2e_projects/registries-package-patterns => e2e-projects/e2e-registry-templates}/with-default.json.in (100%) rename azure-pipelines/{e2e_projects/registries-package-patterns => e2e-projects/e2e-registry-templates}/with-redeclaration.json.in (100%) create mode 100644 azure-pipelines/e2e-projects/export-project/vcpkg.json rename azure-pipelines/{e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port => e2e-projects/overlays-bad-paths/env-overlays/vcpkg-empty-port}/portfile.cmake (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-bad-paths/env-overlays/vcpkg-empty-port/vcpkg.json (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-bad-paths/my-triplets/x64-windows-static.cmake (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-bad-paths/vcpkg-configuration.json (64%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-bad-paths/vcpkg.json (100%) rename azure-pipelines/{e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port => e2e-projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port}/portfile.cmake (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/vcpkg.json (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-config-embedded/config-overlays/beicode/portfile.cmake (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-config-embedded/config-overlays/beicode/vcpkg.json (100%) rename azure-pipelines/{e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port => e2e-projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port}/portfile.cmake (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/vcpkg.json (100%) create mode 100644 azure-pipelines/e2e-projects/overlays-project-config-embedded/my-triplets/fancy-config-embedded-triplet.cmake rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-config-embedded/vcpkg.json (100%) rename azure-pipelines/{e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port => e2e-projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port}/portfile.cmake (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/vcpkg.json (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-with-config/config-overlays/beicode/portfile.cmake (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-with-config/config-overlays/beicode/vcpkg.json (100%) create mode 100644 azure-pipelines/e2e-projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-with-config/env-overlays/vcpkg-empty-port/vcpkg.json (100%) create mode 100644 azure-pipelines/e2e-projects/overlays-project-with-config/my-triplets/fancy-triplet.cmake rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-with-config/vcpkg-configuration.json (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-project-with-config/vcpkg.json (100%) rename azure-pipelines/{e2e_projects => e2e-projects}/overlays-vcpkg-empty-port/vcpkg.json (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/extra-ports/foo/portfile.cmake (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/extra-ports/foo/vcpkg.json (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/ports/bar/portfile.cmake (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/ports/bar/vcpkg.json (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/ports/baz/portfile.cmake (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/ports/baz/vcpkg.json (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/ports/foo/portfile.cmake (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/ports/foo/vcpkg.json (93%) create mode 100644 azure-pipelines/e2e-registry/removed-ports/removed/portfile.cmake create mode 100644 azure-pipelines/e2e-registry/removed-ports/removed/vcpkg.json rename azure-pipelines/{e2e_registry => e2e-registry}/versions/b-/bar.json (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/versions/b-/baz.json (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/versions/baseline.json (100%) rename azure-pipelines/{e2e_registry => e2e-registry}/versions/f-/foo.json (100%) create mode 100644 azure-pipelines/e2e-registry/versions/r-/removed.json delete mode 100644 azure-pipelines/e2e_ports/vcpkg-find-acquire-program/CONTROL delete mode 100644 azure-pipelines/e2e_ports/vcpkg-find-acquire-program/portfile.cmake delete mode 100644 azure-pipelines/e2e_projects/applocal-test/build/build.bat delete mode 100644 azure-pipelines/e2e_projects/applocal-test/build/main.cpp delete mode 100644 azure-pipelines/e2e_projects/applocal-test/build/mylib.h delete mode 100644 azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/build.bat delete mode 100644 azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.cpp delete mode 100644 azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.h delete mode 100644 azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/main.exe delete mode 100644 azure-pipelines/e2e_projects/overlays-project-config-embedded/my-triplets/x64-windows-static.cmake delete mode 100644 azure-pipelines/e2e_projects/overlays-project-with-config/my-triplets/x64-windows-static.cmake create mode 100644 azure-pipelines/end-to-end-tests-dir/commands.export.ps1 create mode 100644 azure-pipelines/end-to-end-tests-dir/commands.extract.ps1 create mode 100644 azure-pipelines/end-to-end-tests-dir/e2e-registry.ps1 create mode 100644 azure-pipelines/end-to-end-tests-dir/edit.ps1 delete mode 100644 azure-pipelines/end-to-end-tests-dir/patterns.ps1 create mode 100644 azure-pipelines/end-to-end-tests-dir/upgrade.ps1 create mode 100644 azure-pipelines/nuget-package.signproj delete mode 100644 azure-pipelines/pipelines.yml delete mode 100644 ce/.eslintignore delete mode 100644 ce/.scripts/for-each.js delete mode 100644 ce/.scripts/npm-run.js delete mode 100644 ce/.scripts/set-versions.js delete mode 100644 ce/.scripts/sync-versions.js delete mode 100644 ce/.scripts/watch.js delete mode 100644 ce/assets/NOTICE.txt delete mode 100644 ce/assets/package.json delete mode 100644 ce/assets/prepare-deploy.js delete mode 100644 ce/ce.ps1 delete mode 100644 ce/ce/.eslintrc.yaml delete mode 100644 ce/ce/.npmignore delete mode 100644 ce/ce/.npmrc delete mode 100644 ce/ce/archivers/ZipUnpacker.ts delete mode 100644 ce/ce/archivers/options.ts delete mode 100644 ce/ce/archivers/tar.ts delete mode 100644 ce/ce/archivers/unpacker.ts delete mode 100644 ce/ce/archivers/unzip.ts delete mode 100644 ce/ce/cli/command.ts delete mode 100644 ce/ce/cli/commands/help.ts delete mode 100644 ce/ce/cli/commands/update.ts delete mode 100644 ce/ce/cli/switches/debug.ts delete mode 100644 ce/ce/cli/switches/verbose.ts delete mode 100644 ce/ce/tsconfig.json delete mode 100644 ce/common/config/rush/.npmrc delete mode 100644 ce/common/config/rush/command-line.json delete mode 100644 ce/common/config/rush/common-versions.json delete mode 100644 ce/common/config/rush/deploy.json delete mode 100644 ce/common/config/rush/experiments.json delete mode 100644 ce/common/config/rush/pnpm-lock.yaml delete mode 100644 ce/common/config/rush/version-policies.json delete mode 100644 ce/common/scripts/install-run-rush.js delete mode 100644 ce/common/scripts/install-run-rushx.js delete mode 100644 ce/common/scripts/install-run.js delete mode 100644 ce/custom/tar-stream/.gitignore delete mode 100644 ce/custom/tar-stream/.npmrc delete mode 100644 ce/custom/tar-stream/BufferList.js delete mode 100644 ce/custom/tar-stream/LICENSE delete mode 100644 ce/custom/tar-stream/README.md delete mode 100644 ce/custom/tar-stream/bl.js delete mode 100644 ce/custom/tar-stream/extract.js delete mode 100644 ce/custom/tar-stream/headers.js delete mode 100644 ce/custom/tar-stream/index.js delete mode 100644 ce/custom/tar-stream/pack.js delete mode 100644 ce/custom/tar-stream/package.json delete mode 100644 ce/getting-started.md delete mode 100644 ce/projects.tsconfig.json delete mode 100644 ce/rush.json delete mode 100644 ce/test/.eslintignore delete mode 100644 ce/test/.eslintrc.yaml delete mode 100644 ce/test/.npmignore delete mode 100644 ce/test/.npmrc delete mode 100644 ce/test/LICENSE delete mode 100644 ce/test/core/archive-tests.ts delete mode 100644 ce/test/core/i18n-tests.ts delete mode 100644 ce/test/core/repo-tests.ts delete mode 100644 ce/test/mocha-config.yaml delete mode 100644 ce/test/package.json delete mode 100644 ce/test/resources/big-compression.zip delete mode 100644 ce/test/resources/example-tar.tar delete mode 100644 ce/test/resources/example-tar.tar.bz2 delete mode 100644 ce/test/resources/example-tar.tar.gz delete mode 100644 ce/test/resources/example-tar.tar.xz delete mode 100644 ce/test/resources/example-zip.zip delete mode 100644 ce/test/resources/test.directories.tar.gz delete mode 100644 ce/test/resources/wrong-entry-sizes.zip delete mode 100644 ce/test/tsconfig.json create mode 100644 docs/command-guidelines.md delete mode 100644 docs/vcpkg_catalog_release_process.md create mode 100644 docs/vcpkg_registry_release_process.md create mode 100644 include/vcpkg/base/file_sink.h create mode 100644 include/vcpkg/base/parallel-algorithms.h create mode 100644 include/vcpkg/base/path.h delete mode 100644 include/vcpkg/commands.applocal.h create mode 100644 include/vcpkg/commands.build-external.h rename include/vcpkg/{build.h => commands.build.h} (82%) delete mode 100644 include/vcpkg/commands.buildexternal.h delete mode 100644 include/vcpkg/commands.cache.h create mode 100644 include/vcpkg/commands.ci-clean.h create mode 100644 include/vcpkg/commands.ci-verify-versions.h delete mode 100644 include/vcpkg/commands.ciclean.h delete mode 100644 include/vcpkg/commands.civerifyversions.h create mode 100644 include/vcpkg/commands.depend-info.h delete mode 100644 include/vcpkg/commands.dependinfo.h create mode 100644 include/vcpkg/commands.download.h create mode 100644 include/vcpkg/commands.export.h create mode 100644 include/vcpkg/commands.help.h delete mode 100644 include/vcpkg/commands.info.h rename include/vcpkg/{install.h => commands.install.h} (50%) delete mode 100644 include/vcpkg/commands.interface.h create mode 100644 include/vcpkg/commands.package-info.h create mode 100644 include/vcpkg/commands.remove.h create mode 100644 include/vcpkg/commands.set-installed.h delete mode 100644 include/vcpkg/commands.setinstalled.h create mode 100644 include/vcpkg/commands.update-registry.h rename include/vcpkg/{update.h => commands.update.h} (62%) delete mode 100644 include/vcpkg/commands.upload-metrics.h create mode 100644 include/vcpkg/commands.vsinstances.h delete mode 100644 include/vcpkg/commands.xdownload.h delete mode 100644 include/vcpkg/commands.xvsinstances.h create mode 100644 include/vcpkg/commands.z-applocal.h create mode 100644 include/vcpkg/commands.z-ce.h create mode 100644 include/vcpkg/commands.z-changelog.h create mode 100644 include/vcpkg/commands.z-extract.h rename include/vcpkg/{commands.generate-message-map.h => commands.z-generate-message-map.h} (68%) create mode 100644 include/vcpkg/commands.z-preregister-telemetry.h create mode 100644 include/vcpkg/commands.z-print-config.h create mode 100644 include/vcpkg/commands.z-upload-metrics.h delete mode 100644 include/vcpkg/commands.zce.h delete mode 100644 include/vcpkg/commands.zpreregistertelemetry.h delete mode 100644 include/vcpkg/commands.zprintconfig.h delete mode 100644 include/vcpkg/export.h rename include/vcpkg/fwd/{install.h => commands.install.h} (100%) delete mode 100644 include/vcpkg/help.h delete mode 100644 include/vcpkg/remove.h create mode 100644 src/closes-stdin.c create mode 100644 src/closes-stdout.c create mode 100644 src/reads-stdin.c create mode 100644 src/test-editor.c create mode 100644 src/vcpkg-test/archives.cpp create mode 100644 src/vcpkg-test/commands.dependinfo.cpp rename src/vcpkg-test/{export.cpp => commands.export.cpp} (98%) create mode 100644 src/vcpkg-test/commands.extract.cpp rename src/vcpkg-test/{install.cpp => commands.install.cpp} (99%) create mode 100644 src/vcpkg-test/dependinfo-graphs.cpp create mode 100644 src/vcpkg-test/system.process.cpp create mode 100644 src/vcpkg/commands.build-external.cpp rename src/vcpkg/{build.cpp => commands.build.cpp} (79%) delete mode 100644 src/vcpkg/commands.buildexternal.cpp delete mode 100644 src/vcpkg/commands.cache.cpp rename src/vcpkg/{commands.ciclean.cpp => commands.ci-clean.cpp} (59%) rename src/vcpkg/{commands.civerifyversions.cpp => commands.ci-verify-versions.cpp} (74%) create mode 100644 src/vcpkg/commands.depend-info.cpp delete mode 100644 src/vcpkg/commands.dependinfo.cpp rename src/vcpkg/{commands.xdownload.cpp => commands.download.cpp} (70%) rename src/vcpkg/{export.cpp => commands.export.cpp} (65%) create mode 100644 src/vcpkg/commands.help.cpp rename src/vcpkg/{install.cpp => commands.install.cpp} (82%) rename src/vcpkg/{commands.info.cpp => commands.package-info.cpp} (80%) rename src/vcpkg/{remove.cpp => commands.remove.cpp} (50%) create mode 100644 src/vcpkg/commands.set-installed.cpp delete mode 100644 src/vcpkg/commands.setinstalled.cpp create mode 100644 src/vcpkg/commands.update-registry.cpp rename src/vcpkg/{update.cpp => commands.update.cpp} (86%) delete mode 100644 src/vcpkg/commands.upload-metrics.cpp rename src/vcpkg/{commands.xvsinstances.cpp => commands.vsinstances.cpp} (57%) rename src/vcpkg/{commands.applocal.cpp => commands.z-applocal.cpp} (82%) create mode 100644 src/vcpkg/commands.z-ce.cpp create mode 100644 src/vcpkg/commands.z-changelog.cpp create mode 100644 src/vcpkg/commands.z-extract.cpp rename src/vcpkg/{commands.generate-message-map.cpp => commands.z-generate-message-map.cpp} (89%) rename src/vcpkg/{commands.zpreregistertelemetry.cpp => commands.z-preregister-telemetry.cpp} (71%) rename src/vcpkg/{commands.zprintconfig.cpp => commands.z-print-config.cpp} (63%) create mode 100644 src/vcpkg/commands.z-upload-metrics.cpp delete mode 100644 src/vcpkg/commands.zce.cpp delete mode 100644 src/vcpkg/help.cpp rename {ce/ce => vcpkg-artifacts}/.eslintignore (100%) rename ce/common/.default-eslintrc.yaml => vcpkg-artifacts/.eslintrc.yaml (94%) create mode 100644 vcpkg-artifacts/.gitignore rename {ce/assets => vcpkg-artifacts}/.npmrc (100%) rename {ce/ce => vcpkg-artifacts}/LICENSE (100%) rename {ce/ce => vcpkg-artifacts}/amf/Requires.ts (100%) rename {ce/ce => vcpkg-artifacts}/amf/contact.ts (100%) rename {ce/ce => vcpkg-artifacts}/amf/demands.ts (100%) rename {ce/ce => vcpkg-artifacts}/amf/exports.ts (100%) rename {ce/ce => vcpkg-artifacts}/amf/info.ts (100%) rename {ce/ce => vcpkg-artifacts}/amf/installer.ts (99%) rename {ce/ce => vcpkg-artifacts}/amf/metadata-file.ts (100%) rename {ce/ce => vcpkg-artifacts}/amf/registries.ts (100%) rename {ce/ce => vcpkg-artifacts}/amf/version-reference.ts (100%) rename {ce/ce => vcpkg-artifacts}/archivers/git.ts (100%) rename {ce/ce => vcpkg-artifacts}/artifacts/SetOfDemands.ts (100%) rename {ce/ce => vcpkg-artifacts}/artifacts/activation.ts (98%) rename {ce/ce => vcpkg-artifacts}/artifacts/artifact.ts (100%) rename {ce/ce => vcpkg-artifacts}/cli/argument.ts (66%) rename {ce/ce => vcpkg-artifacts}/cli/artifacts.ts (92%) rename {ce/ce => vcpkg-artifacts}/cli/command-line.ts (89%) create mode 100644 vcpkg-artifacts/cli/command.ts rename {ce/ce => vcpkg-artifacts}/cli/commands/acquire-project.ts (83%) rename {ce/ce => vcpkg-artifacts}/cli/commands/acquire.ts (84%) rename {ce/ce => vcpkg-artifacts}/cli/commands/activate.ts (84%) rename {ce/ce => vcpkg-artifacts}/cli/commands/add.ts (92%) rename {ce/ce => vcpkg-artifacts}/cli/commands/cache.ts (86%) rename {ce/ce => vcpkg-artifacts}/cli/commands/clean.ts (71%) rename {ce/ce => vcpkg-artifacts}/cli/commands/deactivate.ts (58%) rename {ce/ce => vcpkg-artifacts}/cli/commands/delete.ts (73%) rename {ce/ce => vcpkg-artifacts}/cli/commands/find.ts (88%) rename {ce/ce => vcpkg-artifacts}/cli/commands/generate-msbuild-props.ts (86%) rename {ce/ce => vcpkg-artifacts}/cli/commands/list.ts (81%) rename {ce/ce => vcpkg-artifacts}/cli/commands/regenerate-index.ts (83%) rename {ce/ce => vcpkg-artifacts}/cli/commands/remove.ts (80%) create mode 100644 vcpkg-artifacts/cli/commands/update.ts rename {ce/ce => vcpkg-artifacts}/cli/commands/use.ts (82%) rename {ce/ce => vcpkg-artifacts}/cli/console-table.ts (100%) rename {ce/ce => vcpkg-artifacts}/cli/constants.ts (100%) rename {ce/ce => vcpkg-artifacts}/cli/format.ts (100%) rename {ce/ce => vcpkg-artifacts}/cli/project.ts (73%) rename {ce/ce => vcpkg-artifacts}/cli/styling.ts (100%) rename {ce/ce => vcpkg-artifacts}/cli/switch.ts (77%) create mode 100644 vcpkg-artifacts/cli/switches/all.ts rename {ce/ce => vcpkg-artifacts}/cli/switches/clear.ts (59%) create mode 100644 vcpkg-artifacts/cli/switches/debug.ts rename {ce/ce => vcpkg-artifacts}/cli/switches/force.ts (53%) rename {ce/ce => vcpkg-artifacts}/cli/switches/installed.ts (61%) rename {ce/ce => vcpkg-artifacts}/cli/switches/json.ts (67%) rename {ce/ce => vcpkg-artifacts}/cli/switches/msbuild-props.ts (76%) rename {ce/ce => vcpkg-artifacts}/cli/switches/normalize.ts (55%) rename {ce/ce => vcpkg-artifacts}/cli/switches/project.ts (95%) rename {ce/ce => vcpkg-artifacts}/cli/switches/version.ts (59%) rename {ce/ce => vcpkg-artifacts}/constants.ts (74%) rename {ce/ce => vcpkg-artifacts}/exports.ts (100%) rename {ce/ce => vcpkg-artifacts}/fs/acquire.ts (100%) rename {ce/ce => vcpkg-artifacts}/fs/filesystem.ts (100%) rename {ce/ce => vcpkg-artifacts}/fs/http-filesystem.ts (100%) rename {ce/ce => vcpkg-artifacts}/fs/local-filesystem.ts (100%) rename {ce/ce => vcpkg-artifacts}/fs/streams.ts (93%) rename {ce/ce => vcpkg-artifacts}/fs/unified-filesystem.ts (100%) rename {ce/ce => vcpkg-artifacts}/fs/vsix-local-filesystem.ts (100%) rename {ce/common => vcpkg-artifacts}/header.txt (100%) rename {ce/ce => vcpkg-artifacts}/i18n.ts (97%) rename {ce/ce => vcpkg-artifacts}/installers/espidf.ts (100%) rename {ce/ce => vcpkg-artifacts}/installers/git.ts (98%) rename {ce/ce => vcpkg-artifacts}/installers/nuget.ts (78%) rename {ce/ce => vcpkg-artifacts}/installers/untar.ts (62%) rename {ce/ce => vcpkg-artifacts}/installers/unzip.ts (81%) rename {ce/ce => vcpkg-artifacts}/installers/util.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/collections.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/error-kind.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/events.ts (75%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/contact.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/demands.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/exports.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/installers/Installer.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/installers/git.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/installers/nupkg.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/installers/tar.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/installers/unpack-settings.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/installers/verifiable.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/installers/zip.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/metadata/version-reference.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/validation-message.ts (100%) rename {ce/ce => vcpkg-artifacts}/interfaces/validation.ts (100%) rename {ce/ce => vcpkg-artifacts}/locales/messages.json (73%) rename {ce/ce => vcpkg-artifacts}/main.ts (80%) rename {ce/ce => vcpkg-artifacts}/mediaquery/character-codes.ts (100%) rename {ce/ce => vcpkg-artifacts}/mediaquery/media-query.ts (100%) rename {ce/ce => vcpkg-artifacts}/mediaquery/scanner.ts (99%) create mode 100644 vcpkg-artifacts/mocha-config.yaml create mode 100644 vcpkg-artifacts/package-lock.json rename {ce/ce => vcpkg-artifacts}/package.json (67%) rename {ce/ce => vcpkg-artifacts}/registries/ArtifactRegistry.ts (98%) rename {ce/ce => vcpkg-artifacts}/registries/LocalRegistry.ts (97%) rename {ce/ce => vcpkg-artifacts}/registries/RemoteRegistry.ts (90%) rename {ce/ce => vcpkg-artifacts}/registries/artifact-index.ts (100%) rename {ce/ce => vcpkg-artifacts}/registries/indexer.ts (99%) rename {ce/ce => vcpkg-artifacts}/registries/registries.ts (98%) rename {ce/ce => vcpkg-artifacts}/session.ts (98%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/cmake.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/empty.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/errors.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/example-artifact.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/example-before-2022-06-17-artifact.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/large-file.txt (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/compilers/gnu/gcc-arm-none-eabi-2019.04.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/compilers/gnu/gcc-arm-none-eabi-2019.10.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/compilers/gnu/gcc-arm-none-eabi-2020-10.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/sdks/microsoft/windows.arm.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/sdks/microsoft/windows.arm64.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/sdks/microsoft/windows.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/sdks/microsoft/windows.x64.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/sdks/microsoft/windows.x86.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/tools/kitware/cmake-3.15.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/tools/kitware/cmake-3.15.1.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/tools/kitware/cmake-3.17.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/tools/kitware/cmake-3.19.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/repo/tools/kitware/cmake-3.20.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/sample1.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/small-file.txt (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/topo-sort-registry/alpha.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/topo-sort-registry/bravo.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/topo-sort-registry/charlie.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/topo-sort-registry/delta.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/topo-sort-registry/echo.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/topo-sort-registry/foxtrot.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/validation-errors.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/compilers/arm/gcc/gcc-2020.10.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/index.yaml (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-cli-0.18.3.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-ide-1.18.15.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/compuphase/termite-3.4.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/kitware/cmake-3.20.1.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0-ms1.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/ninja-build/ninja-1.10.2.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/raspberrypi/pico-sdk-1.3.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/compilers/arm/gcc/gcc-2020.10.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/index.yaml (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-cli-0.18.3.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-ide-1.18.15.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/compuphase/termite-3.4.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/kitware/cmake-3.20.1.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0-ms1.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/ninja-build/ninja-1.10.2.json (100%) rename {ce/test/resources => vcpkg-artifacts/test-resources}/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/raspberrypi/pico-sdk-1.3.0.json (100%) rename {ce => vcpkg-artifacts}/test/core/SuiteLocal.ts (65%) rename {ce => vcpkg-artifacts}/test/core/amf-tests.ts (87%) rename {ce => vcpkg-artifacts}/test/core/dependency-resolver-tests.ts (89%) rename {ce => vcpkg-artifacts}/test/core/index-tests.ts (94%) rename {ce => vcpkg-artifacts}/test/core/linq-tests.ts (92%) rename {ce => vcpkg-artifacts}/test/core/local-file-system-tests.ts (92%) rename {ce => vcpkg-artifacts}/test/core/media-query-tests.ts (98%) rename {ce => vcpkg-artifacts}/test/core/msbuild-tests.ts (97%) rename {ce => vcpkg-artifacts}/test/core/registry-resolver-tests.ts (94%) rename {ce => vcpkg-artifacts}/test/core/regression-tests.ts (100%) rename {ce => vcpkg-artifacts}/test/core/sample-tests.ts (91%) rename {ce => vcpkg-artifacts}/test/core/stream-tests.ts (92%) rename {ce => vcpkg-artifacts}/test/core/uniqueTempFolder.ts (100%) rename {ce => vcpkg-artifacts}/test/core/uri-tests.ts (100%) rename {ce => vcpkg-artifacts}/test/core/util/curly-replacements-tests.ts (97%) rename {ce => vcpkg-artifacts}/test/core/util/percentage-scaler-tests.ts (95%) rename {ce => vcpkg-artifacts}/test/sequence-equal.ts (100%) rename {ce/common => vcpkg-artifacts}/tsconfig.json (76%) rename {ce/ce => vcpkg-artifacts}/util/channels.ts (97%) rename {ce/ce => vcpkg-artifacts}/util/checks.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/curly-replacements.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/exceptions.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/exec-cmd.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/hash.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/intersect.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/linq.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/manual-promise.ts (98%) rename {ce/ce => vcpkg-artifacts}/util/percentage-scaler.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/promise.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/text.ts (100%) rename {ce/ce => vcpkg-artifacts}/util/uri.ts (100%) rename {ce/ce => vcpkg-artifacts}/vcpkg.ts (90%) rename {ce/ce => vcpkg-artifacts}/version.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/BaseMap.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/Coerce.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/CustomScalarMap.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/Entity.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/EntityMap.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/EntitySequence.ts (98%) rename {ce/ce => vcpkg-artifacts}/yaml/Options.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/ScalarMap.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/ScalarSequence.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/strings.ts (100%) rename {ce/ce => vcpkg-artifacts}/yaml/yaml-types.ts (95%) rename {ce/ce => vcpkg-artifacts}/yaml/yaml.ts (100%) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000000..e5808302bd --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,85 @@ +name: Build + +on: + workflow_call: + inputs: + codeql: + type: boolean + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - os: windows-2022 + preset: windows-ci + - os: ubuntu-20.04 + preset: linux-ci + - os: macos-12 + preset: macos-ci + runs-on: ${{ matrix.os }} + timeout-minutes: 120 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: 'npm' + cache-dependency-path: vcpkg-artifacts/package-lock.json + - uses: lukka/get-cmake@v3.26.3 + with: + cmakeVersion: 3.22.1 # ubuntu 22.04 + ninjaVersion: 1.11.1 + - name: Enable Problem Matchers + run: echo "::add-matcher::.github/workflows/matchers.json" + - name: '[CI Only] Initialize CodeQL' + if: inputs.codeql + uses: github/codeql-action/init@v2 + with: + languages: cpp, javascript + - name: Configure and Build + if: matrix.preset != 'windows-ci' + run: | + cmake --preset ${{ matrix.preset }} + cmake --build --preset ${{ matrix.preset }} -- -k0 + - name: Configure and Build (Windows) + if: matrix.preset == 'windows-ci' + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 + IF %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL% + cl /Bv + set CXX=cl + set CC=cl + cmake --preset ${{ matrix.preset }} + IF %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL% + cmake --build --preset ${{ matrix.preset }} -- -k0 + - name: '[CI Only] Perform CodeQL Analysis' + if: inputs.codeql + uses: github/codeql-action/analyze@v2 + - name: Run vcpkg unit tests + run: ctest --preset ${{ matrix.preset }} --output-on-failure 2>&1 + - name: Run vcpkg-artifacts unit tests + run: | + cd out/build/${{ matrix.preset }}/vcpkg-artifacts + node node_modules/mocha/bin/mocha --config mocha-config.yaml + - name: Get microsoft/vcpkg pinned sha into VCPKG_SHA + id: vcpkg_sha + shell: pwsh + run: | + "VCPKG_SHA="+(Get-Content vcpkg-init/vcpkg-scripts-sha.txt -Raw).Trim() >> $env:GITHUB_OUTPUT + - name: Checkout microsoft/vcpkg for end-to-end tests + uses: actions/checkout@v3 + with: + fetch-depth: 0 + path: ${{ github.workspace }}/vcpkg-root + repository: microsoft/vcpkg + ref: ${{ steps.vcpkg_sha.outputs.VCPKG_SHA }} + - name: Run vcpkg end-to-end tests + shell: pwsh + run: | + cd out/build/${{ matrix.preset }} + ${{ github.workspace }}/azure-pipelines/end-to-end-tests.ps1 -RunArtifactsTests + env: + VCPKG_ROOT: ${{ github.workspace }}/vcpkg-root diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000000..653ed4f013 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,17 @@ +name: CI Build + +on: + push: + branches: + - main + +permissions: + # Required for CodeQL + security-events: write + contents: read + +jobs: + builds: + uses: ./.github/workflows/build.yaml + with: + codeql: true diff --git a/.github/workflows/matchers.json b/.github/workflows/matchers.json new file mode 100644 index 0000000000..2d587bac6d --- /dev/null +++ b/.github/workflows/matchers.json @@ -0,0 +1,44 @@ +{ + "problemMatcher": [ + { + "owner": "vcpkg-msvc", + "pattern": [ + { + "regexp": "^(.*?)\\((\\d+)\\):\\s+(?:fatal\\s+)?(warning|error)(?:\\s+[^:]*):\\s+(.*)$", + "file": 1, + "line": 2, + "severity": 3, + "message": 4 + } + ] + }, + { + "owner": "vcpkg-gcc", + "pattern": [ + { + "regexp": "^(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + ] + }, + { + "owner": "vcpkg-catch", + "pattern": [ + { + "regexp": "^(.*?):(\\d+): FAILED:", + "file": 1, + "line": 2 + }, + { + "regexp": "^(.*[^=-].*)$", + "message": 1, + "loop": true + } + ] + } + ] +} \ No newline at end of file diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml new file mode 100644 index 0000000000..3fda7f7bfe --- /dev/null +++ b/.github/workflows/pr.yaml @@ -0,0 +1,68 @@ +name: PR Build + +on: + pull_request: + +permissions: + contents: read + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + builds: + uses: ./.github/workflows/build.yaml + + format: + runs-on: windows-2022 + timeout-minutes: 60 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: 'npm' + cache-dependency-path: vcpkg-artifacts/package-lock.json + - uses: lukka/get-cmake@v3.26.3 + with: + cmakeVersion: 3.22.1 # ubuntu 22.04 + ninjaVersion: 1.11.1 + - name: Configure and Build (Windows) + shell: cmd + run: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 + IF %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL% + cl /Bv + set CXX=cl + set CC=cl + cmake --preset windows-ci + IF %ERRORLEVEL% NEQ 0 exit /B %ERRORLEVEL% + cmake --build --preset windows-ci --target generate-message-map -- -k0 + - name: 'Format C++' + shell: pwsh + run: ./azure-pipelines/Format-CxxCode.ps1 + - name: 'Create Diff' + id: diff + shell: pwsh + run: | + git add -u + git restore --staged vcpkg-artifacts/.npmrc + git diff --cached --stat --exit-code + if ($LASTEXITCODE -ne 0) { + git config user.name $(git log -1 --pretty=format:'%an') + git config user.email $(git log -1 --pretty=format:'%ae') + git commit -m "Format and regenerate messages" + git format-patch HEAD~ --output=out/format.patch + echo "::group::Diff" + get-content out/format.patch + echo "::endgroup::" + echo "::error::You must reformat the sources or regenerate the message map. See the format.patch artifact for more information.%0AOne-liner to apply and push the patch from the root of your vcpkg-tool repo:%0Agh run -R ${{ github.repository }} download ${{ github.run_id }} -n format.patch && git am format.patch && rm format.patch && git push" + exit 1 + } + - name: 'Publish Format and Messages File Diff' + uses: actions/upload-artifact@v3 + if: failure() && steps.diff.outcome == 'failure' + with: + name: format.patch + path: out/format.patch diff --git a/.gitignore b/.gitignore index 148ce211b3..e9fdafac91 100644 --- a/.gitignore +++ b/.gitignore @@ -7,37 +7,12 @@ /.vs /CMakeSettings.json /out +/OneLocBuild .DS_Store CMakeLists.txt.user .cache -/vcpkg-ce.zip -node_modules/ -**/.rush/ +/vcpkg-artifacts/node_modules/ **/dist/ -/ce/test/**/*.d.ts -/ce/test/**/*.map -/ce/test/**/*.js -/ce/ce/vcpkg-ce.build.log -/ce/common/config/rush/.npmrc -/ce/common/config/rush/pnpm-lock.yaml -/ce/test/vcpkg-ce.test.build.log -/ce/common/temp /vcpkg-root -/CMakePresets.json +/CMakeUserPresets.json /work -/azure-pipelines/e2e_projects/applocal-test/build/main.exe -/azure-pipelines/e2e_projects/applocal-test/build/main.obj -/azure-pipelines/e2e_projects/applocal-test/build/mylib.exp -/azure-pipelines/e2e_projects/applocal-test/build/mylib.dll -/azure-pipelines/e2e_projects/applocal-test/build/mylib.lib -/azure-pipelines/e2e_projects/applocal-test/build/mylib.obj -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/main.cpp -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/main.obj -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.exp -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.dll -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.lib -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.obj -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.exp -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.dll -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.lib -/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.obj diff --git a/.vscode/settings.json b/.vscode/settings.json index b9a205d37e..79a72d6597 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -31,5 +31,73 @@ "source.organizeImports": true }, "eslint.format.enable": true, - "files.eol": "\n" + "files.eol": "\n", + "files.associations": { + "any": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "codecvt": "cpp", + "complex": "cpp", + "condition_variable": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "shared_mutex": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeindex": "cpp", + "typeinfo": "cpp", + "variant": "cpp" + } } diff --git a/CMakeLists.txt b/CMakeLists.txt index e4c22e47ae..4e07a95c6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ option(VCPKG_BUILD_TLS12_DOWNLOADER "Enable building the tls12-downloader" OFF) option(VCPKG_BUILD_FUZZING "Option for enabling vcpkg-fuzz support" OFF) option(VCPKG_EMBED_GIT_SHA "Option for to fill in the Git SHA version; off by default to avoid privacy concerns out of official builds" OFF) option(VCPKG_ADD_SOURCELINK "Option for enabling SourceLink in debug information on Windows/MSVC builds" "${VCPKG_EMBED_GIT_SHA}") -option(VCPKG_ARTIFACTS_DEVELOPMENT "Hard code path to artifacts TypeScript. Requires node.js and global install of @microsoft/rush." OFF) +option(VCPKG_ARTIFACTS_DEVELOPMENT "Hard code path to artifacts TypeScript. Requires node.js and npm." OFF) option(VCPKG_OFFICIAL_BUILD "Option to cause immediate failure if variables required for official builds are unset." OFF) set(VCPKG_PDB_SUFFIX "" CACHE STRING "Append this string to the name of the PDB for shipping vcpkg binaries.") @@ -34,20 +34,10 @@ if(DEFINE_DISABLE_METRICS OR VCPKG_DISABLE_METRICS) "file vcpkg.disable_metrics next to the binary.") endif() -set(LANGUAGES "CXX") -if(VCPKG_BUILD_TLS12_DOWNLOADER) - list(APPEND LANGUAGES "C") -endif() - -if (VCPKG_ARTIFACTS_DEVELOPMENT) - # https://gitlab.kitware.com/cmake/cmake/-/issues/20245 - cmake_minimum_required(VERSION 3.17) -endif() - project(vcpkg DESCRIPTION "vcpkg helps you manage C and C++ libraries on Windows, Linux and MacOS." HOMEPAGE_URL "https://github.com/microsoft/vcpkg" - LANGUAGES ${LANGUAGES} + LANGUAGES C CXX ) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") @@ -67,7 +57,7 @@ if(VCPKG_EMBED_GIT_SHA) find_package(Git REQUIRED) execute_process( COMMAND "${GIT_EXECUTABLE}" status --porcelain=v1 - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" OUTPUT_VARIABLE VCPKG_GIT_STATUS OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -75,7 +65,7 @@ if(VCPKG_EMBED_GIT_SHA) if(VCPKG_GIT_STATUS STREQUAL "") execute_process( COMMAND "${GIT_EXECUTABLE}" rev-parse HEAD - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" OUTPUT_VARIABLE VCPKG_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -210,112 +200,162 @@ target_compile_definitions(vcpkglib PUBLIC _FILE_OFFSET_BITS=64 ) -if(NOT DEFINED VCPKG_STANDALONE_BUNDLE_SHA OR VCPKG_STANDALONE_BUNDLE_SHA STREQUAL "") - if(VCPKG_OFFICIAL_BUILD) - message(FATAL_ERROR "VCPKG_STANDALONE_BUNDLE_SHA is required for official builds.") - endif() -else() +if(VCPKG_STANDALONE_BUNDLE_SHA) target_compile_definitions(vcpkglib PUBLIC - VCPKG_STANDALONE_BUNDLE_SHA=${VCPKG_STANDALONE_BUNDLE_SHA} + "VCPKG_STANDALONE_BUNDLE_SHA=${VCPKG_STANDALONE_BUNDLE_SHA}" ) +elseif(VCPKG_OFFICIAL_BUILD) + message(FATAL_ERROR "VCPKG_STANDALONE_BUNDLE_SHA is required for official builds.") endif() -if(NOT DEFINED VCPKG_CE_SHA OR VCPKG_CE_SHA STREQUAL "") - if(VCPKG_OFFICIAL_BUILD) - message(FATAL_ERROR "VCPKG_CE_SHA is required for official builds.") +file(TO_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg-artifacts" VCPKG_ARTIFACTS_SOURCE_DIR) +if (VCPKG_ARTIFACTS_DEVELOPMENT) + file(TO_CMAKE_PATH "${CMAKE_CURRENT_BINARY_DIR}/vcpkg-artifacts" VCPKG_ARTIFACTS_BINARY_DIR) + # The directory constructed by this portion of the build script needs to be kept in sync with + # that created by azure-pipelines/signing.yml + + if (WIN32) + set(NPM_SUFFIX ".cmd") + else() + set(NPM_SUFFIX "") endif() - if (VCPKG_ARTIFACTS_DEVELOPMENT) - file(TO_CMAKE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/ce/ce" VCPKG_ARTIFACTS_PATH) - target_compile_definitions(vcpkglib PUBLIC "VCPKG_ARTIFACTS_PATH=${VCPKG_ARTIFACTS_PATH}") - mark_as_advanced(VCPKG_ARTIFACTS_PATH) - - if (WIN32) - set(RUSH_SUFFIX ".cmd") - else() - set(RUSH_SUFFIX "") - endif() - find_program(NODEJS "node") - if (NOT NODEJS) - message(FATAL_ERROR "node.js and @microsoft/rush must be installed when VCPKG_ARTIFACTS_DEVELOPMENT is set") - endif() + find_program(NODEJS "node") + find_program(NPM "npm${NPM_SUFFIX}") + if (NOT NODEJS OR NOT NPM) + message(FATAL_ERROR "node.js and npm must be installed when VCPKG_ARTIFACTS_DEVELOPMENT is set") + endif() - find_program(RUSH "rush${RUSH_SUFFIX}") - if (NOT RUSH) - message(FATAL_ERROR "@microsoft/rush is required when VCPKG_ARTIFACTS_DEVELOPMENT is set; use `npm install -g @microsoft/rush`") - endif() + add_custom_command( + OUTPUT + "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules" + COMMAND "${NPM}" ARGS "ci" + WORKING_DIRECTORY + "${VCPKG_ARTIFACTS_SOURCE_DIR}" + COMMENT + "Running npm install..." + MAIN_DEPENDENCY + "${VCPKG_ARTIFACTS_SOURCE_DIR}/package-lock.json" + VERBATIM + ) - add_custom_command( - OUTPUT - "${CMAKE_CURRENT_SOURCE_DIR}/ce/ce/node_modules" - "${CMAKE_CURRENT_SOURCE_DIR}/ce/test/node_modules" - COMMAND "${RUSH}" ARGS "update" - COMMAND "${RUSH}" ARGS "rebuild" - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}/ce" - COMMENT - "Running rush update..." - VERBATIM + add_custom_target(npm-restore + ALL + DEPENDS + "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules" ) + set_target_properties(npm-restore + PROPERTIES + ADDITIONAL_CLEAN_FILES "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules" + ) - add_custom_target(rush-update - ALL - DEPENDS - "${CMAKE_CURRENT_SOURCE_DIR}/ce/ce/node_modules" - "${CMAKE_CURRENT_SOURCE_DIR}/ce/test/node_modules" - ) - -# === Target: vcpkg-artifacts === - file(GLOB_RECURSE VCPKG_ARTIFACTS_SOURCES CONFIGURE_DEPENDS "ce/ce/*.ts") - add_custom_command( - OUTPUT - "${CMAKE_CURRENT_LIST_DIR}/ce/ce/dist/tsconfig.tsbuildinfo" - COMMAND - "${NODEJS}" "${CMAKE_CURRENT_LIST_DIR}/ce/ce/node_modules/typescript/bin/tsc" - -p "${CMAKE_CURRENT_LIST_DIR}/ce/ce" - DEPENDS - ${VCPKG_ARTIFACTS_SOURCES} - "${CMAKE_CURRENT_SOURCE_DIR}/ce/ce/node_modules" - COMMENT - "Building vcpkg-artifacts..." - VERBATIM - ) +# === Target: vcpkg-artifacts-target === +# The suffix "-target" is added to avoid a conflict in CMake with the directory named vcpkg-artifacts and the target named vcpkg-artifacts. + file(GLOB VCPKG_ARTIFACTS_ROOT_SOURCES LIST_DIRECTORIES false RELATIVE "${VCPKG_ARTIFACTS_SOURCE_DIR}" CONFIGURE_DEPENDS "${VCPKG_ARTIFACTS_SOURCE_DIR}/*.ts") + file(GLOB_RECURSE VCPKG_ARTIFACTS_NESTED_SOURCES LIST_DIRECTORIES false RELATIVE "${VCPKG_ARTIFACTS_SOURCE_DIR}" CONFIGURE_DEPENDS + "${VCPKG_ARTIFACTS_SOURCE_DIR}/amf/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/archivers/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/artifacts/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/cli/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/fs/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/installers/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/interfaces/*.ts" + # "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/mediaquery/*.ts" + # "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/registries/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/test/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/test-resources/*" # Note no *.ts + "${VCPKG_ARTIFACTS_SOURCE_DIR}/util/*.ts" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/yaml/*.ts" + ) + set(VCPKG_ARTIFACTS_SOURCES ${VCPKG_ARTIFACTS_ROOT_SOURCES} ${VCPKG_ARTIFACTS_NESTED_SOURCES}) + list(TRANSFORM VCPKG_ARTIFACTS_SOURCES PREPEND "${VCPKG_ARTIFACTS_SOURCE_DIR}/") - add_custom_target(vcpkg-artifacts - ALL - DEPENDS - "${CMAKE_CURRENT_LIST_DIR}/ce/ce/dist/tsconfig.tsbuildinfo" - ) + set(VCPKG_ARTIFACTS_BINARIES ${VCPKG_ARTIFACTS_ROOT_SOURCES} ${VCPKG_ARTIFACTS_NESTED_SOURCES}) + list(TRANSFORM VCPKG_ARTIFACTS_BINARIES PREPEND "${VCPKG_ARTIFACTS_BINARY_DIR}/") + list(TRANSFORM VCPKG_ARTIFACTS_BINARIES REPLACE "\\.ts" ".js") + add_custom_command( + OUTPUT "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json" + COMMAND "${NODEJS}" ARGS "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules/translate-strings/dist/main.js" "." "--json" + DEPENDS + ${VCPKG_ARTIFACTS_SOURCES} + "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules" + WORKING_DIRECTORY "${VCPKG_ARTIFACTS_SOURCE_DIR}" + COMMENT "Running artifacts translate-strings..." + VERBATIM + ) -# === Target: vcpkg-artifacts-test === - file(GLOB_RECURSE VCPKG_ARTIFACTS_TEST_SOURCES CONFIGURE_DEPENDS "ce/test/*.ts") - add_custom_command( - OUTPUT - "${CMAKE_CURRENT_LIST_DIR}/ce/test/dist/tsconfig.tsbuildinfo" - COMMAND - "${NODEJS}" "${CMAKE_CURRENT_LIST_DIR}/ce/test/node_modules/typescript/bin/tsc" - -p "${CMAKE_CURRENT_LIST_DIR}/ce/test" - DEPENDS - ${VCPKG_ARTIFACTS_TEST_SOURCES} - "${CMAKE_CURRENT_SOURCE_DIR}/ce/test/node_modules" - COMMENT - "Building vcpkg-artifacts-test..." - VERBATIM - ) + add_custom_command( + OUTPUT + ${VCPKG_ARTIFACTS_BINARIES} + "${VCPKG_ARTIFACTS_BINARY_DIR}/package.json" + "${VCPKG_ARTIFACTS_BINARY_DIR}/package-lock.json" + "${VCPKG_ARTIFACTS_BINARY_DIR}/.npmrc" + "${VCPKG_ARTIFACTS_BINARY_DIR}/mocha-config.yaml" + "${VCPKG_ARTIFACTS_BINARY_DIR}/locales/messages.json" + "${VCPKG_ARTIFACTS_BINARY_DIR}/artifacts-development.txt" + COMMAND + "${CMAKE_COMMAND}" ARGS -E rm -rf "${VCPKG_ARTIFACTS_BINARY_DIR}" + COMMAND + "${CMAKE_COMMAND}" ARGS -E make_directory "${VCPKG_ARTIFACTS_BINARY_DIR}" + COMMAND + "${CMAKE_COMMAND}" ARGS -E make_directory "${VCPKG_ARTIFACTS_BINARY_DIR}/locales" + COMMAND + "${CMAKE_COMMAND}" ARGS -E copy_directory + "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules" + "${VCPKG_ARTIFACTS_BINARY_DIR}/node_modules" + COMMAND + "${CMAKE_COMMAND}" ARGS -E copy_directory + "${VCPKG_ARTIFACTS_SOURCE_DIR}/test-resources" + "${VCPKG_ARTIFACTS_BINARY_DIR}/test-resources" + # Files are after directories for more accurate cmake tracking of interrupted runs + COMMAND + "${CMAKE_COMMAND}" ARGS -E copy + "${VCPKG_ARTIFACTS_SOURCE_DIR}/package.json" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/package-lock.json" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/.npmrc" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/mocha-config.yaml" + "${VCPKG_ARTIFACTS_BINARY_DIR}" + COMMAND + "${CMAKE_COMMAND}" ARGS -E copy + "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json" + "${VCPKG_ARTIFACTS_BINARY_DIR}/locales/messages.json" + COMMAND + "${NODEJS}" ARGS "${VCPKG_ARTIFACTS_SOURCE_DIR}/node_modules/typescript/bin/tsc" + -p "${VCPKG_ARTIFACTS_SOURCE_DIR}" + --outDir "${VCPKG_ARTIFACTS_BINARY_DIR}" + COMMAND + "${CMAKE_COMMAND}" ARGS -E touch + "${VCPKG_ARTIFACTS_BINARY_DIR}/artifacts-development.txt" + DEPENDS + ${VCPKG_ARTIFACTS_SOURCES} + "${VCPKG_ARTIFACTS_SOURCE_DIR}/tsconfig.json" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/package.json" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/package-lock.json" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/.npmrc" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/mocha-config.yaml" + "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json" + COMMENT + "Building vcpkg-artifacts..." + VERBATIM + ) - add_custom_target(vcpkg-artifacts-test - ALL - DEPENDS - "${CMAKE_CURRENT_LIST_DIR}/ce/test/dist/tsconfig.tsbuildinfo" - ) - endif() -else() - if (VCPKG_ARTIFACTS_DEVELOPMENT) - message(WARNING "VCPKG_CE_SHA overrides VCPKG_ARTIFACTS_DEVELOPMENT") - endif() - target_compile_definitions(vcpkglib PUBLIC - VCPKG_CE_SHA=${VCPKG_CE_SHA} - ) + add_custom_target(vcpkg-artifacts-target + ALL + DEPENDS + ${VCPKG_ARTIFACTS_BINARIES} + "${VCPKG_ARTIFACTS_BINARY_DIR}/package.json" + "${VCPKG_ARTIFACTS_BINARY_DIR}/package-lock.json" + "${VCPKG_ARTIFACTS_BINARY_DIR}/.npmrc" + "${VCPKG_ARTIFACTS_BINARY_DIR}/mocha-config.yaml" + "${VCPKG_ARTIFACTS_BINARY_DIR}/locales/messages.json" + "${VCPKG_ARTIFACTS_BINARY_DIR}/artifacts-development.txt" + npm-restore + ) + set_target_properties(vcpkg-artifacts-target + PROPERTIES + ADDITIONAL_CLEAN_FILES "${VCPKG_ARTIFACTS_BINARY_DIR}") endif() set(CPP_ATOMIC_LIBRARY "") @@ -351,8 +391,8 @@ target_link_libraries(vcpkglib PUBLIC fmt::fmt cmakerc::locales - PRIVATE Threads::Threads + PRIVATE ${CPP_ATOMIC_LIBRARY} ) @@ -362,6 +402,11 @@ elseif(NOT MSVC) target_compile_options(vcpkglib PRIVATE -include "${CMAKE_CURRENT_SOURCE_DIR}/include/pch.h") endif() +if(ANDROID AND CMAKE_SYSTEM_VERSION LESS "28") + # pkg install libandroid-spawn + target_link_libraries(vcpkglib PRIVATE android-spawn) +endif() + if(MINGW) target_compile_definitions(vcpkglib PUBLIC @@ -399,29 +444,23 @@ if(VCPKG_ADD_SOURCELINK) REF "${VCPKG_VERSION}" ) endif() -if(VCPKG_PDB_SUFFIX) - set_property(TARGET vcpkg PROPERTY PDB_NAME "vcpkg${VCPKG_PDB_SUFFIX}") -endif() + +set_property(TARGET vcpkg PROPERTY PDB_NAME "vcpkg${VCPKG_PDB_SUFFIX}") # === Target: generate-message-map === -add_custom_target(generate-message-map - COMMAND vcpkg x-generate-default-message-map locales/messages.json ${CMAKE_CURRENT_LIST_DIR}/ce/ce/locales/messages.json - DEPENDS ${CMAKE_CURRENT_LIST_DIR}/ce/ce/locales/messages.json - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - COMMENT "Update locales/messages.json" - VERBATIM -) +set(GENERATE_MESSAGE_MAP_DEPENDENCIES vcpkg) if (VCPKG_ARTIFACTS_DEVELOPMENT) - add_custom_command( - OUTPUT ${CMAKE_CURRENT_LIST_DIR}/ce/ce/locales/messages.json - COMMAND "${NODEJS}" ARGS "${CMAKE_CURRENT_SOURCE_DIR}/ce/ce/node_modules/translate-strings/dist/main.js" "." "--json" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/ce/ce/node_modules" - WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/ce/ce" - COMMENT "Running translate-strings..." - VERBATIM - ) + list(APPEND GENERATE_MESSAGE_MAP_DEPENDENCIES "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json") endif() +add_custom_target(generate-message-map + COMMAND "$" z-generate-default-message-map locales/messages.json "${VCPKG_ARTIFACTS_SOURCE_DIR}/locales/messages.json" + DEPENDS ${GENERATE_MESSAGE_MAP_DEPENDENCIES} + WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" + COMMENT "Update locales/messages.json" + VERBATIM +) + # === Target: vcpkg-test === if (BUILD_TESTING) @@ -436,6 +475,7 @@ if (BUILD_TESTING) "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg.manifest" ) target_link_libraries(vcpkg-test PRIVATE vcpkglib) + set_property(TARGET vcpkg-test PROPERTY PDB_NAME "vcpkg-test${VCPKG_PDB_SUFFIX}") if(ANDROID) target_link_libraries(vcpkg-test PRIVATE log) endif() @@ -454,27 +494,49 @@ if (BUILD_TESTING) endif() # === Target: vcpkg-fuzz === - -file(GLOB VCPKG_FUZZ_SOURCES CONFIGURE_DEPENDS "src/vcpkg-fuzz/*.cpp") +set(VCPKG_FUZZ_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg-fuzz/main.cpp") if(VCPKG_BUILD_FUZZING) add_executable(vcpkg-fuzz ${VCPKG_FUZZ_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg.manifest") target_link_libraries(vcpkg-fuzz PRIVATE vcpkglib) + set_property(TARGET vcpkg-fuzz PROPERTY PDB_NAME "vcpkg-fuzz${VCPKG_PDB_SUFFIX}") endif() # === Target: tls12-download === - set(TLS12_DOWNLOAD_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/tls12-download.c") if(VCPKG_BUILD_TLS12_DOWNLOADER) add_executable(tls12-download ${TLS12_DOWNLOAD_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg.manifest") set_property(TARGET tls12-download PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") set_property(TARGET tls12-download APPEND PROPERTY LINK_OPTIONS "$,,/ENTRY:entry>") target_link_libraries(tls12-download winhttp wintrust shell32) - if(VCPKG_PDB_SUFFIX) - set_property(TARGET tls12-download PROPERTY PDB_NAME "tls12-download${VCPKG_PDB_SUFFIX}") - endif() + set_property(TARGET tls12-download PROPERTY PDB_NAME "tls12-download${VCPKG_PDB_SUFFIX}") endif() +if (BUILD_TESTING) +# === Target: closes-stdin === + +set(CLOSES_STDIN_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/closes-stdin.c") +add_executable(closes-stdin ${CLOSES_STDIN_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg.manifest") +set_property(TARGET closes-stdin PROPERTY PDB_NAME "closes-stdin${VCPKG_PDB_SUFFIX}") + +# === Target: closes-stdout === + +set(CLOSES_STDOUT_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/closes-stdout.c") +add_executable(closes-stdout ${CLOSES_STDOUT_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg.manifest") +set_property(TARGET closes-stdout PROPERTY PDB_NAME "closes-stdout${VCPKG_PDB_SUFFIX}") + +# === Target: reads-stdin === + +set(READS_STDIN_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/reads-stdin.c") +add_executable(reads-stdin ${READS_STDIN_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg.manifest") +set_property(TARGET reads-stdin PROPERTY PDB_NAME "reads-stdin${VCPKG_PDB_SUFFIX}") + +# === Target: test-editor === + +set(TEST_EDITOR_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/test-editor.c") +add_executable(test-editor ${TEST_EDITOR_SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/src/vcpkg.manifest") +set_property(TARGET test-editor PROPERTY PDB_NAME "test-editor${VCPKG_PDB_SUFFIX}") +endif() # === Target: format === @@ -495,6 +557,10 @@ if(CLANG_FORMAT) COMMAND "${CLANG_FORMAT}" -i -verbose ${VCPKG_FUZZ_SOURCES} COMMAND "${CLANG_FORMAT}" -i -verbose ${TLS12_DOWNLOAD_SOURCES} + COMMAND "${CLANG_FORMAT}" -i -verbose ${CLOSES_STDIN_SOURCES} + COMMAND "${CLANG_FORMAT}" -i -verbose ${CLOSES_STDOUT_SOURCES} + COMMAND "${CLANG_FORMAT}" -i -verbose ${READS_STDIN_SOURCES} + COMMAND "${CLANG_FORMAT}" -i -verbose ${TEST_EDITOR_SOURCES} ) endif() @@ -503,6 +569,6 @@ endif() # ==================== install(TARGETS vcpkg - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}" ) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000000..cafc60595a --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,205 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "official", + "hidden": true, + "cacheVariables": { + "VCPKG_OFFICIAL_BUILD": true, + "VCPKG_BASE_VERSION": "2023-09-15", + "VCPKG_STANDALONE_BUNDLE_SHA": "8b28c1829802a133941805c68004427052588ba6eefbdf9fb6061151a92c131491df7e29470309e804450c075d2f0673515d5d8c19997148ebcb2874493d304d" + } + }, + { + "name": "base", + "hidden": true, + "generator": "Ninja", + "binaryDir": "out\\build\\${presetName}", + "installDir": "out\\install\\${presetName}", + "cacheVariables": { + "VCPKG_BUILD_BENCHMARKING": true, + "VCPKG_BUILD_FUZZING": true + } + }, + { + "name": "debug", + "hidden": true, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "release", + "hidden": true, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "RelWithDebInfo" + } + }, + { + "name": "windows", + "hidden": true, + "cacheVariables": { + "VCPKG_BUILD_TLS12_DOWNLOADER": true + }, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Windows" + ] + } + } + }, + { + "name": "artifacts", + "hidden": true, + "cacheVariables": { + "VCPKG_ARTIFACTS_DEVELOPMENT": true + } + }, + { + "name": "windows-x64", + "hidden": true, + "inherits": "windows", + "architecture": { + "value": "x64", + "strategy": "external" + } + }, + { + "name": "Win-x64-Debug", + "inherits": [ + "base", + "windows-x64", + "debug" + ] + }, + { + "name": "Win-x64-Debug-WithArtifacts", + "inherits": [ + "Win-x64-Debug", + "artifacts" + ] + }, + { + "name": "Win-x64-Debug-NoAnalyze", + "inherits": "Win-x64-Debug", + "cacheVariables": { + "VCPKG_MSVC_ANALYZE": false + } + }, + { + "name": "Win-x64-Debug-Official", + "inherits": [ + "Win-x64-Debug", + "official" + ] + }, + { + "name": "Win-x64-Release", + "inherits": [ + "base", + "windows-x64", + "release" + ] + }, + { + "name": "Win-x64-Release-Official", + "inherits": [ + "Win-x64-Release", + "official" + ] + }, + { + "name": "windows-ci", + "inherits": "Win-x64-Debug-WithArtifacts", + "cacheVariables": { + "VCPKG_WARNINGS_AS_ERRORS": true + } + }, + { + "name": "linux", + "hidden": true, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "Linux" + ] + } + } + }, + { + "name": "linux-with-artifacts", + "inherits": [ + "base", + "linux", + "artifacts" + ] + }, + { + "name": "linux-ci", + "inherits": [ + "base", + "debug", + "artifacts", + "linux" + ], + "cacheVariables": { + "CMAKE_CXX_FLAGS": "-fprofile-arcs -fPIC -O0 -fsanitize=undefined -fsanitize=address", + "CMAKE_EXE_LINKER_FLAGS": "-static-libasan", + "VCPKG_WARNINGS_AS_ERRORS": true + } + }, + { + "name": "macos", + "hidden": true, + "vendor": { + "microsoft.com/VisualStudioSettings/CMake/1.0": { + "hostOS": [ + "macOS" + ] + } + } + }, + { + "name": "macos-ci", + "inherits": [ + "base", + "debug", + "artifacts", + "macos" + ], + "cacheVariables": { + "CMAKE_OSX_DEPLOYMENT_TARGET": "10.13", + "VCPKG_WARNINGS_AS_ERRORS": true + } + } + ], + "buildPresets": [ + { + "name": "windows-ci", + "configurePreset": "windows-ci" + }, + { + "name": "linux-ci", + "configurePreset": "linux-ci" + }, + { + "name": "macos-ci", + "configurePreset": "macos-ci" + } + ], + "testPresets": [ + { + "name": "windows-ci", + "configurePreset": "windows-ci" + }, + { + "name": "linux-ci", + "configurePreset": "linux-ci" + }, + { + "name": "macos-ci", + "configurePreset": "macos-ci" + } + ] +} \ No newline at end of file diff --git a/CMakeSettings.json b/CMakeSettings.json deleted file mode 100644 index 33354d93d2..0000000000 --- a/CMakeSettings.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "variables": [ - { - "name": "VCPKG_BUILD_TLS12_DOWNLOADER", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_BENCHMARKING", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_FUZZING", - "value": "True", - "type": "BOOL" - } - ] - }, - { - "name": "x64-Debug-WithArtifacts", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "variables": [ - { - "name": "VCPKG_ARTIFACTS_DEVELOPMENT", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_TLS12_DOWNLOADER", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_BENCHMARKING", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_FUZZING", - "value": "True", - "type": "BOOL" - } - ] - }, - { - "name": "x64-Debug-NoAnalyze", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "variables": [ - { - "name": "VCPKG_MSVC_ANALYZE", - "value": "False", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_TLS12_DOWNLOADER", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_BENCHMARKING", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_FUZZING", - "value": "True", - "type": "BOOL" - } - ] - }, - { - "name": "x64-Debug-Official-2023-03-28", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "variables": [ - { - "name": "VCPKG_OFFICIAL_BUILD", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BASE_VERSION", - "value": "2023-03-28", - "type": "STRING" - }, - { - "name": "VCPKG_STANDALONE_BUNDLE_SHA", - "value": "bdf19a9e602f237d3906321a13e883f72e8804e0bbbd4369b6fca3acdd98238371445c8cab2e7a155cf56db43a2f1e30060c71eaf4e3cb55d892d100a312ada5", - "type": "STRING" - }, - { - "name": "VCPKG_CE_SHA", - "value": "ffae1cb2fee518aba585a45f5e25c4eedf6218126821ae75808b9575b0c9d9b096ddb28475979a9c1a5ce217d920a91e1b510433a9f5a0ab5c4a44f6ff82a210", - "type": "STRING" - }, - { - "name": "VCPKG_BUILD_TLS12_DOWNLOADER", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_BENCHMARKING", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_FUZZING", - "value": "True", - "type": "BOOL" - } - ] - }, - { - "name": "x64-Release", - "generator": "Ninja", - "configurationType": "RelWithDebInfo", - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [ - { - "name": "VCPKG_BUILD_TLS12_DOWNLOADER", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_BENCHMARKING", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_FUZZING", - "value": "True", - "type": "BOOL" - } - ] - }, - { - "name": "x86-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x86_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "variables": [ - { - "name": "VCPKG_BUILD_TLS12_DOWNLOADER", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_BENCHMARKING", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_FUZZING", - "value": "True", - "type": "BOOL" - } - ] - }, - { - "name": "x86-Release", - "generator": "Ninja", - "configurationType": "RelWithDebInfo", - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x86_x64" ], - "variables": [ - { - "name": "VCPKG_BUILD_TLS12_DOWNLOADER", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_BENCHMARKING", - "value": "True", - "type": "BOOL" - }, - { - "name": "VCPKG_BUILD_FUZZING", - "value": "True", - "type": "BOOL" - } - ] - } - ] -} \ No newline at end of file diff --git a/azure-pipelines/.npmrc-internal b/azure-pipelines/.npmrc-internal deleted file mode 100644 index 2bd79f71f4..0000000000 --- a/azure-pipelines/.npmrc-internal +++ /dev/null @@ -1,3 +0,0 @@ -registry=https://devdiv.pkgs.visualstudio.com/DevDiv/_packaging/vcpkg-ce-npm/npm/registry/ - -always-auth=true diff --git a/azure-pipelines/Create-PRDiff.ps1 b/azure-pipelines/Create-PRDiff.ps1 index ec170654ed..0f89a08b1d 100644 --- a/azure-pipelines/Create-PRDiff.ps1 +++ b/azure-pipelines/Create-PRDiff.ps1 @@ -4,16 +4,9 @@ Param( [String]$DiffFile ) -Start-Process -FilePath 'git' -ArgumentList 'diff',':!ce/common/config/rush/.npmrc' ` - -NoNewWindow -Wait ` - -RedirectStandardOutput $DiffFile +& git diff --output $DiffFile -- ':!vcpkg-artifacts/.npmrc' if (0 -ne (Get-Item -LiteralPath $DiffFile).Length) { - $msg = @( - 'The formatting of the files in the repo were not what we expected.', - 'Please access the diff from format.diff in the build artifacts,' - 'and apply the patch with `git apply`' - ) - Write-Error ($msg -join "`n") + Write-Error 'The formatting of the files in the repo were not what we expected, or you forgot to regenerate messages files. Please access the diff from format.diff in the build artifacts, and apply the patch with `git apply`' throw } diff --git a/azure-pipelines/arch-independent-signing.signproj b/azure-pipelines/arch-independent-signing.signproj index 4415269352..0bc8963bfd 100644 --- a/azure-pipelines/arch-independent-signing.signproj +++ b/azure-pipelines/arch-independent-signing.signproj @@ -11,23 +11,22 @@ - + Microsoft400 - + 3PartyScriptsSHA2 Microsoft400 - + Microsoft400 - + Microsoft400 - + Microsoft400 diff --git a/azure-pipelines/binary-signing.signproj b/azure-pipelines/binary-signing.signproj index fa4851e34a..8605642fe0 100644 --- a/azure-pipelines/binary-signing.signproj +++ b/azure-pipelines/binary-signing.signproj @@ -11,10 +11,10 @@ - + Microsoft400 - + Microsoft400 diff --git a/azure-pipelines/e2e_artifacts_registry/index.yaml b/azure-pipelines/e2e-artifacts-registry/index.yaml similarity index 100% rename from azure-pipelines/e2e_artifacts_registry/index.yaml rename to azure-pipelines/e2e-artifacts-registry/index.yaml diff --git a/azure-pipelines/e2e_artifacts_registry/vcpkg-test-artifact-1/vcpkg-test-artifact-1-1.0.0.json b/azure-pipelines/e2e-artifacts-registry/vcpkg-test-artifact-1/vcpkg-test-artifact-1-1.0.0.json similarity index 100% rename from azure-pipelines/e2e_artifacts_registry/vcpkg-test-artifact-1/vcpkg-test-artifact-1-1.0.0.json rename to azure-pipelines/e2e-artifacts-registry/vcpkg-test-artifact-1/vcpkg-test-artifact-1-1.0.0.json diff --git a/azure-pipelines/e2e_artifacts_registry/vcpkg-test-artifact-2/vcpkg-test-artifact-2-1.0.0.json b/azure-pipelines/e2e-artifacts-registry/vcpkg-test-artifact-2/vcpkg-test-artifact-2-1.0.0.json similarity index 100% rename from azure-pipelines/e2e_artifacts_registry/vcpkg-test-artifact-2/vcpkg-test-artifact-2-1.0.0.json rename to azure-pipelines/e2e-artifacts-registry/vcpkg-test-artifact-2/vcpkg-test-artifact-2-1.0.0.json diff --git a/azure-pipelines/e2e_artifacts_registry/vcpkg-test-artifact-3/vcpkg-test-artifact-3-1.0.0.json b/azure-pipelines/e2e-artifacts-registry/vcpkg-test-artifact-3/vcpkg-test-artifact-3-1.0.0.json similarity index 100% rename from azure-pipelines/e2e_artifacts_registry/vcpkg-test-artifact-3/vcpkg-test-artifact-3-1.0.0.json rename to azure-pipelines/e2e-artifacts-registry/vcpkg-test-artifact-3/vcpkg-test-artifact-3-1.0.0.json diff --git a/azure-pipelines/e2e-assets/ci/ci.baseline.txt b/azure-pipelines/e2e-assets/ci/ci.baseline.txt new file mode 100644 index 0000000000..991685359f --- /dev/null +++ b/azure-pipelines/e2e-assets/ci/ci.baseline.txt @@ -0,0 +1,16 @@ +not-sup-host-b:arm64-osx=fail +not-sup-host-b:x64-osx=fail +not-sup-host-b:x86-windows=fail +not-sup-host-b:x64-windows=fail +not-sup-host-b:arm64-windows=fail +not-sup-host-b:x64-linux=fail +not-sup-host-b:arm64-linux=fail + + +dep-on-feature-not-sup:arm64-osx=fail +dep-on-feature-not-sup:x64-osx=fail +dep-on-feature-not-sup:x86-windows=fail +dep-on-feature-not-sup:x64-windows=fail +dep-on-feature-not-sup:arm64-windows=fail +dep-on-feature-not-sup:x64-linux=fail +dep-on-feature-not-sup:arm64-linux=fail diff --git a/azure-pipelines/e2e-assets/extract/a-tar-with-plus-x.tar.gz b/azure-pipelines/e2e-assets/extract/a-tar-with-plus-x.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2ae16649e82cc60e2e469fbc5b4652ccb2f20605 GIT binary patch literal 118 zcmb2|=3oE==C>CNxehr9uwJk|C6{_BJIbhi$A{|C4$D&odwQ z?f1=$PQ4mcowg;)?z67z{p;&i3%-s`3SYc5#_ZnLqFBAdmd{PjwP#xLKHi@G=M^Kw Sd #include "mylib.h" void mylib::my_func() { - puts("hello world"); -} \ No newline at end of file + puts("hello world"); +} diff --git a/azure-pipelines/e2e-projects/applocal/basic/installed/bin/mylib.h b/azure-pipelines/e2e-projects/applocal/basic/installed/bin/mylib.h new file mode 100644 index 0000000000..d45d32f1a6 --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/basic/installed/bin/mylib.h @@ -0,0 +1,8 @@ +class +#if MYLIB_EXPORTS +__declspec(dllexport) +#endif +mylib { +public: + static void my_func(); +}; diff --git a/azure-pipelines/e2e-projects/applocal/basic/main.cpp b/azure-pipelines/e2e-projects/applocal/basic/main.cpp new file mode 100644 index 0000000000..42f4ea5e0e --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/basic/main.cpp @@ -0,0 +1,6 @@ +#include "installed/bin/mylib.h" + +int main() { + mylib::my_func(); + return 0; +} diff --git a/azure-pipelines/e2e-projects/applocal/plugins-debug/build.bat b/azure-pipelines/e2e-projects/applocal/plugins-debug/build.bat new file mode 100644 index 0000000000..c5f2d0c53f --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins-debug/build.bat @@ -0,0 +1,8 @@ +cd %~dp0 +pushd installed\tools\azure-kinect-sensor-sdk +cl /LD depthengine_2_0.cpp +popd +pushd installed\debug\bin +cl /LD k4a.cpp +popd +cl /EHsc main.cpp installed/debug/bin/k4a.lib diff --git a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.cpp b/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/debug/bin/k4a.cpp similarity index 54% rename from azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.cpp rename to azure-pipelines/e2e-projects/applocal/plugins-debug/installed/debug/bin/k4a.cpp index e9f866b399..6f9470e6b4 100644 --- a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.cpp +++ b/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/debug/bin/k4a.cpp @@ -1,7 +1,8 @@ #define MYLIB_EXPORTS 1 +#include #include "k4a.h" void k4a::my_func() { - puts("hello world"); -} \ No newline at end of file + puts("hello world"); +} diff --git a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.h b/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/debug/bin/k4a.h similarity index 54% rename from azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.h rename to azure-pipelines/e2e-projects/applocal/plugins-debug/installed/debug/bin/k4a.h index 20d451dd9b..dd0e75fb67 100644 --- a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/k4a.h +++ b/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/debug/bin/k4a.h @@ -1,10 +1,8 @@ -#include - -class +class #if MYLIB_EXPORTS -__declspec( dllexport ) +__declspec(dllexport) #endif k4a { public: static void my_func(); -}; \ No newline at end of file +}; diff --git a/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/tools/azure-kinect-sensor-sdk/depthengine_2_0.cpp b/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/tools/azure-kinect-sensor-sdk/depthengine_2_0.cpp new file mode 100644 index 0000000000..608fd92bcc --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/tools/azure-kinect-sensor-sdk/depthengine_2_0.cpp @@ -0,0 +1,11 @@ +#define MYLIB_EXPORTS 1 + +#include +class __declspec(dllexport) depthengine_2_0 { +public: + static void my_func(); +}; + +void depthengine_2_0::my_func() { + puts("hello world"); +} diff --git a/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/tools/azure-kinect-sensor-sdk/k4adeploy.ps1 b/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/tools/azure-kinect-sensor-sdk/k4adeploy.ps1 new file mode 100644 index 0000000000..107024a689 --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins-debug/installed/tools/azure-kinect-sensor-sdk/k4adeploy.ps1 @@ -0,0 +1,2 @@ +This file exists to tell z-applocal that the azure-kinect-sensor-sdk is installed and is not +intended to be an executable PowerShell script. diff --git a/azure-pipelines/e2e-projects/applocal/plugins-debug/main.cpp b/azure-pipelines/e2e-projects/applocal/plugins-debug/main.cpp new file mode 100644 index 0000000000..847b8fc21d --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins-debug/main.cpp @@ -0,0 +1,6 @@ +#include "installed/debug/bin/k4a.h" + +int main() { + k4a::my_func(); + return 0; +} diff --git a/azure-pipelines/e2e-projects/applocal/plugins/build.bat b/azure-pipelines/e2e-projects/applocal/plugins/build.bat new file mode 100644 index 0000000000..d1ed44ede6 --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins/build.bat @@ -0,0 +1,8 @@ +cd %~dp0 +pushd installed\tools\azure-kinect-sensor-sdk +cl /LD depthengine_2_0.cpp +popd +pushd installed\bin +cl /LD k4a.cpp +popd +cl /EHsc main.cpp installed/bin/k4a.lib diff --git a/azure-pipelines/e2e-projects/applocal/plugins/installed/bin/k4a.cpp b/azure-pipelines/e2e-projects/applocal/plugins/installed/bin/k4a.cpp new file mode 100644 index 0000000000..6f9470e6b4 --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins/installed/bin/k4a.cpp @@ -0,0 +1,8 @@ +#define MYLIB_EXPORTS 1 + +#include +#include "k4a.h" + +void k4a::my_func() { + puts("hello world"); +} diff --git a/azure-pipelines/e2e-projects/applocal/plugins/installed/bin/k4a.h b/azure-pipelines/e2e-projects/applocal/plugins/installed/bin/k4a.h new file mode 100644 index 0000000000..dd0e75fb67 --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins/installed/bin/k4a.h @@ -0,0 +1,8 @@ +class +#if MYLIB_EXPORTS +__declspec(dllexport) +#endif +k4a { +public: + static void my_func(); +}; diff --git a/azure-pipelines/e2e-projects/applocal/plugins/installed/tools/azure-kinect-sensor-sdk/depthengine_2_0.cpp b/azure-pipelines/e2e-projects/applocal/plugins/installed/tools/azure-kinect-sensor-sdk/depthengine_2_0.cpp new file mode 100644 index 0000000000..608fd92bcc --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins/installed/tools/azure-kinect-sensor-sdk/depthengine_2_0.cpp @@ -0,0 +1,11 @@ +#define MYLIB_EXPORTS 1 + +#include +class __declspec(dllexport) depthengine_2_0 { +public: + static void my_func(); +}; + +void depthengine_2_0::my_func() { + puts("hello world"); +} diff --git a/azure-pipelines/e2e-projects/applocal/plugins/installed/tools/azure-kinect-sensor-sdk/k4adeploy.ps1 b/azure-pipelines/e2e-projects/applocal/plugins/installed/tools/azure-kinect-sensor-sdk/k4adeploy.ps1 new file mode 100644 index 0000000000..107024a689 --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins/installed/tools/azure-kinect-sensor-sdk/k4adeploy.ps1 @@ -0,0 +1,2 @@ +This file exists to tell z-applocal that the azure-kinect-sensor-sdk is installed and is not +intended to be an executable PowerShell script. diff --git a/azure-pipelines/e2e-projects/applocal/plugins/main.cpp b/azure-pipelines/e2e-projects/applocal/plugins/main.cpp new file mode 100644 index 0000000000..11793a624b --- /dev/null +++ b/azure-pipelines/e2e-projects/applocal/plugins/main.cpp @@ -0,0 +1,6 @@ +#include "installed/bin/k4a.h" + +int main() { + k4a::my_func(); + return 0; +} diff --git a/azure-pipelines/e2e_projects/registries-package-patterns/no-patterns.json.in b/azure-pipelines/e2e-projects/e2e-registry-templates/no-patterns.json.in similarity index 100% rename from azure-pipelines/e2e_projects/registries-package-patterns/no-patterns.json.in rename to azure-pipelines/e2e-projects/e2e-registry-templates/no-patterns.json.in diff --git a/azure-pipelines/e2e_projects/registries-package-patterns/only-patterns.json.in b/azure-pipelines/e2e-projects/e2e-registry-templates/only-patterns.json.in similarity index 100% rename from azure-pipelines/e2e_projects/registries-package-patterns/only-patterns.json.in rename to azure-pipelines/e2e-projects/e2e-registry-templates/only-patterns.json.in diff --git a/azure-pipelines/e2e-projects/e2e-registry-templates/removed.json.in b/azure-pipelines/e2e-projects/e2e-registry-templates/removed.json.in new file mode 100644 index 0000000000..db996fd482 --- /dev/null +++ b/azure-pipelines/e2e-projects/e2e-registry-templates/removed.json.in @@ -0,0 +1,18 @@ +{ + "vcpkg-configuration": { + "default-registry": { + "kind": "git", + "baseline": "$E2ERegistryBaseline", + "repository": "$E2ERegistryPath" + } + }, + "dependencies": [ + "removed" + ], + "overrides": [ + { + "name": "removed", + "version": "1.0.0" + } + ] +} diff --git a/azure-pipelines/e2e_projects/registries-package-patterns/with-default.json.in b/azure-pipelines/e2e-projects/e2e-registry-templates/with-default.json.in similarity index 100% rename from azure-pipelines/e2e_projects/registries-package-patterns/with-default.json.in rename to azure-pipelines/e2e-projects/e2e-registry-templates/with-default.json.in diff --git a/azure-pipelines/e2e_projects/registries-package-patterns/with-redeclaration.json.in b/azure-pipelines/e2e-projects/e2e-registry-templates/with-redeclaration.json.in similarity index 100% rename from azure-pipelines/e2e_projects/registries-package-patterns/with-redeclaration.json.in rename to azure-pipelines/e2e-projects/e2e-registry-templates/with-redeclaration.json.in diff --git a/azure-pipelines/e2e-projects/export-project/vcpkg.json b/azure-pipelines/e2e-projects/export-project/vcpkg.json new file mode 100644 index 0000000000..c51d510762 --- /dev/null +++ b/azure-pipelines/e2e-projects/export-project/vcpkg.json @@ -0,0 +1,12 @@ +{ + "name": "my-project", + "version-string": "0.1.0", + "dependencies": [ + { + "name": "zlib" + }, + { + "name": "fmt" + } + ] +} diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e-projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/portfile.cmake rename to azure-pipelines/e2e-projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/portfile.cmake diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e-projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-bad-paths/env-overlays/vcpkg-empty-port/vcpkg.json diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/my-triplets/x64-windows-static.cmake b/azure-pipelines/e2e-projects/overlays-bad-paths/my-triplets/x64-windows-static.cmake similarity index 100% rename from azure-pipelines/e2e_projects/overlays-bad-paths/my-triplets/x64-windows-static.cmake rename to azure-pipelines/e2e-projects/overlays-bad-paths/my-triplets/x64-windows-static.cmake diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg-configuration.json b/azure-pipelines/e2e-projects/overlays-bad-paths/vcpkg-configuration.json similarity index 64% rename from azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg-configuration.json rename to azure-pipelines/e2e-projects/overlays-bad-paths/vcpkg-configuration.json index ca49482b31..827dc498e6 100644 --- a/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg-configuration.json +++ b/azure-pipelines/e2e-projects/overlays-bad-paths/vcpkg-configuration.json @@ -1,4 +1,4 @@ { - "overlay-ports": [ "./azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays" ], + "overlay-ports": [ "./azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/nonexistent" ], "overlay-triplets": [ 123 ] } diff --git a/azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg.json b/azure-pipelines/e2e-projects/overlays-bad-paths/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-bad-paths/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-bad-paths/vcpkg.json diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e-projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/portfile.cmake rename to azure-pipelines/e2e-projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/portfile.cmake diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e-projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-project-config-embedded/cli-overlays/another-vcpkg-empty-port/vcpkg.json diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/portfile.cmake b/azure-pipelines/e2e-projects/overlays-project-config-embedded/config-overlays/beicode/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/portfile.cmake rename to azure-pipelines/e2e-projects/overlays-project-config-embedded/config-overlays/beicode/portfile.cmake diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/vcpkg.json b/azure-pipelines/e2e-projects/overlays-project-config-embedded/config-overlays/beicode/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-config-embedded/config-overlays/beicode/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-project-config-embedded/config-overlays/beicode/vcpkg.json diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e-projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/portfile.cmake rename to azure-pipelines/e2e-projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/portfile.cmake diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e-projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-project-config-embedded/env-overlays/vcpkg-empty-port/vcpkg.json diff --git a/azure-pipelines/e2e-projects/overlays-project-config-embedded/my-triplets/fancy-config-embedded-triplet.cmake b/azure-pipelines/e2e-projects/overlays-project-config-embedded/my-triplets/fancy-config-embedded-triplet.cmake new file mode 100644 index 0000000000..91a235b525 --- /dev/null +++ b/azure-pipelines/e2e-projects/overlays-project-config-embedded/my-triplets/fancy-config-embedded-triplet.cmake @@ -0,0 +1,18 @@ +if(CMAKE_HOST_WIN32) +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE static) +set(VCPKG_LIBRARY_LINKAGE dynamic) +elseif(CMAKE_HOST_APPLE) +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +set(VCPKG_OSX_ARCHITECTURES x86_64) +else() +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Linux) +endif() diff --git a/azure-pipelines/e2e_projects/overlays-project-config-embedded/vcpkg.json b/azure-pipelines/e2e-projects/overlays-project-config-embedded/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-config-embedded/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-project-config-embedded/vcpkg.json diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e-projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake rename to azure-pipelines/e2e-projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/portfile.cmake diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e-projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-project-with-config/cli-overlays/another-vcpkg-empty-port/vcpkg.json diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/portfile.cmake b/azure-pipelines/e2e-projects/overlays-project-with-config/config-overlays/beicode/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/portfile.cmake rename to azure-pipelines/e2e-projects/overlays-project-with-config/config-overlays/beicode/portfile.cmake diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/vcpkg.json b/azure-pipelines/e2e-projects/overlays-project-with-config/config-overlays/beicode/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-with-config/config-overlays/beicode/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-project-with-config/config-overlays/beicode/vcpkg.json diff --git a/azure-pipelines/e2e-projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake b/azure-pipelines/e2e-projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/azure-pipelines/e2e-projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e-projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-project-with-config/env-overlays/vcpkg-empty-port/vcpkg.json diff --git a/azure-pipelines/e2e-projects/overlays-project-with-config/my-triplets/fancy-triplet.cmake b/azure-pipelines/e2e-projects/overlays-project-with-config/my-triplets/fancy-triplet.cmake new file mode 100644 index 0000000000..91a235b525 --- /dev/null +++ b/azure-pipelines/e2e-projects/overlays-project-with-config/my-triplets/fancy-triplet.cmake @@ -0,0 +1,18 @@ +if(CMAKE_HOST_WIN32) +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE static) +set(VCPKG_LIBRARY_LINKAGE dynamic) +elseif(CMAKE_HOST_APPLE) +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +set(VCPKG_OSX_ARCHITECTURES x86_64) +else() +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Linux) +endif() diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg-configuration.json b/azure-pipelines/e2e-projects/overlays-project-with-config/vcpkg-configuration.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg-configuration.json rename to azure-pipelines/e2e-projects/overlays-project-with-config/vcpkg-configuration.json diff --git a/azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg.json b/azure-pipelines/e2e-projects/overlays-project-with-config/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-project-with-config/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-project-with-config/vcpkg.json diff --git a/azure-pipelines/e2e_projects/overlays-vcpkg-empty-port/vcpkg.json b/azure-pipelines/e2e-projects/overlays-vcpkg-empty-port/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_projects/overlays-vcpkg-empty-port/vcpkg.json rename to azure-pipelines/e2e-projects/overlays-vcpkg-empty-port/vcpkg.json diff --git a/azure-pipelines/e2e_registry/extra-ports/foo/portfile.cmake b/azure-pipelines/e2e-registry/extra-ports/foo/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_registry/extra-ports/foo/portfile.cmake rename to azure-pipelines/e2e-registry/extra-ports/foo/portfile.cmake diff --git a/azure-pipelines/e2e_registry/extra-ports/foo/vcpkg.json b/azure-pipelines/e2e-registry/extra-ports/foo/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_registry/extra-ports/foo/vcpkg.json rename to azure-pipelines/e2e-registry/extra-ports/foo/vcpkg.json diff --git a/azure-pipelines/e2e_registry/ports/bar/portfile.cmake b/azure-pipelines/e2e-registry/ports/bar/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_registry/ports/bar/portfile.cmake rename to azure-pipelines/e2e-registry/ports/bar/portfile.cmake diff --git a/azure-pipelines/e2e_registry/ports/bar/vcpkg.json b/azure-pipelines/e2e-registry/ports/bar/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_registry/ports/bar/vcpkg.json rename to azure-pipelines/e2e-registry/ports/bar/vcpkg.json diff --git a/azure-pipelines/e2e_registry/ports/baz/portfile.cmake b/azure-pipelines/e2e-registry/ports/baz/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_registry/ports/baz/portfile.cmake rename to azure-pipelines/e2e-registry/ports/baz/portfile.cmake diff --git a/azure-pipelines/e2e_registry/ports/baz/vcpkg.json b/azure-pipelines/e2e-registry/ports/baz/vcpkg.json similarity index 100% rename from azure-pipelines/e2e_registry/ports/baz/vcpkg.json rename to azure-pipelines/e2e-registry/ports/baz/vcpkg.json diff --git a/azure-pipelines/e2e_registry/ports/foo/portfile.cmake b/azure-pipelines/e2e-registry/ports/foo/portfile.cmake similarity index 100% rename from azure-pipelines/e2e_registry/ports/foo/portfile.cmake rename to azure-pipelines/e2e-registry/ports/foo/portfile.cmake diff --git a/azure-pipelines/e2e_registry/ports/foo/vcpkg.json b/azure-pipelines/e2e-registry/ports/foo/vcpkg.json similarity index 93% rename from azure-pipelines/e2e_registry/ports/foo/vcpkg.json rename to azure-pipelines/e2e-registry/ports/foo/vcpkg.json index e7580a5d15..7db8ee8a0a 100644 --- a/azure-pipelines/e2e_registry/ports/foo/vcpkg.json +++ b/azure-pipelines/e2e-registry/ports/foo/vcpkg.json @@ -1,5 +1,5 @@ -{ - "name": "foo", - "version": "1.0.0", - "description": "e2e test port" -} +{ + "name": "foo", + "version": "1.0.0", + "description": "e2e test port" +} diff --git a/azure-pipelines/e2e-registry/removed-ports/removed/portfile.cmake b/azure-pipelines/e2e-registry/removed-ports/removed/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/azure-pipelines/e2e-registry/removed-ports/removed/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/azure-pipelines/e2e-registry/removed-ports/removed/vcpkg.json b/azure-pipelines/e2e-registry/removed-ports/removed/vcpkg.json new file mode 100644 index 0000000000..cf7445691f --- /dev/null +++ b/azure-pipelines/e2e-registry/removed-ports/removed/vcpkg.json @@ -0,0 +1,4 @@ +{ + "name": "removed", + "version": "1.0.0" +} diff --git a/azure-pipelines/e2e_registry/versions/b-/bar.json b/azure-pipelines/e2e-registry/versions/b-/bar.json similarity index 100% rename from azure-pipelines/e2e_registry/versions/b-/bar.json rename to azure-pipelines/e2e-registry/versions/b-/bar.json diff --git a/azure-pipelines/e2e_registry/versions/b-/baz.json b/azure-pipelines/e2e-registry/versions/b-/baz.json similarity index 100% rename from azure-pipelines/e2e_registry/versions/b-/baz.json rename to azure-pipelines/e2e-registry/versions/b-/baz.json diff --git a/azure-pipelines/e2e_registry/versions/baseline.json b/azure-pipelines/e2e-registry/versions/baseline.json similarity index 100% rename from azure-pipelines/e2e_registry/versions/baseline.json rename to azure-pipelines/e2e-registry/versions/baseline.json diff --git a/azure-pipelines/e2e_registry/versions/f-/foo.json b/azure-pipelines/e2e-registry/versions/f-/foo.json similarity index 100% rename from azure-pipelines/e2e_registry/versions/f-/foo.json rename to azure-pipelines/e2e-registry/versions/f-/foo.json diff --git a/azure-pipelines/e2e-registry/versions/r-/removed.json b/azure-pipelines/e2e-registry/versions/r-/removed.json new file mode 100644 index 0000000000..fedee4c87f --- /dev/null +++ b/azure-pipelines/e2e-registry/versions/r-/removed.json @@ -0,0 +1,9 @@ +{ + "versions": [ + { + "git-tree": "9b82c31964570870d27a5bb634f5b84e13f8b90a", + "version": "1.0.0", + "port-version": 0 + } + ] +} diff --git a/azure-pipelines/e2e_ports/vcpkg-find-acquire-program/CONTROL b/azure-pipelines/e2e_ports/vcpkg-find-acquire-program/CONTROL deleted file mode 100644 index 6f248be58a..0000000000 --- a/azure-pipelines/e2e_ports/vcpkg-find-acquire-program/CONTROL +++ /dev/null @@ -1,4 +0,0 @@ -Source: vcpkg-find-acquire-program -Version: 0 -Description: Test port to exercise vcpkg_find_acquire_program -Supports: windows diff --git a/azure-pipelines/e2e_ports/vcpkg-find-acquire-program/portfile.cmake b/azure-pipelines/e2e_ports/vcpkg-find-acquire-program/portfile.cmake deleted file mode 100644 index 88a4856c5f..0000000000 --- a/azure-pipelines/e2e_ports/vcpkg-find-acquire-program/portfile.cmake +++ /dev/null @@ -1,21 +0,0 @@ -set(VCPKG_POLICY_EMPTY_PACKAGE enabled) - -if(CMAKE_HOST_WIN32) - foreach(PROG GO JOM NASM PERL YASM GIT PYTHON3 PYTHON2 RUBY 7Z NUGET FLEX BISON GPERF GASPREPROCESSOR DARK SCONS SWIG DOXYGEN ARIA2 PKGCONFIG) - vcpkg_find_acquire_program(${PROG}) - foreach(SUBPROG IN LISTS ${PROG}) - if(NOT EXISTS "${SUBPROG}") - message(FATAL_ERROR "Program ${SUBPROG} did not exist.") - endif() - endforeach() - endforeach() -endif() - -foreach(PROG GN NINJA MESON BAZEL) - vcpkg_find_acquire_program(${PROG}) - foreach(SUBPROG IN LISTS ${PROG}) - if(NOT EXISTS "${SUBPROG}") - message(FATAL_ERROR "Program ${SUBPROG} did not exist.") - endif() - endforeach() -endforeach() diff --git a/azure-pipelines/e2e_projects/applocal-test/build/build.bat b/azure-pipelines/e2e_projects/applocal-test/build/build.bat deleted file mode 100644 index 502d64859d..0000000000 --- a/azure-pipelines/e2e_projects/applocal-test/build/build.bat +++ /dev/null @@ -1,3 +0,0 @@ -cd %~dp0 -cl /LD mylib.cpp -cl /EHsc main.cpp mylib.lib diff --git a/azure-pipelines/e2e_projects/applocal-test/build/main.cpp b/azure-pipelines/e2e_projects/applocal-test/build/main.cpp deleted file mode 100644 index 888b3ef498..0000000000 --- a/azure-pipelines/e2e_projects/applocal-test/build/main.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include "mylib.h" - -int main() { - mylib::my_func(); - - return 0; -} diff --git a/azure-pipelines/e2e_projects/applocal-test/build/mylib.h b/azure-pipelines/e2e_projects/applocal-test/build/mylib.h deleted file mode 100644 index 94ddf0f88d..0000000000 --- a/azure-pipelines/e2e_projects/applocal-test/build/mylib.h +++ /dev/null @@ -1,10 +0,0 @@ -#include - -class -#if MYLIB_EXPORTS -__declspec( dllexport ) -#endif -mylib { -public: - static void my_func(); -}; \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/build.bat b/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/build.bat deleted file mode 100644 index 98eec9d712..0000000000 --- a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/build.bat +++ /dev/null @@ -1,4 +0,0 @@ -cd %~dp0 -cl /LD k4a.cpp -cl /LD depthengine_2_0.cpp -cl /EHsc main.cpp k4a.lib depthengine_2_0.lib diff --git a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.cpp b/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.cpp deleted file mode 100644 index c1d2b33394..0000000000 --- a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#define MYLIB_EXPORTS 1 - -#include "depthengine_2_0.h" - -void depthengine_2_0::my_func() { - puts("hello world"); -} \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.h b/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.h deleted file mode 100644 index 5e352dbcee..0000000000 --- a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/depthengine_2_0.h +++ /dev/null @@ -1,10 +0,0 @@ -#include - -class -#if MYLIB_EXPORTS -__declspec( dllexport ) -#endif -depthengine_2_0 { -public: - static void my_func(); -}; \ No newline at end of file diff --git a/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/main.exe b/azure-pipelines/e2e_projects/applocal-test/plugins/azure_kinect_sensor_sdk/main.exe deleted file mode 100644 index b02278846a46b1d9359993f7ece9ed494dd020db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76288 zcmeFaeRx#WwLgAl=1ek>2{S+fv7iJ9ibgRyAjBaWkV&E?I59FIg@A2^rlVB~=LEbZ zka!Zz$@WxktM}SlxfPKXtKQO9Ain2?CgG*LUyMRED#aZq)gUwp5_5i^wa-iv(B9kM z^L@Vmee*myFZ=Ah_S$Rjz1G@mt-UAzJDVhjBuO&=WnEIoK z?_WMGF>!cW6!gaxM$d0P{P_9U{~v4Hx4n$_Kh~bvmM-p}Y}+aBA8p%)JKua}+oR(C z$+lhM-oEV>+*fS=XxsC+|K`Jwp6?d#XSV%X+&>iedw%%+QmW(f76k*6G~Xsm4{d$v z`>}8BlHHbI8!<`x15(yosl}sk_u~IBy=Pm`c1en(SNz59(tRKb5fgt7DZ5f+q;gbP z+y`!yD4m{clV*#je{c!fq|=F#)IQ!OjsFK(C^;41vxj~Mo?f8xkN&19%hxLS*!Fu| z2rp`D6mL9Pwo;DXt^gQYdWW z$Hz$$pYB8t@r_gPI0=uei{EmMB!z8y25-a2*Y>!VR@E!3PkzLM@sd>fr?J@*pAT5P z2bUn9GC`7xi>vF^0^UWbxqwk!uOyVtPe#TIsG*q0BaPeXa*DFNE(*@Nnm)DS8Q`7# z>52HVg+9;1Bm+EKQ#hWFM4GaN&z5 z0tA|)jBE+?^_!+y2W}~Ke2z}zg>FGljRJX4;(@A@s*`^YWx_;;Vydn0UGcmUZ986KASD5MuhI(FDf zs9;5wjv|sG(|d@iuIg^ZsrB2`@A1EiF{oT!-K|b4eH^*?WK0Sg=AP20={3oERnl*+ zk7Q_jO+Arv>4}@f^+|E1jC$fT;`%JE%}%P%2DD3>!cIN|lsgc1mFCe1UW~4w!CIFO z4!j~0jmVbNk}b1wtAw!5mPmrB^IuKCAX$-FlR}?w1HE6RZ|M!e0=^D?AV%&r+S)W} z-Na~5?yyBBus|on$gi9Qu=SoN8(0H%e>B6*^_TZFF^kj4ihl4^5OIh3>R+Xvcq~RY zBDJK%Rg}9Wb(E>P_(LEE-GA?*!4;*imPIr%k*>z`XQyDABv`bRX!7>76_2a$IXpSw z5}iS%TQT3PkVu?u^bEHtw+Y8QQzy1~}LHtJS*!n$8vp9u z_!t?1)ZvLEb0w*v-J8&=i;_J@mg$Kp0I{?QoXA(7-Bbs{OHHNQsfo!+s1oC`sg%?K zTx^($Tt_o8Ph-3c9Vi`WgzmKiMVjjB=*mB*%JXE+m8R#({FB(59dD>5(XqWQ?Ll#SxfHi& zo~V8XHx`if>L>AF(8IHMXc6_=Kn0fF7Y^#xo5a`cgh^vOm{~vuGA)7a$r!yYftP?W znA0m}athiKmW)Ma&q*V&T@UnHE%??+^mc!fnVgF6MxYmcJYKX~b%XP{(CC)|p%_f6 zV;N>a7#(uGMHSzx)_iiQ*9yi|nJMPc_&RGI%}G&5YL6%*$`Z6!IY3CBr|O$-u5T*! zL&{mz5w$}_tlY(BR^Img)jw)ir)cZF4s`;{NyEb`P`idfUTeYbSXNRI9 z;vKD7_McnT0TxVo(FUX-$hhsQ>sr;7SfTiyjx4WPcg zM)|2i&vWeD;!S$IzDCyXcKP<|MQ#>2#md|D!1>Ca+~p6cEWl^{@S){*qK8@F^o)m; zu?wXA>Jr5C!@I{;=%*X^b!t3J*qDU-AAi?d70_^g$5 zOU??$IV5ES5^;-1qC-+gvaD9%t{t-J;vo`eC9wR{;rK;*eqUzb{JIR^-l6qc^|Aau zRLM%(dzvK7DrJOr$R35^U?p8!h!9$>_TR-xZEqI=R{3tQJMVyDR{h^%j8crc}kRwWeCh;MP_$ zWQF7KW(%hqQQo)}QR`n`h3JPoEo1K%$=9TcyQsVIhV zPZNoz9C))e<4T9gQoWg+fi%p)>9`3tZE>Ta%qVOx{`0k44`-49JV4jvR=Qrfhpsc~ z>6-Nht}7l-=HixkO5Coj6F288;x=W6xZUs)ZqGd7Y{!iSq^-xrUEbP;yAg10Jx%X| z<+M0c@l1?o3w_*r3Jq;>9>$drZ*d-vc2JA6J^B=u7d=ofwN#wOJ9UorZb=J$zOxta z4eb&Wte@UX?wF}dP zS3zKys+apP0H6(Md%Wx??(S@Ph58*maGC|YdVm{&)A}8Kn%S@XkmdIpxpqU&W#cOi zxe|g0L#}$SlEhB%N1%cH-d2-uR@bjh+K?A<)aIM)qIR)g-CMO+nHEU}MnFi4j3rQ4 zl?pswLrYAypFe}bA#e_U4hh;G7Ym%n0AqiJS{HCt&JuicmX`G(h$ksGmeQTidX8k0 z4B0h~&7c%^Fl-Y;%~Fn;+9e>lpf|F^{0daT0`APUZe^5JIeUk-@<~=QRjw~`^VLM{ z{7x!(g5BxjO_(qT_yUjz`k(`>ou5YmJjZhtiIKlSXoL7d%^A)Uki<)HAq@tqSt&Rz zum6%{oC|oakG7;tTMG%WvT|*b5CEg_AVk10JdhAj7qYzZAnO8FAXgt%t|i6p9&=?1 zzYFw>a@NRArs_7;PJRc{EPXt3y4&W3nw*`&Tqx~jwgR@&HMm;%20aZz-(2V}X>`$a zC3Q@>`BGsuQ3$JXmFq23Q}7^A_25CstGH!LX;H|tKq!5sm*mvV;xUO&y^3f@iiTG2 zZQ|p^Ly{QwY<`;Cvuj?O3w^LIO|IVSshW-9`onq~{UO==$0e zV!yW4!_NH{5=drWHX%vK5Rdi;WLV*OsD6cKWxeD$Aj;+&&!-`e z6uoU);n@(6|6DI!Qt6UGmu$KO>2e=kRvK?tpipH8UBPK-uKX!7I#%!M+Xm_c%B#ko z15o_udbO5Rts@m_t2=udu)dX)?-}bn?E~MV`1dq`A`k~P@wr-u&3aS6=xM+JlN6VZ zHpp6s+|$sDdX>~z3x0{O5+q`-thKnb4wv;^{aX~M#TOtz*}Z9Aq$PpWDGToj78H~Q zQwLJnhvR`rezwm4%1;ChI zW-R%mmnGh1E@ys znIl7?k?JU~;zRu|mgn-d@|_oGF<6>nu5_C#z2?d!J`Dh%@Rf)>XqIlTBgze7pbJAq zg$(OJ-$~z5U$@URk1PhG9L&HzWoKCf*0$$Ro5;2o8BOy{l#OEagJfapp3=XANCjr{ zY{({H8UwMAJ(%XYr@&OwlK8WNMa3q~7GgG8I*b*{g!{qgffpt_tJs4F{~XsUr+cDEDu*gi#20rEt zO2dNw51=Y*E7mTW%Gm0YYH`@KKJnxDAdD%p?_^|dC_EJ{{&#?5T}bU#MunpJUW(-# z*>AKXCVAN=U zwMsmvo{sz#jByKPL_TFikT;>AmM9v9^<5KIQYo`xPU#LyrO$d`nBXDQFIGEBvgypg zH?28EYe~`iQ&yeCBGdwVbN#ZVSZdFp?`Tl!1I;N#MxBH=pc*6^C5ob-r)Zzq)W|Yg z;!_tF7QCK8v;*5A1@I18f55%4Ah@Wwq;vXu;^GAb=$#@%u3iU#5RXjSq#ZK- zEvoFRkA%>+dmv%Gp-2|Setw@J8!M5IWo!Z_asD1PCo<8TZls+AneL`xu&@twH{4HA zE*Jt*Sj%HJtx5KmB&lz)g}sm63Kf6xGOR6|AG1L^#D~n}Qfh+g#?ym%LgG8f$XXv8 z9{F$JS1Mr{2BnJBsg>fpdb2e&wB90hN;tms4OC7m;aAXo7BM|A=?s=Afx;$+VW{*t zvX&m83q4`Ed67gPM5Y(b@dC)8;J{2;T4GLFgerkWsFYKwcDm3L##p_W5?(%h_p9dR`K`^#MZ zUeBXX(m;j?d-Nz6xg~#A56BG9qd!Gz$H$lrLnPYs;B4-t%bHk=ulWVc21y+e6EdDh z+rjIic_okb0!sF@5c~5~Z>HyF>zNi$p4UFHuTF#l*&!QcvL0`2kdfqAJ@TAq{RoH( zqs+C!bHZb6aP>4}87(QxJ+GZ{c(hmWyu$PFg7Ze%d1m5isaNZOKzuj{qVeH}GK{he z?E<|YTj9CY^R64RaRT1j>8+98NRB@IXL{|V*N0P$4H>I<8)fc}-$g<98fCr4om9*J z3>ydzflY5iVAJaWY*!=%Xbbv`vc7);XZaGi^fm-8y$-;YwF}-=qtAIB2F1Ka8Ctdh z6!S*7=d};NPTdc`iMmWSlxr{%+pUgLM%TvG#NVkk+q4#&l>~8pM2wOD!eD9Wu%Fwe zedI9Ho)X2z&(fYAeG+{X#Wab%14PpI)#jKrx#ohqwNGv8IZ@;)6k$hzD!yx<$=c`g zSLe3%0p--Gz%>JxS@_Sx{}TMi>a5Li)Z{vb;3nQL#mmZLrCrjNo)(%4is#M+cT=0J zSM{tlrB;oQ1{fcQL027;3%wFYlj}?ss0#^!O-|{ zL&K->%8IDYC&qUijdq%6A)1s+F&%{pdp8ZxA|#UhDn`zm-<)j!wE_TYrsfQJZy|U zmbBDnD5}(=R_#NFHQIA>?^JtYD(juG@i5Sy*T|QcemH$!0c*5M4XYhfGgg#p;C3v3 z0U10D94t>gSKQG7W<8YuGIAFbKxN~zIwgbmEF;cVw!1FU0SQz5y1<~k%eK& zt>?(vBeKg=y&I{<+%zNjU?fgogL7wkB7(tuoWVvvOl)=1=LK zTABF--A7ht0Ne7?piZOPU3HJr?T)%Cy3MZ4{8<#p&!a$Iv0FfP z;tn8J)}az*?NE; zK8V}}@<^#Qvt4R+$#2PbiRa{24JSTG&%&aYXB0(Tc^#eVb zU<7#yP$&kB5HF-B)+G8>kP_N$63CVUOOv-qn=D~+v40kItc|aU%c+getqJsd-l`AsThmbsO1p=A&aDmf!!LLR zEI?Iz)t$3b6?yhB^<@-~Z_Y8Li0y8&QPswitF;j{iDq!-*2YK9QR2%;gw+O&$)(?< zHOM+FIDsTn@*SOvkz&uyuJu%0Sfcb)T$rRz+ip|GiJBC5#Rl6X)sY)Xz`O5g)n3n& z0rLotB;=uLxjAl04v?%@&r;1wRzy*n>|dq5xj2-wNJE8wCuj?qAklE(lpbN z+fjz$XaSS}uwy!2fh_0@d>z_Etp9*2)OwmWWYwz#^D=K=oe8Fbe7>VSs@LDT`Z~|= z^1Tgb?5w%xu)m>foFR`0+k!lMEQSy`8h;WG7?$wA+AaSkfh+0ggFM-?9bJuvOv-e= zgeN71j{(8Z3B&j@jBk926Ir0_V_b8TTc$d?04){8N1Di2{!MebqyjUNwWKWNOcVI)_4nWfAmLd>Mx z*1GkkLRjZQ{6@E+2%49T*%O9WM2y!y{zJ+d=q+}%)sC(@s&0>rEaGq|67mc1skqn& zpANr+9;pG~bH4f@{qa%oARQR!D0J!s7FWdjBkmwiLUxEB7EfN=F0`MDlTm@0WL?Q3 z%A+MeV(}pS60D=~7dC^1h5U7xzgZjcgpew?hzDlVhkbR9~)X{i;VShWF(AuSTKrJ%R*N% zIedDs^cCJC(KK*tCi$Jzt7LIVByJkzuF+3BqMyFNNX4g)U&7y3T6a^n^eT-3ZlFZz zF?yv&^YwT&XAn5vKtp>573aICY;n^TN(a`%c?dwnP-^N}gGX!BfYlVzoJeoh>K#Qs z6T&`Ib&osQb8K>(G9F4(pbxZ2V6CwR^`Skv{)_7AK|Urd<&m+%(=}pHoKdCJc-5_* zCUGV#u-nN3d)r@y1s0(X{_BZ|FsEW7icuf6rt(pO<6IK4(CEgX@}kfJDn#bo8Ul9q zG=QD0$f`#>B~SIgp&-0Xuh!x9F`MtCUed?n7*XJQmL+7}A;`onZ{V}PMH%VqJ$48K zWf1F9jxUknTCYt_C_Rs7egIanf#{34Ot=_J?}d%2bRI5IDwi&yghiCFO^_XW3Nj`( zI|(Zr+y%|JUKW5My!dENA~1&CTtskG!=PY|e_wrNxr^-V@D@i0ht`>*m3!f#=RZdg zu*_j3jQ8QW*a*0Zg_Cz6zuzD?L8lQg!*+WpAvv3RiCU2t0Havnq>3;X>cJI zrfmfz+5qb!qdDsWjbn6#a3)Ri(kV|IOeHTKitALIx{g!VU4IGaDMLX|CrJOlKu;5( z#b^ZSSpz5!9xoNK3|f{sfogP#z^(!-Wb0*L8!L19dVO8T4jnsqY`?!BrYzK&ey)yu zs15ygf7cr5MaJxmYS@^=smuKRtF8>oMTOj)Nm3m`f~z1N9P4DR+^eRAWk^DN|6t(z z!Xe*1RTThl$iHXrqNp+bRSTc;K6VJ>gEgnOKo~(1`FqA4?KwL6uri93p9fRdGmSfC zvAjc8DB0OE2>IC;rdg=R^E0@!l3td;hUqpV7y8X{N=XReeU8jq#0xo8@#=yIcUZDJ zI`|NoRLI^f(n~s-gUv!S#gcP3&}7L%YU~TKnMAD(vhNGummt$2A|^3ntsg5_vC3OW zYZ6`Ug~b6Bx|hZK1AWRDzD8J{kF~N^eJt2sC-vUNlAmM()$yM?-a0GoWz}oIf0>BIFe?AU?(AWEAdRO32yH(P28CoU9E2L~M+|+#7Dxliv=Bd8Nk!egC9ouRY9ryHUt;soBUo-VTX+x2ItG# zxtM#egX@?x*5T3Dty@XkMG`SrU3}pGE)oul1WM)`k$}OZ&!9A_Ptck)Ap{SyxGqnF zOHD3%`#vnL!ET2m1oU2%DAsSY^uW@Zzd&Jd;lk$$Hf)tAx3w}#%Tj=hgdo}uzva3f zlD%AHkBOChFBG^+w6n*Y+(5Oz(B9Y8r=*cs6msq75H!T(`EroVT7>^699vk$e5(NV zbmSYxA4VQMF5=`XL}szNfp#^Oc;3%XnkIk9i4rR*^HoAu8;Ey}V7Z??B=%6Os4e{k z&|P4Lpf>nr9}l7W;@EIn=n8?ELr(es98u}fFi`2!MKaqm+4>B z%D2HO3ysGq>{`n(8WU=U^M9r6lOl(F-H~JbA_xN&!4)3EXJB9ycRRB|e7iE~k~o%l z`2E7R(qsgx!DI0Wq&SoSJjrnCT8Ni)oQ~E6aS;aUqU5?!cP#T0f=A0 zmwySwygYPL3iuS}pH1~tUZDA>#24^);*m2Zn@7=@{JLZoV)+XKNmXs9s-9|#A^)>j zRj>sR`lPo*HV%Yk|Bv`@jsYztpxFaJvtmGruybUB%4~rAN83LO`3?a&D(aJ?cL ze21Qwg2xsq8@e(c^cosycqk4#Te9I^8LrTM<#kPyvK)d?&4_gp*xh zP8D~0nXB>wA*>89;8T$Ssm12X*?he9Y_81UBV&)#d0gyq7QaZ`2`bsjsk|%pcs>7X z>@l0a7kiw?4@Dn$+=q7Z2E1u|(gqvk{3bz2VYSrML0L(mS{6x2R`v$@fk9a*M8Nv_ zk}}mSo6pZcWo9|^i~T~>DM?u*?UY1qEds5v^zXYGgur;xbLKC_)J4jVD22E?Y#Np; znRRUmqQ}T>KR(EhVeQL$VdqHD;Ko=B>-xorA~L|%!O!C>;B=JUkLJM-tbr3*79Mr1 zh%6vT{2+1_@;&%g9H}odXNbgCMNxI+V7A{Nr6}@FDGBK!PQk;FspKssL&yiPa8M{h z&j;ho$rqJ4VaI9WWe~sz1Uex?I3>s@0g70r#gpo?HuBH_vbmy0WqAzQ6EsMLfk{mc zMzNZVJRuP(RveiPfh|xSAquLVSf>7TWQx2i5DoFqMTj*2E1&^UuqYXFq=}zG6bl&q zKOpNmfcVE`-Hfk8$$C9uDhy{s$+`x)3i*%lZ3tPvCyEXwYY-`eWSwJSJJZ7UGO}7k zE&WY4)PyD1AXFJEx)| zp}YD11l1c;(=4*g2>xSGmcl`!x?Nxt8=hUohsKY=7G1LB7C>Neyws_COH zqBZsEc6v5W(eoC99}QjK zLv*mnF#RaVfOU-T&&&85#|L;A_{&xa8e~-O3h_UnRt$-2*^VWkC`Q=?Q%y0|Bm^#4 zVG4s52`HqHhxi=xwIG{s20?@3kNn4?feuiD_VJPE$^$WL=q8|#(oL6WFivPN*zEPz zSVX{v5U?@XGE!hZ4hiFp>Z4FzeD!|!pGez;D_iTmVbxh<&fm1&k!uhF1yh4jIS+M& zM-=;8$JI}6(CV>ygUNq-9Qg;DDnh98T?M*}{|1?hVGE}uJp--czXgdg2;=G&VVpH- z^+`?q-(yMlT1nnP-57LohueKe7xi@e1MXGRJ-;IrR2`cWN#ft>5)@4h@%J!r$%T;| z3cJi1i=Yde$xnmVAnDymBL5|jXp!7NVbBgQWXugvIbke{mUu>#P*Xx2#$5!`Sll$o zKL)*^5Ci$B@NxSCt}<(JgAFWgv35h5E&^`fVk*LC_#2pGK2u-s($~B7_1=yus@|-) zO~S?j)t$NCttN(T$oDDofgWL){Cs;?=&s1oqN1=F3d10k#CM^0F>~;JObnZ+2^-#u zE0ZGA5pL|yb(gt=>=1v}f|P2mahq#g129&_U?^|o>ABcLMTS*NTP4v0jK^CT4=0RI z!qKQNb?Zx!v11G2d~!wRRcb2Xywt6Z6gYngF-X4dN_+?2H7OA?iNbguf}KB!uM;(< z4#oN-jQ(Oi%ECIIqNE4VepvuhXBHL?ATFTX@^vV**`!#=PP9EP)*8h4iRNGd;e`z| zXiX>n15^g3IktodxV6ry6atpS8NgVJhCLX09j`;10U-)~CyVqHb`i$k{d#$uo_|U& zX~ziqEBC021UqfKaIj6fUw1qHl@Kv3ir*7A|j#=f0>qus_D3{5DqJ#_~_W;8N0;-okp=VU%z9(hg(BT(V{y)EAx~ z*WGhsa+h)=YhlNjOSo9NVh)=8F6@Hnb-W8N%3M@~opgU;3(o_X?M7}%V%PIE155oqC zruG)`=~Q^xVhHQKO*H%px$|OdO;!L#W)#F+Qy6dF^nI*lPS0V4{rOwV;==Alh}$a+ z8Ov;rcge$3i=sl8FqKh77(wvm{5CVzAT+iw{R2b34g8`o$p3ZV!%S9^gy8ooaCFRd z;rVcf_%8{T+E*M&V2D%9U_II$vRuTgkX#IG7e}gmW)c1IdrA8dgSWDi!Z!y6tynpE zv7Rh<>0&z;cB@UUwava!89RH4GJ5u{il+b}m%s#Lk@l{A%tW?YTTS(g7~ivRRa1>z zo4-{VeGmDmiuh@3K6ISGSgjR#d?x{JIKaitzO}YVwePT{AM)&~pQCT4&0Rfh`exee z6&hEsZ(fOq$ql;L3Z_@r;7#AW7T221>u}|p027)36$=*ehtM$?a)$8|-h0}{)uV3; zuxb=L$O<7zp9iPKsO%>Rxbt~rBK+oA_^~z-4#27@9s3i~T@4rPx>1EUee>hux=CDV z!5UD&cJ#{h(m*cl+k{)ykZXhdnVZC5i;R!L9u)~A|6UAWJXRNXzL%ux-070Jm z&lbn*uEF)U<1=s{(c#h*= z;Q;9 zK9FeLh`SK2Al_1Mg zfbyUPB_>}N3v~g66@x*hZsm6(OL$VT?qUtGu3n1X^d2Uy^ZUP}LFmDS#0UdkZ5wIrl5QNw4GRgnTFVBp zglHBDKjI>gj_Llnb)&p^qk4jT73m&A_s3Kg`Z`bCOY;P#8%|c1_nMIbR)Gxu4s7KE zjvAn%x?}3KJ;$Fo<1fS`n^9nrDXBT~L zqt6(Sds4|H41sxxQ+j;BOC2nHCf@^?hU{GHZ0q2|I1#)CC!L~MaREv{d zfi`sPSI}vZ>$TpmE=}G+$;n!8A7Zit=LZY0Y}e(SCaRrLBuc1A>_G9E#_AL}8-KYU zUHlW^tN#SM+T8l<<1vB+WsRS>UwrXJVJT0)SS!y&zz-RD|86j%=4*sot(;k7n?td$ ze@E0oR6nfjOo35vP{fKbhN8;#GVw%Dl^f-ZY7RaZG|OZ&xlW8oPt|!e)pzo30?V3e zs+@EvM7F3%N>kA!e$^;Yy;s|BQq0jb z82(=sT69_7xoxZ$dfIvI8i~J5T?0Fi|C~CG{}=o^mY0{EE8<=_@rsv`(zUlq99H1u zPr&&Bj)K{T>6P+rH5o6JYlV>$EBcjr{1hM*x5NXegn+$(7n)sO9?;xEuHkB7byv4V zLnh$0avFgoXu>cAl8S5DGs&(AE8i9<98{~PY86SlKoXO-lG(rG`*wJoA`%kpq5r-CDFWBXSX=X6-Izt zoW!SUeDp*Nt>R|je|sm`IOV`74u8c*VmyPxHan>_j=E?P-}n-6k|1}X-L%z_q@vcD zdg)wrqdyTUO3HH^!X`acJJ1C_6McYX$?43eH%-Sb<*IXNz#OeU14&t3cwTj;@*)=# z_z2!SyPF_PUW!iLw~PrM|=Pomb29Mne< zFNLwmuc(40896CXZ-%!}!>}@zwQ_E^K&h`)lz)aYpD7b9CGuOIT}M2-T#-1MDe@fu zzOrtu-cG@&9~e2`dbJ-2Rk&Q)#IJfVgZbT90APG=B)kyPliRTZ6w1sZ7VD|rf!uIS zbo?IoA&68$Pyvw#0;e-@po>xQEa-y0zNmz?Dl=;5fXOK7o?Rn}4UMh*k{H+O(Y24& zAe(F6m@DRbcFnQ*510KF45=bhQV(L+eJ<=c0HK-ks=7k7uqDTZQWD<*6$WTo_%T$r zz#Wb=Ha!VY%T_SEagTikT<3S%5g4z2-mw#1AL8lMq_MyvE#}8N#NrQR=gC5~Ddn0GW^g`W2*#|2%R+;{0Z2xRjYykeaOANl4AJkhJ|&B8wFC4aTY!kEqpu{KBEE718@nzr1HZJXfr}w_p;O7iwzNNhKaV>HxF82lT%b?|R@pD5T*oL{Q-hL`hE!VIRPc z?JJlK19b)V@cljg;E@YP(p~T!;=B6cQe&=tSJ>LK^3gy7v&4essd@xiEKurXk@eq1R)Wnr9z|Aq^HeQB zRuO;tb^GhAK%vAoq2`wZF71h-v$s!J5Ly8AlNUSu&@j4tZaYa$^O_f!!phy4MeCPBOZ zu;$G9z&uqyLtdaE!0AhBWI+p};|5~^_U_~e z8`jyd&B(C_36)J9K*b7E&cP&xP7&f8KM>>qgIWaPi1?y_YYq;zdMhBz8Iv1oim}q? zzk_3j`cWOhX8{PblopAW3nBgsycS1B@QJubhrxcch(Ainv=?{4VugUHr~#;eOg&&| zP8etr-n^H!WO|fgv{OKX^ymq}@<$=qAE7`L+ZD_M=XJ1efUPTiADTADhNkuL zoyd$euk7b8!f%gTo9&mBY357{cAW0#zj{B`%n1lrCUEMm#o%J^p&VJNI!JBd$B--L zVAzTSiVld8VTB{Bh_lW@reZ;5OR!_6F%h#4gC>PmUk6PERv*ZA<64q(bRH7+IM&Jz zgq)9quo?@KsIZ5=o8E)iv7YyZ!dB8G-XdQJc2?5yG_+JK@UiU}!g0v91S)K9=pxTGb--8sT;Dc}@fA5?f& zIGZ~`UGT4yu+m~&K~S=Dk#8Ft>Fh**mof*z;;F2wP;9q0a@&J^ErK+(yL-)wA0+nb z6O0YB^koO|p(Xb)&Sf0loO^t@zU)NJviER`%wCvGmlbjeH3%DIlxJBCOPNw={3q3d z$a()cWkj^yTFWfNZGREs`=AfP(h5UB*jwtF1b*@IZqr1#v6KobPvp1adw3WL-PL4o z{+dE5)LR@Mw;pU&D6suoR>DWDm$zpITJOKVLl-ae6p`Ty-P{L zUO||`u#J6mFnm6O4PAeaID+ABGx;zEOB8}OA4Q?rjNyNWLee5ZC71X+c+^r!_ZuP@ z^Ih77el?lDW_{#;8pt2Hqk8Y!Yy61<&j~Qee0Y09Z`=cWfn_x{zI&bvSjMq=t`s=n z{v}$zdZ0Xi^JCOUv3fY51^Fd)c#Bg!WRtNfrmp81fjZDJ4al$1%0Gpe_;($P|eF`sdV>}Uq>siUFc?^6b)M+AVt?0qq(H)xh(?$fL!(R(@It?Gd+ogw zJMlHqr*ji%ICDbxMVb!BWHXV9rV0-oE3(E{)KofrN^Jr zk7N5u4thY4rHlN;5(-^#&yY9ssFBjk!(c>!dxP%^mARh0d$0c~w_Dqe@rhuoO zgit|TBu?ze@52G6k+B$z*!o(`Vw*LH4qAWv8pNwxu>rRoj>QJNH5@}5gB`H}1D^gN zu>l)CAg+5^Y(VGup_U0UOBng5`M02bvy$=Hvl_?XD_sQh0nT>~q!uAV686iI`&s@I zS|9}rc^~XA6!Q`|Px^Be5{)FuxXYz4?DZd^$O&aemLwy_ax}kb5t?%z4DqU#xB~|u z<3=NF4&;KGhs0qmaew&>#C)@hbZR^6LE26Cz(D#hyO0OUs%29n3u29^GYyUPVr57> zR^4WD8!;~Iy_*6QiYv;y$kBt9{7neAqI>!5-$gO?=d33JCYD9vdc4a^p(OX%++wvlXsK=Z*YF*%pBoOO6xO8Rm!+bHmX zUP!N?XdJLNcTovGiFhG$R9MAhIZpp&AV&aHUi<}GjRhlh{)Oi!i{0MwCm1IdC*heqL1{g2}ewk-5&te z9U*R~^r&zoHHf10l`)kUGCs(Ly%CYwu!vUf00PT1J>c*yfS2{Sbx%+NHzmFu{$r^O@KKR4rm)p*76}PsxGSFBLgbsu=SBPgWWKh+EfuRDRhl9y^t~cZ0c*t(#9@<(t5o?6djwX}g`TkR zA$vRqSySoblvqU)LYg_C6d7!qBR!%Spn74EF}}K$uy<^-w#Z;pHQVPqjA*-K`~2?+du0Lml8h6o z?~L+W-h=L-#lLbT*en|IV6;)R+2--L@a-`ND!D=kl5i@{UBIae#}4_#j?%~cV!usn zc9r%Kk$dSvPvPW?A%1W$;+N5VKqqiQ#1xz#5p}1BcpMNB@v=h>ZK5-Z zvtyom-v3oJ$2F!pl}<@YGu70gW;hZQv{^HHZqnu7gmF{En4_Ji&`#8y7Io#9K2K;r zLl2`QgNh3n;zX)A&IPHg+Hs~7k#vwSK){8zn^W!^ zgs_Jo2r#Lq&~>BuuP=r0zn)4(Tl_>@L@<=-$p52ma%0Y+o7ycp$GVA61EUbYLDNfH z6%m_)$Kt#(Fhw-*)gTrrbu=G*NBynQ9aQ7?Y9GF@HB6eTXTT)oKcaRIED^-Xnb(Bg zqWO<-3oM{+GwBF>Yd5WSHB=X@D+r$2zLbvDw3-XHhaMg`5Zviq?crbi_nJ1h0W~4-q*GTsFuO6A+W5|A}ctQTXmj(Y2W;WUndm5Ce zuHQ;gp>(K;Hie#O1DU|X;$mPAN&(DOSE0HQY=3mX9)oQP;d(ByAsrWGn!iW6T5Imp z)+1hKw8)K3Q-k@7wa*X?Bg0nx7n}-@c&bY@b$BRT%2fzY>4UwQ$_*UxOy&GIB>glU zcQ>eEZCwIPWAx&ah|z*;Dq}C16~uyIGt8!?s3p`&CqbyWe{Bgh2mu#dB33v<^yn7w zHQx+^eeB?6=9RCTZb*(vJdr?h1@4+#a-UR2kmx6F1SV4k?mRs8LcAS2FSe&8z2^7?@Yq9^_h7@I{kz*3(lSG@YrK_47 zNz(cg5SY>Lfr+R;Y5gr)|CkLog*b%+z~hFoejDF#2y+(4$+X9ImzF@Bn=`S!fixJh z1dQTuAB|aR><2Ya+KofZ50U(`!SjW+&^_SaDKp+A*f&k*~t%ufzc%fG6^4~s( za$*MjE8O+g41gRhgDD%cVlgdP=*K*6MidwMe@9p`I_^zJ_;wo|lz~iimMI;>sl+3c z$3#doOe~tqjJ19g5${rK4oM5K?d&G1vnhOiDJNX68o*^7xfn$6&LCscmX){|<2NGU zT33&Q40qEB9qs1KAb%Cm1%@+Ok&E4pb5abP%3i)l447#Qa0)YG z5B}SNM*b)KOOmnWZt(TUZ~qxw50N{;n%Qvr(+@ddo{67zph?#*HcFkwlnZ0za7@N7 zaTo<{AZy2eXOJhO+eys8OQbsBHX59jV15%=o_iCHGvkS%>!<<_7ZbVCF>Z%p`kNB{ z1jvBcL5HO|X2VR^9dIE-PryZ5sr3UOluu953kY|pkTHXF$OgHbMu3>S|NF$?I+$O|v1FyL7SBttP##wrL zOaPLra9GINUl6%5#5d5i#;l%*VSsW8)SeJ8LIpwoA)H-e%9Hb)cA^unxAEVgD{y2B z^>Qfez?LvIUTndS#QB@c<5}}o`a*uA-yS4a&{i4~{34#o8D#AmR@1|BNS{F&dDW0y z|9xpL+V8Nm2?o`-wqxZUwhnzYa#Dl*i|(jplfBdMWt={}jwq&rgwMk?hVi z$cNFf=rW<$k|S)NTJx-2cxq-sGx*&yNH0)7#IFGn`0guVcS*0!jl&Vkx7`rI9D2}$lT11ye(l~PJTz3 zfS0dT^-_pgE7w~9PQpDYk0{hgFiBg3G zfu^-)moz12i)S%rv`+6Y-!1Q5fqCHBjidT(4Ij$eW%$+iy0*LMCU5uB&AvUAZno`q zC9ZNWVOJRP?CyG<>|E?b(c9F>$;Xtd5gdYsq3$omEO7gesiTk|O^6InI256>XkXSW6lxPG&vw>03-HsTE`qzjI)s0p?(CTsgeGeuX_AH#8+>+4cKkKR5js}MKY}8r2 z0?Wg9f7FLY^q~=bz)3q}YdB*y;-J-tgH|IB+C?J{T8%hJjqvO~%=S&*uUrRO5#Hl* zr`hZF?^nlE9u#sv=FJlAAkh@xL<}pQe;WX5+-7$8J)3=qN`B~UP&UHKvP{NnWe$lFoBf%2yBr@UwZ<;4J^yl4kI zG`ZYG8zvGC`CC0zWUj^T6RbmofBU6z#5vH4^W+u(XIlaE(XrpulD9=m-uZ@>h@t+q zmRRlhXPVLKYfd=$0%(q37NP+rRj>wFJex1ESkXC`vi6aUHPQ@?)Aq@p-FT!~(CVT& zio2I)DDF7fQ%p@f+C%KfTSVsQ=s%%MMh{RAjq$&OUN}LN#q=P`VoVWbF~r!B%8x*2 z3^8OzZZ$5UC4z~*Y$-vOMfZYC1Inb>uz|27PZe2SaMUz;#zx?=;&zDw4PjKZ0!_tM zuMRuDkUfFok=}Tl)QR(zYh5D9XJTo^+&Ksufv(RL^k8&F?a^NZT{^bnqSevFBCx`Y z7w6d(k6}ZiNmmykmy=+^5t$(S!?i&2I5KiHFs-7J46ibQ? zX9)8Tkf|N{#GbPRWL%YjBl#rw@XO?gFIL9aO{IWs4vt($%%qDaqMTJ|1i!wOR8k6r zz=osC1AgK4j(D{x)Hq3-Qbjii#aIXpSsGxwCTj$LL1@CUP%1K$ksF3gZ^~FSd1y3d zJkP))WN?dKEHgzVenaN)J3}*zUV&d#Z5hy{Uv5Tg#Mvd;-c8mC@`C>&f*3tE=o=un z4R!#bI+wnaGjV=Rl8tc)pn=ncZVDYb;AW%tig9Qy}73cn=)OV$95r$|Db2%H5jEv(oFrSE|kOa z?F+qHMrQxnH8%!BgDX>Q4~E|Q;W!Xee1@he?o2>-^!U$~9ns%BPauw9x#Ul8z zoYr}=wQjF*kB#jl;I(tjnt5YTTg_c2j*h_ABhhRN7!!m@Kg0w^7V1FsvHMW4;}J~2 zBb@E`{I10Uj}wB5Li(GXs5!RiW;=;;0%0biqu1x_I|()YO==^~V9R2g1*$#lO+qK) z5N9USmbKd9HTIejIfT?_OhApICSY3N%$(Oi` zWNs9m=r=(>N0qwtuo2g!_BDRyj4%Bb8i|tQu(+z>#2W1oRiw*+^ zzli!byc^9XvM{Sx1x)|@tL};t_?VKOevY-(BDxd=9wUZYbf877A{H7^P=eV0i=JwV z9bx?)XK?dhSUub7ivj%7Tcda#Dw|kTFr<|Nl_Ato{yQ=+HfU%{N9j9I{vg`*KbMap zDG+1(tTCE?5FIT>v%g_omNm$*Lm-72G~e}kMwR}C;RbQ%=prRLmjn~>pItrAVlN%N z@U{5AKrz84bfvmVf3lj2Wn;@bwO>p=jDbW%O^d=EZ=;CyXcdC>!OH8YDWgw-!5$Yd zqILX~Qpq9-CJXLHF^v?odliDiu0o8hat;4>Bi0h)c;2c8+=w_=loFYd9v9 zEp!u)un)%(h+3n~^P-#W>~N_eecC7xvQ6NYZB8QGCkaw-S7dIAQ)}If^0i_aTOgevc_+ zYL7tW8Gl#iLf4w%o?Ujt>s%pYpKEh^BRiqB+tLr;^))ft7{jrkU{D^BUo-{Ir1eRp zRq%hqQn=XPTx_hgQ5+89b74qIfV{)rqO~r)JdNb}R66wudVtVFqVDS=o`u65*kN*D zFYK*8>Zu}ky&;b>@?8FgOTE{tGohTEg6z7g1?QkcbAqq6v>l}>h9BN*hwxrES>9_O zgq)`eij;IuAypW*74f66UYqlUL(b< z8gbeP1xh7->W?G}yF5?4fV*#RK>>oH)$s#`e-$fS&G5aW3Kv7ZWw0SP`WxYce|Z*a zCcEr?E%C8dJof>r6~V#ZZiyGIXmODR8o6#IqJ{Bmk~r2jhUG1&h|Cd$J)#2CTZ2Ia zufy5GA4CgDe@n%Xt`%_)Czx?vP6!H z(TLR_^dcHLn|5N9t5c!leWNc2QKC@(aZb(Uqh@atzZ#2V-(DQiZ2btR*oYB5nJTWN zqXH(Up*ol~?qfO_5J2s)nA6~L0|%I*XgTle?l3@BOAn35T&q5+j^$I{8kid;Z<;3F z%ngxJaq~BqjpEM1?^*aB$;Xj>>{rhN5V*!@1Cb3u1oPv0V zxY2ZM#Qqr~oJgU@%LK z-D8cpZ_~~zht`>_$#Bp*fW`YEAa^W_1{RlTO-Fa%j-sAY$KM|5%K6|1ZEu zx{maR7n;-mo+sgS47B7i^oMAPGWrpxv6Qr^^)~;-^@quD70=|q&qu~Vc;dVaxH?^Y zGYVoovDTY)8qik{!|5MWKNnjMfVwqMi8&_ov^Qcs!k4^`%1EIG0F1Bbfg2q3i57_l zKPM0=uRBF!J}t^fhZXT}15hzm4gKw9Q}{uE8VJ}y_&+avNzA)5A%5(Pz)U$wKLi!4 zq!X23TDC=w!hPYI3_H=;$1w%OhN}SiFIwPq5<#irkg-|9h;^9-%L<^JSj1N$LZBFm zW0wG`Ude9&HnEdJu($Xof!r|AMVz(pPaWCZyU6;Sy)aYbE?`)&WwBMWj{G|{0LOvjEIa&i=_@E>MgKY)YL;Y7qhg=2@@J48g$-jJ z=7%15+*hxaACL>+MA0`>Qnp@F0ej3TBk(x-qb|tbPY|39mQhcYgA6|lv0nGQRYSPW zfmg-9&-288qPf@syIG;hdO^mS3wSULdezGh&_TBa7R&<{%-SI^e@CQJkKgU+k8G&D z*LFj9qpVz23wl(1bg?GTSsPyy_!~$Rw%6bznb{+EP};|QV;k*^%Kvyp=J>qw>v4z# z2q*gKCP1V^I_p4`d>p<5iU{ljR8#qZND9QcXj;aQk5lmxTi3Bm@^mgZCE8zye#ag= zwT2h&Cm^YSPjb8;eTEV9YysMG8d;w-lh=uP=Bav*x>Mbeu0G8I2OK>ZM45qSJ&!`& zfP3i3aCJJ)CMtw+@vsqi7TXXlZat*@e;}h){;bXO=r8bO26p5CgufhPPbbLvRULGq zLiN%0Q}8QufmfJYjJR6a?>NZRQ;z+2)XcjHyHDHv@2zWR>PwCoxRHA`&MqK_5xZ8yj{kw02dFnVD7tddrW&U+&k zorhiW>UN50>Gl12+qP}s#=N+8z$s~k!TIVDw2wWEWO)sEF$oa@-MjjB&+Z9@{BGKdkBb;~Qo9zzS-@FR8C@&LL`S-2bJU~GQbsK)VgZ4mgs~PCC zIxjWt;c5S;P3sa(i>L!ln&R0_`{cCV;W!-h4wpTgxNL=fo7RjCnmDf;llDur@0}*3OoAN%l{of+@flVZzR14xAHfNzG*@?0l2IMR&Q!#GO!VybVDxGihO5KEiQieF zd$HXXr)c47ub$|us^-Xs zVP1g6O1&}z6f!!IlHLTqB>LTfEygrGsTq&ChYS zGy#wH7!l?DhKq6Z3smHF)AQSzym@fn#}7mN^Z{rW2x`;IPYc(u^_k_j3zY$?+W*(y zy8u*GrTzb#o1&tSsgajDDLPnU=gQ@9IR}vI)XlhwuITMr=PSza4ipo)HOn#qdud}&0HTC~p-uM6i{okXD?|Rnt zS!+M*_N=wnUeT3@?^cyM=Nb9H)6gWrv5H0-2XDB6a%CYUufVciDSfLu)Tjjv6-+5-1 z?;yLMq`+IZ+=ivb4YH|P6+nl0UHA+2@=nP_IsS1uf5PwC-Yc??T-)lp6O(U^wLRTU ze@v!rkJe-cL~gpXkv?sa_S@geZag74`pqjcsz>tnGlr1HP2R>$cb;Of;D|aakpj+o zBgI!Q3Yo`CV3+weGa2*0WK@B5y}5NaQ^G9YB#7CqJFv?tjFL?4=<)K9n|gE&_l)vQ z*Q2x5t@&(Nc{Hu%#JMK@v>ZQTe9~n(Lu9#T4gQ>}UBpu3u!tWgPS~Md?`=VHQTuyl z>pQwN!MovaN{w4~yk!S}n19!Ix6jG6S3eyQ)R}(D2;9B<+ZAqt@UBzUQMI z64)|l639Jdy$C(CZR=1G;>41ektxiA~fI@_H3w?Wp#vtZ}rD{JD} zKbM!*YvmlMT(@04R*zU+5c;A-Yh#E0#r5p}V86I}^d;Q%<~z^7^SAI9)6e_+^Xb!N z)0PbnI5~H$aLm;6W75M42OKV3KeeN2Nk@;6QX!|qWCyPQJ26|sQ?++)JO7aE)kQq? zUW;;RzU|CI5NGQmB+L%Nh>L9E^=ta1$@lJO&5ckdPoJhX@i16;2&Q^ur0YY%L?2SM z1G!B0Z%%aldkI##K)){C_O{*+)*Za&bD%?+#Ky=bm=3e0KaBXaSnf#|}xhpy|g zDsC0zih7z`1Z&eQ-*_fLq8N*){wjFcaC-7Jj3&IIAM)JSfWDXH31R?JS7@PyoIYKa z&iXOKuo_qRTIoH|s?u|!9xIx~BF$IC6C@X=y&ZHkhvXI@l|!dzE=&8HXpH_`uHnmL zOKodfWiRqZt__^pQRnN=>q0D`25OCb15_XE**iTU_CY~kG4#u3$W}B8*LXvZU09#k z##j;dYjDO;At;^H zOmBv+X}!$%)^EE;fN-q(I|OYh)$+mf_g{dw)d}8+r9*tXyMy_DgHUj5{k+>+Z=xsZ zsn((Z((4;XE%}s#U;i-NSJs`t6C|MLqxbltltD3dnQv-$hZL8=;BJ|IMtzLSW z@9OR#3%Y{jp#2l|FP%3VzNdY!JSsxlUbAis+%O2T`n#U*K7>CL7P=uQjW-IpqCKMK z*fkC4lR1WlsL2a4O;vYx$cr+3;oi8bO?`q`DYho`T)Kzq`d|)l$%9TmUXwnO^(Q4A zB1a0(-W9>u#435Nyu!d0jI-PN$(j9)R|krG^5v_$2BKk`A^zMvhvz@>l#2{%(xVty zP$M_W6;>SCib7lv=J0z&v=hGwU)#dajG%_!TP^i`Az*ddrl~%;qGGRqIfv?=dCXmQ zxk#mAoNx)S`fyzGf6fex>&gd}oQe`otm*gB?&F9E+1g^_~2lTv?5m#?D^_SMt)>-0qjg zK4Vlp=mdjaB$i1LZzIjIWo>4Woo#K)V@rFgE%RcU_*H50d1>rf< z*G4I4>vlfRB6ene{T2nbmLMD4pi^*|aUbclz3SU{N7wwnTUq`7BhqznXFAGi(?xF` zWcenu?q=5gEgkiAW9|7RTTV=1XLGdr65lIN7$Yr8rMKFq>J6$xu78y-x^w7xUCg}U zYEr~!>j*!)?M$AA16(^ z+?zS>H;cmg=N}0(eM>o@Fq6;3-+E47t(y6s%+N;DX~DrgwJY>*{9Rgo*GTIG^C9$&>%RWa^(uAChC-eQkrxMeczEI6!4BPPzdt?o7q`ZHHXQSeIQJfni`(MAq`wJWbRnm8vNYn_!i4Mk zc=I<5NLx4cleI^d4`n|lB>b7W^~}!rVC4O^t)mFGp)RT=sn#33JFsmy_V%O}>_KgV zuy-W2hu`x#-0u!vm;NbQutk08ZFxN>{F(GmHZ1x0&A)A!`stK04Q*pLObf0VwxMoA zX`cy!NrB-%{xgxPzDA3*2aB^cym}WH{tOqRw=mC4NN=g^qaT{(i%sk&_{OLE+AiNP zCap8wx8XokZBmtYb@(#}M4S4zJ_8!`7`}@4YHn*utgno`ddVpYQONvK5*&u5PirWZ z&cP!F_KHxhKY5RNMzUOk5}_?~5cp7fdld{EN-+}k7G81p8T$}Ysh4tb8o-An@zjwAK5U&>b|c?g=vT78;X;oPWTK5iU5wrVw> z0;#%^Q%2!UNl}G0!BK_PEvpNwJ63PXj|%mMw1$Y#pAKst66L!)44Gz~EsdalQ+8Ca zF9w&JA0nbBQ$CekxF#uTHQL&yn8TN(YENof`)bcTK&$emHl1!d()3w%@@8Qo{GLo= zZW_3oiQ)5{ebQQQfL0+dYdiiVD{9R~UD=Eiqosz`P(&t7XA?c0hb zv~7e6dQb&@LBd=uVHm|Y>F3X@g^)e+@->my9Qo>|&dS=a21yCOcb#yD3K810FT(Gl z0t>^Vhc-|O@Gz#MFubzCUKoB?ZDDwJNW1RwRYPI;n=d~pPtcQ@+zB(Q?ko)d;^ky3 ze5@Y8=iW1;f}2UJzA$`Z=N(bcpJuX0@47xaDy-&s_5LAPLNUSXc?PqILnomJH#qp> zWpZvT4BubZCs`(ntHvf-hmY>tob6)17~>=;M5USzzFY z&O_MhvAyJM@eYtpt7En!&K6HU_8~euD+13o)zsZOZ@&7#=OV7l2rA-Xxr;*KsdK1y zj1Su7#=~CCKml2K4e%W!rlL{0f7wYFQ2(gz%b{a5)EBs~pmS(EgMxp>*JCQ!>5zaV zjIV4ldt=m~QQgtUJKFaQ3HvJf!`LWei>xhrMPO4=e~)yh^t2CF(4W$6()qIjDQAdP z2l4fNC9|%nFmyD21+dz&88FlL24$po<;I{-w;N;I_uoO%UkDf@`58T~ei4=IAPx1^ zkYF_`ln1&JZp-`Mu#?o6T4@{Mi}9x(-<7(r{FnN$VkmRpz=c@U3pC<7*#NatR%XfxtE7^UMN6C=z zjCxdDC*r$7e7Gd!@A`oLmNB5eH2IQfCYm1ZsIK<(lNWPFnlJ7 z<+Kp-fHt<0)(telrvC!+VK$*uYF zYodq$_yw3+(|UnEA?W4L!>|4f=FZlg>>pJ396Rj#5p`b8)xswq6FyrMKXfF~L)&%x zY!}AROG}oF~pXuV?h6SF~L?w6RJzRe+r2~_`lD^=5W6H)cRpNG$b%fSO{ z@q1pLZW~W=@W9=A&a>;DM+e&3dKr`A>bd~xnrvCM^S9Dj7(VL=v5!2@I+VV9B!$R~ z>gvJ8!UwSg^iF&WGcXDmQGH;f6cAVbQeegn@~?cugyk3+@H7Y13BTJFqmTQKs_Eb3 zdg-2W*tyXEWA79hS=&bXJ^irR?{EFM>7#d#_^x5pMDJ2}_MSXqaZRu&Vb1P%djp%k z?*FkTu&Jf>bp}n}b%YyG>ltF@iy(oXz_WiL?UQZWTift#eUjR0Zj?dR#4}YH1lBiw zOqf#-HUBx6lpj(Vq} zP7M2wD5>;%-^Wt*J`ua7PwF=-T&uT*`sPOHCSSb~B|l1g=g$kMn|FREf6v}i%wM-B z)L(IaDb-GdJVNEF@8xypt@8V(`2GCx+xq$~@75VvZvLk5rlup`s84%;8i+-U7d>dGtpG)g1CT^t(rB4ALd^kglUgMRre|q^Y+wwM$RZ z^mTJnJ)a*8<^>AcU-iqY3+dnbG?hg4sb?lHuXyOfU4J5^mPD1kW>PTI`S#Vx`r06< zIj|m=>eKyMRdlXiKRK!oWKI9@9ft?hog4riygn@Ioe5FZ2l~t6K*P75g+^$PG7|@ym_4tdAt&t0g_}RYt;*dcxITjq>#M-9Z*}>V3EApl8w?a+(UD=BP1h@#Kk7 zC!nPl*h|aODi56)cpitg7n?&)T@>)R5s(_zmOgS~;28<{fH5CA!26plOi^*6;6wL! zrmde$Q*`HMKEX1Tbt+fkb9=RK{Zu~N$JxS`ENpO#32It`KErhtf}lGJ|Oiz|Q`qLAsPzuy}n)I?78YqjawpDLA1c zB*Y~+Rr|s{+4918nx1xoN?-`y%-=W@?Tt8;-Xhi7j6+!SZN6rX61Fto*52GFiz@M- zn15?_>sNZhdiwhP%l=H-_BQ#bwC2cGDP6U1MEKf`x+Q=;8Q)NkP4XUF?F;f;7V}$} z)8APSzegQM3T@Wf_LEQ~?6h5u#UvIuIu$LJzF02e6!yQ1QzpXGea~%?Rl`+;ZktR2 z>H4KsdM5TAyRhxq=)J}`CgYRz-I51BaqTos#n}4(^MK~_&svCNd}qLV^|W>jrfl4_yZ(90e<%{aUap+`jfs- zClaQHc_+%QN%%c?aJ$ICy;tDkeTJxDFP3s0Y(nxmJeF3V$|qy?&6654EV?BEVx3+hy`+ko=+Z z2=bOJif9|OXmDHqMVD|{V=$LBhR&bPb?tnF=r__E=qGiruep&e+6XQt`EnQ+6MZ>~ zw+0JpFYtDDdTsM{5!Eg4S04^)zHRsV^je83AETMhhZ*G19=hGCEZ-DeHY3@lV;uUU zxchv6W1625I(s&^GXHsLXD25ISjNANjm-eG1hKw}qDK`)o9)$kT>6ZL;)C02-oI4| zjV_!`=jm~1X~w1`Tf8Pu@S>2m%Xpbr_9kzu=jGnuMS*Ry86Cm~$Zho~Dyv%pgV-kK z%aq@zMyXEIrZhgNk=0ol>XU26RHclQD#*eI6MN+g*Ua`}qy zFJ8Tz(4Z()dJ64e$t%Qqe?U+32Q4&R=WbQ@`r zY$y3^WfPx4=vgbYZaLM(!R+b}uRL2H>KS%6JtDvp!F%qH5qEa=hv!-!=CRh)b1^$r z6R{}Rw_bVtvvn;VXX^vP*UDKx;)RB<-HeT{rH~->*|VRM_dB_GFI(S3@x&$TI=A86 z2eN>D?WRvoTu!SD>7bF)X79*s%jj|ydV=z5v-Wgdd4=Egie9eta?;k@{Mgjed^rcK zT2BgR^?~7Q8x@NY;cH*R#z2H3yzbNBX07_~0aPbF4*gAdjqIn%27_vlyBN0Ezu@t$ z*{`7lZoZ|x>60~Iz4p(}&O7_sI^R8VecSEt>P&ZeJ{PrZ3UMUh*D?bt_rgHF_Rja*zz zm)R~eKN&hB+d^!e&5hUdb`E!BMEJB8{Rw@2wm!mh3H5K{A_SA~qxW>zPq`-b>^#n^ z_I%N^`xJ?h&3(=j%)Z^l_QXw@Ba?NdD z{HkvVi;#1sR!BzJUsWcDekg>wBtpXzZJ#3t{CkNcY<5jFvwG`QwdVGf00S+*H$NY$uIOe=nS46A?nQF{i&E-uB5=!)gM! zZ+{C*= zGK-m2Saau~@MjM_DRW2fN_tOjXgXJ?@9YF~=B4P}rWd5kdas2ZKxQ5RX=l?1MR>0a zI-YQnfZNSof=s5@POQ~0yz;JxmX;58rW`nyj=IXYkJPQG2M*Z6ckEg2F1 zte)D~@G7Qmw{>hUMfbYOU`kL4a|6hQS0y_yS7)=e2SHv9#IchQ&%`HY}u4bxx~JPuaY1#Yc$3l_1e6yd-AVGsRi2`au6yb ziEk-9n>r-?+1cFY5*bv-NvIKWe!V;_@j^wvnvBq(*Al<1=s&5tHahXm3ZH(m@L$tg zbfM@l`z}S>N4T~8M`2IPVsTCe`h3!o-eEh)bf!K3SK_t4z{i*1w=CszGeuzKfseDs9aZPM@*FR~7&lV&-tLw+_w|E!wj=83o&T*mJul|Z9FO?d z2&zhWeB}Gw)HzgpLa29?UMXu5veIb|5zh~x0%fCndL&~eA9cZW)ugga-;@~@dJT8L zga_4)I5MDacI$9T)aBaOaFw;L#1Nn0Yxrg}U%otCb6_k>mCnS&75!`KW^dsl_28)b z82u&}t*uqhz<=_vVm^lzqe5#M>RLhvpnWcV`}6SfceLaIrbCemijR-zu9ul zu`j~Q`WJ?O`bJ^6haCgYD}~{0;9D<`In2T8!<}fj+fIbnPd= z(w|Y&NCqSsdTu{0N%IWd(4Y5oov(Oia|PFQ<>+l2&^W86zV7{qnFAVY`oGwD;lf?K z6L8MF>ym(`zjR=0QBUbnqey+0Uv4hUG|y=tt0=S_hCZzvbp$Y%3_dGl{&+h)_G zPG;ki&O7Tpu}t4Ta=!2R!P--vzt#C7a2kr!TR8Q>>Gihz=FQiGZ<=(0$VB~G!Fd6_ zzIdL~jnkTcH>Ob(_HvmCPl zvkkKgvlsIk<^<+*Ofc^S^|?Ag8wQTXOvE@b(=hWe<(QS2A7Orq*@<}p(}?*T69!)+ zF;`=fFw-#eFy)w4m<^amFncgBVcy2b&rCVxw|=NwNBMIwqT4Y+YL$|uosl@ zwV>3%0T3b74*T(_-@U<4ANOOUA5Vb7zt2yf1|^+#KYhlJ9e(%oe$@V|!UcoUvP1oJ zm>(njI0O`aBK`D8KW*~UQGPnwPfzfp*^hR=f4m=){OI=MWIty3G1HG(pzxLL#~i== zTtDXeF&~uYR_@1Dpw#DDQ0iqfI0W43r}uz^p$~&2K_55@41G({(V);7e!2)81HBQH zo_r^00*``Mf~Uc8;E+b;Zw96Jb%VnHWH1EG^t;amCA}(8g1kOM=WjQS6I$E^(|{`~n1@+u4Rg+=TO z^9vT1faQ6W3-d~pTcsx-yAbo|dy0z117iOC!n{h4VP9IX&{J074<_l97{vVf1$hgK zC4A+w;zG}SnOGWjYY)3kx0ib=V(s`>6jXXDiWhn$thY3;r1G^Fs_~#cC=6OpzriEptMl{pHlCnx~h2l$|Z(hZ> z$M>h-GkUQ{)vqwsoqt#AJ-xg973<%eO77C)3Xhl4=NDI&m*g!hSW-~xF)hg}m+}=9 znZARCo?*J{#?;M5k2L-r8(Qwdvho$*Qc=0ye2=N3z~ikb)gMQ0dWM#Jb9VL(-OsM; zY5Sk0pZ?|qMV>`gRmB&GRm&|~Qd(>h*{Cd*C!X6~8A|GVJh*@HyY;pnzQkRUSDJTw zLH>7D-o@d*u>ys+p3mW;TI#OpUg3(+|0dmD?bTCMQIMB!G+U$pF^wK=BH6C~ z2uYZqw=A!iZm!EMDLF+mWz!FsCKpsLtSBy5%~~@}lBS+kl2=*T!^f28F-7_U6U-2(nQZ7BG>81sX=)Fyu^f&&za`Q^dN>?l?^H!R89tD-< zG(m}EX3QwT?8M}0Zr4>56zEQV z`uYOT%)AnBFSi+no6O-P+znkKnO1>t(kN$8YsF=y>C5%BLYOMZ_$|Lt*kw*BzXy8Q zH({5#ko;t6W7uWYV%TNrV%TM+W7vP%!!Bzc!(G-lPS<9 zYWdWijOS@(73s94tctRQ1(lUJ@H^;q>v+bGSC_lBTQCJfm3e8NTf1UD^LO0({ZNG+ zo#@t1r@6Jr$!_iOh0Le&Q6M-}cRgPJ zK~U;55<@-nDwn49!ARNqVx+86Zb5MqlsUin$ulwhBwdLsD04$emvy7=CUdaCek1Nz z`Q06$(5Zep%}-~666a>W`wTzM0ww*~7|C1eS@K+hF=5IvBQX^i;k61Qysq)%-JrNv zVSQ8XyY-D_~}PM;cEv*@_7Oy;hx0^U$0@r|1FI8&!z%p-XouQm-^A(b8BIk zNK6!F5v?*to1#g%R_ZM;O`C>&F)cbqyHPKva?jSJj9XgV+E&aq%y!HU%udWM%x=tH zOfBXx<~XJWG-6sXK1@5N0~7i;^2S7Ck}z4AT#N^^3bPio z5wiue4YLEY3$q8a4|4!>6muMN3e$lJeqV);07qh?G4Ys8%v?-4W-VqTW(#H~rU7#b zGs9b|O)V?cvgw;AZ-wrt(eG6h z>*0v&tZekKXt!$|_xnQA$ zXCAsj;#BAs(k1S~B9QpSBJ0H0J5thsJKVjudn*~>NXt{OWI=(*J!zJSjdTqsNx#dU zIu%tVX6n>y^YgD=p{JA2Z-QwmKa*Hi@Y6CfoJ*ECRnIj;^D<@-2YD6Dh89L<@i$+m zi*TVHXnDop4CGzLT@^1MO3%h0znfO+RFZ}Yq0*D_r`s)?_Ttq?IwO>kPdBadlTh7m zQ%F;Iy^hotfK#ERep2Zr1cer^rufSyD0R$z;M(or4B|g~UOChD*Ezi9Ln>R)g7Z>BOBIse_iwTxUB|LYxo4P&11FF^Z#|9Ylyx7PhH zkg@Lj{4?U4{(mn3Rcr39UVG1ve!On|hMJ9=esb^T`+oYfE%!h0^Q{m5;-PI1Kl01% zk3ROR9lw73iJedW=C`|k_tfuqKm8wn*z?C{p56Q0^MBg+=NDeAt=nIJ;NVM#4j*~> zm7}k|_IksyH{Lw{m%qN%*!1>0Cz{`VujS<5-aqxhhky6Ae$;mQ<4->pviD;Gpn`O9o#$WazNVA}=34V&teRt~6aWdQ8;V zaX*M2fAuvJVkTZ|wpeX;M{Hbtf-{jdlFOa90A*F-?M20l7MCn3Ei3#onZVakn}Q>Wd;x!4)mx6GWC zGkcDz|8MvIe?|R!nc2!O<0H4eu3ZP#VnW;aUKwT&M%KFRp!qa*%uY-PChKG7z8D`y z*23q(&`)s3eAl{IMt>PCJu^;U0u>6o~(?ml;gYdEn#l3kWeMWU#as@ ztk0B;{3RXB|57?K-dB>Qa3>|~nX*}`TK|0)pEC0iPGx>2bBrSB0{G2`GE$Vf`aWfr z_%hooWwz8au5j~Re25OBQjc2*KSpe$mcBc_(uh>Rfe}}@R`u{*c`w&XuH-~wt6Wv= zZ;mVZ7%Ti3%Ijf{S4q89kf-7#pHeLQ-n>ZMg`^?1=bJ7jI(ZCw~z%&o;e`u z1uYj8{Y*J1`kCdR@Kyzeg6qJ3;AT*C9$Ucy;C3(!+zE;fV>dVm+zW<-wV?2S7!=(` z12`CL1TO_!z#*Uyls&C>P;@69py-UWb84?F6qG%>2yg@#35qVp1dalu!7D&BD0_;9hVncmNy+Hh}USk`v%~&<9=(o&m1`wXcu|Fbs?VqrhuHGbmRPB!PA? z19X7dU@Vvm#(^bZJh&W80M~*}a5I<)ZUa-mouCWc1G>RlFcmxsrh$#%WUw7f2hW4o zfua9Ie!wB%4WJ2}0!{#L1mnR>a56Xz%mU>dskvYlSOne-dcc`r6*vpr2+jewfd$|$ za51P>u(gz)Qgi;1Dn#90pDX zhl5$*D6j~e0D8bga3h!kZUxi89pGYc9~eMKbrcK+8^ONdDX<^d4)zDngJEFk*W?2Z z0TaOq;9@WyluOz(z+f;N>o z4hOe_iQsN9z=T|Z{lKGOf3Oiu1W$>76nuz3sCD8GhJlG-Bp474KVU!5F8-if+$X?~ zxPv+34(5xynf58};3{zk*NMBG_9^b*c5w%HiF-WtB{X?)7qt3=mOBIEvi z3;ld9^_Q=Rd8YjGSf$9Xz|YSTKOcG2fczHw`{I))0N+1|8rQl*%SL5{$@gX{Lfls(Rf}Wk1>Q6KE*$V(8AktytdJm zMc$>}E-s76zwzuA==`gEr9ButNSiS1(k{B~O2&jwX&;9B68%{i{L6Dx_R1b{rQJxq zN!*1x&)4%LHF`^Vj;bxFwq(SX@<^MKr#zdGM%$89$0H6oeW)0 zRbP^-^QX$3s<&NLW>xp9%xStTSNdyR%Fr`E#h)sJk$09}OGe(A`jb+5&(Qf$d1w0b z6B$r>sJyTDw@s-tRmZA7ndIkV3FDd30*pK+>(5l>F;#!^Mjom!kUZ3LS9zrAZC;g6 z@ge#u=|@ue+xr=*{L~XL@|&vjqU!Aiy|gObEZtqDJ5_%Is@}diU1>#1T8wnF^=GTn zRWhs6ovfFsXIj0V!4kby_2%&=Bv;KHWG`RYrHnImekmpREjReugDOs3xUjk3!cQ>CLMS%tY# zUwf)BS^oAa>7?<@jJ#5NJday+*;8>R^$4HU!+pB{SxP#p*HHP+(0deR&+tDN2{X+< zzKA_b=f8VCC!>ngQ-zMQ7M41cHT(pysBfx1bILgD*8M%ujo7Ndx516z)8JNcJGcY9 z7u*fL4(jxfyJ_a^`&EN^}Ezk$P44wi12x|RPwK^aSJPt;JJHROLcc2-34@?4o24;XQU^e(C zFc*9cECEk~%fWZRwcxwpX0Qp|2EGL5@*Ky2JE03e(JhJYX%BP>xEy*MSPNYQZl^r` z!K2Wb;9mSEf{oBJlirE{0Pqy_7O)-sHFzF;3Je{f=1fDtXP`~sJ}{o=mI6+IUI%K> zapDfW8r)5~Vc=wFnG1++>sl}i+5<*FM}l*qe-9RcbHKgC8wh%!Zvxj5E*h+YUIb=9 zUkPr6&I4-+KM33k&5}*mA%=rHpzjBFgEAjzAY25v4_fAiyGbVoJPa)@y8+q)9*15I zMp7Op*aCew*hu_KK+%!8z|**|2hW2u#Gm+9Ff=TckskSj9t#eEz8x%rjsi{4h2RA6 zC*XG6uL0wsmw=POYEX1@$zT@rk3bW2A~+X%EqIuCX0QnQVbB9E1FJwUxDmVsY=Q5= z;8y4dz#U*VxEuUAC_2?k!F|x1zz))l1rI~t1-9cq1UwEsQ~aTaf-TUqz|-JXaR)bo zp#xL3UxJa~PEaGgVL&u=4j2l38EA)=*`DYklR!80JzysI1egOZ1@pmeU?lM_2g{*v z6@Tc_;40{Ra2@ypxD~7icY?dYz2IK(F!&1C2p$4W#2*g&pyz_p3%w7Xf!+^>4NBGi z3`T*EgGu0nU^MYYfZ5Q$0CU0Hz!uzXU%fg*IjGh_vIA+1 z-FbRHrN-+8dY`21`FcGmdx73Yl)YFVPnCU<&Xck)*5zB-OZ2iD_7z=u$(+f^w@hzO zD$EaixXWtA2qP;G!>(3=D*OsR&$6~sv-pKQ=I_cy{Vl=YSU-wRBnHkTP0m~`aP_G}!H-=Q?*@`YHhQEt-yW}PD#a-;`jF+;@ zU&CE?guCrt-7dNd*}Ib#CUY`bo87MWgK8d@r}rVszChBhDRN0I4XQu2+^l?GiOZ7TccBNr5>{9QBy*uA>T_%*ftPqVb z-X88t{q-hm%mTk%*5?w-&}$UyWmmc(r7=|c1*IiZYZRrKQ+D;d47AHl4o_)%l@4!#UPfhCnqOo6u3AdBE=5Uy zH(jpRsG zDYS~E{6!bg(_iSG{!%k4cNJc0r<)diq?|esKSM61cN86yxb}AM*$1oemB`sQg;(yq z!%Ht})PvZKvWtFB-ei%ylx|CnG@?tC(yDq?r)Uhj=u4H>UFjRu^H#c3`73dyZ&1%e z=}YCLujl}!oaN+b=mV7|sb`s$i~8HM3`$43l=^0_LR&TDOs#*VElTfWyfYxQNN_hT z@l@C%J%44FlN5$~rQX(*yGQTGmEKg9PtxL76){=U0{nKF*p`&tZUHX(wae6-U%Sf| ztZW7t+yF9(!4a%IRYzDS>`s1xub=BU5U%vM9 zmxio&xRck6&+qrM(ArzpIu=zO8C&~?oAG5_3RIpq+ zX7yv+GU7LGE$eq~Ef?edt=sTXSlij@*k5$jV{eBa>2w*k3;wi>+6Z-r28V`<(Sq6U z732T4yH*Dpu~OWsRzLM~9N`bMwN_cSx)sU=G3tj*b;*@5U0$|K%d0FF5!Uh+mg$0C z`NIk&;Cd8;BNe~*-&6f}2CZ_9I5#~eJ|u4#J7Lp8eU%d$gvSzT~#~#T;uPyyB-xyj(1iP zfBRp{FNxmmTAKCy=$bE}b3Z$M<+i6?$8VW&g{uYrY74#|G4v0v`)}VET=h5Ze#<>r z^@E@7aeeXY1+VTpz+25#t@A2Fo^k#1&PT_*UVj9Ib?T-s!av{*>fA+7hirP$^~ADgAN%!Bc*EM1bnu}iwXXE9 zPJXg!4WIeZ-rbclu+H^Vd-W^n8?H#!8azW?d+S`sJAd}sO^x>p5)5K)W+;6aV!9iEdWxx5u>Gz1QogF^>^MkHS^HO3)eCmSUJnXSe zFS!~XeBk_qEgvVb5-iCv9df;z?Ow3c#M|guBRlWkbI5hjc3;ti0Lr)hwZg|-hh4uM z^Wz`Yy~HJB?K8s$9X;%NZ~NC3Lww_fwyt~ML-Z$9{}_KK_WH~E>xXUMPo%T*t)d&O0;efj7yoz$0m z;`8tKIqF*V=UZMK`ij(F$?=EpJL;;~_2HK5o*9&^ZN4<`pO?Jq8t}kV_q}5uo~%WD z{oC2UeAQK1^47jFcfeonT{kBWd(Cy~XA?g!e%J#4fhQ*X;x*TgKU=f;A8q(=-m*03 z%GX`m=F2{6`+Z;Xf9J}o2VZv;J@EOtJ1e<^t)XA~t^FHZtH;h5bL(R2+xO47s*DEL zOM{<#?q`dT$DLQrwEVci_0$(H-uZSO{Ow&d>W42ixU6;NO;cJa@6I<~ZR%`rRXzOK z*+CBEefjB&Ytyn!vZ zDB8g2&bM@b19N|`Xal#-SG0i*;fgk}s{XHfd;@o`RJ4H&7DXFae)=zZcmpGzP_%*3 z1&TJ%Jx0+6Hk>-H$2TzdaYY+gv{=ywc1%#Tfy@8#rXJtGs^=ALpjNGD13RWE+Q8+P z`Q!Vs{QWmndHmS&ABr}x@h(Lhm@!S!2JRiDXalz+pCTs)uB%tHf#nY<+Q6J*MH{%+ zrDy}U4_35+T5E%zzJZPV6>VVrgNimVqEgWYmfxUg18c`A+Q6-vq77`>Lw~@}z^XDu z8)&*((FWF@dQA^+VD2v!ZJ;(s(FSfFp=blme|=StZ(!}u6>VVFY(*Q`GF;IH=DvSa zk8fc64n-SSzC_UmYS${-z^Zev=EWPU*eyCkx#Igu zFpIlUF9mbJtH4}v5GeOzi|$*l#SRCHaFmTMj)KTm_oIDliOO3l0D` zf1-&$*VAiBEV7Vu+kef;*r15KC-FuFxRT)0i z+D+K!gYzX!ZMVn&W7`mOs-}%f)dGnbam?L2en4;Xf0ha*{crjW>5*UQuXZhzFd{=$ zFte2p!EFsv3~WaLvrNbset}hiRVMu0*mFVAOW%pda~KPP@;K&6%r4CDF=sI6F%Hs5 z#|*!U+0kfp{+JO6$|w;Q1XW~kF!%{;uXNHH&_~lQBkYr~@IGN<0^#cg_<+u>ll7+m zN1Vo|HEkkSe|Vyn=<*|*bPyeNl+j5tOc0wdFMS4a?94!o7>w>50{JE_8Z}k7r{MwB*rt=^VI36%H@9N zP~11;t-?huEi3UXk%lI6Bl6>SU%7H+{sPfsN1C{|P7m){7RZgcefO+DSR zRk)~LZYo?fZu^4BM`tKX7l%`00`&bp|8tivL<@@w(D$JHZZ>f<;nqVw?BXVO+kFUw z{&2D4rkN=Vg`emzb5(qRHh~S%i3^MyG4xPff8^FmA>?C5f)`UkrIz5fi?zxUsHk^jZzA2jpd$G>%YZ~umi z>aQucxBtcIf3@)6`ghF-u@To|KLUOFRuTWy}je_xhVamOMClY zoc;qfz5Oq)pP5_!z5jrp_xA6}UkiTcFY>=Q{i5x?<6q2QXgVV#)I z^?)}8Pxls7tjH>;;QB6Z(OOuLR^~00$=8TLUNTGbR#b4MoBv(28}hX)d$?xncW2?K zofg*_D=N7-B)fP?L29MEEhjduFsS=JrWu*Vm7WZ)+tTh1x}kD%!2<8?w-;1oaakZ) zXitaSQd*Q(nqN|opT2w{myqyA8_DSNz#oQi&C|Dfzp3Z$$>S=z@*7GE%VufoN#D(;Da38mk&^;CdBX7K{9 zAzPt6E#;ANr{?GLfGW{i24$Azp|aBb)0b0g`N22m6;~E?JuOZ9i^Q7Y$yXJtX~X)= z;tnqT-AQek_^Emq>6pgLjiiwm(DP!emEB=f5_&#O0mS50OT?4>OA9!Ucah61Eh7lQ zDp!|?W$JdlP}=f<>v%kAT$@;+-KE>FE9U+I;XqIOUfpdP(^YYrrQM6UkG;Id)hKVfo@R*rbQ7pGp&eEodPmlVZE~!gF znZnoq_#TM^U_@r0a6+(oJ-8CvSMi%ayi>; zS{j$}DRH305vQXZiZiO8wg}dQlvF z`$Z)GSsec7dC`AHQe#RDbwq2><$Hryd)weejs? zv0J}A{ktC3V@wZWjDLIH+a_)P+l$`T)ik~0ta-EX-Ig!WC*GwvYd@vlH;_OV_rtv+ z`U!VzYA@&iRoX}_qer^se|Kx`KDTCm&uw`B3syNeM~i+p&F{07_*s*_+pPBgwh=y? z@ZV-8lCBs-uhNr&08>xu``ZJF*RzhlZ%m1I@i_NwasOx1|F*RLE8Y1p%D?>uUi1s{ z|1ReF;^*hxdU1&VrvFQ8fKf6Gp&ewNVy-m5Z4R*vw_It7vZPz4SY}!7v+T8=vR-CO zwq@ED+KO#uHm~gt+Zx-CZQE>5+xFUCur=7;woS6%WM5`qZ$E5*%id!D*dF9ac3kI} z9y zx5f8K2v4{yVMfAj355w|32PHJCG1N$nDAP{iG&Xl`Z@&7sbUM?V)10?Bi=0cH ztDJW`*ExUU+~R!5`Iz%b=Wge-&KH~qov%9o;%s)dIzM-wbAIjYn|Mj$Rf(3w)Wj)? zuO!Y$`f<{|NslHymDG?Fm;7S#JtOQmIv<;RxC zEH7K$wR~j>whpq6w8mL8tl8Fb>t^dC)?ZtHYpu6_N)25@9TnLsY(J%DcG?cu-n2E^ znr$7n5c?qerS?d>&7N$(!9LAC!(M7%ZeL4n{lvb@{)~OU{gC}Ab@sJ=vSXIR>!@~E z;)>$R;yiK7<5tC0#r-vIM7$|JDn2@XLi}@yuP3%9o=Xf$8kRIFX>3w*(v3+ok`^be zO?oZqMA8RIvyyX@A57kne6Q<4*MGS7xju3I!zE`18z|GImS0&8Sl+Xov3zL>vW8kO zwO(Pp#+qRDP>ScQeQcN7M%&_SskUs}t+v~3t8Hs-n{D^op0q8uueRT3|ApOWZ?}KN zlO5t1=WxL19gce)?>atmeCqgz<10sCY-nsm?D*J;v2n56W5>r?b7{I@+3Kz0rD$bpf2Lvc6&MZ?oF2a!hutciiuI!r^n+ zW0PZ3W3P|BF?M?FE#y`adq?a8vGuVZ$6g!vRNOmpf$>x0|CaCz=LgOiiBBiKkoalh z*NOd-h9^ZQ*^>U5G&N;LN?uBN$}1_SQZ8{ty2iLHu6S39Yql%brRB00314Q~@n-Wc z&A&6hY<|Q1PjjH<3d>ka60*F>vc+=B(qW0VTC7v7cU$*ZU$^$NxotPwe#CPgXdh+I zu+OoV*zdA$wm)XyV}HrsX#dE5-ag1-a-=$DI0_ugC`aG8fpO-zFXQfue>eV_gi+4x zoy%xx!xCc>ry`vnBz^?Xor%Fo{gN(Ex*}-|e8(fF3zF_i+L*L8X-CptWc5svDS3Qy zUh<0M^~nz>KbHJN@_}Su^4OFcQf8;jOIet5SIRot`}DKP4-{gkJ-=Jr#hM( zUpP7(@5Xh+^^G4Ie^q=;d}92K@wxHK;(rnU$N2ro^}F${@tyIPCX7$~kK}t(9!NQy z@4l^VNmL@c;JU}P+4Tr#%s2}`n&ZuL%qz?_=KIah znj6jOmc^EzTK-^}NUwB<^%vHeJkRa)Kkc?~T5XZzEyqcRBeo=VQ|y-5-^SL(z83pt z?8#V9+`72m#qFgB4xmKq;~$ED+S!_TPts{}G`Y^WwC%hLM_zZCA2vT}9&O!ZeFBL& zMXS2hWHpe@xRE3eq!u>XxdBEWIE<4VUhjwy~T$2`Yx(z?MqmLBds+f?NJVf&|!@o|&m z=Fnd)k2~Q!Mep<1ly_1-M&hn?jg_=()gHdpTxgNbbQj}ggk_{9+A_gnw%9H4w66?H zrX|agZz-~rSjsKS=@r&lHe0q@wp(^uc3bvZYAuH?4VFeri^XSYrxj}S!4cL-tH~N| zHPd^!8C9~ZIo4cj5%Rg*T4i0w2(#6?-MZ7d+q&0UYdvgjur^v-tUhZyy_;qWwMEz> zc^1(&vn`%>oMFqd<=Ao=h01NqZB@2)^x#{Ogq^nCjMTNZ!;IC9wicTY$>^~0BD6h% zami$lwwvwob~mj*%bsJ;wHMjT8KJ7|>*xoz+PB+x+IQRc@{AAL8|V>Q^pPMcF*7zmSCOm4Rqpb*mb+HDs$6Sb>s%X={w=Pp zu5GUEt{twOJonwMJ+8fsaJ8-joFzT#YH%HQHM&l@e6G{<2WMOzuJiKTT9gcH=3sNE zIm{ek9%7C(k2IUiQRZm#1o{fQIi7LEZJun-FlU;x%-KlKTyw5D-&|xaF_+ViEH|&B zFIj6|XWmG^+L3TRfh)$Gq0TU8gmZ{9(mB#;az;6$ofDj9r`;LvOme!NlbsVNUlL`@ zq+D|;Qwil+MOijdj%}1-7yR#o_oMKA0=`efGaR>bCJEUJhSwqR83m7a_?rxG+3=MQ zPagPL3ol#D+sr%6yUcr#@&o3h=HuoQ=2Pa=<}>E==3q;hWeD;ag?!qP&B@4Swq-8T zSz_^6R$1248n#%rS$0@^qo2?XmB(A7BP`+=Y)7mX7aA847a3=Yi)PjmALowCh|7x0iOY?XLozZxFS3+cDlAJaB~A~kiM7s+ ztR=QNcQ|)B_c-@C4>*rHk2@I?oTr^ argument +$out = Run-VcpkgAndCaptureOutput export zlib:x64-windows --zip --x-manifest-root=$manifestPath --output-dir=$manifestPath +Throw-IfNotFailed +if ($out -notmatch "unexpected argument: zlib:x64-windows") +{ + throw "Expected to fail and print warning about unexpected argument" +} + +# Test export with missing --output-dir argument +$out = Run-VcpkgAndCaptureOutput export --zip --x-manifest-root=$manifestPath +Throw-IfNotFailed +if ($out -notmatch "This command requires --output-dir") +{ + throw "Expected to fail and print warning about missing argument" +} + +# Test export with empty export plan +Remove-Item -Path "$manifestPath/vcpkg_installed" -Recurse -Force +$out = Run-VcpkgAndCaptureOutput export --zip --x-manifest-root=$manifestPath --output-dir=$manifestPath +Throw-IfNotFailed +if ($out -notmatch "Refusing to create an export of zero packages. Install packages before exporting.") +{ + throw "Expected to fail and print warning about empty export plan." +} + + diff --git a/azure-pipelines/end-to-end-tests-dir/commands.extract.ps1 b/azure-pipelines/end-to-end-tests-dir/commands.extract.ps1 new file mode 100644 index 0000000000..467fff90ce --- /dev/null +++ b/azure-pipelines/end-to-end-tests-dir/commands.extract.ps1 @@ -0,0 +1,17 @@ +. $PSScriptRoot/../end-to-end-tests-prelude.ps1 + +$out = Join-Path $TestingRoot "a-tar-with-execute" +Run-Vcpkg z-extract "$PSScriptRoot/../e2e-assets/extract/a-tar-with-plus-x.tar.gz" $out +Throw-IfFailed + +$extractedFilePath = Join-Path $out "myExe" +if (-Not (Test-Path $extractedFilePath)) { + throw "Extraction Failed" +} + +if (-Not $IsWindows) { + $unixMode = (Get-Item $extractedFilePath).UnixMode + if ($unixMode -ne "-rwxr-xr-x") { + throw "File does not have +x permission. UnixMode: $unixMode" + } +} diff --git a/azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 b/azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 index 01b52420ba..dcac8058e9 100644 --- a/azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/compilertracking.ps1 @@ -4,7 +4,7 @@ if ($Triplet -ne "x64-linux") { . $PSScriptRoot/../end-to-end-tests-prelude.ps1 -$args = $commonArgs + @("--overlay-triplets=$PSScriptRoot/../e2e_ports/compilertracking", "--binarysource=clear;files,$ArchiveRoot,readwrite") +$args = $commonArgs + @("--overlay-triplets=$PSScriptRoot/../e2e-ports/compilertracking", "--binarysource=clear;files,$ArchiveRoot,readwrite") # Test simple installation Run-Vcpkg -TestArgs ($args + @("install", "vcpkg-hello-world-1")) diff --git a/azure-pipelines/end-to-end-tests-dir/e2e-registry.ps1 b/azure-pipelines/end-to-end-tests-dir/e2e-registry.ps1 new file mode 100644 index 0000000000..e7ebd4470a --- /dev/null +++ b/azure-pipelines/end-to-end-tests-dir/e2e-registry.ps1 @@ -0,0 +1,103 @@ +. $PSScriptRoot/../end-to-end-tests-prelude.ps1 + +try +{ + Copy-Item -Recurse -LiteralPath @( + "$PSScriptRoot/../e2e-projects/e2e-registry-templates", + "$PSScriptRoot/../e2e-registry" + ) $WorkingRoot + + $manifestRoot = "$WorkingRoot/e2e-registry-templates" + $e2eRegistryPath = "$WorkingRoot/e2e-registry".Replace('\', '\\') + Push-Location $e2eRegistryPath + ### + # Creates a git registry to run the e2e tests on + try + { + Write-Host "Initializing test registry" + $gitConfig = @( + '-c', 'user.name=Nobody', + '-c', 'user.email=nobody@example.com', + '-c', 'core.autocrlf=false' + ) + + git @gitConfig init . | Out-Null + Throw-IfFailed + git @gitConfig add -A | Out-Null + Throw-IfFailed + git @gitConfig commit -m "initial commit" | Out-Null + Throw-IfFailed + $e2eRegistryBaseline = git rev-parse HEAD + Throw-IfFailed + } + finally + { + Pop-Location + } + ### + + # Testing registries' package selection patterns + function Update-VcpkgJson { + param($PreReplacementName) + $content = Get-Content -LiteralPath "$manifestRoot/$PreReplacementName" + $content = $content.Replace('$E2ERegistryPath', $e2eRegistryPath) + $content = $content.Replace('$E2ERegistryBaseline', $e2eRegistryBaseline) + Set-Content -LiteralPath "$manifestRoot/vcpkg.json" -Value $content + } + + $commonArgs += @("--x-manifest-root=$manifestRoot") + + # [patterns] No patterns (no default) + Write-Host "[patterns] No patterns (no default)" + Update-VcpkgJson 'no-patterns.json.in' + Run-Vcpkg @commonArgs install + Throw-IfFailed + Refresh-TestRoot + + # [patterns] Patterns only (no default) + Write-Host "[patterns] Patterns only (no default)" + Update-VcpkgJson 'only-patterns.json.in' + Run-Vcpkg @commonArgs install + Throw-IfFailed + Refresh-TestRoot + + # [patterns] Patterns with default + Write-Host "[patterns] Patterns with default" + Update-VcpkgJson 'with-default.json.in' + Run-Vcpkg @commonArgs install + Throw-IfFailed + Refresh-TestRoot + + # [patterns] Repeated patterns + Write-Host "[patterns] Repeated patterns" + Update-VcpkgJson 'with-redeclaration.json.in' + $out = Run-VcpkgAndCaptureOutput @commonArgs install + Throw-IfFailed + if ($out -notmatch "redeclarations will be ignored") + { + throw 'Expected warning about redeclaration' + } + + Refresh-TestRoot + + # Testing that overrides can select ports that are removed from the baseline + Write-Host "[removed] Removed from baseline" + Update-VcpkgJson 'removed.json.in' + $out = Run-VcpkgAndCaptureOutput @commonArgs install + Throw-IfFailed + if ($out -match 'error: the baseline does not contain an entry for port removed' -Or + $out -notmatch 'The following packages will be built and installed:\s+removed:[^ ]+ -> 1.0.0 -- [^ ]+git-trees[\\/]9b82c31964570870d27a5bb634f5b84e13f8b90a' + ) + { + throw 'Baseline removed port could not be selected with overrides' + } + + Refresh-TestRoot +} +finally +{ + Remove-Item -Recurse -Force -LiteralPath @( + "$WorkingRoot/e2e-registry-templates", + "$WorkingRoot/e2e-registry" + ) -ErrorAction SilentlyContinue +} diff --git a/azure-pipelines/end-to-end-tests-dir/edit.ps1 b/azure-pipelines/end-to-end-tests-dir/edit.ps1 new file mode 100644 index 0000000000..686f4ff6ad --- /dev/null +++ b/azure-pipelines/end-to-end-tests-dir/edit.ps1 @@ -0,0 +1,33 @@ +. $PSScriptRoot/../end-to-end-tests-prelude.ps1 + +$expected = "$env:VCPKG_ROOT/ports/zlib`n$env:VCPKG_ROOT/ports/zlib/portfile.cmake`n-n" +$expected = $expected.Replace('\', '/') + +Refresh-TestRoot + +$buildDir = (Get-Item $VcpkgExe).Directory +$tempFilePath = "$TestingRoot/result.txt" + +$env:VCPKG_TEST_OUTPUT = $tempFilePath +$editor = "$buildDir/test-editor" +if ($IsWindows) { + $editor += '.exe' +} + +Write-Host "Using editor $editor" +$env:EDITOR = $editor +try { + Run-Vcpkg edit zlib + Throw-IfFailed + + $result = Get-Content -LiteralPath $tempFilePath -Raw +} finally { + Remove-Item env:VCPKG_TEST_OUTPUT + Remove-Item env:EDITOR +} + +$result = $result.Trim().Replace('\', '/') + +if ($result -ne $expected) { + throw 'Did not edit the expected directory.' +} \ No newline at end of file diff --git a/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 b/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 index b4ec2de62e..1762e9c119 100644 --- a/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/env-passthrough.ps1 @@ -4,13 +4,13 @@ if (-not $IsLinux -and -not $IsMacOS) { $env:_VCPKG_TEST_TRACKED = "a" $env:_VCPKG_TEST_UNTRACKED = "b" - $x = Run-VcpkgAndCaptureOutput "--overlay-triplets=$PSScriptRoot/../e2e_ports/env-passthrough" env "echo %_VCPKG_TEST_TRACKED% %_VCPKG_TEST_TRACKED2% %_VCPKG_TEST_UNTRACKED% %_VCPKG_TEST_UNTRACKED2%" + $x = Run-VcpkgAndCaptureOutput "--overlay-triplets=$PSScriptRoot/../e2e-ports/env-passthrough" env "echo %_VCPKG_TEST_TRACKED% %_VCPKG_TEST_TRACKED2% %_VCPKG_TEST_UNTRACKED% %_VCPKG_TEST_UNTRACKED2%" if ($x -ne "%_VCPKG_TEST_TRACKED% %_VCPKG_TEST_TRACKED2% %_VCPKG_TEST_UNTRACKED% %_VCPKG_TEST_UNTRACKED2%`r`n") { throw "env should have cleaned the environment ($x)" } - $y = Run-VcpkgAndCaptureOutput "--overlay-triplets=$PSScriptRoot/../e2e_ports/env-passthrough" env --triplet passthrough "echo %_VCPKG_TEST_TRACKED% %_VCPKG_TEST_TRACKED2% %_VCPKG_TEST_UNTRACKED% %_VCPKG_TEST_UNTRACKED2%" + $y = Run-VcpkgAndCaptureOutput "--overlay-triplets=$PSScriptRoot/../e2e-ports/env-passthrough" env --triplet passthrough "echo %_VCPKG_TEST_TRACKED% %_VCPKG_TEST_TRACKED2% %_VCPKG_TEST_UNTRACKED% %_VCPKG_TEST_UNTRACKED2%" if ($y -ne "a %_VCPKG_TEST_TRACKED2% b %_VCPKG_TEST_UNTRACKED2%`r`n") { throw "env should have kept the environment ($y)" diff --git a/azure-pipelines/end-to-end-tests-dir/fetch.ps1 b/azure-pipelines/end-to-end-tests-dir/fetch.ps1 index 8a4a25a504..2c43d0afb8 100644 --- a/azure-pipelines/end-to-end-tests-dir/fetch.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/fetch.ps1 @@ -86,7 +86,7 @@ if (-not $IsMacOS -and -not $IsLinux) { Remove-Item env:VCPKG_FORCE_DOWNLOADED_BINARIES $env:VCPKG_FORCE_SYSTEM_BINARIES = "1" - $env:PATH = "$PSScriptRoot\..\e2e_assets\fetch;$path" + $env:PATH = "$PSScriptRoot\..\e2e-assets\fetch;$path" Run-Vcpkg -TestArgs ($commonArgs + @("fetch", "ninja", "--vcpkg-root=$TestingRoot")) Throw-IfFailed Require-FileNotExists "$TestingRoot/down loads/tools/ninja-1.10.2-windows/ninja.exe" diff --git a/azure-pipelines/end-to-end-tests-dir/format-manifest.ps1 b/azure-pipelines/end-to-end-tests-dir/format-manifest.ps1 index b30f6f4901..76d59e0540 100644 --- a/azure-pipelines/end-to-end-tests-dir/format-manifest.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/format-manifest.ps1 @@ -1,6 +1,6 @@ . "$PSScriptRoot/../end-to-end-tests-prelude.ps1" -$formatManifestAssets = (Get-Item "$PSScriptRoot/../e2e_assets/format-manifest").FullName +$formatManifestAssets = (Get-Item "$PSScriptRoot/../e2e-assets/format-manifest").FullName $testProjects = Get-ChildItem "$formatManifestAssets/*.json" -File $testProjects | % { $asItem = Get-Item $_ @@ -21,7 +21,17 @@ $testProjects | % { Write-Trace "test re-serializing every manifest" $manifestDir = "$TestingRoot/manifest-dir" Copy-Item -Path "$env:VCPKG_ROOT/ports" -Destination $manifestDir -recurse -Force -Filter vcpkg.json -& git init $manifestDir && git -C $manifestDir add . && git -C $manifestDir -c user.name='vcpkg-test' -c user.email='my@example.com' commit -m "baseline" +git init $manifestDir +Throw-IfFailed +git -C $manifestDir config user.name vcpkg-test +Throw-IfFailed +git -C $manifestDir config user.email my@example.com +Throw-IfFailed +git -C $manifestDir config core.autocrlf false +Throw-IfFailed +git -C $manifestDir add . +Throw-IfFailed +git -C $manifestDir commit -m "baseline" Throw-IfFailed Run-Vcpkg format-manifest --all --x-builtin-ports-root=$manifestDir/ports Throw-IfFailed diff --git a/azure-pipelines/end-to-end-tests-dir/integrate-install.ps1 b/azure-pipelines/end-to-end-tests-dir/integrate-install.ps1 index 1879df8638..7c6da526f5 100644 --- a/azure-pipelines/end-to-end-tests-dir/integrate-install.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/integrate-install.ps1 @@ -1,6 +1,6 @@ if (-not $IsLinux -and -not $IsMacOS) { . $PSScriptRoot/../end-to-end-tests-prelude.ps1 - $iiroot = "$PSScriptRoot/../e2e_ports/integrate-install" + $iiroot = "$PSScriptRoot/../e2e-ports/integrate-install" $env:VCPKG_BINARY_SOURCES="clear;default,read" $env:VCPKG_KEEP_ENV_VARS="VCPKG_KEEP_ENV_VARS;VCPKG_BINARY_SOURCES;VCPKG_FORCE_SYSTEM_BINARIES;VCPKG_DOWNLOADS;VCPKG_DEFAULT_BINARY_CACHE" diff --git a/azure-pipelines/end-to-end-tests-dir/overlays.ps1 b/azure-pipelines/end-to-end-tests-dir/overlays.ps1 index b0382c2c82..3959e531c9 100644 --- a/azure-pipelines/end-to-end-tests-dir/overlays.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/overlays.ps1 @@ -1,30 +1,84 @@ . $PSScriptRoot/../end-to-end-tests-prelude.ps1 # Tests a simple project with overlay ports and triplets configured on a vcpkg-configuration.json file -$e2eProjects = "$PSScriptRoot/../e2e_projects" +Copy-Item -Recurse -LiteralPath @( + "$PSScriptRoot/../e2e-projects/overlays-project-with-config", + "$PSScriptRoot/../e2e-projects/overlays-project-config-embedded", + "$PSScriptRoot/../e2e-projects/overlays-bad-paths" + ) $TestingRoot -$manifestRoot = "$e2eProjects/overlays-project-with-config" +$manifestRoot = "$TestingRoot/overlays-project-with-config" $env:VCPKG_OVERLAY_PORTS = "$manifestRoot/env-overlays" Run-Vcpkg install --x-manifest-root=$manifestRoot ` --overlay-ports=$manifestRoot/cli-overlays ` --overlay-triplets=$manifestRoot/my-triplets ` - --x-install-root=$installRoot + --x-install-root=$installRoot ` + --triplet fancy-triplet Throw-IfFailed # Tests overlays configured in env and cli on a project with configuration embedded on the manifest file -$manifestRoot = "$e2eProjects/overlays-project-config-embedded" +$manifestRoot = "$TestingRoot/overlays-project-config-embedded" $env:VCPKG_OVERLAY_PORTS = "$manifestRoot/env-overlays" Run-Vcpkg install --x-manifest-root=$manifestRoot ` --overlay-ports=$manifestRoot/cli-overlays ` --overlay-triplets=$manifestRoot/my-triplets ` - --x-install-root=$installRoot + --x-install-root=$installRoot ` + --triplet fancy-config-embedded-triplet Throw-IfFailed # Config with bad paths -$manifestRoot = "$e2eProjects/overlays-bad-paths" +$manifestRoot = "$TestingRoot/overlays-bad-paths" $env:VCPKG_OVERLAY_PORTS = "$manifestRoot/env_overlays" Run-Vcpkg install --x-manifest-root=$manifestRoot ` --overlay-triplets=$manifestRoot/my-triplets ` --x-install-root=$installRoot Throw-IfNotFailed + +# Test overlay_triplet paths remain relative to the manifest root after x-update-baseline +$manifestRoot = "$TestingRoot/overlays-project-with-config" +$configurationBefore = Get-Content "$manifestRoot/vcpkg-configuration.json" | ConvertFrom-Json +Run-Vcpkg x-update-baseline --x-manifest-root=$manifestRoot +$configurationAfter = Get-Content "$manifestRoot/vcpkg-configuration.json" | ConvertFrom-Json + +$overlaysBefore = $configurationBefore."overlay-triplets" +$overlaysAfter = $configurationAfter."overlay-triplets" + +$notEqual = @(Compare-Object $overlaysBefore $overlaysAfter -SyncWindow 0).Length -ne 0 + +if ($notEqual) { + Throw "Overlay triplets paths changed after x-update-baseline" +} + +# Test that removals can happen without the overlay triplets +Remove-Item env:VCPKG_OVERLAY_PORTS +Refresh-TestRoot +Run-Vcpkg install another-vcpkg-empty-port:fancy-triplet ` + --overlay-ports=$PSScriptRoot/../e2e-projects/overlays-project-with-config/cli-overlays ` + --overlay-triplets=$PSScriptRoot/../e2e-projects/overlays-project-with-config/my-triplets +Throw-IfFailed + +Run-Vcpkg remove another-vcpkg-empty-port:fancy-triplet ` + --overlay-ports=$PSScriptRoot/../e2e-projects/overlays-project-with-config/cli-overlays +Throw-IfFailed + +# ... or ports +Refresh-TestRoot +Run-Vcpkg install another-vcpkg-empty-port:fancy-triplet ` + --overlay-ports=$PSScriptRoot/../e2e-projects/overlays-project-with-config/cli-overlays ` + --overlay-triplets=$PSScriptRoot/../e2e-projects/overlays-project-with-config/my-triplets +Throw-IfFailed + +Run-Vcpkg remove another-vcpkg-empty-port:fancy-triplet ` + --overlay-triplets=$PSScriptRoot/../e2e-projects/overlays-project-with-config/my-triplets +Throw-IfFailed + +# ... or either +Refresh-TestRoot +Run-Vcpkg install another-vcpkg-empty-port:fancy-triplet ` + --overlay-ports=$PSScriptRoot/../e2e-projects/overlays-project-with-config/cli-overlays ` + --overlay-triplets=$PSScriptRoot/../e2e-projects/overlays-project-with-config/my-triplets +Throw-IfFailed + +Run-Vcpkg remove another-vcpkg-empty-port:fancy-triplet +Throw-IfFailed diff --git a/azure-pipelines/end-to-end-tests-dir/patterns.ps1 b/azure-pipelines/end-to-end-tests-dir/patterns.ps1 deleted file mode 100644 index 8cc837ee29..0000000000 --- a/azure-pipelines/end-to-end-tests-dir/patterns.ps1 +++ /dev/null @@ -1,84 +0,0 @@ -. $PSScriptRoot/../end-to-end-tests-prelude.ps1 - -### -# Creates a git registry to run the e2e tests on -$e2eProjects = "$PSScriptRoot/../e2e_projects" -$manifestRoot = "$e2eProjects/registries-package-patterns" -$e2eRegistryPath = "$PSScriptRoot/../e2e_registry".Replace('\', '\\') -Push-Location $e2eRegistryPath -try -{ - Write-Host "Initializing test registry" - if (Test-Path "$e2eRegistryPath/.git") - { - Remove-Item -Recurse -Force "$e2eRegistryPath/.git" - } - - - $gitConfig = @( - '-c', 'user.name=Nobody', - '-c', 'user.email=nobody@example.com', - '-c', 'core.autocrlf=false' - ) - - git @gitConfig init . | Out-Null - Throw-IfFailed - git @gitConfig add -A | Out-Null - Throw-IfFailed - git @gitConfig commit -m "initial commit" | Out-Null - Throw-IfFailed - $e2eRegistryBaseline = git rev-parse HEAD - Throw-IfFailed -} -finally -{ - Pop-Location -} -### - -$commonArgs += @("--x-manifest-root=$manifestRoot") - -# [patterns] No patterns (no default) -Write-Host "[patterns] No patterns (no default)" -$inFile = "$manifestRoot/no-patterns.json.in" -(Get-Content -Path "$inFile").Replace("`$E2ERegistryPath", $e2eRegistryPath).Replace("`$E2ERegistryBaseline", $e2eRegistryBaseline) ` -| Out-File "$manifestRoot/vcpkg.json" - -Run-Vcpkg -EndToEndTestSilent @commonArgs install | Out-Null -Throw-IfFailed -Refresh-TestRoot - -# [patterns] Patterns only (no default) -Write-Host "[patterns] Patterns only (no default)" -$inFile = "$manifestRoot/only-patterns.json.in" -(Get-Content -Path "$inFile").Replace("`$E2ERegistryPath", $e2eRegistryPath).Replace("`$E2ERegistryBaseline", $e2eRegistryBaseline) ` -| Out-File "$manifestRoot/vcpkg.json" - -Run-Vcpkg -EndToEndTestSilent @commonArgs install | Out-Null -Throw-IfFailed -Refresh-TestRoot - -# [patterns] Patterns with default -Write-Host "[patterns] Patterns with default" -$inFile = "$manifestRoot/with-default.json.in" -(Get-Content -Path "$inFile").Replace("`$E2ERegistryPath", $e2eRegistryPath).Replace("`$E2ERegistryBaseline", $e2eRegistryBaseline) ` -| Out-File "$manifestRoot/vcpkg.json" - -Run-Vcpkg -EndToEndTestSilent @commonArgs install | Out-Null -Throw-IfFailed -Refresh-TestRoot - -# [patterns] Repeated patterns -Write-Host "[patterns] Repeated patterns" -$inFile = "$manifestRoot/with-redeclaration.json.in" -(Get-Content -Path "$inFile").Replace("`$E2ERegistryPath", $e2eRegistryPath).Replace("`$E2ERegistryBaseline", $e2eRegistryBaseline) ` -| Out-File "$manifestRoot/vcpkg.json" - -$out = Run-VcpkgAndCaptureOutput -EndToEndTestSilent @commonArgs install -Throw-IfFailed -if ($out -notmatch "redeclarations will be ignored") -{ - $out - throw "Expected warning about redeclaration" -} -Refresh-TestRoot \ No newline at end of file diff --git a/azure-pipelines/end-to-end-tests-dir/post-build-checks.ps1 b/azure-pipelines/end-to-end-tests-dir/post-build-checks.ps1 index 5436696f11..3ebcd98448 100644 --- a/azure-pipelines/end-to-end-tests-dir/post-build-checks.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/post-build-checks.ps1 @@ -7,7 +7,7 @@ if (-not $IsWindows) { # DLLs with no exports Refresh-TestRoot -[string]$buildOutput = Run-VcpkgAndCaptureOutput @commonArgs install --overlay-ports="$PSScriptRoot/../e2e_ports" vcpkg-internal-dll-with-no-exports --no-binarycaching +[string]$buildOutput = Run-VcpkgAndCaptureOutput @commonArgs install --overlay-ports="$PSScriptRoot/../e2e-ports" vcpkg-internal-dll-with-no-exports --no-binarycaching if (-not $buildOutput.Contains("$packagesRoot\vcpkg-internal-dll-with-no-exports_x86-windows\debug\bin\no_exports.dll") ` -or -not $buildOutput.Contains("$packagesRoot\vcpkg-internal-dll-with-no-exports_x86-windows\bin\no_exports.dll") ` -or -not $buildOutput.Contains('set(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS enabled)')) { @@ -17,20 +17,20 @@ if (-not $buildOutput.Contains("$packagesRoot\vcpkg-internal-dll-with-no-exports # DLLs with wrong architecture Refresh-TestRoot mkdir "$TestingRoot/wrong-architecture" -Copy-Item -Recurse "$PSScriptRoot/../e2e_assets/test-dll-port-template" "$TestingRoot/wrong-architecture/test-dll" +Copy-Item -Recurse "$PSScriptRoot/../e2e-assets/test-dll-port-template" "$TestingRoot/wrong-architecture/test-dll" Run-Vcpkg env "$TestingRoot/wrong-architecture/test-dll/build.cmd" --Triplet x64-windows Throw-IfFailed $buildOutput = Run-VcpkgAndCaptureOutput @commonArgs install --overlay-ports="$TestingRoot/wrong-architecture" test-dll --no-binarycaching $expected = "warning: The following files were built for an incorrect architecture:`n" + ` -"warning: $packagesRoot\test-dll_x86-windows\debug\lib\test_dll.lib`n" + ` +"warning: $packagesRoot\test-dll_x86-windows\debug\lib\test_dll.lib`n" + ` " Expected: x86, but was x64`n" + ` -"warning: $packagesRoot\test-dll_x86-windows\lib\test_dll.lib`n" + ` +"warning: $packagesRoot\test-dll_x86-windows\lib\test_dll.lib`n" + ` " Expected: x86, but was x64`n" + ` "warning: The following files were built for an incorrect architecture:`n" + ` -"warning: $packagesRoot\test-dll_x86-windows\debug\bin\test_dll.dll`n" + ` +"warning: $packagesRoot\test-dll_x86-windows\debug\bin\test_dll.dll`n" + ` " Expected: x86, but was x64`n" + ` -"warning: $packagesRoot\test-dll_x86-windows\bin\test_dll.dll`n" + ` +"warning: $packagesRoot\test-dll_x86-windows\bin\test_dll.dll`n" + ` " Expected: x86, but was x64`n" if (-not $buildOutput.Replace("`r`n", "`n").Contains($expected)) { @@ -40,15 +40,15 @@ if (-not $buildOutput.Replace("`r`n", "`n").Contains($expected)) { # DLLs with no AppContainer bit Refresh-TestRoot mkdir "$TestingRoot/wrong-appcontainer" -Copy-Item -Recurse "$PSScriptRoot/../e2e_assets/test-dll-port-template" "$TestingRoot/wrong-appcontainer/test-dll" +Copy-Item -Recurse "$PSScriptRoot/../e2e-assets/test-dll-port-template" "$TestingRoot/wrong-appcontainer/test-dll" Run-Vcpkg env "$TestingRoot/wrong-appcontainer/test-dll/build.cmd" --Triplet x64-windows Throw-IfFailed $buildOutput = Run-VcpkgAndCaptureOutput --triplet x64-uwp "--x-buildtrees-root=$buildtreesRoot" "--x-install-root=$installRoot" "--x-packages-root=$packagesRoot" install --overlay-ports="$TestingRoot/wrong-appcontainer" test-dll --no-binarycaching $expected = "warning: The App Container bit must be set for Windows Store apps. The following DLLs do not have the App Container bit set:`n" + ` "`n" + ` -" $packagesRoot\test-dll_x64-uwp\debug\bin\test_dll.dll`n" + ` -" $packagesRoot\test-dll_x64-uwp\bin\test_dll.dll`n" +" $packagesRoot\test-dll_x64-uwp\debug\bin\test_dll.dll`n" + ` +" $packagesRoot\test-dll_x64-uwp\bin\test_dll.dll`n" if (-not $buildOutput.Replace("`r`n", "`n").Contains($expected)) { throw 'Did not detect DLL with wrong appcontainer.' @@ -57,25 +57,25 @@ if (-not $buildOutput.Replace("`r`n", "`n").Contains($expected)) { # Wrong CRT linkage Refresh-TestRoot mkdir "$TestingRoot/wrong-crt" -Copy-Item -Recurse "$PSScriptRoot/../e2e_assets/test-lib-port-template-dynamic-crt" "$TestingRoot/wrong-crt/test-lib" +Copy-Item -Recurse "$PSScriptRoot/../e2e-assets/test-lib-port-template-dynamic-crt" "$TestingRoot/wrong-crt/test-lib" Run-Vcpkg env "$TestingRoot/wrong-crt/test-lib/build.cmd" --Triplet x86-windows-static Throw-IfFailed $buildOutput = Run-VcpkgAndCaptureOutput --triplet x86-windows-static "--x-buildtrees-root=$buildtreesRoot" "--x-install-root=$installRoot" "--x-packages-root=$packagesRoot" install --overlay-ports="$TestingRoot/wrong-crt" test-lib --no-binarycaching $expected = "warning: The following binaries should use the Static Debug (/MTd) CRT.`n" + -" $packagesRoot\test-lib_x86-windows-static\debug\lib\both_lib.lib links with:`n" + -" Dynamic Debug (/MDd)`n" + -" Dynamic Release (/MD)`n" + -" $packagesRoot\test-lib_x86-windows-static\debug\lib\test_lib.lib links with: Dynamic Debug (/MDd)`n" + +" $packagesRoot\test-lib_x86-windows-static\debug\lib\both_lib.lib links with:`n" + +" Dynamic Debug (/MDd)`n" + +" Dynamic Release (/MD)`n" + +" $packagesRoot\test-lib_x86-windows-static\debug\lib\test_lib.lib links with: Dynamic Debug (/MDd)`n" + "To inspect the lib files, use:`n" + -" dumpbin.exe /directives mylibfile.lib`n" + +" dumpbin.exe /directives mylibfile.lib`n" + "warning: The following binaries should use the Static Release (/MT) CRT.`n" + -" $packagesRoot\test-lib_x86-windows-static\lib\both_lib.lib links with:`n" + -" Dynamic Debug (/MDd)`n" + -" Dynamic Release (/MD)`n" + -" $packagesRoot\test-lib_x86-windows-static\lib\test_lib.lib links with: Dynamic Release (/MD)`n" + +" $packagesRoot\test-lib_x86-windows-static\lib\both_lib.lib links with:`n" + +" Dynamic Debug (/MDd)`n" + +" Dynamic Release (/MD)`n" + +" $packagesRoot\test-lib_x86-windows-static\lib\test_lib.lib links with: Dynamic Release (/MD)`n" + "To inspect the lib files, use:`n" + -" dumpbin.exe /directives mylibfile.lib`n" +" dumpbin.exe /directives mylibfile.lib`n" if (-not $buildOutput.Replace("`r`n", "`n").Contains($expected)) { throw 'Did not detect lib with wrong CRT linkage.' } diff --git a/azure-pipelines/end-to-end-tests-dir/registries.ps1 b/azure-pipelines/end-to-end-tests-dir/registries.ps1 index 2002d312a5..b3134d91ab 100644 --- a/azure-pipelines/end-to-end-tests-dir/registries.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/registries.ps1 @@ -3,7 +3,7 @@ $env:X_VCPKG_REGISTRIES_CACHE = Join-Path $TestingRoot 'registries' New-Item -ItemType Directory -Force $env:X_VCPKG_REGISTRIES_CACHE | Out-Null -$builtinRegistryArgs = $commonArgs + @("--x-builtin-registry-versions-dir=$PSScriptRoot/../e2e_ports/versions") +$builtinRegistryArgs = $commonArgs + @("--x-builtin-registry-versions-dir=$PSScriptRoot/../e2e-ports/versions") Run-Vcpkg install @builtinRegistryArgs 'vcpkg-internal-e2e-test-port' Throw-IfNotFailed @@ -28,13 +28,13 @@ New-Item -Path $filesystemRegistry -ItemType Directory $filesystemRegistry = (Get-Item $filesystemRegistry).FullName Copy-Item -Recurse ` - -LiteralPath "$PSScriptRoot/../e2e_ports/vcpkg-internal-e2e-test-port" ` + -LiteralPath "$PSScriptRoot/../e2e-ports/vcpkg-internal-e2e-test-port" ` -Destination "$filesystemRegistry" New-Item ` -Path "$filesystemRegistry/versions" ` -ItemType Directory Copy-Item ` - -LiteralPath "$PSScriptRoot/../e2e_ports/versions/baseline.json" ` + -LiteralPath "$PSScriptRoot/../e2e-ports/versions/baseline.json" ` -Destination "$filesystemRegistry/versions/baseline.json" New-Item ` -Path "$filesystemRegistry/versions/v-" ` @@ -80,7 +80,7 @@ try git @gitConfigOptions switch --orphan $gitMainBranch Throw-IfFailed - Copy-Item -Recurse -LiteralPath "$PSScriptRoot/../e2e_ports/vcpkg-internal-e2e-test-port" -Destination . + Copy-Item -Recurse -LiteralPath "$PSScriptRoot/../e2e-ports/vcpkg-internal-e2e-test-port" -Destination . New-Item -Path './vcpkg-internal-e2e-test-port/foobar' -Value 'this is just to get a distinct git tree' $CurrentTest = 'git add -A' @@ -129,7 +129,7 @@ try git @gitConfigOptions switch --orphan $gitSecondaryBranch Throw-IfFailed - Copy-Item -Recurse -LiteralPath "$PSScriptRoot/../e2e_ports/vcpkg-internal-e2e-test-port2" -Destination . + Copy-Item -Recurse -LiteralPath "$PSScriptRoot/../e2e-ports/vcpkg-internal-e2e-test-port2" -Destination . New-Item -Path './vcpkg-internal-e2e-test-port2/foobaz' -Value 'this is just to get a distinct git tree' $CurrentTest = 'git add -A' diff --git a/azure-pipelines/end-to-end-tests-dir/regression-ports.ps1 b/azure-pipelines/end-to-end-tests-dir/regression-ports.ps1 index be08472c18..f67954bec5 100644 --- a/azure-pipelines/end-to-end-tests-dir/regression-ports.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/regression-ports.ps1 @@ -1,6 +1,6 @@ . $PSScriptRoot/../end-to-end-tests-prelude.ps1 if ($IsWindows) { - Run-Vcpkg install --overlay-ports="$PSScriptRoot/../e2e_ports/llvm-lto-lib" llvm-lto-lib:x64-windows-static + Run-Vcpkg install --overlay-ports="$PSScriptRoot/../e2e-ports/llvm-lto-lib" llvm-lto-lib:x64-windows-static Throw-IfFailed } diff --git a/azure-pipelines/end-to-end-tests-dir/upgrade.ps1 b/azure-pipelines/end-to-end-tests-dir/upgrade.ps1 new file mode 100644 index 0000000000..dacd0be1d3 --- /dev/null +++ b/azure-pipelines/end-to-end-tests-dir/upgrade.ps1 @@ -0,0 +1,48 @@ +. "$PSScriptRoot/../end-to-end-tests-prelude.ps1" + +git clone $VcpkgRoot "$TestingRoot/temp-repo" --local +try +{ + $env:VCPKG_ROOT = "$TestingRoot/temp-repo" + git -C "$TestingRoot/temp-repo" switch -d e1934f4a2a0c58bb75099d89ed980832379907fa # vcpkg-cmake @ 2022-12-22 + $output = Run-VcpkgAndCaptureOutput install vcpkg-cmake + Throw-IfFailed + if (-Not ($output -match 'vcpkg-cmake:[^ ]+ -> 2022-12-22')) + { + throw 'Unexpected vcpkg-cmake install' + } + + git -C "$TestingRoot/temp-repo" switch -d f6a5d4e8eb7476b8d7fc12a56dff300c1c986131 # vcpkg-cmake @ 2023-05-04 + $output = Run-VcpkgAndCaptureOutput upgrade + Throw-IfNotFailed + if (-Not ($output -match 'If you are sure you want to rebuild the above packages, run this command with the --no-dry-run option.')) + { + throw "Upgrade didn't handle dry-run correctly" + } + + if (-Not ($output -match '\* vcpkg-cmake:[^ ]+ -> 2023-05-04')) + { + throw "Upgrade didn't choose expected version" + } + + $output = Run-VcpkgAndCaptureOutput upgrade --no-dry-run + Throw-IfFailed + if (-Not ($output -match '\* vcpkg-cmake:[^ ]+ -> 2023-05-04')) + { + throw "Upgrade didn't choose expected version" + } + + if (-Not ($output -match 'vcpkg-cmake:[^:]+: REMOVED:')) + { + throw "Upgrade didn't remove" + } + + if (-Not ($output -match 'vcpkg-cmake:[^:]+: SUCCEEDED:')) + { + throw "Upgrade didn't install" + } +} +finally +{ + $env:VCPKG_ROOT = $VcpkgRoot +} diff --git a/azure-pipelines/end-to-end-tests-dir/vcpkg-root.ps1 b/azure-pipelines/end-to-end-tests-dir/vcpkg-root.ps1 index 03cd889ac4..2bd8247e66 100644 --- a/azure-pipelines/end-to-end-tests-dir/vcpkg-root.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/vcpkg-root.ps1 @@ -4,7 +4,7 @@ $CurrentTest = "VCPKG_ROOT" $targetMessage = 'ignoring mismatched VCPKG_ROOT environment value' -$commonArgs += @('install', "--x-manifest-root=$PSScriptRoot/../e2e_projects/overlays-vcpkg-empty-port") +$commonArgs += @('install', "--x-manifest-root=$PSScriptRoot/../e2e-projects/overlays-vcpkg-empty-port") $defaultOutput = Run-VcpkgAndCaptureOutput -TestArgs $commonArgs Throw-IfFailed @@ -23,13 +23,13 @@ try { } $env:VCPKG_ROOT = Join-Path $actualVcpkgRoot 'ports' # any existing directory that isn't the detected root - $differentPathOutput = Run-VcpkgAndCaptureOutput -TestArgs ($commonArgs + @('--debug')) + $differentPathOutput = Run-VcpkgAndCaptureOutput $commonArgs Throw-IfFailed if (-not ($differentPathOutput.Contains($targetMessage))) { throw 'Expected a warning about VCPKG_ROOT differing when the detected path differs from the configured path.' } - $setWithArgOutput = Run-VcpkgAndCaptureOutput -TestArgs ($commonArgs + @('--vcpkg-root', $actualVcpkgRoot, '--debug')) + $setWithArgOutput = Run-VcpkgAndCaptureOutput -TestArgs ($commonArgs + @('--vcpkg-root', $actualVcpkgRoot)) Throw-IfFailed if ($setWithArgOutput.Contains($targetMessage)) { throw 'Expected no warning about VCPKG_ROOT when the path is configured with a command line argument.' diff --git a/azure-pipelines/end-to-end-tests-dir/version-variable.ps1 b/azure-pipelines/end-to-end-tests-dir/version-variable.ps1 index 630b5d7ee0..c6d4c974ee 100644 --- a/azure-pipelines/end-to-end-tests-dir/version-variable.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/version-variable.ps1 @@ -1,6 +1,6 @@ . $PSScriptRoot/../end-to-end-tests-prelude.ps1 -$portsPath = "$PSScriptRoot/../e2e_ports/version-variable" +$portsPath = "$PSScriptRoot/../e2e-ports/version-variable" $CurrentTest = "version variable in portfile.cmake" Run-Vcpkg install @commonArgs ` diff --git a/azure-pipelines/end-to-end-tests-dir/versions.ps1 b/azure-pipelines/end-to-end-tests-dir/versions.ps1 index 8e20d2ff33..8921ed1061 100644 --- a/azure-pipelines/end-to-end-tests-dir/versions.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/versions.ps1 @@ -1,12 +1,12 @@ . $PSScriptRoot/../end-to-end-tests-prelude.ps1 -$versionFilesPath = "$PSScriptRoot/../e2e_ports/version-files" +$versionFilesPath = "$PSScriptRoot/../e2e-ports/version-files" # Ensure transitive packages can be used even if they add version constraints $CurrentTest = "transitive constraints without baseline" Run-Vcpkg install @commonArgs --dry-run ` "--x-builtin-ports-root=$versionFilesPath/transitive-constraints/ports" ` - "--x-manifest-root=$versionFilesPath/transitive-constraints" --debug + "--x-manifest-root=$versionFilesPath/transitive-constraints" Throw-IfFailed Refresh-TestRoot @@ -25,7 +25,7 @@ $portsRedirectArgsIncomplete = @( ) $CurrentTest = "x-verify-ci-versions (All files OK)" Write-Host $CurrentTest -Run-Vcpkg @portsRedirectArgsOK x-ci-verify-versions --verbose --debug +Run-Vcpkg @portsRedirectArgsOK x-ci-verify-versions --verbose Throw-IfFailed $CurrentTest = "x-verify-ci-versions (Incomplete)" @@ -77,7 +77,7 @@ if ($out -notmatch ".*error: while checking out baseline\.*") } $CurrentTest = "mismatched version database" -$out = Run-VcpkgAndCaptureOutput @commonArgs "--feature-flags=versions" install --x-manifest-root="$PSScriptRoot/../e2e_ports/mismatched-version-database" +$out = Run-VcpkgAndCaptureOutput @commonArgs "--feature-flags=versions" install --x-manifest-root="$PSScriptRoot/../e2e-ports/mismatched-version-database" Throw-IfNotFailed if (($out -notmatch ".*error: Failed to load port because versions are inconsistent*") -or ($out -notmatch ".*version database indicates that it should be arrow@6.0.0.20210925#4.*") -or diff --git a/azure-pipelines/end-to-end-tests-dir/z-applocalcpp.ps1 b/azure-pipelines/end-to-end-tests-dir/z-applocalcpp.ps1 index 90a3b8c23d..ec45796021 100644 --- a/azure-pipelines/end-to-end-tests-dir/z-applocalcpp.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/z-applocalcpp.ps1 @@ -1,18 +1,23 @@ if ($IsWindows) { . $PSScriptRoot/../end-to-end-tests-prelude.ps1 - # Paths to test projects - $buildDir = "$PSScriptRoot/../e2e_projects/applocal-test/build" - $pluginsDir = "$PSScriptRoot/../e2e_projects/applocal-test/plugins" - - Run-Vcpkg env "$buildDir/build.bat" - Run-Vcpkg env "$pluginsDir/azure_kinect_sensor_sdk/build.bat" - - # Tests z-applocal command - Run-Vcpkg z-applocal ` - --target-binary=$buildDir/main.exe ` - --installed-bin-dir=$buildDir + Refresh-TestRoot + Copy-Item -Recurse -LiteralPath "$PSScriptRoot/../e2e-projects/applocal" -Destination $TestingRoot + + # Tests basic z-applocal command + $basicDir = "$TestingRoot/applocal/basic" + Run-Vcpkg env "$basicDir/build.bat" + Require-FileNotExists $basicDir/mylib.dll + $applocalOutput = Run-VcpkgAndCaptureOutput z-applocal ` + --target-binary=$basicDir/main.exe ` + --installed-bin-dir=$basicDir/installed/bin Throw-IfFailed + if (-Not ($applocalOutput -match '.*\\applocal\\basic\\installed\\bin\\mylib\.dll -> .*\\applocal\\basic\\mylib\.dll.*')) + { + throw "z-applocal didn't copy dependent binary" + } + + Require-FileExists $basicDir/mylib.dll # Tests z-applocal command with no arguments Run-Vcpkg z-applocal @@ -20,17 +25,55 @@ if ($IsWindows) { # Tests z-applocal with no installed-bin-dir argument Run-Vcpkg z-applocal ` - --target-binary=$buildDir/main.exe + --target-binary=$basicDir/main.exe Throw-IfNotFailed # Tests z-applocal with no target-binary argument Run-Vcpkg z-applocal ` - --installed-bin-dir=$buildDir + --installed-bin-dir=$basicDir Throw-IfNotFailed # Tests deploy azure kinect sensor SDK plugins - Run-Vcpkg z-applocal ` - --target-binary=$pluginsDir/azure_kinect_sensor_sdk/main.exe ` - --installed-bin-dir=$pluginsDir/azure_kinect_sensor_sdk - Throw-IfFailed + $pluginsDir = "$TestingRoot/applocal/plugins" + Run-Vcpkg env "$pluginsDir/build.bat" + Require-FileNotExists "$pluginsDir/k4a.dll" + Require-FileNotExists "$pluginsDir/depthengine_2_0.dll" + $applocalOutput = Run-VcpkgAndCaptureOutput z-applocal ` + --target-binary=$pluginsDir/main.exe ` + --installed-bin-dir=$pluginsDir/installed/bin + Throw-IfFailed + if (-Not ($applocalOutput -match '.*\\applocal\\plugins\\installed\\bin\\k4a\.dll -> .*\\applocal\\plugins\\k4a\.dll.*')) + { + throw "z-applocal didn't copy dependent binary" + } + + if (-Not ($applocalOutput -match '.*\\applocal\\plugins\\installed\\tools\\azure-kinect-sensor-sdk\\depthengine_2_0\.dll -> .*\\applocal\\plugins\\depthengine_2_0\.dll.*')) + { + throw "z-applocal didn't copy xbox plugins" + } + + Require-FileExists "$pluginsDir/k4a.dll" + Require-FileExists "$pluginsDir/depthengine_2_0.dll" + + # Tests deploy azure kinect sensor SDK plugins from debug directories + $pluginsDebugDir = "$TestingRoot/applocal/plugins-debug" + Run-Vcpkg env "$pluginsDebugDir/build.bat" + Require-FileNotExists "$pluginsDebugDir/k4a.dll" + Require-FileNotExists "$pluginsDebugDir/depthengine_2_0.dll" + $applocalOutput = Run-VcpkgAndCaptureOutput z-applocal ` + --target-binary=$pluginsDebugDir/main.exe ` + --installed-bin-dir=$pluginsDebugDir/installed/debug/bin + Throw-IfFailed + if (-Not ($applocalOutput -match '.*\\applocal\\plugins-debug\\installed\\debug\\bin\\k4a\.dll -> .*\\applocal\\plugins-debug\\k4a\.dll.*')) + { + throw "z-applocal didn't copy dependent debug binary" + } + + if (-Not ($applocalOutput -match '.*\\applocal\\plugins-debug\\installed\\tools\\azure-kinect-sensor-sdk\\depthengine_2_0\.dll -> .*\\applocal\\plugins-debug\\depthengine_2_0\.dll.*')) + { + throw "z-applocal didn't copy xbox plugins" + } + + Require-FileExists "$pluginsDir/k4a.dll" + Require-FileExists "$pluginsDir/depthengine_2_0.dll" } diff --git a/azure-pipelines/end-to-end-tests-prelude.ps1 b/azure-pipelines/end-to-end-tests-prelude.ps1 index 43b4d4717d..f8ec6de480 100644 --- a/azure-pipelines/end-to-end-tests-prelude.ps1 +++ b/azure-pipelines/end-to-end-tests-prelude.ps1 @@ -6,15 +6,19 @@ $NuGetRoot = Join-Path $TestingRoot 'nuget' $NuGetRoot2 = Join-Path $TestingRoot 'nuget2' $ArchiveRoot = Join-Path $TestingRoot 'archives' $VersionFilesRoot = Join-Path $TestingRoot 'version-test' -$commonArgs = @( - "--triplet", - $Triplet, +$directoryArgs = @( "--x-buildtrees-root=$buildtreesRoot", "--x-install-root=$installRoot", "--x-packages-root=$packagesRoot", - "--overlay-ports=$PSScriptRoot/e2e_ports/overlays", - "--overlay-triplets=$PSScriptRoot/e2e_ports/triplets" + "--overlay-ports=$PSScriptRoot/e2e-ports/overlays", + "--overlay-triplets=$PSScriptRoot/e2e-ports/triplets" ) + +$commonArgs = @( + "--triplet", + $Triplet +) + $directoryArgs + $Script:CurrentTest = 'unassigned' function Refresh-TestRoot { @@ -94,27 +98,32 @@ function Write-Trace ([string]$text) { function Run-VcpkgAndCaptureOutput { Param( [Parameter(Mandatory = $false)] - [Switch]$EndToEndTestSilent, + [Switch]$ForceExe, [Parameter(ValueFromRemainingArguments)] [string[]]$TestArgs ) - $Script:CurrentTest = "$VcpkgPs1 $($testArgs -join ' ')" - if (!$EndToEndTestSilent) { Write-Host -ForegroundColor red $Script:CurrentTest } - $result = (& "$VcpkgPs1" @testArgs) | Out-String - if (!$EndToEndTestSilent) { Write-Host -ForegroundColor Gray $result } + $thisVcpkg = $VcpkgPs1; + if ($ForceExe) { + $thisVcpkg = $VcpkgExe; + } + + $Script:CurrentTest = "$thisVcpkg $($testArgs -join ' ')" + Write-Host -ForegroundColor red $Script:CurrentTest + $result = (& "$thisVcpkg" @testArgs) | Out-String + Write-Host -ForegroundColor Gray $result $result } function Run-Vcpkg { Param( [Parameter(Mandatory = $false)] - [Switch]$EndToEndTestSilent, + [Switch]$ForceExe, [Parameter(ValueFromRemainingArguments)] [string[]]$TestArgs ) - Run-VcpkgAndCaptureOutput -EndToEndTestSilent:$EndToEndTestSilent @TestArgs | Out-Null + Run-VcpkgAndCaptureOutput -ForceExe:$ForceExe @TestArgs | Out-Null } Refresh-TestRoot diff --git a/azure-pipelines/end-to-end-tests.ps1 b/azure-pipelines/end-to-end-tests.ps1 index 9db18b2099..7bf38b6d62 100755 --- a/azure-pipelines/end-to-end-tests.ps1 +++ b/azure-pipelines/end-to-end-tests.ps1 @@ -72,8 +72,9 @@ if ([string]::IsNullOrEmpty($VcpkgExe)) } } -$VcpkgExe = (Get-Item $VcpkgExe).FullName -$VcpkgPs1 = Join-Path ((Get-Item $VcpkgExe).Directory) "vcpkg.ps1" +$VcpkgItem = Get-Item $VcpkgExe +$VcpkgExe = $VcpkgItem.FullName +$VcpkgPs1 = Join-Path $VcpkgItem.Directory "vcpkg.ps1" [Array]$AllTests = Get-ChildItem $PSScriptRoot/end-to-end-tests-dir/*.ps1 if ($Filter -ne $Null) { @@ -99,7 +100,11 @@ $envvars = $envvars_clear + @("VCPKG_DOWNLOADS", "X_VCPKG_REGISTRIES_CACHE", "PA foreach ($Test in $AllTests) { - Write-Host -ForegroundColor Green "[end-to-end-tests.ps1] [$n/$m] Running suite $Test" + if ($env:GITHUB_ACTIONS) { + Write-Host -ForegroundColor Green "::group::[end-to-end-tests.ps1] [$n/$m] Running suite $Test" + } else { + Write-Host -ForegroundColor Green "[end-to-end-tests.ps1] [$n/$m] Running suite $Test" + } $envbackup = @{} foreach ($var in $envvars) @@ -136,8 +141,11 @@ foreach ($Test in $AllTests) } } } + if ($env:GITHUB_ACTIONS) { + Write-Host "::endgroup::" + } $n += 1 } Write-Host -ForegroundColor Green "[end-to-end-tests.ps1] All tests passed." -$LASTEXITCODE = 0 +$global:LASTEXITCODE = 0 diff --git a/azure-pipelines/nuget-package.signproj b/azure-pipelines/nuget-package.signproj new file mode 100644 index 0000000000..8b06ade997 --- /dev/null +++ b/azure-pipelines/nuget-package.signproj @@ -0,0 +1,36 @@ + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + NuGet + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + + + + + + diff --git a/azure-pipelines/pipelines.yml b/azure-pipelines/pipelines.yml deleted file mode 100644 index 4d4094f715..0000000000 --- a/azure-pipelines/pipelines.yml +++ /dev/null @@ -1,183 +0,0 @@ -variables: -- name: Codeql.Enabled - value: true -jobs: -- job: linux_gcc_9 - displayName: 'Ubuntu 20.04 with GCC 9, plus vcpkg-artifacts' - pool: - vmImage: 'ubuntu-20.04' - variables: - - name: 'VCPKG_ROOT' - value: $(Build.SourcesDirectory)/vcpkg-root - steps: - - bash: | - git clone https://github.com/microsoft/vcpkg "$VCPKG_ROOT" -n - git -C "$VCPKG_ROOT" checkout `cat vcpkg-init/vcpkg-scripts-sha.txt` - displayName: "Clone vcpkg repo to serve as root" - - task: NodeTool@0 - inputs: - versionSpec: '18.x' - displayName: 'Install Node.js' - - script: | - cd ce - - npm install -g @microsoft/rush - rc=$?; if [ $rc -ne 0 ]; then exit $rc ; fi - - rush update - rc=$?; if [ $rc -ne 0 ]; then exit $rc ; fi - - rush rebuild - rc=$?; if [ $rc -ne 0 ]; then exit $rc ; fi - - rush test - rc=$?; if [ $rc -ne 0 ]; then exit $rc ; fi - - rush lint - rc=$?; if [ $rc -ne 0 ]; then exit $rc ; fi - - if [ -n "$(git status --porcelain)" ]; then - echo "ERROR: Working directory is dirty. Are there test output files missing from the PR?" - git status - exit 1 - fi - displayName: 'Rush install, build and test vcpkg-artifacts' - - bash: | - cmake '-DCMAKE_CXX_FLAGS=-fprofile-arcs -ftest-coverage -fPIC -O0 -fsanitize=undefined -fsanitize=address' -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_BENCHMARKING=ON -DVCPKG_BUILD_FUZZING=ON -B build.amd64.debug - make -j 2 -C build.amd64.debug - displayName: "Build vcpkg with CMake" - failOnStderr: true - - bash: build.amd64.debug/vcpkg-test - displayName: 'Run vcpkg tests' - env: - VCPKG_ROOT: UNIT_TESTS_SHOULD_NOT_USE_VCPKG_ROOT - - task: PowerShell@2 - displayName: 'Run vcpkg end-to-end tests' - inputs: - filePath: 'azure-pipelines/end-to-end-tests.ps1' - workingDirectory: '$(Build.SourcesDirectory)/build.amd64.debug' - pwsh: true - - bash: | - sudo pip install gcovr - displayName: "Install coverage tools" - - bash: | - mkdir -p "$(Build.SourcesDirectory)/coverage" - cd build.amd64.debug - gcovr --xml --output "$(Build.SourcesDirectory)/coverage/coverage.xml" \ - --root "$(Build.SourcesDirectory)" \ - --exclude '(.+/)?CMakeFiles/' \ - --exclude '(.+/)?catch2/' \ - --exclude '(.+/)?vcpkg-fuzz/' \ - --exclude '(.+/)?vcpkg-test/' \ - --print-summary \ - . - displayName: "Analyse test coverage" - failOnStderr: true - - task: PublishCodeCoverageResults@1 - inputs: - codeCoverageTool: 'Cobertura' - summaryFileLocation: '$(Build.SourcesDirectory)/coverage/coverage.xml' - displayName: 'Publish test coverage results' -- job: osx - displayName: 'OSX' - pool: - vmImage: 'macOS-12' - variables: - - name: 'VCPKG_ROOT' - value: $(Build.SourcesDirectory)/vcpkg-root - steps: - - bash: | - git clone https://github.com/microsoft/vcpkg "$VCPKG_ROOT" -n - git -C "$VCPKG_ROOT" checkout `cat vcpkg-init/vcpkg-scripts-sha.txt` - displayName: "Clone vcpkg repo to serve as root" - - bash: | - cmake '-DCMAKE_CXX_FLAGS=-fsanitize=undefined -fsanitize=address' -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_BENCHMARKING=ON -DVCPKG_BUILD_FUZZING=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 -B build.amd64.debug - make -j 2 -C build.amd64.debug - displayName: "Build vcpkg with CMake" - failOnStderr: true - - bash: build.amd64.debug/vcpkg-test - displayName: 'Run vcpkg tests' - - bash: brew install pkg-config - displayName: 'Install pkgconfig' - - task: PowerShell@2 - displayName: 'Run vcpkg end-to-end tests' - inputs: - filePath: 'azure-pipelines/end-to-end-tests.ps1' - workingDirectory: '$(Build.SourcesDirectory)/build.amd64.debug' - pwsh: true -- job: windows - displayName: 'Windows' - timeoutInMinutes: 120 - pool: - vmImage: 'windows-2022' - variables: - - name: DiffFile - value: $(Build.ArtifactStagingDirectory)\format.diff - - name: 'VCPKG_ROOT' - value: $(Build.SourcesDirectory)\vcpkg-root - - name: Codeql.BuildIdentifier - value: vcpkg_cpp - - name: Codeql.Language - value: cpp - steps: - - task: Powershell@2 - displayName: "Clone vcpkg repo to serve as root" - inputs: - pwsh: true - targetType: inline - script: | - $sha = (Get-Content vcpkg-init/vcpkg-scripts-sha.txt -Raw).Trim() - git clone https://github.com/microsoft/vcpkg $env:VCPKG_ROOT -n - git -C "$env:VCPKG_ROOT" checkout $sha - - task: Powershell@2 - displayName: 'Format C++' - inputs: - filePath: 'azure-pipelines/Format-CxxCode.ps1' - pwsh: true - - task: UseNode@1 - displayName: Use Node 18 - inputs: - version: "18.x" - - task: npmAuthenticate@0 - inputs: - workingFile: 'ce\common\config\rush\.npmrc' - # The working directory change is to get the above .npmrc used when installing rush - - script: npm install -g @microsoft/rush - displayName: Install Rush - workingDirectory: ce\common\config\rush - - task: CodeQL3000Init@0 - displayName: 'CodeQL Initialize' - - task: CmdLine@2 - displayName: "Build vcpkg with CMake" - inputs: - script: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=x86 -host_arch=x86 - rmdir /s /q build.x86.debug > nul 2> nul - cmake.exe -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_BENCHMARKING=ON -DVCPKG_BUILD_FUZZING=ON -DVCPKG_BUILD_TLS12_DOWNLOADER=ON -DVCPKG_ARTIFACTS_DEVELOPMENT=ON -B build.x86.debug - ninja.exe -C build.x86.debug all generate-message-map - failOnStderr: true - - task: CodeQL3000Finalize@0 - displayName: 'CodeQL Finalize' - - task: Powershell@2 - displayName: 'Create Diff' - inputs: - filePath: azure-pipelines/Create-PRDiff.ps1 - arguments: '-DiffFile $(DiffFile)' - pwsh: true - - task: PublishBuildArtifacts@1 - condition: failed() - displayName: 'Publish Format and Messages File Diff' - inputs: - PathtoPublish: '$(DiffFile)' - ArtifactName: 'format.diff' - - script: build.x86.debug\vcpkg-test.exe - displayName: "Run vcpkg tests" - failOnStderr: true - env: - VCPKG_ROOT: UNIT_TESTS_SHOULD_NOT_USE_VCPKG_ROOT - - task: PowerShell@2 - displayName: 'Run vcpkg end-to-end tests' - inputs: - filePath: 'azure-pipelines/end-to-end-tests.ps1' - workingDirectory: '$(Build.SourcesDirectory)/build.x86.debug' - pwsh: true diff --git a/azure-pipelines/signing.yml b/azure-pipelines/signing.yml index 05d48d0df9..4daa22545f 100644 --- a/azure-pipelines/signing.yml +++ b/azure-pipelines/signing.yml @@ -69,69 +69,65 @@ jobs: pwsh: true targetType: 'inline' script: | + $headSha = &git rev-parse HEAD Write-Host "##vso[task.setvariable variable=VCPKG_BASE_VERSION;isOutput=true]$env:VCPKG_INITIAL_BASE_VERSION" + Write-Host "##vso[task.setvariable variable=VCPKG_FULL_VERSION;isOutput=true]$env:VCPKG_INITIAL_BASE_VERSION-$headSha" - task: Powershell@2 displayName: 'Lock Installer Scripts Versions' inputs: pwsh: true filePath: vcpkg-init/lock-versions.ps1 arguments: '-Destination "$(Build.BinariesDirectory)" -VcpkgBaseVersion $(VCPKG_INITIAL_BASE_VERSION)' - # Build and test vcpkg-artifacts - task: UseNode@1 displayName: Use Node 18 or later inputs: version: "18.x" - - script: copy azure-pipelines\.npmrc-internal ce\common\config\rush\.npmrc - displayName: Use internal .npmrc - - task: npmAuthenticate@0 - inputs: - workingFile: 'ce\common\config\rush\.npmrc' - # The working directory change is to get the above .npmrc used when installing rush - - script: npm install -g @microsoft/rush - displayName: Install Rush - workingDirectory: ce\common\config\rush - - script: | - set PATH=%PATH%;%APPDATA%\npm - rush update - displayName: Install vcpkg-artifacts Dependencies - workingDirectory: ce - - script: | - set PATH=%PATH%;%APPDATA%\npm - rush lint - displayName: Check vcpkg-artifacts for Linting Errors - workingDirectory: ce + - task: Npm@1 + inputs: + command: 'custom' + workingDir: 'vcpkg-artifacts' + customCommand: 'ci' + customRegistry: 'useFeed' + customFeed: '0bdbc590-a062-4c3f-b0f6-9383f67865ee/105b4584-173c-41aa-8061-612294abe099' + displayName: Restore vcpkg-artifacts Dev Dependencies + - task: ComponentGovernanceComponentDetection@0 + displayName: Detect Components + inputs: + sourceScanPath: vcpkg-artifacts - task: CodeQL3000Init@0 - displayName: 'CodeQL Initialize' + displayName: CodeQL Initialize - script: | - set PATH=%PATH%;%APPDATA%\npm - rush rebuild - displayName: Build vcpkg-artifacts Packages - workingDirectory: ce + mkdir "$(Build.BinariesDirectory)" + mkdir "$(Build.BinariesDirectory)\vcpkg-artifacts" + node "$(Build.SourcesDirectory)\vcpkg-artifacts\node_modules\typescript\bin\tsc" -p "$(Build.SourcesDirectory)\vcpkg-artifacts" --outDir "$(Build.BinariesDirectory)\vcpkg-artifacts" + displayName: Build TypeScript - task: CodeQL3000Finalize@0 - displayName: 'CodeQL Finalize' - - script: | - set PATH=%PATH%;%APPDATA%\npm - rush test - displayName: Run vcpkg-artifacts Tests - workingDirectory: ce - - script: | - set PATH=%PATH%;%APPDATA%\npm - rush set-versions - node -e "const c = require('./ce/package.json'); p = require('./assets/package.json') ; p.version = c.version; require('fs').writeFileSync('./assets/package.json', JSON.stringify(p,undefined,2)); console.log(``set asset version to `${p.version}``);" - displayName: Set vcpkg-artifacts Package Versions - workingDirectory: ce + displayName: CodeQL Finalize + - task: Npm@1 + inputs: + command: 'custom' + workingDir: 'vcpkg-artifacts' + customCommand: 'ci --omit=dev' + customRegistry: 'useFeed' + customFeed: '0bdbc590-a062-4c3f-b0f6-9383f67865ee/105b4584-173c-41aa-8061-612294abe099' + displayName: Restore vcpkg-artifacts Prod Dependencies + - script: | # This script must be kept in sync with vcpkg-artifacts-target in CMakeLists.txt + rmdir /s /q "$(Build.BinariesDirectory)\vcpkg-artifacts\test" + rmdir /s /q "$(Build.BinariesDirectory)\vcpkg-artifacts\test_resources" + mkdir "$(Build.BinariesDirectory)\vcpkg-artifacts\locales" + mkdir "$(Build.BinariesDirectory)\vcpkg-artifacts\node_modules" + xcopy /F /E "$(Build.SourcesDirectory)\vcpkg-artifacts\node_modules" "$(Build.BinariesDirectory)\vcpkg-artifacts\node_modules" + :: to avoid signing 'semver' .ps1s + rmdir /s /q "$(Build.BinariesDirectory)\vcpkg-artifacts\node_modules\.bin" + copy "$(Build.SourcesDirectory)\vcpkg-artifacts\package.json" "$(Build.BinariesDirectory)\vcpkg-artifacts\package.json" + copy "$(Build.SourcesDirectory)\vcpkg-artifacts\package-lock.json" "$(Build.BinariesDirectory)\vcpkg-artifacts\package-lock.json" + copy "$(Build.SourcesDirectory)\vcpkg-artifacts\.npmrc" "$(Build.BinariesDirectory)\vcpkg-artifacts\.npmrc" + copy "$(Build.SourcesDirectory)\vcpkg-artifacts\locales\messages.json" "$(Build.BinariesDirectory)\vcpkg-artifacts\locales\messages.json" + displayName: Delete Tests, Store Dependencies and Static Components for Signing - script: | - set PATH=%PATH%;%APPDATA%\npm - mkdir "$(Build.BinariesDirectory)\ce" && rush deploy -t "$(Build.BinariesDirectory)\ce" - displayName: Collect vcpkg-artifacts Dependencies - workingDirectory: ce - - script: | - xcopy /F "$(Build.SourcesDirectory)/scripts" "$(Build.BinariesDirectory)" - displayName: Collect PowerShell scripts - - task: ComponentGovernanceComponentDetection@0 - displayName: Detect Components - inputs: - sourceScanPath: "$(Build.BinariesDirectory)/ce" + mkdir "$(Build.BinariesDirectory)\scripts" + xcopy /F /E "$(Build.SourcesDirectory)\scripts" "$(Build.BinariesDirectory)\scripts" + displayName: Collect PowerShell Scripts for Signing - task: MicroBuildSigningPlugin@3 displayName: Install MicroBuild Signing inputs: @@ -154,9 +150,6 @@ jobs: solution: 'azure-pipelines\arch-independent-signing.signproj' msbuildArguments: '/p:OutDir=$(Build.BinariesDirectory)\ /p:IntermediateOutputPath=$(Build.BinariesDirectory)\' # Note that signing must happen before packing steps because the packs contain files that are themselves signed. - - script: | - copy "$(Build.SourcesDirectory)\NOTICE.txt" "$(Build.BinariesDirectory)\ce\NOTICE.txt" - displayName: Inject NOTICE File - script: | copy "$(Build.BinariesDirectory)\vcpkg-init.ps1" "$(Build.BinariesDirectory)\vcpkg-init.cmd" displayName: 'Duplicate Install Scripts' @@ -166,19 +159,17 @@ jobs: pwsh: true filePath: vcpkg-init/mint-standalone-bundle.ps1 arguments: '-DestinationTarball "$(Build.BinariesDirectory)\vcpkg-standalone-bundle.tar.gz" -TempDir standalone-temp -SignedFilesRoot "$(Build.BinariesDirectory)" -Deployment OneLiner -VcpkgBaseVersion "$(VCPKG_INITIAL_BASE_VERSION)"' - - script: npm pack - displayName: Create vcpkg-artifacts Pack - workingDirectory: $(Build.BinariesDirectory)/ce - script: | mkdir "$(Build.ArtifactStagingDirectory)\staging" - move "$(Build.BinariesDirectory)\ce\vcpkg-ce-*.tgz" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-ce.tgz" + mkdir "$(Build.ArtifactStagingDirectory)\staging\scripts" move "$(Build.BinariesDirectory)\vcpkg-standalone-bundle.tar.gz" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-standalone-bundle.tar.gz" move "$(Build.BinariesDirectory)\vcpkg-init" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init" move "$(Build.BinariesDirectory)\vcpkg-init.ps1" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init.ps1" move "$(Build.BinariesDirectory)\vcpkg-init.cmd" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init.cmd" - move "$(Build.BinariesDirectory)\applocal.ps1" "$(Build.ArtifactStagingDirectory)\staging\applocal.ps1" - move "$(Build.BinariesDirectory)\addPoshVcpkgToPowershellProfile.ps1" "$(Build.ArtifactStagingDirectory)\staging\addPoshVcpkgToPowershellProfile.ps1" - move "$(Build.BinariesDirectory)\posh-vcpkg.psm1" "$(Build.ArtifactStagingDirectory)\staging\posh-vcpkg.psm1" + move "$(Build.BinariesDirectory)\scripts\applocal.ps1" "$(Build.ArtifactStagingDirectory)\staging\scripts\applocal.ps1" + move "$(Build.BinariesDirectory)\scripts\addPoshVcpkgToPowershellProfile.ps1" "$(Build.ArtifactStagingDirectory)\staging\scripts\addPoshVcpkgToPowershellProfile.ps1" + move "$(Build.BinariesDirectory)\scripts\posh-vcpkg.psm1" "$(Build.ArtifactStagingDirectory)\staging\scripts\posh-vcpkg.psm1" + move "$(Build.BinariesDirectory)\vcpkg-artifacts" "$(Build.ArtifactStagingDirectory)\staging\vcpkg-artifacts" displayName: 'Arrange Architecture-independent Files for Staging' - task: Powershell@2 displayName: Generate Arch-independent SHA512s @@ -189,8 +180,6 @@ jobs: script: | $standaloneBundleSha = (Get-FileHash "$(Build.ArtifactStagingDirectory)\staging\vcpkg-standalone-bundle.tar.gz" -Algorithm SHA512).Hash.ToLowerInvariant() Write-Host "##vso[task.setvariable variable=VCPKG_STANDALONE_BUNDLE_SHA;isOutput=true]$standaloneBundleSha" - $ceSha = (Get-FileHash "$(Build.ArtifactStagingDirectory)\staging\vcpkg-ce.tgz" -Algorithm SHA512).Hash.ToLowerInvariant() - Write-Host "##vso[task.setvariable variable=VCPKG_CE_SHA;isOutput=true]$ceSha" - task: PublishBuildArtifacts@1 displayName: "Publish Architecture Independent Staging" inputs: @@ -205,7 +194,6 @@ jobs: vmImage: macOS-12 variables: VCPKG_STANDALONE_BUNDLE_SHA: $[ dependencies.arch_independent.outputs['shas.VCPKG_STANDALONE_BUNDLE_SHA'] ] - VCPKG_CE_SHA: $[ dependencies.arch_independent.outputs['shas.VCPKG_CE_SHA'] ] VCPKG_BASE_VERSION: $[ dependencies.arch_independent.outputs['versions.VCPKG_BASE_VERSION'] ] steps: - task: CmdLine@2 @@ -213,7 +201,7 @@ jobs: inputs: failOnStderr: true script: | - cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" "-DVCPKG_FMT_URL=$(fmt-tarball-url)" "-DVCPKG_CMAKERC_URL=$(cmakerc-tarball-url)" "-DVCPKG_BASE_VERSION=$VCPKG_BASE_VERSION" "-DVCPKG_STANDALONE_BUNDLE_SHA=$VCPKG_STANDALONE_BUNDLE_SHA" "-DVCPKG_CE_SHA=$VCPKG_CE_SHA" -B "$(Build.BinariesDirectory)/build" + cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" "-DVCPKG_FMT_URL=$(fmt-tarball-url)" "-DVCPKG_CMAKERC_URL=$(cmakerc-tarball-url)" "-DVCPKG_BASE_VERSION=$VCPKG_BASE_VERSION" "-DVCPKG_STANDALONE_BUNDLE_SHA=$VCPKG_STANDALONE_BUNDLE_SHA" -B "$(Build.BinariesDirectory)/build" 2>&1 make -j 8 -C "$(Build.BinariesDirectory)/build" zip -j "$(Build.ArtifactStagingDirectory)/vcpkg-macos.zip" "$(Build.BinariesDirectory)/build/vcpkg" - task: PublishBuildArtifacts@1 @@ -229,7 +217,6 @@ jobs: name: 'vcpkg-rhel-7-5' variables: VCPKG_STANDALONE_BUNDLE_SHA: $[ dependencies.arch_independent.outputs['shas.VCPKG_STANDALONE_BUNDLE_SHA'] ] - VCPKG_CE_SHA: $[ dependencies.arch_independent.outputs['shas.VCPKG_CE_SHA'] ] VCPKG_BASE_VERSION: $[ dependencies.arch_independent.outputs['versions.VCPKG_BASE_VERSION'] ] steps: - task: CmdLine@2 @@ -237,7 +224,7 @@ jobs: inputs: failOnStderr: true script: | - scl enable devtoolset-9 'cmake3 -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON -DCMAKE_CXX_FLAGS="-static-libgcc -static-libstdc++" "-DVCPKG_FMT_URL=$(fmt-tarball-url)" "-DVCPKG_CMAKERC_URL=$(cmakerc-tarball-url)" "-DVCPKG_BASE_VERSION=$VCPKG_BASE_VERSION" "-DVCPKG_STANDALONE_BUNDLE_SHA=$VCPKG_STANDALONE_BUNDLE_SHA" "-DVCPKG_CE_SHA=$VCPKG_CE_SHA" -B "$(Build.BinariesDirectory)/build"' + scl enable devtoolset-9 'cmake3 -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON -DCMAKE_CXX_FLAGS="-static-libgcc -static-libstdc++" "-DVCPKG_FMT_URL=$(fmt-tarball-url)" "-DVCPKG_CMAKERC_URL=$(cmakerc-tarball-url)" "-DVCPKG_BASE_VERSION=$VCPKG_BASE_VERSION" "-DVCPKG_STANDALONE_BUNDLE_SHA=$VCPKG_STANDALONE_BUNDLE_SHA" -B "$(Build.BinariesDirectory)/build"' 2>&1 make -j 4 -C "$(Build.BinariesDirectory)/build" mv "$(Build.BinariesDirectory)/build/vcpkg" "$(Build.ArtifactStagingDirectory)/vcpkg-glibc" - task: PublishBuildArtifacts@1 @@ -253,7 +240,6 @@ jobs: - arch_independent variables: VCPKG_STANDALONE_BUNDLE_SHA: $[ dependencies.arch_independent.outputs['shas.VCPKG_STANDALONE_BUNDLE_SHA'] ] - VCPKG_CE_SHA: $[ dependencies.arch_independent.outputs['shas.VCPKG_CE_SHA'] ] VCPKG_BASE_VERSION: $[ dependencies.arch_independent.outputs['versions.VCPKG_BASE_VERSION'] ] steps: - task: CmdLine@2 @@ -262,7 +248,7 @@ jobs: failOnStderr: false script: | docker login vcpkgdockercontainers.azurecr.io -u $(vcpkgdockercontainers-pull-username) -p $(vcpkgdockercontainers-pull-password) || exit 1 - docker build --build-arg "FMT_TARBALL_URL=$(fmt-tarball-url)" --build-arg "CMAKERC_TARBALL_URL=$(cmakerc-tarball-url)" -t vcpkg-muslc-image -f azure-pipelines/vcpkg-alpine/Dockerfile . || exit 1 + docker build --build-arg "FMT_TARBALL_URL=$(fmt-tarball-url)" --build-arg "CMAKERC_TARBALL_URL=$(cmakerc-tarball-url)" --build-arg "VCPKG_STANDALONE_BUNDLE_SHA=$(VCPKG_STANDALONE_BUNDLE_SHA)" --build-arg "VCPKG_BASE_VERSION=$(VCPKG_BASE_VERSION)" -t vcpkg-muslc-image -f azure-pipelines/vcpkg-alpine/Dockerfile . || exit 1 docker create -ti --name vcpkg-muslc-container vcpkg-muslc-image sh || exit 1 docker cp vcpkg-muslc-container:/build/vcpkg "$(Build.ArtifactStagingDirectory)/vcpkg-muslc" || exit 1 docker container rm vcpkg-muslc-container || exit 1 @@ -284,30 +270,30 @@ jobs: name: 'VSEngSS-MicroBuild2022-1ES' variables: VCPKG_STANDALONE_BUNDLE_SHA: $[ dependencies.arch_independent.outputs['shas.VCPKG_STANDALONE_BUNDLE_SHA'] ] - VCPKG_CE_SHA: $[ dependencies.arch_independent.outputs['shas.VCPKG_CE_SHA'] ] VCPKG_BASE_VERSION: $[ dependencies.arch_independent.outputs['versions.VCPKG_BASE_VERSION'] ] + VCPKG_FULL_VERSION: $[ dependencies.arch_independent.outputs['versions.VCPKG_FULL_VERSION'] ] Codeql.BuildIdentifier: vcpkg_cpp Codeql.Language: cpp steps: - task: CodeQL3000Init@0 displayName: 'CodeQL Initialize' - task: CmdLine@2 - displayName: "Build vcpkg x86 with CMake" + displayName: "Build vcpkg amd64 with CMake" inputs: failOnStderr: true script: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=x86 -host_arch=x86 + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 cmake.exe --version - cmake.exe -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_BUILD_TLS12_DOWNLOADER=ON -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON "-DVCPKG_FMT_URL=$(fmt-tarball-url)" "-DVCPKG_CMAKERC_URL=$(cmakerc-tarball-url)" "-DVCPKG_BASE_VERSION=$(VCPKG_BASE_VERSION)" "-DVCPKG_STANDALONE_BUNDLE_SHA=$(VCPKG_STANDALONE_BUNDLE_SHA)" "-DVCPKG_CE_SHA=$(VCPKG_CE_SHA)" -B "$(Build.BinariesDirectory)\x86" - ninja.exe -C "$(Build.BinariesDirectory)\x86" + cmake.exe -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_BUILD_TLS12_DOWNLOADER=ON -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON "-DVCPKG_FMT_URL=$(fmt-tarball-url)" "-DVCPKG_CMAKERC_URL=$(cmakerc-tarball-url)" "-DVCPKG_BASE_VERSION=$(VCPKG_BASE_VERSION)" "-DVCPKG_STANDALONE_BUNDLE_SHA=$(VCPKG_STANDALONE_BUNDLE_SHA)" -B "$(Build.BinariesDirectory)\amd64" + ninja.exe -C "$(Build.BinariesDirectory)\amd64" - task: CmdLine@2 displayName: "Build vcpkg arm64 with CMake" inputs: failOnStderr: true script: | - call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=arm64 -host_arch=x86 + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=arm64 -host_arch=amd64 cmake.exe --version - cmake.exe -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_BUILD_TLS12_DOWNLOADER=ON -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON -DVCPKG_PDB_SUFFIX="-arm64" "-DVCPKG_FMT_URL=$(fmt-tarball-url)" "-DVCPKG_CMAKERC_URL=$(cmakerc-tarball-url)" "-DVCPKG_BASE_VERSION=$(VCPKG_BASE_VERSION)" "-DVCPKG_STANDALONE_BUNDLE_SHA=$(VCPKG_STANDALONE_BUNDLE_SHA)" "-DVCPKG_CE_SHA=$(VCPKG_CE_SHA)" -B "$(Build.BinariesDirectory)\arm64" + cmake.exe -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_BUILD_TLS12_DOWNLOADER=ON -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON -DVCPKG_PDB_SUFFIX="-arm64" "-DVCPKG_FMT_URL=$(fmt-tarball-url)" "-DVCPKG_CMAKERC_URL=$(cmakerc-tarball-url)" "-DVCPKG_BASE_VERSION=$(VCPKG_BASE_VERSION)" "-DVCPKG_STANDALONE_BUNDLE_SHA=$(VCPKG_STANDALONE_BUNDLE_SHA)" -B "$(Build.BinariesDirectory)\arm64" ninja.exe -C "$(Build.BinariesDirectory)\arm64" - task: CodeQL3000Finalize@0 displayName: 'CodeQL Finalize' @@ -377,7 +363,7 @@ jobs: filePath: vcpkg-init/mint-standalone-bundle.ps1 arguments: '-DestinationDir "$(Build.ArtifactStagingDirectory)/vs-insertion/staging" -TempDir standalone-temp -SignedFilesRoot "$(Build.ArtifactStagingDirectory)\staging" -Deployment "VisualStudio" -VcpkgBaseVersion "$(VCPKG_BASE_VERSION)"' - task: CmdLine@2 - displayName: 'Arrange Drop' + displayName: 'Arrange Drop and Symbols' inputs: failOnStderr: true script: | @@ -388,20 +374,19 @@ jobs: move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-init" move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init.cmd" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-init.cmd" move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-init.ps1" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-init.ps1" - move "$(Build.ArtifactStagingDirectory)\staging\applocal.ps1" "$(Build.ArtifactStagingDirectory)\drop\applocal.ps1" - move "$(Build.ArtifactStagingDirectory)\staging\addPoshVcpkgToPowershellProfile.ps1" "$(Build.ArtifactStagingDirectory)\drop\addPoshVcpkgToPowershellProfile.ps1" - move "$(Build.ArtifactStagingDirectory)\staging\posh-vcpkg.psm1" "$(Build.ArtifactStagingDirectory)\drop\posh-vcpkg.psm1" - move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-ce.tgz" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-ce.tgz" + move "$(Build.ArtifactStagingDirectory)\staging\scripts\applocal.ps1" "$(Build.ArtifactStagingDirectory)\drop\applocal.ps1" + move "$(Build.ArtifactStagingDirectory)\staging\scripts\addPoshVcpkgToPowershellProfile.ps1" "$(Build.ArtifactStagingDirectory)\drop\addPoshVcpkgToPowershellProfile.ps1" + move "$(Build.ArtifactStagingDirectory)\staging\scripts\posh-vcpkg.psm1" "$(Build.ArtifactStagingDirectory)\drop\posh-vcpkg.psm1" move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-glibc" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-glibc" move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-muslc" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-muslc" move "$(Build.ArtifactStagingDirectory)\staging\vcpkg-standalone-bundle.tar.gz" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-standalone-bundle.tar.gz" - move "$(Build.BinariesDirectory)\x86\vcpkg.exe" "$(Build.ArtifactStagingDirectory)\drop\vcpkg.exe" + move "$(Build.BinariesDirectory)\amd64\vcpkg.exe" "$(Build.ArtifactStagingDirectory)\drop\vcpkg.exe" copy "$(Build.ArtifactStagingDirectory)\drop\vcpkg.exe" "$(Build.ArtifactStagingDirectory)\vs-insertion\staging\vcpkg.exe" - move "$(Build.BinariesDirectory)\x86\vcpkg.pdb" "$(Build.ArtifactStagingDirectory)\drop\vcpkg.pdb" - move "$(Build.BinariesDirectory)\x86\tls12-download.exe" "$(Build.ArtifactStagingDirectory)\drop\tls12-download.exe" - move "$(Build.BinariesDirectory)\x86\tls12-download.pdb" "$(Build.ArtifactStagingDirectory)\drop\tls12-download.pdb" + move "$(Build.BinariesDirectory)\amd64\vcpkg.pdb" "$(Build.ArtifactStagingDirectory)\drop\vcpkg.pdb" + move "$(Build.BinariesDirectory)\amd64\tls12-download.exe" "$(Build.ArtifactStagingDirectory)\drop\tls12-download.exe" + move "$(Build.BinariesDirectory)\amd64\tls12-download.pdb" "$(Build.ArtifactStagingDirectory)\drop\tls12-download.pdb" move "$(Build.BinariesDirectory)\arm64\vcpkg.exe" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-arm64.exe" move "$(Build.BinariesDirectory)\arm64\vcpkg-arm64.pdb" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-arm64.pdb" move "$(Build.BinariesDirectory)\arm64\tls12-download.exe" "$(Build.ArtifactStagingDirectory)\drop\tls12-download-arm64.exe" @@ -412,6 +397,16 @@ jobs: move "$(Build.ArtifactStagingDirectory)\staging\macos\vcpkg" "$(Build.ArtifactStagingDirectory)\drop\vcpkg-macos" copy "$(Build.SourcesDirectory)\azure-pipelines\vs-insertion\vcpkg.nuspec" "$(Build.ArtifactStagingDirectory)\vs-insertion\staging\vcpkg.nuspec" + + mkdir "$(Build.ArtifactStagingDirectory)\symbols" + copy "$(Build.ArtifactStagingDirectory)\drop\vcpkg.exe" "$(Build.ArtifactStagingDirectory)\symbols\vcpkg.exe" + copy "$(Build.ArtifactStagingDirectory)\drop\vcpkg.pdb" "$(Build.ArtifactStagingDirectory)\symbols\vcpkg.pdb" + copy "$(Build.ArtifactStagingDirectory)\drop\tls12-download.exe" "$(Build.ArtifactStagingDirectory)\symbols\tls12-download.exe" + copy "$(Build.ArtifactStagingDirectory)\drop\tls12-download.pdb" "$(Build.ArtifactStagingDirectory)\symbols\tls12-download.pdb" + copy "$(Build.ArtifactStagingDirectory)\drop\vcpkg-arm64.exe" "$(Build.ArtifactStagingDirectory)\symbols\vcpkg-arm64.exe" + copy "$(Build.ArtifactStagingDirectory)\drop\vcpkg-arm64.pdb" "$(Build.ArtifactStagingDirectory)\symbols\vcpkg-arm64.pdb" + copy "$(Build.ArtifactStagingDirectory)\drop\tls12-download-arm64.exe" "$(Build.ArtifactStagingDirectory)\symbols\tls12-download-arm64.exe" + copy "$(Build.ArtifactStagingDirectory)\drop\tls12-download-arm64.pdb" "$(Build.ArtifactStagingDirectory)\symbols\tls12-download-arm64.pdb" - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 displayName: 'Generate SBOMs' inputs: @@ -433,7 +428,12 @@ jobs: displayName: 'NuGet pack for VS Insertion' inputs: command: custom - arguments: 'pack $(Build.ArtifactStagingDirectory)/vs-insertion/staging/vcpkg.nuspec -NoDefaultExcludes -OutputDirectory "$(Build.ArtifactStagingDirectory)/vs-insertion/drop" -Properties version=$(VCPKG_BASE_VERSION)' + arguments: 'pack $(Build.ArtifactStagingDirectory)/vs-insertion/staging/vcpkg.nuspec -NoDefaultExcludes -OutputDirectory "$(Build.ArtifactStagingDirectory)/vs-insertion/drop" -Properties version=$(VCPKG_FULL_VERSION)' + - task: MSBuild@1 + displayName: 'Sign VS Insertion NuGet Package' + inputs: + solution: 'azure-pipelines\nuget-package.signproj' + msbuildArguments: '/p:OutDir=$(Build.ArtifactStagingDirectory)\vs-insertion\drop /p:IntermediateOutputPath=$(Build.ArtifactStagingDirectory)\vs-insertion\drop' - task: PublishBuildArtifacts@1 displayName: 'Publish nupkg as Artifact' inputs: @@ -441,50 +441,27 @@ jobs: ArtifactName: 'vs-insertion' publishLocation: 'Container' # Do compliance checks. - - task: BinSkim@3 + - task: BinSkim@4 inputs: InputType: 'CommandLine' arguments: 'analyze "$(Build.ArtifactStagingDirectory)\drop\vcpkg.exe" "$(Build.ArtifactStagingDirectory)\drop\tls12-download.exe" "$(Build.ArtifactStagingDirectory)\vcpkg-arm64.exe" "$(Build.ArtifactStagingDirectory)\tls12-download-arm64.exe"' - - task: PoliCheck@1 + - task: PoliCheck@2 inputs: inputType: 'Basic' targetType: 'F' targetArgument: '$(Build.ArtifactStagingDirectory)\drop' result: 'PoliCheck.xml' - - task: securedevelopmentteam.vss-secure-development-tools.build-task-credscan.CredScan@2 + - task: securedevelopmentteam.vss-secure-development-tools.build-task-credscan.CredScan@3 displayName: Run CredScan inputs: toolMajorVersion: V2 - - task: securedevelopmentteam.vss-secure-development-tools.build-task-postanalysis.PostAnalysis@1 + - task: securedevelopmentteam.vss-secure-development-tools.build-task-postanalysis.PostAnalysis@2 displayName: Check for compliance errors # To avoid spurious warnings about missing logs, explicitly declare what we scanned. inputs: BinSkim: true CredScan: true PoliCheck: true - # Trust Services Automation (TSA) can automatically open bugs for compliance issues. - # https://www.1eswiki.com/wiki/Trust_Services_Automation_(TSA) - - task: securedevelopmentteam.vss-secure-development-tools.build-task-uploadtotsa.TSAUpload@1 - displayName: Upload logs to TSA - inputs: - tsaVersion: TsaV2 - codebase: NewOrUpdate - codeBaseName: vcpkg - notificationAlias: vcpkg@microsoft.com - instanceUrlForTsaV2: DEVDIV - projectNameDEVDIV: DevDiv - areaPath: DevDiv\Cpp Language and Toolset\Acquisition and Release\Packaging\Vcpkg - iterationPath: DevDiv - # To avoid spurious warnings about missing logs, explicitly declare what we don't upload. - uploadAPIScan: false - uploadBinSkim: true - uploadFortifySCA: false - uploadFxCop: false - uploadModernCop: false - uploadPREfast: false - uploadRoslyn: false - uploadTSLint: false - condition: eq(variables['Build.SourceBranchName'], 'main') # Publish everything to a Drop - task: PublishBuildArtifacts@1 displayName: 'Publish Drop' @@ -498,8 +475,16 @@ jobs: condition: and(eq(variables.SignType, 'real'), succeeded()) inputs: command: push - packagesToPush: '$(Build.ArtifactStagingDirectory)/vs-insertion/drop/VS.Redist.Vcpkg.x86.1.0.0-$(VCPKG_BASE_VERSION).nupkg' + packagesToPush: '$(Build.ArtifactStagingDirectory)/vs-insertion/drop/VS.Redist.Vcpkg.amd64.1.0.0-$(VCPKG_FULL_VERSION).nupkg' publishVstsFeed: '97a41293-2972-4f48-8c0e-05493ae82010' + # Publish symbols + - task: MicroBuildArchiveSymbols@4 + displayName: 'Upload Symbols' + inputs: + SymbolsFeatureName: 'vcpkg' + SymbolsProject: 'VS' + SymbolsAgentPath: '$(Build.ArtifactStagingDirectory)\symbols' + azureSubscription: 'Symbols Upload (DevDiv)' # Publish everything to a GitHub Release - ${{ if eq(parameters.PublishTo, 'GitHub and NuGet') }}: - task: DownloadSecureFile@1 diff --git a/azure-pipelines/vcpkg-alpine/Dockerfile b/azure-pipelines/vcpkg-alpine/Dockerfile index 3018e08d2b..6515dfed8a 100644 --- a/azure-pipelines/vcpkg-alpine/Dockerfile +++ b/azure-pipelines/vcpkg-alpine/Dockerfile @@ -8,6 +8,10 @@ ARG FMT_TARBALL_URL ARG CMAKERC_TARBALL_URL -RUN cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_EMBED_GIT_SHA=OFF -DCMAKE_CXX_FLAGS="-static -s -static-libgcc -static-libstdc++" "-DVCPKG_FMT_URL=$FMT_TARBALL_URL" "-DVCPKG_CMAKERC_URL=$CMAKERC_TARBALL_URL" -S /source -B /build +ARG VCPKG_BASE_VERSION + +ARG VCPKG_STANDALONE_BUNDLE_SHA + +RUN cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DVCPKG_DEVELOPMENT_WARNINGS=ON -DVCPKG_WARNINGS_AS_ERRORS=ON -DVCPKG_BUILD_FUZZING=OFF -DVCPKG_EMBED_GIT_SHA=ON -DVCPKG_OFFICIAL_BUILD=ON -DCMAKE_CXX_FLAGS="-static -s -static-libgcc -static-libstdc++" "-DVCPKG_BASE_VERSION=$VCPKG_BASE_VERSION" "-DVCPKG_STANDALONE_BUNDLE_SHA=$VCPKG_STANDALONE_BUNDLE_SHA" "-DVCPKG_FMT_URL=$FMT_TARBALL_URL" "-DVCPKG_CMAKERC_URL=$CMAKERC_TARBALL_URL" -S /source -B /build 2>&1 RUN ninja -C build diff --git a/azure-pipelines/vs-insertion/vcpkg.nuspec b/azure-pipelines/vs-insertion/vcpkg.nuspec index b19e3e5ccc..e57749867b 100644 --- a/azure-pipelines/vs-insertion/vcpkg.nuspec +++ b/azure-pipelines/vs-insertion/vcpkg.nuspec @@ -1,7 +1,7 @@ - VS.Redist.Vcpkg.x86 + VS.Redist.Vcpkg.amd64 1.0.0-$version$ C++ Library Manager for Windows, Linux, and MacOS Microsoft diff --git a/ce/.eslintignore b/ce/.eslintignore deleted file mode 100644 index 0f10977a64..0000000000 --- a/ce/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -**/*.d.ts \ No newline at end of file diff --git a/ce/.scripts/for-each.js b/ce/.scripts/for-each.js deleted file mode 100644 index e238feb342..0000000000 --- a/ce/.scripts/for-each.js +++ /dev/null @@ -1,76 +0,0 @@ -const { spawn } = require('child_process'); -const { readFileSync } = require('fs'); -const { resolve } = require('path'); - -/** Reads a json/jsonc file and returns the JSON. - * - * Necessary because rush uses jsonc ( >,< ) - */ -function read(filename) { - const txt = readFileSync(filename, "utf8") - .replace(/\r/gm, "") - .replace(/\n/gm, "«") - .replace(/\/\*.*?\*\//gm, "") - .replace(/«/gm, "\n") - .replace(/\s+\/\/.*/g, ""); - return JSON.parse(txt); -} - -const repo = `${__dirname}/..`; - -const rush = read(`${repo}/rush.json`); -const pjs = {}; - -function forEachProject(onEach) { - // load all the projects - for (const each of rush.projects) { - const packageName = each.packageName; - const projectFolder = resolve(`${repo}/${each.projectFolder}`); - const project = JSON.parse(readFileSync(`${projectFolder}/package.json`)); - onEach(packageName, projectFolder, project); - } -} - -function npmForEach(cmd) { - let count = 0; - let failing = false; - const result = {}; - const procs = []; - const t1 = process.uptime() * 100; - forEachProject((name, location, project) => { - // checks for the script first - if (project.scripts[cmd]) { - count++; - const proc = spawn("npm", ["--silent", "run", cmd], { cwd: location, shell: true, stdio: "inherit" }); - procs.push(proc); - result[name] = { - name, location, project, proc, - }; - } - }); - - procs.forEach(proc => proc.on("close", (code, signal) => { - count--; - failing || !!code; - - if (count === 0) { - const t2 = process.uptime() * 100; - - console.log('---------------------------------------------------------'); - if (failing) { - console.log(` Done : command '${cmd}' - ${Math.floor(t2 - t1) / 100} s -- Errors encountered. `) - } else { - console.log(` Done : command '${cmd}' - ${Math.floor(t2 - t1) / 100} s -- No Errors `) - } - console.log('---------------------------------------------------------'); - process.exit(failing ? 1 : 0); - } - })); - - return result; -} - -module.exports.forEachProject = forEachProject; -module.exports.npm = npmForEach; -module.exports.projectCount = rush.projects.length; -module.exports.read = read; diff --git a/ce/.scripts/npm-run.js b/ce/.scripts/npm-run.js deleted file mode 100644 index ec4511a5ea..0000000000 --- a/ce/.scripts/npm-run.js +++ /dev/null @@ -1,2 +0,0 @@ -// Runs the npm run command on each project that has it. -require('./for-each').npm(process.argv[2]); \ No newline at end of file diff --git a/ce/.scripts/set-versions.js b/ce/.scripts/set-versions.js deleted file mode 100644 index 03de4048dc..0000000000 --- a/ce/.scripts/set-versions.js +++ /dev/null @@ -1,47 +0,0 @@ -const { exec } = require('child_process'); -const { writeFileSync } = require('fs'); -const { forEachProject, projectCount } = require('./for-each'); - -let count = projectCount; - - -function updateVersion(name, project, location, patch) { - const origJson = JSON.stringify(project, null, 2); - - // update the third digit - const verInfo = project.version.split('.'); - verInfo[2] = patch; - project.version = verInfo.join('.'); - - // write the file if it's changed - const newJson = JSON.stringify(project, null, 2); - if (origJson !== newJson) { - console.log(`Writing project '${name}' version to '${project.version}' in '${location}'`); - writeFileSync(`${location}/package.json`, newJson) - } - - count--; - if (count === 0) { - // last one! - // call sync-versions - require('./sync-versions'); - } -} - -if (process.argv[2] === '--reset') { - forEachProject((name, location, project) => { - updateVersion(name, project, location, 0); - }) -} else { - - // Sets the patch version on each package.json in the project. - forEachProject((name, location, project) => { - if (!process.argv[2] || process.argv[2] === name) { - exec(`git rev-list --parents HEAD --count --full-history ..`, { cwd: location }, (o, stdout) => { - const patch = (parseInt(stdout.trim()) + (Number(project.patchOffset) || -1)); - updateVersion(name, project, location, patch); - }); - } - }); -} - diff --git a/ce/.scripts/sync-versions.js b/ce/.scripts/sync-versions.js deleted file mode 100644 index 36c26b28b2..0000000000 --- a/ce/.scripts/sync-versions.js +++ /dev/null @@ -1,133 +0,0 @@ -const { readFileSync, writeFileSync } = require('fs'); -const { read } = require('./for-each'); - -const packageList = {}; -const rush = read(`${__dirname}/../rush.json`); -const pjs = {}; - -function writeIfChanged(filename, content) { - const orig = JSON.parse(readFileSync(filename)) - const origJson = JSON.stringify(orig, null, 2); - const json = JSON.stringify(content, null, 2); - - if (origJson !== json) { - console.log(`Writing updated file '${filename}'`) - writeFileSync(filename, json) - return true; - } - return false; -} - -function versionToInt(ver) { - let v = ver.replace(/[^\d\.]/g, '').split('.').slice(0, 3); - while (v.length < 3) { - v.unshift(0); - } - let n = 0; - for (let i = 0; i < v.length; i++) { - n = n + ((2 ** (i * 16)) * parseInt(v[v.length - 1 - i])) - } - return n; -} - -function setPeerDependencies(dependencies) { - for (const dep in dependencies) { - const ref = pjs[dep]; - if (ref) { - if (dependencies[dep] !== `~${ref.version}`) { - console.log(`updating peer depedency ${dep} to ~${ref.version}`); - dependencies[dep] = `~${ref.version}`; - } - } - } -} - - -function recordDeps(dependencies) { - for (const packageName in dependencies) { - const packageVersion = dependencies[packageName]; - if (packageList[packageName]) { - // same version? - if (packageList[packageName] === packageVersion) { - continue; - } - console.log(`${packageName} has ['${packageList[packageName]}','${packageVersion}']`); - - // pick the higher one - const v = versionToInt(packageVersion); - - if (v === 0) { - console.error(`Unparsed version ${packageName}:${packageVersion}`); - process.exit(1); - } - const v2 = versionToInt(packageList[packageName]); - if (v > v2) { - - packageList[packageName] = packageVersion; - } - } else { - packageList[packageName] = packageVersion; - } - } -} -function fixDeps(pj, dependencies) { - for (const packageName in dependencies) { - if (dependencies[packageName] !== packageList[packageName]) { - console.log(`updating ${pj}:${packageName} from '${dependencies[packageName]}' to '${packageList[packageName]}'`) - dependencies[packageName] = packageList[packageName]; - } - } -} - -// load all the projects -for (const each of rush.projects) { - const packageName = each.packageName; - const projectFolder = each.projectFolder; - pjs[packageName] = JSON.parse(readFileSync(`${__dirname}/../${projectFolder}/package.json`)); -} - -// verify that peer dependencies are the same version as they are building. -for (const pj of Object.getOwnPropertyNames(pjs)) { - const each = pjs[pj]; - setPeerDependencies(each.dependencies); - setPeerDependencies(each.devDependencies); - if (each['static-link']) { - setPeerDependencies(each['static-link'].dependencies); - } -} - -// now compare to see if someone has an external package with different version -// than everyone else. -for (const pj of Object.getOwnPropertyNames(pjs)) { - const each = pjs[pj]; - recordDeps(each.dependencies); - recordDeps(each.devDependencies); - if (each['static-link']) { - recordDeps(each['static-link'].dependencies); - } -} - -for (const pj of Object.getOwnPropertyNames(pjs)) { - const each = pjs[pj]; - fixDeps(pj, each.dependencies); - fixDeps(pj, each.devDependencies); - if (each['static-link']) { - fixDeps(pj, each['static-link'].dependencies); - } -} -var changed = 0; - -// write out the results. -for (const each of rush.projects) { - const packageName = each.packageName; - const projectFolder = each.projectFolder; - if (writeIfChanged(`${__dirname}/../${projectFolder}/package.json`, pjs[packageName])) { - changed++; - } -} - -if (changed) { - console.log(`Updated ${changed} files.`); -} else { - console.log('No changes made') -} \ No newline at end of file diff --git a/ce/.scripts/watch.js b/ce/.scripts/watch.js deleted file mode 100644 index cd3e491910..0000000000 --- a/ce/.scripts/watch.js +++ /dev/null @@ -1,33 +0,0 @@ -var cp = require('child_process'); - -require('./for-each').forEachProject((packageName, projectFolder, project) => { - if (project.scripts && project.scripts.watch) { - // NOTE: We deliberately use `tsc --watch --project ${projectFolder}` here - // with cwd at the repo root instead of `npm run watch` with cwd at project - // folder. This ensures that error messages put source file paths relative - // to the repo root, which then allows VS Code to navigate to error - // locations correctly. - const tsc = `${projectFolder}/node_modules/.bin/tsc`; - const args = ['--watch', '--project', projectFolder]; - console.log(`${tsc} ${args.join(' ')}`); - - const proc = cp.spawn(tsc, args, { cwd: `${__dirname}/../`, shell: true, stdio: "inherit" }); - proc.on("error", (c, s) => { - console.log(packageName); - console.error(c); - console.error(s); - }); - proc.on('exit', (c, s) => { - console.log(packageName); - console.error(c); - console.error(s); - }); - proc.on('message', (c, s) => { - console.log(packageName); - console.error(c); - console.error(s); - }) - } -}); - - diff --git a/ce/assets/NOTICE.txt b/ce/assets/NOTICE.txt deleted file mode 100644 index d3f5a12faa..0000000000 --- a/ce/assets/NOTICE.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/ce/assets/package.json b/ce/assets/package.json deleted file mode 100644 index 0d8c519614..0000000000 --- a/ce/assets/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "vcpkg-ce", - "version": "0.8.0", - "description": "vcpkg-artifacts", - "main": "ce/dist/main.js", - "bin": { - "ce_": "./ce/dist/main.js" - }, - "directories": { - "doc": "docs" - }, - "engines": { - "node": ">=16.0.0" - }, - "scripts": { - "postinstall": "node ./create-links create", - "uninstall": "node ./create-links remove", - "prepack": "node ./prepare-deploy.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/Microsoft/vcpkg-tool.git" - }, - "files": [ - "**/*" - ], - "keywords": [ - "vcpkg-artifacts", - "vcpkg" - ], - "author": "Microsoft", - "license": "MIT", - "bugs": { - "url": "https://github.com/Microsoft/vcpkg/issues" - }, - "homepage": "https://github.com/Microsoft/vcpkg#readme", - "readme": "https://github.com/Microsoft/vcpkg/blob/master/readme.md" -} diff --git a/ce/assets/prepare-deploy.js b/ce/assets/prepare-deploy.js deleted file mode 100644 index 24260ec3b9..0000000000 --- a/ce/assets/prepare-deploy.js +++ /dev/null @@ -1,10 +0,0 @@ -const { unlinkSync, writeFileSync } = require('fs'); -const { join } = require('path'); - -const file = join(__dirname, 'deploy-metadata.json'); -const metadata = require(file); - -const links = metadata.links; -metadata.links = links.filter(link => link.kind !== 'folderLink' || (link.linkPath.indexOf('/@types') === -1 && link.targetPath.indexOf('/typescript@') === -1)); -writeFileSync(file, JSON.stringify(metadata, null, 2)); -unlinkSync(__filename); \ No newline at end of file diff --git a/ce/ce.ps1 b/ce/ce.ps1 deleted file mode 100644 index 733a73eaa7..0000000000 --- a/ce/ce.ps1 +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -$ENV:NODE_OPTIONS="--enable-source-maps" - - -function resolve { - param ( [string] $name ) - $name = Resolve-Path $name -ErrorAction 0 -ErrorVariable _err - if (-not($name)) { return $_err[0].TargetObject } - $Error.clear() - return $name -} - - -if( $ENV:VCPKG_ROOT ) { - $SCRIPT:VCPKG_ROOT=(resolve $ENV:VCPKG_ROOT) - $ENV:VCPKG_ROOT=$VCPKG_ROOT -} else { - $SCRIPT:VCPKG_ROOT=(resolve "$HOME/.vcpkg") - $ENV:VCPKG_ROOT=$VCPKG_ROOT -} - -# setup the postscript file -# Generate 31 bits of randomness, to avoid clashing with concurrent executions. -$env:Z_VCPKG_POSTSCRIPT = resolve "${VCPKG_ROOT}/VCPKG_tmp_$(Get-Random -SetSeed $PID).ps1" - -node $PSScriptRoot/ce @args - -# dot-source the postscript file to modify the environment -if ($env:Z_VCPKG_POSTSCRIPT -and (Test-Path $env:Z_VCPKG_POSTSCRIPT)) { - # write-host (get-content -raw $env:Z_VCPKG_POSTSCRIPT) - $content = get-content -raw $env:Z_VCPKG_POSTSCRIPT - - if( $content ) { - iex $content - } - Remove-Item -Force $env:Z_VCPKG_POSTSCRIPT - remove-item -ea 0 -force env:Z_VCPKG_POSTSCRIPT -} diff --git a/ce/ce/.eslintrc.yaml b/ce/ce/.eslintrc.yaml deleted file mode 100644 index 0609828702..0000000000 --- a/ce/ce/.eslintrc.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -# configure plugins first -parser: "@typescript-eslint/parser" -plugins: -- "@typescript-eslint" -- "notice" - -# then inherit the common settings -extends: -- "../common/.default-eslintrc.yaml" \ No newline at end of file diff --git a/ce/ce/.npmignore b/ce/ce/.npmignore deleted file mode 100644 index 33986ae1f9..0000000000 --- a/ce/ce/.npmignore +++ /dev/null @@ -1,20 +0,0 @@ -!dist/**/* -src/ -dist/test/ -package/ -.npmignore -tsconfig.json -*.ts -changelog.md -.eslint* -!*.d.ts -*.tgz -.vscode -.scripts -attic/ -generated/ -notes.md -Examples/ -samples/ -*.log -package-deps.json diff --git a/ce/ce/.npmrc b/ce/ce/.npmrc deleted file mode 100644 index e97097d512..0000000000 --- a/ce/ce/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -registry=https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ -lockfileVersion=3 diff --git a/ce/ce/archivers/ZipUnpacker.ts b/ce/ce/archivers/ZipUnpacker.ts deleted file mode 100644 index d3b6729efb..0000000000 --- a/ce/ce/archivers/ZipUnpacker.ts +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { ProgressTrackingStream } from '../fs/streams'; -import { UnpackEvents } from '../interfaces/events'; -import { Session } from '../session'; -import { PercentageScaler } from '../util/percentage-scaler'; -import { Queue } from '../util/promise'; -import { Uri } from '../util/uri'; -import { UnpackOptions } from './options'; -import { implementUnpackOptions, pipeline } from './unpacker'; -import { ZipEntry, ZipFile } from './unzip'; - -async function unpackFile(session: Session, file: ZipEntry, archiveUri: Uri, outputUri: Uri, events: Partial, options: UnpackOptions) { - const extractPath = implementUnpackOptions(file.name, options); - if (extractPath) { - const destination = outputUri.join(extractPath); - const fileEntry = { - archiveUri, - destination, - path: file.name, - extractPath - }; - - events.unpackFileProgress?.(fileEntry, 0); - session.channels.debug(`unpacking ZIP file ${archiveUri}/${file.name} => ${destination}`); - await destination.parent.createDirectory(); - const readStream = await file.read(); - const mode = ((file.attr >> 16) & 0xfff); - - const writeStream = await destination.writeStream({ mtime: file.time, mode: mode ? mode : undefined }); - const progressStream = new ProgressTrackingStream(0, file.size); - progressStream.on('progress', (filePercentage) => events.unpackFileProgress?.(fileEntry, filePercentage)); - await pipeline(readStream, progressStream, writeStream); - events.unpackFileProgress?.(fileEntry, 100); - events.unpackFileComplete?.(fileEntry); - } -} - -export async function unpackZip(session: Session, archiveUri: Uri, outputUri: Uri, events: Partial, options: UnpackOptions): Promise { - session.channels.debug(`unpacking ZIP ${archiveUri} => ${outputUri}`); - events.unpackArchiveStart?.(archiveUri, outputUri); - const openedFile = await archiveUri.openFile(); - const zipFile = await ZipFile.read(openedFile); - if (options.strip === -1) { - // when strip == -1, strip off all common folders off the front of the file names - options.strip = 0; - const folders = [...zipFile.folders.keys()].sort((a, b) => a.length - b.length); - const files = [...zipFile.files.keys()]; - for (const folder of folders) { - if (files.all((filename) => filename.startsWith(folder))) { - options.strip = folder.split('/').length - 1; - continue; - } - break; - } - } - - const archiveProgress = new PercentageScaler(0, zipFile.files.size); - events.unpackArchiveProgress?.(archiveUri, 0); - const q = new Queue(); - let count = 0; - for (const file of zipFile.files.values()) { - void q.enqueue(async () => { - await unpackFile(session, file, archiveUri, outputUri, events, options); - events.unpackArchiveProgress?.(archiveUri, archiveProgress.scalePosition(count++)); - }); - } - - await q.done; - await zipFile.close(); - events.unpackArchiveProgress?.(archiveUri, 100); -} diff --git a/ce/ce/archivers/options.ts b/ce/ce/archivers/options.ts deleted file mode 100644 index 337d89bbb2..0000000000 --- a/ce/ce/archivers/options.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -/** Unpacker output options */ - -export interface UnpackOptions { - /** - * Strip # directories from the path - * - * Typically used to remove excessive nested folders off the front of the paths in an archive. - */ - strip?: number; - - /** - * A regular expression to transform filenames during unpack. If the resulting file name is empty, it is not emitted. - */ - transform?: Array; -} diff --git a/ce/ce/archivers/tar.ts b/ce/ce/archivers/tar.ts deleted file mode 100644 index 4b71022ec5..0000000000 --- a/ce/ce/archivers/tar.ts +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { fail } from 'assert'; -import { pipeline as origPipeline, Readable, Transform } from 'stream'; -import { extract as tarExtract, Headers } from 'tar-stream'; -import { promisify } from 'util'; -import { createGunzip } from 'zlib'; -import { ProgressTrackingStream } from '../fs/streams'; -import { UnifiedFileSystem } from '../fs/unified-filesystem'; -import { i } from '../i18n'; -import { UnpackEvents } from '../interfaces/events'; -import { Session } from '../session'; -import { Uri } from '../util/uri'; -import { UnpackOptions } from './options'; -import { implementUnpackOptions } from './unpacker'; - -export const pipeline = promisify(origPipeline); -// eslint-disable-next-line @typescript-eslint/no-var-requires -const bz2 = <() => Transform>require('unbzip2-stream'); - -async function maybeUnpackEntry(session: Session, archiveUri: Uri, outputUri: Uri, events: Partial, options: UnpackOptions, header: Headers, stream: Readable): Promise { - const streamPromise = new Promise((accept, reject) => { - stream.on('end', accept); - stream.on('error', reject); - }); - - try { - const extractPath = implementUnpackOptions(header.name, options); - let destination: Uri | undefined = undefined; - if (extractPath) { - destination = outputUri.join(extractPath); - } - - if (destination) { - switch (header?.type) { - case 'symlink': { - const linkTargetUri = destination?.parent.join(header.linkname!) || fail(''); - await destination.parent.createDirectory(); - await (session.fileSystem).filesystem(linkTargetUri).createSymlink(linkTargetUri, destination!); - } - return; - - case 'link': { - // this should be a 'hard-link' -- but I'm not sure if we can make hardlinks on windows. todo: find out - const linkTargetUri = outputUri.join(implementUnpackOptions(header.linkname!, options)!); - // quick hack - await destination.parent.createDirectory(); - await (session.fileSystem).filesystem(linkTargetUri).createSymlink(linkTargetUri, destination!); - } - return; - - case 'directory': - session.channels.debug(`in ${archiveUri.fsPath} skipping directory ${header.name}`); - return; - - case 'file': - // files handle below - break; - - default: - session.channels.warning(i`in ${archiveUri.fsPath} skipping ${header.name} because it is a ${header?.type || ''}`); - return; - } - - const fileEntry = { - archiveUri: archiveUri, - destination: destination, - path: header.name, - extractPath: extractPath - }; - - session.channels.debug(`unpacking TAR ${archiveUri}/${header.name} => ${destination}`); - events.unpackFileProgress?.(fileEntry, 0); - - if (header.size) { - const parentDirectory = destination.parent; - await parentDirectory.createDirectory(); - const fileProgress = new ProgressTrackingStream(0, header.size); - fileProgress.on('progress', (filePercentage) => events.unpackFileProgress?.(fileEntry, filePercentage)); - const writeStream = await destination.writeStream({ mtime: header.mtime, mode: header.mode }); - await pipeline(stream, fileProgress, writeStream); - } - - events.unpackFileProgress?.(fileEntry, 100); - events.unpackFileComplete?.(fileEntry); - } - - } finally { - stream.resume(); - await streamPromise; - } -} - -async function getAutoStrip(archiveUri: Uri, decompressorFactory?: () => Transform): Promise { - const archiveFileStream = await archiveUri.readStream(0, await archiveUri.size()); - let result = 0; - const folders = new Array(); - const files = new Array(); - - const extractor = tarExtract().on('entry', (header, stream, next) => { - switch (header.type) { - case 'directory': - folders.push(header.name); - break; - - case 'symlink': - case 'link': - files.push(header.linkname!); - break; - - default: - files.push(header.name); - break; - } - next(); - }); - - - if (decompressorFactory) { - await pipeline(archiveFileStream, decompressorFactory(), extractor); - } else { - await pipeline(archiveFileStream, extractor); - } - - for (const folder of folders.sort((a, b) => a.length - b.length)) { - if (files.all((filename) => filename.startsWith(folder))) { - result = folder.split('/').length - 1; - continue; - } - break; - } - - return result; -} - -async function unpackTarImpl(session: Session, archiveUri: Uri, outputUri: Uri, events: Partial, options: UnpackOptions, decompressorFactory?: () => Transform): Promise { - events.unpackArchiveStart?.(archiveUri, outputUri); - if (options.strip === -1) { - options.strip = await getAutoStrip(archiveUri, decompressorFactory); - } - - const archiveSize = await archiveUri.size(); - const archiveFileStream = await archiveUri.readStream(0, archiveSize); - const archiveProgress = new ProgressTrackingStream(0, archiveSize); - const tarExtractor = tarExtract(); - - tarExtractor.on('entry', (header, stream, next) => { - return maybeUnpackEntry(session, archiveUri, outputUri, events, options, header, stream).then(() => { - events.unpackArchiveProgress?.(archiveUri, archiveProgress.currentPercentage); - next(); - }).catch(err => (next)(err)); - }); - if (decompressorFactory) { - await pipeline(archiveFileStream, archiveProgress, decompressorFactory(), tarExtractor); - } else { - await pipeline(archiveFileStream, archiveProgress, tarExtractor); - } -} - -export function unpackTar(session: Session, archiveUri: Uri, outputUri: Uri, events: Partial, options: UnpackOptions): Promise { - session.channels.debug(`unpacking TAR ${archiveUri} => ${outputUri}`); - return unpackTarImpl(session, archiveUri, outputUri, events, options); -} - - -export function unpackTarGz(session: Session, archiveUri: Uri, outputUri: Uri, events: Partial, options: UnpackOptions): Promise { - session.channels.debug(`unpacking TAR.GZ ${archiveUri} => ${outputUri}`); - return unpackTarImpl(session, archiveUri, outputUri, events, options, createGunzip); -} - -export function unpackTarBz(session: Session, archiveUri: Uri, outputUri: Uri, events: Partial, options: UnpackOptions): Promise { - session.channels.debug(`unpacking TAR.BZ2 ${archiveUri} => ${outputUri}`); - return unpackTarImpl(session, archiveUri, outputUri, events, options, () => { - const decompressor = bz2(); - (decompressor).autoDestroy = false; - return decompressor; - }); -} diff --git a/ce/ce/archivers/unpacker.ts b/ce/ce/archivers/unpacker.ts deleted file mode 100644 index 62a0d0a0d0..0000000000 --- a/ce/ce/archivers/unpacker.ts +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { sed } from 'sed-lite'; -import { pipeline as origPipeline } from 'stream'; -import { promisify } from 'util'; -import { UnpackEvents } from '../interfaces/events'; -import { Session } from '../session'; -import { Uri } from '../util/uri'; -import { UnpackOptions } from './options'; - -export const pipeline = promisify(origPipeline); - -export interface FileEntry { - archiveUri: Uri; - destination: Uri | undefined; - path: string; - extractPath: string | undefined; -} - -/** - * Returns a new path string such that the path has prefixCount path elements removed, and directory - * separators normalized to a single forward slash. - * If prefixCount is greater than or equal to the number of path elements in the path, undefined is returned. - */ -export function stripPath(path: string, prefixCount: number): string | undefined { - const elements = path.split(/[\\/]+/); - const hasLeadingSlash = elements.length !== 0 && elements[0].length === 0; - const hasTrailingSlash = elements.length !== 0 && elements[elements.length - 1].length === 0; - let countForUndefined = prefixCount; - if (hasLeadingSlash) { - ++countForUndefined; - } - - if (hasTrailingSlash) { - ++countForUndefined; - } - - if (elements.length <= countForUndefined) { - return undefined; - } - - if (hasLeadingSlash) { - return '/' + elements.splice(prefixCount + 1).join('/'); - } - - return elements.splice(prefixCount).join('/'); -} - -/** - * Apply OutputOptions to a path before extraction. - * @param entry The initial path to a file to unpack. - * @param options Options to apply to that file name. - * @returns If the file is to be emitted, the path to use; otherwise, undefined. - */ -export function implementUnpackOptions(path: string, options: UnpackOptions): string | undefined { - if (options.strip) { - const maybeStripped = stripPath(path, options.strip); - if (maybeStripped) { - path = maybeStripped; - } else { - return undefined; - } - } - - if (options.transform) { - for (const transformExpr of options.transform) { - if (!path) { - break; - } - - const sedTransformExpr = sed(transformExpr); - path = sedTransformExpr(path); - } - } - - return path; -} - -export type Unpacker = (session: Session, archiveUri: Uri, outputUri: Uri, events: Partial, options: UnpackOptions) => Promise; diff --git a/ce/ce/archivers/unzip.ts b/ce/ce/archivers/unzip.ts deleted file mode 100644 index b22270fa71..0000000000 --- a/ce/ce/archivers/unzip.ts +++ /dev/null @@ -1,797 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -/** - * @license node-stream-zip | (c) 2020 Antelle | https://github.com/antelle/node-stream-zip/blob/master/LICENSE - * Portions copyright https://github.com/cthackers/adm-zip | https://raw.githubusercontent.com/cthackers/adm-zip/master/LICENSE - */ - -import { Readable, Transform, TransformCallback } from 'stream'; -import { constants, createInflateRaw } from 'zlib'; -import { ReadHandle } from '../fs/filesystem'; - -interface ZipParseState { - window: FileWindowBuffer; - totalReadLength: number; - minPos: number; - lastPos: any; - chunkSize: any; - firstByte: number; - sig: number; - lastBufferPosition?: number; - pos: number; - entry: ZipEntry | null; - entriesLeft: number; - move: boolean; -} - -export class ZipFile { - private centralDirectory!: CentralDirectoryHeader; - private chunkSize = 0; - private state!: ZipParseState; - private fileSize = 0; - - /** file entries in the zip file */ - public files = new Map(); - - /** folder entries in the zip file */ - public folders = new Map(); - - /** - * archive comment - */ - public comment?: string; - - static async read(readHandle: ReadHandle) { - const result = new ZipFile(readHandle); - await result.readCentralDirectory(); - return result; - } - - close() { - return this.readHandle.close(); - } - - private constructor(private readHandle: ReadHandle) { - } - - private async readUntilFound(): Promise { - let pos = this.state.lastPos; - let bufferPosition = pos - this.state.window.position; - const buffer = this.state.window.buffer; - const minPos = this.state.minPos; - while (--pos >= minPos && --bufferPosition >= 0) { - if (buffer.length - bufferPosition >= 4 && buffer[bufferPosition] === this.state.firstByte) { - // quick check first signature byte - if (buffer.readUInt32LE(bufferPosition) === this.state.sig) { - this.state.lastBufferPosition = bufferPosition; - return; - } - } - } - if (pos === minPos) { - throw new Error('Bad archive'); - } - - this.state.lastPos = pos + 1; - this.state.chunkSize *= 2; - if (pos <= minPos) { - throw new Error('Bad archive'); - } - - const expandLength = Math.min(this.state.chunkSize, pos - minPos); - await this.state.window.expandLeft(expandLength); - return this.readUntilFound(); - } - - async readCentralDirectory() { - this.fileSize = await this.readHandle.size(); - this.chunkSize = this.chunkSize || Math.round(this.fileSize / 1000); - this.chunkSize = Math.max( - Math.min(this.chunkSize, Math.min(128 * 1024, this.fileSize)), - Math.min(1024, this.fileSize) - ); - - const totalReadLength = Math.min(consts.ENDHDR + consts.MAXFILECOMMENT, this.fileSize); - this.state = { - window: new FileWindowBuffer(this.readHandle), - totalReadLength, - minPos: this.fileSize - totalReadLength, - lastPos: this.fileSize, - chunkSize: Math.min(1024, this.chunkSize), - firstByte: consts.ENDSIGFIRST, - sig: consts.ENDSIG, - }; - await this.state.window.read(this.fileSize - this.state.chunkSize, this.state.chunkSize); - await this.readUntilFound(); - - const buffer = this.state.window.buffer; - const pos = this.state.lastBufferPosition || 0; - - this.centralDirectory = new CentralDirectoryHeader(buffer.slice(pos, pos + consts.ENDHDR)); - - this.centralDirectory.headerOffset = this.state.window.position + pos; - this.comment = this.centralDirectory.commentLength ? buffer.slice(pos + consts.ENDHDR, pos + consts.ENDHDR + this.centralDirectory.commentLength).toString() : undefined; - - if ((this.centralDirectory.volumeEntries === consts.EF_ZIP64_OR_16 && this.centralDirectory.totalEntries === consts.EF_ZIP64_OR_16) || this.centralDirectory.size === consts.EF_ZIP64_OR_32 || this.centralDirectory.offset === consts.EF_ZIP64_OR_32) { - return this.readZip64CentralDirectoryLocator(); - } else { - this.state = {}; - return this.readEntries(); - } - } - - private async readZip64CentralDirectoryLocator() { - const length = consts.ENDL64HDR; - if (this.state.lastBufferPosition! > length) { - this.state.lastBufferPosition! -= length; - } else { - this.state = { - window: this.state.window, - totalReadLength: length, - minPos: this.state.window.position - length, - lastPos: this.state.window.position, - chunkSize: this.state.chunkSize, - firstByte: consts.ENDL64SIGFIRST, - sig: consts.ENDL64SIG, - }; - await this.state.window.read(this.state.lastPos - this.state.chunkSize, this.state.chunkSize); - await this.readUntilFound(); - } - - let buffer = this.state.window.buffer; - const locHeader = new CentralDirectoryLoc64Header( - buffer.slice(this.state.lastBufferPosition, this.state.lastBufferPosition! + consts.ENDL64HDR) - ); - const readLength = this.fileSize - locHeader.headerOffset; - this.state = { - window: this.state.window, - totalReadLength: readLength, - minPos: locHeader.headerOffset, - lastPos: this.state.lastPos, - chunkSize: this.state.chunkSize, - firstByte: consts.END64SIGFIRST, - sig: consts.END64SIG, - }; - await this.state.window.read(this.fileSize - this.state.chunkSize, this.state.chunkSize); - await this.readUntilFound(); - - buffer = this.state.window.buffer; - const zip64cd = new CentralDirectoryZip64Header(buffer.slice(this.state.lastBufferPosition, this.state.lastBufferPosition! + consts.END64HDR)); - this.centralDirectory.volumeEntries = zip64cd.volumeEntries; - this.centralDirectory.totalEntries = zip64cd.totalEntries; - this.centralDirectory.size = zip64cd.size; - this.centralDirectory.offset = zip64cd.offset; - - this.state = {}; - return this.readEntries(); - } - - private async readEntries() { - this.state = { - window: new FileWindowBuffer(this.readHandle), - pos: this.centralDirectory.offset, - chunkSize: this.chunkSize, - entriesLeft: this.centralDirectory.volumeEntries, - }; - - await this.state.window.read(this.state.pos, Math.min(this.chunkSize, this.fileSize - this.state.pos)); - - while (this.state.entriesLeft) { - let bufferPos = this.state.pos - this.state.window.position; - let entry = this.state.entry; - const buffer = this.state.window.buffer; - const bufferLength = buffer.length; - - if (!entry) { - entry = new ZipEntry(this, buffer, bufferPos); - entry.headerOffset = this.state.window.position + bufferPos; - this.state.entry = entry; - this.state.pos += consts.CENHDR; - bufferPos += consts.CENHDR; - } - const entryHeaderSize = entry.fnameLen + entry.extraLen + entry.comLen; - const advanceBytes = entryHeaderSize + (this.state.entriesLeft > 1 ? consts.CENHDR : 0); - - // if there isn't enough bytes read, read 'em. - if (bufferLength - bufferPos < advanceBytes) { - await this.state.window.moveRight(bufferPos); - continue; - } - - entry.processFilename(buffer, bufferPos); - entry.validateName(); - if (entry.isDirectory) { - this.folders.set(entry.name, entry); - } else { - this.files.set(entry.name, entry); - } - - this.state.entry = entry = null; - this.state.entriesLeft--; - this.state.pos += entryHeaderSize; - bufferPos += entryHeaderSize; - } - } - - private dataOffset(entry: ZipEntry) { - return entry.offset + consts.LOCHDR + entry.fnameLen + entry.extraLen; - } - - /** @internal */ - async openEntry(entry: ZipEntry) { - // is this a file? - if (!entry.isFile) { - throw new Error(`Entry ${entry} not is not a file`); - } - - // let's check to see if it's encrypted. - const buffer = Buffer.alloc(consts.LOCHDR); - await this.readHandle.readComplete(buffer, 0, buffer.length, entry.offset); - - entry.parseDataHeader(buffer); - if (entry.encrypted) { - throw new Error('Entry encrypted'); - } - - const offset = this.dataOffset((entry)); - let entryStream = this.readHandle.readStream(offset, offset + entry.compressedSize - 1); - - if (entry.method === consts.STORED) { - // nothing to do - } else if (entry.method === consts.DEFLATED) { - entryStream = entryStream.pipe(createInflateRaw({ flush: constants.Z_SYNC_FLUSH })); - } else { - throw new Error('Unknown compression method: ' + entry.method); - } - - // should check CRC? - if ((entry.flags & 0x8) === 0x8) { - entryStream = entryStream.pipe(createVerifier(entry.crc, entry.size)); - } - - return entryStream; - } -} - -const consts = { - /* The local file header */ - LOCHDR: 30, // LOC header size - LOCSIG: 0x04034b50, // "PK\003\004" - LOCVER: 4, // version needed to extract - LOCFLG: 6, // general purpose bit flag - LOCHOW: 8, // compression method - LOCTIM: 10, // modification time (2 bytes time, 2 bytes date) - LOCCRC: 14, // uncompressed file crc-32 value - LOCSIZ: 18, // compressed size - LOCLEN: 22, // uncompressed size - LOCNAM: 26, // filename length - LOCEXT: 28, // extra field length - - /* The Data descriptor */ - EXTSIG: 0x08074b50, // "PK\007\008" - EXTHDR: 16, // EXT header size - EXTCRC: 4, // uncompressed file crc-32 value - EXTSIZ: 8, // compressed size - EXTLEN: 12, // uncompressed size - - /* The central directory file header */ - CENHDR: 46, // CEN header size - CENSIG: 0x02014b50, // "PK\001\002" - CENVEM: 4, // version made by - CENVER: 6, // version needed to extract - CENFLG: 8, // encrypt, decrypt flags - CENHOW: 10, // compression method - CENTIM: 12, // modification time (2 bytes time, 2 bytes date) - CENCRC: 16, // uncompressed file crc-32 value - CENSIZ: 20, // compressed size - CENLEN: 24, // uncompressed size - CENNAM: 28, // filename length - CENEXT: 30, // extra field length - CENCOM: 32, // file comment length - CENDSK: 34, // volume number start - CENATT: 36, // internal file attributes - CENATX: 38, // external file attributes (host system dependent) - CENOFF: 42, // LOC header offset - - /* The entries in the end of central directory */ - ENDHDR: 22, // END header size - ENDSIG: 0x06054b50, // "PK\005\006" - ENDSIGFIRST: 0x50, - ENDSUB: 8, // number of entries on this disk - ENDTOT: 10, // total number of entries - ENDSIZ: 12, // central directory size in bytes - ENDOFF: 16, // offset of first CEN header - ENDCOM: 20, // zip file comment length - MAXFILECOMMENT: 0xffff, - - /* The entries in the end of ZIP64 central directory locator */ - ENDL64HDR: 20, // ZIP64 end of central directory locator header size - ENDL64SIG: 0x07064b50, // ZIP64 end of central directory locator signature - ENDL64SIGFIRST: 0x50, - ENDL64OFS: 8, // ZIP64 end of central directory offset - - /* The entries in the end of ZIP64 central directory */ - END64HDR: 56, // ZIP64 end of central directory header size - END64SIG: 0x06064b50, // ZIP64 end of central directory signature - END64SIGFIRST: 0x50, - END64SUB: 24, // number of entries on this disk - END64TOT: 32, // total number of entries - END64SIZ: 40, - END64OFF: 48, - - /* Compression methods */ - STORED: 0, // no compression - SHRUNK: 1, // shrunk - REDUCED1: 2, // reduced with compression factor 1 - REDUCED2: 3, // reduced with compression factor 2 - REDUCED3: 4, // reduced with compression factor 3 - REDUCED4: 5, // reduced with compression factor 4 - IMPLODED: 6, // imploded - // 7 reserved - DEFLATED: 8, // deflated - ENHANCED_DEFLATED: 9, // deflate64 - PKWARE: 10, // PKWare DCL imploded - // 11 reserved - BZIP2: 12, // compressed using BZIP2 - // 13 reserved - LZMA: 14, // LZMA - // 15-17 reserved - IBM_TERSE: 18, // compressed using IBM TERSE - IBM_LZ77: 19, //IBM LZ77 z - - /* General purpose bit flag */ - FLG_ENC: 0, // encrypted file - FLG_COMP1: 1, // compression option - FLG_COMP2: 2, // compression option - FLG_DESC: 4, // data descriptor - FLG_ENH: 8, // enhanced deflation - FLG_STR: 16, // strong encryption - FLG_LNG: 1024, // language encoding - FLG_MSK: 4096, // mask header values - FLG_ENTRY_ENC: 1, - - /* 4.5 Extensible data fields */ - EF_ID: 0, - EF_SIZE: 2, - - /* Header IDs */ - ID_ZIP64: 0x0001, - ID_AVINFO: 0x0007, - ID_PFS: 0x0008, - ID_OS2: 0x0009, - ID_NTFS: 0x000a, - ID_OPENVMS: 0x000c, - ID_UNIX: 0x000d, - ID_FORK: 0x000e, - ID_PATCH: 0x000f, - ID_X509_PKCS7: 0x0014, - ID_X509_CERTID_F: 0x0015, - ID_X509_CERTID_C: 0x0016, - ID_STRONGENC: 0x0017, - ID_RECORD_MGT: 0x0018, - ID_X509_PKCS7_RL: 0x0019, - ID_IBM1: 0x0065, - ID_IBM2: 0x0066, - ID_POSZIP: 0x4690, - - EF_ZIP64_OR_32: 0xffffffff, - EF_ZIP64_OR_16: 0xffff, -}; - -class CentralDirectoryHeader { - volumeEntries!: number; - totalEntries!: number; - size!: number; - offset!: number; - commentLength!: number; - headerOffset!: number; - - constructor(data: Buffer) { - if (data.length !== consts.ENDHDR || data.readUInt32LE(0) !== consts.ENDSIG) { - throw new Error('Invalid central directory'); - } - // number of entries on this volume - this.volumeEntries = data.readUInt16LE(consts.ENDSUB); - // total number of entries - this.totalEntries = data.readUInt16LE(consts.ENDTOT); - // central directory size in bytes - this.size = data.readUInt32LE(consts.ENDSIZ); - // offset of first CEN header - this.offset = data.readUInt32LE(consts.ENDOFF); - // zip file comment length - this.commentLength = data.readUInt16LE(consts.ENDCOM); - } -} - -class CentralDirectoryLoc64Header { - headerOffset!: number; - - constructor(data: Buffer) { - if (data.length !== consts.ENDL64HDR || data.readUInt32LE(0) !== consts.ENDL64SIG) { - throw new Error('Invalid zip64 central directory locator'); - } - // ZIP64 EOCD header offset - this.headerOffset = readUInt64LE(data, consts.ENDSUB); - } -} - -class CentralDirectoryZip64Header { - volumeEntries!: number; - totalEntries!: number; - size!: number; - offset!: number; - - constructor(data: Buffer) { - if (data.length !== consts.END64HDR || data.readUInt32LE(0) !== consts.END64SIG) { - throw new Error('Invalid central directory'); - } - // number of entries on this volume - this.volumeEntries = readUInt64LE(data, consts.END64SUB); - // total number of entries - this.totalEntries = readUInt64LE(data, consts.END64TOT); - // central directory size in bytes - this.size = readUInt64LE(data, consts.END64SIZ); - // offset of first CEN header - this.offset = readUInt64LE(data, consts.END64OFF); - } -} - -export class ZipEntry { - /** - * file name - */ - name!: string; - - /** - * true if it's a directory entry - */ - isDirectory!: boolean; - - /** - * file comment - */ - comment!: string | null; - - /** - * version made by - */ - verMade: number; - - /** - * version needed to extract - */ - version: number; - - /** - * encrypt, decrypt flags - */ - flags: number; - - /** - * compression method - */ - method: number; - - /** - * modification time - */ - time: Date; - - /** - * uncompressed file crc-32 value - */ - crc: number; - - /** - * compressed size - */ - compressedSize: number; - - /** - * uncompressed size - */ - size: number; - - /** - * volume number start - */ - diskStart: number; - - /** - * internal file attributes - */ - inattr: number; - - /** - * external file attributes - */ - attr: number; - - /** - * LOC header offset - */ - offset: number; - - fnameLen: number; - extraLen: number; - comLen: number; - headerOffset!: number; - - constructor(private zipFile: ZipFile, data: Buffer, offset: number) { - // data should be 46 bytes and start with "PK 01 02" - if (data.length < offset + consts.CENHDR || data.readUInt32LE(offset) !== consts.CENSIG) { - throw new Error('Invalid entry header'); - } - // version made by - this.verMade = data.readUInt16LE(offset + consts.CENVEM); - // version needed to extract - this.version = data.readUInt16LE(offset + consts.CENVER); - // encrypt, decrypt flags - this.flags = data.readUInt16LE(offset + consts.CENFLG); - // compression method - this.method = data.readUInt16LE(offset + consts.CENHOW); - // modification time (2 bytes time, 2 bytes date) - const timebytes = data.readUInt16LE(offset + consts.CENTIM); - const datebytes = data.readUInt16LE(offset + consts.CENTIM + 2); - this.time = parseZipTime(timebytes, datebytes); - - // uncompressed file crc-32 value - this.crc = data.readUInt32LE(offset + consts.CENCRC); - // compressed size - this.compressedSize = data.readUInt32LE(offset + consts.CENSIZ); - // uncompressed size - this.size = data.readUInt32LE(offset + consts.CENLEN); - // filename length - this.fnameLen = data.readUInt16LE(offset + consts.CENNAM); - // extra field length - this.extraLen = data.readUInt16LE(offset + consts.CENEXT); - // file comment length - this.comLen = data.readUInt16LE(offset + consts.CENCOM); - // volume number start - this.diskStart = data.readUInt16LE(offset + consts.CENDSK); - // internal file attributes - this.inattr = data.readUInt16LE(offset + consts.CENATT); - // external file attributes - this.attr = data.readUInt32LE(offset + consts.CENATX); - // LOC header offset - this.offset = data.readUInt32LE(offset + consts.CENOFF); - } - - read(): Promise { - return this.zipFile.openEntry(this); - } - - parseDataHeader(data: Buffer) { - // 30 bytes and should start with "PK\003\004" - if (data.readUInt32LE(0) !== consts.LOCSIG) { - throw new Error('Invalid local header'); - } - // version needed to extract - this.version = data.readUInt16LE(consts.LOCVER); - // general purpose bit flag - this.flags = data.readUInt16LE(consts.LOCFLG); - // compression method - this.method = data.readUInt16LE(consts.LOCHOW); - // modification time (2 bytes time ; 2 bytes date) - const timebytes = data.readUInt16LE(consts.LOCTIM); - const datebytes = data.readUInt16LE(consts.LOCTIM + 2); - this.time = parseZipTime(timebytes, datebytes); - - // uncompressed file crc-32 value - this.crc = data.readUInt32LE(consts.LOCCRC) || this.crc; - // compressed size - const compressedSize = data.readUInt32LE(consts.LOCSIZ); - if (compressedSize && compressedSize !== consts.EF_ZIP64_OR_32) { - this.compressedSize = compressedSize; - } - // uncompressed size - const size = data.readUInt32LE(consts.LOCLEN); - if (size && size !== consts.EF_ZIP64_OR_32) { - this.size = size; - } - // filename length - this.fnameLen = data.readUInt16LE(consts.LOCNAM); - // extra field length - this.extraLen = data.readUInt16LE(consts.LOCEXT); - } - - processFilename(data: Buffer, offset: number) { - this.name = data.slice(offset, (offset += this.fnameLen)).toString(); - const lastChar = data[offset - 1]; - this.isDirectory = lastChar === 47 || lastChar === 92; - - if (this.extraLen) { - this.readExtra(data, offset); - offset += this.extraLen; - } - this.comment = this.comLen ? data.slice(offset, offset + this.comLen).toString() : null; - } - - validateName() { - if (/\\|^\w+:|^\/|(^|\/)\.\.(\/|$)/.test(this.name)) { - throw new Error('Malicious entry: ' + this.name); - } - } - - readExtra(data: Buffer, offset: number) { - let signature, size; - const maxPos = offset + this.extraLen; - while (offset < maxPos) { - signature = data.readUInt16LE(offset); - offset += 2; - size = data.readUInt16LE(offset); - offset += 2; - if (consts.ID_ZIP64 === signature) { - this.parseZip64Extra(data, offset, size); - } - offset += size; - } - } - - parseZip64Extra(data: Buffer, offset: number, length: number) { - if (length >= 8 && this.size === consts.EF_ZIP64_OR_32) { - this.size = readUInt64LE(data, offset); - offset += 8; - length -= 8; - } - if (length >= 8 && this.compressedSize === consts.EF_ZIP64_OR_32) { - this.compressedSize = readUInt64LE(data, offset); - offset += 8; - length -= 8; - } - if (length >= 8 && this.offset === consts.EF_ZIP64_OR_32) { - this.offset = readUInt64LE(data, offset); - offset += 8; - length -= 8; - } - if (length >= 4 && this.diskStart === consts.EF_ZIP64_OR_16) { - this.diskStart = data.readUInt32LE(offset); - // offset += 4; length -= 4; - } - } - - get encrypted() { - return (this.flags & consts.FLG_ENTRY_ENC) === consts.FLG_ENTRY_ENC; - } - - get isFile() { - return !this.isDirectory; - } -} - -class FileWindowBuffer { - position = 0; - buffer = Buffer.alloc(0); - constructor(public readHandle: ReadHandle) { - } - - async read(pos: number, length: number) { - if (this.buffer.length < length) { - this.buffer = Buffer.alloc(length); - } - this.position = pos; - await this.readHandle.readComplete(this.buffer, 0, length, this.position); - } - - async expandLeft(length: number) { - this.buffer = Buffer.concat([Buffer.alloc(length), this.buffer]); - this.position -= length; - if (this.position < 0) { - this.position = 0; - } - await this.readHandle.readComplete(this.buffer, 0, length, this.position); - } - - async expandRight(length: number,) { - const offset = this.buffer.length; - this.buffer = Buffer.concat([this.buffer, Buffer.alloc(length)]); - await this.readHandle.readComplete(this.buffer, offset, length, this.position + offset); - } - - async moveRight(shift: number) { - if (shift) { - this.buffer.copy(this.buffer, 0, shift); - } - this.position += shift; - await this.readHandle.readComplete(this.buffer, this.buffer.length - shift, shift, this.position + this.buffer.length - shift); - } -} - -function createVerifier(crc: number, size: number) { - const verify = new Verifier(crc, size); - return new Transform({ - transform: (data: any, unused: BufferEncoding, passThru: TransformCallback) => { - let err; - try { - verify.data(data); - } catch (e: any) { - err = e; - } - passThru(err, data); - } - }); -} - -function createCrcTable() { - const crcTable = []; - const b = Buffer.alloc(4); - for (let n = 0; n < 256; n++) { - let c = n; - for (let k = 8; --k >= 0;) { - if ((c & 1) !== 0) { - c = 0xedb88320 ^ (c >>> 1); - } else { - c = c >>> 1; - } - } - if (c < 0) { - b.writeInt32LE(c, 0); - c = b.readUInt32LE(0); - } - crcTable[n] = c; - } - return crcTable; -} - -const crcTable = createCrcTable(); - -class Verifier { - state = { - crc: ~0, - size: 0, - }; - - constructor(public crc: number, public size: number) { - } - - data(data: Buffer) { - let crc = this.state.crc; - let off = 0; - let len = data.length; - while (--len >= 0) { - crc = crcTable[(crc ^ data[off++]) & 0xff] ^ (crc >>> 8); - } - this.state.crc = crc; - this.state.size += data.length; - if (this.state.size >= this.size) { - const buf = Buffer.alloc(4); - buf.writeInt32LE(~this.state.crc & 0xffffffff, 0); - crc = buf.readUInt32LE(0); - if (crc !== this.crc) { - throw new Error(`Invalid CRC Expected: ${this.crc} found:${crc} `); - } - if (this.state.size !== this.size) { - throw new Error('Invalid size'); - } - } - } -} - -function parseZipTime(timebytes: number, datebytes: number) { - const timebits = toBits(timebytes, 16); - const datebits = toBits(datebytes, 16); - - const mt = { - h: parseInt(timebits.slice(0, 5).join(''), 2), - m: parseInt(timebits.slice(5, 11).join(''), 2), - s: parseInt(timebits.slice(11, 16).join(''), 2) * 2, - Y: parseInt(datebits.slice(0, 7).join(''), 2) + 1980, - M: parseInt(datebits.slice(7, 11).join(''), 2), - D: parseInt(datebits.slice(11, 16).join(''), 2), - }; - const dt_str = [mt.Y, mt.M, mt.D].join('-') + ' ' + [mt.h, mt.m, mt.s].join(':') + ' GMT+0'; - return new Date(dt_str); -} - -function toBits(dec: number, size: number) { - let b = (dec >>> 0).toString(2); - while (b.length < size) { - b = '0' + b; - } - return b.split(''); -} - -function readUInt64LE(buffer: Buffer, offset: number) { - return buffer.readUInt32LE(offset + 4) * 0x0000000100000000 + buffer.readUInt32LE(offset); -} diff --git a/ce/ce/cli/command.ts b/ce/ce/cli/command.ts deleted file mode 100644 index 4898b0c4bc..0000000000 --- a/ce/ce/cli/command.ts +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { i } from '../i18n'; -import { Argument } from './argument'; -import { CommandLine, Help } from './command-line'; -import { cli } from './constants'; -import { cmdSwitch, command, heading, optional } from './format'; -import { Switch } from './switch'; -import { Debug } from './switches/debug'; -import { Force } from './switches/force'; - -/** @internal */ - -export abstract class Command implements Help { - readonly abstract command: string; - readonly abstract argumentsHelp: Array; - - readonly switches = new Array(); - readonly arguments = new Array(); - - readonly abstract seeAlso: Array; - readonly abstract aliases: Array; - - abstract get summary(): string; - abstract get description(): Array; - - readonly force = new Force(this); - readonly debug = new Debug(this); - - get synopsis(): Array { - return [ - heading(i`Synopsis`, 2), - ` ${command(`${cli} ${this.command} ${this.arguments.map(each => `<${each.argument}>`).join(' ')}`)}${this.switches.flatMap(each => optional(`[--${each.switch}]`)).join(' ')}` - ]; - } - - get title() { - return `${cli} ${this.command}`; - } - - constructor(public commandLine: CommandLine) { - commandLine.addCommand(this); - } - - get inputs() { - return this.commandLine.inputs.slice(1); - } - - get help() { - return [ - heading(this.title), - this.summary, - ...this.synopsis, - heading(i`Description`, 2), - ...this.description, - ...this.argumentsHelp, - ...(this.switches.length ? [ - heading(i`Switches`, 2), - ...this.switches.flatMap(each => ` ${cmdSwitch(each.switch)}: ${each.help.join(' ')}`) - ] : []), - ...(this.seeAlso.length ? [ - heading(i`See Also`, 2), - ...this.seeAlso.flatMap(each => each.title) - ] : []) - ]; - } - - async run() { - // do something - return true; - } -} diff --git a/ce/ce/cli/commands/help.ts b/ce/ce/cli/commands/help.ts deleted file mode 100644 index b91e38ee14..0000000000 --- a/ce/ce/cli/commands/help.ts +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { i } from '../../i18n'; -import { Argument } from '../argument'; -import { Command } from '../command'; -import { cli } from '../constants'; -import { command as formatCommand, heading, hint } from '../format'; -import { error, indent, log } from '../styling'; - -class CommandName extends Argument { - argument = 'command'; - - get help() { - return [ - i`the name of the command for which you want help` - ]; - } -} - -/**@internal */ -export class HelpCommand extends Command { - readonly command = 'help'; - readonly aliases = []; - seeAlso = []; - commandName: CommandName = new CommandName(this); - - get argumentsHelp() { - return [indent(i` <${this.commandName.argument}> : ${this.commandName.help.join(' ')}`)]; - } - - get summary() { - return i`get help on ${cli} or one of the commands`; - } - - get description() { - return [ - i`Gets detailed help on ${cli}, or one of the commands`, - i`Arguments:` - ]; - } - - override async run() { - const cmd = ['-h', '-help', '-?', '/?'].find(each => (this.commandLine.inputs.indexOf(each) > -1)) ? this.commandLine.inputs[0] : this.commandLine.inputs[1]; - // did they ask for help on a command? - - if (cmd) { - const target = this.commandLine.commands.find(each => each.command === cmd); - if (target) { - log(target.help.join('\n')); - return true; - } - - // I don't know the command - error(i`Unrecognized command '${cmd}'`); - log(hint(i`Use ${formatCommand(`${cli} ${this.command}`)} to get the list of available commands`)); - return false; - } - - // general help. return the general help info - - log(heading(i`Usage`, 2)); - log(indent(i`${cli} COMMAND [--switches]`)); - - log(heading(i`Available ${cli} commands:`, 2)); - const max = Math.max(...this.commandLine.commands.map(each => each.command.length)); - for (const command of this.commandLine.commands) { - if (command.command.startsWith('z-')) { - // don't show internal commands - continue; - } - log(indent(i`${formatCommand(command.command.padEnd(max))} : ${command.summary}`)); - } - - return true; - } -} diff --git a/ce/ce/cli/commands/update.ts b/ce/ce/cli/commands/update.ts deleted file mode 100644 index bb146965b3..0000000000 --- a/ce/ce/cli/commands/update.ts +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { buildRegistryResolver } from '../../artifacts/artifact'; -import { i } from '../../i18n'; -import { session } from '../../main'; -import { Registry } from '../../registries/registries'; -import { RemoteFileUnavailable } from '../../util/exceptions'; -import { Command } from '../command'; -import { CommandLine } from '../command-line'; -import { count } from '../format'; -import { error, log, writeException } from '../styling'; -import { Project } from '../switches/project'; - -export class UpdateCommand extends Command { - readonly command = 'update'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; - project: Project = new Project(this); - - get summary() { - return i`update the registry from the remote`; - } - - get description() { - return [ - i`This downloads the latest contents of the registry from the remote service.`, - ]; - } - - override async run() { - const resolver = session.globalRegistryResolver.with( - await buildRegistryResolver(session, (await this.project.manifest)?.metadata.registries)); - for (const registryName of this.inputs) { - const registry = resolver.getRegistryByName(registryName); - if (registry) { - try { - log(i`Downloading registry data`); - await registry.update(); - await registry.load(); - log(i`Updated ${registryName}. registry contains ${count(registry.count)} metadata files`); - } catch (e) { - if (e instanceof RemoteFileUnavailable) { - log(i`Unable to download registry snapshot`); - return false; - } - writeException(e); - return false; - } - } else { - error(i`Unable to find registry ${registryName}`); - } - } - - return true; - } - - static async update(registry: Registry) { - log(i`Artifact registry data is not loaded`); - log(i`Attempting to update artifact registry`); - const update = new UpdateCommand(new CommandLine([])); - - let success = true; - try { - success = await update.run(); - } catch (e) { - writeException(e); - success = false; - } - if (!success) { - error(i`Unable to load registry index`); - return false; - } - try { - await registry.load(); - } catch (e) { - writeException(e); - // it just doesn't want to load. - error(i`Unable to load registry index`); - return false; - } - return true; - } -} diff --git a/ce/ce/cli/switches/debug.ts b/ce/ce/cli/switches/debug.ts deleted file mode 100644 index 81b685af56..0000000000 --- a/ce/ce/cli/switches/debug.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { i } from '../../i18n'; -import { cli } from '../constants'; -import { Switch } from '../switch'; - -export class Debug extends Switch { - switch = 'debug'; - get help() { - return [ - i`enables debug mode, displays internal messsages about how ${cli} works` - ]; - } -} diff --git a/ce/ce/cli/switches/verbose.ts b/ce/ce/cli/switches/verbose.ts deleted file mode 100644 index 7eed7f7e05..0000000000 --- a/ce/ce/cli/switches/verbose.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { i } from '../../i18n'; -import { Switch } from '../switch'; - -export class Verbose extends Switch { - switch = 'verbose'; - get help() { - return [ - i`enables verbose mode, displays verbose messsages about the process` - ]; - } -} diff --git a/ce/ce/tsconfig.json b/ce/ce/tsconfig.json deleted file mode 100644 index 5303145083..0000000000 --- a/ce/ce/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "../common/tsconfig.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "." - }, - "include": [ - "./**/*.ts" - ], - "exclude": [ - ".scripts/**", - "**/dist/**", - "test/scenarios/**", - "resources", - "node_modules/**", - "**/*.d.ts" - ] -} \ No newline at end of file diff --git a/ce/common/config/rush/.npmrc b/ce/common/config/rush/.npmrc deleted file mode 100644 index e97097d512..0000000000 --- a/ce/common/config/rush/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -registry=https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ -lockfileVersion=3 diff --git a/ce/common/config/rush/command-line.json b/ce/common/config/rush/command-line.json deleted file mode 100644 index faf80be5ae..0000000000 --- a/ce/common/config/rush/command-line.json +++ /dev/null @@ -1,162 +0,0 @@ -/** - * This configuration file defines custom commands for the "rush" command-line. - * For full documentation, please see https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/command-line.schema.json", - /** - * Custom "commands" introduce new verbs for the command-line. To see the help for these - * example commands, try "rush --help", "rush my-bulk-command --help", or - * "rush my-global-command --help". - */ - "commands": [ - { - "commandKind": "global", - "name": "set-versions", - "summary": "set the patch version in the package.json files", - "shellCommand": "node .scripts/set-versions.js" - }, - { - "commandKind": "global", - "name": "reset-versions", - "summary": "reset the patch version in the package.json files to .0", - "shellCommand": "node .scripts/set-versions.js --reset" - }, - { - "commandKind": "global", - "name": "sync-versions", - "summary": "sync versions of sibling projects", - "shellCommand": "node .scripts/sync-versions.js" - }, - { - "commandKind": "global", - "name": "watch", - "summary": "run npm watch on all projects", - "shellCommand": "node .scripts/watch.js" - }, - { - "commandKind": "global", - "name": "clean", - "summary": "run npm clean on all projects", - "shellCommand": "node .scripts/npm-run.js clean" - }, - { - "commandKind": "global", - "name": "test", - "summary": "run all npm test", - "shellCommand": "node .scripts/npm-run.js test" - }, - { - "commandKind": "global", - "name": "test-ci", - "summary": "run all npm test-ci (build then run test)", - "shellCommand": "node .scripts/npm-run.js test-ci" - }, - { - "commandKind": "global", - "name": "fix", - "summary": "run all npm fix", - "shellCommand": "node .scripts/npm-run.js eslint-fix" - }, - { - "commandKind": "global", - "name": "lint", - "summary": "run all npm lint", - "shellCommand": "node .scripts/npm-run.js eslint" - } - ], - /** - * Custom "parameters" introduce new parameters for specified Rush command-line commands. - * For example, you might define a "--production" parameter for the "rush build" command. - */ - "parameters": [ - // { - // /** - // * (Required) Determines the type of custom parameter. - // * A "flag" is a custom command-line parameter whose presence acts as an on/off switch. - // */ - // "parameterKind": "flag", - // - // /** - // * (Required) The long name of the parameter. It must be lower-case and use dash delimiters. - // */ - // "longName": "--my-flag", - // - // /** - // * An optional alternative short name for the parameter. It must be a dash followed by a single - // * lower-case or upper-case letter, which is case-sensitive. - // * - // * NOTE: The Rush developers recommend that automation scripts should always use the long name - // * to improve readability. The short name is only intended as a convenience for humans. - // * The alphabet letters run out quickly, and are difficult to memorize, so *only* use - // * a short name if you expect the parameter to be needed very often in everyday operations. - // */ - // "shortName": "-m", - // - // /** - // * (Required) A long description to be shown in the command-line help. - // * - // * Whenever you introduce commands/parameters, taking a little time to write meaningful - // * documentation can make a big difference for the developer experience in your repo. - // */ - // "description": "A custom flag parameter that is passed to the scripts that are invoked when building projects", - // - // /** - // * (Required) A list of custom commands and/or built-in Rush commands that this parameter may - // * be used with. The parameter will be appended to the shell command that Rush invokes. - // */ - // "associatedCommands": [ "build", "rebuild" ] - // }, - // - // { - // /** - // * (Required) Determines the type of custom parameter. - // * A "flag" is a custom command-line parameter whose presence acts as an on/off switch. - // */ - // "parameterKind": "choice", - // "longName": "--my-choice", - // "description": "A custom choice parameter for the \"my-global-command\" custom command", - // - // "associatedCommands": [ "my-global-command" ], - // - // /** - // * Normally if a parameter is omitted from the command line, it will not be passed - // * to the shell command. this value will be inserted by default. Whereas if a "defaultValue" - // * is defined, the parameter will always be passed to the shell command, and will use the - // * default value if unspecified. The value must be one of the defined alternatives. - // */ - // "defaultValue": "vanilla", - // - // /** - // * (Required) A list of alternative argument values that can be chosen for this parameter. - // */ - // "alternatives": [ - // { - // /** - // * A token that is one of the alternatives that can be used with the choice parameter, - // * e.g. "vanilla" in "--flavor vanilla". - // */ - // "name": "vanilla", - // - // /** - // * A detailed description for the alternative that can be shown in the command-line help. - // * - // * Whenever you introduce commands/parameters, taking a little time to write meaningful - // * documentation can make a big difference for the developer experience in your repo. - // */ - // "description": "Use the vanilla flavor (the default)" - // }, - // - // { - // "name": "chocolate", - // "description": "Use the chocolate flavor" - // }, - // - // { - // "name": "strawberry", - // "description": "Use the strawberry flavor" - // } - // ] - // } - ] -} \ No newline at end of file diff --git a/ce/common/config/rush/common-versions.json b/ce/common/config/rush/common-versions.json deleted file mode 100644 index bd5d86990e..0000000000 --- a/ce/common/config/rush/common-versions.json +++ /dev/null @@ -1,63 +0,0 @@ -/** - * This configuration file specifies NPM dependency version selections that affect all projects - * in a Rush repo. For full documentation, please see https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json", - - /** - * A table that specifies a "preferred version" for a given NPM package. This feature is typically used - * to hold back an indirect dependency to a specific older version, or to reduce duplication of indirect dependencies. - * - * The "preferredVersions" value can be any SemVer range specifier (e.g. "~1.2.3"). Rush injects these values into - * the "dependencies" field of the top-level common/temp/package.json, which influences how the package manager - * will calculate versions. The specific effect depends on your package manager. Generally it will have no - * effect on an incompatible or already constrained SemVer range. If you are using PNPM, similar effects can be - * achieved using the pnpmfile.js hook. See the Rush documentation for more details. - * - * After modifying this field, it's recommended to run "rush update --full" so that the package manager - * will recalculate all version selections. - */ - "preferredVersions": { - /** - * When someone asks for "^1.0.0" make sure they get "1.2.3" when working in this repo, - * instead of the latest version. - */ - // "some-library": "1.2.3" - "minimist": "1.2.6" - }, - - /** - * When set to true, for all projects in the repo, all dependencies will be automatically added as preferredVersions, - * except in cases where different projects specify different version ranges for a given dependency. For older - * package managers, this tended to reduce duplication of indirect dependencies. However, it can sometimes cause - * trouble for indirect dependencies with incompatible peerDependencies ranges. - * - * The default value is true. If you're encountering installation errors related to peer dependencies, - * it's recommended to set this to false. - * - * After modifying this field, it's recommended to run "rush update --full" so that the package manager - * will recalculate all version selections. - */ - // "implicitlyPreferredVersions": false, - - /** - * The "rush check" command can be used to enforce that every project in the repo must specify - * the same SemVer range for a given dependency. However, sometimes exceptions are needed. - * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be - * accepted by "rush check" for a given dependency. - * - * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE - * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO). - * This design avoids unnecessary churn in this file. - */ - "allowedAlternativeVersions": { - /** - * For example, allow some projects to use an older TypeScript compiler - * (in addition to whatever "usual" version is being used by other projects in the repo): - */ - // "typescript": [ - // "~2.4.0" - // ] - } -} diff --git a/ce/common/config/rush/deploy.json b/ce/common/config/rush/deploy.json deleted file mode 100644 index 805bd4bd03..0000000000 --- a/ce/common/config/rush/deploy.json +++ /dev/null @@ -1,111 +0,0 @@ -/** - * This configuration file defines a deployment scenario for use with the "rush deploy" command. - * The default scenario file path is "deploy.json"; additional files use the naming pattern - * "deploy-.json". For full documentation, please see https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/deploy-scenario.schema.json", - /** - * The "rush deploy" command prepares a deployment folder, starting from the main project and collecting - * all of its dependencies (both NPM packages and other Rush projects). The main project is specified - * using the "--project" parameter. The "deploymentProjectNames" setting lists the allowable choices for - * the "--project" parameter; this documents the intended deployments for your monorepo and helps validate - * that "rush deploy" is invoked correctly. If there is only one item in the "deploymentProjectNames" array, - * then "--project" can be omitted. The names should be complete package names as declared in rush.json. - * - * If the main project should include other unrelated Rush projects, add it to the "projectSettings" section, - * and then specify those projects in the "additionalProjectsToInclude" list. - */ - "deploymentProjectNames": [ - "@microsoft/vcpkg-ce" - ], - /** - * When deploying a local Rush project, the package.json "devDependencies" are normally excluded. - * If you want to include them, set "includeDevDependencies" to true. - * - * The default value is false. - */ - "includeDevDependencies": false, - /** - * When deploying a local Rush project, normally the .npmignore filter is applied so that Rush only copies - * files that would be packaged by "npm pack". Setting "includeNpmIgnoreFiles" to true will disable this - * filtering so that all files are copied (with a few trivial exceptions such as the "node_modules" folder). - * - * The default value is false. - */ - // "includeNpmIgnoreFiles": true, - /** - * To improve backwards compatibility with legacy packages, the PNPM package manager installs extra links in the - * node_modules folder that enable packages to import undeclared dependencies. In some cases this workaround may - * double the number of links created. If your deployment does not require this workaround, you can set - * "omitPnpmWorkaroundLinks" to true to avoid creating the extra links. - * - * The default value is false. - */ - // "omitPnpmWorkaroundLinks": true, - /** - * Specify how links (symbolic links, hard links, and/or NTFS junctions) will be created in the deployed folder: - * - * - "default": Create the links while copying the files; this is the default behavior. - * - "script": A Node.js script called "create-links.js" will be written. When executed, this script will - * create the links described in the "deploy-metadata.json" output file. - * - "none": Do nothing; some other tool may create the links later. - */ - "linkCreation": "script", - /** - * If this path is specified, then after "rush deploy", recursively copy the files from this folder to - * the deployment target folder (common/deploy). This can be used to provide additional configuration files - * or scripts needed by the server when deploying. The path is resolved relative to the repository root. - */ - "folderToCopy": "assets/", - /** - * Customize how Rush projects are processed during deployment. - */ - "projectSettings": [ - { - // /** - // * The full package name of the project, which must be declared in rush.json. - // */ - "projectName": "@microsoft/vcpkg-ce", - // - // /** - // * A list of additional local Rush projects to be deployed with this project (beyond the package.json - // * dependencies). Specify full package names, which must be declared in rush.json. - // */ - // "additionalProjectsToInclude": [ - // // "@my-scope/my-project2" - // ], - // - // /** - // * When deploying a project, the included dependencies are normally determined automatically based on - // * package.json fields such as "dependencies", "peerDependencies", and "optionalDependencies", - // * subject to other deployment settings such as "includeDevDependencies". However, in cases where - // * that information is not accurate, you can use "additionalDependenciesToInclude" to add more - // * packages to the list. - // * - // * The list can include any package name that is installed by Rush and resolvable via Node.js module - // * resolution; however, if it resolves to a local Rush project, the "additionalProjectsToInclude" - // * field will not be recursively applied. - // */ - // "additionalDependenciesToInclude": [ - // // "@rushstack/node-core-library" - // ], - // - // /** - // * This setting prevents specific dependencies from being deployed. It only filters dependencies that - // * are explicitly declared in package.json for this project. It does not affect dependencies added - // * via "additionalProjectsToInclude" or "additionalDependenciesToInclude", nor does it affect indirect - // * dependencies. - // * - // * The "*" wildcard may be used to match zero or more characters. For example, if your project already - // * bundles its own dependencies, specify "dependenciesToExclude": [ "*" ] to exclude all package.json - // * dependencies. - // */ - "dependenciesToExclude": [ - "@types/*", - "typescript", - "translate-strings" - ] - } - ] -} \ No newline at end of file diff --git a/ce/common/config/rush/experiments.json b/ce/common/config/rush/experiments.json deleted file mode 100644 index abbbba9471..0000000000 --- a/ce/common/config/rush/experiments.json +++ /dev/null @@ -1,36 +0,0 @@ -/** - * This configuration file allows repo maintainers to enable and disable experimental - * Rush features. For full documentation, please see https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/experiments.schema.json", - - /** - * Rush 5.14.0 improved incremental builds to ignore spurious changes in the pnpm-lock.json file. - * This optimization is enabled by default. If you encounter a problem where "rush build" is neglecting - * to build some projects, please open a GitHub issue. As a workaround you can uncomment this line - * to temporarily restore the old behavior where everything must be rebuilt whenever pnpm-lock.json - * is modified. - */ - // "legacyIncrementalBuildDependencyDetection": true, - - /** - * By default, rush passes --no-prefer-frozen-lockfile to 'pnpm install'. - * Set this option to true to pass '--frozen-lockfile' instead. - */ - // "usePnpmFrozenLockfileForRushInstall": true, - - /** - * If true, the chmod field in temporary project tar headers will not be normalized. - * This normalization can help ensure consistent tarball integrity across platforms. - */ - // "noChmodFieldInTarHeaderNormalization": true, - - /** - * If true, the build cache feature is enabled. To use this feature, a common/config/rush/build-cache.json - * file must be created with configuration options. - * - * See https://github.com/microsoft/rushstack/issues/2393 for details about this experimental feature. - */ - // "buildCache": true -} diff --git a/ce/common/config/rush/pnpm-lock.yaml b/ce/common/config/rush/pnpm-lock.yaml deleted file mode 100644 index ad112024dd..0000000000 --- a/ce/common/config/rush/pnpm-lock.yaml +++ /dev/null @@ -1,2258 +0,0 @@ -lockfileVersion: 5.3 - -specifiers: - '@rush-temp/tar-stream': file:./projects/tar-stream.tgz - '@rush-temp/vcpkg-ce': file:./projects/vcpkg-ce.tgz - '@rush-temp/vcpkg-ce.test': file:./projects/vcpkg-ce.test.tgz - '@snyk/nuget-semver': 1.3.0 - '@types/cli-progress': 3.11.0 - '@types/mocha': 9.1.0 - '@types/node': 17.0.15 - '@types/semver': 7.3.9 - '@types/tar-stream': ~2.2.0 - '@typescript-eslint/eslint-plugin': 5.10.2 - '@typescript-eslint/parser': 5.10.2 - chalk: 4.1.2 - cli-progress: 3.11.1 - end-of-stream: ^1.4.1 - eslint: 8.8.0 - eslint-plugin-notice: 0.9.10 - fs-constants: ^1.0.0 - inherits: ^2.0.3 - minimist: 1.2.6 - mocha: '9.2' - sed-lite: 0.8.4 - semver: 7.3.5 - sorted-btree: 1.6.0 - source-map-support: 0.5.21 - strip-ansi: '5.2' - tape: ^4.9.2 - translate-strings: 1.1.15 - txtgen: 2.2.8 - typescript: 4.5.5 - unbzip2-stream: 1.4.3 - vscode-uri: 3.0.3 - xml-writer: 1.7.0 - yaml: 2.0.0-10 - -dependencies: - '@rush-temp/tar-stream': file:projects/tar-stream.tgz - '@rush-temp/vcpkg-ce': file:projects/vcpkg-ce.tgz - '@rush-temp/vcpkg-ce.test': file:projects/vcpkg-ce.test.tgz - '@snyk/nuget-semver': 1.3.0 - '@types/cli-progress': 3.11.0 - '@types/mocha': 9.1.0 - '@types/node': 17.0.15 - '@types/semver': 7.3.9 - '@types/tar-stream': 2.2.2 - '@typescript-eslint/eslint-plugin': 5.10.2_2595c2126aec4d4b6e944b931dabb4c2 - '@typescript-eslint/parser': 5.10.2_eslint@8.8.0+typescript@4.5.5 - chalk: 4.1.2 - cli-progress: 3.11.1 - end-of-stream: 1.4.4 - eslint: 8.8.0 - eslint-plugin-notice: 0.9.10_eslint@8.8.0 - fs-constants: 1.0.0 - inherits: 2.0.4 - minimist: 1.2.6 - mocha: 9.2.2 - sed-lite: 0.8.4 - semver: 7.3.5 - sorted-btree: 1.6.0 - source-map-support: 0.5.21 - strip-ansi: 5.2.0 - tape: 4.16.2 - translate-strings: 1.1.15 - txtgen: 2.2.8 - typescript: 4.5.5 - unbzip2-stream: 1.4.3 - vscode-uri: 3.0.3 - xml-writer: 1.7.0 - yaml: 2.0.0-10 - -packages: - - /@azure/abort-controller/1.1.0: - resolution: {integrity: sha1-eI7nhFelWvihrTQqyxgjg9IRkkk=} - engines: {node: '>=12.0.0'} - dependencies: - tslib: 2.5.0 - dev: false - - /@azure/cognitiveservices-translatortext/1.0.1: - resolution: {integrity: sha1-iIRCw+KXZ33jaIf7MlEAonFS0CU=} - dependencies: - '@azure/ms-rest-js': 2.6.4 - tslib: 1.14.1 - transitivePeerDependencies: - - encoding - dev: false - - /@azure/core-auth/1.4.0: - resolution: {integrity: sha1-b6lmHBcFhXgg28IW31ulZlrDap4=} - engines: {node: '>=12.0.0'} - dependencies: - '@azure/abort-controller': 1.1.0 - tslib: 2.5.0 - dev: false - - /@azure/ms-rest-azure-js/2.1.0: - resolution: {integrity: sha1-jJCzFGiuyjFGsGxxRLOG/Ugn9kw=} - dependencies: - '@azure/core-auth': 1.4.0 - '@azure/ms-rest-js': 2.6.4 - tslib: 1.14.1 - transitivePeerDependencies: - - encoding - dev: false - - /@azure/ms-rest-js/2.6.4: - resolution: {integrity: sha1-sKD4mEFDRHGt91fQnn456Oz81lA=} - dependencies: - '@azure/core-auth': 1.4.0 - abort-controller: 3.0.0 - form-data: 2.5.1 - node-fetch: 2.6.8 - tough-cookie: 3.0.1 - tslib: 1.14.1 - tunnel: 0.0.6 - uuid: 8.3.2 - xml2js: 0.4.23 - transitivePeerDependencies: - - encoding - dev: false - - /@dsherret/to-absolute-glob/2.0.2: - resolution: {integrity: sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=} - engines: {node: '>=0.10.0'} - dependencies: - is-absolute: 1.0.0 - is-negated-glob: 1.0.0 - dev: false - - /@eslint/eslintrc/1.4.1: - resolution: {integrity: sha1-r1h3IBmi0nG34tTCP/Tdy6PM+z4=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.4.1 - globals: 13.19.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@humanwhocodes/config-array/0.9.5: - resolution: {integrity: sha1-LLr5qJRg2iS1ymUxuLv8I+HfUMc=} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@humanwhocodes/object-schema/1.2.1: - resolution: {integrity: sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U=} - dev: false - - /@nodelib/fs.scandir/2.1.5: - resolution: {integrity: sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: false - - /@nodelib/fs.stat/2.0.5: - resolution: {integrity: sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=} - engines: {node: '>= 8'} - dev: false - - /@nodelib/fs.walk/1.2.8: - resolution: {integrity: sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: false - - /@snyk/nuget-semver/1.3.0: - resolution: {integrity: sha1-p071NA3K2jvEs6AZt5UHON9RGZw=} - engines: {node: '>=6'} - dev: false - - /@ts-morph/common/0.7.5: - resolution: {integrity: sha1-2BYDq9S4bQCZ1pI5y7zfmQpd+yU=} - dependencies: - '@dsherret/to-absolute-glob': 2.0.2 - fast-glob: 3.2.12 - is-negated-glob: 1.0.0 - mkdirp: 1.0.4 - multimatch: 5.0.0 - typescript: 4.1.6 - dev: false - - /@types/cli-progress/3.11.0: - resolution: {integrity: sha1-7HnfmbJnV8PRxxcK+EIuD8le734=} - dependencies: - '@types/node': 17.0.15 - dev: false - - /@types/json-schema/7.0.11: - resolution: {integrity: sha1-1CG2xSejA398hEM/0sQingFoY9M=} - dev: false - - /@types/minimatch/3.0.5: - resolution: {integrity: sha1-EAHMXmo3BLg8I2An538vWOoBD0A=} - dev: false - - /@types/mocha/9.1.0: - resolution: {integrity: sha1-uvF6ssyj/M4tMi68MEVL/0h++tU=} - dev: false - - /@types/node/17.0.15: - resolution: {integrity: sha1-l3eSgsCcCVdxIKIWLnHYOAADWQo=} - dev: false - - /@types/semver/7.3.9: - resolution: {integrity: sha1-FSxsIKdojDC5Z+wYQdMazlaYY/w=} - dev: false - - /@types/tar-stream/2.2.2: - resolution: {integrity: sha1-vp0L6UBBZuSxFBUfk+hELmq2+x0=} - dependencies: - '@types/node': 17.0.15 - dev: false - - /@typescript-eslint/eslint-plugin/5.10.2_2595c2126aec4d4b6e944b931dabb4c2: - resolution: {integrity: sha1-+MHVn8N71tnRHJcmf9/nIsR3cVI=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.10.2_eslint@8.8.0+typescript@4.5.5 - '@typescript-eslint/scope-manager': 5.10.2 - '@typescript-eslint/type-utils': 5.10.2_eslint@8.8.0+typescript@4.5.5 - '@typescript-eslint/utils': 5.10.2_eslint@8.8.0+typescript@4.5.5 - debug: 4.3.4 - eslint: 8.8.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.4 - regexpp: 3.2.0 - semver: 7.3.5 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser/5.10.2_eslint@8.8.0+typescript@4.5.5: - resolution: {integrity: sha1-tgdtJ8xUmc4/LGJfXM3pRuy325o=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.10.2 - '@typescript-eslint/types': 5.10.2 - '@typescript-eslint/typescript-estree': 5.10.2_typescript@4.5.5 - debug: 4.3.4 - eslint: 8.8.0 - typescript: 4.5.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager/5.10.2: - resolution: {integrity: sha1-ksC8k17ADz2GOM3/s9DnDJuHljk=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.10.2 - '@typescript-eslint/visitor-keys': 5.10.2 - dev: false - - /@typescript-eslint/type-utils/5.10.2_eslint@8.8.0+typescript@4.5.5: - resolution: {integrity: sha1-rVrN+Yp9KrAwvqgfF9pFdRkQHOs=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/utils': 5.10.2_eslint@8.8.0+typescript@4.5.5 - debug: 4.3.4 - eslint: 8.8.0 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types/5.10.2: - resolution: {integrity: sha1-YE0V15XEYB//um7LRYf/n97GjOg=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - - /@typescript-eslint/typescript-estree/5.10.2_typescript@4.5.5: - resolution: {integrity: sha1-gQkGBWzT3cs1qjM/277zcTsP5Kc=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.10.2 - '@typescript-eslint/visitor-keys': 5.10.2 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.5 - tsutils: 3.21.0_typescript@4.5.5 - typescript: 4.5.5 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils/5.10.2_eslint@8.8.0+typescript@4.5.5: - resolution: {integrity: sha1-H803VHwyxkirEa6nFz7DAGDuh6g=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.10.2 - '@typescript-eslint/types': 5.10.2 - '@typescript-eslint/typescript-estree': 5.10.2_typescript@4.5.5 - eslint: 8.8.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.8.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys/5.10.2: - resolution: {integrity: sha1-/b8nLY5hwEXYZb1si0G+pz0iLz0=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.10.2 - eslint-visitor-keys: 3.3.0 - dev: false - - /@ungap/promise-all-settled/1.1.2: - resolution: {integrity: sha1-qlgEJxHW4ydd033Fl+XTHowpCkQ=} - dev: false - - /abort-controller/3.0.0: - resolution: {integrity: sha1-6vVNU7YrrkE46AnKIlyEOabvs5I=} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: false - - /acorn-jsx/5.3.2_acorn@8.8.2: - resolution: {integrity: sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.8.2 - dev: false - - /acorn/8.8.2: - resolution: {integrity: sha1-Gy8l2wKvllOZuXdrDCw5EnbTfEo=} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /ajv/6.12.6: - resolution: {integrity: sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: false - - /ansi-colors/4.1.1: - resolution: {integrity: sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=} - engines: {node: '>=6'} - dev: false - - /ansi-regex/4.1.1: - resolution: {integrity: sha1-Fk2qyHqy1vbbOimHXi0XZlgtq+0=} - engines: {node: '>=6'} - dev: false - - /ansi-regex/5.0.1: - resolution: {integrity: sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=} - engines: {node: '>=8'} - dev: false - - /ansi-styles/4.3.0: - resolution: {integrity: sha1-7dgDYornHATIWuegkG7a00tkiTc=} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - - /anymatch/3.1.3: - resolution: {integrity: sha1-eQxYsZuhcgqEIFtXxhjVrYUklz4=} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: false - - /argparse/2.0.1: - resolution: {integrity: sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=} - dev: false - - /array-differ/3.0.0: - resolution: {integrity: sha1-PLs9DzFoEOr8xHYkc0I31q7krms=} - engines: {node: '>=8'} - dev: false - - /array-union/2.1.0: - resolution: {integrity: sha1-t5hCCtvrHego2ErNii4j0+/oXo0=} - engines: {node: '>=8'} - dev: false - - /arrify/2.0.1: - resolution: {integrity: sha1-yWVekzHgq81YjSp8rX6ZVvZnAfo=} - engines: {node: '>=8'} - dev: false - - /asynckit/0.4.0: - resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} - dev: false - - /available-typed-arrays/1.0.5: - resolution: {integrity: sha1-kvlWFlAQadB9EO2y/DfT4cZRI7c=} - engines: {node: '>= 0.4'} - dev: false - - /balanced-match/1.0.2: - resolution: {integrity: sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=} - dev: false - - /base64-js/1.5.1: - resolution: {integrity: sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=} - dev: false - - /binary-extensions/2.2.0: - resolution: {integrity: sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=} - engines: {node: '>=8'} - dev: false - - /brace-expansion/1.1.11: - resolution: {integrity: sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: false - - /braces/3.0.2: - resolution: {integrity: sha1-NFThpGLujVmeI23zNs2epPiv4Qc=} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: false - - /browser-stdout/1.3.1: - resolution: {integrity: sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=} - dev: false - - /buffer-from/1.1.2: - resolution: {integrity: sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=} - dev: false - - /buffer/5.7.1: - resolution: {integrity: sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA=} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /call-bind/1.0.2: - resolution: {integrity: sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.0 - dev: false - - /callsites/3.1.0: - resolution: {integrity: sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=} - engines: {node: '>=6'} - dev: false - - /camelcase/6.3.0: - resolution: {integrity: sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo=} - engines: {node: '>=10'} - dev: false - - /chalk/4.1.0: - resolution: {integrity: sha1-ThSHCmGNni7dl92DRf2dncMVZGo=} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - - /chalk/4.1.2: - resolution: {integrity: sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - - /chokidar/3.5.3: - resolution: {integrity: sha1-HPN8hwe5Mr0a8a4iwEMuKs0ZA70=} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: false - - /cli-progress/3.11.1: - resolution: {integrity: sha1-Aq+xG+mhI/KjApMb6wh+r+Og2XE=} - engines: {node: '>=4'} - dependencies: - string-width: 4.2.3 - dev: false - - /cliui/7.0.4: - resolution: {integrity: sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /code-block-writer/10.1.1: - resolution: {integrity: sha1-rVaE7Uv7KweDyLExKBroTuZApC8=} - dev: false - - /color-convert/2.0.1: - resolution: {integrity: sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: false - - /color-name/1.1.4: - resolution: {integrity: sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=} - dev: false - - /combined-stream/1.0.8: - resolution: {integrity: sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - dev: false - - /cross-spawn/7.0.3: - resolution: {integrity: sha1-9zqFudXUHQRVUcF34ogtSshXKKY=} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: false - - /debug/4.3.3_supports-color@8.1.1: - resolution: {integrity: sha1-BCZuC3CpjURi5uKI44JZITMytmQ=} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: false - - /debug/4.3.4: - resolution: {integrity: sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: false - - /decamelize/4.0.0: - resolution: {integrity: sha1-qkcte/Zg6xXzSU79UxyrfypwmDc=} - engines: {node: '>=10'} - dev: false - - /deep-equal/1.1.1: - resolution: {integrity: sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=} - dependencies: - is-arguments: 1.1.1 - is-date-object: 1.0.5 - is-regex: 1.1.4 - object-is: 1.1.5 - object-keys: 1.1.1 - regexp.prototype.flags: 1.4.3 - dev: false - - /deep-is/0.1.4: - resolution: {integrity: sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=} - dev: false - - /define-properties/1.1.4: - resolution: {integrity: sha1-CxTXvX++svNXLDp+2oDqXVf7BbE=} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: false - - /defined/1.0.1: - resolution: {integrity: sha1-wLnbJ7+v/ZXW9hOZQZuJPfD5Hr8=} - dev: false - - /delayed-stream/1.0.0: - resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} - engines: {node: '>=0.4.0'} - dev: false - - /diff/5.0.0: - resolution: {integrity: sha1-ftatdthZ0DB4fsNYVfWx2vMdhSs=} - engines: {node: '>=0.3.1'} - dev: false - - /dir-glob/3.0.1: - resolution: {integrity: sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine/3.0.0: - resolution: {integrity: sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: false - - /dotignore/0.1.2: - resolution: {integrity: sha1-+ULyIA0ow6dvvdbw7p8yV8ii6QU=} - hasBin: true - dependencies: - minimatch: 3.1.2 - dev: false - - /emoji-regex/8.0.0: - resolution: {integrity: sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=} - dev: false - - /end-of-stream/1.4.4: - resolution: {integrity: sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=} - dependencies: - once: 1.4.0 - dev: false - - /es-abstract/1.21.1: - resolution: {integrity: sha1-5hBaCZlnwIN3gwoMnLWJ1XDdhsY=} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.4 - is-array-buffer: 3.0.1 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.10 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - dev: false - - /es-set-tostringtag/2.0.1: - resolution: {integrity: sha1-M41QL29nQwHXELgMhZLeihXwnNg=} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: false - - /es-to-primitive/1.2.1: - resolution: {integrity: sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: false - - /escalade/3.1.1: - resolution: {integrity: sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=} - engines: {node: '>=6'} - dev: false - - /escape-string-regexp/4.0.0: - resolution: {integrity: sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=} - engines: {node: '>=10'} - dev: false - - /eslint-plugin-notice/0.9.10_eslint@8.8.0: - resolution: {integrity: sha1-ic9jd78cAEohnE5UEyHqkSW0CMg=} - peerDependencies: - eslint: '>=3.0.0' - dependencies: - eslint: 8.8.0 - find-root: 1.1.0 - lodash: 4.17.21 - metric-lcs: 0.1.2 - dev: false - - /eslint-scope/5.1.1: - resolution: {integrity: sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false - - /eslint-scope/7.1.1: - resolution: {integrity: sha1-//NIlML2XlIm0wQaxIC0UToWNkI=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: false - - /eslint-utils/3.0.0_eslint@8.8.0: - resolution: {integrity: sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.8.0 - eslint-visitor-keys: 2.1.0 - dev: false - - /eslint-visitor-keys/2.1.0: - resolution: {integrity: sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=} - engines: {node: '>=10'} - dev: false - - /eslint-visitor-keys/3.3.0: - resolution: {integrity: sha1-9kgPprHzDv4tGWiqisdFuGJGmCY=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - - /eslint/8.8.0: - resolution: {integrity: sha1-l2K0mrrQy0lSU5/9sKBGOS5XGi0=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.9.5 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.8.0 - eslint-visitor-keys: 3.3.0 - espree: 9.4.1 - esquery: 1.4.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 6.0.2 - globals: 13.19.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - v8-compile-cache: 2.3.0 - transitivePeerDependencies: - - supports-color - dev: false - - /espree/9.4.1: - resolution: {integrity: sha1-UdYJJhVWeiws/3gzRF43wowAZb0=} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 - eslint-visitor-keys: 3.3.0 - dev: false - - /esquery/1.4.0: - resolution: {integrity: sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: false - - /esrecurse/4.3.0: - resolution: {integrity: sha1-eteWTWeauyi+5yzsY3WLHF0smSE=} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: false - - /estraverse/4.3.0: - resolution: {integrity: sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=} - engines: {node: '>=4.0'} - dev: false - - /estraverse/5.3.0: - resolution: {integrity: sha1-LupSkHAvJquP5TcDcP+GyWXSESM=} - engines: {node: '>=4.0'} - dev: false - - /esutils/2.0.3: - resolution: {integrity: sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=} - engines: {node: '>=0.10.0'} - dev: false - - /event-target-shim/5.0.1: - resolution: {integrity: sha1-XU0+vflYPWOlMzzi3rdICrKwV4k=} - engines: {node: '>=6'} - dev: false - - /fast-deep-equal/3.1.3: - resolution: {integrity: sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=} - dev: false - - /fast-glob/3.2.12: - resolution: {integrity: sha1-fznsmcLmqwMDNxQtqeDBjzevroA=} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify/2.1.0: - resolution: {integrity: sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=} - dev: false - - /fast-levenshtein/2.0.6: - resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} - dev: false - - /fastq/1.15.0: - resolution: {integrity: sha1-0E0HxqKmj+RZn+qNLhA6k3+uazo=} - dependencies: - reusify: 1.0.4 - dev: false - - /file-entry-cache/6.0.1: - resolution: {integrity: sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - dev: false - - /fill-range/7.0.1: - resolution: {integrity: sha1-GRmmp8df44ssfHflGYU12prN2kA=} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: false - - /find-root/1.1.0: - resolution: {integrity: sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=} - dev: false - - /find-up/5.0.0: - resolution: {integrity: sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: false - - /flat-cache/3.0.4: - resolution: {integrity: sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: false - - /flat/5.0.2: - resolution: {integrity: sha1-jKb+MyBp/6nTJMMnGYxZglnOskE=} - hasBin: true - dev: false - - /flatted/3.2.7: - resolution: {integrity: sha1-YJ85IHy2FLidB2W0d8stQ3+/l4c=} - dev: false - - /for-each/0.3.3: - resolution: {integrity: sha1-abRH6IoKXTLD5whPPxcQA0shN24=} - dependencies: - is-callable: 1.2.7 - dev: false - - /form-data/2.5.1: - resolution: {integrity: sha1-8svsV7XlniNxbhKP5E1OXdI4lfQ=} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /fs-constants/1.0.0: - resolution: {integrity: sha1-a+Dem+mYzhavivwkSXue6bfM2a0=} - dev: false - - /fs.realpath/1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} - dev: false - - /fsevents/2.3.2: - resolution: {integrity: sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /function-bind/1.1.1: - resolution: {integrity: sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=} - dev: false - - /function.prototype.name/1.1.5: - resolution: {integrity: sha1-zOBQX+H/uAUD5vnkbMZORqEqliE=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - functions-have-names: 1.2.3 - dev: false - - /functional-red-black-tree/1.0.1: - resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} - dev: false - - /functions-have-names/1.2.3: - resolution: {integrity: sha1-BAT+TuK6L2B/Dg7DyAuumUEzuDQ=} - dev: false - - /get-caller-file/2.0.5: - resolution: {integrity: sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false - - /get-intrinsic/1.2.0: - resolution: {integrity: sha1-etHcBTXzopBLugdXcnY+UFH20F8=} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: false - - /get-symbol-description/1.0.0: - resolution: {integrity: sha1-f9uByQAQH71WTdXxowr1qtweWNY=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - dev: false - - /glob-parent/5.1.2: - resolution: {integrity: sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: false - - /glob-parent/6.0.2: - resolution: {integrity: sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: false - - /glob/7.2.0: - resolution: {integrity: sha1-0VU1r3cy4C6Uj0xBYovZECk/YCM=} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - - /glob/7.2.3: - resolution: {integrity: sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - - /globals/13.19.0: - resolution: {integrity: sha1-ekLejmrU9yQvvMon6lsjrKNntcg=} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: false - - /globalthis/1.0.3: - resolution: {integrity: sha1-WFKIKlK4DcMBsGYCc+HtCC8LbM8=} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.1.4 - dev: false - - /globby/11.1.0: - resolution: {integrity: sha1-vUvpi7BC+D15b344EZkfvoKg00s=} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /gopd/1.0.1: - resolution: {integrity: sha1-Kf923mnax0ibfAkYpXiOVkd8Myw=} - dependencies: - get-intrinsic: 1.2.0 - dev: false - - /growl/1.10.5: - resolution: {integrity: sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=} - engines: {node: '>=4.x'} - dev: false - - /has-bigints/1.0.2: - resolution: {integrity: sha1-CHG9Pj1RYm9soJZmaLo11WAtbqo=} - dev: false - - /has-flag/4.0.0: - resolution: {integrity: sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=} - engines: {node: '>=8'} - dev: false - - /has-property-descriptors/1.0.0: - resolution: {integrity: sha1-YQcIYAYG02lh7QTBlhk7amB/qGE=} - dependencies: - get-intrinsic: 1.2.0 - dev: false - - /has-proto/1.0.1: - resolution: {integrity: sha1-GIXBMFU4lYr/Rp/vN5N8InlUCOA=} - engines: {node: '>= 0.4'} - dev: false - - /has-symbols/1.0.3: - resolution: {integrity: sha1-u3ssQ0klHc6HsSX3vfh0qnyLOfg=} - engines: {node: '>= 0.4'} - dev: false - - /has-tostringtag/1.0.0: - resolution: {integrity: sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: false - - /has/1.0.3: - resolution: {integrity: sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: false - - /he/1.2.0: - resolution: {integrity: sha1-hK5l+n6vsWX922FWauFLrwVmTw8=} - hasBin: true - dev: false - - /ieee754/1.2.1: - resolution: {integrity: sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=} - dev: false - - /ignore/5.2.4: - resolution: {integrity: sha1-opHAxheP8blgvv5H/N7DAWdKYyQ=} - engines: {node: '>= 4'} - dev: false - - /import-fresh/3.3.0: - resolution: {integrity: sha1-NxYsJfy566oublPVtNiM4X2eDCs=} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: false - - /imurmurhash/0.1.4: - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} - engines: {node: '>=0.8.19'} - dev: false - - /inflight/1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: false - - /inherits/2.0.4: - resolution: {integrity: sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=} - dev: false - - /internal-slot/1.0.4: - resolution: {integrity: sha1-hVHnuvdKemul90nPsWqmByLw1vM=} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - side-channel: 1.0.4 - dev: false - - /ip-regex/2.1.0: - resolution: {integrity: sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=} - engines: {node: '>=4'} - dev: false - - /is-absolute/1.0.0: - resolution: {integrity: sha1-OV4a6EsR8mrReV5zwXN45IowFXY=} - engines: {node: '>=0.10.0'} - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - dev: false - - /is-arguments/1.1.1: - resolution: {integrity: sha1-FbP4j9oB8ql/7ITKdhpWDxI++ps=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: false - - /is-array-buffer/3.0.1: - resolution: {integrity: sha1-3rHbT8rkgwjVTvJEJwbAOTmXBSo=} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 - dev: false - - /is-bigint/1.0.4: - resolution: {integrity: sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=} - dependencies: - has-bigints: 1.0.2 - dev: false - - /is-binary-path/2.1.0: - resolution: {integrity: sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: false - - /is-boolean-object/1.1.2: - resolution: {integrity: sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: false - - /is-callable/1.2.7: - resolution: {integrity: sha1-O8KoXqdC2eNiBdys3XLKH9xRsFU=} - engines: {node: '>= 0.4'} - dev: false - - /is-core-module/2.11.0: - resolution: {integrity: sha1-rUyz44Y+gUUjyW8/WNJsxXD/AUQ=} - dependencies: - has: 1.0.3 - dev: false - - /is-date-object/1.0.5: - resolution: {integrity: sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: false - - /is-extglob/2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} - engines: {node: '>=0.10.0'} - dev: false - - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=} - engines: {node: '>=8'} - dev: false - - /is-glob/4.0.3: - resolution: {integrity: sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: false - - /is-negated-glob/1.0.0: - resolution: {integrity: sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=} - engines: {node: '>=0.10.0'} - dev: false - - /is-negative-zero/2.0.2: - resolution: {integrity: sha1-e/bwOigAO4s5Zd46wm9mTXZfMVA=} - engines: {node: '>= 0.4'} - dev: false - - /is-number-object/1.0.7: - resolution: {integrity: sha1-WdUK2kxFJReE6ZBPUkbHQvB6Qvw=} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: false - - /is-number/7.0.0: - resolution: {integrity: sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=} - engines: {node: '>=0.12.0'} - dev: false - - /is-plain-obj/2.1.0: - resolution: {integrity: sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=} - engines: {node: '>=8'} - dev: false - - /is-regex/1.1.4: - resolution: {integrity: sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: false - - /is-relative/1.0.0: - resolution: {integrity: sha1-obtpNc6MXboei5dUubLcwCDiJg0=} - engines: {node: '>=0.10.0'} - dependencies: - is-unc-path: 1.0.0 - dev: false - - /is-shared-array-buffer/1.0.2: - resolution: {integrity: sha1-jyWcVztgtqMtQFihoHQwwKc0THk=} - dependencies: - call-bind: 1.0.2 - dev: false - - /is-string/1.0.7: - resolution: {integrity: sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: false - - /is-symbol/1.0.4: - resolution: {integrity: sha1-ptrJO2NbBjymhyI23oiRClevE5w=} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: false - - /is-typed-array/1.1.10: - resolution: {integrity: sha1-NqW1y0GJtXXRo+SwhTa/tIWAHj8=} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: false - - /is-unc-path/1.0.0: - resolution: {integrity: sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=} - engines: {node: '>=0.10.0'} - dependencies: - unc-path-regex: 0.1.2 - dev: false - - /is-unicode-supported/0.1.0: - resolution: {integrity: sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=} - engines: {node: '>=10'} - dev: false - - /is-weakref/1.0.2: - resolution: {integrity: sha1-lSnzg6kzggXol2XgOS78LxAPBvI=} - dependencies: - call-bind: 1.0.2 - dev: false - - /is-windows/1.0.2: - resolution: {integrity: sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=} - engines: {node: '>=0.10.0'} - dev: false - - /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} - dev: false - - /js-yaml/4.1.0: - resolution: {integrity: sha1-wftl+PUBeQHN0slRhkuhhFihBgI=} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: false - - /json-schema-traverse/0.4.1: - resolution: {integrity: sha1-afaofZUTq4u4/mO9sJecRI5oRmA=} - dev: false - - /json-stable-stringify-without-jsonify/1.0.1: - resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} - dev: false - - /levn/0.4.1: - resolution: {integrity: sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: false - - /locate-path/6.0.0: - resolution: {integrity: sha1-VTIeswn+u8WcSAHZMackUqaB0oY=} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: false - - /lodash.merge/4.6.2: - resolution: {integrity: sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=} - dev: false - - /lodash/4.17.21: - resolution: {integrity: sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=} - dev: false - - /log-symbols/4.1.0: - resolution: {integrity: sha1-P727lbRoOsn8eFER55LlWNSr1QM=} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: false - - /lru-cache/6.0.0: - resolution: {integrity: sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: false - - /merge2/1.4.1: - resolution: {integrity: sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=} - engines: {node: '>= 8'} - dev: false - - /metric-lcs/0.1.2: - resolution: {integrity: sha1-h5E/FJQQ45x8WhkDdRKBTq8VXhE=} - dev: false - - /micromatch/4.0.5: - resolution: {integrity: sha1-vImZp8u/d83InxMvbkZwUbSQkMY=} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db/1.52.0: - resolution: {integrity: sha1-u6vNwChZ9JhzAchW4zh85exDv3A=} - engines: {node: '>= 0.6'} - dev: false - - /mime-types/2.1.35: - resolution: {integrity: sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /minimatch/3.1.2: - resolution: {integrity: sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimatch/4.2.1: - resolution: {integrity: sha1-QNnVEaRr3E5WPCLDCAzenA2CmbQ=} - engines: {node: '>=10'} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimist/1.2.6: - resolution: {integrity: sha1-hjelt1nqDW6YcCz7OpKDMjyTr0Q=} - dev: false - - /minimist/1.2.7: - resolution: {integrity: sha1-2qHE2R9Qc5BDfGqLwBB45wAMTRg=} - dev: false - - /mkdirp/1.0.4: - resolution: {integrity: sha1-PrXtYmInVteaXw4qIh3+utdcL34=} - engines: {node: '>=10'} - hasBin: true - dev: false - - /mocha/9.2.2: - resolution: {integrity: sha1-1w20a9uTyldALICTM+WoSXeoj7k=} - engines: {node: '>= 12.0.0'} - hasBin: true - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3_supports-color@8.1.1 - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - dev: false - - /ms/2.1.2: - resolution: {integrity: sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=} - dev: false - - /ms/2.1.3: - resolution: {integrity: sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=} - dev: false - - /multimatch/5.0.0: - resolution: {integrity: sha1-kyuACWPOp6MaAzMo+h4MOhh02+Y=} - engines: {node: '>=10'} - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: false - - /nanoid/3.3.1: - resolution: {integrity: sha1-Y0ehjKyIr4j1ivCzWUtyPV6ZuzU=} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false - - /natural-compare/1.4.0: - resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} - dev: false - - /node-fetch/2.6.8: - resolution: {integrity: sha1-po0wsWK8HY/XGjZ+gbmX4fTUk34=} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /normalize-path/3.0.0: - resolution: {integrity: sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=} - engines: {node: '>=0.10.0'} - dev: false - - /object-inspect/1.12.3: - resolution: {integrity: sha1-umLf/WfuJWyMCG365p4BbNHxmLk=} - dev: false - - /object-is/1.1.5: - resolution: {integrity: sha1-ud7qpfx/GEag+uzc7sE45XePU6w=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - dev: false - - /object-keys/1.1.1: - resolution: {integrity: sha1-HEfyct8nfzsdrwYWd9nILiMixg4=} - engines: {node: '>= 0.4'} - dev: false - - /object.assign/4.1.4: - resolution: {integrity: sha1-lnPHx8NRq4xNC1FvQ0Pr9N+3eZ8=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: false - - /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} - dependencies: - wrappy: 1.0.2 - dev: false - - /optionator/0.9.1: - resolution: {integrity: sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - dev: false - - /p-limit/3.1.0: - resolution: {integrity: sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: false - - /p-locate/5.0.0: - resolution: {integrity: sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: false - - /parent-module/1.0.1: - resolution: {integrity: sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: false - - /path-exists/4.0.0: - resolution: {integrity: sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=} - engines: {node: '>=8'} - dev: false - - /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} - engines: {node: '>=0.10.0'} - dev: false - - /path-key/3.1.1: - resolution: {integrity: sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=} - engines: {node: '>=8'} - dev: false - - /path-parse/1.0.7: - resolution: {integrity: sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=} - dev: false - - /path-type/4.0.0: - resolution: {integrity: sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=} - engines: {node: '>=8'} - dev: false - - /picomatch/2.3.1: - resolution: {integrity: sha1-O6ODNzNkbZ0+SZWUbBNlpn+wekI=} - engines: {node: '>=8.6'} - dev: false - - /prelude-ls/1.2.1: - resolution: {integrity: sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=} - engines: {node: '>= 0.8.0'} - dev: false - - /psl/1.9.0: - resolution: {integrity: sha1-0N8qE38AeUVl/K87LADNCfjVpac=} - dev: false - - /punycode/2.3.0: - resolution: {integrity: sha1-9n+mfJTaj00M//mBruQRgGQZm48=} - engines: {node: '>=6'} - dev: false - - /queue-microtask/1.2.3: - resolution: {integrity: sha1-SSkii7xyTfrEPg77BYyve2z7YkM=} - dev: false - - /randombytes/2.1.0: - resolution: {integrity: sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /readdirp/3.6.0: - resolution: {integrity: sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: false - - /regexp.prototype.flags/1.4.3: - resolution: {integrity: sha1-h8qzD4D2ZmAYGju3v1mBqHKzZ6w=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - functions-have-names: 1.2.3 - dev: false - - /regexpp/3.2.0: - resolution: {integrity: sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=} - engines: {node: '>=8'} - dev: false - - /require-directory/2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} - engines: {node: '>=0.10.0'} - dev: false - - /resolve-from/4.0.0: - resolution: {integrity: sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=} - engines: {node: '>=4'} - dev: false - - /resolve/1.22.1: - resolution: {integrity: sha1-J8suu1P5GrtJRwqSi7p1WAZqwXc=} - hasBin: true - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: false - - /resumer/0.0.0: - resolution: {integrity: sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=} - dependencies: - through: 2.3.8 - dev: false - - /reusify/1.0.4: - resolution: {integrity: sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: false - - /rimraf/3.0.2: - resolution: {integrity: sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=} - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /run-parallel/1.2.0: - resolution: {integrity: sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=} - dependencies: - queue-microtask: 1.2.3 - dev: false - - /safe-buffer/5.2.1: - resolution: {integrity: sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=} - dev: false - - /safe-regex-test/1.0.0: - resolution: {integrity: sha1-eTuHTVJOs2QNGHOq0DWW2y1PIpU=} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-regex: 1.1.4 - dev: false - - /sax/1.2.4: - resolution: {integrity: sha1-KBYjTiN4vdxOU1T6tcqold9xANk=} - dev: false - - /sed-lite/0.8.4: - resolution: {integrity: sha1-TuLP9GDYamUhmm75XdrbZuY3dLw=} - dev: false - - /semver/7.3.5: - resolution: {integrity: sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - - /serialize-javascript/6.0.0: - resolution: {integrity: sha1-765diPRdeSQUHai1w6en5mP+/rg=} - dependencies: - randombytes: 2.1.0 - dev: false - - /shebang-command/2.0.0: - resolution: {integrity: sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: false - - /shebang-regex/3.0.0: - resolution: {integrity: sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=} - engines: {node: '>=8'} - dev: false - - /side-channel/1.0.4: - resolution: {integrity: sha1-785cj9wQTudRslxY1CkAEfpeos8=} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 - dev: false - - /slash/3.0.0: - resolution: {integrity: sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=} - engines: {node: '>=8'} - dev: false - - /sorted-btree/1.6.0: - resolution: {integrity: sha1-s3mUIR7VjkAUznyh4/a2yrqVT3o=} - dev: false - - /source-map-support/0.5.21: - resolution: {integrity: sha1-BP58f54e0tZiIzwoyys1ufY/bk8=} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: false - - /source-map/0.6.1: - resolution: {integrity: sha1-dHIq8y6WFOnCh6jQu95IteLxomM=} - engines: {node: '>=0.10.0'} - dev: false - - /string-width/4.2.3: - resolution: {integrity: sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: false - - /string.prototype.trim/1.2.7: - resolution: {integrity: sha1-poNSdAhZ9ok/FM4+8bswN/epBTM=} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: false - - /string.prototype.trimend/1.0.6: - resolution: {integrity: sha1-xKJ/oCbZedecBPFzl/JQpGKURTM=} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: false - - /string.prototype.trimstart/1.0.6: - resolution: {integrity: sha1-6Qq2aqjkAH2S71kbvzzUIsVr3PQ=} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.21.1 - dev: false - - /strip-ansi/5.2.0: - resolution: {integrity: sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=} - engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - dev: false - - /strip-ansi/6.0.1: - resolution: {integrity: sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: false - - /strip-json-comments/3.1.1: - resolution: {integrity: sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=} - engines: {node: '>=8'} - dev: false - - /supports-color/7.2.0: - resolution: {integrity: sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: false - - /supports-color/8.1.1: - resolution: {integrity: sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: false - - /supports-preserve-symlinks-flag/1.0.0: - resolution: {integrity: sha1-btpL00SjyUrqN21MwxvHcxEDngk=} - engines: {node: '>= 0.4'} - dev: false - - /tape/4.16.2: - resolution: {integrity: sha1-dWXmryBCZWVVcmbp3achWGmyl7Y=} - hasBin: true - dependencies: - call-bind: 1.0.2 - deep-equal: 1.1.1 - defined: 1.0.1 - dotignore: 0.1.2 - for-each: 0.3.3 - glob: 7.2.3 - has: 1.0.3 - inherits: 2.0.4 - is-regex: 1.1.4 - minimist: 1.2.7 - object-inspect: 1.12.3 - resolve: 1.22.1 - resumer: 0.0.0 - string.prototype.trim: 1.2.7 - through: 2.3.8 - dev: false - - /text-table/0.2.0: - resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} - dev: false - - /through/2.3.8: - resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} - dev: false - - /to-regex-range/5.0.1: - resolution: {integrity: sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: false - - /tough-cookie/3.0.1: - resolution: {integrity: sha1-nfT1fnOcJpMKAYGEiH9K233Kc7I=} - engines: {node: '>=6'} - dependencies: - ip-regex: 2.1.0 - psl: 1.9.0 - punycode: 2.3.0 - dev: false - - /tr46/0.0.3: - resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} - dev: false - - /translate-strings/1.1.15: - resolution: {integrity: sha1-PoTack2jIs6+u2+KDpVm6hMo6p4=} - engines: {node: '>=10.12.0'} - hasBin: true - dependencies: - '@azure/cognitiveservices-translatortext': 1.0.1 - '@azure/ms-rest-azure-js': 2.1.0 - chalk: 4.1.0 - ts-morph: 9.1.0 - transitivePeerDependencies: - - encoding - dev: false - - /ts-morph/9.1.0: - resolution: {integrity: sha1-ENIIg4fHHzxnT4JJKjzsHjU48N0=} - dependencies: - '@dsherret/to-absolute-glob': 2.0.2 - '@ts-morph/common': 0.7.5 - code-block-writer: 10.1.1 - dev: false - - /tslib/1.14.1: - resolution: {integrity: sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=} - dev: false - - /tslib/2.5.0: - resolution: {integrity: sha1-Qr/thvV4eutB0DGGbI9AJCng/d8=} - dev: false - - /tsutils/3.21.0_typescript@4.5.5: - resolution: {integrity: sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 4.5.5 - dev: false - - /tunnel/0.0.6: - resolution: {integrity: sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - dev: false - - /txtgen/2.2.8: - resolution: {integrity: sha1-geJ+WnQxfL3Qb5EsHCzHorZXHAM=} - engines: {node: '>= 10.14.2'} - dev: false - - /type-check/0.4.0: - resolution: {integrity: sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: false - - /type-fest/0.20.2: - resolution: {integrity: sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=} - engines: {node: '>=10'} - dev: false - - /typed-array-length/1.0.4: - resolution: {integrity: sha1-idg3heXECYvscuCLMZZR8OrJwbs=} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - dev: false - - /typescript/4.1.6: - resolution: {integrity: sha1-G+zYXXdWfDx0EXIznpPOLmmTITg=} - engines: {node: '>=4.2.0'} - hasBin: true - dev: false - - /typescript/4.5.5: - resolution: {integrity: sha1-2MlTgy0okkqePTfHPXKchGxYlvM=} - engines: {node: '>=4.2.0'} - hasBin: true - dev: false - - /unbox-primitive/1.0.2: - resolution: {integrity: sha1-KQMgIQV9Xmzb0IxRKcIm3/jtb54=} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: false - - /unbzip2-stream/1.4.3: - resolution: {integrity: sha1-sNoExDcTEd93HNwhXofyEwmRrOc=} - dependencies: - buffer: 5.7.1 - through: 2.3.8 - dev: false - - /unc-path-regex/0.1.2: - resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} - engines: {node: '>=0.10.0'} - dev: false - - /uri-js/4.4.1: - resolution: {integrity: sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=} - dependencies: - punycode: 2.3.0 - dev: false - - /uuid/8.3.2: - resolution: {integrity: sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=} - hasBin: true - dev: false - - /v8-compile-cache/2.3.0: - resolution: {integrity: sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=} - dev: false - - /vscode-uri/3.0.3: - resolution: {integrity: sha1-qVwc4ub0G3VJ+GJ50Z9HlR5PTYQ=} - dev: false - - /webidl-conversions/3.0.1: - resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} - dev: false - - /whatwg-url/5.0.0: - resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - - /which-boxed-primitive/1.0.2: - resolution: {integrity: sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: false - - /which-typed-array/1.1.9: - resolution: {integrity: sha1-MHz4mAJYSM+ZXnlehCPH8zfvveY=} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - dev: false - - /which/2.0.2: - resolution: {integrity: sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - - /word-wrap/1.2.3: - resolution: {integrity: sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=} - engines: {node: '>=0.10.0'} - dev: false - - /workerpool/6.2.0: - resolution: {integrity: sha1-gn2Tyboj7iAZw/+v9cJ/zOoonos=} - dev: false - - /wrap-ansi/7.0.0: - resolution: {integrity: sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - - /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - dev: false - - /xml-writer/1.7.0: - resolution: {integrity: sha1-t28dWRwWomNOvbcDx729D9aBkGU=} - engines: {node: '>=0.4.0'} - dev: false - - /xml2js/0.4.23: - resolution: {integrity: sha1-oMaVFnUkIesqx1juTUzPWIQ+rGY=} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.2.4 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder/11.0.1: - resolution: {integrity: sha1-vpuuHIoEbnazESdyY0fQrXACvrM=} - engines: {node: '>=4.0'} - dev: false - - /y18n/5.0.8: - resolution: {integrity: sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=} - engines: {node: '>=10'} - dev: false - - /yallist/4.0.0: - resolution: {integrity: sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=} - dev: false - - /yaml/2.0.0-10: - resolution: {integrity: sha1-1bWeLRS4aDMTpTTyu8ZI4hGidT4=} - engines: {node: '>= 12'} - dev: false - - /yargs-parser/20.2.4: - resolution: {integrity: sha1-tCiQ8UVmeW+Fro46JSkNIF8VSlQ=} - engines: {node: '>=10'} - dev: false - - /yargs-unparser/2.0.0: - resolution: {integrity: sha1-8TH5ImkRrl2a04xDL+gJNmwjJes=} - engines: {node: '>=10'} - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - dev: false - - /yargs/16.2.0: - resolution: {integrity: sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - dev: false - - /yocto-queue/0.1.0: - resolution: {integrity: sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=} - engines: {node: '>=10'} - dev: false - - file:projects/tar-stream.tgz: - resolution: {integrity: sha512-nvhITZd7tBuaPdqIbR6vk9a7iQzf2OtURzlkW+eSEPkRj3N1GJ5XcFWYqDWzzW2YxG1ydg2JygmRspWglyxebQ==, tarball: file:projects/tar-stream.tgz} - name: '@rush-temp/tar-stream' - version: 0.0.0 - dependencies: - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - tape: 4.16.2 - dev: false - - file:projects/vcpkg-ce.test.tgz: - resolution: {integrity: sha512-CjNovfuw+7shEaaOF1DaQ7qy9XOCUyDtt3LFOU1PdwMq/IRK0s41EiBTPid6mRHHZpg4bq4I2/hnlyAZBZNZ0Q==, tarball: file:projects/vcpkg-ce.test.tgz} - name: '@rush-temp/vcpkg-ce.test' - version: 0.0.0 - dependencies: - '@types/mocha': 9.1.0 - '@types/node': 17.0.15 - '@types/semver': 7.3.9 - '@typescript-eslint/eslint-plugin': 5.10.2_2595c2126aec4d4b6e944b931dabb4c2 - '@typescript-eslint/parser': 5.10.2_eslint@8.8.0+typescript@4.5.5 - eslint: 8.8.0 - eslint-plugin-notice: 0.9.10_eslint@8.8.0 - mocha: 9.2.2 - semver: 7.3.5 - source-map-support: 0.5.21 - txtgen: 2.2.8 - typescript: 4.5.5 - yaml: 2.0.0-10 - transitivePeerDependencies: - - supports-color - dev: false - - file:projects/vcpkg-ce.tgz: - resolution: {integrity: sha512-791+3Wj/2gx0yqGJGiM3I93G08AkGeGYxQN/Brz91ZIGLNKKlRLusG/8JV/MMrsccFdGSC2vEtpiJMocirXG7A==, tarball: file:projects/vcpkg-ce.tgz} - name: '@rush-temp/vcpkg-ce' - version: 0.0.0 - dependencies: - '@snyk/nuget-semver': 1.3.0 - '@types/cli-progress': 3.11.0 - '@types/node': 17.0.15 - '@types/semver': 7.3.9 - '@types/tar-stream': 2.2.2 - '@typescript-eslint/eslint-plugin': 5.10.2_2595c2126aec4d4b6e944b931dabb4c2 - '@typescript-eslint/parser': 5.10.2_eslint@8.8.0+typescript@4.5.5 - chalk: 4.1.2 - cli-progress: 3.11.1 - eslint: 8.8.0 - eslint-plugin-notice: 0.9.10_eslint@8.8.0 - sed-lite: 0.8.4 - semver: 7.3.5 - sorted-btree: 1.6.0 - source-map-support: 0.5.21 - strip-ansi: 5.2.0 - translate-strings: 1.1.15 - typescript: 4.5.5 - unbzip2-stream: 1.4.3 - vscode-uri: 3.0.3 - xml-writer: 1.7.0 - yaml: 2.0.0-10 - transitivePeerDependencies: - - encoding - - supports-color - dev: false diff --git a/ce/common/config/rush/version-policies.json b/ce/common/config/rush/version-policies.json deleted file mode 100644 index ef0b4ba10c..0000000000 --- a/ce/common/config/rush/version-policies.json +++ /dev/null @@ -1,90 +0,0 @@ -/** - * This is configuration file is used for advanced publishing configurations with Rush. - * For full documentation, please see https://rushjs.io - */ - -/** - * A list of version policy definitions. A "version policy" is a custom package versioning - * strategy that affects "rush change", "rush version", and "rush publish". The strategy applies - * to a set of projects that are specified using the "versionPolicyName" field in rush.json. - */ -[ - // { - // /** - // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). - // * - // * The "lockStepVersion" mode specifies that the projects will use "lock-step versioning". This - // * strategy is appropriate for a set of packages that act as selectable components of a - // * unified product. The entire set of packages are always published together, and always share - // * the same NPM version number. When the packages depend on other packages in the set, the - // * SemVer range is usually restricted to a single version. - // */ - // "definitionName": "lockStepVersion", - // - // /** - // * (Required) The name that will be used for the "versionPolicyName" field in rush.json. - // * This name is also used command-line parameters such as "--version-policy" - // * and "--to-version-policy". - // */ - // "policyName": "MyBigFramework", - // - // /** - // * (Required) The current version. All packages belonging to the set should have this version - // * in the current branch. When bumping versions, Rush uses this to determine the next version. - // * (The "version" field in package.json is NOT considered.) - // */ - // "version": "1.0.0", - // - // /** - // * (Required) The type of bump that will be performed when publishing the next release. - // * When creating a release branch in Git, this field should be updated according to the - // * type of release. - // * - // * Valid values are: "prerelease", "release", "minor", "patch", "major" - // */ - // "nextBump": "prerelease", - // - // /** - // * (Optional) If specified, all packages in the set share a common CHANGELOG.md file. - // * This file is stored with the specified "main" project, which must be a member of the set. - // * - // * If this field is omitted, then a separate CHANGELOG.md file will be maintained for each - // * package in the set. - // */ - // "mainProject": "my-app" - // }, - // - // { - // /** - // * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion"). - // * - // * The "individualVersion" mode specifies that the projects will use "individual versioning". - // * This is the typical NPM model where each package has an independent version number - // * and CHANGELOG.md file. Although a single CI definition is responsible for publishing the - // * packages, they otherwise don't have any special relationship. The version bumping will - // * depend on how developers answer the "rush change" questions for each package that - // * is changed. - // */ - // "definitionName": "individualVersion", - // - // "policyName": "MyRandomLibraries", - // - // /** - // * (Optional) This can be used to enforce that all packages in the set must share a common - // * major version number, e.g. because they are from the same major release branch. - // * It can also be used to discourage people from accidentally making "MAJOR" SemVer changes - // * inappropriately. The minor/patch version parts will be bumped independently according - // * to the types of changes made to each project, according to the "rush change" command. - // */ - // "lockedMajor": 3, - // - // /** - // * (Optional) When publishing is managed by Rush, by default the "rush change" command will - // * request changes for any projects that are modified by a pull request. These change entries - // * will produce a CHANGELOG.md file. If you author your CHANGELOG.md manually or announce updates - // * in some other way, set "exemptFromRushChange" to true to tell "rush change" to ignore the projects - // * belonging to this version policy. - // */ - // "exemptFromRushChange": false - // } -] diff --git a/ce/common/scripts/install-run-rush.js b/ce/common/scripts/install-run-rush.js deleted file mode 100644 index 5afdb9ad84..0000000000 --- a/ce/common/scripts/install-run-rush.js +++ /dev/null @@ -1,86 +0,0 @@ -"use strict"; -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it. -// An example usage would be: -// -// node common/scripts/install-run-rush.js install -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ -const path = __importStar(require("path")); -const fs = __importStar(require("fs")); -const install_run_1 = require("./install-run"); -const PACKAGE_NAME = '@microsoft/rush'; -const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; -function _getRushVersion() { - const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; - if (rushPreviewVersion !== undefined) { - console.log(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`); - return rushPreviewVersion; - } - const rushJsonFolder = (0, install_run_1.findRushJsonFolder)(); - const rushJsonPath = path.join(rushJsonFolder, install_run_1.RUSH_JSON_FILENAME); - try { - const rushJsonContents = fs.readFileSync(rushJsonPath, 'utf-8'); - // Use a regular expression to parse out the rushVersion value because rush.json supports comments, - // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script. - const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/); - return rushJsonMatches[1]; - } - catch (e) { - throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` + - "The 'rushVersion' field is either not assigned in rush.json or was specified " + - 'using an unexpected syntax.'); - } -} -function _run() { - const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv; - // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the - // appropriate binary inside the rush package to run - const scriptName = path.basename(scriptPath); - const bin = scriptName.toLowerCase() === 'install-run-rushx.js' ? 'rushx' : 'rush'; - if (!nodePath || !scriptPath) { - throw new Error('Unexpected exception: could not detect node path or script path'); - } - if (process.argv.length < 3) { - console.log(`Usage: ${scriptName} [args...]`); - if (scriptName === 'install-run-rush.js') { - console.log(`Example: ${scriptName} build --to myproject`); - } - else { - console.log(`Example: ${scriptName} custom-command`); - } - process.exit(1); - } - (0, install_run_1.runWithErrorAndStatusCode)(() => { - const version = _getRushVersion(); - console.log(`The rush.json configuration requests Rush version ${version}`); - return (0, install_run_1.installAndRun)(PACKAGE_NAME, version, bin, packageBinArgs); - }); -} -_run(); -//# sourceMappingURL=install-run-rush.js.map \ No newline at end of file diff --git a/ce/common/scripts/install-run-rushx.js b/ce/common/scripts/install-run-rushx.js deleted file mode 100644 index bf26eb5e50..0000000000 --- a/ce/common/scripts/install-run-rushx.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. -Object.defineProperty(exports, "__esModule", { value: true }); -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the -// rushx command. -// -// An example usage would be: -// -// node common/scripts/install-run-rushx.js custom-command -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ -require("./install-run-rush"); -//# sourceMappingURL=install-run-rushx.js.map \ No newline at end of file diff --git a/ce/common/scripts/install-run.js b/ce/common/scripts/install-run.js deleted file mode 100644 index fa5522e847..0000000000 --- a/ce/common/scripts/install-run.js +++ /dev/null @@ -1,478 +0,0 @@ -"use strict"; -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See the @microsoft/rush package's LICENSE file for license information. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.runWithErrorAndStatusCode = exports.installAndRun = exports.findRushJsonFolder = exports.getNpmPath = exports.RUSH_JSON_FILENAME = void 0; -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where a Node tool may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the specified -// version of the specified tool (if not already installed), and then pass a command-line to it. -// An example usage would be: -// -// node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ -const childProcess = __importStar(require("child_process")); -const fs = __importStar(require("fs")); -const os = __importStar(require("os")); -const path = __importStar(require("path")); -exports.RUSH_JSON_FILENAME = 'rush.json'; -const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; -const INSTALLED_FLAG_FILENAME = 'installed.flag'; -const NODE_MODULES_FOLDER_NAME = 'node_modules'; -const PACKAGE_JSON_FILENAME = 'package.json'; -/** - * Parse a package specifier (in the form of name\@version) into name and version parts. - */ -function _parsePackageSpecifier(rawPackageSpecifier) { - rawPackageSpecifier = (rawPackageSpecifier || '').trim(); - const separatorIndex = rawPackageSpecifier.lastIndexOf('@'); - let name; - let version = undefined; - if (separatorIndex === 0) { - // The specifier starts with a scope and doesn't have a version specified - name = rawPackageSpecifier; - } - else if (separatorIndex === -1) { - // The specifier doesn't have a version - name = rawPackageSpecifier; - } - else { - name = rawPackageSpecifier.substring(0, separatorIndex); - version = rawPackageSpecifier.substring(separatorIndex + 1); - } - if (!name) { - throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`); - } - return { name, version }; -} -/** - * As a workaround, copyAndTrimNpmrcFile() copies the .npmrc file to the target folder, and also trims - * unusable lines from the .npmrc file. - * - * Why are we trimming the .npmrc lines? NPM allows environment variables to be specified in - * the .npmrc file to provide different authentication tokens for different registry. - * However, if the environment variable is undefined, it expands to an empty string, which - * produces a valid-looking mapping with an invalid URL that causes an error. Instead, - * we'd prefer to skip that line and continue looking in other places such as the user's - * home directory. - * - * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities.copyAndTrimNpmrcFile() - */ -function _copyAndTrimNpmrcFile(sourceNpmrcPath, targetNpmrcPath) { - console.log(`Transforming ${sourceNpmrcPath}`); // Verbose - console.log(` --> "${targetNpmrcPath}"`); - let npmrcFileLines = fs.readFileSync(sourceNpmrcPath).toString().split('\n'); - npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim()); - const resultLines = []; - // This finds environment variable tokens that look like "${VAR_NAME}" - const expansionRegExp = /\$\{([^\}]+)\}/g; - // Comment lines start with "#" or ";" - const commentRegExp = /^\s*[#;]/; - // Trim out lines that reference environment variables that aren't defined - for (const line of npmrcFileLines) { - let lineShouldBeTrimmed = false; - // Ignore comment lines - if (!commentRegExp.test(line)) { - const environmentVariables = line.match(expansionRegExp); - if (environmentVariables) { - for (const token of environmentVariables) { - // Remove the leading "${" and the trailing "}" from the token - const environmentVariableName = token.substring(2, token.length - 1); - // Is the environment variable defined? - if (!process.env[environmentVariableName]) { - // No, so trim this line - lineShouldBeTrimmed = true; - break; - } - } - } - } - if (lineShouldBeTrimmed) { - // Example output: - // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}" - resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line); - } - else { - resultLines.push(line); - } - } - fs.writeFileSync(targetNpmrcPath, resultLines.join(os.EOL)); -} -/** - * syncNpmrc() copies the .npmrc file to the target folder, and also trims unusable lines from the .npmrc file. - * If the source .npmrc file not exist, then syncNpmrc() will delete an .npmrc that is found in the target folder. - * - * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc() - */ -function _syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish) { - const sourceNpmrcPath = path.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish'); - const targetNpmrcPath = path.join(targetNpmrcFolder, '.npmrc'); - try { - if (fs.existsSync(sourceNpmrcPath)) { - _copyAndTrimNpmrcFile(sourceNpmrcPath, targetNpmrcPath); - } - else if (fs.existsSync(targetNpmrcPath)) { - // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target - console.log(`Deleting ${targetNpmrcPath}`); // Verbose - fs.unlinkSync(targetNpmrcPath); - } - } - catch (e) { - throw new Error(`Error syncing .npmrc file: ${e}`); - } -} -let _npmPath = undefined; -/** - * Get the absolute path to the npm executable - */ -function getNpmPath() { - if (!_npmPath) { - try { - if (os.platform() === 'win32') { - // We're on Windows - const whereOutput = childProcess.execSync('where npm', { stdio: [] }).toString(); - const lines = whereOutput.split(os.EOL).filter((line) => !!line); - // take the last result, we are looking for a .cmd command - // see https://github.com/microsoft/rushstack/issues/759 - _npmPath = lines[lines.length - 1]; - } - else { - // We aren't on Windows - assume we're on *NIX or Darwin - _npmPath = childProcess.execSync('command -v npm', { stdio: [] }).toString(); - } - } - catch (e) { - throw new Error(`Unable to determine the path to the NPM tool: ${e}`); - } - _npmPath = _npmPath.trim(); - if (!fs.existsSync(_npmPath)) { - throw new Error('The NPM executable does not exist'); - } - } - return _npmPath; -} -exports.getNpmPath = getNpmPath; -function _ensureFolder(folderPath) { - if (!fs.existsSync(folderPath)) { - const parentDir = path.dirname(folderPath); - _ensureFolder(parentDir); - fs.mkdirSync(folderPath); - } -} -/** - * Create missing directories under the specified base directory, and return the resolved directory. - * - * Does not support "." or ".." path segments. - * Assumes the baseFolder exists. - */ -function _ensureAndJoinPath(baseFolder, ...pathSegments) { - let joinedPath = baseFolder; - try { - for (let pathSegment of pathSegments) { - pathSegment = pathSegment.replace(/[\\\/]/g, '+'); - joinedPath = path.join(joinedPath, pathSegment); - if (!fs.existsSync(joinedPath)) { - fs.mkdirSync(joinedPath); - } - } - } - catch (e) { - throw new Error(`Error building local installation folder (${path.join(baseFolder, ...pathSegments)}): ${e}`); - } - return joinedPath; -} -function _getRushTempFolder(rushCommonFolder) { - const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME]; - if (rushTempFolder !== undefined) { - _ensureFolder(rushTempFolder); - return rushTempFolder; - } - else { - return _ensureAndJoinPath(rushCommonFolder, 'temp'); - } -} -/** - * Resolve a package specifier to a static version - */ -function _resolvePackageVersion(rushCommonFolder, { name, version }) { - if (!version) { - version = '*'; // If no version is specified, use the latest version - } - if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) { - // If the version contains only characters that we recognize to be used in static version specifiers, - // pass the version through - return version; - } - else { - // version resolves to - try { - const rushTempFolder = _getRushTempFolder(rushCommonFolder); - const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush'); - _syncNpmrc(sourceNpmrcFolder, rushTempFolder); - const npmPath = getNpmPath(); - // This returns something that looks like: - // @microsoft/rush@3.0.0 '3.0.0' - // @microsoft/rush@3.0.1 '3.0.1' - // ... - // @microsoft/rush@3.0.20 '3.0.20' - // - const npmVersionSpawnResult = childProcess.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier'], { - cwd: rushTempFolder, - stdio: [] - }); - if (npmVersionSpawnResult.status !== 0) { - throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`); - } - const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString(); - const versionLines = npmViewVersionOutput.split('\n').filter((line) => !!line); - const latestVersion = versionLines[versionLines.length - 1]; - if (!latestVersion) { - throw new Error('No versions found for the specified version range.'); - } - const versionMatches = latestVersion.match(/^.+\s\'(.+)\'$/); - if (!versionMatches) { - throw new Error(`Invalid npm output ${latestVersion}`); - } - return versionMatches[1]; - } - catch (e) { - throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`); - } - } -} -let _rushJsonFolder; -/** - * Find the absolute path to the folder containing rush.json - */ -function findRushJsonFolder() { - if (!_rushJsonFolder) { - let basePath = __dirname; - let tempPath = __dirname; - do { - const testRushJsonPath = path.join(basePath, exports.RUSH_JSON_FILENAME); - if (fs.existsSync(testRushJsonPath)) { - _rushJsonFolder = basePath; - break; - } - else { - basePath = tempPath; - } - } while (basePath !== (tempPath = path.dirname(basePath))); // Exit the loop when we hit the disk root - if (!_rushJsonFolder) { - throw new Error('Unable to find rush.json.'); - } - } - return _rushJsonFolder; -} -exports.findRushJsonFolder = findRushJsonFolder; -/** - * Detects if the package in the specified directory is installed - */ -function _isPackageAlreadyInstalled(packageInstallFolder) { - try { - const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); - if (!fs.existsSync(flagFilePath)) { - return false; - } - const fileContents = fs.readFileSync(flagFilePath).toString(); - return fileContents.trim() === process.version; - } - catch (e) { - return false; - } -} -/** - * Removes the following files and directories under the specified folder path: - * - installed.flag - * - - * - node_modules - */ -function _cleanInstallFolder(rushTempFolder, packageInstallFolder) { - try { - const flagFile = path.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); - if (fs.existsSync(flagFile)) { - fs.unlinkSync(flagFile); - } - const packageLockFile = path.resolve(packageInstallFolder, 'package-lock.json'); - if (fs.existsSync(packageLockFile)) { - fs.unlinkSync(packageLockFile); - } - const nodeModulesFolder = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); - if (fs.existsSync(nodeModulesFolder)) { - const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); - fs.renameSync(nodeModulesFolder, path.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); - } - } - catch (e) { - throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`); - } -} -function _createPackageJson(packageInstallFolder, name, version) { - try { - const packageJsonContents = { - name: 'ci-rush', - version: '0.0.0', - dependencies: { - [name]: version - }, - description: "DON'T WARN", - repository: "DON'T WARN", - license: 'MIT' - }; - const packageJsonPath = path.join(packageInstallFolder, PACKAGE_JSON_FILENAME); - fs.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2)); - } - catch (e) { - throw new Error(`Unable to create package.json: ${e}`); - } -} -/** - * Run "npm install" in the package install folder. - */ -function _installPackage(packageInstallFolder, name, version) { - try { - console.log(`Installing ${name}...`); - const npmPath = getNpmPath(); - const result = childProcess.spawnSync(npmPath, ['install'], { - stdio: 'inherit', - cwd: packageInstallFolder, - env: process.env - }); - if (result.status !== 0) { - throw new Error('"npm install" encountered an error'); - } - console.log(`Successfully installed ${name}@${version}`); - } - catch (e) { - throw new Error(`Unable to install package: ${e}`); - } -} -/** - * Get the ".bin" path for the package. - */ -function _getBinPath(packageInstallFolder, binName) { - const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); - const resolvedBinName = os.platform() === 'win32' ? `${binName}.cmd` : binName; - return path.resolve(binFolderPath, resolvedBinName); -} -/** - * Write a flag file to the package's install directory, signifying that the install was successful. - */ -function _writeFlagFile(packageInstallFolder) { - try { - const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); - fs.writeFileSync(flagFilePath, process.version); - } - catch (e) { - throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); - } -} -function installAndRun(packageName, packageVersion, packageBinName, packageBinArgs) { - const rushJsonFolder = findRushJsonFolder(); - const rushCommonFolder = path.join(rushJsonFolder, 'common'); - const rushTempFolder = _getRushTempFolder(rushCommonFolder); - const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); - if (!_isPackageAlreadyInstalled(packageInstallFolder)) { - // The package isn't already installed - _cleanInstallFolder(rushTempFolder, packageInstallFolder); - const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush'); - _syncNpmrc(sourceNpmrcFolder, packageInstallFolder); - _createPackageJson(packageInstallFolder, packageName, packageVersion); - _installPackage(packageInstallFolder, packageName, packageVersion); - _writeFlagFile(packageInstallFolder); - } - const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; - const statusMessageLine = new Array(statusMessage.length + 1).join('-'); - console.log(os.EOL + statusMessage + os.EOL + statusMessageLine + os.EOL); - const binPath = _getBinPath(packageInstallFolder, packageBinName); - const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); - // Windows environment variables are case-insensitive. Instead of using SpawnSyncOptions.env, we need to - // assign via the process.env proxy to ensure that we append to the right PATH key. - const originalEnvPath = process.env.PATH || ''; - let result; - try { - // Node.js on Windows can not spawn a file when the path has a space on it - // unless the path gets wrapped in a cmd friendly way and shell mode is used - const shouldUseShell = binPath.includes(' ') && os.platform() === 'win32'; - const platformBinPath = shouldUseShell ? `"${binPath}"` : binPath; - process.env.PATH = [binFolderPath, originalEnvPath].join(path.delimiter); - result = childProcess.spawnSync(platformBinPath, packageBinArgs, { - stdio: 'inherit', - windowsVerbatimArguments: false, - shell: shouldUseShell, - cwd: process.cwd(), - env: process.env - }); - } - finally { - process.env.PATH = originalEnvPath; - } - if (result.status !== null) { - return result.status; - } - else { - throw result.error || new Error('An unknown error occurred.'); - } -} -exports.installAndRun = installAndRun; -function runWithErrorAndStatusCode(fn) { - process.exitCode = 1; - try { - const exitCode = fn(); - process.exitCode = exitCode; - } - catch (e) { - console.error(os.EOL + os.EOL + e.toString() + os.EOL + os.EOL); - } -} -exports.runWithErrorAndStatusCode = runWithErrorAndStatusCode; -function _run() { - const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv; - if (!nodePath) { - throw new Error('Unexpected exception: could not detect node path'); - } - if (path.basename(scriptPath).toLowerCase() !== 'install-run.js') { - // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control - // to the script that (presumably) imported this file - return; - } - if (process.argv.length < 4) { - console.log('Usage: install-run.js @ [args...]'); - console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io'); - process.exit(1); - } - runWithErrorAndStatusCode(() => { - const rushJsonFolder = findRushJsonFolder(); - const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common'); - const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier); - const name = packageSpecifier.name; - const version = _resolvePackageVersion(rushCommonFolder, packageSpecifier); - if (packageSpecifier.version !== version) { - console.log(`Resolved to ${name}@${version}`); - } - return installAndRun(name, version, packageBinName, packageBinArgs); - }); -} -_run(); -//# sourceMappingURL=install-run.js.map \ No newline at end of file diff --git a/ce/custom/tar-stream/.gitignore b/ce/custom/tar-stream/.gitignore deleted file mode 100644 index 7938f33ae1..0000000000 --- a/ce/custom/tar-stream/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -sandbox.js diff --git a/ce/custom/tar-stream/.npmrc b/ce/custom/tar-stream/.npmrc deleted file mode 100644 index e97097d512..0000000000 --- a/ce/custom/tar-stream/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -registry=https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ -lockfileVersion=3 diff --git a/ce/custom/tar-stream/BufferList.js b/ce/custom/tar-stream/BufferList.js deleted file mode 100644 index 471ee77889..0000000000 --- a/ce/custom/tar-stream/BufferList.js +++ /dev/null @@ -1,396 +0,0 @@ -'use strict' - -const { Buffer } = require('buffer') -const symbol = Symbol.for('BufferList') - -function BufferList (buf) { - if (!(this instanceof BufferList)) { - return new BufferList(buf) - } - - BufferList._init.call(this, buf) -} - -BufferList._init = function _init (buf) { - Object.defineProperty(this, symbol, { value: true }) - - this._bufs = [] - this.length = 0 - - if (buf) { - this.append(buf) - } -} - -BufferList.prototype._new = function _new (buf) { - return new BufferList(buf) -} - -BufferList.prototype._offset = function _offset (offset) { - if (offset === 0) { - return [0, 0] - } - - let tot = 0 - - for (let i = 0; i < this._bufs.length; i++) { - const _t = tot + this._bufs[i].length - if (offset < _t || i === this._bufs.length - 1) { - return [i, offset - tot] - } - tot = _t - } -} - -BufferList.prototype._reverseOffset = function (blOffset) { - const bufferId = blOffset[0] - let offset = blOffset[1] - - for (let i = 0; i < bufferId; i++) { - offset += this._bufs[i].length - } - - return offset -} - -BufferList.prototype.get = function get (index) { - if (index > this.length || index < 0) { - return undefined - } - - const offset = this._offset(index) - - return this._bufs[offset[0]][offset[1]] -} - -BufferList.prototype.slice = function slice (start, end) { - if (typeof start === 'number' && start < 0) { - start += this.length - } - - if (typeof end === 'number' && end < 0) { - end += this.length - } - - return this.copy(null, 0, start, end) -} - -BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) { - if (typeof srcStart !== 'number' || srcStart < 0) { - srcStart = 0 - } - - if (typeof srcEnd !== 'number' || srcEnd > this.length) { - srcEnd = this.length - } - - if (srcStart >= this.length) { - return dst || Buffer.alloc(0) - } - - if (srcEnd <= 0) { - return dst || Buffer.alloc(0) - } - - const copy = !!dst - const off = this._offset(srcStart) - const len = srcEnd - srcStart - let bytes = len - let bufoff = (copy && dstStart) || 0 - let start = off[1] - - // copy/slice everything - if (srcStart === 0 && srcEnd === this.length) { - if (!copy) { - // slice, but full concat if multiple buffers - return this._bufs.length === 1 - ? this._bufs[0] - : Buffer.concat(this._bufs, this.length) - } - - // copy, need to copy individual buffers - for (let i = 0; i < this._bufs.length; i++) { - this._bufs[i].copy(dst, bufoff) - bufoff += this._bufs[i].length - } - - return dst - } - - // easy, cheap case where it's a subset of one of the buffers - if (bytes <= this._bufs[off[0]].length - start) { - return copy - ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) - : this._bufs[off[0]].slice(start, start + bytes) - } - - if (!copy) { - // a slice, we need something to copy in to - dst = Buffer.allocUnsafe(len) - } - - for (let i = off[0]; i < this._bufs.length; i++) { - const l = this._bufs[i].length - start - - if (bytes > l) { - this._bufs[i].copy(dst, bufoff, start) - bufoff += l - } else { - this._bufs[i].copy(dst, bufoff, start, start + bytes) - bufoff += l - break - } - - bytes -= l - - if (start) { - start = 0 - } - } - - // safeguard so that we don't return uninitialized memory - if (dst.length > bufoff) return dst.slice(0, bufoff) - - return dst -} - -BufferList.prototype.shallowSlice = function shallowSlice (start, end) { - start = start || 0 - end = typeof end !== 'number' ? this.length : end - - if (start < 0) { - start += this.length - } - - if (end < 0) { - end += this.length - } - - if (start === end) { - return this._new() - } - - const startOffset = this._offset(start) - const endOffset = this._offset(end) - const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1) - - if (endOffset[1] === 0) { - buffers.pop() - } else { - buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1]) - } - - if (startOffset[1] !== 0) { - buffers[0] = buffers[0].slice(startOffset[1]) - } - - return this._new(buffers) -} - -BufferList.prototype.toString = function toString (encoding, start, end) { - return this.slice(start, end).toString(encoding) -} - -BufferList.prototype.consume = function consume (bytes) { - // first, normalize the argument, in accordance with how Buffer does it - bytes = Math.trunc(bytes) - // do nothing if not a positive number - if (Number.isNaN(bytes) || bytes <= 0) return this - - while (this._bufs.length) { - if (bytes >= this._bufs[0].length) { - bytes -= this._bufs[0].length - this.length -= this._bufs[0].length - this._bufs.shift() - } else { - this._bufs[0] = this._bufs[0].slice(bytes) - this.length -= bytes - break - } - } - - return this -} - -BufferList.prototype.duplicate = function duplicate () { - const copy = this._new() - - for (let i = 0; i < this._bufs.length; i++) { - copy.append(this._bufs[i]) - } - - return copy -} - -BufferList.prototype.append = function append (buf) { - if (buf == null) { - return this - } - - if (buf.buffer) { - // append a view of the underlying ArrayBuffer - this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)) - } else if (Array.isArray(buf)) { - for (let i = 0; i < buf.length; i++) { - this.append(buf[i]) - } - } else if (this._isBufferList(buf)) { - // unwrap argument into individual BufferLists - for (let i = 0; i < buf._bufs.length; i++) { - this.append(buf._bufs[i]) - } - } else { - // coerce number arguments to strings, since Buffer(number) does - // uninitialized memory allocation - if (typeof buf === 'number') { - buf = buf.toString() - } - - this._appendBuffer(Buffer.from(buf)) - } - - return this -} - -BufferList.prototype._appendBuffer = function appendBuffer (buf) { - this._bufs.push(buf) - this.length += buf.length -} - -BufferList.prototype.indexOf = function (search, offset, encoding) { - if (encoding === undefined && typeof offset === 'string') { - encoding = offset - offset = undefined - } - - if (typeof search === 'function' || Array.isArray(search)) { - throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.') - } else if (typeof search === 'number') { - search = Buffer.from([search]) - } else if (typeof search === 'string') { - search = Buffer.from(search, encoding) - } else if (this._isBufferList(search)) { - search = search.slice() - } else if (Array.isArray(search.buffer)) { - search = Buffer.from(search.buffer, search.byteOffset, search.byteLength) - } else if (!Buffer.isBuffer(search)) { - search = Buffer.from(search) - } - - offset = Number(offset || 0) - - if (isNaN(offset)) { - offset = 0 - } - - if (offset < 0) { - offset = this.length + offset - } - - if (offset < 0) { - offset = 0 - } - - if (search.length === 0) { - return offset > this.length ? this.length : offset - } - - const blOffset = this._offset(offset) - let blIndex = blOffset[0] // index of which internal buffer we're working on - let buffOffset = blOffset[1] // offset of the internal buffer we're working on - - // scan over each buffer - for (; blIndex < this._bufs.length; blIndex++) { - const buff = this._bufs[blIndex] - - while (buffOffset < buff.length) { - const availableWindow = buff.length - buffOffset - - if (availableWindow >= search.length) { - const nativeSearchResult = buff.indexOf(search, buffOffset) - - if (nativeSearchResult !== -1) { - return this._reverseOffset([blIndex, nativeSearchResult]) - } - - buffOffset = buff.length - search.length + 1 // end of native search window - } else { - const revOffset = this._reverseOffset([blIndex, buffOffset]) - - if (this._match(revOffset, search)) { - return revOffset - } - - buffOffset++ - } - } - - buffOffset = 0 - } - - return -1 -} - -BufferList.prototype._match = function (offset, search) { - if (this.length - offset < search.length) { - return false - } - - for (let searchOffset = 0; searchOffset < search.length; searchOffset++) { - if (this.get(offset + searchOffset) !== search[searchOffset]) { - return false - } - } - return true -} - -;(function () { - const methods = { - readDoubleBE: 8, - readDoubleLE: 8, - readFloatBE: 4, - readFloatLE: 4, - readInt32BE: 4, - readInt32LE: 4, - readUInt32BE: 4, - readUInt32LE: 4, - readInt16BE: 2, - readInt16LE: 2, - readUInt16BE: 2, - readUInt16LE: 2, - readInt8: 1, - readUInt8: 1, - readIntBE: null, - readIntLE: null, - readUIntBE: null, - readUIntLE: null - } - - for (const m in methods) { - (function (m) { - if (methods[m] === null) { - BufferList.prototype[m] = function (offset, byteLength) { - return this.slice(offset, offset + byteLength)[m](0, byteLength) - } - } else { - BufferList.prototype[m] = function (offset = 0) { - return this.slice(offset, offset + methods[m])[m](0) - } - } - }(m)) - } -}()) - -// Used internally by the class and also as an indicator of this object being -// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser -// environment because there could be multiple different copies of the -// BufferList class and some `BufferList`s might be `BufferList`s. -BufferList.prototype._isBufferList = function _isBufferList (b) { - return b instanceof BufferList || BufferList.isBufferList(b) -} - -BufferList.isBufferList = function isBufferList (b) { - return b != null && b[symbol] -} - -module.exports = BufferList diff --git a/ce/custom/tar-stream/LICENSE b/ce/custom/tar-stream/LICENSE deleted file mode 100644 index 757562ec59..0000000000 --- a/ce/custom/tar-stream/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Mathias Buus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/ce/custom/tar-stream/README.md b/ce/custom/tar-stream/README.md deleted file mode 100644 index 2679d9d018..0000000000 --- a/ce/custom/tar-stream/README.md +++ /dev/null @@ -1,168 +0,0 @@ -# tar-stream - -tar-stream is a streaming tar parser and generator and nothing else. It is streams2 and operates purely using streams which means you can easily extract/parse tarballs without ever hitting the file system. - -Note that you still need to gunzip your data if you have a `.tar.gz`. We recommend using [gunzip-maybe](https://github.com/mafintosh/gunzip-maybe) in conjunction with this. - -``` -npm install tar-stream -``` - -[![build status](https://secure.travis-ci.org/mafintosh/tar-stream.png)](http://travis-ci.org/mafintosh/tar-stream) -[![License](https://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT) - -## Usage - -tar-stream exposes two streams, [pack](https://github.com/mafintosh/tar-stream#packing) which creates tarballs and [extract](https://github.com/mafintosh/tar-stream#extracting) which extracts tarballs. To [modify an existing tarball](https://github.com/mafintosh/tar-stream#modifying-existing-tarballs) use both. - - -It implementes USTAR with additional support for pax extended headers. It should be compatible with all popular tar distributions out there (gnutar, bsdtar etc) - -## Related - -If you want to pack/unpack directories on the file system check out [tar-fs](https://github.com/mafintosh/tar-fs) which provides file system bindings to this module. - -## Packing - -To create a pack stream use `tar.pack()` and call `pack.entry(header, [callback])` to add tar entries. - -``` js -var tar = require('tar-stream') -var pack = tar.pack() // pack is a streams2 stream - -// add a file called my-test.txt with the content "Hello World!" -pack.entry({ name: 'my-test.txt' }, 'Hello World!') - -// add a file called my-stream-test.txt from a stream -var entry = pack.entry({ name: 'my-stream-test.txt', size: 11 }, function(err) { - // the stream was added - // no more entries - pack.finalize() -}) - -entry.write('hello') -entry.write(' ') -entry.write('world') -entry.end() - -// pipe the pack stream somewhere -pack.pipe(process.stdout) -``` - -## Extracting - -To extract a stream use `tar.extract()` and listen for `extract.on('entry', (header, stream, next) )` - -``` js -var extract = tar.extract() - -extract.on('entry', function(header, stream, next) { - // header is the tar header - // stream is the content body (might be an empty stream) - // call next when you are done with this entry - - stream.on('end', function() { - next() // ready for next entry - }) - - stream.resume() // just auto drain the stream -}) - -extract.on('finish', function() { - // all entries read -}) - -pack.pipe(extract) -``` - -The tar archive is streamed sequentially, meaning you **must** drain each entry's stream as you get them or else the main extract stream will receive backpressure and stop reading. - -## Headers - -The header object using in `entry` should contain the following properties. -Most of these values can be found by stat'ing a file. - -``` js -{ - name: 'path/to/this/entry.txt', - size: 1314, // entry size. defaults to 0 - mode: 0o644, // entry mode. defaults to to 0o755 for dirs and 0o644 otherwise - mtime: new Date(), // last modified date for entry. defaults to now. - type: 'file', // type of entry. defaults to file. can be: - // file | link | symlink | directory | block-device - // character-device | fifo | contiguous-file - linkname: 'path', // linked file name - uid: 0, // uid of entry owner. defaults to 0 - gid: 0, // gid of entry owner. defaults to 0 - uname: 'maf', // uname of entry owner. defaults to null - gname: 'staff', // gname of entry owner. defaults to null - devmajor: 0, // device major version. defaults to 0 - devminor: 0 // device minor version. defaults to 0 -} -``` - -## Modifying existing tarballs - -Using tar-stream it is easy to rewrite paths / change modes etc in an existing tarball. - -``` js -var extract = tar.extract() -var pack = tar.pack() -var path = require('path') - -extract.on('entry', function(header, stream, callback) { - // let's prefix all names with 'tmp' - header.name = path.join('tmp', header.name) - // write the new entry to the pack stream - stream.pipe(pack.entry(header, callback)) -}) - -extract.on('finish', function() { - // all entries done - lets finalize it - pack.finalize() -}) - -// pipe the old tarball to the extractor -oldTarballStream.pipe(extract) - -// pipe the new tarball the another stream -pack.pipe(newTarballStream) -``` - -## Saving tarball to fs - - -``` js -var fs = require('fs') -var tar = require('tar-stream') - -var pack = tar.pack() // pack is a streams2 stream -var path = 'YourTarBall.tar' -var yourTarball = fs.createWriteStream(path) - -// add a file called YourFile.txt with the content "Hello World!" -pack.entry({name: 'YourFile.txt'}, 'Hello World!', function (err) { - if (err) throw err - pack.finalize() -}) - -// pipe the pack stream to your file -pack.pipe(yourTarball) - -yourTarball.on('close', function () { - console.log(path + ' has been written') - fs.stat(path, function(err, stats) { - if (err) throw err - console.log(stats) - console.log('Got file info successfully!') - }) -}) -``` - -## Performance - -[See tar-fs for a performance comparison with node-tar](https://github.com/mafintosh/tar-fs/blob/master/README.md#performance) - -# License - -MIT diff --git a/ce/custom/tar-stream/bl.js b/ce/custom/tar-stream/bl.js deleted file mode 100644 index 7244e88554..0000000000 --- a/ce/custom/tar-stream/bl.js +++ /dev/null @@ -1,84 +0,0 @@ -'use strict' - -const DuplexStream = require('stream').Duplex -const inherits = require('inherits') -const BufferList = require('./BufferList') - -function BufferListStream (callback) { - if (!(this instanceof BufferListStream)) { - return new BufferListStream(callback) - } - - if (typeof callback === 'function') { - this._callback = callback - - const piper = function piper (err) { - if (this._callback) { - this._callback(err) - this._callback = null - } - }.bind(this) - - this.on('pipe', function onPipe (src) { - src.on('error', piper) - }) - this.on('unpipe', function onUnpipe (src) { - src.removeListener('error', piper) - }) - - callback = null - } - - BufferList._init.call(this, callback) - DuplexStream.call(this) -} - -inherits(BufferListStream, DuplexStream) -Object.assign(BufferListStream.prototype, BufferList.prototype) - -BufferListStream.prototype._new = function _new (callback) { - return new BufferListStream(callback) -} - -BufferListStream.prototype._write = function _write (buf, encoding, callback) { - this._appendBuffer(buf) - - if (typeof callback === 'function') { - callback() - } -} - -BufferListStream.prototype._read = function _read (size) { - if (!this.length) { - return this.push(null) - } - - size = Math.min(size, this.length) - this.push(this.slice(0, size)) - this.consume(size) -} - -BufferListStream.prototype.end = function end (chunk) { - DuplexStream.prototype.end.call(this, chunk) - - if (this._callback) { - this._callback(null, this.slice()) - this._callback = null - } -} - -BufferListStream.prototype._destroy = function _destroy (err, cb) { - this._bufs.length = 0 - this.length = 0 - cb(err) -} - -BufferListStream.prototype._isBufferList = function _isBufferList (b) { - return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b) -} - -BufferListStream.isBufferList = BufferList.isBufferList - -module.exports = BufferListStream -module.exports.BufferListStream = BufferListStream -module.exports.BufferList = BufferList diff --git a/ce/custom/tar-stream/extract.js b/ce/custom/tar-stream/extract.js deleted file mode 100644 index f55d4d4516..0000000000 --- a/ce/custom/tar-stream/extract.js +++ /dev/null @@ -1,257 +0,0 @@ -var util = require('util') -var bl = require('./bl') -var headers = require('./headers') - -var Writable = require('stream').Writable -var PassThrough = require('stream').PassThrough - -var noop = function () {} - -var overflow = function (size) { - size &= 511 - return size && 512 - size -} - -var emptyStream = function (self, offset) { - var s = new Source(self, offset) - s.end() - return s -} - -var mixinPax = function (header, pax) { - if (pax.path) header.name = pax.path - if (pax.linkpath) header.linkname = pax.linkpath - if (pax.size) header.size = parseInt(pax.size, 10) - header.pax = pax - return header -} - -var Source = function (self, offset) { - this._parent = self - this.offset = offset - PassThrough.call(this, { autoDestroy: false }) -} - -util.inherits(Source, PassThrough) - -Source.prototype.destroy = function (err) { - this._parent.destroy(err) -} - -var Extract = function (opts) { - if (!(this instanceof Extract)) return new Extract(opts) - Writable.call(this, opts) - - opts = opts || {} - - this._offset = 0 - this._buffer = bl() - this._missing = 0 - this._partial = false - this._onparse = noop - this._header = null - this._stream = null - this._overflow = null - this._cb = null - this._locked = false - this._destroyed = false - this._pax = null - this._paxGlobal = null - this._gnuLongPath = null - this._gnuLongLinkPath = null - - var self = this - var b = self._buffer - - var oncontinue = function () { - self._continue() - } - - var onunlock = function (err) { - self._locked = false - if (err) return self.destroy(err) - if (!self._stream) oncontinue() - } - - var onstreamend = function () { - self._stream = null - var drain = overflow(self._header.size) - if (drain) self._parse(drain, ondrain) - else self._parse(512, onheader) - if (!self._locked) oncontinue() - } - - var ondrain = function () { - self._buffer.consume(overflow(self._header.size)) - self._parse(512, onheader) - oncontinue() - } - - var onpaxglobalheader = function () { - var size = self._header.size - self._paxGlobal = headers.decodePax(b.slice(0, size)) - b.consume(size) - onstreamend() - } - - var onpaxheader = function () { - var size = self._header.size - self._pax = headers.decodePax(b.slice(0, size)) - if (self._paxGlobal) self._pax = Object.assign({}, self._paxGlobal, self._pax) - b.consume(size) - onstreamend() - } - - var ongnulongpath = function () { - var size = self._header.size - this._gnuLongPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding) - b.consume(size) - onstreamend() - } - - var ongnulonglinkpath = function () { - var size = self._header.size - this._gnuLongLinkPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding) - b.consume(size) - onstreamend() - } - - var onheader = function () { - var offset = self._offset - var header - try { - header = self._header = headers.decode(b.slice(0, 512), opts.filenameEncoding, opts.allowUnknownFormat) - } catch (err) { - self.emit('error', err) - } - b.consume(512) - - if (!header) { - self._parse(512, onheader) - oncontinue() - return - } - if (header.type === 'gnu-long-path') { - self._parse(header.size, ongnulongpath) - oncontinue() - return - } - if (header.type === 'gnu-long-link-path') { - self._parse(header.size, ongnulonglinkpath) - oncontinue() - return - } - if (header.type === 'pax-global-header') { - self._parse(header.size, onpaxglobalheader) - oncontinue() - return - } - if (header.type === 'pax-header') { - self._parse(header.size, onpaxheader) - oncontinue() - return - } - - if (self._gnuLongPath) { - header.name = self._gnuLongPath - self._gnuLongPath = null - } - - if (self._gnuLongLinkPath) { - header.linkname = self._gnuLongLinkPath - self._gnuLongLinkPath = null - } - - if (self._pax) { - self._header = header = mixinPax(header, self._pax) - self._pax = null - } - - self._locked = true - - if (!header.size || header.type === 'directory') { - self._parse(512, onheader) - self.emit('entry', header, emptyStream(self, offset), onunlock) - return - } - - self._stream = new Source(self, offset) - - self.emit('entry', header, self._stream, onunlock) - self._parse(header.size, onstreamend) - oncontinue() - } - - this._onheader = onheader - this._parse(512, onheader) -} - -util.inherits(Extract, Writable) - -Extract.prototype.destroy = function (err) { - if (this._destroyed) return - this._destroyed = true - - if (err) this.emit('error', err) - this.emit('close') - if (this._stream) this._stream.emit('close') -} - -Extract.prototype._parse = function (size, onparse) { - if (this._destroyed) return - this._offset += size - this._missing = size - if (onparse === this._onheader) this._partial = false - this._onparse = onparse -} - -Extract.prototype._continue = function () { - if (this._destroyed) return - var cb = this._cb - this._cb = noop - if (this._overflow) this._write(this._overflow, undefined, cb) - else cb() -} - -Extract.prototype._write = function (data, enc, cb) { - if (this._destroyed) return - - var s = this._stream - var b = this._buffer - var missing = this._missing - if (data.length) this._partial = true - - // we do not reach end-of-chunk now. just forward it - - if (data.length < missing) { - this._missing -= data.length - this._overflow = null - if (s) return s.write(data, cb) - b.append(data) - return cb() - } - - // end-of-chunk. the parser should call cb. - - this._cb = cb - this._missing = 0 - - var overflow = null - if (data.length > missing) { - overflow = data.slice(missing) - data = data.slice(0, missing) - } - - if (s) s.end(data) - else b.append(data) - - this._overflow = overflow - this._onparse() -} - -Extract.prototype._final = function (cb) { - if (this._partial) return this.destroy(new Error('Unexpected end of data')) - cb() -} - -module.exports = Extract diff --git a/ce/custom/tar-stream/headers.js b/ce/custom/tar-stream/headers.js deleted file mode 100644 index aba4ca49a6..0000000000 --- a/ce/custom/tar-stream/headers.js +++ /dev/null @@ -1,295 +0,0 @@ -var alloc = Buffer.alloc - -var ZEROS = '0000000000000000000' -var SEVENS = '7777777777777777777' -var ZERO_OFFSET = '0'.charCodeAt(0) -var USTAR_MAGIC = Buffer.from('ustar\x00', 'binary') -var USTAR_VER = Buffer.from('00', 'binary') -var GNU_MAGIC = Buffer.from('ustar\x20', 'binary') -var GNU_VER = Buffer.from('\x20\x00', 'binary') -var MASK = parseInt('7777', 8) -var MAGIC_OFFSET = 257 -var VERSION_OFFSET = 263 - -var clamp = function (index, len, defaultValue) { - if (typeof index !== 'number') return defaultValue - index = ~~index // Coerce to integer. - if (index >= len) return len - if (index >= 0) return index - index += len - if (index >= 0) return index - return 0 -} - -var toType = function (flag) { - switch (flag) { - case 0: - return 'file' - case 1: - return 'link' - case 2: - return 'symlink' - case 3: - return 'character-device' - case 4: - return 'block-device' - case 5: - return 'directory' - case 6: - return 'fifo' - case 7: - return 'contiguous-file' - case 72: - return 'pax-header' - case 55: - return 'pax-global-header' - case 27: - return 'gnu-long-link-path' - case 28: - case 30: - return 'gnu-long-path' - } - - return null -} - -var toTypeflag = function (flag) { - switch (flag) { - case 'file': - return 0 - case 'link': - return 1 - case 'symlink': - return 2 - case 'character-device': - return 3 - case 'block-device': - return 4 - case 'directory': - return 5 - case 'fifo': - return 6 - case 'contiguous-file': - return 7 - case 'pax-header': - return 72 - } - - return 0 -} - -var indexOf = function (block, num, offset, end) { - for (; offset < end; offset++) { - if (block[offset] === num) return offset - } - return end -} - -var cksum = function (block) { - var sum = 8 * 32 - for (var i = 0; i < 148; i++) sum += block[i] - for (var j = 156; j < 512; j++) sum += block[j] - return sum -} - -var encodeOct = function (val, n) { - val = val.toString(8) - if (val.length > n) return SEVENS.slice(0, n) + ' ' - else return ZEROS.slice(0, n - val.length) + val + ' ' -} - -/* Copied from the node-tar repo and modified to meet - * tar-stream coding standard. - * - * Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349 - */ -function parse256 (buf) { - // first byte MUST be either 80 or FF - // 80 for positive, FF for 2's comp - var positive - if (buf[0] === 0x80) positive = true - else if (buf[0] === 0xFF) positive = false - else return null - - // build up a base-256 tuple from the least sig to the highest - var tuple = [] - for (var i = buf.length - 1; i > 0; i--) { - var byte = buf[i] - if (positive) tuple.push(byte) - else tuple.push(0xFF - byte) - } - - var sum = 0 - var l = tuple.length - for (i = 0; i < l; i++) { - sum += tuple[i] * Math.pow(256, i) - } - - return positive ? sum : -1 * sum -} - -var decodeOct = function (val, offset, length) { - val = val.slice(offset, offset + length) - offset = 0 - - // If prefixed with 0x80 then parse as a base-256 integer - if (val[offset] & 0x80) { - return parse256(val) - } else { - // Older versions of tar can prefix with spaces - while (offset < val.length && val[offset] === 32) offset++ - var end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length) - while (offset < end && val[offset] === 0) offset++ - if (end === offset) return 0 - return parseInt(val.slice(offset, end).toString(), 8) - } -} - -var decodeStr = function (val, offset, length, encoding) { - return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding) -} - -var addLength = function (str) { - var len = Buffer.byteLength(str) - var digits = Math.floor(Math.log(len) / Math.log(10)) + 1 - if (len + digits >= Math.pow(10, digits)) digits++ - - return (len + digits) + str -} - -exports.decodeLongPath = function (buf, encoding) { - return decodeStr(buf, 0, buf.length, encoding) -} - -exports.encodePax = function (opts) { // TODO: encode more stuff in pax - var result = '' - if (opts.name) result += addLength(' path=' + opts.name + '\n') - if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\n') - var pax = opts.pax - if (pax) { - for (var key in pax) { - result += addLength(' ' + key + '=' + pax[key] + '\n') - } - } - return Buffer.from(result) -} - -exports.decodePax = function (buf) { - var result = {} - - while (buf.length) { - var i = 0 - while (i < buf.length && buf[i] !== 32) i++ - var len = parseInt(buf.slice(0, i).toString(), 10) - if (!len) return result - - var b = buf.slice(i + 1, len - 1).toString() - var keyIndex = b.indexOf('=') - if (keyIndex === -1) return result - result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1) - - buf = buf.slice(len) - } - - return result -} - -exports.encode = function (opts) { - var buf = alloc(512) - var name = opts.name - var prefix = '' - - if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/' - if (Buffer.byteLength(name) !== name.length) return null // utf-8 - - while (Buffer.byteLength(name) > 100) { - var i = name.indexOf('/') - if (i === -1) return null - prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i) - name = name.slice(i + 1) - } - - if (Buffer.byteLength(name) > 100 || Buffer.byteLength(prefix) > 155) return null - if (opts.linkname && Buffer.byteLength(opts.linkname) > 100) return null - - buf.write(name) - buf.write(encodeOct(opts.mode & MASK, 6), 100) - buf.write(encodeOct(opts.uid, 6), 108) - buf.write(encodeOct(opts.gid, 6), 116) - buf.write(encodeOct(opts.size, 11), 124) - buf.write(encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136) - - buf[156] = ZERO_OFFSET + toTypeflag(opts.type) - - if (opts.linkname) buf.write(opts.linkname, 157) - - USTAR_MAGIC.copy(buf, MAGIC_OFFSET) - USTAR_VER.copy(buf, VERSION_OFFSET) - if (opts.uname) buf.write(opts.uname, 265) - if (opts.gname) buf.write(opts.gname, 297) - buf.write(encodeOct(opts.devmajor || 0, 6), 329) - buf.write(encodeOct(opts.devminor || 0, 6), 337) - - if (prefix) buf.write(prefix, 345) - - buf.write(encodeOct(cksum(buf), 6), 148) - - return buf -} - -exports.decode = function (buf, filenameEncoding, allowUnknownFormat) { - var typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET - - var name = decodeStr(buf, 0, 100, filenameEncoding) - var mode = decodeOct(buf, 100, 8) - var uid = decodeOct(buf, 108, 8) - var gid = decodeOct(buf, 116, 8) - var size = decodeOct(buf, 124, 12) - var mtime = decodeOct(buf, 136, 12) - var type = toType(typeflag) - var linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding) - var uname = decodeStr(buf, 265, 32) - var gname = decodeStr(buf, 297, 32) - var devmajor = decodeOct(buf, 329, 8) - var devminor = decodeOct(buf, 337, 8) - - var c = cksum(buf) - - // checksum is still initial value if header was null. - if (c === 8 * 32) return null - - // valid checksum - if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?') - - if (USTAR_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0) { - // ustar (posix) format. - // prepend prefix, if present. - if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name - } else if (GNU_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0 && - GNU_VER.compare(buf, VERSION_OFFSET, VERSION_OFFSET + 2) === 0) { - // 'gnu'/'oldgnu' format. Similar to ustar, but has support for incremental and - // multi-volume tarballs. - } else { - if (!allowUnknownFormat) { - throw new Error('Invalid tar header: unknown format.') - } - } - - // to support old tar versions that use trailing / to indicate dirs - if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5 - - return { - name, - mode, - uid, - gid, - size, - mtime: new Date(1000 * mtime), - type, - linkname, - uname, - gname, - devmajor, - devminor - } -} diff --git a/ce/custom/tar-stream/index.js b/ce/custom/tar-stream/index.js deleted file mode 100644 index 6481704827..0000000000 --- a/ce/custom/tar-stream/index.js +++ /dev/null @@ -1,2 +0,0 @@ -exports.extract = require('./extract') -exports.pack = require('./pack') diff --git a/ce/custom/tar-stream/pack.js b/ce/custom/tar-stream/pack.js deleted file mode 100644 index bdce2a8a50..0000000000 --- a/ce/custom/tar-stream/pack.js +++ /dev/null @@ -1,255 +0,0 @@ -var constants = require('fs-constants') -var eos = require('end-of-stream') -var inherits = require('inherits') -var alloc = Buffer.alloc - -var Readable = require('stream').Readable -var Writable = require('stream').Writable -var StringDecoder = require('string_decoder').StringDecoder - -var headers = require('./headers') - -var DMODE = parseInt('755', 8) -var FMODE = parseInt('644', 8) - -var END_OF_TAR = alloc(1024) - -var noop = function () {} - -var overflow = function (self, size) { - size &= 511 - if (size) self.push(END_OF_TAR.slice(0, 512 - size)) -} - -function modeToType (mode) { - switch (mode & constants.S_IFMT) { - case constants.S_IFBLK: return 'block-device' - case constants.S_IFCHR: return 'character-device' - case constants.S_IFDIR: return 'directory' - case constants.S_IFIFO: return 'fifo' - case constants.S_IFLNK: return 'symlink' - } - - return 'file' -} - -var Sink = function (to) { - Writable.call(this) - this.written = 0 - this._to = to - this._destroyed = false -} - -inherits(Sink, Writable) - -Sink.prototype._write = function (data, enc, cb) { - this.written += data.length - if (this._to.push(data)) return cb() - this._to._drain = cb -} - -Sink.prototype.destroy = function () { - if (this._destroyed) return - this._destroyed = true - this.emit('close') -} - -var LinkSink = function () { - Writable.call(this) - this.linkname = '' - this._decoder = new StringDecoder('utf-8') - this._destroyed = false -} - -inherits(LinkSink, Writable) - -LinkSink.prototype._write = function (data, enc, cb) { - this.linkname += this._decoder.write(data) - cb() -} - -LinkSink.prototype.destroy = function () { - if (this._destroyed) return - this._destroyed = true - this.emit('close') -} - -var Void = function () { - Writable.call(this) - this._destroyed = false -} - -inherits(Void, Writable) - -Void.prototype._write = function (data, enc, cb) { - cb(new Error('No body allowed for this entry')) -} - -Void.prototype.destroy = function () { - if (this._destroyed) return - this._destroyed = true - this.emit('close') -} - -var Pack = function (opts) { - if (!(this instanceof Pack)) return new Pack(opts) - Readable.call(this, opts) - - this._drain = noop - this._finalized = false - this._finalizing = false - this._destroyed = false - this._stream = null -} - -inherits(Pack, Readable) - -Pack.prototype.entry = function (header, buffer, callback) { - if (this._stream) throw new Error('already piping an entry') - if (this._finalized || this._destroyed) return - - if (typeof buffer === 'function') { - callback = buffer - buffer = null - } - - if (!callback) callback = noop - - var self = this - - if (!header.size || header.type === 'symlink') header.size = 0 - if (!header.type) header.type = modeToType(header.mode) - if (!header.mode) header.mode = header.type === 'directory' ? DMODE : FMODE - if (!header.uid) header.uid = 0 - if (!header.gid) header.gid = 0 - if (!header.mtime) header.mtime = new Date() - - if (typeof buffer === 'string') buffer = Buffer.from(buffer) - if (Buffer.isBuffer(buffer)) { - header.size = buffer.length - this._encode(header) - var ok = this.push(buffer) - overflow(self, header.size) - if (ok) process.nextTick(callback) - else this._drain = callback - return new Void() - } - - if (header.type === 'symlink' && !header.linkname) { - var linkSink = new LinkSink() - eos(linkSink, function (err) { - if (err) { // stream was closed - self.destroy() - return callback(err) - } - - header.linkname = linkSink.linkname - self._encode(header) - callback() - }) - - return linkSink - } - - this._encode(header) - - if (header.type !== 'file' && header.type !== 'contiguous-file') { - process.nextTick(callback) - return new Void() - } - - var sink = new Sink(this) - - this._stream = sink - - eos(sink, function (err) { - self._stream = null - - if (err) { // stream was closed - self.destroy() - return callback(err) - } - - if (sink.written !== header.size) { // corrupting tar - self.destroy() - return callback(new Error('size mismatch')) - } - - overflow(self, header.size) - if (self._finalizing) self.finalize() - callback() - }) - - return sink -} - -Pack.prototype.finalize = function () { - if (this._stream) { - this._finalizing = true - return - } - - if (this._finalized) return - this._finalized = true - this.push(END_OF_TAR) - this.push(null) -} - -Pack.prototype.destroy = function (err) { - if (this._destroyed) return - this._destroyed = true - - if (err) this.emit('error', err) - this.emit('close') - if (this._stream && this._stream.destroy) this._stream.destroy() -} - -Pack.prototype._encode = function (header) { - if (!header.pax) { - var buf = headers.encode(header) - if (buf) { - this.push(buf) - return - } - } - this._encodePax(header) -} - -Pack.prototype._encodePax = function (header) { - var paxHeader = headers.encodePax({ - name: header.name, - linkname: header.linkname, - pax: header.pax - }) - - var newHeader = { - name: 'PaxHeader', - mode: header.mode, - uid: header.uid, - gid: header.gid, - size: paxHeader.length, - mtime: header.mtime, - type: 'pax-header', - linkname: header.linkname && 'PaxHeader', - uname: header.uname, - gname: header.gname, - devmajor: header.devmajor, - devminor: header.devminor - } - - this.push(headers.encode(newHeader)) - this.push(paxHeader) - overflow(this, paxHeader.length) - - newHeader.size = header.size - newHeader.type = header.type - this.push(headers.encode(newHeader)) -} - -Pack.prototype._read = function (n) { - var drain = this._drain - this._drain = noop - drain() -} - -module.exports = Pack diff --git a/ce/custom/tar-stream/package.json b/ce/custom/tar-stream/package.json deleted file mode 100644 index ee14756c5a..0000000000 --- a/ce/custom/tar-stream/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "tar-stream", - "version": "2.3.0", - "description": "tar-stream is a streaming tar parser and generator and nothing else. It is streams2 and operates purely using streams which means you can easily extract/parse tarballs without ever hitting the file system.", - "author": "Mathias Buus ", - "dependencies": { - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3" - }, - "devDependencies": { - "tape": "^4.9.2" - }, - "scripts": { - "build": "", - "clean": "", - "eslint-fix": "", - "eslint": "", - "test": "", - "test-all": "" - }, - "keywords": [ - "tar", - "tarball", - "parse", - "parser", - "generate", - "generator", - "stream", - "stream2", - "streams", - "streams2", - "streaming", - "pack", - "extract", - "modify" - ], - "bugs": { - "url": "https://github.com/mafintosh/tar-stream/issues" - }, - "homepage": "https://github.com/mafintosh/tar-stream", - "main": "index.js", - "files": [ - "*.js", - "LICENSE" - ], - "directories": { - "test": "test" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/mafintosh/tar-stream.git" - }, - "engines": { - "node": ">=6" - } -} diff --git a/ce/getting-started.md b/ce/getting-started.md deleted file mode 100644 index 57e2a28b67..0000000000 --- a/ce/getting-started.md +++ /dev/null @@ -1,84 +0,0 @@ -# Build Instructions - -## Prerequisites: -1. [Node.js](https://nodejs.org/en/download/) (>=15.10.0) -- We suggest using [NVS](https://github.com/jasongin/nvs) - -2. [Rush](https://rushjs.io/pages/intro/welcome/) - -## VSCode extensions: - - `ESLint` - - `Mocha Test Explorer` - - `Test Explorer UI` - - -``` bash -npm install -g @microsoft/rush -``` - -## Preparation -The first time (or after pulling from upstream) use Rush to install modules packages. -``` bash -rush update -``` - -## Building code -- `rush rebuild` to build the modules -or -- `rush watch` to setup the build watcher -or -- in VSCode, just build (ctrl-shift-b) - -## Important Rush commands - -### `rush update` -Ensures that all the dependencies are installed for all the projects. -Safe to run mulitple times. -If you modify a `package.json` file you should re-run this. (or merge from upstream when `package.json` is updated) - -### `rush purge` -Cleans out all the installed dependencies. -If you run this, you must run `rush update` before building. - -### `rush rebuild` -Rebuilds all the projects from scratch - -### `rush watch` -Runs the typescript compiler in `--watch` mode to watch for modified files on disk. - -### `rush test` -Runs `npm test` on each project (does not build first -- see `rush test-ci`) - -### `rush test-ci` -Runs `npm test-ci` on each project (rebuilds the code then runs the tests) - -### `rush clean` -Runs `npm clean` on each project -- cleans out the `./dist` folder for each project. -Needs to have packages installed, so it can only be run after `rush update` - -### `rush lint` -Runs `npm lint` on each project (runs the eslint on the source) - -### `rush fix` -Runs `npm eslint-fix` on each project (fixes all fixable linter errors) - -### `rush set-versions` -This will set the `x.x.build` verison for each project based on the commit number. - -### `rush sync-versions` -This will ensure that all the projects have consistent versions for all dependencies, and ensures that cross-project version references are set correctly - - - - -# Building a release - -To create the final npm tgz file we're going to statically include our dependencies so that we're not having to pull them down dynamically. - -using `rush deploy` will generate this in `./common/deploy` which will copy all the necessary runtime components, and the contents of the `./assets/` folder (which contains the `package.json` and scripts to build/install the cli correctly. ) - -``` bash -npx rush update # install the packages for the project -npx rush rebuild # build the typescript files -npx rush deploy --overwrite # create the common/deploy folder with all the contents includeing ./assets -npm pack ./common/deploy # pack it up -``` \ No newline at end of file diff --git a/ce/projects.tsconfig.json b/ce/projects.tsconfig.json deleted file mode 100644 index e2542ea760..0000000000 --- a/ce/projects.tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "files": [], - "references": [ - { - "path": "ce/tsconfig.json" - }, - { - "path": "test/tsconfig.json" - } - ] -} \ No newline at end of file diff --git a/ce/rush.json b/ce/rush.json deleted file mode 100644 index fe00c067d3..0000000000 --- a/ce/rush.json +++ /dev/null @@ -1,66 +0,0 @@ -/** - * This is the main configuration file for Rush. - * For full documentation, please see https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json", - "rushVersion": "5.61.4", - "pnpmVersion": "6.29.1", - /** - * Options that are only used when the PNPM package manager is selected - */ - "pnpmOptions": {}, - "nodeSupportedVersionRange": ">=16.0.0 <19.0.0", - "suppressNodeLtsWarning": true, - "projectFolderMinDepth": 1, - "projectFolderMaxDepth": 5, - "gitPolicy": {}, - "repository": { - "url": "https://github.com/microsoft/vcpkg-tool" - }, - /** - * Event hooks are customized script actions that Rush executes when specific events occur - */ - "eventHooks": { - /** - * The list of shell commands to run before the Rush installation starts - */ - "preRushInstall": [ - // "common/scripts/pre-rush-install.js" - ], - /** - * The list of shell commands to run after the Rush installation finishes - */ - "postRushInstall": [], - /** - * The list of shell commands to run before the Rush build command starts - */ - "preRushBuild": [], - /** - * The list of shell commands to run after the Rush build command finishes - */ - "postRushBuild": [] - }, - "variants": [], - "telemetryEnabled": false, - "projects": [ - { - "packageName": "@microsoft/vcpkg-ce", - "projectFolder": "./ce", - "reviewCategory": "production", - "shouldPublish": false - }, - { - "packageName": "vcpkg-ce.test", - "projectFolder": "./test", - "reviewCategory": "production", - "shouldPublish": false - }, - { - "packageName": "tar-stream", - "projectFolder": "./custom/tar-stream", - "reviewCategory": "production", - "shouldPublish": false - } - ] -} diff --git a/ce/test/.eslintignore b/ce/test/.eslintignore deleted file mode 100644 index cc6a7fd139..0000000000 --- a/ce/test/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -**/*.d.ts -test/scenarios/** -dist/** diff --git a/ce/test/.eslintrc.yaml b/ce/test/.eslintrc.yaml deleted file mode 100644 index 5198e2a1ce..0000000000 --- a/ce/test/.eslintrc.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -# configure plugins first -parser: "@typescript-eslint/parser" -plugins: -- "@typescript-eslint" -- "notice" - -# then inherit the common settings -extends: -- "../common/.default-eslintrc.yaml" \ No newline at end of file diff --git a/ce/test/.npmignore b/ce/test/.npmignore deleted file mode 100644 index 33986ae1f9..0000000000 --- a/ce/test/.npmignore +++ /dev/null @@ -1,20 +0,0 @@ -!dist/**/* -src/ -dist/test/ -package/ -.npmignore -tsconfig.json -*.ts -changelog.md -.eslint* -!*.d.ts -*.tgz -.vscode -.scripts -attic/ -generated/ -notes.md -Examples/ -samples/ -*.log -package-deps.json diff --git a/ce/test/.npmrc b/ce/test/.npmrc deleted file mode 100644 index e97097d512..0000000000 --- a/ce/test/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -registry=https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ -lockfileVersion=3 diff --git a/ce/test/LICENSE b/ce/test/LICENSE deleted file mode 100644 index 5cf7c8db62..0000000000 --- a/ce/test/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) Microsoft Corporation. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE diff --git a/ce/test/core/archive-tests.ts b/ce/test/core/archive-tests.ts deleted file mode 100644 index 825a950421..0000000000 --- a/ce/test/core/archive-tests.ts +++ /dev/null @@ -1,433 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { unpackTar, unpackTarBz, unpackTarGz } from '@microsoft/vcpkg-ce/dist/archivers/tar'; -import { FileEntry, stripPath } from '@microsoft/vcpkg-ce/dist/archivers/unpacker'; -import { unpackZip } from '@microsoft/vcpkg-ce/dist/archivers/ZipUnpacker'; -import { Uri } from '@microsoft/vcpkg-ce/dist/util/uri'; -import { rejects, strict } from 'assert'; -import { SuiteLocal } from './SuiteLocal'; - -const isWindows = process.platform === 'win32'; - -describe('Unpacker', () => { - it('StripsPaths', () => { - ['', '/'].forEach((prefix) => { - ['', '/'].forEach((suffix) => { - const d = prefix + 'delta' + suffix; - const cd = prefix + 'charlie/delta' + suffix; - const bcd = prefix + 'beta/charlie/delta' + suffix; - const abcd = prefix + 'alpha/beta/charlie/delta' + suffix; - strict.equal(stripPath(abcd, 0), abcd); - strict.equal(stripPath(abcd, 1), bcd); - strict.equal(stripPath(abcd, 2), cd); - strict.equal(stripPath(abcd, 3), d); - strict.equal(stripPath(abcd, 4), undefined); - - strict.equal(stripPath(prefix + 'some///slashes\\\\\\\\here' + suffix, 0), prefix + 'some/slashes/here' + suffix); - }); - }); - }); -}); - -/** Checks that progress delivers 0, 100, and constantly increasing percentages. */ -class PercentageChecker { - seenZero = false; - lastSeen: number | undefined = undefined; - recordPercent(percentage: number) { - if (percentage === 0) { - this.seenZero = true; - } - - if (this.lastSeen !== undefined) { - strict.ok(percentage >= this.lastSeen, `${percentage} vs ${this.lastSeen}`); - } - - this.lastSeen = percentage; - } - - test() { - strict.equal(this.lastSeen, 100); - } - - testRequireZero() { - strict.ok(this.seenZero); - } - - reset() { - this.seenZero = false; - this.lastSeen = undefined; - } -} - -class ProgressCheckerEntry { - seenZero = false; - seenUnpacked = false; - filePercentage = new PercentageChecker(); - - constructor(public entryPath: string, public entryIdentity: any) { } - - unpackFileProgress(entry: any, filePercentage: number) { - strict.equal(this.entryIdentity, entry); - if (filePercentage === 0) { - this.seenZero = true; - } - - this.filePercentage.recordPercent(filePercentage); - } - - unpackFileComplete(entry: any) { - strict.equal(this.entryIdentity, entry); - this.seenUnpacked = true; - } - - test() { - strict.ok(this.seenUnpacked, 'Should have got an unpacked message'); - strict.ok(this.seenZero, 'Should have seen a zero progress'); - this.filePercentage.testRequireZero(); - } -} - -class ProgressChecker { - seenEntries = new Map(); - archivePercentage = new PercentageChecker(); - - unpackFileProgress(entry: any, filePercentage: number) { - let checkerEntry = this.seenEntries.get(entry.path); - if (!checkerEntry) { - checkerEntry = new ProgressCheckerEntry(entry.path, entry); - this.seenEntries.set(entry.path, checkerEntry); - } - - checkerEntry.unpackFileProgress(entry, filePercentage); - } - - unpackArchiveProgress(archiveUri: Uri, archivePercentage: number) { - this.archivePercentage.recordPercent(archivePercentage); - } - - unpackFileComplete(entry: FileEntry) { - const checkerEntry = this.seenEntries.get(entry.path); - strict.ok(checkerEntry, `Did not find unpack progress entries for ${entry.path}`); - checkerEntry.unpackFileComplete(entry); - } - - reset() { - this.seenEntries.clear(); - this.archivePercentage.reset(); - } - - test(entryCount: number) { - strict.equal(entryCount, this.seenEntries.size, `Should have unpacked ${entryCount}, actually unpacked ${this.seenEntries.size}`); - this.seenEntries.forEach((value) => value.test()); - this.archivePercentage.test(); - } -} - -describe('ZipUnpacker', () => { - const local = new SuiteLocal(); - after(local.after.bind(local)); - const progressChecker = new ProgressChecker(); - it('UnpacksLegitimateSmallZips', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, {}); - strict.equal((await targetUri.readFile('a.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.stat('a.txt')).mtime, Date.parse('2021-03-23T09:31:14.000Z')); - strict.equal((await targetUri.readFile('b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('only-not-directory.txt')).toString(), - 'This content is only not in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/a.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/only-directory.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/inner/only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); - progressChecker.test(9); - }); - - it('Truncates', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example-truncates'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, {}); - progressChecker.reset(); - await unpackZip(local.session, zipUri, targetUri, progressChecker, {}); // intentionally doubled - strict.equal((await targetUri.readFile('a.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('only-not-directory.txt')).toString(), - 'This content is only not in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/a.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/only-directory.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/inner/only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); - progressChecker.test(9); - }); - - it('UnpacksZipsWithCompression', async () => { - // big-compression.zip is an example input from yauzl: - // https://github.com/thejoshwolfe/yauzl/blob/96f0eb552c560632a754ae0e1701a7edacbda389/test/big-compression.zip - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('big-compression.zip'); - const targetUri = local.tempFolderUri.join('big-compression'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, {}); - const contents = await targetUri.readFile('0x100000'); - strict.equal(contents.length, 0x100000); - strict.ok(contents.every((value: number) => value === 0x0)); - progressChecker.test(1); - }); - - it('FailsToUnpackMalformed', async () => { - // wrong-entry-sizes.zip is an example input from yauzl: - // https://github.com/thejoshwolfe/yauzl/blob/96f0eb552c560632a754ae0e1701a7edacbda389/test/wrong-entry-sizes/wrong-entry-sizes.zip - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('wrong-entry-sizes.zip'); - const targetUri = local.tempFolderUri.join('wrong-entry-sizes'); - await rejects(unpackZip(local.session, zipUri, targetUri, progressChecker, {})); - }); - - it('Strips1', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example-strip-1'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, { strip: 1 }); - strict.equal((await targetUri.readFile('a.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('only-directory.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('inner/only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); - progressChecker.test(5); - }); - - it('Strips2', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example-strip-2'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, { strip: 2 }); - strict.equal((await targetUri.readFile('only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); - progressChecker.test(1); - }); - - it('StripsAll', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example-strip-all'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, { strip: 3 }); - strict.ok(!await targetUri.exists()); - progressChecker.test(0); - }); - - it('TransformsOne', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example-transform-one'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, { transform: ['s/a\\.txt/ehh.txt/'] }); - strict.equal((await targetUri.readFile('ehh.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('only-not-directory.txt')).toString(), - 'This content is only not in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/ehh.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/only-directory.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/inner/only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); - progressChecker.test(9); - }); - - it('TransformsArray', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example-transform-array'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, { - transform: [ - 's/a\\.txt/ehh.txt/', - 's/c\\.txt/see.txt/', - 's/see\\.txt/seeee.txt/', - 's/directory//g', - ] - }); - strict.equal((await targetUri.readFile('ehh.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('seeee.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('only-not-.txt')).toString(), - 'This content is only not in the directory.\n'); - strict.equal((await targetUri.readFile('a-/ehh.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('a-/b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('a-/seeee.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('a-/only-.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('a-/inner/only--.txt')).toString(), - 'This content is only doubly nested.\n'); - progressChecker.test(9); - }); - - it('StripsThenTransforms', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example-strip-then-transform'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, { strip: 1, transform: ['s/b/beeee/'] }); - strict.equal((await targetUri.readFile('a.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('beeee.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('only-directory.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('inner/only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); - progressChecker.test(5); - }); - - it('AllowsTransformToNotExtract', async () => { - progressChecker.reset(); - const zipUri = local.resourcesFolderUri.join('example-zip.zip'); - const targetUri = local.tempFolderUri.join('example-transform-no-extract'); - await unpackZip(local.session, zipUri, targetUri, progressChecker, { transform: ['s/.+a.txt$//'] }); - strict.equal((await targetUri.readFile('b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('only-not-directory.txt')).toString(), - 'This content is only not in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/c.txt')).toString(), 'The contents of c.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/only-directory.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/inner/only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); - progressChecker.test(8); - }); -}); - -async function checkExtractedTar(targetUri: Uri): Promise { - strict.equal((await targetUri.readFile('a.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.stat('a.txt')).mtime, Date.parse('2021-03-23T09:31:14.000Z')); - strict.equal((await targetUri.readFile('b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('executable.sh')).toString(), '#/bin/sh\necho "Hello world!"\n\n'); - if (!isWindows) { - // executable must be executable - const execStat = await targetUri.stat('executable.sh'); - strict.ok((execStat.mode & 0o111) !== 0); - } - strict.equal((await targetUri.readFile('only-not-directory.txt')).toString(), - 'This content is only not in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/a.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('a-directory/only-directory.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('a-directory/inner/only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); -} - -const transformedTarUnpackOptions = { - strip: 1, - transform: ['s/a\\.txt/ehh\\.txt/'] -}; - -async function checkExtractedTransformedTar(targetUri: Uri): Promise { - strict.equal((await targetUri.readFile('ehh.txt')).toString(), 'The contents of a.txt.\n'); - strict.equal((await targetUri.readFile('b.txt')).toString(), 'The contents of b.txt.\n'); - strict.equal((await targetUri.readFile('only-directory.txt')).toString(), - 'This content is only in the directory.\n'); - strict.equal((await targetUri.readFile('inner/only-directory-directory.txt')).toString(), - 'This content is only doubly nested.\n'); -} - -describe('TarUnpacker', () => { - const local = new SuiteLocal(); - after(local.after.bind(local)); - const progressChecker = new ProgressChecker(); - const archiveUri = local.resourcesFolderUri.join('example-tar.tar'); - it('UnpacksLegitimateSmallTar', async () => { - progressChecker.reset(); - const targetUri = local.tempFolderUri.join('example-tar'); - await unpackTar(local.session, archiveUri, targetUri, progressChecker, {}); - await checkExtractedTar(targetUri); - progressChecker.test(8); - }); - it('ImplementsUnpackOptions', async () => { - progressChecker.reset(); - const targetUri = local.tempFolderUri.join('example-tar-transformed'); - await unpackTar(local.session, archiveUri, targetUri, progressChecker, transformedTarUnpackOptions); - await checkExtractedTransformedTar(targetUri); - progressChecker.test(4); - }); -}); - -describe('TarBzUnpacker', () => { - const local = new SuiteLocal(); - after(local.after.bind(local)); - const progressChecker = new ProgressChecker(); - const archiveUri = local.resourcesFolderUri.join('example-tar.tar.bz2'); - it('UnpacksLegitimateSmallTarBz', async () => { - progressChecker.reset(); - const targetUri = local.tempFolderUri.join('example-tar-bz'); - await unpackTarBz(local.session, archiveUri, targetUri, progressChecker, {}); - await checkExtractedTar(targetUri); - progressChecker.test(8); - }); - it('ImplementsUnpackOptions', async () => { - progressChecker.reset(); - const targetUri = local.tempFolderUri.join('example-tar-bz2-transformed'); - await unpackTarBz(local.session, archiveUri, targetUri, progressChecker, transformedTarUnpackOptions); - await checkExtractedTransformedTar(targetUri); - progressChecker.test(4); - }); -}); - -describe('TarStripAuto', () => { - const local = new SuiteLocal(); - after(local.after.bind(local)); - const archiveUri = local.resourcesFolderUri.join('test.directories.tar.gz'); - - it('Strips off unnecessary folders off the front', async () => { - const targetUri = local.tempFolderUri.join('test-directories-gz'); - const expected = [ - 'test-directories-gz/three/test.txt', - 'test-directories-gz/four/test.txt' - ]; - const actual = new Array(); - await unpackTarGz(local.session, archiveUri, targetUri, { - unpackFileComplete(entry) { - if (entry.destination) { - actual.push(entry.destination.path); - } - }, - }, { strip: -1 }); - strict.equal(actual.length, 2, 'Should have two entries only'); - for (const e of expected) { - // make sure the output has each of the expected outputs - strict.ok(actual.find((each) => each.endsWith(e)), `Should have element ending in expected value ${e}`); - } - }); -}); - -describe('TarGzUnpacker', () => { - const local = new SuiteLocal(); - after(local.after.bind(local)); - const progressChecker = new ProgressChecker(); - const archiveUri = local.resourcesFolderUri.join('example-tar.tar.gz'); - it('UnpacksLegitimateSmallTarGz', async () => { - progressChecker.reset(); - const targetUri = local.tempFolderUri.join('example-tar-gz'); - await unpackTarGz(local.session, archiveUri, targetUri, progressChecker, {}); - await checkExtractedTar(targetUri); - progressChecker.test(8); - }); - it('ImplementsUnpackOptions', async () => { - progressChecker.reset(); - const targetUri = local.tempFolderUri.join('example-tar-gz-transformed'); - await unpackTarGz(local.session, archiveUri, targetUri, progressChecker, transformedTarUnpackOptions); - await checkExtractedTransformedTar(targetUri); - progressChecker.test(4); - }); -}); diff --git a/ce/test/core/i18n-tests.ts b/ce/test/core/i18n-tests.ts deleted file mode 100644 index 2b4f710a27..0000000000 --- a/ce/test/core/i18n-tests.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { i } from '@microsoft/vcpkg-ce/dist/i18n'; -import { strict } from 'assert'; - -// sample test using decorators. -describe('i18n', () => { - it('make sure tagged templates work like templates', () => { - strict.equal(`this is ${100} a test `, i`this is ${100} a test `, 'strings should be the same'); - strict.equal(`${true}${false}this is ${100} a test ${undefined}`, i`${true}${false}this is ${100} a test ${undefined}`, 'strings should be the same'); - }); - - /* - it('try translations', () => { - setLocale('de'); - const uri = 'hello://world'; - - strict.equal(i`uri ${uri} has no scheme`, `uri ${uri} hat kein Schema`, 'Translation did not work correctly'); - }); - */ -}); diff --git a/ce/test/core/repo-tests.ts b/ce/test/core/repo-tests.ts deleted file mode 100644 index b15834bce0..0000000000 --- a/ce/test/core/repo-tests.ts +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { serialize } from '@microsoft/vcpkg-ce/dist/yaml/yaml'; -import { createHash } from 'crypto'; -import { describe } from 'mocha'; -import { getNouns, paragraph, sentence } from 'txtgen'; -import { SuiteLocal } from './SuiteLocal'; - - -const idwords = ['compilers', 'tools', 'contoso', 'adatum', 'cheese', 'utility', 'crunch', 'make', 'build', 'cc', 'c++', 'debugger', 'flasher', 'whatever', 'else']; -const firstNames = ['sandy', 'tracy', 'skyler', 'nick', 'bob', 'jack', 'alice']; -const lastNames = ['smith', 'jones', 'quack', 'fry', 'lunch']; -const companies = ['contoso', 'adatum', 'etcetcetc']; -const roles = ['pusher', 'do-er', 'maker', 'publisher', 'slacker', 'originator']; -const suffixes = ['com', 'org', 'net', 'gov', 'ca', 'uk', 'etc']; - -function rnd(min: number, max: number) { - return Math.floor((Math.random() * (max - min)) + min); -} - -function rndSemver() { - return [rnd(0, 100), rnd(0, 200), rnd(0, 5000)].join('.'); -} - -function randomWord(from: Array) { - return from[rnd(0, from.length - 1)]; -} - -function randomHost() { - return `${randomWord(companies)}.${randomWord(suffixes)}`; -} - -function randomContacts() { - const result = {}; - - for (let i = 0; i < rnd(0, 3); i++) { - const name = `${randomWord(firstNames)} ${randomWord(lastNames)}`; - result[name] = { - email: `${randomWord(getNouns())}@${randomHost()}`, - roles: randomWords(roles, 1, 3) - }; - } - return result; -} - -function randomWords(from: Array, min = 3, max = 6) { - const s = new Set(); - const n = rnd(min, max); - while (s.size < n) { - s.add(randomWord(from)); - } - return [...s.values()]; -} - -class Template { - id = randomWords(idwords).join('/'); - version = rndSemver(); - summary = sentence(); - description = paragraph(); - contacts = randomContacts(); - install = { - unzip: `https://${randomHost()}/${sentence().replace(/ /g, '/')}.zip`, - sha256: createHash('sha256').update(sentence()).digest('hex'), - }; -} - -describe('StandardRegistry Tests', () => { - - const local = new SuiteLocal(); - - after(local.after.bind(local)); - - before(async () => { - const repoFolder = local.session.homeFolder.join('repo', 'default'); - // creates a bunch of artifacts, with multiple versions - const pkgs = 100; - - for (let i = 0; i < pkgs; i++) { - const versions = rnd(1, 5); - const t = new Template(); - for (let j = 0; j < versions; j++) { - const p = { - ...t, - }; - p.version = rndSemver(); - const target = repoFolder.join(`${p.id}-${p.version}.json`); - await target.writeFile(Buffer.from(serialize(p), 'utf8')); - } - } - // now copy the files from the test folder - await local.fs.copy(local.rootFolderUri.join('resources', 'repo'), repoFolder); - }); -}); diff --git a/ce/test/mocha-config.yaml b/ce/test/mocha-config.yaml deleted file mode 100644 index 667c60be02..0000000000 --- a/ce/test/mocha-config.yaml +++ /dev/null @@ -1,16 +0,0 @@ -color: true -require: - - 'source-map-support/register' -monkeyPatch: true -spec: ./**/*.js -ignore: - - "./**/*.d.ts" - - "./node_modules/**" - - "../common/**/node_modules/**" - -# this section enables npm watch-test to work right -watch-files: ../*/**/*.js -watch-ignore: - - "./node_modules/**" - - "../common/**/node_modules/**" - - "./**/*.js" diff --git a/ce/test/package.json b/ce/test/package.json deleted file mode 100644 index e29a8394d8..0000000000 --- a/ce/test/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "vcpkg-ce.test", - "version": "0.8.0", - "description": "ce test project", - "directories": { - "doc": "docs" - }, - "engines": { - "node": ">=10.12.0" - }, - "scripts": { - "eslint-fix": "eslint . --fix --ext .ts", - "eslint": "eslint . --ext .ts", - "build": "tsc -p .", - "watch": "tsc -p . --watch", - "prepare": "npm run build", - "test-ci": "npm run build && npm run test", - "test": "node ./node_modules/mocha/bin/mocha --config ./mocha-config.yaml --timeout 200000", - "watch-test": "node ./node_modules/mocha/bin/mocha --config ./mocha-config.yaml --timeout 200000 --watch" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/Microsoft/vcpkg-ce.git" - }, - "keywords": [ - "ce" - ], - "author": "Microsoft", - "license": "MIT", - "bugs": { - "url": "https://github.com/Microsoft/vcpkg-ce/issues" - }, - "homepage": "https://github.com/Microsoft/vcpkg-ce#readme", - "readme": "https://github.com/Microsoft/vcpkg-ce/blob/master/readme.md", - "devDependencies": { - "@types/node": "17.0.15", - "mocha": "9.2", - "@types/mocha": "9.1.0", - "@typescript-eslint/eslint-plugin": "5.10.2", - "@typescript-eslint/parser": "5.10.2", - "eslint-plugin-notice": "0.9.10", - "eslint": "8.8.0", - "@types/semver": "7.3.9", - "typescript": "4.5.5", - "source-map-support": "0.5.21" - }, - "dependencies": { - "@microsoft/vcpkg-ce": "~0.8.0", - "yaml": "2.0.0-10", - "semver": "7.3.5", - "txtgen": "2.2.8" - } -} diff --git a/ce/test/resources/big-compression.zip b/ce/test/resources/big-compression.zip deleted file mode 100644 index 2e41234e47c93633d4a23d3c865d5b3e84ae22f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 zcmWIWW@Zs#;Nak3$O)P6&VU3sfNX;bLjw?ad(e;($UU^+tA8#>`~oCZqs-9|7!83D z5(0M20p9E!GOsL_bFzTEEWi-p&B!Fjj3_{mqZQ`> diff --git a/ce/test/resources/example-tar.tar b/ce/test/resources/example-tar.tar deleted file mode 100644 index 8d1fe3c50e571e9b00800765a0170c44510a47c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 zcmeI1-)@316vnysDZ1@?TKe}D_5gbUgf5Vfc7dAd+wZ^@DQs#q*5G#Vg4Wgp{l5M< z(q_*^)tKD7X17Wr9TX0&bpoeUOB$ZLrtU~mK{?Zm2`v+v@~#_^k?v;{cGLQ-AtcFN zVcPdBH>1{}a;kmkc~_+@@V~OwG!bS&XRwyw>v8{?=0d>-{FhX5^#2wU>8JnB*1KU+ z45g*t`pfR9^Ir+@^^pJ22K;~d&!8V;ih}?2vdf+KtAEb_Ygx4r@ueaAe}?!7 zh@$-*f`S{Jo@ZRMHTlM8>)I^aGSV$}{2$%_;cD3bll}WY ztN&&m8R t`F{OhK;oyVq5}5+asTg-qSyQW*Y$sx4+QrBt|u}^LIqF(RA7b*d;(8MU`YS~ diff --git a/ce/test/resources/example-tar.tar.bz2 b/ce/test/resources/example-tar.tar.bz2 deleted file mode 100644 index fda3fafaab7d7ca90d2737a0e67cacd60cac1f58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmV;k0ZjfvT4*^jL0KkKS-k}~l>hMvlk dkW{7ngq`ZEQz~eJ6z~=Q7ji{7P>{U^IF+w*v>*Tg diff --git a/ce/test/resources/example-tar.tar.gz b/ce/test/resources/example-tar.tar.gz deleted file mode 100644 index 5f79984fb78fb3060445d7e04c46115073d00529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?5GiwFou-fLh40A+Y#ZE$R5Ep%aWE_7jX0PUGeZo?oHMHy!mG#xj=e7DdA zWCQ+C*^&j7P1I!f1**nYn<`Bdqt<@M11!Vra(FT?f2x{Jm(F&_Et&}8QA&j|Q-TcR z0LnOFR8h*6KqO;f8Vi(weed!PV^rEo_pf=W&o8?;|4$j`-x#C233fruUx-WjQ^mOS zkI!Ea$sqp}e9zyS_BebT-Zt*w&`pGZCFeiq@8?eWQ@@T1wk=z-$@&@3X&)@7MdUPX04Rk)P!X{7=GJ{~Lo{t?_9qz!5N8 z#{TE`Q~o;t>4*Q4F)DcQpQ}uP|0&qj`cr=|{|kvnPNQTryLl09+p4&>G z@={n&REyz$WOUc)LWuE@uPxQv7)LIvG-St&F?VspYqX4d9r5h(b!wqi> z1*k(XM@q|SKxlQ0#=P%45>XCWp48x`W5pMp?z?PYX}ub=U4YT3vmQBH14VbYn66TO;y)mS9-Ng`5{ZD0{=ELx6%rBNb%Yh`3jM!eyEff zidDAq-*0(l$qO|?qF#~+NMmd76r6sgN8|bL&Uf`cJ@U#0d2j$3=6XyM_(P#fergpD z+k(Os{T9O-d$T$dS%^sLnrda1hW_c?HRQ?kk q5s<_OQ4Ih90001M-y)Cz0ht4UPyhf8ad|&JFb#_W000000a;qkWyfX! diff --git a/ce/test/resources/example-zip.zip b/ce/test/resources/example-zip.zip deleted file mode 100644 index ff9f3ed1b08bb77db44dfd5196688691cc847e9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1898 zcmWIWW@Zs#00HOd@*pq+O7H;bMBS9kqSWM){Gv+z0H8`Pu-tR+@}S_4p?}1IJP;N{ zQ<!@)2mtxz~Ho;xZ)(n<-#HWK%u^O{sct zDjSz6$=FN*3qnkR_}wO<3dQe2XgE2SQ$c2@wGe zRHc9|Fc_Ka8F1wWP&|Wx0E9xx8(a(uU{OW}35IjNH-8H%TxW#QW_$L22k`^EL8jx% zK`_%n=4b&ia?S&XII2iUKq%!10A_MY4>= zACMJx7xTbYq*yHZ1mYuGftmM^t=NWU1vp}nt+**F_zz?x4_5)$indRaKO?Nbl`&yf zfTH0KniY_2ifl*G6|vePrR$6^`V_~^Y7igU8uyA$bi^^n&D7W9J2j0 zT4S<6_DxXh1G^)|F9^&>wjVQdBila*&3;syK^YX;zBwOPM1kxRI%^jVq8+W~g89hy zVdivX`~HLMLpK(d;Le5p0H+FK5*#bIWCVsFIB!@oK??$gkaJ*FdttN>nhL0v)qe>_|Hr0pa}~iN|2FxzjGF%HGt|F^-h`Y*xM zzr;>d?cK`6k={m1iF9@`Bl>txdZ^Thvy{JUBIC$g;hFF}3M T@GFXqbS{;8zy#J=rzhhI(&+=&$-u$D@E%Pk6Hqo;Kfs%j$(|YEDwwSXKv|HhU|>rl zhy`{dvKEkYVAcr$6`*Rd0*Zhg2h)P#4i*LmkUL=DuVV?2333%H8%T^92&Vz*DIg95 E06|eNl>h($ diff --git a/ce/test/tsconfig.json b/ce/test/tsconfig.json deleted file mode 100644 index 26bccc3c10..0000000000 --- a/ce/test/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "../common/tsconfig.json", - "compilerOptions": { - "outDir": "./dist", - "rootDir": ".", - "types": [ - "node", - "mocha" - ] - }, - "include": [ - "./**/*.ts" - ], - "exclude": [ - "node_modules/**", - "**/*.d.ts" - ] -} \ No newline at end of file diff --git a/cgmanifest.json b/cgmanifest.json index c29257d6df..6205ba258d 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -17,9 +17,9 @@ "Type": "other", "other": { "name": "fmt", - "version": "9.1.0", - "downloadUrl": "https://github.com/fmtlib/fmt/archive/refs/tags/9.1.0.tar.gz", - "hash": "a18442042722dd48e20714ec034a12fcc0576c9af7be5188586970e2edf47529825bdc99af366b1d5891630c8dbf6f63bfa9f012e77ab3d3ed80d1a118e3b2be" + "version": "10.1.0", + "downloadUrl": "https://github.com/fmtlib/fmt/archive/refs/tags/10.1.0.tar.gz", + "hash": "69a7b8584f828528e3bb4b87153449e96df29bd740adcd42a2e3d50ae4a270c80a5eb2c3057337048be5b978094d8bb73bec3378e3b6370748de2b063dd0aa4b" } }, "DevelopmentDependency": false, diff --git a/cmake/Findfmt.cmake b/cmake/Findfmt.cmake index e9bed00a78..c01e9b6170 100644 --- a/cmake/Findfmt.cmake +++ b/cmake/Findfmt.cmake @@ -9,7 +9,7 @@ if("$CACHE{VCPKG_FMT_URL}" MATCHES "^https://github.com/fmtlib/fmt/archive/refs/ unset(VCPKG_FMT_URL CACHE) # Fix upgrade endif() if(NOT VCPKG_FMT_URL) - set(VCPKG_FMT_URL "https://github.com/fmtlib/fmt/archive/refs/tags/9.1.0.tar.gz") + set(VCPKG_FMT_URL "https://github.com/fmtlib/fmt/archive/refs/tags/10.1.0.tar.gz") endif() if(POLICY CMP0135) @@ -33,7 +33,7 @@ include(FetchContent) FetchContent_Declare( fmt URL "${VCPKG_FMT_URL}" - URL_HASH "SHA512=a18442042722dd48e20714ec034a12fcc0576c9af7be5188586970e2edf47529825bdc99af366b1d5891630c8dbf6f63bfa9f012e77ab3d3ed80d1a118e3b2be" + URL_HASH "SHA512=69a7b8584f828528e3bb4b87153449e96df29bd740adcd42a2e3d50ae4a270c80a5eb2c3057337048be5b978094d8bb73bec3378e3b6370748de2b063dd0aa4b" ) if(NOT fmt_FIND_REQUIRED) diff --git a/docs/command-guidelines.md b/docs/command-guidelines.md new file mode 100644 index 0000000000..4f9c410855 --- /dev/null +++ b/docs/command-guidelines.md @@ -0,0 +1,30 @@ +A command name is what the user types to run the command, without any x- prefix. (Note, z- prefixes +are kept) + +Examples: +* search => search +* x-download => download +* z-applocal => z-applocal + +This reflects that x- commands are eXperimental commands that one day will be promoted and lose +the x-, while z- commands are intended for internal use only that can be changed or removed at any +time. + +Each "subcommand" added to vcpkg needs the following. + +- [ ] Commands are named with dashes, not underscores. +- [ ] A `.cpp` containing the command named "`commands.command-name.cpp`". +- [ ] An entry in `commands.cpp` dispatching to that subcommand and registering for help. +- [ ] An entry point function named `vcpkg::command_command_name_and_exit` corresponding with one of + the CommandFn prototypes in `commands.h`. Note that the dashes are replaced with underscores + to make this a valid C++ identifier. +- [ ] A localization message named CmdCommandNameSynopsis with a short synopsis. +- [ ] One or more examples named CmdCommandNameExample1, CmdCommandNameExample2, .... If possible, + some examples should use `` and some should use real data. Example: + `vcpkg install ` + `vcpkg install zlib` +- [ ] An `extern const CommandMetadata CommandCommandNameMetadata` describing the command connected + to `vcpkg help`, unless the command is not intended for users to use. +- [ ] An entry in print_command_list_usage(), if appropriate. +- [ ] A documentation page on vcpkg learn.microsoft.com, unless the command is not intended for + users to use. \ No newline at end of file diff --git a/docs/localization.md b/docs/localization.md index e36527b5a7..95407b4321 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -50,9 +50,9 @@ Messages in vcpkg are written in American English. They should not contain: if you need to add more than one indentation, you can use `append_indent(N)` - Any other interesting characters (like `- ` for lists, for example) should use `append_raw(...)` * or for the prefixes: - - `"warning: "`, instead use `msg::format(msg::msgWarningMessage).append(msgMyWarning)` - - `"error: "`, instead use `msg::msgErrorMessage` - - `"internal error: "`, instead use `msg::msgInternalErrorMessage`. + - `"warning: "`, instead use `msg::format(msgWarningMessage).append(msgMyWarning)` + - `"error: "`, instead use `msgErrorMessage` + - `"internal error: "`, instead use `msgInternalErrorMessage`. They should also not be simple, locale-invariant messages -- something like, for example, `{file}:{line}:{column}: ` should be done with `LocalizedString::from_raw(fmt::format("{}:{}:{}", file, line, column))`. @@ -116,7 +116,7 @@ namespace }; } -namespace vcpkg::Commands +namespace vcpkg { void HelloWorldCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths diff --git a/docs/vcpkg-schema-definitions.schema.json b/docs/vcpkg-schema-definitions.schema.json index c7208cdfd4..968528ea06 100644 --- a/docs/vcpkg-schema-definitions.schema.json +++ b/docs/vcpkg-schema-definitions.schema.json @@ -211,7 +211,7 @@ "features": { "type": "array", "items": { - "$ref": "#/definitions/identifier" + "$ref": "#/definitions/dependency-feature" } }, "host": { @@ -239,6 +239,33 @@ }, "additionalProperties": false }, + "dependency-feature-object": { + "description": "Expanded form of a dependency feature with platform expression.", + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/identifier" + }, + "platform": { + "$ref": "#/definitions/platform-expression" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "dependency-feature": { + "description": "A feature", + "oneOf": [ + { + "$ref": "#/definitions/identifier" + }, + { + "$ref": "#/definitions/dependency-feature-object" + } + ] + }, "description-field": { "description": "A string or array of strings containing the description of a package or feature.", "$ref": "#/definitions/string-or-strings" @@ -295,6 +322,9 @@ }, "supports": { "$ref": "#/definitions/platform-expression" + }, + "license": { + "$ref": "#/definitions/license" } }, "required": [ @@ -615,6 +645,31 @@ }, "else": false }, + "has-one-version": { + "type": "object", + "oneOf": [ + { + "required": [ + "version-string" + ] + }, + { + "required": [ + "version" + ] + }, + { + "required": [ + "version-semver" + ] + }, + { + "required": [ + "version-date" + ] + } + ] + }, "has-zero-or-one-version": { "type": "object", "oneOf": [ @@ -682,33 +737,67 @@ } ] }, + "license": { + "description": "An SPDX license expression at version 3.9.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, "maintainers": { "description": "An array of strings which contain the maintainers of a package", "$ref": "#/definitions/string-or-strings" }, "override": { "description": "A version override.", - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/identifier" - }, - "version": { - "type": "string", - "pattern": "^[^#]+(#\\d+)?$" + "allOf": [ + { + "type": "object", + "$comment": "The regexes below have (#\\d+)? added to the end as overrides allow putting the port-version inline", + "properties": { + "name": { + "$ref": "#/definitions/identifier" + }, + "version-string": { + "description": "Text used to identify an arbitrary version", + "type": "string", + "pattern": "^[^#]+(#\\d+)?$" + }, + "version": { + "description": "A relaxed version string (1.2.3.4...)", + "type": "string", + "pattern": "^\\d+(\\.\\d+)*(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?(#\\d+)?$" + }, + "version-date": { + "description": "A date version string (e.g. 2020-01-20)", + "type": "string", + "pattern": "^\\d{4}-\\d{2}-\\d{2}(\\.\\d+)*(#\\d+)?$" + }, + "version-semver": { + "description": "A semantic version string. See https://semver.org/", + "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?(#\\d+)?$" + }, + "port-version": { + "$ref": "#/definitions/port-version" + } + }, + "required": [ + "name" + ], + "patternProperties": { + "^\\$": {} + }, + "additionalProperties": false }, - "port-version": { - "$ref": "#/definitions/port-version" + { + "$ref": "#/definitions/has-one-version" } - }, - "required": [ - "name", - "version" - ], - "patternProperties": { - "^\\$": {} - }, - "additionalProperties": false + ] }, "port-name": { "type": "string", diff --git a/docs/vcpkg.schema.json b/docs/vcpkg.schema.json index 6f542c09f0..0d32d81484 100644 --- a/docs/vcpkg.schema.json +++ b/docs/vcpkg.schema.json @@ -51,15 +51,7 @@ "format": "uri" }, "license": { - "description": "An SPDX license expression at version 3.9.", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "$ref": "vcpkg-schema-definitions.schema.json#/definitions/license" }, "builtin-baseline": { "description": "A vcpkg repository commit for version control.", @@ -92,7 +84,7 @@ "description": "Features enabled by default with the package.", "type": "array", "items": { - "$ref": "vcpkg-schema-definitions.schema.json#/definitions/identifier" + "$ref": "vcpkg-schema-definitions.schema.json#/definitions/dependency-feature" } }, "supports": { diff --git a/docs/vcpkg_catalog_release_process.md b/docs/vcpkg_catalog_release_process.md deleted file mode 100644 index 5acd12b375..0000000000 --- a/docs/vcpkg_catalog_release_process.md +++ /dev/null @@ -1,14 +0,0 @@ -# vcpkg_catalog_release_process - -This document describes the acceptance criteria / process we use when doing a vcpkg release. - -1. Generate a new GitHub Personal Access Token with repo permissions. -2. Using the PAT, invoke $/scripts/Get-Changelog.ps1 `-StartDate (previous release date) -EndDate (Get-Date) -OutFile path/to/results.md` -3. Create a new GitHub release in this repo. -4. Submit a vcpkg.ci (full tree rebuild) run with the same SHA as that release. -5. Use the "auto-generate release notes". Copy the "new contributors" and "full changelog" parts to the end of `path/to/results.md`. -6. Change `## New Contributors` to `#### New Contributors` -7. In `path/to/results.md`, update `LINK TO BUILD` with the most recent link to vcpkg.ci run. -8. In `path/to/results.md`, fill out the tables for number of existing ports and successful ports. -9. Replace the contents of the release notes with the contents of `path/to/results.md` -10. After the full rebuild submission completes, update the link to the one for the exact SHA, the counts, and remove "(tentative)". diff --git a/docs/vcpkg_registry_release_process.md b/docs/vcpkg_registry_release_process.md new file mode 100644 index 0000000000..62603f0275 --- /dev/null +++ b/docs/vcpkg_registry_release_process.md @@ -0,0 +1,16 @@ +# vcpkg_registry_release_process + +This document describes the acceptance criteria / process we use when doing a vcpkg registry release. + +1. Create a git tag for the release. +1. Submit a full CI rebuild for the tag. +1. Checkout the tag +1. Run vcpkg z-changelog `` > `path/to/results.md` +1. Create a new GitHub release in the registry repo. +1. Run 'auto generate release notes' +1. Change `## New Contributors` to `#### New Contributors` +1. Copy the contents to the end of `path/to/results.md` (the `#### New Contributors` part should line up) +1. Change the link to the full rebuild. +1. Fill out the block about tool release changes. +1. After the full rebuild submission completes, change all the 'Building...'s to actual counts. +1. After a blog post for that release is authored, add a link to the blog post to the release. diff --git a/docs/vcpkg_tool_release_process.md b/docs/vcpkg_tool_release_process.md index c4433058ae..f325b1c6c2 100644 --- a/docs/vcpkg_tool_release_process.md +++ b/docs/vcpkg_tool_release_process.md @@ -5,35 +5,23 @@ such as https://github.com/microsoft/vcpkg/pull/23757 1. Update `$/vcpkg-init/vcpkg-scripts-sha.txt` to the current `master` branch SHA in the registry repo. -2. Verify that all tests etc. are passing in the vcpkg-tool repo's `main` branch, and that the +1. Verify that all tests etc. are passing in the vcpkg-tool repo's `main` branch, and that the contents therein are acceptable for release. (Steps after this will sign code there, so this review is responsible gating what has access to code signing.) -3. Check that the changes there are in fact the changes that we want in that release. (Be aware, +1. Check that the changes there are in fact the changes that we want in that release. (Be aware, you are responsible for what is about to be signed with a Microsoft code signing certificate by proceeding) -4. Build the changes locally with `-DVCPKG_ARTIFACTS_DEVELOPMENT=ON`, and run the end to end tests - with -RunArtifactsTests -5. Submit a signed build from "vcpkg Signed Binaries (from GitHub)" ( +1. Submit a signed build from "vcpkg Signed Binaries (from GitHub)" ( https://devdiv.visualstudio.com/DevDiv/_build?definitionId=17772&_a=summary as of this writing) -6. The signed build will automatically create a draft GitHub release at +1. The signed build will automatically create a draft GitHub release at https://github.com/microsoft/vcpkg-tool/releases . Erase the contents filled in there and press the "auto generate release notes" button. Manually remove any entries created by the automated localization tools which will start with `* LEGO: Pull request from juno/`. -7. Publish that draft release as "pre-release". -8. Publish symbols. - * Download `vcpkg.exe`, `vcpkg-arm64.exe`, `vcpkg.pdb`, `vcpkg-arm64.pdb` and put them in a - directory with nothing else. - * Make a different empty directory and run the following, with 2023-03-29 replaced with the right - release name. -``` -curl -L -o symbol.zip https://microsoft.artifacts.visualstudio.com/defaultcollection/_apis/symbol/client/exe -tar xf symbol.zip -.\lib\net45\Symbol.exe publish -d "Directory\With\exes\and\PDBs" -n vcpkg-2023-03-29 -s microsoft -a -``` -9. Clean up a machine for the following tests: - * Delete `VCPKG_DOWNLOADS/artifacts` (which forces artifacts to be reacquired) - * Delete `LOCALAPPDATA/vcpkg` (which forces registries to be reacquired) -10. Smoke test the 'one liner' installer: (Where 2023-03-29 is replaced with the right release name) +1. Publish that draft release as "pre-release". +1. Clean up a machine for the following tests: + * Delete `VCPKG_DOWNLOADS/artifacts` (which forces artifacts to be reacquired) + * Delete `LOCALAPPDATA/vcpkg` (which forces registries to be reacquired) +1. Smoke test the 'one liner' installer: (Where 2023-03-29 is replaced with the right release name) * Powershell: `iex (iwr https://github.com/microsoft/vcpkg-tool/releases/download/2023-03-29/vcpkg-init.ps1)` * Batch: @@ -41,21 +29,21 @@ tar xf symbol.zip * Bash: `. <(curl https://github.com/microsoft/vcpkg-tool/releases/download/2023-03-29/vcpkg-init -L)` (and test that `vcpkg use cmake` works from each of these) -11. In the vcpkg repo, draft a PR which updates `bootstrap-vcpkg.sh` and `boostrap-vcpkg.ps1` - with the new release date, and update SHAs as appropriate in the .sh script. (For example, see - https://github.com/microsoft/vcpkg/pull/23757) -12. If changes in this release that might affect ports, submit a new full tree rebuild by +1. In the vcpkg repo, run `\scripts\update-vcpkg-tool-metadata.ps1 -Date 2023-03-29` + with the new release date, which updates SHAs as appropriate. It will also emit a code block for + the next vscode-embedded-tools repo step. +1. In the DevDiv vscode-embedded-tools repo, follow the + [update instructions](https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_git/vscode-embedded-tools?path=/docs/updating-vcpkg.md&_a=preview) + to make a VS Code update PR. +1. If changes in this release that might affect ports, submit a new full tree rebuild by microsoft.vcpkg.ci (https://dev.azure.com/vcpkg/public/_build?definitionId=29 as of this writing) targeting `refs/pull/NUMBER/head` -13. (Probably the next day) Check over the failures and ensure any differences with the most recent +1. (Probably the next day) Check over the failures and ensure any differences with the most recent full rebuild using the previous tool version are understood. -14. In the DevDiv VS repo, update `default.config`, run the VcpkgInsertionUtility, and submit a PR +1. In the DevDiv VS repo, update `default.config`, run the VcpkgInsertionUtility, and submit a PR with those changes. -15. Smoke test the copy of vcpkg inserted into VS. See smoke test steps below. -16. In the DevDiv vscode-embedded-tools repo, follow the - [update instructions](https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_git/vscode-embedded-tools?path=/docs/updating-vcpkg.md&_a=preview) - to make a VS Code update PR. -17. (After all tests have passed, at the same time) Merge all 3 PRs, and change the github release +1. Smoke test the copy of vcpkg inserted into VS. See smoke test steps below. +1. (After all tests have passed, at the same time) Merge all 3 PRs, and change the github release in vcpkg-tool from "prerelease" to "release". (This automatically updates the aka.ms links) # Release Data Flow @@ -70,8 +58,8 @@ flowchart TD vs_corext_feed[(devdiv/VS-CoreXtFeeds NuGet Feed)] subgraph vcpkg_update_pr [vcpkg Update PR] direction LR - bootstrap_ps1[bootstrap.ps1] - bootstrap_sh[bootstrap.sh] + update_vcpkg_tool_metadata_ps1[update-vcpkg-tool-metadata.ps1] + vcpkg_tool_metadata_txt[vcpkg-tool-metadata.txt] vcpkg_repo_target[(GitHub vcpkg Repo)] end create_vcpkg_pr{Create GitHub vcpkg PR} @@ -96,7 +84,6 @@ flowchart TD vs_embedded_tools_repo[(vs_embedded_tools Repo)] end create_vs_code_update_pr{Create Visual Studio Code Update PR} - publish_symbols{Publish Symbols} symweb[(//symweb, etc.)] %% Build the Release @@ -104,14 +91,12 @@ flowchart TD vcpkg_repo -- vcpkg-tool/vcpkg-scripts-sha.txt --> vcpkg_signed_binaries vcpkg_signed_binaries --> vcpkg_tool_releases vcpkg_signed_binaries --> release_version - vcpkg_tool_releases --> publish_symbols - publish_symbols --> symweb + vcpkg_signed_binaries --> symweb %% vcpkg Update - release_version --> bootstrap_ps1 - release_version --> bootstrap_sh - bootstrap_ps1 --> vcpkg_repo_target - bootstrap_sh --> vcpkg_repo_target + release_version --> update_vcpkg_tool_metadata_ps1 + update_vcpkg_tool_metadata_ps1 --> vcpkg_tool_metadata_txt + vcpkg_tool_metadata_txt --> vcpkg_repo_target vcpkg_update_pr ----> create_vcpkg_pr create_vcpkg_pr --> run_full_tree_rebuild @@ -125,7 +110,7 @@ flowchart TD vs_update_pr --> create_vs_pr %% VS Code Update - release_version --> package_json + update_vcpkg_tool_metadata_ps1 --> package_json release_version --> changelog_md package_json --> vs_embedded_tools_repo changelog_md --> vs_embedded_tools_repo @@ -147,8 +132,8 @@ flowchart TD ``` * [vcpkg Signed Binaries (from GitHub)](https://devdiv.visualstudio.com/DevDiv/_build?definitionId=17772&_a=summary) Uses the azure-pipelines/signing.yml file in the vcpkg-tool repo. -* [devdiv/VS NuGet Feed](https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_artifacts/feed/VS/NuGet/VS.Redist.Vcpkg.x86/) -* [devdiv/VS-CoreXtFeeds NuGet Feed](https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_artifacts/feed/VS-CoreXtFeeds/NuGet/VS.Redist.Vcpkg.x86/) +* [devdiv/VS NuGet Feed](https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_artifacts/feed/VS/NuGet/VS.Redist.Vcpkg.amd64/) +* [devdiv/VS-CoreXtFeeds NuGet Feed](https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_artifacts/feed/VS-CoreXtFeeds/NuGet/VS.Redist.Vcpkg.amd64/) * [devdiv VS Repo](https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_git/VS) * Run VcpkgInsertionUtility at `$/src/vc/projbld/Vcpkg/VcpkgInsertionUtility/run.cmd` * [vscode-embedded-tools Repo](https://devdiv.visualstudio.com/DefaultCollection/DevDiv/_git/vscode-embedded-tools) @@ -159,68 +144,68 @@ flowchart TD # Smoke Testing VS 1. Update the copy of vcpkg in default.config in the VS repo. -2. Submit a PR which will give you a prototype of VS with that vcpkg inside. -3. Install the prototype version of VS with the vcpkg inserted. Ensure the native desktop workload is selected, and that vcpkg and cmake bits are installed. Don't forget about preinstall. -4. Open a developer command prompt and run `vcpkg integrate install` (this step hopefully removed soon) +1. Submit a PR which will give you a prototype of VS with that vcpkg inside. +1. Install the prototype version of VS with the vcpkg inserted. Ensure the native desktop workload is selected, and that vcpkg and cmake bits are installed. Don't forget about preinstall. +1. Open a developer command prompt and run `vcpkg integrate install` (this step hopefully removed soon) * This also verifies that vcpkg installed into the developer command prompt correctly. -5. Create a new C++ console project. -6. Turn on diagnostic logging. +1. Create a new C++ console project. +1. Turn on diagnostic logging. * Tools -> Options: Projects and Solutions\Build and Run\\MSBuild project output verbosity -7. Build the console project, check that vcpkg isn't affecting that project: +1. Build the console project, check that vcpkg isn't affecting that project: * Lib AdditionalLibraryDirectories doesn't contain a hypothetical vcpkg installed directory * Target VcpkgInstallManifestDependencies doesn't run * Target AppLocalFromInstalled doesn't run -8. In the developer command prompt cd to the directory with the vcxproj for the console app and run: -``` -vcpkg new --application -vcpkg add port zlib -``` -9. Rebuild the console app, and verify the manifest mode warning is printed: +1. In the developer command prompt cd to the directory with the vcxproj for the console app and run: + ``` + vcpkg new --application + vcpkg add port zlib + ``` +1. Rebuild the console app, and verify the manifest mode warning is printed: + ``` + 1>Target "VcpkgCheckManifestRoot" in file "C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets": + 1> Task "Error" skipped, due to false condition; ('$(VcpkgEnableManifest)' == 'true' and '$(_ZVcpkgManifestRoot)' == '') was evaluated as ('false' == 'true' and 'C:\Users\bion\source\repos\ConsoleApplication3\ConsoleApplication3\' == ''). + 1> Task "Message" + 1> Task Parameter:Importance=High + 1> Task Parameter:Text=The vcpkg manifest was disabled, but we found a manifest file in C:\Users\bion\source\repos\ConsoleApplication3\ConsoleApplication3\. You may want to enable vcpkg manifests in your properties page or pass /p:VcpkgEnableManifest=true to the msbuild invocation. + 1> The vcpkg manifest was disabled, but we found a manifest file in C:\Users\bion\source\repos\ConsoleApplication3\ConsoleApplication3\. You may want to enable vcpkg manifests in your properties page or pass /p:VcpkgEnableManifest=true to the msbuild invocation. + 1> Done executing task "Message". + ``` +1. Right click the console application, properties, and in the property pages change vcpkg\\Use vcpkg Manifest to "Yes" +1. Rebuild the project, observe vcpkg builds zlib. +1. Change the .cpp to: + ``` + #include + #include -``` -1>Target "VcpkgCheckManifestRoot" in file "C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\vcpkg\scripts\buildsystems\msbuild\vcpkg.targets": -1> Task "Error" skipped, due to false condition; ('$(VcpkgEnableManifest)' == 'true' and '$(_ZVcpkgManifestRoot)' == '') was evaluated as ('false' == 'true' and 'C:\Users\bion\source\repos\ConsoleApplication3\ConsoleApplication3\' == ''). -1> Task "Message" -1> Task Parameter:Importance=High -1> Task Parameter:Text=The vcpkg manifest was disabled, but we found a manifest file in C:\Users\bion\source\repos\ConsoleApplication3\ConsoleApplication3\. You may want to enable vcpkg manifests in your properties page or pass /p:VcpkgEnableManifest=true to the msbuild invocation. -1> The vcpkg manifest was disabled, but we found a manifest file in C:\Users\bion\source\repos\ConsoleApplication3\ConsoleApplication3\. You may want to enable vcpkg manifests in your properties page or pass /p:VcpkgEnableManifest=true to the msbuild invocation. -1> Done executing task "Message". -``` -10. Right click the console application, properties, and in the property pages change vcpkg\\Use vcpkg Manifest to "Yes" -11. Rebuild the project, observe vcpkg builds zlib. -12. Change the .cpp to: -``` -#include -#include - -int main() -{ - std::cout << "Hello World!\n" << ZLIB_VERSION; -} -``` -13. Run the program and verify that a reasonable zlib version is printed. -14. Close Visual Studio. -15. In the directory of that vcxproj, create a CMakeLists.txt with the following content: -``` -cmake_minimum_required(VERSION 3.24) -project(console-app LANGUAGES CXX) -message(WARNING "CMake Version is ${CMAKE_VERSION}") -find_package(ZLIB REQUIRED) -file(GLOB PROGRAM_SOURCES *.cpp) -add_executable(program ${PROGRAM_SOURCES}) -target_link_libraries(program PRIVATE ZLIB::ZLIB) -``` -16. Back in the developer command prompt, run: -``` -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" -S . -B build_msvc -ninja -C build_msvc -build_msvc\program.exe -``` -and check that a reasonable zlib version is printed. -17. Back in the developer command prompt, verify that the copy of CMake can be customized by running: -``` -cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" -S . -B build_artifact -ninja -C build_artifact -build_artifact\program.exe -``` -and check that the cmake version acquired by artifacts is printed during the cmake configure, and that a reasonable zlib version is printed. + int main() + { + std::cout << "Hello World!\n" << ZLIB_VERSION; + } + ``` +1. Run the program and verify that a reasonable zlib version is printed. +1. Close Visual Studio. +1. In the directory of that vcxproj, create a CMakeLists.txt with the following content: + ``` + cmake_minimum_required(VERSION 3.24) + project(console-app LANGUAGES CXX) + message(WARNING "CMake Version is ${CMAKE_VERSION}") + find_package(ZLIB REQUIRED) + file(GLOB PROGRAM_SOURCES *.cpp) + add_executable(program ${PROGRAM_SOURCES}) + target_link_libraries(program PRIVATE ZLIB::ZLIB) + ``` +1. Back in the developer command prompt, run: + ``` + cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" -S . -B build_msvc + ninja -C build_msvc + build_msvc\program.exe + ``` + and check that a reasonable zlib version is printed. +1. Back in the developer command prompt, verify that the copy of CMake can be customized by running: + ``` + vcpkg use cmake + cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" -S . -B build_artifact + ninja -C build_artifact + build_artifact\program.exe + ``` + and check that the cmake version acquired by artifacts is printed during the cmake configure, and that a reasonable zlib version is printed. diff --git a/include/vcpkg-test/mockcmakevarprovider.h b/include/vcpkg-test/mockcmakevarprovider.h index 6ee6428de8..1393a5843d 100644 --- a/include/vcpkg-test/mockcmakevarprovider.h +++ b/include/vcpkg-test/mockcmakevarprovider.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace vcpkg::Test { @@ -18,13 +19,10 @@ namespace vcpkg::Test dep_info_vars.emplace(spec, SMap{}); } - void load_tag_vars(Span specs, - const PortFileProvider& port_provider, - Triplet host_triplet) const override + void load_tag_vars(const ActionPlan& action_plan, Triplet host_triplet) const override { - for (auto&& spec : specs) - tag_vars.emplace(spec.package_spec, SMap{}); - (void)(port_provider); + for (auto&& install_action : action_plan.install_actions) + tag_vars.emplace(install_action.spec, SMap{}); (void)(host_triplet); } diff --git a/include/vcpkg-test/util.h b/include/vcpkg-test/util.h index 2d1568b3e1..507648b62a 100644 --- a/include/vcpkg-test/util.h +++ b/include/vcpkg-test/util.h @@ -4,11 +4,14 @@ #include +#include + +#include + #include #include #include #include -#include #include #include @@ -72,6 +75,15 @@ namespace Catch { static const std::string convert(const vcpkg::Path& value) { return "\"" + value.native() + "\""; } }; + + template<> + struct StringMaker> + { + static const std::string convert(const std::pair& value) + { + return "{\"" + value.first.native() + "\", \"" + value.second.native() + "\"}"; + } + }; } namespace vcpkg @@ -82,6 +94,21 @@ namespace vcpkg { return os << "LL" << std::quoted(value.data()); } + + inline std::ostream& operator<<(std::ostream& os, const Path& value) { return os << value.native(); } + + template + inline auto operator<<(std::ostream& os, const Optional& value) -> decltype(os << *(value.get())) + { + if (auto v = value.get()) + { + return os << *v; + } + else + { + return os << "nullopt"; + } + } } namespace vcpkg::Test @@ -92,17 +119,8 @@ namespace vcpkg::Test const std::vector>& features = {}, const std::vector& default_features = {}); - inline auto test_parse_control_file(const std::vector>& v) - { - std::vector pghs; - for (auto&& p : v) - { - pghs.emplace_back(); - for (auto&& kv : p) - pghs.back().emplace(kv.first, std::make_pair(kv.second, vcpkg::TextRowCol{})); - } - return vcpkg::SourceControlFile::parse_control_file("", std::move(pghs)); - } + ParseExpected test_parse_control_file( + const std::vector>& v); std::unique_ptr make_status_pgh(const char* name, const char* depends = "", @@ -143,18 +161,7 @@ namespace vcpkg::Test PackageSpec emplace(vcpkg::SourceControlFileAndLocation&& scfl); }; - inline std::vector parse_test_fspecs(StringView sv, Triplet t = X86_WINDOWS) - { - std::vector ret; - ParserBase parser(sv, "test"); - while (!parser.at_eof()) - { - auto opt = parse_qualified_specifier(parser); - REQUIRE(opt.has_value()); - ret.push_back(opt.get()->to_full_spec(t, ImplicitDefault::YES).value_or_exit(VCPKG_LINE_INFO)); - } - return ret; - } + std::vector parse_test_fspecs(StringView sv); template void check_ranges(const R1& r1, const R2& r2) @@ -179,4 +186,12 @@ namespace vcpkg::Test void check_json_eq_ordered(const Json::Array& l, const Json::Array& r); const Path& base_temporary_directory() noexcept; + + Optional diff_lines(StringView a, StringView b); } + +#define REQUIRE_LINES(a, b) \ + do \ + { \ + if (auto delta = ::vcpkg::Test::diff_lines((a), (b))) FAIL(*delta.get()); \ + } while (0) diff --git a/include/vcpkg/archives.h b/include/vcpkg/archives.h index be10f3c354..debcfb4665 100644 --- a/include/vcpkg/archives.h +++ b/include/vcpkg/archives.h @@ -1,40 +1,81 @@ #pragma once +#include #include +#include #include #include +#include #include -#include +#include namespace vcpkg { + enum class ExtractionType + { + Unknown, + Tar, + Zip, + Nupkg, + Msi, + Exe + }; + // Extract `archive` to `to_path` using `tar_tool`. void extract_tar(const Path& tar_tool, const Path& archive, const Path& to_path); // Extract `archive` to `to_path` using `cmake_tool`. (CMake's built in tar) void extract_tar_cmake(const Path& cmake_tool, const Path& archive, const Path& to_path); - // Extract `archive` to `to_path`, deleting `to_path` first. - void extract_archive( - Filesystem& fs, const ToolCache& tools, MessageSink& status_sink, const Path& archive, const Path& to_path); + void extract_archive(const Filesystem& fs, + const ToolCache& tools, + MessageSink& status_sink, + const Path& archive, + const Path& to_path); + // set `to_path` to `archive` contents. + void set_directory_to_archive_contents(const Filesystem& fs, + const ToolCache& tools, + MessageSink& status_sink, + const Path& archive, + const Path& to_path); + Path extract_archive_to_temp_subdirectory(const Filesystem& fs, + const ToolCache& tools, + MessageSink& status_sink, + const Path& archive, + const Path& to_path); + ExtractionType guess_extraction_type(const Path& archive); #ifdef _WIN32 // Extract the 7z archive part of a self extracting 7z installer - void win32_extract_self_extracting_7z(Filesystem& fs, const Path& archive, const Path& to_path); + void win32_extract_self_extracting_7z(const Filesystem& fs, const Path& archive, const Path& to_path); // Extract `archive` to `to_path`, deleting `to_path` first. `archive` must be a zip file. // This function will use potentially less performant tools that are reliably available on any machine. - void win32_extract_bootstrap_zip( - Filesystem& fs, const ToolCache& tools, MessageSink& status_sink, const Path& archive, const Path& to_path); + void win32_extract_bootstrap_zip(const Filesystem& fs, + const ToolCache& tools, + MessageSink& status_sink, + const Path& archive, + const Path& to_path); +#endif + + struct ZipTool + { + static ExpectedL make(const ToolCache& tools, MessageSink& status_sink); + + private: + ZipTool() = default; + +#if defined _WIN32 + Path seven_zip; #endif - // Compress the source directory into the destination file. - ExpectedL compress_directory_to_zip( - Filesystem& fs, const ToolCache& tools, MessageSink& status_sink, const Path& source, const Path& destination); + public: + // Compress the source directory into the destination file. + ExpectedL compress_directory_to_zip(const Filesystem& fs, + const Path& source, + const Path& destination) const; - Command decompress_zip_archive_cmd(const ToolCache& tools, - MessageSink& status_sink, - const Path& dst, - const Path& archive_path); + Command decompress_zip_archive_cmd(const Path& dst, const Path& archive_path) const; + }; std::vector> decompress_in_parallel(View jobs); } diff --git a/include/vcpkg/base/cofffilereader.h b/include/vcpkg/base/cofffilereader.h index ea3826e40b..75c475eefb 100644 --- a/include/vcpkg/base/cofffilereader.h +++ b/include/vcpkg/base/cofffilereader.h @@ -324,6 +324,8 @@ namespace vcpkg THUMB = 0x1c2, // Thumb WCEMIPSV2 = 0x169, // MIPS little-endian WCE v2 LLVM_BITCODE = 0x4342, // LLVM bitcode https://www.llvm.org/docs/BitCodeFormat.html#llvm-ir-magic-number + LOONGARCH32 = 0x6232, // LoongArch 32-bit processor family + LOONGARCH64 = 0x6264, // LoongArch 64-bit processor family }; enum class PEType diff --git a/include/vcpkg/base/downloads.h b/include/vcpkg/base/downloads.h index 8e4738edb5..c2adcd7176 100644 --- a/include/vcpkg/base/downloads.h +++ b/include/vcpkg/base/downloads.h @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -24,22 +25,34 @@ namespace vcpkg // e.g. {"https","//example.org", "/index.html"} ExpectedL split_uri_view(StringView uri); - void verify_downloaded_file_hash(const Filesystem& fs, + void verify_downloaded_file_hash(const ReadOnlyFilesystem& fs, StringView sanitized_url, const Path& downloaded_path, StringView sha512); View azure_blob_headers(); - std::vector download_files(Filesystem& fs, + std::vector download_files(const Filesystem& fs, View> url_pairs, View headers); - ExpectedL put_file(const Filesystem&, + + bool send_snapshot_to_api(const std::string& github_token, + const std::string& github_repository, + const Json::Object& snapshot); + ExpectedL put_file(const ReadOnlyFilesystem&, StringView url, const std::vector& secrets, View headers, const Path& file, - StringView request = "PUT"); + StringView method = "PUT"); + + ExpectedL invoke_http_request(StringView method, + View headers, + StringView url, + StringView data = {}); + + std::string format_url_query(StringView base_url, View query_params); + std::vector url_heads(View urls, View headers, View secrets); struct DownloadManagerConfig @@ -60,7 +73,7 @@ namespace vcpkg explicit DownloadManager(const DownloadManagerConfig& config) : m_config(config) { } explicit DownloadManager(DownloadManagerConfig&& config) : m_config(std::move(config)) { } - void download_file(Filesystem& fs, + void download_file(const Filesystem& fs, const std::string& url, View headers, const Path& download_path, @@ -68,14 +81,16 @@ namespace vcpkg MessageSink& progress_sink) const; // Returns url that was successfully downloaded from - std::string download_file(Filesystem& fs, + std::string download_file(const Filesystem& fs, View urls, View headers, const Path& download_path, const Optional& sha512, MessageSink& progress_sink) const; - ExpectedL put_file_to_mirror(const Filesystem& fs, const Path& file_to_put, StringView sha512) const; + ExpectedL put_file_to_mirror(const ReadOnlyFilesystem& fs, + const Path& file_to_put, + StringView sha512) const; private: DownloadManagerConfig m_config; diff --git a/include/vcpkg/base/expected.h b/include/vcpkg/base/expected.h index 7a700ee9ca..682e2af90c 100644 --- a/include/vcpkg/base/expected.h +++ b/include/vcpkg/base/expected.h @@ -328,9 +328,9 @@ namespace vcpkg public: template - std::invoke_result_t then(F f, Args&&... args) const& + typename std::invoke_result::type then(F f, Args&&... args) const& { - static_assert(IsThenCompatibleExpected>::value, + static_assert(IsThenCompatibleExpected::type>::value, "then expects f to return an expected with the same error type"); if (value_is_error) { @@ -343,9 +343,9 @@ namespace vcpkg } template - std::invoke_result_t then(F f, Args&&... args) && + typename std::invoke_result::type then(F f, Args&&... args) && { - static_assert(IsThenCompatibleExpected>::value, + static_assert(IsThenCompatibleExpected::type>::value, "then expects f to return an expected with the same error type"); if (value_is_error) { diff --git a/include/vcpkg/base/file_sink.h b/include/vcpkg/base/file_sink.h new file mode 100644 index 0000000000..7f2c20c9ed --- /dev/null +++ b/include/vcpkg/base/file_sink.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + struct FileSink : MessageSink + { + Path m_log_file; + WriteFilePointer m_out_file; + + FileSink(const Filesystem& fs, StringView log_file, Append append_to_file) + : m_log_file(log_file), m_out_file(fs.open_for_write(m_log_file, append_to_file, VCPKG_LINE_INFO)) + { + } + void print(Color c, StringView sv) override; + }; +} diff --git a/include/vcpkg/base/files.h b/include/vcpkg/base/files.h index 3e67690f9a..217c020c50 100644 --- a/include/vcpkg/base/files.h +++ b/include/vcpkg/base/files.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -9,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -22,12 +23,6 @@ #include #include -#if defined(_WIN32) -#define VCPKG_PREFERRED_SEPARATOR "\\" -#else // ^^^ _WIN32 / !_WIN32 vvv -#define VCPKG_PREFERRED_SEPARATOR "/" -#endif // _WIN32 - namespace vcpkg { LocalizedString format_filesystem_call_error(const std::error_code& ec, @@ -45,59 +40,16 @@ namespace vcpkg std::error_code ec; }; - struct Path + struct IsSlash { - Path(); - Path(const Path&); - Path(Path&&); - Path& operator=(const Path&); - Path& operator=(Path&&); - - Path(const StringView sv); - Path(const std::string& s); - Path(std::string&& s); - Path(const char* s); - Path(const char* first, size_t size); - - const std::string& native() const& noexcept; - std::string&& native() && noexcept; - operator StringView() const noexcept; - - const char* c_str() const noexcept; - - std::string generic_u8string() const; - - bool empty() const noexcept; - - Path operator/(StringView sv) const&; - Path operator/(StringView sv) &&; - Path operator+(StringView sv) const&; - Path operator+(StringView sv) &&; - - Path& operator/=(StringView sv); - Path& operator+=(StringView sv); - - void replace_filename(StringView sv); - void remove_filename(); - void make_preferred(); - void clear(); - Path lexically_normal() const; - - // Sets *this to parent_path, returns whether anything was removed - bool make_parent_path(); - - StringView parent_path() const; - StringView filename() const; - StringView extension() const; - StringView stem() const; - - bool is_absolute() const; - bool is_relative() const; - - friend const char* to_printf_arg(const Path& p) noexcept; - - private: - std::string m_str; + bool operator()(const char c) const noexcept + { + return c == '/' +#if defined(_WIN32) + || c == '\\' +#endif // _WIN32 + ; + } }; bool is_symlink(FileType s); @@ -142,6 +94,7 @@ namespace vcpkg ExpectedL try_read_all(void* buffer, std::uint32_t size); ExpectedL try_getc(); ExpectedL try_read_all_from(long long offset, void* buffer, std::uint32_t size); + std::string read_to_end(std::error_code& ec); }; struct WriteFilePointer : FilePointer @@ -165,12 +118,16 @@ namespace vcpkg { virtual ExpectedL> read_lines(const Path& file_path) const = 0; - protected: - ~ILineReader(); + // Omitted to allow constexpr: + // protected: + // ~ILineReader(); }; - struct Filesystem : ILineReader + struct ReadOnlyFilesystem : ILineReader { + virtual std::uint64_t file_size(const Path& file_path, std::error_code& ec) const = 0; + std::uint64_t file_size(const Path& file_path, LineInfo li) const; + virtual std::string read_contents(const Path& file_path, std::error_code& ec) const = 0; std::string read_contents(const Path& file_path, LineInfo li) const; @@ -180,60 +137,36 @@ namespace vcpkg const Path& filename, std::error_code& ec) const = 0; Path find_file_recursively_up(const Path& starting_dir, const Path& filename, LineInfo li) const; + ExpectedL try_find_file_recursively_up(const Path& starting_dir, const Path& filename) const; virtual std::vector get_files_recursive(const Path& dir, std::error_code& ec) const = 0; std::vector get_files_recursive(const Path& dir, LineInfo li) const; + ExpectedL> try_get_files_recursive(const Path& dir) const; virtual std::vector get_files_non_recursive(const Path& dir, std::error_code& ec) const = 0; std::vector get_files_non_recursive(const Path& dir, LineInfo li) const; + ExpectedL> try_get_files_non_recursive(const Path& dir) const; virtual std::vector get_directories_recursive(const Path& dir, std::error_code& ec) const = 0; std::vector get_directories_recursive(const Path& dir, LineInfo li) const; + ExpectedL> try_get_directories_recursive(const Path& dir) const; virtual std::vector get_directories_non_recursive(const Path& dir, std::error_code& ec) const = 0; std::vector get_directories_non_recursive(const Path& dir, LineInfo li) const; + ExpectedL> try_get_directories_non_recursive(const Path& dir) const; virtual std::vector get_regular_files_recursive(const Path& dir, std::error_code& ec) const = 0; std::vector get_regular_files_recursive(const Path& dir, LineInfo li) const; + ExpectedL> try_get_regular_files_recursive(const Path& dir) const; virtual std::vector get_regular_files_recursive_lexically_proximate(const Path& dir, std::error_code& ec) const = 0; std::vector get_regular_files_recursive_lexically_proximate(const Path& dir, LineInfo li) const; + ExpectedL> try_get_regular_files_recursive_lexically_proximate(const Path& dir) const; virtual std::vector get_regular_files_non_recursive(const Path& dir, std::error_code& ec) const = 0; std::vector get_regular_files_non_recursive(const Path& dir, LineInfo li) const; - - virtual void write_lines(const Path& file_path, const std::vector& lines, std::error_code& ec) = 0; - void write_lines(const Path& file_path, const std::vector& lines, LineInfo li); - - virtual void write_contents(const Path& file_path, StringView data, std::error_code& ec) = 0; - void write_contents(const Path& file_path, StringView data, LineInfo li); - - void write_rename_contents(const Path& file_path, const Path& temp_name, StringView data, LineInfo li); - void write_contents_and_dirs(const Path& file_path, StringView data, LineInfo li); - virtual void write_contents_and_dirs(const Path& file_path, StringView data, std::error_code& ec) = 0; - - virtual void rename(const Path& old_path, const Path& new_path, std::error_code& ec) = 0; - void rename(const Path& old_path, const Path& new_path, LineInfo li); - - void rename_with_retry(const Path& old_path, const Path& new_path, std::error_code& ec); - void rename_with_retry(const Path& old_path, const Path& new_path, LineInfo li); - - virtual void rename_or_copy(const Path& old_path, - const Path& new_path, - StringLiteral temp_suffix, - std::error_code& ec) = 0; - - virtual bool remove(const Path& target, std::error_code& ec) = 0; - bool remove(const Path& target, LineInfo li); - - virtual void remove_all(const Path& base, std::error_code& ec, Path& failure_point) = 0; - void remove_all(const Path& base, std::error_code& ec); - void remove_all(const Path& base, LineInfo li); - - void remove_all_inside(const Path& base, std::error_code& ec, Path& failure_point); - void remove_all_inside(const Path& base, std::error_code& ec); - void remove_all_inside(const Path& base, LineInfo li); + ExpectedL> try_get_regular_files_non_recursive(const Path& dir) const; bool exists(const Path& target, std::error_code& ec) const; bool exists(const Path& target, LineInfo li) const; @@ -244,42 +177,6 @@ namespace vcpkg virtual bool is_empty(const Path& target, std::error_code& ec) const = 0; bool is_empty(const Path& target, LineInfo li) const; - virtual bool create_directory(const Path& new_directory, std::error_code& ec) = 0; - bool create_directory(const Path& new_directory, LineInfo li); - - virtual bool create_directories(const Path& new_directory, std::error_code& ec) = 0; - bool create_directories(const Path& new_directory, LineInfo); - - virtual Path create_or_get_temp_directory(std::error_code& ec) = 0; - Path create_or_get_temp_directory(LineInfo); - - virtual void create_symlink(const Path& to, const Path& from, std::error_code& ec) = 0; - void create_symlink(const Path& to, const Path& from, LineInfo); - - virtual void create_directory_symlink(const Path& to, const Path& from, std::error_code& ec) = 0; - void create_directory_symlink(const Path& to, const Path& from, LineInfo); - - virtual void create_hard_link(const Path& to, const Path& from, std::error_code& ec) = 0; - void create_hard_link(const Path& to, const Path& from, LineInfo); - - void create_best_link(const Path& to, const Path& from, std::error_code& ec); - void create_best_link(const Path& to, const Path& from, LineInfo); - - // copies regular files and directories, recursively. - // symlinks are followed and copied as if they were regular files or directories - // (like std::filesystem::copy(..., std::filesystem::copy_options::recursive)) - virtual void copy_regular_recursive(const Path& source, const Path& destination, std::error_code& ec) = 0; - void copy_regular_recursive(const Path& source, const Path& destination, LineInfo); - - virtual bool copy_file(const Path& source, - const Path& destination, - CopyOptions options, - std::error_code& ec) = 0; - bool copy_file(const Path& source, const Path& destination, CopyOptions options, LineInfo li); - - virtual void copy_symlink(const Path& source, const Path& destination, std::error_code& ec) = 0; - void copy_symlink(const Path& source, const Path& destination, LineInfo li); - virtual FileType status(const Path& target, std::error_code& ec) const = 0; FileType status(const Path& target, LineInfo li) const noexcept; @@ -289,9 +186,6 @@ namespace vcpkg virtual int64_t last_write_time(const Path& target, std::error_code& ec) const = 0; int64_t last_write_time(const Path& target, LineInfo li) const noexcept; - virtual Path absolute(const Path& target, std::error_code& ec) const = 0; - Path absolute(const Path& target, LineInfo li) const; - // absolute/system_complete + lexically_normal + fixup_win32_path_case // we don't use real canonical due to issues like: // https://github.com/microsoft/vcpkg/issues/16614 (canonical breaking on some older Windows Server containers) @@ -303,8 +197,98 @@ namespace vcpkg virtual Path current_path(std::error_code&) const = 0; Path current_path(LineInfo li) const; - virtual void current_path(const Path& new_current_path, std::error_code&) = 0; - void current_path(const Path& new_current_path, LineInfo li); + virtual Path absolute(const Path& target, std::error_code& ec) const = 0; + Path absolute(const Path& target, LineInfo li) const; + + virtual std::vector find_from_PATH(View stems) const = 0; + std::vector find_from_PATH(StringView stem) const; + + virtual ReadFilePointer open_for_read(const Path& file_path, std::error_code& ec) const = 0; + ReadFilePointer open_for_read(const Path& file_path, LineInfo li) const; + ExpectedL try_open_for_read(const Path& file_path) const; + + ExpectedL check_update_required(const Path& version_path, StringView expected_version) const; + + // Omitted to allow constexpr: + // protected: + // ~ReadOnlyFilesystem(); + }; + + struct Filesystem : ReadOnlyFilesystem + { + virtual void write_lines(const Path& file_path, + const std::vector& lines, + std::error_code& ec) const = 0; + void write_lines(const Path& file_path, const std::vector& lines, LineInfo li) const; + + virtual void write_contents(const Path& file_path, StringView data, std::error_code& ec) const = 0; + void write_contents(const Path& file_path, StringView data, LineInfo li) const; + + void write_rename_contents(const Path& file_path, const Path& temp_name, StringView data, LineInfo li) const; + void write_contents_and_dirs(const Path& file_path, StringView data, LineInfo li) const; + virtual void write_contents_and_dirs(const Path& file_path, StringView data, std::error_code& ec) const = 0; + + virtual void rename(const Path& old_path, const Path& new_path, std::error_code& ec) const = 0; + void rename(const Path& old_path, const Path& new_path, LineInfo li) const; + + void rename_with_retry(const Path& old_path, const Path& new_path, std::error_code& ec) const; + void rename_with_retry(const Path& old_path, const Path& new_path, LineInfo li) const; + + virtual void rename_or_copy(const Path& old_path, + const Path& new_path, + StringLiteral temp_suffix, + std::error_code& ec) const = 0; + + virtual bool remove(const Path& target, std::error_code& ec) const = 0; + bool remove(const Path& target, LineInfo li) const; + + virtual void remove_all(const Path& base, std::error_code& ec, Path& failure_point) const = 0; + void remove_all(const Path& base, std::error_code& ec) const; + void remove_all(const Path& base, LineInfo li) const; + + void remove_all_inside(const Path& base, std::error_code& ec, Path& failure_point) const; + void remove_all_inside(const Path& base, std::error_code& ec) const; + void remove_all_inside(const Path& base, LineInfo li) const; + + virtual bool create_directory(const Path& new_directory, std::error_code& ec) const = 0; + bool create_directory(const Path& new_directory, LineInfo li) const; + + virtual bool create_directories(const Path& new_directory, std::error_code& ec) const = 0; + bool create_directories(const Path& new_directory, LineInfo) const; + + virtual Path create_or_get_temp_directory(std::error_code& ec) const = 0; + Path create_or_get_temp_directory(LineInfo) const; + + virtual void create_symlink(const Path& to, const Path& from, std::error_code& ec) const = 0; + void create_symlink(const Path& to, const Path& from, LineInfo) const; + + virtual void create_directory_symlink(const Path& to, const Path& from, std::error_code& ec) const = 0; + void create_directory_symlink(const Path& to, const Path& from, LineInfo) const; + + virtual void create_hard_link(const Path& to, const Path& from, std::error_code& ec) const = 0; + void create_hard_link(const Path& to, const Path& from, LineInfo) const; + + void create_best_link(const Path& to, const Path& from, std::error_code& ec) const; + void create_best_link(const Path& to, const Path& from, LineInfo) const; + + // copies regular files and directories, recursively. + // symlinks are followed and copied as if they were regular files or directories + // (like std::filesystem::copy(..., std::filesystem::copy_options::recursive)) + virtual void copy_regular_recursive(const Path& source, const Path& destination, std::error_code& ec) const = 0; + void copy_regular_recursive(const Path& source, const Path& destination, LineInfo) const; + + virtual bool copy_file(const Path& source, + const Path& destination, + CopyOptions options, + std::error_code& ec) const = 0; + bool copy_file(const Path& source, const Path& destination, CopyOptions options, LineInfo li) const; + + virtual void copy_symlink(const Path& source, const Path& destination, std::error_code& ec) const = 0; + void copy_symlink(const Path& source, const Path& destination, LineInfo li) const; + + using ReadOnlyFilesystem::current_path; + virtual void current_path(const Path& new_current_path, std::error_code&) const = 0; + void current_path(const Path& new_current_path, LineInfo li) const; // if the path does not exist, then (try_|)take_exclusive_file_lock attempts to create the file // (but not any path members above the file itself) @@ -314,34 +298,27 @@ namespace vcpkg // waits forever for the file lock virtual std::unique_ptr take_exclusive_file_lock(const Path& lockfile, - std::error_code&) = 0; - std::unique_ptr take_exclusive_file_lock(const Path& lockfile, LineInfo li); + std::error_code&) const = 0; + std::unique_ptr take_exclusive_file_lock(const Path& lockfile, LineInfo li) const; // waits, at most, 1.5 seconds, for the file lock virtual std::unique_ptr try_take_exclusive_file_lock(const Path& lockfile, - std::error_code&) = 0; - std::unique_ptr try_take_exclusive_file_lock(const Path& lockfile, LineInfo li); - - virtual std::vector find_from_PATH(View stems) const = 0; - std::vector find_from_PATH(StringView stem) const; - - virtual ReadFilePointer open_for_read(const Path& file_path, std::error_code& ec) const = 0; - ReadFilePointer open_for_read(const Path& file_path, LineInfo li) const; - ExpectedL try_open_for_read(const Path& file_path) const; + std::error_code&) const = 0; + std::unique_ptr try_take_exclusive_file_lock(const Path& lockfile, LineInfo li) const; - virtual WriteFilePointer open_for_write(const Path& file_path, Append append, std::error_code& ec) = 0; - WriteFilePointer open_for_write(const Path& file_path, Append append, LineInfo li); - WriteFilePointer open_for_write(const Path& file_path, std::error_code& ec); - WriteFilePointer open_for_write(const Path& file_path, LineInfo li); + virtual WriteFilePointer open_for_write(const Path& file_path, Append append, std::error_code& ec) const = 0; + WriteFilePointer open_for_write(const Path& file_path, Append append, LineInfo li) const; + WriteFilePointer open_for_write(const Path& file_path, std::error_code& ec) const; + WriteFilePointer open_for_write(const Path& file_path, LineInfo li) const; }; - Filesystem& get_real_filesystem(); + extern const Filesystem& real_filesystem; extern const StringLiteral FILESYSTEM_INVALID_CHARACTERS; bool has_invalid_chars_for_filesystem(const std::string& s); - void print_paths(const std::vector& paths); + void print_paths(MessageSink& msg_sink, const std::vector& paths); #if defined(_WIN32) Path win32_fix_path_case(const Path& source); @@ -364,6 +341,10 @@ namespace vcpkg std::vector exts; bool operator()(const Path& target) const; }; + +#if !defined(_WIN32) + void close_mark_invalid(int& fd) noexcept; +#endif // ^^^ !_WIN32 } VCPKG_FORMAT_AS(vcpkg::Path, vcpkg::StringView); diff --git a/include/vcpkg/base/fwd/files.h b/include/vcpkg/base/fwd/files.h index cd4d5921b8..76d4f3c594 100644 --- a/include/vcpkg/base/fwd/files.h +++ b/include/vcpkg/base/fwd/files.h @@ -1,5 +1,11 @@ #pragma once +#if defined(_WIN32) +#define VCPKG_PREFERRED_SEPARATOR "\\" +#else // ^^^ _WIN32 / !_WIN32 vvv +#define VCPKG_PREFERRED_SEPARATOR "/" +#endif // _WIN32 + namespace vcpkg { enum class CopyOptions @@ -42,6 +48,7 @@ namespace vcpkg struct IExclusiveFileLock; struct ILineReader; struct FileContents; + struct ReadOnlyFilesystem; struct Filesystem; struct NotExtensionCaseSensitive; struct NotExtensionCaseInsensitive; diff --git a/include/vcpkg/base/fwd/format.h b/include/vcpkg/base/fwd/format.h index 5b9d236f21..f13d54076f 100644 --- a/include/vcpkg/base/fwd/format.h +++ b/include/vcpkg/base/fwd/format.h @@ -2,7 +2,7 @@ namespace fmt { - inline namespace v9 + inline namespace v10 { template struct formatter; diff --git a/include/vcpkg/base/fwd/system.h b/include/vcpkg/base/fwd/system.h index 1980da648f..7f3addb197 100644 --- a/include/vcpkg/base/fwd/system.h +++ b/include/vcpkg/base/fwd/system.h @@ -13,5 +13,7 @@ namespace vcpkg PPC64LE, RISCV32, RISCV64, + LOONGARCH32, + LOONGARCH64, }; } diff --git a/include/vcpkg/base/git.h b/include/vcpkg/base/git.h index f20d099fd8..a3a3ba0034 100644 --- a/include/vcpkg/base/git.h +++ b/include/vcpkg/base/git.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include diff --git a/include/vcpkg/base/hash.h b/include/vcpkg/base/hash.h index 6863ba0ad6..f8a5f71e69 100644 --- a/include/vcpkg/base/hash.h +++ b/include/vcpkg/base/hash.h @@ -33,5 +33,5 @@ namespace vcpkg::Hash std::string get_bytes_hash(const void* first, const void* last, Algorithm algo); std::string get_string_hash(StringView s, Algorithm algo); std::string get_string_sha256(StringView s); - ExpectedL get_file_hash(const Filesystem& fs, const Path& target, Algorithm algo); + ExpectedL get_file_hash(const ReadOnlyFilesystem& fs, const Path& target, Algorithm algo); } diff --git a/include/vcpkg/base/json.h b/include/vcpkg/base/json.h index 288c010097..dee045f5a5 100644 --- a/include/vcpkg/base/json.h +++ b/include/vcpkg/base/json.h @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -27,26 +28,26 @@ namespace vcpkg::Json constexpr JsonStyle() noexcept = default; - static JsonStyle with_tabs() noexcept { return JsonStyle{-1}; } - static JsonStyle with_spaces(int indent) noexcept + static JsonStyle with_tabs() noexcept { return JsonStyle{SIZE_MAX}; } + static JsonStyle with_spaces(size_t indent) noexcept { - vcpkg::Checks::check_exit(VCPKG_LINE_INFO, indent >= 0); + vcpkg::Checks::check_exit(VCPKG_LINE_INFO, indent != SIZE_MAX); return JsonStyle{indent}; } - void set_tabs() noexcept { this->indent = -1; } - void set_spaces(int indent_) noexcept + void set_tabs() noexcept { this->indent = SIZE_MAX; } + void set_spaces(size_t indent_) noexcept { - vcpkg::Checks::check_exit(VCPKG_LINE_INFO, indent >= 0); + vcpkg::Checks::check_exit(VCPKG_LINE_INFO, indent != SIZE_MAX); this->indent = indent_; } - bool use_tabs() const noexcept { return indent == -1; } - bool use_spaces() const noexcept { return indent >= 0; } + bool use_tabs() const noexcept { return indent == SIZE_MAX; } + bool use_spaces() const noexcept { return indent != SIZE_MAX; } - int spaces() const noexcept + size_t spaces() const noexcept { - vcpkg::Checks::check_exit(VCPKG_LINE_INFO, indent >= 0); + vcpkg::Checks::check_exit(VCPKG_LINE_INFO, indent != SIZE_MAX); return indent; } @@ -61,9 +62,9 @@ namespace vcpkg::Json } private: - constexpr explicit JsonStyle(int indent) : indent(indent) { } - // -1 for tab, >=0 gives # of spaces - int indent = 2; + constexpr explicit JsonStyle(size_t indent) : indent(indent) { } + // SIZE_MAX for tab, otherwise # of spaces + size_t indent = 2; }; enum class ValueKind : int @@ -326,9 +327,11 @@ namespace vcpkg::Json JsonStyle style; }; - ExpectedT> parse_file(const Filesystem&, const Path&, std::error_code& ec); + ExpectedT> parse_file(const ReadOnlyFilesystem&, + const Path&, + std::error_code& ec); ExpectedT> parse(StringView text, StringView origin = {}); - ParsedJson parse_file(LineInfo li, const Filesystem&, const Path&); + ParsedJson parse_file(LineInfo li, const ReadOnlyFilesystem&, const Path&); ExpectedL parse_object(StringView text, StringView origin = {}); std::string stringify(const Value&); diff --git a/include/vcpkg/base/jsonreader.h b/include/vcpkg/base/jsonreader.h index 3de6556e33..bbd01bb027 100644 --- a/include/vcpkg/base/jsonreader.h +++ b/include/vcpkg/base/jsonreader.h @@ -3,9 +3,9 @@ #include #include -#include #include #include +#include #include #include @@ -360,31 +360,11 @@ namespace vcpkg::Json static const PackageNameDeserializer instance; }; - /// - /// A registry package pattern (e.g.: boost*) and the in-file location where it was declared. - /// - struct PackagePatternDeclaration - { - std::string pattern; - std::string location; - }; - - /// - /// Deserializes a list of package names and patterns along with their respective in-file declaration locations. - /// - struct PackagePatternDeserializer final : Json::IDeserializer + struct FeatureNameDeserializer final : Json::IDeserializer { virtual LocalizedString type_name() const override; - virtual Optional visit_string(Json::Reader&, StringView sv) const override; - - static bool is_package_pattern(StringView sv); - static const PackagePatternDeserializer instance; - }; - - struct PackagePatternArrayDeserializer final : Json::ArrayDeserializer - { - virtual LocalizedString type_name() const override; - static const PackagePatternArrayDeserializer instance; + virtual Optional visit_string(Json::Reader&, StringView sv) const override; + static const FeatureNameDeserializer instance; }; } diff --git a/include/vcpkg/base/lineinfo.h b/include/vcpkg/base/lineinfo.h index 71fd29681a..94f812e10f 100644 --- a/include/vcpkg/base/lineinfo.h +++ b/include/vcpkg/base/lineinfo.h @@ -16,9 +16,6 @@ namespace vcpkg } #define VCPKG_LINE_INFO \ - vcpkg::LineInfo \ - { \ - __LINE__, __FILE__ \ - } + vcpkg::LineInfo { __LINE__, __FILE__ } VCPKG_FORMAT_WITH_TO_STRING(vcpkg::LineInfo); diff --git a/include/vcpkg/base/message-args.inc.h b/include/vcpkg/base/message-args.inc.h index 4fe562ab69..317f19853b 100644 --- a/include/vcpkg/base/message-args.inc.h +++ b/include/vcpkg/base/message-args.inc.h @@ -57,3 +57,5 @@ DECLARE_MSG_ARG(version, "1.3.8") DECLARE_MSG_ARG(package_name, "zlib") DECLARE_MSG_ARG(spec, "zlib:x64-windows") DECLARE_MSG_ARG(feature_spec, "zlib[featurea,featureb]") +DECLARE_MSG_ARG(version_spec, "zlib:x64-windows@1.0.0") +DECLARE_MSG_ARG(constraint_origin, "zlib:x64-windows@1.0.0") diff --git a/include/vcpkg/base/message-data.inc.h b/include/vcpkg/base/message-data.inc.h index 5f56a855ba..9ee635c600 100644 --- a/include/vcpkg/base/message-data.inc.h +++ b/include/vcpkg/base/message-data.inc.h @@ -1,9 +1,11 @@ DECLARE_MESSAGE(ABaseline, (), "", "a baseline") DECLARE_MESSAGE(ABaselineObject, (), "", "a baseline object") +DECLARE_MESSAGE(ADefaultFeature, (), "", "a default feature") DECLARE_MESSAGE(ABoolean, (), "", "a boolean") DECLARE_MESSAGE(ABuiltinRegistry, (), "", "a builtin registry") DECLARE_MESSAGE(AConfigurationObject, (), "", "a configuration object") DECLARE_MESSAGE(ADependency, (), "", "a dependency") +DECLARE_MESSAGE(ADependencyFeature, (), "", "a feature of a dependency") DECLARE_MESSAGE(ADemandObject, (), "'demands' are a concept in the schema of a JSON file the user can edit", @@ -16,10 +18,6 @@ DECLARE_MESSAGE(AddFirstArgument, (msg::command_line), "", "The first argument to '{command_line}' must be 'artifact' or 'port'.") -DECLARE_MESSAGE(AddHelp, - (), - "", - "Adds the indicated port or artifact to the manifest associated with the current directory.") DECLARE_MESSAGE(AddingCompletionEntry, (msg::path), "", "Adding vcpkg completion entry to {path}.") DECLARE_MESSAGE(AdditionalPackagesToExport, (), @@ -41,6 +39,10 @@ DECLARE_MESSAGE(AddTripletExpressionNotAllowed, "", "triplet expressions are not allowed here. You may want to change " "`{package_name}:{triplet}` to `{package_name}` instead.") +DECLARE_MESSAGE(AddVersionArtifactsOnly, + (), + "'--version', and 'vcpkg add port' are command lines that must not be localized", + "--version is artifacts only and can't be used with vcpkg add port") DECLARE_MESSAGE(AddVersionAddedVersionToFile, (msg::version, msg::path), "", "added version {version} to {path}") DECLARE_MESSAGE(AddVersionCommitChangesReminder, (), "", "Did you remember to commit your changes?") DECLARE_MESSAGE(AddVersionCommitResultReminder, (), "", "Don't forget to commit the result!") @@ -77,7 +79,7 @@ DECLARE_MESSAGE(AddVersionPortHasImproperFormat, (msg::package_name), "", "{pack DECLARE_MESSAGE(AddVersionSuggestNewVersionScheme, (msg::new_scheme, msg::old_scheme, msg::package_name, msg::option), "The -- before {option} must be preserved as they're part of the help message for the user.", - "Use the version scheme \"{new_scheme}\" instead of \"{old_scheme}\" in port " + "Use the version scheme \"{new_scheme}\" rather than \"{old_scheme}\" in port " "\"{package_name}\".\nUse --{option} to disable this check.") DECLARE_MESSAGE(AddVersionUnableToParseVersionsFile, (msg::path), "", "unable to parse versions file {path}") DECLARE_MESSAGE(AddVersionUncommittedChanges, @@ -93,6 +95,7 @@ DECLARE_MESSAGE(AddVersionVersionAlreadyInFile, (msg::version, msg::path), "", " DECLARE_MESSAGE(AddVersionVersionIs, (msg::version), "", "version: {version}") DECLARE_MESSAGE(ADictionaryOfContacts, (), "", "a dictionary of contacts") DECLARE_MESSAGE(AFeature, (), "", "a feature") +DECLARE_MESSAGE(AFeatureName, (), "", "a feature name") DECLARE_MESSAGE(AFilesystemRegistry, (), "", "a filesystem registry") DECLARE_MESSAGE(AGitObjectSha, (), "", "a git object SHA") DECLARE_MESSAGE(AGitReference, (), "", "a git reference (for example, a branch)") @@ -122,8 +125,10 @@ DECLARE_MESSAGE(AmbiguousConfigDeleteConfigFile, "configuration file {path}") DECLARE_MESSAGE(AnArtifactsGitRegistryUrl, (), "", "an artifacts git registry URL") DECLARE_MESSAGE(AnArtifactsRegistry, (), "", "an artifacts registry") +DECLARE_MESSAGE(AnArrayOfDefaultFeatures, (), "", "an array of default features") DECLARE_MESSAGE(AnArrayOfDependencies, (), "", "an array of dependencies") DECLARE_MESSAGE(AnArrayOfDependencyOverrides, (), "", "an array of dependency overrides") +DECLARE_MESSAGE(AnArrayOfFeatures, (), "", "an array of features") DECLARE_MESSAGE(AnArrayOfIdentifers, (), "", "an array of identifiers") DECLARE_MESSAGE(AnArrayOfOverlayPaths, (), "", "an array of overlay paths") DECLARE_MESSAGE(AnArrayOfOverlayTripletsPaths, (), "", "an array of overlay triplets paths") @@ -168,12 +173,60 @@ DECLARE_MESSAGE(ARegistryPathMustStartWithDollar, "", "A registry path must start with `$` to mean the registry root; for example, `$/foo/bar`.") DECLARE_MESSAGE(ARelaxedVersionString, (), "", "a relaxed version string") +DECLARE_MESSAGE(ArtifactsBootstrapFailed, (), "", "vcpkg-artifacts is not installed and could not be bootstrapped.") +DECLARE_MESSAGE(ArtifactsNotInstalledReadonlyRoot, + (), + "", + "vcpkg-artifacts is not installed, and it can't be installed because VCPKG_ROOT is assumed to be " + "readonly. Reinstalling vcpkg using the 'one liner' may fix this problem.") +DECLARE_MESSAGE(ArtifactsNotOfficialWarning, (), "", "Using vcpkg-artifacts with an unofficial ") DECLARE_MESSAGE(ArtifactsOptionIncompatibility, (msg::option), "", "--{option} has no effect on find artifact.") +DECLARE_MESSAGE(ArtifactsOptionJson, + (), + "", + "Full path to JSON file where environment variables and other properties are recorded") +DECLARE_MESSAGE(ArtifactsOptionMSBuildProps, + (), + "", + "Full path to the file in which MSBuild properties will be written") +DECLARE_MESSAGE(ArtifactsOptionVersion, (), "", "A version or version range to match; only valid for artifacts") +DECLARE_MESSAGE(ArtifactsOptionVersionMismatch, + (), + "--version is a command line switch and must not be localized", + "The number of --version switches must match the number of named artifacts") +DECLARE_MESSAGE(ArtifactsSwitchAll, (), "", "Updates all known artifact registries") +DECLARE_MESSAGE(ArtifactsSwitchAllLanguages, (), "", "Acquires all language files when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchARM, (), "", "Forces host detection to ARM when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchARM64, (), "", "Forces host detection to ARM64 when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchForce, (), "", "Forces reacquire if an artifact is already acquired") +DECLARE_MESSAGE(ArtifactsSwitchFreebsd, (), "", "Forces host detection to FreeBSD when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchLinux, (), "", "Forces host detection to Linux when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchNormalize, (), "", "Applies any deprecation fixups") +DECLARE_MESSAGE(ArtifactsSwitchTargetARM, (), "", "Sets target detection to ARM when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchTargetARM64, (), "", "Sets target detection to ARM64 when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchTargetX64, (), "", "Sets target detection to x64 when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchTargetX86, (), "", "Sets target to x86 when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchOnlyOneOperatingSystem, + (), + "The words after -- are command line switches and must not be localized.", + "Only one operating system (--windows, --osx, --linux, --freebsd) may be set.") +DECLARE_MESSAGE(ArtifactsSwitchOnlyOneHostPlatform, + (), + "The words after -- are command line switches and must not be localized.", + "Only one host platform (--x64, --x86, --arm, --arm64) may be set.") +DECLARE_MESSAGE(ArtifactsSwitchOnlyOneTargetPlatform, + (), + "The words after -- are command line switches and must not be localized.", + "Only one target platform (--target:x64, --target:x86, --target:arm, --target:arm64) may be set.") +DECLARE_MESSAGE(ArtifactsSwitchOsx, (), "", "Forces host detection to MacOS when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchX64, (), "", "Forces host detection to x64 when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchX86, (), "", "Forces host detection to x86 when acquiring artifacts") +DECLARE_MESSAGE(ArtifactsSwitchWindows, (), "", "Forces host detection to Windows when acquiring artifacts") DECLARE_MESSAGE(AssetCacheProviderAcceptsNoArguments, (msg::value), "{value} is a asset caching provider name such as azurl, clear, or x-block-origin", "unexpected arguments: '{value}' does not accept arguments") -DECLARE_MESSAGE(AssetSourcesArg, (), "", "Add sources for asset caching. See 'vcpkg help assetcaching'.") +DECLARE_MESSAGE(AssetSourcesArg, (), "", "Asset caching sources. See 'vcpkg help assetcaching'") DECLARE_MESSAGE(ASemanticVersionString, (), "", "a semantic version string") DECLARE_MESSAGE(ASetOfFeatures, (), "", "a set of features") DECLARE_MESSAGE(AStringOrArrayOfStrings, (), "", "a string or array of strings") @@ -197,19 +250,23 @@ DECLARE_MESSAGE(AutomaticLinkingForMSBuildProjects, "", "All MSBuild C++ projects can now #include any installed libraries. Linking will be handled " "automatically. Installing new libraries will make them instantly available.") +DECLARE_MESSAGE(AutomaticLinkingForVS2017AndLater, + (), + "", + "Visual Studio 2017 and later can now #include any installed libraries. Linking will be handled " + "automatically. Installing new libraries will make them instantly available.") DECLARE_MESSAGE(AutoSettingEnvVar, (msg::env_var, msg::url), "An example of env_var is \"HTTP(S)_PROXY\"" "'--' at the beginning must be preserved", "-- Automatically setting {env_var} environment variables to \"{url}\".") DECLARE_MESSAGE(AUrl, (), "", "a url") -DECLARE_MESSAGE(AvailableArchitectureTriplets, (), "", "Available architecture triplets:") DECLARE_MESSAGE(AvailableHelpTopics, (), "", "Available help topics:") DECLARE_MESSAGE(AVcpkgRepositoryCommit, (), "", "a vcpkg repository commit") DECLARE_MESSAGE(AVersionDatabaseEntry, (), "", "a version database entry") DECLARE_MESSAGE(AVersionObject, (), "", "a version object") DECLARE_MESSAGE(AVersionOfAnyType, (), "", "a version of any type") -DECLARE_MESSAGE(AVersionConstraint, (), "", "a version constriant") +DECLARE_MESSAGE(AVersionConstraint, (), "", "a version constraint") DECLARE_MESSAGE(AzUrlAssetCacheRequiresBaseUrl, (), "", @@ -227,10 +284,6 @@ DECLARE_MESSAGE(BaselineFileNoDefaultField, (msg::commit_sha), "", "The baseline file at commit {commit_sha} was invalid (no \"default\" field).") -DECLARE_MESSAGE(BaselineFileNoDefaultFieldPath, - (msg::path), - "", - "baseline file at {path} was invalid (no \"default\" field)") DECLARE_MESSAGE(BaselineGitShowFailed, (msg::commit_sha), "", @@ -244,12 +297,11 @@ DECLARE_MESSAGE(BaselineMissing, "git add versions\n" "git commit -m \"Update version database\"\n" "to set {version} as the baseline version.") -DECLARE_MESSAGE(BaselineMissingDefault, - (msg::commit_sha, msg::url), - "", - "The baseline.json from commit `\"{commit_sha}\"` in the repo {url} was invalid (did not " - "contain a \"default\" field).") -DECLARE_MESSAGE(BinarySourcesArg, (), "", "Add sources for binary caching. See 'vcpkg help binarycaching'.") +DECLARE_MESSAGE(BinaryCacheVendorHTTP, (), "", "HTTP servers") +DECLARE_MESSAGE(BinarySourcesArg, + (), + "'vcpkg help binarycaching' is a command line and should not be localized", + "Binary caching sources. See 'vcpkg help binarycaching'") DECLARE_MESSAGE(BinaryWithInvalidArchitecture, (msg::path, msg::expected, msg::actual), "{expected} and {actual} are architectures", @@ -328,7 +380,7 @@ DECLARE_MESSAGE(BuildResultSummaryLine, (msg::build_result, msg::count), "Displayed to show a count of results of a build_result in a summary.", "{build_result}: {count}") -DECLARE_MESSAGE(BuildTreesRootDir, (), "", "(Experimental) Specify the buildtrees root directory.") +DECLARE_MESSAGE(BuildTreesRootDir, (), "", "Buildtrees directory (experimental)") DECLARE_MESSAGE(BuildTroubleshootingMessage1, (), "First part of build troubleshooting message, printed before the URI to look for existing bugs.", @@ -343,7 +395,7 @@ DECLARE_MESSAGE(BuildTroubleshootingMessageGH, (), "Another part of build troubleshooting message, printed after the URI. An alternative version to " "create an issue in some cases.", - "You can also sumbit an issue by running (GitHub cli must be installed):") + "You can also submit an issue by running (GitHub CLI must be installed):") DECLARE_MESSAGE( BuildTroubleshootingMessage3, (msg::package_name), @@ -356,12 +408,8 @@ DECLARE_MESSAGE(BuildTroubleshootingMessage4, "Fourth optional part of build troubleshooting message, printed after the version" "information about vcpkg itself.", "Please use the prefilled template from {path} when reporting your issue.") -DECLARE_MESSAGE(BuiltInTriplets, (), "", "vcpkg built-in triplets:") +DECLARE_MESSAGE(BuiltInTriplets, (), "", "Built-in Triplets:") DECLARE_MESSAGE(BuiltWithIncorrectArchitecture, (), "", "The following files were built for an incorrect architecture:") -DECLARE_MESSAGE(CacheHelp, - (), - "", - "The argument should be a substring to search for or no argument to display all cached libraries.") DECLARE_MESSAGE(CheckedOutGitSha, (msg::commit_sha), "", "Checked out Git SHA: {commit_sha}") DECLARE_MESSAGE(CheckedOutObjectMissingManifest, (), @@ -390,6 +438,14 @@ DECLARE_MESSAGE(CiBaselineRegressionHeader, (), "Printed before a series of CiBaselineRegression and/or CiBaselineUnexpectedPass messages.", "REGRESSIONS:") +DECLARE_MESSAGE(CiBaselineUnexpectedFail, + (msg::spec, msg::triplet), + "", + "REGRESSION: {spec} is marked as fail but not supported for {triplet}.") +DECLARE_MESSAGE(CiBaselineUnexpectedFailCascade, + (msg::spec, msg::triplet), + "", + "REGRESSION: {spec} is marked as fail but one dependency is not supported for {triplet}.") DECLARE_MESSAGE(CiBaselineUnexpectedPass, (msg::spec, msg::path), "", @@ -411,23 +467,21 @@ DECLARE_MESSAGE(CISettingsOptSkippedCascadeCount, (), "", "Asserts that the number of --exclude and supports skips exactly equal this number") -DECLARE_MESSAGE(CISettingsOptXUnit, (), "", "File to output results in XUnit format (internal)") +DECLARE_MESSAGE(CISettingsOptXUnit, (), "", "File to output results in XUnit format") DECLARE_MESSAGE(CISettingsVerifyGitTree, (), "", - "Verify that each git tree object matches its declared version (this is very slow)") -DECLARE_MESSAGE(CISettingsVerifyVersion, (), "", "Print result for each port instead of just errors.") -DECLARE_MESSAGE(CISwitchOptAllowUnexpectedPassing, - (), - "", - "Indicates that 'Passing, remove from fail list' results should not be emitted.") -DECLARE_MESSAGE(CISwitchOptDryRun, (), "", "Print out plan without execution") -DECLARE_MESSAGE(CISwitchOptRandomize, (), "", "Randomize the install order") + "Verifies that each git tree object matches its declared version (this is very slow)") +DECLARE_MESSAGE(CISettingsVerifyVersion, (), "", "Prints result for each port rather than only just errors") +DECLARE_MESSAGE(CISkipInstallation, (), "", "The following packages are already installed and won't be built again:") +DECLARE_MESSAGE(CISwitchOptAllowUnexpectedPassing, (), "", "Suppresses 'Passing, remove from fail list' results") +DECLARE_MESSAGE(CISwitchOptDryRun, (), "", "Prints out plan without execution") +DECLARE_MESSAGE(CISwitchOptRandomize, (), "", "Randomizes the install order") DECLARE_MESSAGE(CISwitchOptSkipFailures, (), - "", - "Indicates that ports marked `=fail` in ci.baseline.txt should be skipped.") -DECLARE_MESSAGE(CISwitchOptXUnitAll, (), "", "Report also unchanged ports to the XUnit output (internal)") + "=fail is an on-disk format and should not be localized", + "Skips ports marked `=fail` in ci.baseline.txt") +DECLARE_MESSAGE(CISwitchOptXUnitAll, (), "", "Reports unchanged ports in the XUnit output") DECLARE_MESSAGE(ClearingContents, (msg::path), "", "Clearing contents of {path}") DECLARE_MESSAGE(CmakeTargetsExcluded, (msg::count), "", "note: {count} additional targets are not displayed.") DECLARE_MESSAGE(CMakeTargetsUsage, @@ -444,52 +498,163 @@ DECLARE_MESSAGE(CMakeUsingExportedLibs, (msg::value), "{value} is a CMake command line switch of the form -DFOO=BAR", "To use exported libraries in CMake projects, add {value} to your CMake command line.") -DECLARE_MESSAGE(CmdAddVersionOptAll, (), "", "Process versions for all ports.") -DECLARE_MESSAGE(CmdAddVersionOptOverwriteVersion, (), "", "Overwrite `git-tree` of an existing version.") -DECLARE_MESSAGE(CmdAddVersionOptSkipFormatChk, (), "", "Skips the formatting check of vcpkg.json files.") -DECLARE_MESSAGE(CmdAddVersionOptSkipVersionFormatChk, (), "", "Skips the version format check.") -DECLARE_MESSAGE(CmdAddVersionOptVerbose, (), "", "Print success messages instead of just errors.") +DECLARE_MESSAGE(CmdAcquireExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg acquire ") +DECLARE_MESSAGE(CmdAcquireProjectSynopsis, (), "", "Acquires all artifacts referenced by a manifest") +DECLARE_MESSAGE(CmdAcquireSynopsis, (), "", "Acquires the named artifact") +DECLARE_MESSAGE(CmdActivateSynopsis, (), "", "Activates artifacts from a manifest") +DECLARE_MESSAGE(CmdAddExample1, (), "", "vcpkg add port ") +DECLARE_MESSAGE(CmdAddExample2, (), "", "vcpkg add artifact ") +DECLARE_MESSAGE(CmdAddSynopsis, (), "", "Adds dependency to manifest") +DECLARE_MESSAGE(CmdAddVersionSynopsis, (), "", "Adds a version to the version database") +DECLARE_MESSAGE(CmdAddVersionExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg x-add-version ") +DECLARE_MESSAGE(CmdAddVersionOptAll, (), "", "Processes versions for all ports") +DECLARE_MESSAGE(CmdAddVersionOptOverwriteVersion, (), "", "Overwrites git-tree of an existing version") +DECLARE_MESSAGE(CmdAddVersionOptSkipFormatChk, (), "", "Skips the formatting check of vcpkg.json files") +DECLARE_MESSAGE(CmdAddVersionOptSkipVersionFormatChk, (), "", "Skips the version format check") +DECLARE_MESSAGE(CmdAddVersionOptVerbose, (), "", "Prints success messages rather than only errors") +DECLARE_MESSAGE(CmdBootstrapStandaloneSynopsis, (), "", "Bootstraps a vcpkg root from only a vcpkg binary") +DECLARE_MESSAGE(CmdBuildExternalExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg build-external ") +DECLARE_MESSAGE(CmdBuildExternalExample2, + (), + "This is a command line, only the path part should be changed to a path conveying the same idea", + "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json") +DECLARE_MESSAGE(CmdBuildExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg build ") +DECLARE_MESSAGE(CmdBuildExternalSynopsis, (), "", "Builds port from a path") +DECLARE_MESSAGE(CmdBuildSynopsis, (), "", "Builds a port") +DECLARE_MESSAGE(CmdCacheExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg cache ") +DECLARE_MESSAGE(CmdCacheSynopsis, (), "", "List specs of packages") +DECLARE_MESSAGE(CmdCiCleanSynopsis, + (), + "CI is continuous integration (building everything together)", + "Clears all files to prepare for a CI run") +DECLARE_MESSAGE(CmdCiSynopsis, + (), + "CI is continuous integration (building everything together)", + "Tries building all ports for CI testing") +DECLARE_MESSAGE(CmdCiVerifyVersionsSynopsis, (), "", "Checks integrity of the version database") DECLARE_MESSAGE(CmdContactOptSurvey, (), "", "Launch default browser to the current vcpkg survey") -DECLARE_MESSAGE(CmdDependInfoOptDepth, (), "", "Show recursion depth in output") -DECLARE_MESSAGE(CmdDependInfoOptDGML, (), "", "Creates graph on basis of dgml") -DECLARE_MESSAGE(CmdDependInfoOptDot, (), "", "Creates graph on basis of dot") -DECLARE_MESSAGE(CmdDependInfoOptMaxRecurse, (), "", "Set max recursion depth, a value of -1 indicates no limit") -DECLARE_MESSAGE(CmdDependInfoOptSort, - (), - "", - "Set sort order for the list of dependencies, accepted values are: lexicographical, topological " - "(default), x-tree, " - "reverse") -DECLARE_MESSAGE(CmdEditOptAll, (), "", "Open editor into the port as well as the port-specific buildtree subfolder") -DECLARE_MESSAGE(CmdEditOptBuildTrees, (), "", "Open editor into the port-specific buildtree subfolder") -DECLARE_MESSAGE(CmdEnvOptions, (msg::path, msg::env_var), "", "Add installed {path} to {env_var}") -DECLARE_MESSAGE(CmdExportOpt7Zip, (), "", "Export to a 7zip (.7z) file") -DECLARE_MESSAGE(CmdExportOptChocolatey, (), "", "Export a Chocolatey package (experimental feature)") -DECLARE_MESSAGE(CmdExportOptDebug, (), "", "Enable prefab debug") -DECLARE_MESSAGE(CmdExportOptDryRun, (), "", "Do not actually export.") -DECLARE_MESSAGE(CmdExportOptIFW, (), "", "Export to an IFW-based installer") -DECLARE_MESSAGE(CmdExportOptInstalled, (), "", "Export all installed packages") -DECLARE_MESSAGE(CmdExportOptMaven, (), "", "Enable Maven") -DECLARE_MESSAGE(CmdExportOptNuget, (), "", "Export a NuGet package") -DECLARE_MESSAGE(CmdExportOptPrefab, (), "", "Export to Prefab format") -DECLARE_MESSAGE(CmdExportOptRaw, (), "", "Export to an uncompressed directory") -DECLARE_MESSAGE(CmdExportOptZip, (), "", "Export to a zip file") +DECLARE_MESSAGE(CmdCheckSupportExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg x-check-support ") +DECLARE_MESSAGE(CmdCheckSupportSynopsis, (), "", "Tests whether a port is supported without building it") +DECLARE_MESSAGE(CmdCreateExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg create ") +DECLARE_MESSAGE(CmdCreateExample2, + (), + "This is a command line, 'my-fancy-port' and 'sources.zip' should probably be localized", + "vcpkg create my-fancy-port https://example.com/sources.zip") +DECLARE_MESSAGE(CmdCreateExample3, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg create ") +DECLARE_MESSAGE(CmdDeactivateSynopsis, (), "", "Removes all artifact activations from the current shell") +DECLARE_MESSAGE(CmdDependInfoExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg depend-info ") +DECLARE_MESSAGE(CmdDependInfoFormatConflict, + (), + "", + "Conflicting formats specified. Only one of --format, --dgml, or --dot are accepted.") +DECLARE_MESSAGE(CmdDependInfoFormatHelp, + (), + "The alternatives in ``s must not be localized.", + "Chooses output format, one of `list`, `tree`, `mermaid`, `dot`, or `dgml`") +DECLARE_MESSAGE( + CmdDependInfoFormatInvalid, + (msg::value), + "The alternatives in ``s must not be localized. {value} is what the user specified.", + "--format={value} is not a recognized format. --format must be one of `list`, `tree`, `mermaid`, `dot`, or `dgml`.") +DECLARE_MESSAGE(CmdDependInfoShowDepthFormatMismatch, + (), + "", + "--show-depth can only be used with `list` and `tree` formats.") +DECLARE_MESSAGE(CmdDependInfoXtreeTree, (), "", "--sort=x-tree cannot be used with formats other than tree") +DECLARE_MESSAGE(CmdDependInfoOptDepth, (), "", "Shows recursion depth in `list` output") +DECLARE_MESSAGE(CmdDependInfoOptMaxRecurse, (), "", "Sets max recursion depth. Default is no limit") +DECLARE_MESSAGE( + CmdDependInfoOptSort, + (), + "The alternatives in ``s must not be localized, but the localized text can explain what each value " + "means. The value `reverse` means 'reverse-topological'.", + "Chooses sort order for the `list` format, one of `lexicographical`, `topological` (default), `reverse`") +DECLARE_MESSAGE(CmdDownloadExample1, + (), + "This is a command line, only the part should be localized", + "vcpkg x-download --url=https://...") +DECLARE_MESSAGE(CmdDownloadExample2, + (), + "This is a command line, only the part should be localized", + "vcpkg x-download --sha512= --url=https://...") +DECLARE_MESSAGE(CmdDownloadExample3, + (), + "This is a command line, only the part should be localized", + "vcpkg x-download --skip-sha512 --url=https://...") +DECLARE_MESSAGE(CmdDownloadSynopsis, (), "", "Downloads a file") +DECLARE_MESSAGE(CmdEditExample1, + (), + "This is a command line, only the part should be localized", + "vcpkg edit ") +DECLARE_MESSAGE(CmdEditOptAll, (), "", "Opens editor into the port as well as the port-specific buildtree subfolder") +DECLARE_MESSAGE(CmdEditOptBuildTrees, (), "", "Opens editor into the port-specific buildtree subfolder") +DECLARE_MESSAGE(CommandEnvExample2, + (), + "This is a command line, only the part should be localized", + "vcpkg env \"ninja -C \" --triplet x64-windows") +DECLARE_MESSAGE(CmdEnvOptions, (msg::path, msg::env_var), "", "Adds installed {path} to {env_var}") +DECLARE_MESSAGE(CmdExportEmptyPlan, + (), + "", + "Refusing to create an export of zero packages. Install packages before exporting.") +DECLARE_MESSAGE(CmdExportExample1, + (), + "This is a command line, only and the out_dir part should be localized", + "vcpkg export [--nuget] [--directory=out_dir]") +DECLARE_MESSAGE(CmdExportOpt7Zip, (), "", "Exports to a 7zip (.7z) file") +DECLARE_MESSAGE(CmdExportOptChocolatey, (), "", "Exports a Chocolatey package (experimental)") +DECLARE_MESSAGE(CmdExportOptDebug, (), "", "Enables prefab debug") +DECLARE_MESSAGE(CmdExportOptDryRun, (), "", "Does not actually export") +DECLARE_MESSAGE(CmdExportOptIFW, (), "", "Exports to an IFW-based installer") +DECLARE_MESSAGE(CmdExportOptInstalled, (), "", "Exports all installed packages") +DECLARE_MESSAGE(CmdExportOptMaven, (), "", "Enables Maven") +DECLARE_MESSAGE(CmdExportOptNuget, (), "", "Exports a NuGet package") +DECLARE_MESSAGE(CmdExportOptPrefab, (), "", "Exports to Prefab format") +DECLARE_MESSAGE(CmdExportOptRaw, (), "", "Exports to an uncompressed directory") +DECLARE_MESSAGE(CmdExportOptZip, (), "", "Exports to a zip file") DECLARE_MESSAGE(CmdExportSettingChocolateyMaint, (), "", - "Specify the maintainer for the exported Chocolatey package (experimental feature)") + "The maintainer for the exported Chocolatey package (experimental)") DECLARE_MESSAGE(CmdExportSettingChocolateyVersion, (), "", - "Specify the version suffix to add for the exported Chocolatey package (experimental feature)") -DECLARE_MESSAGE(CmdExportSettingConfigFile, (), "", "Specify the temporary file path for the installer configuration") -DECLARE_MESSAGE(CmdExportSettingInstallerPath, (), "", "Specify the file path for the exported installer") -DECLARE_MESSAGE(CmdExportSettingNugetDesc, (), "", "Specify a description for the exported NuGet package") -DECLARE_MESSAGE(CmdExportSettingNugetID, (), "", "Specify the id for the exported NuGet package (overrides --output)") -DECLARE_MESSAGE(CmdExportSettingNugetVersion, (), "", "Specify the version for the exported NuGet package") -DECLARE_MESSAGE(CmdExportSettingOutput, (), "", "Specify the output name (used to construct filename)") -DECLARE_MESSAGE(CmdExportSettingOutputDir, (), "", "Specify the output directory for produced artifacts") -DECLARE_MESSAGE(CmdExportSettingPkgDir, (), "", "Specify the temporary directory path for the repacked packages") + "The version suffix to add for the exported Chocolatey package (experimental)") +DECLARE_MESSAGE(CmdExportSettingConfigFile, (), "", "The temporary file path for the installer configuration") +DECLARE_MESSAGE(CmdExportSettingInstallerPath, (), "", "The file path for the exported installer") +DECLARE_MESSAGE(CmdExportSettingNugetDesc, (), "", "Description for the exported NuGet package") +DECLARE_MESSAGE(CmdExportSettingNugetID, (), "", "Id for the exported NuGet package (overrides --output)") +DECLARE_MESSAGE(CmdExportSettingNugetVersion, (), "", "The version for the exported NuGet package") +DECLARE_MESSAGE(CmdExportSettingOutput, (), "", "The output name (used to construct filename)") +DECLARE_MESSAGE(CmdExportSettingOutputDir, (), "", "The output directory for produced artifacts") +DECLARE_MESSAGE(CmdExportSettingPkgDir, (), "", "The temporary directory path for the repacked packages") DECLARE_MESSAGE(CmdExportSettingPrefabArtifactID, (), "", @@ -502,74 +667,205 @@ DECLARE_MESSAGE(CmdExportSettingPrefabVersion, (), "", "Version is the name of the project according Maven specifications") -DECLARE_MESSAGE(CmdExportSettingRepoDir, (), "", "Specify the directory path for the exported repository") -DECLARE_MESSAGE(CmdExportSettingRepoURL, (), "", "Specify the remote repository URL for the online installer") -DECLARE_MESSAGE(CmdExportSettingSDKMinVersion, (), "", "Android minimum supported SDK version") -DECLARE_MESSAGE(CmdExportSettingSDKTargetVersion, (), "", "Android target sdk version") +DECLARE_MESSAGE(CmdExportSettingRepoDir, (), "", "The directory path for the exported repository") +DECLARE_MESSAGE(CmdExportSettingRepoURL, (), "", "The remote repository URL for the online installer") +DECLARE_MESSAGE(CmdExportSettingSDKMinVersion, (), "", "The Android minimum supported SDK version") +DECLARE_MESSAGE(CmdExportSettingSDKTargetVersion, (), "", "The Android target sdk version") +DECLARE_MESSAGE(CmdExportSynopsis, (), "", "Creates a standalone deployment of installed ports") DECLARE_MESSAGE(CmdFetchOptXStderrStatus, (), "", - "Direct status/downloading messages to stderr rather than stdout. (Errors/failures still go to stdout)") -DECLARE_MESSAGE(CmdFormatManifestOptAll, (), "", "Format all ports' manifest files.") -DECLARE_MESSAGE(CmdFormatManifestOptConvertControl, (), "", "Convert CONTROL files to manifest files.") + "Prints status/downloading messages to stderr rather than stdout (Errors/failures still go to stdout)") +DECLARE_MESSAGE(CmdFetchSynopsis, (), "", "Fetches something from the system or the internet") +DECLARE_MESSAGE(CmdFindExample1, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg find port ") +DECLARE_MESSAGE(CmdFindExample2, + (), + "This is a command line, only the <>s part should be localized", + "vcpkg find artifact ") +DECLARE_MESSAGE(CmdFindSynopsis, (), "", "Finds a port or artifact that may be installed or activated") +DECLARE_MESSAGE(CmdFormatManifestExample1, + (), + "This is a command line, only the s part should be localized", + "vcpkg format-manifest ") +DECLARE_MESSAGE(CmdFormatManifestOptAll, (), "", "Formats all ports' manifest files") +DECLARE_MESSAGE(CmdFormatManifestOptConvertControl, (), "", "Converts CONTROL files to manifest files") DECLARE_MESSAGE( CmdGenerateMessageMapOptNoOutputComments, (), "", - "When generating the message map, exclude comments (useful for generating the English localization file)") -DECLARE_MESSAGE(CmdInfoOptInstalled, (), "", "(experimental) Report on installed packages instead of available") -DECLARE_MESSAGE(CmdInfoOptTransitive, (), "", "(experimental) Also report on dependencies of installed packages") -DECLARE_MESSAGE(CmdNewOptApplication, (), "", "Create an application manifest (don't require name or version).") -DECLARE_MESSAGE(CmdNewOptSingleFile, (), "", "Embed vcpkg-configuration.json into vcpkg.json.") -DECLARE_MESSAGE(CmdNewOptVersionDate, (), "", "Interpret --version as an ISO 8601 date. (YYYY-MM-DD)") + "Excludes comments when generating the message map (useful for generating the English localization file)") +DECLARE_MESSAGE(CmdFormatManifestSynopsis, (), "", "Prettyfies vcpkg.json") +DECLARE_MESSAGE(CmdGenerateMSBuildPropsExample1, + (), + "This is a command line, only the part should be localized", + "vcpkg generate-msbuild-props --msbuild-props ") +DECLARE_MESSAGE(CmdGenerateMSBuildPropsExample2, + (), + "This is a command line, only the word 'out' should be localized", + "vcpkg generate-msbuild-props --msbuild-props out.props") +DECLARE_MESSAGE( + CmdGenerateMSBuildPropsSynopsis, + (), + "", + "Generates msbuild .props files as if activating a manifest's artifact dependencies, without acquiring them") +DECLARE_MESSAGE(CmdHashExample1, + (), + "This is a command line, only the part should be localized", + "vcpkg hash ") +DECLARE_MESSAGE(CmdHashExample2, + (), + "This is a command line, only the part should be localized", + "vcpkg hash SHA256") +DECLARE_MESSAGE(CmdHashSynopsis, (), "", "Gets a file's SHA256 or SHA512") +DECLARE_MESSAGE(CmdHelpCommands, (), "This is a command line, only should be localized.", "help ") +DECLARE_MESSAGE(CmdHelpCommandSynopsis, (), "", "Displays help detail for ") +DECLARE_MESSAGE(CmdHelpCommandsSynopsis, (), "", "Displays full list of commands, including rare ones not listed here") +DECLARE_MESSAGE(CmdHelpTopic, (), "This is a command line, only should be localized.", "help ") +DECLARE_MESSAGE(CmdInfoOptInstalled, (), "", "(experimental) Reports installed packages rather than available") +DECLARE_MESSAGE(CmdInfoOptTransitive, (), "", "(experimental) Also reports dependencies of installed packages") +DECLARE_MESSAGE(CmdInitRegistryExample1, + (), + "This is a command line, only the part should be localized", + "vcpkg x-init-registry ") +DECLARE_MESSAGE(CmdInitRegistrySynopsis, (), "", "Creates a blank git registry") +DECLARE_MESSAGE(CmdInstallExample1, + (), + "This is a command line, only the <> parts should be localized", + "vcpkg install ...") +DECLARE_MESSAGE(CmdIntegrateSynopsis, (), "", "Integrates vcpkg with machines, projects, or shells") +DECLARE_MESSAGE(CmdListExample2, + (), + "This is a command line, only the part should be localized", + "vcpkg list ") +DECLARE_MESSAGE(CmdNewExample1, + (), + "This is a command line, only the word example should be localized", + "vcpkg new --name=example --version=1.0") +DECLARE_MESSAGE(CmdNewOptApplication, (), "", "Creates an application manifest (don't require name or version)") +DECLARE_MESSAGE(CmdNewOptSingleFile, (), "", "Embeds vcpkg-configuration.json into vcpkg.json") +DECLARE_MESSAGE(CmdNewOptVersionDate, (), "", "Interprets --version as an ISO 8601 date. (YYYY-MM-DD)") DECLARE_MESSAGE(CmdNewOptVersionRelaxed, (), "", - "Interpret --version as a relaxed-numeric version. (Nonnegative numbers separated by dots)") -DECLARE_MESSAGE(CmdNewOptVersionString, (), "", "Interpret --version as a string with no ordering behavior.") -DECLARE_MESSAGE(CmdNewSettingName, (), "", "Name for the new manifest.") -DECLARE_MESSAGE(CmdNewSettingVersion, (), "", "Version for the new manifest.") -DECLARE_MESSAGE(CmdRegenerateOptDryRun, (), "", "does not actually perform the action, shows only what would be done") -DECLARE_MESSAGE(CmdRegenerateOptForce, (), "", "proceeds with the (potentially dangerous) action without confirmation") -DECLARE_MESSAGE(CmdRegenerateOptNormalize, (), "", "apply any deprecation fixups") -DECLARE_MESSAGE(CmdRemoveOptDryRun, (), "", "Print the packages to be removed, but do not remove them") -DECLARE_MESSAGE(CmdRemoveOptOutdated, (), "", "Select all packages with versions that do not match the portfiles") -DECLARE_MESSAGE(CmdRemoveOptRecurse, (), "", "Allow removal of packages not explicitly specified on the command line") + "Interprets --version as a relaxed-numeric version (Nonnegative numbers separated by dots)") +DECLARE_MESSAGE(CmdNewOptVersionString, (), "", "Interprets --version as a string with no ordering behavior") +DECLARE_MESSAGE(CmdNewSettingName, (), "", "Name for the new manifest") +DECLARE_MESSAGE(CmdNewSettingVersion, (), "", "Version for the new manifest") +DECLARE_MESSAGE(CmdNewSynposis, (), "", "Creates a new manifest") +DECLARE_MESSAGE(CmdOwnsExample1, + (), + "This is a command line, only the part should be localized.", + "vcpkg owns ") +DECLARE_MESSAGE(CmdPackageInfoExample1, + (), + "This is a command line, only the part should be localized.", + "vcpkg x-package-info ...") +DECLARE_MESSAGE(CmdPortsdiffExample1, + (), + "This is a command line, only the part should be localized", + "vcpkg portsdiff ") +DECLARE_MESSAGE(CmdPortsdiffExample2, + (), + "This is a command line, only the parts in <>s should be localized", + "vcpkg portsdiff ") +DECLARE_MESSAGE(CmdPortsdiffSynopsis, (), "", "Diffs changes in port versions between commits") +DECLARE_MESSAGE(CmdRegenerateOptDryRun, (), "", "Does not actually perform the action, shows only what would be done") +DECLARE_MESSAGE(CmdRegenerateOptForce, (), "", "Proceeds with the (potentially dangerous) action without confirmation") +DECLARE_MESSAGE(CmdRegenerateOptNormalize, (), "", "Applies any deprecation fixes") +DECLARE_MESSAGE(CmdRemoveExample1, + (), + "This is a command line, only the part should be localized.", + "vcpkg remove ...") +DECLARE_MESSAGE(CmdRemoveOptDryRun, (), "", "Prints the packages to be removed, but does not remove them") +DECLARE_MESSAGE(CmdRemoveOptOutdated, + (), + "", + "Removes all packages with versions that do not match the built-in registry") +DECLARE_MESSAGE(CmdRemoveOptRecurse, (), "", "Allows removal of dependent packages not explicitly specified") +DECLARE_MESSAGE(CmdSearchExample1, + (), + "This is a command line, only the part should be localized.", + "vcpkg search ") DECLARE_MESSAGE(CmdSettingCopiedFilesLog, (), "", "Path to the copied files log to create") DECLARE_MESSAGE(CmdSettingInstalledDir, (), "", "Path to the installed tree to use") DECLARE_MESSAGE(CmdSettingTargetBin, (), "", "Path to the binary to analyze") DECLARE_MESSAGE(CmdSettingTLogFile, (), "", "Path to the tlog file to create") -DECLARE_MESSAGE(CmdSetInstalledOptDryRun, (), "", "Do not actually build or install") -DECLARE_MESSAGE(CmdSetInstalledOptNoUsage, (), "", "Don't print CMake usage information after install.") +DECLARE_MESSAGE(CmdSetInstalledExample1, + (), + "This is a command line, only the part should be localized.", + "vcpkg x-set-installed ...") +DECLARE_MESSAGE(CmdSetInstalledOptDryRun, (), "", "Does not actually build or install") +DECLARE_MESSAGE(CmdSetInstalledOptNoUsage, (), "", "Does not print CMake usage information after install") DECLARE_MESSAGE(CmdSetInstalledOptWritePkgConfig, + (), + "'vcpkg help binarycaching' is a command line and should not be localized.", + "Writes a NuGet packages.config-formatted file for use with external binary caching. " + "See `vcpkg help binarycaching` for more information") +DECLARE_MESSAGE(CmdSetInstalledSynopsis, (), "", - "Writes out a NuGet packages.config-formatted file for use with external binary caching.\n" - "See `vcpkg help binarycaching` for more information.") -DECLARE_MESSAGE(CmdUpdateBaselineOptDryRun, (), "", "Print out plan without execution") + "Installs, upgrades, or removes packages such that that installed matches exactly those supplied") +DECLARE_MESSAGE(CmdUpdateBaselineOptDryRun, (), "", "Prints out plan without execution") DECLARE_MESSAGE(CmdUpdateBaselineOptInitial, (), "", - "add a `builtin-baseline` to a vcpkg.json that doesn't already have it") -DECLARE_MESSAGE(CmdUpgradeOptAllowUnsupported, + "Adds a `builtin-baseline` to a vcpkg.json that doesn't already have it") +DECLARE_MESSAGE(CmdUpdateBaselineSynopsis, + (), + "", + "Updates baselines of git registries in a manifest to those registries' HEAD commit") +DECLARE_MESSAGE(CmdUpdateRegistryAll, (), "", "Updates all known artifact registries") +DECLARE_MESSAGE(CmdUpdateRegistryAllExcludesTargets, (), "", - "Instead of erroring on an unsupported port, continue with a warning.") + "Update registry --all cannot be used with a list of artifact registries") +DECLARE_MESSAGE(CmdUpdateRegistryExample3, + (), + "This is a command line, only the part should be localized.", + "vcpkg x-update-registry ") +DECLARE_MESSAGE(CmdUpdateRegistrySynopsis, (), "", "Re-downloads an artifact registry") +DECLARE_MESSAGE(CmdUpdateRegistryAllOrTargets, + (), + "", + "Update registry requires either a list of artifact registry names or URiIs to update, or --all.") DECLARE_MESSAGE(CmdUpgradeOptNoDryRun, (), "", "Actually upgrade") DECLARE_MESSAGE(CmdUpgradeOptNoKeepGoing, (), "", "Stop installing packages on failure") +DECLARE_MESSAGE(CmdUseExample1, + (), + "This is a command line, only the part should be localized.", + "vcpkg use ") +DECLARE_MESSAGE(CmdUseSynopsis, (), "", "Activate a single artifact in this shell") +DECLARE_MESSAGE(CmdVSInstancesSynopsis, (), "", "Lists detected Visual Studio instances") DECLARE_MESSAGE(CmdXDownloadOptHeader, (), "", "Additional header to use when fetching from URLs") DECLARE_MESSAGE(CmdXDownloadOptSha, (), "", "The hash of the file to be downloaded") -DECLARE_MESSAGE(CmdXDownloadOptSkipSha, (), "", "Do not check the SHA512 of the downloaded file") -DECLARE_MESSAGE(CmdXDownloadOptStore, (), "", "Indicates the file should be stored instead of fetched") +DECLARE_MESSAGE(CmdXDownloadOptSkipSha, (), "", "Skips check of SHA512 of the downloaded file") +DECLARE_MESSAGE(CmdXDownloadOptStore, (), "", "Stores the the file should father than fetching it") DECLARE_MESSAGE(CmdXDownloadOptUrl, (), "", "URL to download and store if missing from cache") +DECLARE_MESSAGE( + CmdZApplocalSynopsis, + (), + "", + "Copies a binary's dependencies from the installed tree to where that binary's location for app-local deployment") +DECLARE_MESSAGE(CmdZExtractExample1, + (), + "This is a command line, only the parts in <>s should be localized", + "vcpkg z-extract ") +DECLARE_MESSAGE(CmdZExtractExample2, + (), + "This is a command line, the example archive 'source.zip' and the example output directory " + "'source_dir' should be localized", + "vcpkg z-extract source.zip source_dir --strip 2") +DECLARE_MESSAGE(CmdZExtractOptStrip, (), "", "The number of leading directories to strip from all paths") DECLARE_MESSAGE(CommandFailed, (msg::command_line), "", "command:\n" "{command_line}\n" "failed with the following results:") -DECLARE_MESSAGE(Commands, (), "", "Commands:") -DECLARE_MESSAGE(CommunityTriplets, (), "", "VCPKG community triplets:") +DECLARE_MESSAGE(CommunityTriplets, (), "", "Community Triplets:") DECLARE_MESSAGE(ComparingUtf8Decoders, (), "", @@ -591,6 +887,11 @@ DECLARE_MESSAGE(ConflictingFiles, (msg::path, msg::spec), "", "The following files are already installed in {path} and are in conflict with {spec}") +DECLARE_MESSAGE(ConsideredVersions, + (msg::version), + "", + "The following executables were considered but discarded because of the version " + "requirement of {version}:") DECLARE_MESSAGE(ConstraintViolation, (), "", "Found a constraint violation:") DECLARE_MESSAGE(ContinueCodeUnitInStart, (), "", "found continue code unit in start position") DECLARE_MESSAGE(ControlAndManifestFilesPresent, @@ -605,18 +906,10 @@ DECLARE_MESSAGE(CouldNotDeduceNugetIdAndVersion, (msg::path), "", "Could not deduce nuget id and version from filename: {path}") -DECLARE_MESSAGE(CouldNotFindBaseline, - (msg::commit_sha, msg::path), - "", - "Could not find explicitly specified baseline `\"{commit_sha}\"` in baseline file {path}") -DECLARE_MESSAGE(CouldNotFindBaselineForRepo, - (msg::commit_sha, msg::package_name), - "", - "Couldn't find baseline `\"{commit_sha}\"` for repo {package_name}") DECLARE_MESSAGE(CouldNotFindBaselineInCommit, - (msg::commit_sha, msg::package_name), + (msg::url, msg::commit_sha, msg::package_name), "", - "Couldn't find baseline in commit `\"{commit_sha}\"` from repo {package_name}:") + "Couldn't find baseline in {url} at {commit_sha} for {package_name}.") DECLARE_MESSAGE(CouldNotFindGitTreeAtCommit, (msg::package_name, msg::commit_sha), "", @@ -678,19 +971,47 @@ DECLARE_MESSAGE(DefaultBinaryCacheRequiresDirectory, (msg::path), "", "Environment variable VCPKG_DEFAULT_BINARY_CACHE must be a directory (was: {path})") -DECLARE_MESSAGE(DefaultBrowserLaunched, (msg::url), "", "Default browser launched to {url}.") +DECLARE_MESSAGE(DefaultFeatureCore, + (), + "The word \"core\" is an on-disk name that must not be localized.", + "the feature \"core\" turns off default features and thus can't be in the default features list") +DECLARE_MESSAGE( + DefaultFeatureDefault, + (), + "The word \"default\" is an on-disk name that must not be localized.", + "the feature \"default\" refers to the set of default features and thus can't be in the default features list") +DECLARE_MESSAGE(DefaultFeatureIdentifier, (), "", "the names of default features must be identifiers") DECLARE_MESSAGE(DefaultFlag, (msg::option), "", "Defaulting to --{option} being on.") DECLARE_MESSAGE(DefaultRegistryIsArtifact, (), "", "The default registry cannot be an artifact registry.") -DECLARE_MESSAGE(DefaultTriplet, - (msg::triplet), - "", - "Starting with the September 2023 release, the default triplet for vcpkg libraries will change " - "from x86-windows to the detected host triplet ({triplet}). To resolve this message, add --triplet " - "x86-windows to keep the same behavior.") +DECLARE_MESSAGE( + DefaultTripletChanged, + (msg::triplet), + "The parts naming --triplet are command line switches that should be unlocalized. The space after the last " + "'triplet' and the period is intended to avoid the period looking like it's part of the command line switch", + "In the September 2023 release, the default triplet for vcpkg libraries changed from x86-windows to " + "the detected host triplet ({triplet}). For the old behavior, add --triplet x86-windows . To " + "suppress this message, add --triplet {triplet} .") DECLARE_MESSAGE(DeleteVcpkgConfigFromManifest, (msg::path), "", "-- Or remove \"vcpkg-configuration\" from the manifest file {path}.") +DECLARE_MESSAGE( + DependencyFeatureCore, + (), + "The word \"core\" is an on-disk name that must not be localized. The \"default-features\" part is JSON " + "syntax that must be copied verbatim into the user's file.", + "the feature \"core\" cannot be in a dependency's feature list. To turn off default features, add " + "\"default-features\": false instead.") +DECLARE_MESSAGE( + DependencyFeatureDefault, + (), + "The word \"default\" is an on-disk name that must not be localized. The \"default-features\" part is JSON " + "syntax that must be copied verbatim into the user's file.", + "the feature \"default\" cannot be in a dependency's feature list. To turn on default features, add " + "\"default-features\": true instead.") +DECLARE_MESSAGE(DependencyGraphCalculation, (), "", "Dependency graph submission enabled.") +DECLARE_MESSAGE(DependencyGraphFailure, (), "", "Dependency graph submission failed.") +DECLARE_MESSAGE(DependencyGraphSuccess, (), "", "Dependency graph submission successful.") DECLARE_MESSAGE(DeprecatedPrefabDebugOption, (), "", "--prefab-debug is now deprecated.") DECLARE_MESSAGE(DetectCompilerHash, (msg::triplet), "", "Detecting compiler hash for triplet {triplet}...") DECLARE_MESSAGE(DocumentedFieldsSuggestUpdate, @@ -733,14 +1054,9 @@ DECLARE_MESSAGE(DownloadWinHttpError, (msg::system_api, msg::exit_code, msg::url), "", "{url}: {system_api} failed with exit code {exit_code}") -DECLARE_MESSAGE(DownloadingVcpkgCeBundle, (msg::version), "", "Downloading vcpkg-artifacts bundle {version}...") -DECLARE_MESSAGE(DownloadingVcpkgCeBundleLatest, - (), - "This message is normally displayed only in development.", - "Downloading latest vcpkg-artifacts bundle...") DECLARE_MESSAGE(DownloadingVcpkgStandaloneBundle, (msg::version), "", "Downloading standalone bundle {version}.") DECLARE_MESSAGE(DownloadingVcpkgStandaloneBundleLatest, (), "", "Downloading latest standalone bundle.") -DECLARE_MESSAGE(DownloadRootsDir, (msg::env_var), "", "Specify the downloads root directory.\n(default: {env_var})") +DECLARE_MESSAGE(DownloadRootsDir, (msg::env_var), "", "Downloads directory (default: {env_var})") DECLARE_MESSAGE(DuplicatedKeyInObj, (msg::value), "{value} is a json property/object", @@ -775,8 +1091,7 @@ DECLARE_MESSAGE(ErrorIndividualPackagesUnsupported, (), "", "In manifest mode, `vcpkg install` does not support individual package arguments.\nTo install " - "additional " - "packages, edit vcpkg.json and then run `vcpkg install` without any package arguments.") + "additional packages, edit vcpkg.json and then run `vcpkg install` without any package arguments.") DECLARE_MESSAGE(ErrorInvalidClassicModeOption, (msg::option), "", @@ -815,6 +1130,10 @@ DECLARE_MESSAGE(ErrorRequirePackagesList, (), "", "`vcpkg install` requires a list of packages to install in classic mode.") +DECLARE_MESSAGE(ErrorInvalidExtractOption, + (msg::option, msg::value), + "The keyword 'AUTO' should not be localized", + "--{option} must be set to a nonnegative integer or 'AUTO'.") DECLARE_MESSAGE(ErrorsFound, (), "", "Found the following errors:") DECLARE_MESSAGE(ErrorUnableToDetectCompilerInfo, (), @@ -837,7 +1156,7 @@ DECLARE_MESSAGE(ErrorWhileFetchingBaseline, "while fetching baseline `\"{value}\"` from repo {package_name}:") DECLARE_MESSAGE(ErrorWhileParsing, (msg::path), "", "Errors occurred while parsing {path}.") DECLARE_MESSAGE(ErrorWhileWriting, (msg::path), "", "Error occurred while writing {path}.") -DECLARE_MESSAGE(Example, (), "", "example:") +DECLARE_MESSAGE(ExamplesHeader, (), "Printed before a list of example command lines", "Examples:") DECLARE_MESSAGE(ExceededRecursionDepth, (), "", "Recursion depth exceeded.") DECLARE_MESSAGE(ExcludedPackage, (msg::spec), "", "Excluded {spec}") DECLARE_MESSAGE(ExcludedPackages, (), "", "The following packages are excluded:") @@ -886,6 +1205,7 @@ DECLARE_MESSAGE(ExportUnsupportedInManifest, "vcpkg export does not support manifest mode, in order to allow for future design considerations. " "You may use export in classic mode by running vcpkg outside of a manifest-based project.") DECLARE_MESSAGE(ExtendedDocumentationAtUrl, (msg::url), "", "Extended documentation available at '{url}'.") +DECLARE_MESSAGE(ExtractHelp, (), "", "Extracts an archive.") DECLARE_MESSAGE(ExtractingTool, (msg::tool_name), "", "Extracting {tool_name}...") DECLARE_MESSAGE(FailedPostBuildChecks, (msg::count, msg::path), @@ -917,11 +1237,7 @@ DECLARE_MESSAGE(FailedToDetermineArchitecture, DECLARE_MESSAGE(FailedToDetermineCurrentCommit, (), "", "Failed to determine the current commit:") DECLARE_MESSAGE(FailedToDownloadFromMirrorSet, (), "", "Failed to download from mirror set") DECLARE_MESSAGE(FailedToExtract, (msg::path), "", "Failed to extract \"{path}\":") -DECLARE_MESSAGE(FailedToFetchError, - (msg::error_msg, msg::package_name), - "", - "{error_msg}\nFailed to fetch {package_name}:") -DECLARE_MESSAGE(FailedToFindBaseline, (), "", "Failed to find baseline.json") +DECLARE_MESSAGE(FailedToFetchRepo, (msg::url), "", "Failed to fetch {url}.") DECLARE_MESSAGE(FailedToFindPortFeature, (msg::feature, msg::package_name), "", @@ -986,7 +1302,6 @@ DECLARE_MESSAGE(FailedVendorAuthentication, "", "One or more {vendor} credential providers failed to authenticate. See '{url}' for more details " "on how to provide credentials.") -DECLARE_MESSAGE(FeedbackAppreciated, (), "", "Thank you for your feedback!") DECLARE_MESSAGE(FilesContainAbsolutePath1, (), "This message is printed before a list of found absolute paths, followed by FilesContainAbsolutePath2, " @@ -998,6 +1313,10 @@ DECLARE_MESSAGE(FindHelp, "'artifact' and 'port' are what the user must literally type.", "Searches for the indicated artifact or port. With no parameter after 'artifact' or 'port', " "displays everything.") +DECLARE_MESSAGE(FindVersionArtifactsOnly, + (), + "'--version', 'vcpkg search', and 'vcpkg find port' are command lines that must not be localized", + "--version can't be used with vcpkg search or vcpkg find port") DECLARE_MESSAGE(FieldKindDidNotHaveExpectedValue, (msg::expected, msg::actual), "{expected} is a list of literal kinds the user must type, separated by commas, {actual} is what " @@ -1036,6 +1355,10 @@ DECLARE_MESSAGE(FormattedParseMessageExpression, (msg::value), "Example of {value} is 'x64 & windows'", "on expression: {value}") +DECLARE_MESSAGE(ForMoreHelp, + (), + "Printed before a suggestion for the user to run `vcpkg help `", + "For More Help") DECLARE_MESSAGE(GeneratedConfiguration, (msg::path), "", "Generated configuration {path}.") DECLARE_MESSAGE(GeneratedInstaller, (msg::path), "", "{path} installer generated.") DECLARE_MESSAGE(GenerateMsgErrorParsingFormatArgs, @@ -1069,12 +1392,12 @@ DECLARE_MESSAGE(GitFailedToFetch, "{value} is a git ref like 'origin/main'", "failed to fetch ref {value} from repository {url}") DECLARE_MESSAGE(GitFailedToInitializeLocalRepository, (msg::path), "", "failed to initialize local repository {path}") -DECLARE_MESSAGE(GitRegistryMustHaveBaseline, - (msg::package_name, msg::value), - "{value} is a commit sha", - "The git registry entry for \"{package_name}\" must have a \"baseline\" field that is a valid git " - "commit SHA (40 hexadecimal characters).\n" - "The current HEAD of that repo is \"{value}\".") +DECLARE_MESSAGE( + GitRegistryMustHaveBaseline, + (msg::url, msg::commit_sha), + "", + "The git registry \"{url}\" must have a \"baseline\" field that is a valid git commit SHA (40 hexadecimal " + "characters).\nTo use the current latest versions, set baseline to that repo's HEAD, \"{commit_sha}\".") DECLARE_MESSAGE(GitStatusOutputExpectedFileName, (), "", "expected a file name") DECLARE_MESSAGE(GitStatusOutputExpectedNewLine, (), "", "expected new line") DECLARE_MESSAGE(GitStatusOutputExpectedRenameOrNewline, (), "", "expected renamed file or new lines") @@ -1094,6 +1417,12 @@ DECLARE_MESSAGE(HashFileFailureToRead, (msg::path), "Printed after ErrorMessage and before the specific failing filesystem operation (like file not found)", "failed to read file \"{path}\" for hashing: ") +DECLARE_MESSAGE(HashPortManyFiles, + (msg::package_name, msg::count), + "", + "The {package_name} contains {count} files. Hashing these contents may take a long time when " + "determining the ABI hash for binary caching. Consider reducing the number of files. Common causes of " + "this are accidentally checking out source or build files into a port's directory.") DECLARE_MESSAGE(HeaderOnlyUsage, (msg::package_name), "'header' refers to C/C++ .h files", @@ -1257,26 +1586,20 @@ DECLARE_MESSAGE(HelpBuiltinBase, "transitively), then the version will resolve to the baseline of the top level manifest. Baselines " "of transitive dependencies are ignored.") DECLARE_MESSAGE(HelpCachingClear, (), "", "Removes all previous sources, including defaults.") -DECLARE_MESSAGE(HelpContactCommand, (), "", "Display contact information to send feedback.") -DECLARE_MESSAGE(HelpCreateCommand, (), "", "Create a new port.") -DECLARE_MESSAGE(HelpDependInfoCommand, (), "", "Display a list of dependencies for ports.") +DECLARE_MESSAGE(HelpContactCommand, (), "", "Displays contact information to send feedback") +DECLARE_MESSAGE(HelpCreateCommand, (), "", "Creates a new port") +DECLARE_MESSAGE(HelpDependInfoCommand, (), "", "Displays a list of dependencies for ports") DECLARE_MESSAGE(HelpEditCommand, (msg::env_var), - "", - "Open a port for editing (use the environment variable '{env_var}' to set an editor program, " - "defaults to 'code').") -DECLARE_MESSAGE(HelpEnvCommand, (), "", "Creates a clean shell environment for development or compiling.") -DECLARE_MESSAGE(HelpExampleCommand, - (), - "", - "For more help (including examples) see the accompanying README.md and docs folder.") + "\"code\" is the name of a program and should not be localized.", + "Edits a port, optionally with {env_var}, defaults to \"code\"") +DECLARE_MESSAGE(HelpEnvCommand, (), "", "Creates a clean shell environment for development or compiling") +DECLARE_MESSAGE(HelpExampleCommand, (), "", "For more help (including examples) see https://learn.microsoft.com/vcpkg") DECLARE_MESSAGE(HelpExampleManifest, (), "", "Example manifest:") DECLARE_MESSAGE(HelpExportCommand, (), "", "Exports a package.") -DECLARE_MESSAGE(HelpFormatManifestCommand, (), "", "Formats all vcpkg.json files. Run this before committing to vcpkg.") DECLARE_MESSAGE(HelpHashCommand, (), "", "Hash a file by specific algorithm, default SHA512.") -DECLARE_MESSAGE(HelpInitializeRegistryCommand, (), "", "Initializes a registry in the directory .") -DECLARE_MESSAGE(HelpInstallCommand, (), "", "Install a package.") -DECLARE_MESSAGE(HelpListCommand, (), "", "List installed packages.") +DECLARE_MESSAGE(HelpInstallCommand, (), "", "Installs a package") +DECLARE_MESSAGE(HelpListCommand, (), "", "Lists installed packages") DECLARE_MESSAGE(HelpManifestConstraints, (), "", @@ -1295,7 +1618,7 @@ DECLARE_MESSAGE( "allow a manifest to short-circuit dependency resolution and specify exactly the version to use. These can " "be used to handle version conflicts, such as with `version-string` dependencies. They will not be " "considered when transitively depended upon.") -DECLARE_MESSAGE(HelpOwnsCommand, (), "", "Search for files in installed packages.") +DECLARE_MESSAGE(HelpOwnsCommand, (), "", "Searches for the owner of a file in installed packages") DECLARE_MESSAGE( HelpPackagePublisher, (), @@ -1310,71 +1633,70 @@ DECLARE_MESSAGE( "", "Each version additionally has a \"port-version\" which is a nonnegative integer. When rendered as " "text, the port version (if nonzero) is added as a suffix to the primary version text separated by a " - "hash (#). Port-versions are sorted lexographically after the primary version text, for example:\n1.0.0 < " + "hash (#). Port-versions are sorted lexicographically after the primary version text, for example:\n1.0.0 < " "1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0") -DECLARE_MESSAGE(HelpRemoveCommand, (), "", "Uninstall a package.") -DECLARE_MESSAGE(HelpRemoveOutdatedCommand, (), "", "Uninstall all out-of-date packages.") -DECLARE_MESSAGE(HelpResponseFileCommand, (), "", "Specify a response file to provide additional parameters.") -DECLARE_MESSAGE(HelpSearchCommand, (), "", "Search for packages available to be built.") -DECLARE_MESSAGE(HelpTextOptFullDesc, (), "", "Do not truncate long text.") -DECLARE_MESSAGE(HelpTopicCommand, (), "", "Display help for a specific topic.") -DECLARE_MESSAGE(HelpTopicsCommand, (), "", "Display the list of help topics.") +DECLARE_MESSAGE(HelpRemoveCommand, (), "", "Uninstalls a package") +DECLARE_MESSAGE(HelpResponseFileCommand, + (), + "Describing what @response_file does on vcpkg's command line", + "Contains one argument per line expanded at that location") +DECLARE_MESSAGE(HelpSearchCommand, (), "", "Searches for packages available to be built") +DECLARE_MESSAGE(HelpTextOptFullDesc, (), "", "Does not truncate long text") +DECLARE_MESSAGE(HelpTopicCommand, (), "", "Displays specific help topic") +DECLARE_MESSAGE(HelpTopicsCommand, (), "", "Displays full list of help topics") DECLARE_MESSAGE(HelpTxtOptAllowUnsupportedPort, (), "", - "Instead of erroring on an unsupported port, continue with a warning.") + "Continues with a warning on unsupported ports, rather than failing") DECLARE_MESSAGE(HelpTxtOptCleanAfterBuild, (), "", - "Clean buildtrees, packages and downloads after building each package.") -DECLARE_MESSAGE(HelpTxtOptCleanBuildTreesAfterBuild, (), "", "Clean buildtrees after building each package.") -DECLARE_MESSAGE(HelpTxtOptCleanDownloadsAfterBuild, (), "", "Clean downloads after building each package.") -DECLARE_MESSAGE(HelpTxtOptCleanPkgAfterBuild, (), "", "Clean packages after building each package.") -DECLARE_MESSAGE(HelpTxtOptDryRun, (), "", "Do not actually build or install.") + "Cleans buildtrees, packages and downloads after building each package") +DECLARE_MESSAGE(HelpTxtOptCleanBuildTreesAfterBuild, (), "", "Cleans buildtrees after building each package") +DECLARE_MESSAGE(HelpTxtOptCleanDownloadsAfterBuild, (), "", "Cleans downloads after building each package") +DECLARE_MESSAGE(HelpTxtOptCleanPkgAfterBuild, (), "", "Cleans packages after building each package") +DECLARE_MESSAGE(HelpTxtOptDryRun, (), "", "Does not actually build or install") DECLARE_MESSAGE(HelpTxtOptEditable, (), "", - "Disable source re-extraction and binary caching for libraries on the command line (classic mode)") + "Disables source re-extraction and binary caching for libraries on the command line (classic mode)") DECLARE_MESSAGE(HelpTxtOptEnforcePortChecks, (), "", - "Fail install if a port has detected problems or attempts to use a deprecated feature") -DECLARE_MESSAGE(HelpTxtOptKeepGoing, (), "", "Continue installing packages on failure.") + "Fails install if a port has detected problems or attempts to use a deprecated feature") +DECLARE_MESSAGE(HelpTxtOptKeepGoing, (), "", "Continues installing packages on failure") DECLARE_MESSAGE(HelpTxtOptManifestFeature, (), "", - "Additional feature from the top-level manifest to install (manifest mode).") + "Additional features from the top-level manifest to install (manifest mode)") DECLARE_MESSAGE(HelpTxtOptManifestNoDefault, (), "", - "Don't install the default features from the top-level manifest (manifest mode).") -DECLARE_MESSAGE(HelpTxtOptNoDownloads, (), "", "Do not download new sources.") -DECLARE_MESSAGE(HelpTxtOptNoUsage, (), "", "Don't print CMake usage information after install.") -DECLARE_MESSAGE(HelpTxtOptOnlyBinCache, (), "", "Fail if cached binaries are not available.") -DECLARE_MESSAGE(HelpTxtOptOnlyDownloads, (), "", "Make a best-effort attempt to download sources without building.") -DECLARE_MESSAGE(HelpTxtOptRecurse, (), "", "Allow removal of packages as part of installation.") -DECLARE_MESSAGE(HelpTxtOptUseAria2, (), "", "Use aria2 to perform download tasks.") + "Does not install the default features from the top-level manifest (manifest mode)") +DECLARE_MESSAGE(HelpTxtOptNoDownloads, (), "", "Does not download new sources") +DECLARE_MESSAGE(HelpTxtOptNoUsage, (), "", "Does not print CMake usage information after install") +DECLARE_MESSAGE(HelpTxtOptOnlyBinCache, (), "", "Fails if cached binaries are not available") +DECLARE_MESSAGE(HelpTxtOptOnlyDownloads, (), "", "Makes best-effort attempt to download sources without building") +DECLARE_MESSAGE(HelpTxtOptRecurse, (), "", "Allows removal of packages as part of installation") +DECLARE_MESSAGE(HelpTxtOptUseAria2, (), "", "Uses aria2 to perform download tasks") DECLARE_MESSAGE(HelpTxtOptUseHeadVersion, (), "", - "Install the libraries on the command line using the latest upstream sources (classic mode).") -DECLARE_MESSAGE( - HelpTxtOptWritePkgConfig, - (), - "", - "Writes out a NuGet packages.config-formatted file for use with external binary caching.\nSee `vcpkg help " - "binarycaching` for more information.") -DECLARE_MESSAGE( - HelpUpdateBaseline, - (), - "", - "The best approach to keep your libraries up to date, the best approach is to update your baseline reference. " - "This will " - "ensure all packages, including transitive ones, are updated. However if you need to update a package " - "independently, you can use a \"version>=\" constraint.") -DECLARE_MESSAGE(HelpUpdateCommand, (), "", "List packages that can be updated.") -DECLARE_MESSAGE(HelpUpgradeCommand, (), "", "Rebuild all outdated packages.") -DECLARE_MESSAGE(HelpVersionCommand, (), "", "Display version information.") + "Installs the libraries on the command line using the latest upstream sources (classic mode)") +DECLARE_MESSAGE(HelpTxtOptWritePkgConfig, + (), + "'vcpkg help binarycaching' is a command line and should not be localized.", + "Writes a NuGet packages.config-formatted file for use with external binary caching. See `vcpkg help " + "binarycaching` for more information") +DECLARE_MESSAGE(HelpUpdateBaseline, + (), + "", + "The best approach to keep your libraries up to date is to update your baseline reference. This will " + "ensure all packages, including transitive ones, are updated. However if you need to update a package " + "independently, you can use a \"version>=\" constraint.") +DECLARE_MESSAGE(HelpUpdateCommand, (), "", "Lists packages that can be upgraded") +DECLARE_MESSAGE(HelpUpgradeCommand, (), "", "Rebuilds all outdated packages") +DECLARE_MESSAGE(HelpVersionCommand, (), "", "Displays version information") DECLARE_MESSAGE(HelpVersionDateScheme, (), "", "A date (2021-01-01.5)") DECLARE_MESSAGE(HelpVersionGreater, (), @@ -1407,7 +1729,7 @@ DECLARE_MESSAGE(IncrementedUtf8Decoder, (), "", "Incremented Utf8Decoder at the DECLARE_MESSAGE(InfoSetEnvVar, (msg::env_var), "In this context 'editor' means IDE", - "You can also set the environment variable '{env_var}' to your editor of choice.") + "You can also set {env_var} to your editor of choice.") DECLARE_MESSAGE(InitRegistryFailedNoRepo, (msg::path, msg::command_line), "", @@ -1438,7 +1760,7 @@ DECLARE_MESSAGE(InstallPackageInstruction, "'{value}' is the nuget id.", "With a project open, go to Tools->NuGet Package Manager->Package Manager Console and " "paste:\n Install-Package \"{value}\" -Source \"{path}\"") -DECLARE_MESSAGE(InstallRootDir, (), "", "(Experimental) Specify the install root directory.") +DECLARE_MESSAGE(InstallRootDir, (), "", "Installed directory (experimental)") DECLARE_MESSAGE(InstallSkippedUpToDateFile, (msg::path_source, msg::path_destination), "", @@ -1458,24 +1780,35 @@ DECLARE_MESSAGE(InstallWithSystemManagerPkg, DECLARE_MESSAGE(IntegrateBashHelp, (), "'bash' is a terminal program which should be unlocalized.", - "Enable bash tab-completion.") + "Enable bash tab-completion. Non-Windows only") DECLARE_MESSAGE(IntegrateFishHelp, (), "'fish' is a terminal program which should be unlocalized.", - "Enable fish tab-completion.") -DECLARE_MESSAGE(IntegrateInstallHelpLinux, (), "", "Make installed packages available user-wide.") + "Enable fish tab-completion. Non-Windows only") +DECLARE_MESSAGE(IntegrateInstallHelpLinux, (), "", "Makes installed packages available user-wide") DECLARE_MESSAGE(IntegrateInstallHelpWindows, (), "", - "Make installed packages available user-wide. Requires admin privileges on first use.") -DECLARE_MESSAGE(IntegratePowerShellHelp, (), "", "Enable PowerShell tab-completion.") -DECLARE_MESSAGE(IntegrateProjectHelp, (), "", "Generate a referencing NuGet package for individual VS project use.") -DECLARE_MESSAGE(IntegrateRemoveHelp, (), "", "Remove user-wide integration.") + "Makes installed packages available user-wide. Requires admin privileges on first use") +DECLARE_MESSAGE(IntegrateNonWindowsOnly, + (msg::command_line), + "", + "{command_line} is non-Windows-only and not supported on this system.") +DECLARE_MESSAGE(IntegratePowerShellHelp, (), "", "Enable PowerShell tab-completion. Windows-only") +DECLARE_MESSAGE(IntegrateProjectHelp, + (), + "", + "Generates a referencing NuGet package for individual Visual Studio project use. Windows-only") +DECLARE_MESSAGE(IntegrateRemoveHelp, (), "", "Removes user-wide integration") +DECLARE_MESSAGE(IntegrateWindowsOnly, + (msg::command_line), + "", + "{command_line} is Windows-only and not supported on this system.") DECLARE_MESSAGE(IntegrateZshHelp, (), "'zsh' is a terminal program which should be unlocalized.", - "Enable zsh tab-completion.") -DECLARE_MESSAGE(IntegrationFailed, (), "", "Integration was not applied.") + "Enable zsh tab-completion. Non-Windows only") +DECLARE_MESSAGE(IntegrationFailedVS2015, (), "", "Integration was not applied for Visual Studio 2015.") DECLARE_MESSAGE(InternalCICommand, (), "", @@ -1584,10 +1917,6 @@ DECLARE_MESSAGE(InvalidCommentStyle, "comments.") DECLARE_MESSAGE(InvalidCommitId, (msg::commit_sha), "", "Invalid commit id: {commit_sha}") DECLARE_MESSAGE(InvalidDefaultFeatureName, (), "", "'default' is a reserved feature name") -DECLARE_MESSAGE(InvalidDependency, - (), - "", - "dependencies must be lowercase alphanumeric+hyphens, and not one of the reserved names") DECLARE_MESSAGE(InvalidFeature, (), "", @@ -1611,7 +1940,7 @@ DECLARE_MESSAGE( "'{value}' is the linkage type vcpkg would did not understand. (Correct values would be static ofr dynamic)", "Invalid {system_name} linkage type: [{value}]") DECLARE_MESSAGE(InvalidLogicExpressionUnexpectedCharacter, (), "", "invalid logic expression, unexpected character") -DECLARE_MESSAGE(InvalidLogicExpressionUsePipe, (), "", "invalid logic expression, use '|' instead of 'or'") +DECLARE_MESSAGE(InvalidLogicExpressionUsePipe, (), "", "invalid logic expression, use '|' rather than 'or'") DECLARE_MESSAGE(InvalidNoVersions, (), "", "File contains no versions.") DECLARE_MESSAGE(InvalidOptionForRemove, (), @@ -1633,7 +1962,7 @@ DECLARE_MESSAGE(JsonFileMissingExtension, (msg::path), "", "the JSON file {path} must have a .json (all lowercase) extension") -DECLARE_MESSAGE(JsonSwitch, (), "", "(Experimental) Request JSON output.") +DECLARE_MESSAGE(JsonSwitch, (), "", "Prints JSON rather than plain text") DECLARE_MESSAGE(JsonValueNotArray, (), "", "json value is not an array") DECLARE_MESSAGE(JsonValueNotObject, (), "", "json value is not an object") DECLARE_MESSAGE(JsonValueNotString, (), "", "json value is not a string") @@ -1714,10 +2043,7 @@ DECLARE_MESSAGE(LinkageDynamicDebug, (), "", "Dynamic Debug (/MDd)") DECLARE_MESSAGE(LinkageDynamicRelease, (), "", "Dynamic Release (/MD)") DECLARE_MESSAGE(LinkageStaticDebug, (), "", "Static Debug (/MTd)") DECLARE_MESSAGE(LinkageStaticRelease, (), "", "Static Release (/MT)") -DECLARE_MESSAGE(ListHelp, - (), - "", - "The argument should be a substring to search for, or no argument to display all installed libraries.") +DECLARE_MESSAGE(ListHelp, (), "", "Lists installed libraries") DECLARE_MESSAGE(ListOfValidFieldsForControlFiles, (), "", @@ -1826,8 +2152,7 @@ DECLARE_MESSAGE(MultipleFeatures, DECLARE_MESSAGE(MutuallyExclusiveOption, (msg::value, msg::option), "{value} is a second {option} switch", - "--{value} can not be used with --{option}.") -DECLARE_MESSAGE(NavigateToNPS, (msg::url), "", "Please navigate to {url} in your preferred browser.") + "--{value} cannot be used with --{option}.") DECLARE_MESSAGE(NewConfigurationAlreadyExists, (msg::path), "", @@ -1845,7 +2170,6 @@ DECLARE_MESSAGE(NewSpecifyNameVersionOrApplication, "--application to indicate that the manifest is not intended to be used as a port.") DECLARE_MESSAGE(NewVersionCannotBeEmpty, (), "", "--version cannot be empty.") DECLARE_MESSAGE(NoArgumentsForOption, (msg::option), "", "The option --{option} does not accept an argument.") -DECLARE_MESSAGE(NoCachedPackages, (), "", "No packages are cached.") DECLARE_MESSAGE(NoError, (), "", "no error") DECLARE_MESSAGE(NoInstalledPackages, (), @@ -1890,7 +2214,6 @@ DECLARE_MESSAGE(NugetTimeoutExpectsSinglePositiveInteger, (), "", "unexpected arguments: binary config 'nugettimeout' expects a single positive integer argument") -DECLARE_MESSAGE(OptionalCommand, (), "", "optional command") DECLARE_MESSAGE(OptionMustBeInteger, (msg::option), "", "Value of --{option} must be an integer.") DECLARE_MESSAGE(OptionRequired, (msg::option), "", "--{option} option is required.") DECLARE_MESSAGE(OptionRequiresAValue, (msg::option), "", "the option '{option}' requires a value") @@ -1908,16 +2231,22 @@ DECLARE_MESSAGE(OptionRequiresOption, "--{value} requires --{option}") DECLARE_MESSAGE(Options, (), "Printed just before a list of options for a command", "Options") DECLARE_MESSAGE(OriginalBinParagraphHeader, (), "", "\nOriginal Binary Paragraph") +DECLARE_MESSAGE(OtherCommandsHeader, (), "", "Other") DECLARE_MESSAGE(OverlayPatchDir, (msg::path), "", "Overlay path \"{path}\" must exist and must be a directory.") -DECLARE_MESSAGE(OverlayTriplets, (msg::path), "", "Overlay triplets from {path} :") +DECLARE_MESSAGE(OverlayPortsDirectoriesHelp, (msg::env_var), "", "Directories of overlay ports (also: {env_var})") +DECLARE_MESSAGE(OverlayTripletDirectoriesHelp, (msg::env_var), "", "Directories of overlay triplets (also: {env_var})") +DECLARE_MESSAGE(OverlayTriplets, (msg::path), "", "Overlay Triplets from \"{path}\":") DECLARE_MESSAGE(OverwritingFile, (msg::path), "", "File {path} was already present and will be overwritten") DECLARE_MESSAGE(PackageAlreadyRemoved, (msg::spec), "", "unable to remove {spec}: already removed") -DECLARE_MESSAGE(PackageInfoHelp, (), "", "Display detailed information on packages.") +DECLARE_MESSAGE(PackageDiscoveryHeader, (), "", "Package Discovery") +DECLARE_MESSAGE(PackageManipulationHeader, (), "", "Package Manipulation") +DECLARE_MESSAGE(PackageInfoHelp, (), "", "Display detailed information on packages") DECLARE_MESSAGE(PackageFailedtWhileExtracting, (msg::value, msg::path), "'{value}' is either a tool name or a package name.", "'{value}' failed while extracting {path}.") -DECLARE_MESSAGE(PackageRootDir, (), "", "(Experimental) Specify the packages root directory.") +DECLARE_MESSAGE(PackageInstallationHeader, (), "", "Package Installation") +DECLARE_MESSAGE(PackageRootDir, (), "", "Packages directory (experimental)") DECLARE_MESSAGE(PackagesToInstall, (), "", "The following packages will be built and installed:") DECLARE_MESSAGE(PackagesToInstallDirectly, (), "", "The following packages will be directly installed:") DECLARE_MESSAGE(PackagesToModify, (), "", "Additional packages (*) will be modified to complete this operation.") @@ -1950,56 +2279,58 @@ DECLARE_MESSAGE(ParseControlErrorInfoWhileLoading, "Error messages are is printed after this.", "while loading {path}:") DECLARE_MESSAGE(ParseControlErrorInfoWrongTypeFields, (), "", "The following fields had the wrong types:") +DECLARE_MESSAGE( + ParseFeatureNameError, + (msg::package_name, msg::url), + "", + "\"{package_name}\" is not a valid feature name. " + "Feature names must be lowercase alphanumeric+hypens and not reserved (see {url} for more information).") DECLARE_MESSAGE(ParseIdentifierError, (msg::value, msg::url), "{value} is a lowercase identifier like 'boost'", "\"{value}\" is not a valid identifier. " - "Identifiers must be lowercase alphanumeric+hypens and not reserved (see {url} for more information)") -DECLARE_MESSAGE(ParsePackageNameError, - (msg::package_name, msg::url), - "", - "\"{package_name}\" is not a valid package name. " - "Package names must be lowercase alphanumeric+hypens and not reserved (see {url} for more information)") + "Identifiers must be lowercase alphanumeric+hypens and not reserved (see {url} for more information).") +DECLARE_MESSAGE( + ParsePackageNameError, + (msg::package_name, msg::url), + "", + "\"{package_name}\" is not a valid package name. " + "Package names must be lowercase alphanumeric+hypens and not reserved (see {url} for more information).") DECLARE_MESSAGE(ParsePackagePatternError, (msg::package_name, msg::url), "", "\"{package_name}\" is not a valid package pattern. " "Package patterns must use only one wildcard character (*) and it must be the last character in " - "the pattern (see {url} for more information)") + "the pattern (see {url} for more information).") DECLARE_MESSAGE(PathMustBeAbsolute, (msg::path), "", "Value of environment variable X_VCPKG_REGISTRIES_CACHE is not absolute: {path}") -DECLARE_MESSAGE( - PECoffHeaderTooShort, - (msg::path), - "Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format", - "While parsing Portable Executable {path}, size of COFF header too small to contain a valid PE header.") -DECLARE_MESSAGE( - PEConfigCrossesSectionBoundary, - (msg::path), - "Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format", - "While parsing Portable Executable {path}, image config directory crosses a secion boundary.") -DECLARE_MESSAGE( - PEImportCrossesSectionBoundary, - (msg::path), - "Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format", - "While parsing Portable Executable {path}, import table crosses a secion boundary.") -DECLARE_MESSAGE( - PEPlusTagInvalid, - (msg::path), - "Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format", - "While parsing Portable Executable {path}, optional header was neither PE32 nor PE32+.") +DECLARE_MESSAGE(PECoffHeaderTooShort, + (msg::path), + "Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format", + "While parsing Portable Executable {path}, size of COFF header too small to contain a valid PE header.") +DECLARE_MESSAGE(PEConfigCrossesSectionBoundary, + (msg::path), + "Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format", + "While parsing Portable Executable {path}, image config directory crosses a section boundary.") +DECLARE_MESSAGE(PEImportCrossesSectionBoundary, + (msg::path), + "Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format", + "While parsing Portable Executable {path}, import table crosses a section boundary.") +DECLARE_MESSAGE(PEPlusTagInvalid, + (msg::path), + "Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format", + "While parsing Portable Executable {path}, optional header was neither PE32 nor PE32+.") DECLARE_MESSAGE(PERvaNotFound, (msg::path, msg::value), "{value:#X} is the Relative Virtual Address sought. Portable executable is a term-of-art, see " - "https://learn.microsoft.com/en-us/windows/win32/debug/pe-format", + "https://learn.microsoft.com/windows/win32/debug/pe-format", "While parsing Portable Executable {path}, could not find RVA {value:#X}.") -DECLARE_MESSAGE( - PESignatureMismatch, - (msg::path), - "Portable Executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format", - "While parsing Portable Executable {path}, signature mismatch.") +DECLARE_MESSAGE(PESignatureMismatch, + (msg::path), + "Portable Executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format", + "While parsing Portable Executable {path}, signature mismatch.") DECLARE_MESSAGE(PerformingPostBuildValidation, (), "", "-- Performing post-build validation") DECLARE_MESSAGE(PortBugAllowRestrictedHeaders, (msg::env_var), @@ -2061,7 +2392,7 @@ DECLARE_MESSAGE( "{expected} is one of LinkageDynamicDebug/LinkageDynamicRelease/LinkageStaticDebug/LinkageStaticRelease. " "Immediately after this message is a file by file list with what linkages they contain. 'CRT' is an acronym " "meaning C Runtime. See also: " - "https://learn.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-170. This is " + "https://learn.microsoft.com/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-170. This is " "complicated because a binary can link with more than one CRT.\n" "Example fully formatted message:\n" "The following binaries should use the Dynamic Debug (/MDd) CRT.\n" @@ -2077,7 +2408,12 @@ DECLARE_MESSAGE(PortBugInvalidCrtLinkageEntry, (msg::path), "See explanation in PortBugInvalidCrtLinkage", "{path} links with:") - +DECLARE_MESSAGE(PortBugKernel32FromXbox, + (), + "", + "The selected triplet targets Xbox, but the following DLLs link with kernel32. These DLLs cannot be " + "loaded on Xbox, where kernel32 is not present. This is typically caused by linking with kernel32.lib " + "rather than a suitable umbrella library, such as onecore_apiset.lib or xgameplatform.lib.") DECLARE_MESSAGE( PortBugMergeLibCMakeDir, (msg::package_name), @@ -2141,10 +2477,11 @@ DECLARE_MESSAGE(PortBugRemoveEmptyDirs, "Only the 'empty directories left by the above renames' part should be translated", "file(REMOVE_RECURSE empty directories left by the above renames)") DECLARE_MESSAGE(PortBugRestrictedHeaderPaths, - (msg::env_var), - "A list of restricted headers is printed after this message, one per line.", + (), + "A list of restricted headers is printed after this message, one per line. ", "The following restricted headers can prevent the core C++ runtime and other packages from " - "compiling correctly. In exceptional circumstances, this policy can be disabled via {env_var}.") + "compiling correctly. In exceptional circumstances, this policy can be disabled by setting CMake " + "variable VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS in portfile.cmake.") DECLARE_MESSAGE(PortBugSetDllsWithoutExports, (), "'exports' means an entry in a DLL's export table. After this message, one file path per line is " @@ -2170,7 +2507,7 @@ DECLARE_MESSAGE(PortMissingManifest, "{package_name} has no vcpkg.json or CONTROL file in {path}") DECLARE_MESSAGE(PortsNoDiff, (), "", "There were no changes in the ports between the two commits.") DECLARE_MESSAGE(PortsRemoved, (msg::count), "", "The following {count} ports were removed:") -DECLARE_MESSAGE(PortsUpdated, (msg::count), "", "\nThe following {count} ports were updated:") +DECLARE_MESSAGE(PortsUpdated, (msg::count), "", "The following {count} ports were updated:") DECLARE_MESSAGE(PortSupportsField, (msg::supports_expression), "", "(supports: \"{supports_expression}\")") DECLARE_MESSAGE(PortVersionConflict, (), "", "The following packages differ from their port versions:") DECLARE_MESSAGE(PortVersionMultipleSpecification, @@ -2193,7 +2530,7 @@ DECLARE_MESSAGE(PushingVendorFailed, "", "Pushing {vendor} to \"{path}\" failed. Use --debug for more information.") DECLARE_MESSAGE(RegistryCreated, (msg::path), "", "Successfully created registry at {path}") -DECLARE_MESSAGE(RegeneratesArtifactRegistry, (), "", "Regenerates an artifact registry.") +DECLARE_MESSAGE(RegeneratesArtifactRegistry, (), "", "Regenerates an artifact registry") DECLARE_MESSAGE(RegistryValueWrongType, (msg::path), "", "The registry value {path} was an unexpected type.") DECLARE_MESSAGE(RemoveDependencies, (), @@ -2213,12 +2550,34 @@ DECLARE_MESSAGE(ResponseFileCode, "Explains to the user that they can use response files on the command line, 'response_file' must " "have no spaces and be a legal file name.", "@response_file") -DECLARE_MESSAGE(RestoredPackage, (msg::path), "", "Restored package from \"{path}\"") -DECLARE_MESSAGE( - RestoredPackagesFromVendor, - (msg::count, msg::elapsed, msg::value), - "{value} may be either a 'vendor' like 'Azure' or 'NuGet', or a file path like C:\\example or /usr/example", - "Restored {count} package(s) from {value} in {elapsed}. Use --debug to see more details.") +DECLARE_MESSAGE(RestoredPackagesFromAWS, + (msg::count, msg::elapsed), + "", + "Restored {count} package(s) from AWS in {elapsed}. Use --debug to see more details.") +DECLARE_MESSAGE(RestoredPackagesFromCOS, + (msg::count, msg::elapsed), + "", + "Restored {count} package(s) from COS in {elapsed}. Use --debug to see more details.") +DECLARE_MESSAGE(RestoredPackagesFromFiles, + (msg::count, msg::elapsed, msg::path), + "", + "Restored {count} package(s) from {path} in {elapsed}. Use --debug to see more details.") +DECLARE_MESSAGE(RestoredPackagesFromGCS, + (msg::count, msg::elapsed), + "", + "Restored {count} package(s) from GCS in {elapsed}. Use --debug to see more details.") +DECLARE_MESSAGE(RestoredPackagesFromGHA, + (msg::count, msg::elapsed), + "", + "Restored {count} package(s) from GitHub Actions Cache in {elapsed}. Use --debug to see more details.") +DECLARE_MESSAGE(RestoredPackagesFromHTTP, + (msg::count, msg::elapsed), + "", + "Restored {count} package(s) from HTTP servers in {elapsed}. Use --debug to see more details.") +DECLARE_MESSAGE(RestoredPackagesFromNuGet, + (msg::count, msg::elapsed), + "", + "Restored {count} package(s) from NuGet in {elapsed}. Use --debug to see more details.") DECLARE_MESSAGE(ResultsHeader, (), "Displayed before a list of installation results.", "RESULTS") DECLARE_MESSAGE(ScriptAssetCacheRequiresScript, (), @@ -2263,25 +2622,20 @@ DECLARE_MESSAGE(SpecifiedFeatureTurnedOff, (msg::command_name, msg::option), "", "'{command_name}' feature specifically turned off, but --{option} was specified.") -DECLARE_MESSAGE(SpecifyDirectoriesContaining, - (msg::env_var), - "", - "Specifiy directories containing triplets files.\n(also: '{env_var}')") -DECLARE_MESSAGE(SpecifyDirectoriesWhenSearching, - (msg::env_var), - "", - "Specify directories to be used when searching for ports.\n(also: '{env_var}')") DECLARE_MESSAGE(SpecifyHostArch, (msg::env_var), - "", - "Specify the host architecture triplet. See 'vcpkg help triplet'.\n(default: '{env_var}')") + "'vcpkg help triplet' is a command line that should not be localized", + "Host triplet. See 'vcpkg help triplet' (default: {env_var})") DECLARE_MESSAGE(SpecifyTargetArch, (msg::env_var), - "", - "Specify the target architecture triplet. See 'vcpkg help triplet'.\n(default: '{env_var}')") + "'vcpkg help triplet' is a command line that should not be localized", + "Target triplet. See 'vcpkg help triplet' (default: {env_var})") DECLARE_MESSAGE(StartCodeUnitInContinue, (), "", "found start code unit in continue position") DECLARE_MESSAGE(StoredBinaryCache, (msg::path), "", "Stored binary cache: \"{path}\"") -DECLARE_MESSAGE(StoredBinariesToDestinations, (msg::count), "", "Stored binaries in {count} destinations.") +DECLARE_MESSAGE(StoredBinariesToDestinations, + (msg::count, msg::elapsed), + "", + "Stored binaries in {count} destinations in {elapsed}.") DECLARE_MESSAGE(StoreOptionMissingSha, (), "", "--store option is invalid without a sha512") DECLARE_MESSAGE(SuccessfulyExported, (msg::package_name, msg::path), "", "Exported {package_name} to {path}") DECLARE_MESSAGE(SuggestGitPull, (), "", "The result may be outdated. Run `git pull` to get the latest results.") @@ -2299,6 +2653,7 @@ DECLARE_MESSAGE(SuggestUpdateVcpkg, "You may need to update the vcpkg binary; try running {command_line} to update.") DECLARE_MESSAGE(SupportedPort, (msg::package_name), "", "Port {package_name} is supported.") DECLARE_MESSAGE(SwitchUsedMultipleTimes, (msg::option), "", "the switch '{option}' was specified multiple times") +DECLARE_MESSAGE(SynopsisHeader, (), "Printed before a description of what a command does", "Synopsis:") DECLARE_MESSAGE(SystemApiErrorMessage, (msg::system_api, msg::exit_code, msg::error_msg), "", @@ -2326,6 +2681,7 @@ DECLARE_MESSAGE(ToUpdatePackages, "To update these packages and all dependencies, run\n{command_name} upgrade'") DECLARE_MESSAGE(TrailingCommaInArray, (), "", "Trailing comma in array") DECLARE_MESSAGE(TrailingCommaInObj, (), "", "Trailing comma in an object") +DECLARE_MESSAGE(TripletLabel, (), "", "Triplet:") DECLARE_MESSAGE(TripletFileNotFound, (msg::triplet), "", "Triplet file {triplet}.cmake not found") DECLARE_MESSAGE(TwoFeatureFlagsSpecified, (msg::value), @@ -2338,8 +2694,7 @@ DECLARE_MESSAGE(UndeterminedToolChainForTriplet, (msg::triplet, msg::system_name), "", "Unable to determine toolchain use for {triplet} with with CMAKE_SYSTEM_NAME {system_name}. Did " - "you mean to use " - "VCPKG_CHAINLOAD_TOOLCHAIN_FILE?") + "you mean to use VCPKG_CHAINLOAD_TOOLCHAIN_FILE?") DECLARE_MESSAGE(UnexpectedArgument, (msg::option), "Argument is literally what the user passed on the command line.", @@ -2523,11 +2878,12 @@ DECLARE_MESSAGE(UpdateBaselineUpdatedBaseline, (msg::url, msg::old_value, msg::new_value), "example of {old_value}, {new_value} is '5507daa796359fe8d45418e694328e878ac2b82f'", "updated registry '{url}': baseline '{old_value}' -> '{new_value}'") -DECLARE_MESSAGE(UpgradeInManifest, - (), - "", - "The upgrade command does not currently support manifest mode. Instead, modify your vcpkg.json and " - "run install.") +DECLARE_MESSAGE( + UpgradeInManifest, + (), + "'vcpkg x-update-baseline' and 'vcpkg install' are command lines and should not be localized.", + "Upgrade upgrades a classic mode installation and thus does not support manifest mode. Consider updating your " + "dependencies by updating your baseline to a current value with vcpkg x-update-baseline and running vcpkg install.") DECLARE_MESSAGE( UpgradeRunWithNoDryRun, (), @@ -2581,6 +2937,12 @@ DECLARE_MESSAGE( "vcpkg has crashed. Please create an issue at https://github.com/microsoft/vcpkg containing a brief summary of " "what you were trying to do and the following information.") DECLARE_MESSAGE(VcpkgInvalidCommand, (msg::command_name), "", "invalid command: {command_name}") +DECLARE_MESSAGE(VcpkgUsage, + (), + "This is describing a command line, everything should be localized except 'vcpkg'; symbols like <>s, " + "[]s, or --s should be preserved. @response_file should be localized to be consistent with the message " + "named 'ResponseFileCode'.", + "usage: vcpkg [--switches] [--options=values] [arguments] @response_file") DECLARE_MESSAGE(InvalidUri, (msg::value), "{value} is the URI we attempted to parse.", "unable to parse uri: {value}") DECLARE_MESSAGE(VcpkgInVsPrompt, (msg::value, msg::triplet), @@ -2592,7 +2954,7 @@ DECLARE_MESSAGE(VcpkgRegistriesCacheIsNotDirectory, "", "Value of environment variable X_VCPKG_REGISTRIES_CACHE is not a directory: {path}") DECLARE_MESSAGE(VcpkgRootRequired, (), "", "Setting VCPKG_ROOT is required for standalone bootstrap.") -DECLARE_MESSAGE(VcpkgRootsDir, (msg::env_var), "", "Specify the vcpkg root directory.\n(default: '{env_var}')") +DECLARE_MESSAGE(VcpkgRootsDir, (msg::env_var), "", "The vcpkg root directory (default: {env_var})") DECLARE_MESSAGE(VcpkgSendMetricsButDisabled, (), "", "passed --sendmetrics, but metrics are disabled.") DECLARE_MESSAGE(VcvarsRunFailed, (), "", "failed to run vcvarsall.bat to get a Visual Studio environment") DECLARE_MESSAGE(VcvarsRunFailedExitCode, @@ -2654,16 +3016,21 @@ DECLARE_MESSAGE(VersionGitEntryMissing, "A list of versions, 1 per line, are printed after this message.", "no version database entry for {package_name} at {version}.\nAvailable versions:") DECLARE_MESSAGE(VersionIncomparable1, - (msg::spec, msg::package_name, msg::expected, msg::actual), + (msg::spec, msg::constraint_origin, msg::expected, msg::actual), "{expected} and {actual} are versions like 1.0", - "version conflict on {spec}: {package_name} required {expected} but vcpkg could not compare it to " - "{actual}.\nThe two versions used incomparable schemes:") -DECLARE_MESSAGE(VersionIncomparable2, (msg::version, msg::new_scheme), "", "\"{version}\" was of scheme {new_scheme}") + "version conflict on {spec}: {constraint_origin} required {expected}, which cannot be compared with " + "the baseline version {actual}.") +DECLARE_MESSAGE(VersionIncomparableSchemeString, (), "", "Both versions have scheme string but different primary text.") +DECLARE_MESSAGE(VersionIncomparableSchemes, (), "", "The versions have incomparable schemes:") +DECLARE_MESSAGE(VersionIncomparable2, + (msg::version_spec, msg::new_scheme), + "", + "{version_spec} has scheme {new_scheme}") DECLARE_MESSAGE(VersionIncomparable3, (), "This precedes a JSON document describing the fix", - "This can be resolved by adding an explicit override to the preferred version, for example:") -DECLARE_MESSAGE(VersionIncomparable4, (), "", "See `vcpkg help versioning` for more information.") + "This can be resolved by adding an explicit override to the preferred version. For example:") +DECLARE_MESSAGE(VersionIncomparable4, (msg::url), "", "See `vcpkg help versioning` or {url} for more information.") DECLARE_MESSAGE(VersionInDeclarationDoesNotMatch, (msg::version), "", @@ -2688,23 +3055,17 @@ DECLARE_MESSAGE( "The names version, version-date, version-semver, and version-string are code and must not be localized", "expected a versioning field (one of version, version-date, version-semver, or version-string)") DECLARE_MESSAGE(VersionMissingRequiredFeature, - (msg::spec, msg::version, msg::feature), + (msg::version_spec, msg::feature, msg::constraint_origin), "", - "{spec}@{version} does not have required feature {feature}") + "{version_spec} does not have required feature {feature} needed by {constraint_origin}") DECLARE_MESSAGE(VersionNotFound, (msg::expected, msg::actual), "{expected} and {actual} are versions", "{expected} not available, only {actual} is available") -DECLARE_MESSAGE( - VersionNotFoundDuringDiscovery, - (msg::spec, msg::version), - "", - "version was not found during discovery: {spec}@{version}\nThis is an internal vcpkg error. Please open " - "an issue on https://github.com/Microsoft/vcpkg with detailed steps to reproduce the problem.") DECLARE_MESSAGE(VersionNotFoundInVersionsFile, (msg::version, msg::package_name), "", - "Version {version} was not found in versions file.\n" + "Version {version} was not found in versions file for {package_name}.\n" "Run:\n" "vcpkg x-add-version {package_name}\n" "to add the new port version.") @@ -2762,10 +3123,7 @@ DECLARE_MESSAGE(VersionSpecMismatch, "Failed to load port because versions are inconsistent. The file \"{path}\" contains the version " "{actual_version}, but the version database indicates that it should be {expected_version}.") DECLARE_MESSAGE(VersionTableHeader, (), "", "Version") -DECLARE_MESSAGE(VersionVerifiedOK, - (msg::package_name, msg::version, msg::commit_sha), - "", - "OK: {package_name}@{version} -> {commit_sha}") +DECLARE_MESSAGE(VersionVerifiedOK, (msg::version_spec, msg::commit_sha), "", "OK: {version_spec} -> {commit_sha}") DECLARE_MESSAGE(VSExaminedInstances, (), "", "The following Visual Studio instances were considered:") DECLARE_MESSAGE(VSExaminedPaths, (), "", "The following paths were examined for Visual Studio instances:") DECLARE_MESSAGE(VSNoInstances, (), "", "Could not locate a complete Visual Studio instance") diff --git a/include/vcpkg/base/message_sinks.h b/include/vcpkg/base/message_sinks.h index 8edadacb78..4d854364a0 100644 --- a/include/vcpkg/base/message_sinks.h +++ b/include/vcpkg/base/message_sinks.h @@ -2,7 +2,6 @@ #include -#include #include namespace vcpkg @@ -69,17 +68,6 @@ namespace vcpkg ~MessageSink() = default; }; - struct FileSink : MessageSink - { - Path m_log_file; - WriteFilePointer m_out_file; - - FileSink(Filesystem& fs, StringView log_file, Append append_to_file) - : m_log_file(log_file), m_out_file(fs.open_for_write(m_log_file, append_to_file, VCPKG_LINE_INFO)) - { - } - void print(Color c, StringView sv) override; - }; struct CombiningSink : MessageSink { MessageSink& m_first; diff --git a/include/vcpkg/base/messages.h b/include/vcpkg/base/messages.h index 8496c35d23..767784602b 100644 --- a/include/vcpkg/base/messages.h +++ b/include/vcpkg/base/messages.h @@ -84,21 +84,42 @@ namespace vcpkg static LocalizedString from_raw(std::basic_string&& s) noexcept; static LocalizedString from_raw(StringView s); - LocalizedString& append_raw(char c); - LocalizedString& append_raw(StringView s); - LocalizedString& append(const LocalizedString& s); + LocalizedString& append_raw(char c) &; + LocalizedString&& append_raw(char c) &&; + LocalizedString& append_raw(StringView s) &; + LocalizedString&& append_raw(StringView s) &&; + template().to_string(std::declval()))> + LocalizedString& append_raw(const T& s) & + { + s.to_string(m_data); + return *this; + } + template().to_string(std::declval()))> + LocalizedString&& append_raw(const T& s) && + { + return std::move(append_raw(s)); + } + LocalizedString& append(const LocalizedString& s) &; + LocalizedString&& append(const LocalizedString& s) &&; template - LocalizedString& append(VCPKG_DECL_MSG_ARGS) + LocalizedString& append(VCPKG_DECL_MSG_ARGS) & { msg::format_to(*this, VCPKG_EXPAND_MSG_ARGS); return *this; } - LocalizedString& append_indent(size_t indent = 1); + template + LocalizedString&& append(VCPKG_DECL_MSG_ARGS) && + { + return std::move(append(VCPKG_EXPAND_MSG_ARGS)); + } + LocalizedString& append_indent(size_t indent = 1) &; + LocalizedString&& append_indent(size_t indent = 1) &&; // 0 items - Does nothing // 1 item - .append_raw(' ').append(item) // 2+ items - foreach: .append_raw('\n').append_indent(indent).append(item) - LocalizedString& append_floating_list(int indent, View items); + LocalizedString& append_floating_list(int indent, View items) &; + LocalizedString&& append_floating_list(int indent, View items) &&; friend bool operator==(const LocalizedString& lhs, const LocalizedString& rhs) noexcept; friend bool operator!=(const LocalizedString& lhs, const LocalizedString& rhs) noexcept; friend bool operator<(const LocalizedString& lhs, const LocalizedString& rhs) noexcept; @@ -116,21 +137,39 @@ namespace vcpkg explicit LocalizedString(StringView data); explicit LocalizedString(std::string&& data) noexcept; }; + + LocalizedString format_environment_variable(StringView variable_name); } VCPKG_FORMAT_AS(vcpkg::LocalizedString, vcpkg::StringView); namespace vcpkg::msg { + namespace detail + { + template + LocalizedString format_impl(std::size_t index, FmtArgs&&... args) + { + // no forward to intentionally make an lvalue here + return detail::format_message_by_index(index, fmt::make_format_args(args...)); + } + template + void format_to_impl(LocalizedString& s, std::size_t index, FmtArgs&&... args) + { + // no forward to intentionally make an lvalue here + return detail::format_message_by_index_to(s, index, fmt::make_format_args(args...)); + } + } + template LocalizedString format(MessageT m, TagArg, Types>... args) { - return detail::format_message_by_index(m.index, fmt::make_format_args(args.arg()...)); + return detail::format_impl(m.index, args.arg()...); } template void format_to(LocalizedString& s, MessageT m, TagArg, Types>... args) { - return detail::format_message_by_index_to(s, m.index, fmt::make_format_args(args.arg()...)); + return detail::format_to_impl(s, m.index, args.arg()...); } inline void println() { msg::write_unlocalized_text_to_stdout(Color::none, "\n"); } @@ -228,14 +267,4 @@ namespace vcpkg #include #undef DECLARE_MESSAGE - - namespace msg - { - extern const decltype(vcpkg::msgErrorMessage) msgErrorMessage; - extern const decltype(vcpkg::msgWarningMessage) msgWarningMessage; - extern const decltype(vcpkg::msgNoteMessage) msgNoteMessage; - extern const decltype(vcpkg::msgSeeURL) msgSeeURL; - extern const decltype(vcpkg::msgInternalErrorMessage) msgInternalErrorMessage; - extern const decltype(vcpkg::msgInternalErrorMessageContact) msgInternalErrorMessageContact; - } } diff --git a/include/vcpkg/base/optional.h b/include/vcpkg/base/optional.h index 6e0c50d038..b18a97e602 100644 --- a/include/vcpkg/base/optional.h +++ b/include/vcpkg/base/optional.h @@ -74,8 +74,8 @@ namespace vcpkg } else if (!m_is_present && o.m_is_present) { - m_is_present = true; new (&m_t) T(o.m_t); + m_is_present = true; } else if (m_is_present && !o.m_is_present) { @@ -92,8 +92,8 @@ namespace vcpkg } else if (!m_is_present && o.m_is_present) { - m_is_present = true; new (&m_t) T(std::move(o.m_t)); + m_is_present = true; } else if (m_is_present && !o.m_is_present) { @@ -122,15 +122,9 @@ namespace vcpkg template T& emplace(Args&&... args) { - if (m_is_present) - { - m_t = T(static_cast(args)...); - } - else - { - new (&m_t) T(static_cast(args)...); - m_is_present = true; - } + if (m_is_present) destroy(); + new (&m_t) T(static_cast(args)...); + m_is_present = true; return m_t; } @@ -193,15 +187,9 @@ namespace vcpkg template T& emplace(Args&&... args) { - if (m_is_present) - { - m_t = T(static_cast(args)...); - } - else - { - new (&m_t) T(static_cast(args)...); - m_is_present = true; - } + if (m_is_present) destroy(); + new (&m_t) T(static_cast(args)...); + m_is_present = true; return m_t; } @@ -240,6 +228,8 @@ namespace vcpkg T* get() const { return m_t; } + void destroy() { m_t = nullptr; } + private: T* m_t; }; @@ -266,103 +256,94 @@ namespace vcpkg return *m_t; } + void destroy() { m_t = nullptr; } + private: const T* m_t; }; } template - struct Optional + struct Optional : private details::OptionalStorage { - private: - details::OptionalStorage m_base; - public: constexpr Optional() noexcept { } // Constructors are intentionally implicit constexpr Optional(NullOpt) { } - template, Optional>>> - constexpr Optional(U&& t) : m_base(std::forward(t)) + template, Optional> && + std::is_constructible_v, U>, + int> = 0> + constexpr Optional(U&& t) : details::OptionalStorage(static_cast(t)) { } + using details::OptionalStorage::emplace; + using details::OptionalStorage::has_value; + using details::OptionalStorage::get; + T&& value_or_exit(const LineInfo& line_info) && { - Checks::check_exit(line_info, this->m_base.has_value(), "Value was null"); - return std::move(this->m_base.value()); + Checks::check_exit(line_info, this->has_value(), "Value was null"); + return std::move(this->value()); } T& value_or_exit(const LineInfo& line_info) & { - Checks::check_exit(line_info, this->m_base.has_value(), "Value was null"); - return this->m_base.value(); + Checks::check_exit(line_info, this->has_value(), "Value was null"); + return this->value(); } const T& value_or_exit(const LineInfo& line_info) const& { - Checks::check_exit(line_info, this->m_base.has_value(), "Value was null"); - return this->m_base.value(); - } - - constexpr explicit operator bool() const { return this->m_base.has_value(); } - - template - T& emplace(Args&&... args) - { - return this->m_base.emplace(static_cast(args)...); + Checks::check_exit(line_info, this->has_value(), "Value was null"); + return this->value(); } - constexpr bool has_value() const { return this->m_base.has_value(); } + constexpr explicit operator bool() const { return this->has_value(); } template T value_or(U&& default_value) const& { - return this->m_base.has_value() ? this->m_base.value() : static_cast(std::forward(default_value)); + return this->has_value() ? this->value() : static_cast(std::forward(default_value)); } T value_or(T&& default_value) const& { - return this->m_base.has_value() ? this->m_base.value() : static_cast(default_value); + return this->has_value() ? this->value() : static_cast(default_value); } template T value_or(U&& default_value) && { - return this->m_base.has_value() ? std::move(this->m_base.value()) - : static_cast(std::forward(default_value)); + return this->has_value() ? std::move(this->value()) : static_cast(std::forward(default_value)); } T value_or(T&& default_value) && { - return this->m_base.has_value() ? std::move(this->m_base.value()) : static_cast(default_value); + return this->has_value() ? std::move(this->value()) : static_cast(default_value); } - // this allows us to error out when `.get()` would return a pointer to a temporary - decltype(auto) get() const& { return this->m_base.get(); } - decltype(auto) get() & { return this->m_base.get(); } - decltype(auto) get() const&& { return std::move(this->m_base).get(); } - decltype(auto) get() && { return std::move(this->m_base).get(); } - template using map_t = decltype(std::declval()(std::declval())); - template> - Optional map(F f) const& + template + Optional> map(F f) const& { - if (this->m_base.has_value()) + if (this->has_value()) { - return f(this->m_base.value()); + return f(this->value()); } return nullopt; } - template> - U then(F f) const& + template + map_t then(F f) const& { - if (this->m_base.has_value()) + if (this->has_value()) { - return f(this->m_base.value()); + return f(this->value()); } return nullopt; } @@ -370,47 +351,47 @@ namespace vcpkg template using move_map_t = decltype(std::declval()(std::declval())); - template> - Optional map(F f) && + template + Optional> map(F f) && { - if (this->m_base.has_value()) + if (this->has_value()) { - return f(std::move(this->m_base.value())); + return f(std::move(this->value())); } return nullopt; } - template> - U then(F f) && + template + move_map_t then(F f) && { - if (this->m_base.has_value()) + if (this->has_value()) { - return f(std::move(this->m_base.value())); + return f(std::move(this->value())); } return nullopt; } void clear() { - if (this->m_base.has_value()) + if (this->has_value()) { - this->m_base.destroy(); + this->destroy(); } } friend bool operator==(const Optional& lhs, const Optional& rhs) { - if (lhs.m_base.has_value()) + if (lhs.has_value()) { - if (rhs.m_base.has_value()) + if (rhs.has_value()) { - return lhs.m_base.value() == rhs.m_base.value(); + return lhs.value() == rhs.value(); } return false; } - return !rhs.m_base.has_value(); + return !rhs.has_value(); } friend bool operator!=(const Optional& lhs, const Optional& rhs) noexcept { return !(lhs == rhs); } }; diff --git a/include/vcpkg/base/parallel-algorithms.h b/include/vcpkg/base/parallel-algorithms.h new file mode 100644 index 0000000000..a7215ad3a1 --- /dev/null +++ b/include/vcpkg/base/parallel-algorithms.h @@ -0,0 +1,85 @@ +#pragma once + +#include + +#include +#include +#include + +namespace vcpkg +{ + template + inline void execute_in_parallel(size_t work_count, F&& work) noexcept + { + const size_t thread_count = static_cast(get_concurrency()); + const size_t num_threads = std::max(static_cast(1), std::min(thread_count, work_count)); + + std::vector> workers; + workers.reserve(num_threads - 1); + + for (size_t i = 0; i < num_threads - 1; ++i) + { + workers.emplace_back(std::async(std::launch::async | std::launch::deferred, [&work]() { work(); })); + } + work(); + + for (auto&& w : workers) + { + w.get(); + } + } + + template + void parallel_for_each_n(RanIt begin, size_t work_count, F cb) noexcept + { + if (work_count == 0) + { + return; + } + if (work_count == 1) + { + cb(*begin); + return; + } + + std::atomic_size_t next{0}; + + execute_in_parallel(work_count, [&]() { + size_t i = 0; + while (i < work_count) + { + if (next.compare_exchange_weak(i, i + 1, std::memory_order_relaxed)) + { + cb(*(begin + i)); + } + } + }); + } + + template + void parallel_transform(RanItSource begin, size_t work_count, RanItTarget out_begin, F&& cb) noexcept + { + if (work_count == 0) + { + return; + } + if (work_count == 1) + { + *out_begin = cb(*begin); + return; + } + + std::atomic_size_t next{0}; + + execute_in_parallel(work_count, [&]() { + size_t i = 0; + while (i < work_count) + { + if (next.compare_exchange_weak(i, i + 1, std::memory_order_relaxed)) + { + *(out_begin + i) = cb(*(begin + i)); + } + } + }); + } +} diff --git a/include/vcpkg/base/parse.h b/include/vcpkg/base/parse.h index d4c57f1fab..bbdd7097f3 100644 --- a/include/vcpkg/base/parse.h +++ b/include/vcpkg/base/parse.h @@ -79,6 +79,7 @@ namespace vcpkg static constexpr bool is_whitespace(char32_t ch) { return ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n'; } static constexpr bool is_lower_alpha(char32_t ch) { return ch >= 'a' && ch <= 'z'; } + static constexpr bool is_lower_digit(char ch) { return is_lower_alpha(ch) || is_ascii_digit(ch); } static constexpr bool is_upper_alpha(char32_t ch) { return ch >= 'A' && ch <= 'Z'; } static constexpr bool is_icase_alpha(char32_t ch) { return is_lower_alpha(ch) || is_upper_alpha(ch); } static constexpr bool is_ascii_digit(char32_t ch) { return ch >= '0' && ch <= '9'; } diff --git a/include/vcpkg/base/path.h b/include/vcpkg/base/path.h new file mode 100644 index 0000000000..1552b2afb7 --- /dev/null +++ b/include/vcpkg/base/path.h @@ -0,0 +1,63 @@ +#pragma once + +#include + +#include + +namespace vcpkg +{ + struct Path + { + Path(); + Path(const Path&); + Path(Path&&); + Path& operator=(const Path&); + Path& operator=(Path&&); + + Path(const StringView sv); + Path(const std::string& s); + Path(std::string&& s); + Path(const char* s); + Path(const char* first, size_t size); + + const std::string& native() const& noexcept; + std::string&& native() && noexcept; + operator StringView() const noexcept; + + const char* c_str() const noexcept; + + std::string generic_u8string() const; + + bool empty() const noexcept; + + Path operator/(StringView sv) const&; + Path operator/(StringView sv) &&; + Path operator+(StringView sv) const&; + Path operator+(StringView sv) &&; + + Path& operator/=(StringView sv); + Path& operator+=(StringView sv); + + void replace_filename(StringView sv); + void remove_filename(); + void make_preferred(); + void clear(); + Path lexically_normal() const; + + // Sets *this to parent_path, returns whether anything was removed + bool make_parent_path(); + + StringView parent_path() const; + StringView filename() const; + StringView extension() const; + StringView stem() const; + + bool is_absolute() const; + bool is_relative() const; + + friend const char* to_printf_arg(const Path& p) noexcept; + + private: + std::string m_str; + }; +} \ No newline at end of file diff --git a/include/vcpkg/base/strings.h b/include/vcpkg/base/strings.h index 85437509ab..6e7177f8fd 100644 --- a/include/vcpkg/base/strings.h +++ b/include/vcpkg/base/strings.h @@ -20,71 +20,59 @@ namespace vcpkg::Strings::details void append_internal(std::string& into, const char* v); void append_internal(std::string& into, const std::string& s); void append_internal(std::string& into, StringView s); - void append_internal(std::string& into, LineInfo ln); - template().to_string(std::declval()))> void append_internal(std::string& into, const T& t) { t.to_string(into); } - - // first looks up to_string on `T` using ADL; then, if that isn't found, - // uses the above definition which returns t.to_string() template(), std::declval()))> void append_internal(std::string& into, const T& t) { to_string(into, t); } + + static constexpr struct IdentityTransformer + { + template + T&& operator()(T&& t) const noexcept + { + return static_cast(t); + } + } identity_transformer; } namespace vcpkg::Strings { - constexpr struct - { - char operator()(char c) const noexcept { return (c < 'A' || c > 'Z') ? c : c - 'A' + 'a'; } - } tolower_char; - - constexpr struct - { - bool operator()(char a, char b) const noexcept { return tolower_char(a) == tolower_char(b); } - } icase_eq; - - template - std::string& append(std::string& into, const Arg& a) + template + std::string& append(std::string& into, const Args&... args) { - details::append_internal(into, a); + (void)((details::append_internal(into, args), 0) || ... || 0); return into; } - template - std::string& append(std::string& into, const Arg& a, const Args&... args) - { - append(into, a); - return append(into, args...); - } template [[nodiscard]] std::string concat(const Args&... args) { - std::string ret; - append(ret, args...); - return ret; + std::string into; + (void)((details::append_internal(into, args), 0) || ... || 0); + return into; } template - [[nodiscard]] std::string concat(std::string&& first, const Args&... args) + [[nodiscard]] std::string concat(std::string&& into, const Args&... args) { - append(first, args...); - return std::move(first); + (void)((details::append_internal(into, args), 0) || ... || 0); + return std::move(into); } template - std::string concat_or_view(const Args&... args) + [[nodiscard]] std::string concat_or_view(Args&&... args) { - return Strings::concat(args...); + return Strings::concat(static_cast(args)...); } template>> - StringView concat_or_view(const T& v) + [[nodiscard]] StringView concat_or_view(const T& v) { return v; } @@ -98,17 +86,14 @@ namespace vcpkg::Strings std::string to_utf8(const std::wstring& ws); #endif - std::string escape_string(std::string&& s, char char_to_escape, char escape_char); - const char* case_insensitive_ascii_search(StringView s, StringView pattern); bool case_insensitive_ascii_contains(StringView s, StringView pattern); bool case_insensitive_ascii_equals(StringView left, StringView right); - void ascii_to_lowercase(char* first, char* last); - std::string ascii_to_lowercase(const std::string& s); - std::string ascii_to_lowercase(std::string&& s); - - std::string ascii_to_uppercase(std::string&& s); + void inplace_ascii_to_lowercase(char* first, char* last); + void inplace_ascii_to_lowercase(std::string& s); + [[nodiscard]] std::string ascii_to_lowercase(StringView s); + [[nodiscard]] std::string ascii_to_uppercase(StringView s); bool case_insensitive_ascii_starts_with(StringView s, StringView pattern); bool case_insensitive_ascii_ends_with(StringView s, StringView pattern); @@ -116,48 +101,43 @@ namespace vcpkg::Strings bool starts_with(StringView s, StringView pattern); template - std::string join(StringLiteral delimiter, InputIterator begin, InputIterator end, Transformer transformer) + [[nodiscard]] std::string join(StringLiteral delimiter, + InputIterator first, + InputIterator last, + Transformer transformer) { - if (begin == end) - { - return std::string(); - } - std::string output; - append(output, transformer(*begin)); - for (auto it = std::next(begin); it != end; ++it) + if (first != last) { - output.append(delimiter.data(), delimiter.size()); - append(output, transformer(*it)); + Strings::append(output, transformer(*first)); + for (++first; first != last; ++first) + { + output.append(delimiter.data(), delimiter.size()); + Strings::append(output, transformer(*first)); + } } return output; } template - std::string join(StringLiteral delimiter, const Container& v, Transformer transformer) + [[nodiscard]] std::string join(StringLiteral delimiter, const Container& v, Transformer transformer) { - const auto begin = std::begin(v); - const auto end = std::end(v); - - return join(delimiter, begin, end, transformer); + return join(delimiter, std::begin(v), std::end(v), transformer); } template - std::string join(StringLiteral delimiter, InputIterator begin, InputIterator end) + [[nodiscard]] std::string join(StringLiteral delimiter, InputIterator first, InputIterator last) { - using Element = decltype(*begin); - return join(delimiter, begin, end, [](const Element& x) -> const Element& { return x; }); + return join(delimiter, first, last, details::identity_transformer); } template - std::string join(StringLiteral delimiter, const Container& v) + [[nodiscard]] std::string join(StringLiteral delimiter, const Container& v) { - using Element = decltype(*std::begin(v)); - return join(delimiter, v, [](const Element& x) -> const Element& { return x; }); + return join(delimiter, std::begin(v), std::end(v), details::identity_transformer); } - [[nodiscard]] std::string replace_all(const char* s, StringView search, StringView rep); [[nodiscard]] std::string replace_all(StringView s, StringView search, StringView rep); [[nodiscard]] std::string replace_all(std::string&& s, StringView search, StringView rep); @@ -165,23 +145,29 @@ namespace vcpkg::Strings void inplace_replace_all(std::string& s, char search, char rep) noexcept; - std::string trim(std::string&& s); + void inplace_trim(std::string& s); - StringView trim(StringView sv); + [[nodiscard]] StringView trim(StringView sv); - void trim_all_and_remove_whitespace_strings(std::vector* strings); + void inplace_trim_all_and_remove_whitespace_strings(std::vector& strings); - std::vector split(StringView s, const char delimiter); + [[nodiscard]] std::vector split(StringView s, const char delimiter); - std::vector split_paths(StringView s); + [[nodiscard]] std::vector split_keep_empty(StringView s, const char delimiter); + + [[nodiscard]] std::vector split_paths(StringView s); const char* find_first_of(StringView searched, StringView candidates); - std::vector find_all_enclosed(StringView input, StringView left_delim, StringView right_delim); + [[nodiscard]] 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); + [[nodiscard]] StringView find_exactly_one_enclosed(StringView input, StringView left_tag, StringView right_tag); - Optional find_at_most_one_enclosed(StringView input, StringView left_tag, StringView right_tag); + [[nodiscard]] Optional find_at_most_one_enclosed(StringView input, + StringView left_tag, + StringView right_tag); bool contains_any_ignoring_c_comments(const std::string& source, View to_find); @@ -189,10 +175,10 @@ namespace vcpkg::Strings bool contains_any(StringView source, View to_find); - bool equals(StringView a, StringView b); + [[nodiscard]] bool equals(StringView a, StringView b); template - std::string serialize(const T& t) + [[nodiscard]] std::string serialize(const T& t) { std::string ret; serialize(t, ret); @@ -224,10 +210,10 @@ namespace vcpkg::Strings bool contains(StringView haystack, char needle); // base 32 encoding, following IETF RFC 4648 - std::string b32_encode(std::uint64_t x) noexcept; + [[nodiscard]] std::string b32_encode(std::uint64_t x) noexcept; // percent encoding, following IETF RFC 3986 - std::string percent_encode(StringView sv) noexcept; + [[nodiscard]] std::string percent_encode(StringView sv) noexcept; // Implements https://en.wikipedia.org/wiki/Levenshtein_distance with a "give-up" clause for large strings // Guarantees 0 for equal strings and nonzero for inequal strings. @@ -270,8 +256,11 @@ namespace vcpkg::Strings template void on_end(Fn cb) { - cb(StringView{previous_partial_line}); - previous_partial_line.clear(); + if (!previous_partial_line.empty()) + { + cb(StringView{previous_partial_line}); + previous_partial_line.clear(); + } last_was_cr = false; } diff --git a/include/vcpkg/base/stringview.h b/include/vcpkg/base/stringview.h index 7d900a380a..5c6f53ad7f 100644 --- a/include/vcpkg/base/stringview.h +++ b/include/vcpkg/base/stringview.h @@ -24,8 +24,8 @@ namespace vcpkg constexpr const char* begin() const noexcept { return m_ptr; } constexpr const char* end() const noexcept { return m_ptr + m_size; } - const char& front() const noexcept { return *m_ptr; } - const char& back() const noexcept { return m_ptr[m_size - 1]; } + constexpr const char& front() const noexcept { return *m_ptr; } + constexpr const char& back() const noexcept { return m_ptr[m_size - 1]; } std::reverse_iterator rbegin() const noexcept { return std::make_reverse_iterator(end()); } std::reverse_iterator rend() const noexcept { return std::make_reverse_iterator(begin()); } @@ -41,7 +41,20 @@ namespace vcpkg void to_string(std::string& out) const; explicit operator std::string() const { return to_string(); } - StringView substr(size_t pos, size_t count = std::numeric_limits::max()) const noexcept; + constexpr StringView substr(size_t pos, size_t count = std::numeric_limits::max()) const noexcept + { + if (pos > m_size) + { + return StringView(); + } + + if (count > m_size - pos) + { + return StringView(m_ptr + pos, m_size - pos); + } + + return StringView(m_ptr + pos, count); + } constexpr char operator[](size_t pos) const noexcept { return m_ptr[pos]; } friend std::string operator+(std::string&& l, const StringView& r); @@ -73,7 +86,15 @@ namespace vcpkg // Note that only the 1 parameter version of substr is provided to preserve null termination // (The name from the base class is intentionally hidden) - ZStringView substr(size_t pos) const noexcept; + constexpr ZStringView substr(size_t pos) const noexcept + { + if (pos < size()) + { + return ZStringView{data() + pos, size() - pos}; + } + + return ZStringView{}; + } }; struct StringLiteral : ZStringView diff --git a/include/vcpkg/base/system-headers.h b/include/vcpkg/base/system-headers.h index e68c61f9b1..78d4a47381 100644 --- a/include/vcpkg/base/system-headers.h +++ b/include/vcpkg/base/system-headers.h @@ -21,17 +21,16 @@ #if __APPLE__ extern "C" { -#endif +#endif // __APPLE__ #include #if __APPLE__ } -#endif - -#endif +#endif // __APPLE__ #include // glibc defines major and minor in sys/types.h, and should not #undef major #undef minor +#endif // ^^^ Unix diff --git a/include/vcpkg/base/system.h b/include/vcpkg/base/system.h index 00d4c22bca..8d90ff7fd4 100644 --- a/include/vcpkg/base/system.h +++ b/include/vcpkg/base/system.h @@ -1,13 +1,16 @@ #pragma once +#include #include #include -#include #include #include #include +#include +#include + namespace vcpkg { Optional get_environment_variable(ZStringView varname) noexcept; diff --git a/include/vcpkg/base/system.process.h b/include/vcpkg/base/system.process.h index 0ed5b825ca..7b287734e3 100644 --- a/include/vcpkg/base/system.process.h +++ b/include/vcpkg/base/system.process.h @@ -1,9 +1,11 @@ #pragma once +#include #include #include -#include +#include +#include #include #include @@ -132,7 +134,8 @@ namespace vcpkg const WorkingDirectory& wd = default_working_directory, const Environment& env = default_environment, Encoding encoding = Encoding::Utf8, - EchoInDebug echo_in_debug = EchoInDebug::Hide); + EchoInDebug echo_in_debug = EchoInDebug::Hide, + StringView stdin_content = {}); std::vector> cmd_execute_and_capture_output_parallel( View cmd_lines, @@ -140,16 +143,18 @@ namespace vcpkg const Environment& env = default_environment); ExpectedL cmd_execute_and_stream_lines(const Command& cmd_line, - std::function per_line_cb, + const std::function& per_line_cb, const WorkingDirectory& wd = default_working_directory, const Environment& env = default_environment, - Encoding encoding = Encoding::Utf8); + Encoding encoding = Encoding::Utf8, + StringView stdin_content = {}); ExpectedL cmd_execute_and_stream_data(const Command& cmd_line, - std::function data_cb, + const std::function& data_cb, const WorkingDirectory& wd = default_working_directory, const Environment& env = default_environment, - Encoding encoding = Encoding::Utf8); + Encoding encoding = Encoding::Utf8, + StringView stdin_content = {}); uint64_t get_subproccess_stats(); @@ -160,6 +165,15 @@ namespace vcpkg void exit_interactive_subprocess(); #endif + struct ProcessStat + { + int ppid; + std::string executable_name; + }; + + Optional try_parse_process_stat_file(const FileContents& contents); + void get_parent_process_list(std::vector& ret); + bool succeeded(const ExpectedL& maybe_exit) noexcept; // If exit code is 0, returns a 'success' ExpectedL. diff --git a/include/vcpkg/base/unicode.h b/include/vcpkg/base/unicode.h index e452fd8687..75b163559a 100644 --- a/include/vcpkg/base/unicode.h +++ b/include/vcpkg/base/unicode.h @@ -29,8 +29,6 @@ namespace vcpkg::Unicode UnexpectedEof = 6, }; - const std::error_category& utf8_category() noexcept; - Utf8CodeUnitKind utf8_code_unit_kind(unsigned char code_unit) noexcept; constexpr int utf8_code_unit_count(Utf8CodeUnitKind kind) noexcept { return static_cast(kind); } @@ -104,11 +102,6 @@ namespace vcpkg::Unicode char32_t utf16_surrogates_to_code_point(char32_t leading, char32_t trailing); - inline std::error_code make_error_code(utf8_errc err) noexcept - { - return std::error_code(static_cast(err), utf8_category()); - } - /* There are two ways to parse utf-8: we could allow unpaired surrogates (as in [wtf-8]) -- this is important for representing things like file paths on Windows. We could also require strict utf-8, as in the JSON @@ -189,11 +182,3 @@ namespace vcpkg::Unicode constexpr bool operator!=(const Utf8Decoder& d, Utf8Decoder::sentinel) { return !d.is_eof(); } constexpr bool operator!=(Utf8Decoder::sentinel s, const Utf8Decoder& d) { return d != s; } } - -namespace std -{ - template<> - struct is_error_code_enum : std::true_type - { - }; -} diff --git a/include/vcpkg/base/util.h b/include/vcpkg/base/util.h index 34505b0a32..fcffb9aa6b 100644 --- a/include/vcpkg/base/util.h +++ b/include/vcpkg/base/util.h @@ -14,12 +14,11 @@ namespace vcpkg::Util { template - using ElementT = - std::remove_reference_t::iterator>())>; + using ElementT = std::decay_t().begin())>; namespace Vectors { - template> + template void append(std::vector* augend, const Container& addend) { augend->insert(augend->end(), addend.begin(), addend.end()); @@ -97,6 +96,12 @@ namespace vcpkg::Util namespace Maps { + template + bool contains(const Container& container, Key&& item) + { + return container.find(static_cast(item)) != container.end(); + } + template void transform_values(const std::unordered_map& container, std::unordered_map& output, Func func) { @@ -107,10 +112,63 @@ namespace vcpkg::Util } } - template> - std::vector filter(const Range& xs, Pred&& f) + template + typename Map::mapped_type copy_or_default(const Map& map, Key&& key) + { + const auto it = map.find(static_cast(key)); + if (it == map.end()) + { + return typename Map::mapped_type{}; + } + + return it->second; + } + + template + const typename Map::mapped_type& value_or_default(const Map& map, + Key&& key, + const typename Map::mapped_type& default_value) { - std::vector ret; + const auto it = map.find(static_cast(key)); + if (it == map.end()) + { + return default_value; + } + + return it->second; + } + + template + void value_or_default(const Map& map, Key&& key, typename Map::mapped_type&& default_value) = delete; + + template + Optional lookup_value(const Map& map, Key&& key) + { + const auto it = map.find(static_cast(key)); + if (it == map.end()) + { + return nullopt; + } + + return it->second; + } + + template + Optional lookup_value_copy(const Map& map, Key&& key) + { + const auto it = map.find(static_cast(key)); + if (it == map.end()) + { + return nullopt; + } + + return it->second; + } + + template + std::vector> filter(const Range& xs, Pred f) + { + std::vector> ret; for (auto&& x : xs) { @@ -196,6 +254,28 @@ namespace vcpkg::Util cont.erase(std::remove_if(cont.begin(), cont.end(), pred), cont.end()); } + template + void erase_if(Container& container, Pred pred) + { + for (auto i = container.begin(), last = container.end(); i != last;) + { + if (pred(*i)) + { + i = container.erase(i); + } + else + { + ++i; + } + } + } + + template + void erase_if(std::vector& container, Pred pred) + { + Util::erase_remove_if(container, pred); + } + template void transform(Range& r, F f) { diff --git a/include/vcpkg/binarycaching.h b/include/vcpkg/binarycaching.h index 3db09f460c..49f91f6ae2 100644 --- a/include/vcpkg/binarycaching.h +++ b/include/vcpkg/binarycaching.h @@ -4,14 +4,17 @@ #include #include +#include #include #include #include -#include +#include +#include #include +#include #include #include #include @@ -22,15 +25,15 @@ namespace vcpkg { struct CacheStatus { - bool should_attempt_precheck(const IBinaryProvider* sender) const noexcept; - bool should_attempt_restore(const IBinaryProvider* sender) const noexcept; + bool should_attempt_precheck(const IReadBinaryProvider* sender) const noexcept; + bool should_attempt_restore(const IReadBinaryProvider* sender) const noexcept; - bool is_unavailable(size_t total_providers) const noexcept; - const IBinaryProvider* get_available_provider() const noexcept; + bool is_unavailable(const IReadBinaryProvider* sender) const noexcept; + const IReadBinaryProvider* get_available_provider() const noexcept; bool is_restored() const noexcept; - void mark_unavailable(const IBinaryProvider* sender); - void mark_available(const IBinaryProvider* sender) noexcept; + void mark_unavailable(const IReadBinaryProvider* sender); + void mark_available(const IReadBinaryProvider* sender) noexcept; void mark_restored() noexcept; private: @@ -38,67 +41,82 @@ namespace vcpkg // The set of providers who know they do not have the associated cache entry. // Flat vector set because N is tiny. - std::vector m_known_unavailable_providers; // meaningful iff m_status == unknown + std::vector m_known_unavailable_providers; // The provider who affirmatively has the associated cache entry. - const IBinaryProvider* m_available_provider = nullptr; // meaningful iff m_status == available + const IReadBinaryProvider* m_available_provider = nullptr; // meaningful iff m_status == available }; - struct BinaryPackageInformation + struct BinaryPackageReadInfo { - explicit BinaryPackageInformation(const InstallPlanAction& action, Optional nuspec); + explicit BinaryPackageReadInfo(const InstallPlanAction& action); std::string package_abi; PackageSpec spec; std::string raw_version; - // only filled if BinaryCache has a provider that returns true for needs_nuspec_data() - Optional nuspec; + Path package_dir; }; - struct BinaryProviderPushRequest + struct BinaryPackageWriteInfo : BinaryPackageReadInfo { - BinaryPackageInformation info; - Path package_dir; + using BinaryPackageReadInfo::BinaryPackageReadInfo; + + // Filled if BinaryCache has a provider that returns true for needs_nuspec_data() + Optional nuspec; + // Filled if BinaryCache has a provider that returns true for needs_zip_file() + // Note: this can be empty if an error occurred while compressing. + Optional zip_path; }; - struct IBinaryProvider + struct IWriteBinaryProvider { - virtual ~IBinaryProvider() = default; - - /// Attempts to restore the package referenced by `action` into the packages directory. - /// Prerequisite: action has a package_abi() - virtual RestoreResult try_restore(const InstallPlanAction& action) const = 0; + virtual ~IWriteBinaryProvider() = default; /// Called upon a successful build of `action` to store those contents in the binary cache. - /// Prerequisite: action has a package_abi() /// returns the number of successful uploads - virtual size_t push_success(const BinaryProviderPushRequest& request, MessageSink& msg_sink) = 0; - - /// Gives the IBinaryProvider an opportunity to batch any downloading or server communication for - /// executing `actions`. - /// `cache_status` is a vector with the same number of entries of actions, where each index corresponds - /// to the action at the same index in `actions`. The provider must mark the cache status as appropriate. - /// Note: `actions` *might not* have package ABIs (for example, a --head package)! - /// Prerequisite: if `actions[i]` has no package ABI, `cache_status[i]` is nullptr. - virtual void prefetch(View actions, View cache_status) const = 0; + virtual size_t push_success(const BinaryPackageWriteInfo& request, MessageSink& msg_sink) = 0; - /// Checks whether the `actions` are present in the cache, without restoring them. Used by CI to determine - /// missing packages. - /// `cache_status` is a view with the same number of entries of actions, where each index corresponds - /// to the action at the same index in `actions`. The provider must mark the cache status as appropriate. - /// Prerequisite: `actions` have package ABIs. - virtual void precheck(View actions, View cache_status) const = 0; + virtual bool needs_nuspec_data() const = 0; + virtual bool needs_zip_file() const = 0; + }; - virtual bool needs_nuspec_data() const { return false; } + struct IReadBinaryProvider + { + virtual ~IReadBinaryProvider() = default; + + /// Gives the IBinaryProvider an opportunity to batch any downloading or server communication for executing + /// `actions`. + /// + /// IBinaryProvider should set out_status[i] to RestoreResult::restored for each fetched package. + /// + /// Prerequisites: actions[i].package_abi(), out_status.size() == actions.size() + virtual void fetch(View actions, Span out_status) const = 0; + + /// Checks whether the `actions` are present in the cache, without restoring them. + /// + /// Used by CI to determine missing packages. For each `i`, out_status[i] should be set to + /// CacheAvailability::available or CacheAvailability::unavailable + /// + /// Prerequisites: actions[i].package_abi(), out_status.size() == actions.size() + virtual void precheck(View actions, Span out_status) const = 0; + + virtual LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const = 0; }; struct UrlTemplate { std::string url_template; - std::vector headers_for_put; - std::vector headers_for_get; + std::vector headers; LocalizedString valid() const; - std::string instantiate_variables(const BinaryPackageInformation& info) const; + std::string instantiate_variables(const BinaryPackageReadInfo& info) const; + }; + + struct NuGetRepoInfo + { + std::string repo; + std::string branch; + std::string commit; }; struct BinaryConfigParserState @@ -135,47 +153,71 @@ namespace vcpkg std::vector secrets; + // These are filled in after construction by reading from args and environment + std::string nuget_prefix; + bool use_nuget_cache = false; + NuGetRepoInfo nuget_repo_info; + void clear(); }; - ExpectedL create_binary_providers_from_configs_pure(const std::string& env_string, - View args); - ExpectedL>> create_binary_providers_from_configs( - const VcpkgPaths& paths, View args); + ExpectedL parse_binary_provider_configs(const std::string& env_string, + View args); - struct BinaryCache + struct BinaryProviders { - BinaryCache(Filesystem& filesystem); - explicit BinaryCache(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - void install_providers(std::vector>&& providers); - void install_providers_for(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - /// Attempts to restore the package referenced by `action` into the packages directory. - RestoreResult try_restore(const InstallPlanAction& action); + std::vector> read; + std::vector> write; + std::string nuget_prefix; + NuGetRepoInfo nuget_repo; + }; - /// Called upon a successful build of `action` to store those contents in the binary cache. - void push_success(const InstallPlanAction& action, Path package_dir); + struct ReadOnlyBinaryCache + { + ReadOnlyBinaryCache() = default; + ReadOnlyBinaryCache(BinaryProviders&& providers); /// Gives the IBinaryProvider an opportunity to batch any downloading or server communication for /// executing `actions`. - void prefetch(View actions); + void fetch(View actions); + + bool is_restored(const InstallPlanAction& ipa) const; /// Checks whether the `actions` are present in the cache, without restoring them. Used by CI to determine /// missing packages. /// Returns a vector where each index corresponds to the matching index in `actions`. std::vector precheck(View actions); - private: + protected: + BinaryProviders m_config; + std::unordered_map m_status; - std::vector> m_providers; - bool needs_nuspec_data = false; - Filesystem& filesystem; + }; + + struct BinaryCache : ReadOnlyBinaryCache + { + static ExpectedL make(const VcpkgCmdArguments& args, const VcpkgPaths& paths, MessageSink& sink); + + BinaryCache(const Filesystem& fs); + BinaryCache(const BinaryCache&) = delete; + BinaryCache(BinaryCache&&) = default; + ~BinaryCache(); + + /// Called upon a successful build of `action` to store those contents in the binary cache. + void push_success(const InstallPlanAction& action); + + private: + BinaryCache(BinaryProviders&& providers, const Filesystem& fs); + + const Filesystem& m_fs; + Optional m_zip_tool; + bool m_needs_nuspec_data = false; + bool m_needs_zip_file = false; }; ExpectedL parse_download_configuration(const Optional& arg); - std::string generate_nuget_packages_config(const ActionPlan& action); + std::string generate_nuget_packages_config(const ActionPlan& action, StringView prefix); LocalizedString format_help_topic_asset_caching(); LocalizedString format_help_topic_binary_caching(); diff --git a/include/vcpkg/binarycaching.private.h b/include/vcpkg/binarycaching.private.h index 45234a45d9..0987e06381 100644 --- a/include/vcpkg/binarycaching.private.h +++ b/include/vcpkg/binarycaching.private.h @@ -2,13 +2,13 @@ #include +#include #include #include #include #include -#include namespace vcpkg { @@ -31,40 +31,10 @@ namespace vcpkg std::string nupkg_filename() const { return Strings::concat(id, '.', version, ".nupkg"); } }; - inline NugetReference make_nugetref(const PackageSpec& spec, - StringView raw_version, - StringView abi_tag, - const std::string& prefix) - { - return {Strings::concat(prefix, spec.dir()), format_version_for_nugetref(raw_version, abi_tag)}; - } - inline NugetReference make_nugetref(const BinaryPackageInformation& info, const std::string& prefix) - { - return make_nugetref(info.spec, info.raw_version, info.package_abi, prefix); - } - inline NugetReference make_nugetref(const InstallPlanAction& action, const std::string& prefix) - { - return make_nugetref(action.spec, - action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO) - .source_control_file->core_paragraph->raw_version, - action.abi_info.value_or_exit(VCPKG_LINE_INFO).package_abi, - prefix); - } - - namespace details - { - struct NuGetRepoInfo - { - std::string repo; - std::string branch; - std::string commit; - }; - - NuGetRepoInfo get_nuget_repo_info_from_env(); - } + NugetReference make_nugetref(const InstallPlanAction& action, StringView prefix); std::string generate_nuspec(const Path& package_dir, const InstallPlanAction& action, - const NugetReference& ref, - details::NuGetRepoInfo rinfo = details::get_nuget_repo_info_from_env()); + StringView id_prefix, + const NuGetRepoInfo& repo_info); } diff --git a/include/vcpkg/binaryparagraph.h b/include/vcpkg/binaryparagraph.h index fc03e2866c..9aef6a1fa9 100644 --- a/include/vcpkg/binaryparagraph.h +++ b/include/vcpkg/binaryparagraph.h @@ -12,15 +12,13 @@ namespace vcpkg struct BinaryParagraph { BinaryParagraph(); - explicit BinaryParagraph(Paragraph fields); + explicit BinaryParagraph(Paragraph&& fields); BinaryParagraph(const SourceParagraph& spgh, + const std::vector& default_features, Triplet triplet, const std::string& abi_tag, - const std::vector& deps); - BinaryParagraph(const SourceParagraph& spgh, - const FeatureParagraph& fpgh, - Triplet triplet, - const std::vector& deps); + std::vector deps); + BinaryParagraph(const PackageSpec& spec, const FeatureParagraph& fpgh, std::vector deps); void canonicalize(); @@ -55,5 +53,5 @@ namespace vcpkg }; void serialize(const BinaryParagraph& pgh, std::string& out_str); - std::string format_binary_paragraph(BinaryParagraph paragraph); + std::string format_binary_paragraph(const BinaryParagraph& paragraph); } diff --git a/include/vcpkg/cmakevars.h b/include/vcpkg/cmakevars.h index 60c42eef85..097cd99f3c 100644 --- a/include/vcpkg/cmakevars.h +++ b/include/vcpkg/cmakevars.h @@ -14,33 +14,25 @@ namespace vcpkg::CMakeVars { + using CMakeVars = std::unordered_map; + struct CMakeVarProvider { virtual ~CMakeVarProvider() = default; - virtual Optional&> get_generic_triplet_vars( - Triplet triplet) const = 0; + virtual Optional get_generic_triplet_vars(Triplet triplet) const = 0; - virtual Optional&> get_dep_info_vars( - const PackageSpec& spec) const = 0; + virtual Optional get_dep_info_vars(const PackageSpec& spec) const = 0; - const std::unordered_map& get_or_load_dep_info_vars(const PackageSpec& spec, - Triplet host_triplet) const; + const CMakeVars& get_or_load_dep_info_vars(const PackageSpec& spec, Triplet host_triplet) const; - virtual Optional&> get_tag_vars( - const PackageSpec& spec) const = 0; + virtual Optional get_tag_vars(const PackageSpec& spec) const = 0; virtual void load_generic_triplet_vars(Triplet triplet) const = 0; virtual void load_dep_info_vars(Span specs, Triplet host_triplet) const = 0; - virtual void load_tag_vars(Span specs, - const PortFileProvider& port_provider, - Triplet host_triplet) const = 0; - - void load_tag_vars(const ActionPlan& action_plan, - const PortFileProvider& port_provider, - Triplet host_triplet) const; + virtual void load_tag_vars(const ActionPlan& action_plan, Triplet host_triplet) const = 0; }; std::unique_ptr make_triplet_cmake_var_provider(const VcpkgPaths& paths); diff --git a/include/vcpkg/commands.acquire-project.h b/include/vcpkg/commands.acquire-project.h index 8d8cbd2d52..f048c2868e 100644 --- a/include/vcpkg/commands.acquire-project.h +++ b/include/vcpkg/commands.acquire-project.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - struct AcquireProjectCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandAcquireProjectMetadata; + void command_acquire_project_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.acquire.h b/include/vcpkg/commands.acquire.h index 0b868a4edb..7ff7f9907d 100644 --- a/include/vcpkg/commands.acquire.h +++ b/include/vcpkg/commands.acquire.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - struct AcquireCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandAcquireMetadata; + void command_acquire_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.activate.h b/include/vcpkg/commands.activate.h index 2f82230b40..b6c0d41260 100644 --- a/include/vcpkg/commands.activate.h +++ b/include/vcpkg/commands.activate.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - struct ActivateCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandActivateMetadata; + void command_activate_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.add-version.h b/include/vcpkg/commands.add-version.h index 8b9e0336e9..86aab1aed5 100644 --- a/include/vcpkg/commands.add-version.h +++ b/include/vcpkg/commands.add-version.h @@ -1,13 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::AddVersion +namespace vcpkg { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct AddVersionCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandAddVersionMetadata; + void command_add_version_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } \ No newline at end of file diff --git a/include/vcpkg/commands.add.h b/include/vcpkg/commands.add.h index f7db2498b1..2339222df2 100644 --- a/include/vcpkg/commands.add.h +++ b/include/vcpkg/commands.add.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - struct AddCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandAddMetadata; + void command_add_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.applocal.h b/include/vcpkg/commands.applocal.h deleted file mode 100644 index 59913be7ad..0000000000 --- a/include/vcpkg/commands.applocal.h +++ /dev/null @@ -1,13 +0,0 @@ -#if defined(_WIN32) -#pragma once - -#include - -namespace vcpkg::Commands -{ - struct AppLocalCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const override; - }; -} -#endif diff --git a/include/vcpkg/commands.autocomplete.h b/include/vcpkg/commands.autocomplete.h index 4f518d0f0c..1ca5936f2b 100644 --- a/include/vcpkg/commands.autocomplete.h +++ b/include/vcpkg/commands.autocomplete.h @@ -1,13 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::Autocomplete +namespace vcpkg { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct AutocompleteCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandAutocompleteMetadata; + void command_autocomplete_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.bootstrap-standalone.h b/include/vcpkg/commands.bootstrap-standalone.h index 327e25f443..915577c3f7 100644 --- a/include/vcpkg/commands.bootstrap-standalone.h +++ b/include/vcpkg/commands.bootstrap-standalone.h @@ -1,11 +1,11 @@ #pragma once -#include +#include -namespace vcpkg::Commands +#include + +namespace vcpkg { - struct BootstrapStandaloneCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const override; - }; + extern const CommandMetadata CommandBootstrapStandaloneMetadata; + void command_bootstrap_standalone_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs); } diff --git a/include/vcpkg/commands.build-external.h b/include/vcpkg/commands.build-external.h new file mode 100644 index 0000000000..58bafc6175 --- /dev/null +++ b/include/vcpkg/commands.build-external.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandBuildExternalMetadata; + void command_build_external_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); +} diff --git a/include/vcpkg/build.h b/include/vcpkg/commands.build.h similarity index 82% rename from include/vcpkg/build.h rename to include/vcpkg/commands.build.h index 2012f3939c..45a2ebfcc4 100644 --- a/include/vcpkg/build.h +++ b/include/vcpkg/commands.build.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -37,32 +38,24 @@ namespace vcpkg const IBuildLogsRecorder& null_build_logs_recorder() noexcept; - namespace Build - { - int perform_ex(const VcpkgCmdArguments& args, - const FullPackageSpec& full_spec, - Triplet host_triplet, - const PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const IBuildLogsRecorder& build_logs_recorder, - const VcpkgPaths& paths); - void perform_and_exit_ex(const VcpkgCmdArguments& args, - const FullPackageSpec& full_spec, - Triplet host_triplet, - const PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const IBuildLogsRecorder& build_logs_recorder, - const VcpkgPaths& paths); - - int perform(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - } // namespace vcpkg::Build + extern const CommandMetadata CommandBuildMetadata; + int command_build_ex(const VcpkgCmdArguments& args, + const FullPackageSpec& full_spec, + Triplet host_triplet, + const PathsPortFileProvider& provider, + const IBuildLogsRecorder& build_logs_recorder, + const VcpkgPaths& paths); + void command_build_and_exit_ex(const VcpkgCmdArguments& args, + const FullPackageSpec& full_spec, + Triplet host_triplet, + const PathsPortFileProvider& provider, + const IBuildLogsRecorder& build_logs_recorder, + const VcpkgPaths& paths); + + void command_build_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); StringLiteral to_string_view(DownloadTool tool); std::string to_string(DownloadTool tool); @@ -156,6 +149,7 @@ namespace vcpkg Triplet triplet; bool load_vcvars_env = false; bool disable_compiler_tracking = false; + bool target_is_xbox = false; std::string target_architecture; std::string cmake_system_name; std::string cmake_system_version; @@ -167,6 +161,7 @@ namespace vcpkg Optional public_abi_override; std::vector passthrough_env_vars; std::vector passthrough_env_vars_tracked; + Optional gamedk_latest_path; Path toolchain_file() const; bool using_vcvars() const; @@ -216,12 +211,7 @@ namespace vcpkg BuildPolicies() = default; BuildPolicies(std::unordered_map&& map) : m_policies(std::move(map)) { } - bool is_enabled(BuildPolicy policy) const - { - const auto it = m_policies.find(policy); - if (it != m_policies.cend()) return it->second; - return false; - } + bool is_enabled(BuildPolicy policy) const { return Util::copy_or_default(m_policies, policy); } private: std::unordered_map m_policies; @@ -245,7 +235,7 @@ namespace vcpkg BuildPolicies policies; }; - BuildInfo read_build_info(const Filesystem& fs, const Path& filepath); + BuildInfo read_build_info(const ReadOnlyFilesystem& fs, const Path& filepath); struct AbiEntry { @@ -272,12 +262,14 @@ namespace vcpkg struct AbiInfo { + // These should always be known if an AbiInfo exists std::unique_ptr pre_build_info; Optional toolset; + // These might not be known if compiler tracking is turned off or the port is --editable + Optional compiler_info; Optional triplet_abi; std::string package_abi; Optional abi_tag_file; - Optional compiler_info; std::vector relative_port_files; std::vector relative_port_hashes; std::vector heuristic_resources; @@ -292,9 +284,15 @@ namespace vcpkg { explicit EnvCache(bool compiler_tracking) : m_compiler_tracking(compiler_tracking) { } - const Environment& get_action_env(const VcpkgPaths& paths, const AbiInfo& abi_info); - const std::string& get_triplet_info(const VcpkgPaths& paths, const AbiInfo& abi_info); - const CompilerInfo& get_compiler_info(const VcpkgPaths& paths, const AbiInfo& abi_info); + const Environment& get_action_env(const VcpkgPaths& paths, + const PreBuildInfo& pre_build_info, + const Toolset& toolset); + const std::string& get_triplet_info(const VcpkgPaths& paths, + const PreBuildInfo& pre_build_info, + const Toolset& toolset); + const CompilerInfo& get_compiler_info(const VcpkgPaths& paths, + const PreBuildInfo& pre_build_info, + const Toolset& toolset); private: struct TripletMapEntry @@ -307,7 +305,7 @@ namespace vcpkg Cache m_triplet_cache; Cache m_toolchain_cache; - const TripletMapEntry& get_triplet_cache(const Filesystem& fs, const Path& p) const; + const TripletMapEntry& get_triplet_cache(const ReadOnlyFilesystem& fs, const Path& p) const; #if defined(_WIN32) struct EnvMapEntry @@ -321,12 +319,4 @@ namespace vcpkg bool m_compiler_tracking; }; - - struct BuildCommand : Commands::TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; } // namespace vcpkg diff --git a/include/vcpkg/commands.buildexternal.h b/include/vcpkg/commands.buildexternal.h deleted file mode 100644 index 4187fa3876..0000000000 --- a/include/vcpkg/commands.buildexternal.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::BuildExternal -{ - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - - struct BuildExternalCommand : TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; -} diff --git a/include/vcpkg/commands.cache.h b/include/vcpkg/commands.cache.h deleted file mode 100644 index 5d18a3f99f..0000000000 --- a/include/vcpkg/commands.cache.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::Cache -{ - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct CacheCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; -} diff --git a/include/vcpkg/commands.check-support.h b/include/vcpkg/commands.check-support.h index cf39d585d5..7bb0916c3a 100644 --- a/include/vcpkg/commands.check-support.h +++ b/include/vcpkg/commands.check-support.h @@ -1,19 +1,14 @@ #pragma once -#include +#include +#include +#include -namespace vcpkg::Commands::CheckSupport +namespace vcpkg { - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - - struct CheckSupportCommand : TripletCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; + extern const CommandMetadata CommandCheckSupportMetadata; + void command_check_support_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); } diff --git a/include/vcpkg/commands.ci-clean.h b/include/vcpkg/commands.ci-clean.h new file mode 100644 index 0000000000..fd80fe079f --- /dev/null +++ b/include/vcpkg/commands.ci-clean.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandCiCleanMetadata; + void command_ci_clean_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); +} diff --git a/include/vcpkg/commands.ci-verify-versions.h b/include/vcpkg/commands.ci-verify-versions.h new file mode 100644 index 0000000000..674698b2cd --- /dev/null +++ b/include/vcpkg/commands.ci-verify-versions.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandCiVerifyVersionsMetadata; + void command_ci_verify_versions_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); +} \ No newline at end of file diff --git a/include/vcpkg/commands.ci.h b/include/vcpkg/commands.ci.h index 8061e14354..f9305e77d8 100644 --- a/include/vcpkg/commands.ci.h +++ b/include/vcpkg/commands.ci.h @@ -1,20 +1,14 @@ #pragma once -#include +#include +#include +#include -namespace vcpkg::Commands::CI +namespace vcpkg { - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - - struct CICommand : TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; + extern const CommandMetadata CommandCiMetadata; + void command_ci_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); } diff --git a/include/vcpkg/commands.ciclean.h b/include/vcpkg/commands.ciclean.h deleted file mode 100644 index ed9e2f005b..0000000000 --- a/include/vcpkg/commands.ciclean.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::CIClean -{ - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct CICleanCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; -} diff --git a/include/vcpkg/commands.civerifyversions.h b/include/vcpkg/commands.civerifyversions.h deleted file mode 100644 index 17d8f56139..0000000000 --- a/include/vcpkg/commands.civerifyversions.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::CIVerifyVersions -{ - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct CIVerifyVersionsCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; -} \ No newline at end of file diff --git a/include/vcpkg/commands.contact.h b/include/vcpkg/commands.contact.h index ea5c8b8d0d..6bfa10b5cb 100644 --- a/include/vcpkg/commands.contact.h +++ b/include/vcpkg/commands.contact.h @@ -1,14 +1,11 @@ #pragma once -#include +#include -namespace vcpkg::Commands::Contact -{ - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs); +#include - struct ContactCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const override; - }; +namespace vcpkg +{ + extern const CommandMetadata CommandContactMetadata; + void command_contact_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs); } diff --git a/include/vcpkg/commands.create.h b/include/vcpkg/commands.create.h index a8eb99b273..5f27dab142 100644 --- a/include/vcpkg/commands.create.h +++ b/include/vcpkg/commands.create.h @@ -1,15 +1,11 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::Create +namespace vcpkg { - extern const CommandStructure COMMAND_STRUCTURE; - int perform(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct CreateCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandCreateMetadata; + int command_create(const VcpkgCmdArguments& args, const VcpkgPaths& paths); + void command_create_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.deactivate.h b/include/vcpkg/commands.deactivate.h index 9d63d51130..7b71dffbfe 100644 --- a/include/vcpkg/commands.deactivate.h +++ b/include/vcpkg/commands.deactivate.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - struct DeactivateCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandDeactivateMetadata; + void command_deactivate_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.depend-info.h b/include/vcpkg/commands.depend-info.h new file mode 100644 index 0000000000..c0198f398f --- /dev/null +++ b/include/vcpkg/commands.depend-info.h @@ -0,0 +1,55 @@ +#pragma once + +#include + +#include +#include +#include + +namespace vcpkg +{ + struct PackageDependInfo + { + std::string package; + int depth; + std::unordered_set features; + std::vector dependencies; + }; + + std::string create_dot_as_string(const std::vector& depend_info); + std::string create_dgml_as_string(const std::vector& depend_info); + std::string create_mermaid_as_string(const std::vector& depend_info); + + extern const CommandMetadata CommandDependInfoMetadata; + + enum class DependInfoSortMode + { + Lexicographical, + Topological, + ReverseTopological + }; + + enum class DependInfoFormat + { + List, + Tree, + Dot, + Dgml, + Mermaid + }; + + struct DependInfoStrategy + { + DependInfoSortMode sort_mode; + DependInfoFormat format; + int max_depth; + bool show_depth; + }; + + ExpectedL determine_depend_info_mode(const ParsedArguments& args); + + void command_depend_info_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); +} diff --git a/include/vcpkg/commands.dependinfo.h b/include/vcpkg/commands.dependinfo.h deleted file mode 100644 index 1b28b79fe9..0000000000 --- a/include/vcpkg/commands.dependinfo.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::DependInfo -{ - extern const CommandStructure COMMAND_STRUCTURE; - - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - - struct DependInfoCommand : TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; -} diff --git a/include/vcpkg/commands.download.h b/include/vcpkg/commands.download.h new file mode 100644 index 0000000000..fac7963ff4 --- /dev/null +++ b/include/vcpkg/commands.download.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandDownloadMetadata; + void command_download_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs); +} diff --git a/include/vcpkg/commands.edit.h b/include/vcpkg/commands.edit.h index 9a37d2ee3d..f10b33f675 100644 --- a/include/vcpkg/commands.edit.h +++ b/include/vcpkg/commands.edit.h @@ -1,14 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::Edit +namespace vcpkg { - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct EditCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandEditMetadata; + void command_edit_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.env.h b/include/vcpkg/commands.env.h index d7087e7e7f..42e00f704d 100644 --- a/include/vcpkg/commands.env.h +++ b/include/vcpkg/commands.env.h @@ -1,20 +1,14 @@ #pragma once -#include +#include +#include +#include -namespace vcpkg::Commands::Env +namespace vcpkg { - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - - struct EnvCommand : TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; + extern const CommandMetadata CommandEnvMetadata; + void command_env_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); } diff --git a/include/vcpkg/commands.export.h b/include/vcpkg/commands.export.h new file mode 100644 index 0000000000..2d1c73c85b --- /dev/null +++ b/include/vcpkg/commands.export.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandExportMetadata; + + void command_export_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); + + void export_integration_files(const Path& raw_exported_dir_path, const VcpkgPaths& paths); +} diff --git a/include/vcpkg/commands.fetch.h b/include/vcpkg/commands.fetch.h index c41965903e..7cf26603e7 100644 --- a/include/vcpkg/commands.fetch.h +++ b/include/vcpkg/commands.fetch.h @@ -1,13 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::Fetch +namespace vcpkg { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct FetchCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandFetchMetadata; + void command_fetch_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.find.h b/include/vcpkg/commands.find.h index c967484088..6d20209eb1 100644 --- a/include/vcpkg/commands.find.h +++ b/include/vcpkg/commands.find.h @@ -1,23 +1,20 @@ #pragma once +#include #include #include #include -#include +#include -namespace vcpkg::Commands +namespace vcpkg { void perform_find_port_and_exit(const VcpkgPaths& paths, bool full_description, bool enable_json, Optional filter, View overlay_ports); - void perform_find_artifact_and_exit(const VcpkgPaths& paths, Optional filter); - - struct FindCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandFindMetadata; + void command_find_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.format-manifest.h b/include/vcpkg/commands.format-manifest.h index 1317bbc705..eeadc9a1b9 100644 --- a/include/vcpkg/commands.format-manifest.h +++ b/include/vcpkg/commands.format-manifest.h @@ -1,14 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::FormatManifest +namespace vcpkg { - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct FormatManifestCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandFormatManifestMetadata; + void command_format_manifest_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.generate-msbuild-props.h b/include/vcpkg/commands.generate-msbuild-props.h index 9708e99341..9ddcad38b3 100644 --- a/include/vcpkg/commands.generate-msbuild-props.h +++ b/include/vcpkg/commands.generate-msbuild-props.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - struct GenerateMSBuildPropsCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandGenerateMsbuildPropsMetadata; + void command_generate_msbuild_props_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.h b/include/vcpkg/commands.h index a9a73bbf8a..80b3d23e22 100644 --- a/include/vcpkg/commands.h +++ b/include/vcpkg/commands.h @@ -1,37 +1,38 @@ #pragma once +#include + +#include +#include +#include + #include #include -#include - #include -namespace vcpkg::Commands +namespace vcpkg { + using BasicCommandFn = void (*)(const VcpkgCmdArguments& args, const Filesystem& fs); + using PathsCommandFn = void (*)(const VcpkgCmdArguments& args, const VcpkgPaths& paths); + using TripletCommandFn = void (*)(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); + template - struct PackageNameAndFunction + struct CommandRegistration { - std::string name; + const CommandMetadata& metadata; T function; }; - Span> get_available_basic_commands(); - Span> get_available_paths_commands(); - Span> get_available_triplet_commands(); + extern const View> basic_commands; + extern const View> paths_commands; + extern const View> triplet_commands; - template - T find(StringView command_name, Span> available_commands) - { - for (const PackageNameAndFunction& cmd : available_commands) - { - if (cmd.name == command_name) - { - return cmd.function; - } - } - - // not found - return nullptr; - } + std::vector get_all_commands_metadata(); + + void print_zero_args_usage(); + void print_full_command_list(); } diff --git a/include/vcpkg/commands.hash.h b/include/vcpkg/commands.hash.h index b2a9da4474..04beeb7cd7 100644 --- a/include/vcpkg/commands.hash.h +++ b/include/vcpkg/commands.hash.h @@ -1,11 +1,11 @@ #pragma once -#include +#include -namespace vcpkg::Commands::Hash +#include + +namespace vcpkg { - struct HashCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& paths) const override; - }; + extern const CommandMetadata CommandHashMetadata; + void command_hash_and_exit(const VcpkgCmdArguments& args, const Filesystem& paths); } diff --git a/include/vcpkg/commands.help.h b/include/vcpkg/commands.help.h new file mode 100644 index 0000000000..21862d3b68 --- /dev/null +++ b/include/vcpkg/commands.help.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +#include +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandHelpMetadata; + + void command_help_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); + + void help_topic_valid_triplet(const TripletDatabase& database); +} diff --git a/include/vcpkg/commands.info.h b/include/vcpkg/commands.info.h deleted file mode 100644 index 556d1eb012..0000000000 --- a/include/vcpkg/commands.info.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::Info -{ - extern const CommandStructure COMMAND_STRUCTURE; - - struct InfoCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; -} diff --git a/include/vcpkg/commands.init-registry.h b/include/vcpkg/commands.init-registry.h index 29d8643f83..c285e06bb7 100644 --- a/include/vcpkg/commands.init-registry.h +++ b/include/vcpkg/commands.init-registry.h @@ -1,13 +1,11 @@ #pragma once -#include +#include -namespace vcpkg::Commands::InitRegistry -{ - void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs); +#include - struct InitRegistryCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const override; - }; +namespace vcpkg +{ + extern const CommandMetadata CommandInitRegistryMetadata; + void command_init_registry_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs); } diff --git a/include/vcpkg/install.h b/include/vcpkg/commands.install.h similarity index 50% rename from include/vcpkg/install.h rename to include/vcpkg/commands.install.h index 9aa17fb845..33c9eb0b60 100644 --- a/include/vcpkg/install.h +++ b/include/vcpkg/commands.install.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include #include @@ -9,7 +9,7 @@ #include #include -#include +#include #include #include @@ -60,15 +60,11 @@ namespace vcpkg const Path& listfile() const; }; - ExtendedBuildResult perform_install_plan_action(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - InstallPlanAction& action, - StatusParagraphs& status_db, - const CMakeVars::CMakeVarProvider& var_provider); + void install_package_and_write_listfile(const Filesystem& fs, + const Path& source_dir, + const InstallDir& destination_dir); - void install_package_and_write_listfile(Filesystem& fs, const Path& source_dir, const InstallDir& destination_dir); - - void install_files_and_write_listfile(Filesystem& fs, + void install_files_and_write_listfile(const Filesystem& fs, const Path& source_dir, const std::vector& files, const InstallDir& destination_dir); @@ -87,39 +83,31 @@ namespace vcpkg std::vector get_cmake_add_library_names(StringView cmake_file); std::string get_cmake_find_package_name(StringView dirname, StringView filename); - CMakeUsageInfo get_cmake_usage(const Filesystem& fs, const InstalledPaths& installed, const BinaryParagraph& bpgh); + CMakeUsageInfo get_cmake_usage(const ReadOnlyFilesystem& fs, + const InstalledPaths& installed, + const BinaryParagraph& bpgh); - namespace Install - { - extern const CommandStructure COMMAND_STRUCTURE; - - void print_usage_information(const BinaryParagraph& bpgh, - std::set& printed_usages, - const Filesystem& fs, - const InstalledPaths& installed); - - InstallSummary perform(const VcpkgCmdArguments& args, - ActionPlan& action_plan, - const KeepGoing keep_going, - const VcpkgPaths& paths, - StatusParagraphs& status_db, - BinaryCache& binary_cache, - const IBuildLogsRecorder& build_logs_recorder, - const CMakeVars::CMakeVarProvider& var_provider); - - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - } // namespace vcpkg::Install - - struct InstallCommand : Commands::TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; + extern const CommandMetadata CommandInstallMetadata; + + void install_print_usage_information(const BinaryParagraph& bpgh, + std::set& printed_usages, + const ReadOnlyFilesystem& fs, + const InstalledPaths& installed); + + void install_preclear_packages(const VcpkgPaths& paths, const ActionPlan& action_plan); + + InstallSummary install_execute_plan(const VcpkgCmdArguments& args, + const ActionPlan& action_plan, + const KeepGoing keep_going, + const VcpkgPaths& paths, + StatusParagraphs& status_db, + BinaryCache& binary_cache, + const IBuildLogsRecorder& build_logs_recorder); + + void command_install_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); - void track_install_plan(ActionPlan& plan); + void track_install_plan(const ActionPlan& plan); } diff --git a/include/vcpkg/commands.integrate.h b/include/vcpkg/commands.integrate.h index 55d60c94e0..5c65bf3805 100644 --- a/include/vcpkg/commands.integrate.h +++ b/include/vcpkg/commands.integrate.h @@ -1,14 +1,17 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::Integrate -{ - extern const CommandStructure COMMAND_STRUCTURE; +#include + +#include +#include - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - void append_helpstring(HelpTableFormatter& table); - LocalizedString get_helpstring(); +namespace vcpkg +{ + extern const CommandMetadata CommandIntegrateMetadata; + void command_integrate_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); Optional find_targets_file_version(StringView contents); std::vector get_bash_source_completion_lines(StringView contents); @@ -19,10 +22,6 @@ namespace vcpkg::Commands::Integrate bool has_bashcompinit; bool has_autoload_bashcompinit; }; - ZshAutocomplete get_zsh_autocomplete_data(StringView contents); - struct IntegrateCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + ZshAutocomplete get_zsh_autocomplete_data(StringView contents); } diff --git a/include/vcpkg/commands.interface.h b/include/vcpkg/commands.interface.h deleted file mode 100644 index ea5cf52605..0000000000 --- a/include/vcpkg/commands.interface.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include - -#include -#include -#include - -namespace vcpkg::Commands -{ - enum class DryRun : bool - { - No, - Yes, - }; - - struct BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const = 0; - virtual ~BasicCommand() = default; - }; - - struct PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const = 0; - virtual ~PathsCommand() = default; - }; - - struct TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const = 0; - virtual ~TripletCommand() = default; - }; -} diff --git a/include/vcpkg/commands.list.h b/include/vcpkg/commands.list.h index 77a5f41bdb..8efc888d8b 100644 --- a/include/vcpkg/commands.list.h +++ b/include/vcpkg/commands.list.h @@ -1,14 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::List +namespace vcpkg { - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct ListCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandListMetadata; + void command_list_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.new.h b/include/vcpkg/commands.new.h index 5e82d4fbca..25a1e8883d 100644 --- a/include/vcpkg/commands.new.h +++ b/include/vcpkg/commands.new.h @@ -3,9 +3,10 @@ #include #include -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { ExpectedL build_prototype_manifest(const std::string* name, const std::string* version, @@ -14,8 +15,6 @@ namespace vcpkg::Commands bool option_version_date, bool option_version_string); - struct NewCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandNewMetadata; + void command_new_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.owns.h b/include/vcpkg/commands.owns.h index 13676b2bd9..235603bfdf 100644 --- a/include/vcpkg/commands.owns.h +++ b/include/vcpkg/commands.owns.h @@ -1,14 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands::Owns +namespace vcpkg { - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct OwnsCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandOwnsMetadata; + void command_owns_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.package-info.h b/include/vcpkg/commands.package-info.h new file mode 100644 index 0000000000..44e7130ba0 --- /dev/null +++ b/include/vcpkg/commands.package-info.h @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandPackageInfoMetadata; + + void command_package_info_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); +} diff --git a/include/vcpkg/commands.portsdiff.h b/include/vcpkg/commands.portsdiff.h index 8cd1b094c6..00b534c935 100644 --- a/include/vcpkg/commands.portsdiff.h +++ b/include/vcpkg/commands.portsdiff.h @@ -1,13 +1,34 @@ #pragma once -#include +#include -namespace vcpkg::Commands::PortsDiff +#include +#include + +#include + +#include +#include + +namespace vcpkg { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); + struct UpdatedPort + { + std::string port_name; + VersionDiff version_diff; + }; - struct PortsDiffCommand : PathsCommand + struct PortsDiff { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; + std::vector added_ports; + std::vector updated_ports; + std::vector removed_ports; }; + + PortsDiff find_portsdiff(const VcpkgPaths& paths, + StringView git_commit_id_for_previous_snapshot, + StringView git_commit_id_for_current_snapshot); + + extern const CommandMetadata CommandPortsdiffMetadata; + void command_portsdiff_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.regenerate.h b/include/vcpkg/commands.regenerate.h index ca3048fd07..48acfe156f 100644 --- a/include/vcpkg/commands.regenerate.h +++ b/include/vcpkg/commands.regenerate.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include namespace vcpkg { - struct RegenerateCommand : Commands::PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandRegenerateMetadata; + void command_regenerate_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.remove.h b/include/vcpkg/commands.remove.h new file mode 100644 index 0000000000..35b62efb74 --- /dev/null +++ b/include/vcpkg/commands.remove.h @@ -0,0 +1,30 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +namespace vcpkg +{ + enum class Purge : bool + { + NO = 0, + YES + }; + + void remove_package(const Filesystem& fs, + const InstalledPaths& installed, + const PackageSpec& spec, + StatusParagraphs& status_db); + + extern const CommandMetadata CommandRemoveMetadata; + void command_remove_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); +} diff --git a/include/vcpkg/commands.search.h b/include/vcpkg/commands.search.h index a4ed80e3a3..697b975e00 100644 --- a/include/vcpkg/commands.search.h +++ b/include/vcpkg/commands.search.h @@ -1,13 +1,11 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - extern const CommandStructure SearchCommandStructure; + extern const CommandMetadata CommandSearchMetadata; - struct SearchCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + void command_search_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.set-installed.h b/include/vcpkg/commands.set-installed.h new file mode 100644 index 0000000000..d33a56016a --- /dev/null +++ b/include/vcpkg/commands.set-installed.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace vcpkg +{ + enum class DryRun : bool + { + No, + Yes, + }; + + extern const CommandMetadata CommandSetInstalledMetadata; + + /** + * @brief adjust_action_plan_to_status_db creates an action plan that installs only the requested ports. + * All ABIs must be computed first. + * @param action_plan An action plan that was created with an empty status db + * @param status_db The status db of the installed folder + * @returns A set of PackageSpec's that are already installed + */ + std::set adjust_action_plan_to_status_db(ActionPlan& action_plan, const StatusParagraphs& status_db); + + void command_set_installed_and_exit_ex(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + const CMakeVars::CMakeVarProvider& cmake_vars, + ActionPlan action_plan, + DryRun dry_run, + const Optional& pkgsconfig_path, + Triplet host_triplet, + const KeepGoing keep_going, + const bool only_downloads, + const PrintUsage print_cmake_usage); + void command_set_installed_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); + + Optional create_dependency_graph_snapshot(const VcpkgCmdArguments& args, + const ActionPlan& action_plan); +} diff --git a/include/vcpkg/commands.setinstalled.h b/include/vcpkg/commands.setinstalled.h deleted file mode 100644 index 9810f619ca..0000000000 --- a/include/vcpkg/commands.setinstalled.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include - -#include -#include -#include -#include -#include -#include - -#include - -namespace vcpkg::Commands::SetInstalled -{ - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit_ex(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - const PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const CMakeVars::CMakeVarProvider& cmake_vars, - ActionPlan action_plan, - DryRun dry_run, - const Optional& pkgsconfig_path, - Triplet host_triplet, - const KeepGoing keep_going, - const bool only_downloads, - const PrintUsage print_cmake_usage); - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - - struct SetInstalledCommand : TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; -} diff --git a/include/vcpkg/commands.update-baseline.h b/include/vcpkg/commands.update-baseline.h index 90afc6bbb9..632307b258 100644 --- a/include/vcpkg/commands.update-baseline.h +++ b/include/vcpkg/commands.update-baseline.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - struct UpdateBaselineCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandUpdateBaselineMetadata; + void command_update_baseline_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.update-registry.h b/include/vcpkg/commands.update-registry.h new file mode 100644 index 0000000000..9f41872888 --- /dev/null +++ b/include/vcpkg/commands.update-registry.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandUpdateRegistryMetadata; + void command_update_registry_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); +} diff --git a/include/vcpkg/update.h b/include/vcpkg/commands.update.h similarity index 62% rename from include/vcpkg/update.h rename to include/vcpkg/commands.update.h index 2b8621fd0f..8e2e811950 100644 --- a/include/vcpkg/update.h +++ b/include/vcpkg/commands.update.h @@ -1,19 +1,14 @@ #pragma once +#include #include #include #include -#include #include #include namespace vcpkg -{ - struct StatusParagraphs; -} - -namespace vcpkg::Update { struct OutdatedPackage { @@ -26,10 +21,6 @@ namespace vcpkg::Update std::vector find_outdated_packages(const PortFileProvider& provider, const StatusParagraphs& status_db); - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct UpdateCommand : Commands::PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandUpdateMetadata; + void command_update_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.upgrade.h b/include/vcpkg/commands.upgrade.h index 8f724a0808..d01ec13ec4 100644 --- a/include/vcpkg/commands.upgrade.h +++ b/include/vcpkg/commands.upgrade.h @@ -1,20 +1,14 @@ #pragma once -#include +#include +#include +#include -namespace vcpkg::Commands::Upgrade +namespace vcpkg { - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet); - - struct UpgradeCommand : TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; + extern const CommandMetadata CommandUpgradeMetadata; + void command_upgrade_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); } diff --git a/include/vcpkg/commands.upload-metrics.h b/include/vcpkg/commands.upload-metrics.h deleted file mode 100644 index d94a6e7b75..0000000000 --- a/include/vcpkg/commands.upload-metrics.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::UploadMetrics -{ - extern const CommandStructure COMMAND_STRUCTURE; - struct UploadMetricsCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const override; - }; -} diff --git a/include/vcpkg/commands.use.h b/include/vcpkg/commands.use.h index 7a897828fa..f3ee828bbe 100644 --- a/include/vcpkg/commands.use.h +++ b/include/vcpkg/commands.use.h @@ -1,11 +1,10 @@ #pragma once -#include +#include +#include -namespace vcpkg::Commands +namespace vcpkg { - struct UseCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; + extern const CommandMetadata CommandUseMetadata; + void command_use_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } diff --git a/include/vcpkg/commands.version.h b/include/vcpkg/commands.version.h index 17eeaf8644..226eb95155 100644 --- a/include/vcpkg/commands.version.h +++ b/include/vcpkg/commands.version.h @@ -1,8 +1,9 @@ #pragma once +#include #include -#include +#include #define STRINGIFY(...) #__VA_ARGS__ #define MACRO_TO_STRING(X) STRINGIFY(X) @@ -19,13 +20,9 @@ #define VCPKG_BASE_VERSION_AS_STRING MACRO_TO_STRING(VCPKG_BASE_VERSION) -namespace vcpkg::Commands::Version +namespace vcpkg { - extern const StringLiteral version; - void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs); - - struct VersionCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const override; - }; + extern const StringLiteral vcpkg_executable_version; + extern const CommandMetadata CommandVersionMetadata; + void command_version_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs); } diff --git a/include/vcpkg/commands.vsinstances.h b/include/vcpkg/commands.vsinstances.h new file mode 100644 index 0000000000..2422ade714 --- /dev/null +++ b/include/vcpkg/commands.vsinstances.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandVsInstancesMetadata; + void command_vs_instances_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); +} diff --git a/include/vcpkg/commands.xdownload.h b/include/vcpkg/commands.xdownload.h deleted file mode 100644 index 4d8d3981ef..0000000000 --- a/include/vcpkg/commands.xdownload.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::X_Download -{ - void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs); - - struct XDownloadCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const override; - }; -} diff --git a/include/vcpkg/commands.xvsinstances.h b/include/vcpkg/commands.xvsinstances.h deleted file mode 100644 index fc7a39b98b..0000000000 --- a/include/vcpkg/commands.xvsinstances.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::X_VSInstances -{ - extern const CommandStructure COMMAND_STRUCTURE; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - struct VSInstancesCommand : PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; -} diff --git a/include/vcpkg/commands.z-applocal.h b/include/vcpkg/commands.z-applocal.h new file mode 100644 index 0000000000..6eb77cf12f --- /dev/null +++ b/include/vcpkg/commands.z-applocal.h @@ -0,0 +1,13 @@ +#if defined(_WIN32) +#pragma once + +#include + +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandZApplocalMetadata; + void command_z_applocal_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs); +} +#endif diff --git a/include/vcpkg/commands.z-ce.h b/include/vcpkg/commands.z-ce.h new file mode 100644 index 0000000000..ce0e2b5edf --- /dev/null +++ b/include/vcpkg/commands.z-ce.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandZCEMetadata; + void command_z_ce_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); +} diff --git a/include/vcpkg/commands.z-changelog.h b/include/vcpkg/commands.z-changelog.h new file mode 100644 index 0000000000..7a9e1fc48e --- /dev/null +++ b/include/vcpkg/commands.z-changelog.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandZChangelogMetadata; + void command_z_changelog_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); +} diff --git a/include/vcpkg/commands.z-extract.h b/include/vcpkg/commands.z-extract.h new file mode 100644 index 0000000000..49670fd463 --- /dev/null +++ b/include/vcpkg/commands.z-extract.h @@ -0,0 +1,63 @@ +#pragma once + +#include +#include + +#include +#include + +#include + +#include +#include + +namespace vcpkg +{ + enum class StripMode + { + Manual, + Automatic + }; + + struct StripSetting + { + StripMode mode; + int count; + + // A constructor to enforce the relationship between mode and count + StripSetting(StripMode mode, int count) : mode(mode), count(count) + { + // If mode is Automatic, enforce count to be -1 + if (mode == StripMode::Automatic) this->count = -1; + } + + // Equality comparison + bool operator==(const StripSetting& other) const + { + return this->mode == other.mode && this->count == other.count; + } + }; + + ExpectedL get_strip_setting(std::map> settings); + + struct ExtractedArchive + { + Path temp_path; + Path base_path; + std::vector proximate_to_temp; + }; + + // Returns athe set of move operations required to deploy an archive after applying a strip operation. Each .first + // should be move to .second. If .second is empty, the file should not be deployed. + std::vector> get_archive_deploy_operations(const ExtractedArchive& archive, + StripSetting strip_setting); + // Returns the number of leading directories that are common to all paths, excluding their last path element. + // Pre: There are no duplicate entries in paths. + // Pre: Every entry in paths is lexically_normal. + // Both conditions are usually met by calling this function with the result of + // get_regular_files_recursive_lexically_proximate. + size_t get_common_directories_count(std::vector paths); + + extern const CommandMetadata CommandZExtractMetadata; + void command_z_extract_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); +} diff --git a/include/vcpkg/commands.generate-message-map.h b/include/vcpkg/commands.z-generate-message-map.h similarity index 68% rename from include/vcpkg/commands.generate-message-map.h rename to include/vcpkg/commands.z-generate-message-map.h index 23dc7f71e6..b7c9f51cef 100644 --- a/include/vcpkg/commands.generate-message-map.h +++ b/include/vcpkg/commands.z-generate-message-map.h @@ -3,10 +3,9 @@ #include #include -#include #include -namespace vcpkg::Commands +namespace vcpkg { struct FormatArgMismatches { @@ -17,8 +16,6 @@ namespace vcpkg::Commands std::vector get_all_format_args(StringView fstring, LocalizedString& error); FormatArgMismatches get_format_arg_mismatches(StringView value, StringView comment, LocalizedString& error); - struct GenerateDefaultMessageMapCommand : BasicCommand - { - void perform_and_exit(const VcpkgCmdArguments&, Filesystem&) const override; - }; + extern const CommandMetadata CommandZGenerateDefaultMessageMapMetadata; + void command_z_generate_default_message_map_and_exit(const VcpkgCmdArguments&, const Filesystem&); } diff --git a/include/vcpkg/commands.z-preregister-telemetry.h b/include/vcpkg/commands.z-preregister-telemetry.h new file mode 100644 index 0000000000..26b3a1d69e --- /dev/null +++ b/include/vcpkg/commands.z-preregister-telemetry.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandZPreregisterTelemetryMetadata; + void command_z_preregister_telemetry_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs); +} diff --git a/include/vcpkg/commands.z-print-config.h b/include/vcpkg/commands.z-print-config.h new file mode 100644 index 0000000000..4f736964ce --- /dev/null +++ b/include/vcpkg/commands.z-print-config.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandZPrintConfigMetadata; + void command_z_print_config_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet); +} diff --git a/include/vcpkg/commands.z-upload-metrics.h b/include/vcpkg/commands.z-upload-metrics.h new file mode 100644 index 0000000000..21dc855ab8 --- /dev/null +++ b/include/vcpkg/commands.z-upload-metrics.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +#include + +namespace vcpkg +{ + extern const CommandMetadata CommandZUploadMetricsMetadata; + void command_z_upload_metrics_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs); +} diff --git a/include/vcpkg/commands.zce.h b/include/vcpkg/commands.zce.h deleted file mode 100644 index 8ec7b44f68..0000000000 --- a/include/vcpkg/commands.zce.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands -{ - struct ZCeCommand : PathsCommand - { - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; -} diff --git a/include/vcpkg/commands.zpreregistertelemetry.h b/include/vcpkg/commands.zpreregistertelemetry.h deleted file mode 100644 index 52d410238f..0000000000 --- a/include/vcpkg/commands.zpreregistertelemetry.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands -{ - struct ZPreRegisterTelemetryCommand : BasicCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const override; - }; -} diff --git a/include/vcpkg/commands.zprintconfig.h b/include/vcpkg/commands.zprintconfig.h deleted file mode 100644 index df43a6d764..0000000000 --- a/include/vcpkg/commands.zprintconfig.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Commands::Z_PrintConfig -{ - struct PrintConfigCommand : TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; -} diff --git a/include/vcpkg/configuration.h b/include/vcpkg/configuration.h index 88dc7e6b11..f208387921 100644 --- a/include/vcpkg/configuration.h +++ b/include/vcpkg/configuration.h @@ -5,14 +5,23 @@ #include #include -#include #include #include +#include #include namespace vcpkg { + /// + /// A registry package pattern (e.g.: boost*) and the in-file location where it was declared. + /// + struct PackagePatternDeclaration + { + std::string pattern; + std::string location; + }; + struct RegistryConfig { // Missing kind means "null" @@ -24,7 +33,7 @@ namespace vcpkg Optional reference; Optional repo; Optional> packages; - Optional> package_declarations; + Optional> package_declarations; Json::Value serialize() const; @@ -87,4 +96,7 @@ namespace vcpkg vcpkg::MessageSink& messageSink); std::vector find_unknown_fields(const Configuration& config); + + // Exposed for testing + bool is_package_pattern(StringView sv); } diff --git a/include/vcpkg/configure-environment.h b/include/vcpkg/configure-environment.h index 443d39ab2f..abb6441b54 100644 --- a/include/vcpkg/configure-environment.h +++ b/include/vcpkg/configure-environment.h @@ -1,14 +1,66 @@ #pragma once +#include +#include + #include +#include #include #include +#include + +#include #include namespace vcpkg { + ExpectedL download_vcpkg_standalone_bundle(const DownloadManager& download_manager, + const Filesystem& fs, + const Path& download_root); + int run_configure_environment_command(const VcpkgPaths& paths, View args); - int run_configure_environment_command(const VcpkgPaths& paths, StringView arg0, View args); + + constexpr StringLiteral OPTION_VERSION = "version"; + + constexpr StringLiteral SWITCH_WINDOWS = "windows"; + constexpr StringLiteral SWITCH_OSX = "osx"; + constexpr StringLiteral SWITCH_LINUX = "linux"; + constexpr StringLiteral SWITCH_FREEBSD = "freebsd"; + constexpr StringLiteral SWITCH_X86 = "x86"; + constexpr StringLiteral SWITCH_X64 = "x64"; + constexpr StringLiteral SWITCH_ARM = "arm"; + constexpr StringLiteral SWITCH_ARM64 = "arm64"; + constexpr StringLiteral SWITCH_TARGET_X86 = "target:x86"; + constexpr StringLiteral SWITCH_TARGET_X64 = "target:x64"; + constexpr StringLiteral SWITCH_TARGET_ARM = "target:arm"; + constexpr StringLiteral SWITCH_TARGET_ARM64 = "target:arm64"; + constexpr StringLiteral SWITCH_FORCE = "force"; + constexpr StringLiteral SWITCH_ALL_LANGUAGES = "all-languages"; + + constexpr CommandSwitch CommonAcquireArtifactSwitches[] = { + {SWITCH_WINDOWS, msgArtifactsSwitchWindows}, + {SWITCH_OSX, msgArtifactsSwitchOsx}, + {SWITCH_LINUX, msgArtifactsSwitchLinux}, + {SWITCH_FREEBSD, msgArtifactsSwitchFreebsd}, + {SWITCH_X86, msgArtifactsSwitchX86}, + {SWITCH_X64, msgArtifactsSwitchX64}, + {SWITCH_ARM, msgArtifactsSwitchARM}, + {SWITCH_ARM64, msgArtifactsSwitchARM64}, + {SWITCH_TARGET_X86, msgArtifactsSwitchTargetX86}, + {SWITCH_TARGET_X64, msgArtifactsSwitchTargetX64}, + {SWITCH_TARGET_ARM, msgArtifactsSwitchTargetARM}, + {SWITCH_TARGET_ARM64, msgArtifactsSwitchTargetARM64}, + {SWITCH_FORCE, msgArtifactsSwitchForce}, + {SWITCH_ALL_LANGUAGES, msgArtifactsSwitchAllLanguages}, + }; + + constexpr CommandSetting CommonSelectArtifactVersionSettings[] = { + {OPTION_VERSION, msgArtifactsOptionVersion}, + }; + + // Copies the switches and settings, but not multisettings from parsed to appended_to, and checks that the switches + // that apply to artifacts meet semantic rules like only one operating system being selected. + void forward_common_artifacts_arguments(std::vector& appended_to, const ParsedArguments& parsed); } diff --git a/include/vcpkg/dependencies.h b/include/vcpkg/dependencies.h index 857b061a05..303d5c493c 100644 --- a/include/vcpkg/dependencies.h +++ b/include/vcpkg/dependencies.h @@ -5,8 +5,9 @@ #include -#include +#include #include +#include #include #include @@ -29,8 +30,7 @@ namespace vcpkg AUTO_SELECTED }; - std::string to_output_string(RequestType request_type, const ZStringView s, const BuildPackageOptions& options); - std::string to_output_string(RequestType request_type, const ZStringView s); + [[nodiscard]] StringLiteral request_type_indent(RequestType request_type); enum class InstallPlanType { @@ -40,11 +40,23 @@ namespace vcpkg EXCLUDED }; - struct InstallPlanAction + struct BasicAction { - static bool compare_by_name(const InstallPlanAction* left, const InstallPlanAction* right); + static bool compare_by_name(const BasicAction* left, const BasicAction* right); - InstallPlanAction() noexcept; + PackageSpec spec; + }; + + struct PackageAction : BasicAction + { + std::string displayname() const; + + std::vector package_dependencies; + InternalFeatureSet feature_list; + }; + + struct InstallPlanAction : PackageAction + { InstallPlanAction(const InstallPlanAction&) = delete; InstallPlanAction(InstallPlanAction&&) = default; InstallPlanAction& operator=(const InstallPlanAction&) = delete; @@ -54,56 +66,45 @@ namespace vcpkg InstallPlanAction(const PackageSpec& spec, const SourceControlFileAndLocation& scfl, + const Path& packages_dir, const RequestType& request_type, Triplet host_triplet, std::map>&& dependencies, - std::vector&& build_failure_messages); + std::vector&& build_failure_messages, + std::vector default_features); - std::string displayname() const; const std::string& public_abi() const; bool has_package_abi() const; Optional package_abi() const; const PreBuildInfo& pre_build_info(LineInfo li) const; - - PackageSpec spec; + Version version() const; Optional source_control_file_and_location; Optional installed_package; + Optional> default_features; InstallPlanType plan_type; RequestType request_type; BuildPackageOptions build_options; std::map> feature_dependencies; - std::vector package_dependencies; std::vector build_failure_messages; - InternalFeatureSet feature_list; Triplet host_triplet; + // only valid with source_control_file_and_location Optional abi_info; + Optional package_dir; }; - enum class RemovePlanType + struct NotInstalledAction : BasicAction { - UNKNOWN, - NOT_INSTALLED, - REMOVE + NotInstalledAction(const PackageSpec& spec); }; - struct RemovePlanAction + struct RemovePlanAction : BasicAction { - static bool compare_by_name(const RemovePlanAction* left, const RemovePlanAction* right); - - RemovePlanAction() noexcept; - RemovePlanAction(const RemovePlanAction&) = delete; - RemovePlanAction(RemovePlanAction&&) = default; - RemovePlanAction& operator=(const RemovePlanAction&) = delete; - RemovePlanAction& operator=(RemovePlanAction&&) = default; + RemovePlanAction(const PackageSpec& spec, RequestType rt); - RemovePlanAction(const PackageSpec& spec, const RemovePlanType& plan_type, const RequestType& request_type); - - PackageSpec spec; - RemovePlanType plan_type; RequestType request_type; }; @@ -126,23 +127,17 @@ namespace vcpkg ALREADY_BUILT }; - struct ExportPlanAction + struct ExportPlanAction : BasicAction { - static bool compare_by_name(const ExportPlanAction* left, const ExportPlanAction* right); - - ExportPlanAction() noexcept; ExportPlanAction(const ExportPlanAction&) = delete; ExportPlanAction(ExportPlanAction&&) = default; ExportPlanAction& operator=(const ExportPlanAction&) = delete; ExportPlanAction& operator=(ExportPlanAction&&) = default; - ExportPlanAction(const PackageSpec& spec, - InstalledPackageView&& installed_package, - const RequestType& request_type); + ExportPlanAction(const PackageSpec& spec, InstalledPackageView&& installed_package, RequestType request_type); - ExportPlanAction(const PackageSpec& spec, const RequestType& request_type); + ExportPlanAction(const PackageSpec& spec, RequestType request_type); - PackageSpec spec; ExportPlanType plan_type; RequestType request_type; @@ -155,19 +150,27 @@ namespace vcpkg struct CreateInstallPlanOptions { - CreateInstallPlanOptions(GraphRandomizer* r, Triplet t) : randomizer(r), host_triplet(t) { } - CreateInstallPlanOptions(Triplet t, UnsupportedPortAction action = UnsupportedPortAction::Error) - : host_triplet(t), unsupported_port_action(action) + CreateInstallPlanOptions(Triplet t, const Path& p, UnsupportedPortAction action = UnsupportedPortAction::Error) + : host_triplet(t), packages_dir(p), unsupported_port_action(action) { } GraphRandomizer* randomizer = nullptr; Triplet host_triplet; - UnsupportedPortAction unsupported_port_action = UnsupportedPortAction::Warn; + Path packages_dir; + UnsupportedPortAction unsupported_port_action; }; - std::vector create_remove_plan(const std::vector& specs, - const StatusParagraphs& status_db); + struct RemovePlan + { + bool empty() const; + bool has_non_user_requested() const; + + std::vector not_installed; + std::vector remove; + }; + + RemovePlan create_remove_plan(const std::vector& specs, const StatusParagraphs& status_db); std::vector create_export_plan(const std::vector& specs, const StatusParagraphs& status_db); @@ -180,13 +183,13 @@ namespace vcpkg const CMakeVars::CMakeVarProvider& var_provider, View specs, const StatusParagraphs& status_db, - const CreateInstallPlanOptions& options = {Triplet{}}); + const CreateInstallPlanOptions& options); ActionPlan create_upgrade_plan(const PortFileProvider& provider, const CMakeVars::CMakeVarProvider& var_provider, const std::vector& specs, const StatusParagraphs& status_db, - const CreateInstallPlanOptions& options = {Triplet{}}); + const CreateInstallPlanOptions& options); ExpectedL create_versioned_install_plan(const IVersionedPortfileProvider& vprovider, const IBaselineProvider& bprovider, @@ -195,8 +198,15 @@ namespace vcpkg const std::vector& deps, const std::vector& overrides, const PackageSpec& toplevel, - Triplet host_triplet, - UnsupportedPortAction unsupported_port_action); + const CreateInstallPlanOptions& options); + + struct FormattedPlan + { + bool has_removals = false; + LocalizedString text; + }; + + FormattedPlan format_plan(const ActionPlan& action_plan, const Path& builtin_ports_dir); - void print_plan(const ActionPlan& action_plan, const bool is_recursive = true, const Path& builtin_ports_dir = {}); + void print_plan(const ActionPlan& action_plan, const bool is_recursive, const Path& builtin_ports_dir); } diff --git a/include/vcpkg/export.chocolatey.h b/include/vcpkg/export.chocolatey.h index 3ea31b4b50..9417d7e4ca 100644 --- a/include/vcpkg/export.chocolatey.h +++ b/include/vcpkg/export.chocolatey.h @@ -6,7 +6,7 @@ #include -namespace vcpkg::Export::Chocolatey +namespace vcpkg::Chocolatey { struct Options { diff --git a/include/vcpkg/export.h b/include/vcpkg/export.h deleted file mode 100644 index 412ef3e91b..0000000000 --- a/include/vcpkg/export.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Export -{ - extern const CommandStructure COMMAND_STRUCTURE; - - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet default_triplet); - - void export_integration_files(const Path& raw_exported_dir_path, const VcpkgPaths& paths); - - struct ExportCommand : Commands::TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; -} diff --git a/include/vcpkg/export.ifw.h b/include/vcpkg/export.ifw.h index 3780ea1c3a..a8965ec285 100644 --- a/include/vcpkg/export.ifw.h +++ b/include/vcpkg/export.ifw.h @@ -7,7 +7,7 @@ #include #include -namespace vcpkg::Export::IFW +namespace vcpkg::IFW { struct Options { diff --git a/include/vcpkg/export.prefab.h b/include/vcpkg/export.prefab.h index 46e5ee07a4..2f68fefb7f 100644 --- a/include/vcpkg/export.prefab.h +++ b/include/vcpkg/export.prefab.h @@ -16,7 +16,7 @@ #undef minor #endif -namespace vcpkg::Export::Prefab +namespace vcpkg::Prefab { constexpr int kFragmentSize = 3; diff --git a/include/vcpkg/fwd/binarycaching.h b/include/vcpkg/fwd/binarycaching.h index 70fb40c445..205207f647 100644 --- a/include/vcpkg/fwd/binarycaching.h +++ b/include/vcpkg/fwd/binarycaching.h @@ -2,28 +2,30 @@ namespace vcpkg { - enum class RestoreResult + enum class RestoreResult : unsigned char { unavailable, restored, }; - enum class CacheAvailability + enum class CacheAvailability : unsigned char { + unknown, unavailable, available, }; - enum class CacheStatusState + enum class CacheStatusState : unsigned char { unknown, // the cache status of the indicated package ABI is unknown available, // the cache is known to contain the package ABI, but it has not been restored restored, // the cache contains the ABI and it has been restored to the packages tree }; - struct CacheStatus; - struct IBinaryProvider; + struct IReadBinaryProvider; + struct IWriteBinaryProvider; struct BinaryCache; struct BinaryConfigParserState; - struct BinaryProviderPushRequest; + struct BinaryPackageReadInfo; + struct BinaryPackageWriteInfo; } diff --git a/include/vcpkg/fwd/install.h b/include/vcpkg/fwd/commands.install.h similarity index 100% rename from include/vcpkg/fwd/install.h rename to include/vcpkg/fwd/commands.install.h diff --git a/include/vcpkg/fwd/triplet.h b/include/vcpkg/fwd/triplet.h index ebc99ff1b0..d09b754a10 100644 --- a/include/vcpkg/fwd/triplet.h +++ b/include/vcpkg/fwd/triplet.h @@ -4,4 +4,6 @@ namespace vcpkg { struct TripletInstance; struct Triplet; + struct TripletFile; + struct TripletDatabase; } diff --git a/include/vcpkg/fwd/vcpkgcmdarguments.h b/include/vcpkg/fwd/vcpkgcmdarguments.h index 1526271283..1c827c6f74 100644 --- a/include/vcpkg/fwd/vcpkgcmdarguments.h +++ b/include/vcpkg/fwd/vcpkgcmdarguments.h @@ -7,8 +7,17 @@ namespace vcpkg struct CommandSetting; struct CommandMultiSetting; struct CommandOptionsStructure; - struct CommandStructure; + + enum class AutocompletePriority + { + Public, + Internal, + Never + }; + + struct CommandMetadata; struct HelpTableFormatter; struct VcpkgCmdArguments; struct FeatureFlagSettings; + struct PortApplicableSetting; } diff --git a/include/vcpkg/fwd/vcpkgpaths.h b/include/vcpkg/fwd/vcpkgpaths.h index 4a2e712cbe..84b2223031 100644 --- a/include/vcpkg/fwd/vcpkgpaths.h +++ b/include/vcpkg/fwd/vcpkgpaths.h @@ -5,7 +5,6 @@ namespace vcpkg struct ToolsetArchOption; struct Toolset; struct ManifestAndPath; - struct TripletFile; struct VcpkgPaths; struct VcpkgPathsImpl; diff --git a/include/vcpkg/help.h b/include/vcpkg/help.h deleted file mode 100644 index 31f6b11bce..0000000000 --- a/include/vcpkg/help.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include - -namespace vcpkg::Help -{ - extern const CommandStructure COMMAND_STRUCTURE; - - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); - - void help_topic_valid_triplet(const VcpkgPaths& paths); - - struct HelpCommand : Commands::PathsCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const override; - }; -} diff --git a/include/vcpkg/input.h b/include/vcpkg/input.h index 64f1635e31..310acd29eb 100644 --- a/include/vcpkg/input.h +++ b/include/vcpkg/input.h @@ -6,15 +6,33 @@ namespace vcpkg { - PackageSpec check_and_get_package_spec(std::string&& spec_string, + // Parse a package spec without features; typically used by commands which + // refer to already installed packages which make features irrelevant. + // + // Does not assert that the package spec has a valid triplet. This allows + // such commands to refer to entities that were installed with an overlay + // triplet or similar which is no longer active. + PackageSpec parse_package_spec(StringView spec_string, + Triplet default_triplet, + bool& default_triplet_used, + const LocalizedString& example_text); + + // Same as the above but checks the validity of the triplet. + PackageSpec check_and_get_package_spec(StringView spec_string, Triplet default_triplet, + bool& default_triplet_used, const LocalizedString& example_text, - const VcpkgPaths& paths); + const TripletDatabase& database); - FullPackageSpec check_and_get_full_package_spec(std::string&& spec_string, + // Parse a package spec with features, typically used by commands which will + // install or modify a port. + // + // Asserts that the package spec has a valid triplet. + FullPackageSpec check_and_get_full_package_spec(StringView spec_string, Triplet default_triplet, + bool& default_triplet_used, const LocalizedString& example_text, - const VcpkgPaths& paths); + const TripletDatabase& database); - void check_triplet(Triplet t, const VcpkgPaths& paths); + void check_triplet(StringView name, const TripletDatabase& database); } diff --git a/include/vcpkg/installedpaths.h b/include/vcpkg/installedpaths.h index 7ecf7d07b3..fd6927f200 100644 --- a/include/vcpkg/installedpaths.h +++ b/include/vcpkg/installedpaths.h @@ -2,7 +2,7 @@ #include -#include +#include #include #include diff --git a/include/vcpkg/metrics.h b/include/vcpkg/metrics.h index fb0a83e38f..f93eec83dd 100644 --- a/include/vcpkg/metrics.h +++ b/include/vcpkg/metrics.h @@ -60,8 +60,11 @@ namespace vcpkg CommandName, DeploymentKind, DetectedCiEnvironment, + CiProjectId, + CiOwnerId, InstallPlan_1, ListFile, + ProcessTree, RegistriesDefaultRegistryKind, RegistriesKindsUsed, Title, @@ -83,8 +86,10 @@ namespace vcpkg enum class BoolMetric { DetectedContainer, + DependencyGraphSuccess, FeatureFlagBinaryCaching, FeatureFlagCompilerTracking, + FeatureFlagDependencyGraph, FeatureFlagManifests, FeatureFlagRegistries, FeatureFlagVersions, @@ -157,7 +162,7 @@ namespace vcpkg void to_string(std::string&) const; std::string to_string() const; - void try_write(Filesystem& fs) const; + void try_write(const Filesystem& fs) const; // If *this is missing data normally provided by the system, fill it in; // otherwise, no effects. @@ -166,13 +171,14 @@ namespace vcpkg }; MetricsUserConfig try_parse_metrics_user(StringView content); - MetricsUserConfig try_read_metrics_user(const Filesystem& fs); + MetricsUserConfig try_read_metrics_user(const ReadOnlyFilesystem& fs); struct MetricsSessionData { std::string submission_time; std::string os_version; std::string session_id; + std::string parent_process_list; static MetricsSessionData from_system(); }; @@ -185,7 +191,7 @@ namespace vcpkg extern std::atomic g_should_print_metrics; extern std::atomic g_should_send_metrics; - void flush_global_metrics(Filesystem&); + void flush_global_metrics(const Filesystem&); #if defined(_WIN32) void winhttp_upload_metrics(StringView payload); #endif // ^^^ _WIN32 diff --git a/include/vcpkg/packagespec.h b/include/vcpkg/packagespec.h index d2a1c15465..26d9951f4e 100644 --- a/include/vcpkg/packagespec.h +++ b/include/vcpkg/packagespec.h @@ -6,13 +6,11 @@ #include #include -#include #include #include #include #include -#include namespace vcpkg { @@ -98,8 +96,12 @@ namespace vcpkg struct InternalFeatureSet : std::vector { using std::vector::vector; + + bool empty_or_only_core() const; }; + InternalFeatureSet internalize_feature_list(View fs, ImplicitDefault id); + /// /// /// Full specification of a package. Contains all information to reference @@ -111,8 +113,7 @@ namespace vcpkg PackageSpec package_spec; InternalFeatureSet features; - FullPackageSpec() = default; - explicit FullPackageSpec(PackageSpec spec, InternalFeatureSet features) + FullPackageSpec(PackageSpec spec, InternalFeatureSet features) : package_spec(std::move(spec)), features(std::move(features)) { } @@ -127,51 +128,6 @@ namespace vcpkg friend bool operator!=(const FullPackageSpec& l, const FullPackageSpec& r) { return !(l == r); } }; - struct DependencyConstraint - { - VersionConstraintKind type = VersionConstraintKind::None; - std::string value; - int port_version = 0; - - friend bool operator==(const DependencyConstraint& lhs, const DependencyConstraint& rhs); - friend bool operator!=(const DependencyConstraint& lhs, const DependencyConstraint& rhs) - { - return !(lhs == rhs); - } - - Optional try_get_minimum_version() const; - }; - - struct Dependency - { - std::string name; - std::vector features; - PlatformExpression::Expr platform; - DependencyConstraint constraint; - bool host = false; - - Json::Object extra_info; - - /// @param id adds "default" if "core" not present. - FullPackageSpec to_full_spec(Triplet target, Triplet host, ImplicitDefault id) const; - - friend bool operator==(const Dependency& lhs, const Dependency& rhs); - friend bool operator!=(const Dependency& lhs, const Dependency& rhs) { return !(lhs == rhs); } - }; - - struct DependencyOverride - { - std::string name; - std::string version; - int port_version = 0; - VersionScheme version_scheme = VersionScheme::String; - - Json::Object extra_info; - - friend bool operator==(const DependencyOverride& lhs, const DependencyOverride& rhs); - friend bool operator!=(const DependencyOverride& lhs, const DependencyOverride& rhs) { return !(lhs == rhs); } - }; - struct ParsedQualifiedSpecifier { std::string name; @@ -181,9 +137,11 @@ namespace vcpkg /// @param id add "default" if "core" is not present /// @return nullopt on success. On failure, caller should supplement returned string with more context. - ExpectedL to_full_spec(Triplet default_triplet, ImplicitDefault id) const; + ExpectedL to_full_spec(Triplet default_triplet, + bool& default_triplet_used, + ImplicitDefault id) const; - ExpectedL to_package_spec(Triplet default_triplet) const; + ExpectedL to_package_spec(Triplet default_triplet, bool& default_triplet_used) const; }; Optional parse_feature_name(ParserBase& parser); diff --git a/include/vcpkg/paragraphparser.h b/include/vcpkg/paragraphparser.h index 2daefd2738..984e594275 100644 --- a/include/vcpkg/paragraphparser.h +++ b/include/vcpkg/paragraphparser.h @@ -35,6 +35,8 @@ namespace vcpkg static std::string format_errors(View> errors); void to_string(std::string& target) const; std::string to_string() const; + + static std::unique_ptr from_error(StringView port_name, LocalizedString&& ls); }; } // namespace vcpkg @@ -46,6 +48,11 @@ namespace vcpkg template using ParseExpected = vcpkg::ExpectedT, std::unique_ptr>; + static constexpr struct ToLocalizedString_t + { + LocalizedString operator()(std::unique_ptr p) const; + } ToLocalizedString; + using Paragraph = std::map, std::less<>>; struct ParagraphParser @@ -75,7 +82,4 @@ namespace vcpkg ExpectedL> parse_qualified_specifier_list(const std::string& str, StringView origin = "", TextRowCol textrowcol = {}); - ExpectedL> parse_dependencies_list(const std::string& str, - StringView origin = "", - TextRowCol textrowcol = {}); } diff --git a/include/vcpkg/paragraphs.h b/include/vcpkg/paragraphs.h index fed31b581f..8e12aa80c4 100644 --- a/include/vcpkg/paragraphs.h +++ b/include/vcpkg/paragraphs.h @@ -5,57 +5,55 @@ #include #include +#include #include +#include +#include + namespace vcpkg::Paragraphs { uint64_t get_load_ports_stats(); ExpectedL parse_single_merged_paragraph(StringView str, StringView origin); ExpectedL parse_single_paragraph(StringView str, StringView origin); - ExpectedL get_single_paragraph(const Filesystem& fs, const Path& control_path); + ExpectedL get_single_paragraph(const ReadOnlyFilesystem& fs, const Path& control_path); - ExpectedL> get_paragraphs(const Filesystem& fs, const Path& control_path); + ExpectedL> get_paragraphs(const ReadOnlyFilesystem& fs, const Path& control_path); ExpectedL> parse_paragraphs(StringView str, StringView origin); - bool is_port_directory(const Filesystem& fs, const Path& maybe_directory); - - ParseExpected try_load_port(const Filesystem& fs, const Path& port_directory); - ParseExpected try_load_port_text(const std::string& text, - StringView origin, - bool is_manifest, - MessageSink& warning_sink); - - ExpectedL try_load_cached_package(const Filesystem& fs, + bool is_port_directory(const ReadOnlyFilesystem& fs, const Path& maybe_directory); + + // If an error occurs, the Expected will be in the error state. + // Otherwise, if the port is known, the unique_ptr contains the loaded port information. + // Otherwise, the unique_ptr is nullptr. + ExpectedL> try_load_port(const ReadOnlyFilesystem& fs, + StringView port_name, + const Path& port_directory); + // Identical to try_load_port, but the port unknown condition is mapped to an error. + ExpectedL> try_load_port_required(const ReadOnlyFilesystem& fs, + StringView port_name, + const Path& port_directory); + ExpectedL> try_load_port_text(const std::string& text, + StringView origin, + bool is_manifest, + MessageSink& warning_sink); + + ExpectedL try_load_cached_package(const ReadOnlyFilesystem& fs, const Path& package_dir, const PackageSpec& spec); struct LoadResults { std::vector paragraphs; - std::vector> errors; + std::vector> errors; }; - // this allows one to pass this around as an overload set to stuff like `Util::fmap`, - // as opposed to making it a function - constexpr struct - { - const std::string& operator()(const SourceControlFileAndLocation* loc) const - { - return (*this)(*loc->source_control_file); - } - const std::string& operator()(const SourceControlFileAndLocation& loc) const - { - return (*this)(*loc.source_control_file); - } - const std::string& operator()(const SourceControlFile& scf) const { return scf.core_paragraph->name; } - } get_name_of_control_file; - - LoadResults try_load_all_registry_ports(const Filesystem& fs, const RegistrySet& registries); - - std::vector load_all_registry_ports(const Filesystem& fs, + LoadResults try_load_all_registry_ports(const ReadOnlyFilesystem& fs, const RegistrySet& registries); + + std::vector load_all_registry_ports(const ReadOnlyFilesystem& fs, const RegistrySet& registries); - std::vector load_overlay_ports(const Filesystem& fs, const Path& dir); + std::vector load_overlay_ports(const ReadOnlyFilesystem& fs, const Path& dir); } diff --git a/include/vcpkg/platform-expression.h b/include/vcpkg/platform-expression.h index 6d93abc7b4..25a66bdb71 100644 --- a/include/vcpkg/platform-expression.h +++ b/include/vcpkg/platform-expression.h @@ -24,11 +24,8 @@ namespace vcpkg::PlatformExpression static Expr And(std::vector&& exprs); static Expr Or(std::vector&& exprs); - // The empty expression is always true - static Expr Empty() { return Expr(); } - // since ExprImpl is not yet defined, we need to define the ctor and dtor in the C++ file - Expr(); + Expr(); // always true Expr(const Expr&); Expr(Expr&&); Expr& operator=(const Expr& e); diff --git a/include/vcpkg/portfileprovider.h b/include/vcpkg/portfileprovider.h index ee656af16d..3a00860443 100644 --- a/include/vcpkg/portfileprovider.h +++ b/include/vcpkg/portfileprovider.h @@ -13,7 +13,7 @@ namespace vcpkg { struct PortFileProvider { - virtual ~PortFileProvider() = default; + virtual ~PortFileProvider(); virtual ExpectedL get_control_file(const std::string& src_name) const = 0; virtual std::vector load_all_control_files() const = 0; }; @@ -33,47 +33,55 @@ namespace vcpkg struct IVersionedPortfileProvider { virtual View get_port_versions(StringView port_name) const = 0; - virtual ~IVersionedPortfileProvider() = default; + virtual ~IVersionedPortfileProvider(); virtual ExpectedL get_control_file( const VersionSpec& version_spec) const = 0; + }; + + struct IFullVersionedPortfileProvider : IVersionedPortfileProvider + { virtual void load_all_control_files(std::map& out) const = 0; }; struct IBaselineProvider { virtual ExpectedL get_baseline_version(StringView port_name) const = 0; - virtual ~IBaselineProvider() = default; + virtual ~IBaselineProvider(); }; struct IOverlayProvider { - virtual ~IOverlayProvider() = default; + virtual ~IOverlayProvider(); virtual Optional get_control_file(StringView port_name) const = 0; + }; + + struct IFullOverlayProvider : IOverlayProvider + { virtual void load_all_control_files(std::map& out) const = 0; }; struct PathsPortFileProvider : PortFileProvider { - explicit PathsPortFileProvider(const Filesystem& fs, + explicit PathsPortFileProvider(const ReadOnlyFilesystem& fs, const RegistrySet& registry_set, - std::unique_ptr&& overlay); + std::unique_ptr&& overlay); ExpectedL get_control_file(const std::string& src_name) const override; std::vector load_all_control_files() const override; private: std::unique_ptr m_baseline; - std::unique_ptr m_versioned; - std::unique_ptr m_overlay; + std::unique_ptr m_versioned; + std::unique_ptr m_overlay; }; std::unique_ptr make_baseline_provider(const RegistrySet& registry_set); - std::unique_ptr make_versioned_portfile_provider(const Filesystem& fs, - const RegistrySet& registry_set); - std::unique_ptr make_overlay_provider(const Filesystem& fs, - const Path& original_cwd, - View overlay_ports); - std::unique_ptr make_manifest_provider(const Filesystem& fs, + std::unique_ptr make_versioned_portfile_provider(const ReadOnlyFilesystem& fs, + const RegistrySet& registry_set); + std::unique_ptr make_overlay_provider(const ReadOnlyFilesystem& fs, + const Path& original_cwd, + View overlay_ports); + std::unique_ptr make_manifest_provider(const ReadOnlyFilesystem& fs, const Path& original_cwd, View overlay_ports, const Path& manifest_path, diff --git a/include/vcpkg/registries.h b/include/vcpkg/registries.h index caee802fd6..00c4996d90 100644 --- a/include/vcpkg/registries.h +++ b/include/vcpkg/registries.h @@ -7,7 +7,9 @@ #include #include -#include +#include +#include +#include #include #include @@ -43,10 +45,10 @@ namespace vcpkg bool stale() const { return data->second.stale; } const std::string& uri() const { return data->first; } - void ensure_up_to_date(const VcpkgPaths& paths) const; + ExpectedL ensure_up_to_date(const VcpkgPaths& paths) const; }; - Entry get_or_fetch(const VcpkgPaths& paths, StringView repo, StringView reference); + ExpectedL get_or_fetch(const VcpkgPaths& paths, StringView repo, StringView reference); LockDataType lockdata; bool modified = false; @@ -63,7 +65,7 @@ namespace vcpkg struct RegistryEntry { - virtual View get_port_versions() const = 0; + virtual ExpectedL> get_port_versions() const = 0; virtual ExpectedL get_version(const Version& version) const = 0; @@ -74,14 +76,24 @@ namespace vcpkg { virtual StringLiteral kind() const = 0; - // returns nullptr if the port doesn't exist - virtual std::unique_ptr get_port_entry(StringView port_name) const = 0; + // If an error occurs, the ExpectedL will be in an error state. + // Otherwise, if the port is known, returns a pointer to RegistryEntry describing the port. + // Otherwise, returns a nullptr unique_ptr. + virtual ExpectedL> get_port_entry(StringView port_name) const = 0; - // appends the names of the ports to the out parameter - // may result in duplicated port names; make sure to Util::sort_unique_erase at the end - virtual void get_all_port_names(std::vector& port_names) const = 0; + // Appends the names of the known ports to the out parameter. + // May result in duplicated port names; make sure to Util::sort_unique_erase at the end + virtual ExpectedL append_all_port_names(std::vector& port_names) const = 0; - virtual ExpectedL get_baseline_version(StringView port_name) const = 0; + // Appends the names of the ports to the out parameter if this can be known without + // network access. + // Returns true iff names were checked without network access. + virtual ExpectedL try_append_all_port_names_no_network(std::vector& port_names) const = 0; + + // If an error occurs, the ExpectedL will be in an error state. + // Otherwise, if the port is in the baseline, returns the version that baseline denotes. + // Otherwise, the Optional is disengaged. + virtual ExpectedL> get_baseline_version(StringView port_name) const = 0; virtual ~RegistryImplementation() = default; }; @@ -89,18 +101,16 @@ namespace vcpkg struct Registry { // requires: static_cast(implementation) - Registry(std::vector&& packages, std::unique_ptr&& implementation); + Registry(std::vector&& patterns, std::unique_ptr&& implementation); Registry(std::vector&&, std::nullptr_t) = delete; - // always ordered lexicographically - View packages() const { return packages_; } + // always ordered lexicographically; note the JSON name is "packages" + View patterns() const { return patterns_; } const RegistryImplementation& implementation() const { return *implementation_; } - friend RegistrySet; // for experimental_set_builtin_registry_baseline - private: - std::vector packages_; + std::vector patterns_; std::unique_ptr implementation_; }; @@ -112,8 +122,8 @@ namespace vcpkg // configuration fields. struct RegistrySet { - RegistrySet(std::unique_ptr&& x, std::vector&& y) - : default_registry_(std::move(x)), registries_(std::move(y)) + RegistrySet(std::unique_ptr&& default_registry, std::vector&& registries) + : default_registry_(std::move(default_registry)), registries_(std::move(registries)) { } @@ -125,7 +135,7 @@ namespace vcpkg // the returned list is sorted by priority. std::vector registries_for_port(StringView name) const; - ExpectedL baseline_for_port(StringView port_name) const; + ExpectedL> baseline_for_port(StringView port_name) const; View registries() const { return registries_; } @@ -138,6 +148,12 @@ namespace vcpkg // for checking against the registry feature flag. bool has_modifications() const; + // Returns a sorted vector of all reachable port names in this set. + ExpectedL> get_all_reachable_port_names() const; + + // Returns a sorted vector of all reachable port names we can provably determine without touching the network. + ExpectedL> get_all_known_reachable_port_names_no_network() const; + private: std::unique_ptr default_registry_; std::vector registries_; @@ -149,60 +165,35 @@ namespace vcpkg std::string repo, std::string reference, std::string baseline); - std::unique_ptr make_filesystem_registry(const Filesystem& fs, + std::unique_ptr make_filesystem_registry(const ReadOnlyFilesystem& fs, Path path, std::string baseline); - ExpectedL>> get_builtin_versions(const VcpkgPaths& paths, - StringView port_name); - - ExpectedL>> get_builtin_baseline(const VcpkgPaths& paths); - - bool is_git_commit_sha(StringView sv); - - struct VersionDbEntry + struct GitVersionDbEntry { - Version version; - VersionScheme scheme = VersionScheme::String; - - // only one of these may be non-empty + SchemedVersion version; std::string git_tree; - Path p; }; - // VersionDbType::Git => VersionDbEntry.git_tree is filled - // VersionDbType::Filesystem => VersionDbEntry.path is filled - enum class VersionDbType - { - Git, - Filesystem, - }; + ExpectedL>> get_builtin_versions(const VcpkgPaths& paths, + StringView port_name); - struct VersionDbEntryDeserializer final : Json::IDeserializer - { - static constexpr StringLiteral GIT_TREE = "git-tree"; - static constexpr StringLiteral PATH = "path"; + ExpectedL>> get_builtin_baseline(const VcpkgPaths& paths); - LocalizedString type_name() const override; - View valid_fields() const override; - Optional visit_object(Json::Reader& r, const Json::Object& obj) const override; - VersionDbEntryDeserializer(VersionDbType type, const Path& root) : type(type), registry_root(root) { } + bool is_git_commit_sha(StringView sv); - private: - VersionDbType type; - Path registry_root; - }; + // Returns the effective match length of the package pattern `pattern` against `name`. + // No match is 0, exact match is SIZE_MAX, wildcard match is the length of the pattern. + // Note that the * is included in the match size to distinguish from 0 == no match. + size_t package_pattern_match(StringView name, StringView pattern); - struct VersionDbEntryArrayDeserializer final : Json::IDeserializer> + struct FilesystemVersionDbEntry { - virtual LocalizedString type_name() const override; - virtual Optional> visit_array(Json::Reader& r, - const Json::Array& arr) const override; - VersionDbEntryArrayDeserializer(VersionDbType type, const Path& root) : underlying{type, root} { } - - private: - VersionDbEntryDeserializer underlying; + SchemedVersion version; + Path p; }; - size_t package_match_prefix(StringView name, StringView pattern); + std::unique_ptr>> make_git_version_db_deserializer(); + std::unique_ptr>> make_filesystem_version_db_deserializer( + const Path& root); } diff --git a/include/vcpkg/remove.h b/include/vcpkg/remove.h deleted file mode 100644 index c80e4e0f3e..0000000000 --- a/include/vcpkg/remove.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -#include - -namespace vcpkg::Remove -{ - enum class Purge : bool - { - NO = 0, - YES - }; - - void perform_remove_plan_action(const VcpkgPaths& paths, - const RemovePlanAction& action, - const Purge purge, - StatusParagraphs* status_db); - - extern const CommandStructure COMMAND_STRUCTURE; - - struct RemoveCommand : Commands::TripletCommand - { - virtual void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const override; - }; -} diff --git a/include/vcpkg/sourceparagraph.h b/include/vcpkg/sourceparagraph.h index 10016c7bb7..0bd760cc1f 100644 --- a/include/vcpkg/sourceparagraph.h +++ b/include/vcpkg/sourceparagraph.h @@ -1,11 +1,12 @@ #pragma once #include +#include #include #include -#include #include +#include #include #include @@ -21,11 +22,68 @@ namespace vcpkg Path path; }; + struct DependencyConstraint + { + VersionConstraintKind type = VersionConstraintKind::None; + std::string value; + int port_version = 0; + + friend bool operator==(const DependencyConstraint& lhs, const DependencyConstraint& rhs); + friend bool operator!=(const DependencyConstraint& lhs, const DependencyConstraint& rhs) + { + return !(lhs == rhs); + } + + Optional try_get_minimum_version() const; + }; + + struct DependencyRequestedFeature + { + std::string name; + PlatformExpression::Expr platform; + + friend bool operator==(const DependencyRequestedFeature& lhs, const DependencyRequestedFeature& rhs); + friend bool operator!=(const DependencyRequestedFeature& lhs, const DependencyRequestedFeature& rhs); + }; + + struct Dependency + { + std::string name; + // a list of "real" features without "core" or "default". Use member default_features instead. + std::vector features; + PlatformExpression::Expr platform; + DependencyConstraint constraint; + bool host = false; + + bool default_features = true; + bool has_platform_expressions() const; + + Json::Object extra_info; + + /// @param id adds "default" if `default_features` is false. + FullPackageSpec to_full_spec(View features, Triplet target, Triplet host) const; + + friend bool operator==(const Dependency& lhs, const Dependency& rhs); + friend bool operator!=(const Dependency& lhs, const Dependency& rhs) { return !(lhs == rhs); } + }; + + struct DependencyOverride + { + std::string name; + std::string version; + int port_version = 0; + VersionScheme version_scheme = VersionScheme::String; + + Json::Object extra_info; + + friend bool operator==(const DependencyOverride& lhs, const DependencyOverride& rhs); + friend bool operator!=(const DependencyOverride& lhs, const DependencyOverride& rhs) { return !(lhs == rhs); } + }; + std::vector filter_dependencies(const std::vector& deps, Triplet t, Triplet host, - const std::unordered_map& cmake_vars, - ImplicitDefault id); + const std::unordered_map& cmake_vars); /// /// Port metadata of additional feature in a package (part of CONTROL file) @@ -36,6 +94,10 @@ namespace vcpkg std::vector description; std::vector dependencies; PlatformExpression::Expr supports_expression; + // there are two distinct "empty" states here + // "user did not provide a license" -> nullopt + // "user provided license = null" -> {""} + Optional license; // SPDX license expression Json::Object extra_info; @@ -59,7 +121,7 @@ namespace vcpkg std::string documentation; std::vector dependencies; std::vector overrides; - std::vector default_features; + std::vector default_features; // there are two distinct "empty" states here // "user did not provide a license" -> nullopt @@ -134,6 +196,8 @@ namespace vcpkg struct SourceControlFileAndLocation { Version to_version() const { return source_control_file->to_version(); } + VersionScheme scheme() const { return source_control_file->core_paragraph->version_scheme; } + SchemedVersion schemed_version() const { return {scheme(), to_version()}; } std::unique_ptr source_control_file; Path source_location; @@ -142,11 +206,13 @@ namespace vcpkg std::string registry_location; }; - void print_error_message(Span> error_info_list); - inline void print_error_message(const std::unique_ptr& error_info_list) - { - return print_error_message({&error_info_list, 1}); - } + void print_error_message(const LocalizedString& message); + void print_error_message(const std::unique_ptr& error_info_list); std::string parse_spdx_license_expression(StringView sv, ParseMessages& messages); + + // Exposed for testing + ExpectedL> parse_dependencies_list(const std::string& str, + StringView origin = "", + TextRowCol textrowcol = {}); } diff --git a/include/vcpkg/spdx.h b/include/vcpkg/spdx.h index d964a431ed..fe093311e0 100644 --- a/include/vcpkg/spdx.h +++ b/include/vcpkg/spdx.h @@ -27,5 +27,5 @@ namespace vcpkg std::string document_namespace, std::vector&& resource_docs); - Json::Value run_resource_heuristics(StringView contents); + Json::Value run_resource_heuristics(StringView contents, StringView portRawVersion); } diff --git a/include/vcpkg/statusparagraph.h b/include/vcpkg/statusparagraph.h index 9c99480298..bdf9e45131 100644 --- a/include/vcpkg/statusparagraph.h +++ b/include/vcpkg/statusparagraph.h @@ -61,6 +61,8 @@ namespace vcpkg const PackageSpec& spec() const { return core->package.spec; } std::vector dependencies() const; std::map> feature_dependencies() const; + InternalFeatureSet feature_list() const; + Version version() const; std::vector all_status_paragraphs() const; @@ -68,5 +70,7 @@ namespace vcpkg std::vector features; }; - Json::Value serialize_ipv(const InstalledPackageView& ipv, const InstalledPaths& installed, const Filesystem& fs); + Json::Value serialize_ipv(const InstalledPackageView& ipv, + const InstalledPaths& installed, + const ReadOnlyFilesystem& fs); } diff --git a/include/vcpkg/tools.h b/include/vcpkg/tools.h index b8b41e02bf..d3719da83b 100644 --- a/include/vcpkg/tools.h +++ b/include/vcpkg/tools.h @@ -52,10 +52,10 @@ namespace vcpkg std::string&& output, const Path& exe_path); - ExpectedL find_system_tar(const Filesystem& fs); - ExpectedL find_system_cmake(const Filesystem& fs); + ExpectedL find_system_tar(const ReadOnlyFilesystem& fs); + ExpectedL find_system_cmake(const ReadOnlyFilesystem& fs); - std::unique_ptr get_tool_cache(Filesystem& fs, + std::unique_ptr get_tool_cache(const Filesystem& fs, std::shared_ptr downloader, Path downloads, Path xml_config, diff --git a/include/vcpkg/tools.test.h b/include/vcpkg/tools.test.h index 13bc749875..212d41ba65 100644 --- a/include/vcpkg/tools.test.h +++ b/include/vcpkg/tools.test.h @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include diff --git a/include/vcpkg/triplet.h b/include/vcpkg/triplet.h index faf1561216..3c2328f0ec 100644 --- a/include/vcpkg/triplet.h +++ b/include/vcpkg/triplet.h @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -41,9 +42,6 @@ namespace vcpkg inline bool operator!=(Triplet left, Triplet right) { return !(left == right); } - Triplet default_triplet(const VcpkgCmdArguments& args); - Triplet default_host_triplet(const VcpkgCmdArguments& args); - void print_default_triplet_warning(const VcpkgCmdArguments& args, View specs); } VCPKG_FORMAT_AS(vcpkg::Triplet, vcpkg::StringView); @@ -56,3 +54,31 @@ namespace std size_t operator()(vcpkg::Triplet t) const { return t.hash_code(); } }; } + +namespace vcpkg +{ + Triplet default_triplet(const VcpkgCmdArguments& args, const TripletDatabase& database); + Triplet default_host_triplet(const VcpkgCmdArguments& args, const TripletDatabase& database); + void print_default_triplet_warning(const VcpkgCmdArguments& arg, const TripletDatabase& database); + + struct TripletFile + { + std::string name; + Path location; + + TripletFile(StringView name, StringView location); + + Path get_full_path() const; + }; + + struct TripletDatabase + { + Path default_triplet_directory; + Path community_triplet_directory; + std::vector available_triplets; + + Path get_triplet_file_path(Triplet triplet) const; + bool is_valid_triplet_name(StringView name) const; + bool is_valid_triplet_canonical_name(StringView name) const; + }; +} diff --git a/include/vcpkg/vcpkgcmdarguments.h b/include/vcpkg/vcpkgcmdarguments.h index 46ad754ad0..03f172ca76 100644 --- a/include/vcpkg/vcpkgcmdarguments.h +++ b/include/vcpkg/vcpkgcmdarguments.h @@ -11,6 +11,8 @@ #include #include +#include + #include #include #include @@ -29,34 +31,145 @@ namespace vcpkg std::vector command_arguments; }; + struct MetadataMessage + { + constexpr MetadataMessage() noexcept : kind(MetadataMessageKind::Unused), literal{} { } + /*implicit*/ constexpr MetadataMessage(const msg::MessageT<>& message) noexcept + : kind(MetadataMessageKind::Message), message(&message) + { + } + + template + /*implicit*/ constexpr MetadataMessage(const char (&literal)[N]) noexcept + : kind(MetadataMessageKind::Literal), literal(literal) + { + } + + template, int> = 0> + /*implicit*/ constexpr MetadataMessage(const Callback& callback) noexcept + : kind(MetadataMessageKind::Callback), callback(callback) + { + } + + constexpr MetadataMessage(std::nullptr_t) = delete; + + MetadataMessage(const MetadataMessage&) = delete; + MetadataMessage& operator=(const MetadataMessage&) = delete; + + LocalizedString to_string() const; + void to_string(LocalizedString& target) const; + explicit operator bool() const noexcept; + + private: + enum class MetadataMessageKind + { + Unused, + Message, + Literal, + Callback + }; + + MetadataMessageKind kind; + union + { + const msg::MessageT<>* message; + const char* literal; // not StringLiteral so this union is sizeof(void*) + LocalizedString (*callback)(); + }; + }; + + inline constexpr bool constexpr_contains(const char* haystack, const char* needle) noexcept + { + for (;; ++haystack) + { + for (std::size_t offset = 0;; ++offset) + { + if (!needle[offset]) + { + return true; + } + + if (!haystack[offset]) + { + return false; + } + + if (needle[offset] != haystack[offset]) + { + break; + } + } + } + } + + static_assert(constexpr_contains("", ""), "boom"); + static_assert(constexpr_contains("hay", ""), "boom"); + static_assert(!constexpr_contains("", "needle"), "boom"); + static_assert(constexpr_contains("needle", "nee"), "boom"); + + struct LearnWebsiteLinkLiteralUndocumentedCookie + { + }; + + constexpr LearnWebsiteLinkLiteralUndocumentedCookie Undocumented; + + struct LearnWebsiteLinkLiteral + { + /*implicit*/ constexpr LearnWebsiteLinkLiteral(LearnWebsiteLinkLiteralUndocumentedCookie) noexcept : literal{} + { + } + + template + /*implicit*/ constexpr LearnWebsiteLinkLiteral(const char (&literal)[N]) noexcept : literal(literal) + { + assert(!constexpr_contains(literal, "en-us") && + "If you get a build error here, remove the en-us from the learn uri so that the correct locale is " + "chosen for the user"); + } + + LocalizedString to_string() const; + void to_string(LocalizedString& target) const; + explicit operator bool() const noexcept; + + private: + const char* literal; // not StringLiteral to be nullable + }; + struct CommandSwitch { StringLiteral name; - LocalizedString (*helpmsg)(); + MetadataMessage helpmsg; }; struct CommandSetting { StringLiteral name; - LocalizedString (*helpmsg)(); + MetadataMessage helpmsg; }; struct CommandMultiSetting { StringLiteral name; - LocalizedString (*helpmsg)(); + MetadataMessage helpmsg; }; struct CommandOptionsStructure { - Span switches; - Span settings; - Span multisettings; + View switches; + View settings; + View multisettings; }; - struct CommandStructure + struct CommandMetadata { - LocalizedString (*get_example_text)(); + StringLiteral name; + MetadataMessage synopsis; + static constexpr std::size_t example_max_size = 4; + MetadataMessage examples[example_max_size]; + LearnWebsiteLinkLiteral website_link; + + AutocompletePriority autocomplete_priority; size_t minimum_arity; size_t maximum_arity; @@ -64,12 +177,11 @@ namespace vcpkg CommandOptionsStructure options; std::vector (*valid_arguments)(const VcpkgPaths& paths); - }; - void print_command_list_usage(); - void print_usage(const CommandStructure& command_structure); + LocalizedString get_example_text() const; + }; - LocalizedString create_example_string(StringView command_and_arguments); + void print_usage(const CommandMetadata& command_metadata); struct FeatureFlagSettings { @@ -77,6 +189,22 @@ namespace vcpkg bool compiler_tracking; bool binary_caching; bool versions; + bool dependency_graph; + }; + + struct PortApplicableSetting + { + std::string value; + + PortApplicableSetting(StringView setting); + PortApplicableSetting(const PortApplicableSetting&); + PortApplicableSetting(PortApplicableSetting&&); + PortApplicableSetting& operator=(const PortApplicableSetting&); + PortApplicableSetting& operator=(PortApplicableSetting&&); + bool is_port_affected(StringView port_name) const noexcept; + + private: + std::vector affected_ports; }; struct VcpkgCmdArguments @@ -133,8 +261,37 @@ namespace vcpkg std::vector cli_overlay_triplets; std::vector env_overlay_triplets; + constexpr static StringLiteral BINARY_SOURCES_ENV = "VCPKG_BINARY_SOURCES"; constexpr static StringLiteral BINARY_SOURCES_ARG = "binarysource"; - std::vector binary_sources; + std::vector cli_binary_sources; + Optional env_binary_sources; + constexpr static StringLiteral ACTIONS_CACHE_URL_ENV = "ACTIONS_CACHE_URL"; + Optional actions_cache_url; + constexpr static StringLiteral ACTIONS_RUNTIME_TOKEN_ENV = "ACTIONS_RUNTIME_TOKEN"; + Optional actions_runtime_token; + constexpr static StringLiteral NUGET_ID_PREFIX_ENV = "X_VCPKG_NUGET_ID_PREFIX"; + Optional nuget_id_prefix; + constexpr static StringLiteral VCPKG_USE_NUGET_CACHE_ENV = "VCPKG_USE_NUGET_CACHE"; + Optional use_nuget_cache; + constexpr static StringLiteral VCPKG_NUGET_REPOSITORY_ENV = "VCPKG_NUGET_REPOSITORY"; + Optional vcpkg_nuget_repository; + constexpr static StringLiteral GITHUB_REPOSITORY_ENV = "GITHUB_REPOSITORY"; + Optional github_repository; + constexpr static StringLiteral GITHUB_SERVER_URL_ENV = "GITHUB_SERVER_URL"; + Optional github_server_url; + constexpr static StringLiteral GITHUB_REF_ENV = "GITHUB_REF"; + Optional github_ref; + constexpr static StringLiteral GITHUB_SHA_ENV = "GITHUB_SHA"; + Optional github_sha; + constexpr static StringLiteral GITHUB_REPOSITORY_ID = "GITHUB_REPOSITORY_ID"; + Optional github_repository_id; + constexpr static StringLiteral GITHUB_REPOSITORY_OWNER_ID = "GITHUB_REPOSITORY_OWNER_ID"; + Optional github_repository_owner_id; + + constexpr static StringLiteral CMAKE_DEBUGGING_ARG = "cmake-debug"; + Optional cmake_debug; + constexpr static StringLiteral CMAKE_CONFIGURE_DEBUGGING_ARG = "cmake-configure-debug"; + Optional cmake_configure_debug; constexpr static StringLiteral CMAKE_SCRIPT_ARG = "cmake-args"; std::vector cmake_args; @@ -167,10 +324,22 @@ namespace vcpkg constexpr static StringLiteral ASSET_SOURCES_ENV = "X_VCPKG_ASSET_SOURCES"; constexpr static StringLiteral ASSET_SOURCES_ARG = "asset-sources"; + constexpr static StringLiteral GITHUB_RUN_ID_ENV = "GITHUB_RUN_ID"; + Optional github_run_id; + constexpr static StringLiteral GITHUB_TOKEN_ENV = "GITHUB_TOKEN"; + Optional github_token; + constexpr static StringLiteral GITHUB_JOB_ENV = "GITHUB_JOB"; + Optional github_job; + constexpr static StringLiteral GITHUB_WORKFLOW_ENV = "GITHUB_WORKFLOW"; + Optional github_workflow; + // feature flags constexpr static StringLiteral FEATURE_FLAGS_ENV = "VCPKG_FEATURE_FLAGS"; constexpr static StringLiteral FEATURE_FLAGS_ARG = "feature-flags"; + constexpr static StringLiteral DEPENDENCY_GRAPH_FEATURE = "dependencygraph"; + Optional dependency_graph_feature = nullopt; + constexpr static StringLiteral FEATURE_PACKAGES_SWITCH = "featurepackages"; Optional feature_packages = nullopt; constexpr static StringLiteral BINARY_CACHING_FEATURE = "binarycaching"; @@ -186,6 +355,7 @@ namespace vcpkg constexpr static StringLiteral RECURSIVE_DATA_ENV = "X_VCPKG_RECURSIVE_DATA"; + bool dependency_graph_enabled() const { return dependency_graph_feature.value_or(false); } bool binary_caching_enabled() const { return binary_caching.value_or(true); } bool compiler_tracking_enabled() const { return compiler_tracking.value_or(true); } bool registries_enabled() const { return registries_feature.value_or(true); } @@ -197,6 +367,7 @@ namespace vcpkg f.compiler_tracking = compiler_tracking_enabled(); f.registries = registries_enabled(); f.versions = versions_enabled(); + f.dependency_graph = dependency_graph_enabled(); return f; } const Optional& detected_ci_environment() const { return m_detected_ci_environment; } @@ -205,7 +376,7 @@ namespace vcpkg std::vector forwardable_arguments; - ParsedArguments parse_arguments(const CommandStructure& command_structure) const; + ParsedArguments parse_arguments(const CommandMetadata& command_metadata) const; void imbue_from_environment(); void imbue_from_fake_environment(const std::map>& env); @@ -242,7 +413,7 @@ namespace vcpkg Optional m_detected_ci_environment; - friend void print_usage(const CommandStructure& command_structure); + friend void print_usage(const CommandMetadata& command_metadata); CmdParser parser; }; } diff --git a/include/vcpkg/vcpkglib.h b/include/vcpkg/vcpkglib.h index e949834ae9..f85139a763 100644 --- a/include/vcpkg/vcpkglib.h +++ b/include/vcpkg/vcpkglib.h @@ -10,9 +10,9 @@ namespace vcpkg { - StatusParagraphs database_load_check(Filesystem& fs, const InstalledPaths& installed); + StatusParagraphs database_load_check(const Filesystem& fs, const InstalledPaths& installed); - void write_update(Filesystem& fs, const InstalledPaths& installed, const StatusParagraph& p); + void write_update(const Filesystem& fs, const InstalledPaths& installed, const StatusParagraph& p); struct StatusParagraphAndAssociatedFiles { @@ -21,7 +21,7 @@ namespace vcpkg }; std::vector get_installed_ports(const StatusParagraphs& status_db); - std::vector get_installed_files(Filesystem& fs, + std::vector get_installed_files(const Filesystem& fs, const InstalledPaths& installed, const StatusParagraphs& status_db); diff --git a/include/vcpkg/vcpkgpaths.h b/include/vcpkg/vcpkgpaths.h index 382b8baf3c..79339089c9 100644 --- a/include/vcpkg/vcpkgpaths.h +++ b/include/vcpkg/vcpkgpaths.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -12,12 +13,12 @@ #include #include #include +#include #include #include -#include #include -#include +#include #include @@ -45,17 +46,9 @@ namespace vcpkg std::vector supported_architectures; }; - struct TripletFile - { - std::string name; - Path location; - - TripletFile(StringView name, StringView location) : name(name.data(), name.size()), location(location) { } - }; - struct VcpkgPaths { - VcpkgPaths(Filesystem& filesystem, const VcpkgCmdArguments& args, const BundleSettings& bundle); + VcpkgPaths(const Filesystem& filesystem, const VcpkgCmdArguments& args, const BundleSettings& bundle); VcpkgPaths(const VcpkgPaths&) = delete; VcpkgPaths& operator=(const VcpkgPaths&) = delete; ~VcpkgPaths(); @@ -65,12 +58,9 @@ namespace vcpkg Path build_dir(StringView package_name) const; Path build_info_file_path(const PackageSpec& spec) const; - bool is_valid_triplet(Triplet t) const; - const std::vector get_available_triplets_names() const; - const std::vector& get_available_triplets() const; + const TripletDatabase& get_triplet_db() const; const std::map& get_cmake_script_hashes() const; StringView get_ports_cmake_hash() const; - const Path get_triplet_file_path(Triplet triplet) const; LockFile& get_installed_lockfile() const; void flush_lockfile() const; @@ -89,6 +79,7 @@ namespace vcpkg const Path original_cwd; const Path root; + bool try_provision_vcpkg_artifacts() const; private: const std::unique_ptr m_pimpl; @@ -103,15 +94,18 @@ namespace vcpkg const Path buildsystems_msbuild_targets; const Path buildsystems_msbuild_props; const Path ports_cmake; + + private: const Path triplets; const Path community_triplets; + std::vector overlay_triplets; + public: std::vector overlay_ports; - std::vector overlay_triplets; std::string get_toolver_diagnostics() const; - Filesystem& get_filesystem() const; + const Filesystem& get_filesystem() const; const DownloadManager& get_download_manager() const; const ToolCache& get_tool_cache() const; const Path& get_tool_exe(StringView tool, MessageSink& status_messages) const; @@ -137,7 +131,8 @@ namespace vcpkg ExpectedL git_show_from_remote_registry(StringView hash, const Path& relative_path_to_file) const; ExpectedL git_find_object_id_for_remote_registry_path(StringView hash, const Path& relative_path_to_file) const; - ExpectedL git_checkout_object_from_remote_registry(StringView tree) const; + ExpectedL git_read_tree(const Path& destination, StringView tree, const Path& dot_git_dir) const; + ExpectedL git_extract_tree_from_remote_registry(StringView tree) const; Optional get_manifest() const; bool manifest_mode_enabled() const; @@ -147,9 +142,9 @@ namespace vcpkg // Retrieve a toolset matching the requirements in prebuildinfo const Toolset& get_toolset(const PreBuildInfo& prebuildinfo) const; - const Environment& get_action_env(const AbiInfo& abi_info) const; - const std::string& get_triplet_info(const AbiInfo& abi_info) const; - const CompilerInfo& get_compiler_info(const AbiInfo& abi_info) const; + const Environment& get_action_env(const PreBuildInfo& pre_build_info, const Toolset& toolset) const; + const std::string& get_triplet_info(const PreBuildInfo& pre_build_info, const Toolset& toolset) const; + const CompilerInfo& get_compiler_info(const PreBuildInfo& pre_build_info, const Toolset& toolset) const; const FeatureFlagSettings& get_feature_flags() const; diff --git a/include/vcpkg/versions.h b/include/vcpkg/versions.h index e5282f9a81..c86c0e8ac2 100644 --- a/include/vcpkg/versions.h +++ b/include/vcpkg/versions.h @@ -71,6 +71,8 @@ namespace vcpkg { VersionScheme scheme; Version version; + + friend bool operator==(const SchemedVersion& lhs, const SchemedVersion& rhs); }; StringLiteral to_string_literal(VersionScheme scheme); @@ -143,6 +145,7 @@ namespace vcpkg // Try parsing with all version schemas and return 'unk' if none match VerComp compare_any(const Version& a, const Version& b); + VerComp compare_versions(const SchemedVersion& a, const SchemedVersion& b); VerComp compare_versions(VersionScheme sa, const Version& a, VersionScheme sb, const Version& b); enum class VersionConstraintKind @@ -169,6 +172,7 @@ namespace vcpkg bool try_extract_external_dot_version(ParsedExternalVersion& out, StringView version); } +VCPKG_FORMAT_WITH_TO_STRING(vcpkg::Version); +VCPKG_FORMAT_WITH_TO_STRING(vcpkg::VersionDiff); VCPKG_FORMAT_WITH_TO_STRING_LITERAL_NONMEMBER(vcpkg::VersionScheme); VCPKG_FORMAT_WITH_TO_STRING(vcpkg::VersionSpec); -VCPKG_FORMAT_WITH_TO_STRING(vcpkg::Version); diff --git a/include/vcpkg/visualstudio.h b/include/vcpkg/visualstudio.h index 82b3c2fefd..b9d8f258c2 100644 --- a/include/vcpkg/visualstudio.h +++ b/include/vcpkg/visualstudio.h @@ -25,9 +25,9 @@ namespace vcpkg namespace vcpkg::VisualStudio { - std::vector get_visual_studio_instances(const Filesystem& fs); + std::vector get_visual_studio_instances(const ReadOnlyFilesystem& fs); - ToolsetsInformation find_toolset_instances_preferred_first(const Filesystem& fs); + ToolsetsInformation find_toolset_instances_preferred_first(const ReadOnlyFilesystem& fs); } #endif diff --git a/locales/messages.cs.json b/locales/messages.cs.json index b02c301dae..f21c06368f 100644 --- a/locales/messages.cs.json +++ b/locales/messages.cs.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "integrovaný registr", "AConfigurationObject": "objekt konfigurace", "ADateVersionString": "řetězec verze data", + "ADefaultFeature": "výchozí funkce", "ADemandObject": "objekt poptávky", "ADependency": "závislost", + "ADependencyFeature": "funkce závislosti", "ADictionaryOfContacts": "slovník kontaktů", "AFeature": "funkce", + "AFeatureName": "název funkce", "AFilesystemRegistry": "registr systému souborů", "AGitObjectSha": "SHA objektu Gitu", "AGitReference": "odkaz Gitu (například větev)", @@ -44,12 +47,12 @@ "AddArtifactOnlyOne": "{command_line} může v jednu chvíli přidat jen jeden artefakt.", "AddCommandFirstArg": "První parametr, který se má přidat, musí být artefakt nebo port.", "AddFirstArgument": "Prvním argumentem pro {command_line} musí být artifact nebo port.", - "AddHelp": "Přidá označený port nebo artefakt do manifestu přidruženého k aktuálnímu adresáři.", "AddPortRequiresManifest": "'{command_line}' vyžaduje aktivní soubor manifestu.", "AddPortSucceeded": "Porty se úspěšně přidaly do souboru vcpkg.json.", "AddRecurseOption": "Pokud jste si jistí, že je chcete odebrat, spusťte příkaz s možností --recurse.", "AddTripletExpressionNotAllowed": "trojité výrazy tady nejsou povolené. Místo toho můžete změnit {package_name}:{triplet} na {package_name}.", "AddVersionAddedVersionToFile": "přidal(a) verzi {version} do cesty {path}.", + "AddVersionArtifactsOnly": "--version je jenom artefakty a nedá se použít s portem vcpkg add.", "AddVersionCommitChangesReminder": "Nezapomněli jste potvrdit změny?", "AddVersionCommitResultReminder": "Nezapomeňte potvrdit výsledek!", "AddVersionDetectLocalChangesError": "z důvodu neočekávaného formátu ve stavu výstupu git se přeskakuje zjišťování místních změn", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "soubory se změnami pro {package_name} se změnily, ale verze se neaktualizovala.", "AddVersionPortFilesShaUnchanged": "Soubory se změnami pro {package_name} se od verze {version} nezměnily.", "AddVersionPortHasImproperFormat": "{package_name} není správně naformátovaný.", - "AddVersionSuggestNewVersionScheme": "Použijte schéma verze {new_scheme} namísto \"{old_scheme}\" v \"{package_name}\" portu.\nPokud chcete tuto kontrolu zakázat, použijte --{option}.", + "AddVersionSuggestNewVersionScheme": "Na portu {package_name} použijte schéma verze {new_scheme} místo {old_scheme}.\nPokud chcete tuto kontrolu zakázat, použijte --{option}.", "AddVersionUnableToParseVersionsFile": "Nepovedlo se parsovat soubor verzí {path}.", "AddVersionUncommittedChanges": "pro {package_name} existují nepotvrzené změny.", "AddVersionUpdateVersionReminder": "Nezapomněli jste aktualizovat verzi nebo verzi portu?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} je už nainstalováno.", "AlreadyInstalledNotHead": "{spec} už je nainstalovaný – nesestavuje se z HEAD.", "AmbiguousConfigDeleteConfigFile": "Nejednoznačná konfigurace vcpkg poskytovaná manifestem i konfiguračním souborem.\n-- Odstranit konfigurační soubor {path}", + "AnArrayOfDefaultFeatures": "pole výchozích funkcí", "AnArrayOfDependencies": "pole závislostí", "AnArrayOfDependencyOverrides": "pole přepsání závislostí", + "AnArrayOfFeatures": "pole funkcí", "AnArrayOfIdentifers": "pole identifikátorů", "AnArrayOfOverlayPaths": "pole překryvných cest", "AnArrayOfOverlayTripletsPaths": "pole překryvných cest trojčat", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "Na počítači probíhá jiná instalace, která před opakováním 6 s přechází do režimu spánku.", "AppliedUserIntegration": "Pro tento kořen vcpkg byla použita integrace na úrovni uživatele.", "ApplocalProcessing": "Zpracování v místní aplikaci vcpkg: {path}", + "ArtifactsBootstrapFailed": "vcpkg-artifacts není nainstalovaný a nelze jej spustit.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts není nainstalovaný a nedá se nainstalovat, protože se předpokládá, že VCPKG_ROOT je jen pro čtení. Tento problém můžete vyřešit přeinstalací balíčku vcpkg pomocí one-lineru.", + "ArtifactsNotOfficialWarning": "Používání vcpkg-artifacts s neoficiálním ", "ArtifactsOptionIncompatibility": "--{option} nemá žádný vliv na artefakt hledání.", + "ArtifactsOptionJson": "Úplná cesta k souboru JSON, kde se zaznamenávají proměnné prostředí a další vlastnosti", + "ArtifactsOptionMSBuildProps": "Úplná cesta k souboru, do kterého se zapíší vlastnosti nástroje MSBuild.", + "ArtifactsOptionVersion": "Verze nebo rozsah verzí, které se mají shodovat; platné jenom pro artefakty", + "ArtifactsOptionVersionMismatch": "Počet přepínačů --version musí odpovídat počtu pojmenovaných artefaktů.", + "ArtifactsSwitchARM": "Vynutí detekci hostitele na ARM při získávání artefaktů", + "ArtifactsSwitchARM64": "Vynutí detekci hostitele na ARM64 při získávání artefaktů", + "ArtifactsSwitchAll": "Aktualizuje všechny známé registry artefaktů", + "ArtifactsSwitchAllLanguages": "Získá všechny jazykových souborů při získávání artefaktů", + "ArtifactsSwitchForce": "Vynutí opětovné dotazování, pokud je artefakt již získán", + "ArtifactsSwitchFreebsd": "Vynutí detekci hostitele na FreeBSD při získávání artefaktů", + "ArtifactsSwitchLinux": "Vynutí detekci hostitele na Linux při získávání artefaktů", + "ArtifactsSwitchNormalize": "Použije všechny opravy vyřazení z provozu", + "ArtifactsSwitchOnlyOneHostPlatform": "Může být nastavena pouze jedna hostitelská platforma (--x64, --x86, --arm, --arm64).", + "ArtifactsSwitchOnlyOneOperatingSystem": "Je možné nastavit jenom jeden operační systém (--windows, --osx, --linux, --freebsd).", + "ArtifactsSwitchOnlyOneTargetPlatform": "Je možné nastavit pouze jednu cílovou platformu (--target:x64, --target:x86, --target:arm, --target:arm64).", + "ArtifactsSwitchOsx": "Vynutí detekci hostitele na MacOS při získávání artefaktů", + "ArtifactsSwitchTargetARM": "Při získávání artefaktů nastaví detekci cíle na ARM", + "ArtifactsSwitchTargetARM64": "Při získávání artefaktů nastavit detekci cíle na ARM64", + "ArtifactsSwitchTargetX64": "Při získávání artefaktů nastaví detekci cíle na x64", + "ArtifactsSwitchTargetX86": "Při získávání artefaktů nastaví cíl na x86", + "ArtifactsSwitchWindows": "Vynutí detekci hostitele na Windows při získávání artefaktů", + "ArtifactsSwitchX64": "Vynutí detekci hostitele na x64 při získávání artefaktů", + "ArtifactsSwitchX86": "Vynutí detekci hostitele na x86 při získávání artefaktů", "AssetCacheProviderAcceptsNoArguments": "Neočekávané argumenty: {value} nepřijímá argumenty.", - "AssetSourcesArg": "Přidejte zdroje pro ukládání prostředků do mezipaměti. Podívejte se na téma „vcpkg help assetcaching“.", + "AssetSourcesArg": "Zdroje ukládání prostředků do mezipaměti. Viz nvcpkg help assetcaching", "AttemptingToFetchPackagesFromVendor": "Pokus o načtení tohoto počtu balíčků od {vendor}: {count}", "AttemptingToSetBuiltInBaseline": "při pokusu o nastavení předdefinovaného směrného plánu v souboru vcpkg.json při přepsání výchozího registru v souboru vcpkg-configuration.json.\nse použije výchozí registr z vcpkg-configuration.json.", "AuthenticationMayRequireManualAction": "Nejméně jeden poskytovatel přihlašovacích údajů {vendor} požádal o ruční akci. Pokud chcete povolit interaktivitu, přidejte binární zdroj interactive.", "AutoSettingEnvVar": "-- Automatické nastavení proměnných prostředí {env_var} na {url}.", "AutomaticLinkingForMSBuildProjects": "Všechny projekty MSBuild C++ teď mohou přes #include zahrnovat všechny nainstalované knihovny. Linkování se zpracuje automaticky. Při instalaci se nové knihovny okamžitě zpřístupní.", - "AvailableArchitectureTriplets": "Dostupné rutiny architektury:", + "AutomaticLinkingForVS2017AndLater": "Program Visual Studio 2017 a novější teď může přes #include zahrnovat všechny nainstalované knihovny. Propojení se zpracuje automaticky. Při instalaci se nové knihovny okamžitě zpřístupní.", "AvailableHelpTopics": "Dostupná témata nápovědy:", "AzUrlAssetCacheRequiresBaseUrl": "Neočekávané argumenty: konfigurace prostředku azurl vyžaduje základní adresu URL.", "AzUrlAssetCacheRequiresLessThanFour": "Neočekávané argumenty: konfigurace prostředku azurl vyžaduje méně než 4 argumenty.", "BaselineConflict": "Zadání vcpkg-configuration.default-registry v souboru manifestu je v konfliktu s předdefinovanými standardními hodnotami.\nOdeberte jedno z těchto konfliktních nastavení.", "BaselineFileNoDefaultField": "Základní soubor při potvrzení {commit_sha} byl neplatný (žádné pole „default“).", - "BaselineFileNoDefaultFieldPath": "soubor směrného plánu v {path} byl neplatný (žádné pole „default“)", "BaselineGitShowFailed": "Při rezervaci směrného plánu ze zápisu {commit_sha} se nepovedlo Git show versions/baseline.json. To může být opraveno načtením zápisu pomocí příkazu načtení Git.", "BaselineMissing": "Verze směrného plánu nebyla nalezena. Spusťte:\n{package_name} vcpkg x-add-version\ngit add versions\ngit commit -m \"Aktualizovat databázi verzí\"\na nastavte verzi {version} jako verzi směrného plánu.", - "BaselineMissingDefault": "Soubor baseline.json z potvrzení „{commit_sha}“ v úložišti {url} byl neplatný (neobsahoval pole „default“).", - "BinarySourcesArg": "Přidejte zdroje pro binární ukládání do mezipaměti. Další informace najdete v tématu vcpkg help binarycaching.", + "BinaryCacheVendorHTTP": "Servery HTTP", + "BinarySourcesArg": "Binární zdroje ukládání do mezipaměti. Viz vcpkg help binarycaching", "BinaryWithInvalidArchitecture": "{path}\n Očekáváno: {expected}, ale bylo {actual}", "BuildAlreadyInstalled": "{spec} je už nainstalovaný; před pokusem o sestavení prosím odeberte {spec}.", "BuildDependenciesMissing": "Příkaz sestavení vyžaduje, aby všechny závislosti byly už nainstalované.\nChybí následující závislosti:", @@ -136,7 +166,7 @@ "BuildResultSucceeded": "ÚSPĚCH", "BuildResultSummaryHeader": "SOUHRN PRO {triplet}", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(Experimentální) Zadejte kořenový adresář buildtrees.", + "BuildTreesRootDir": "Adresář Buildtrees (experimentální)", "BuildTroubleshootingMessage1": "Ujistěte se prosím, že používáte nejnovější soubory portů s git pull a vcpkg update.\nPak zkontrolujte známé problémy na:", "BuildTroubleshootingMessage2": "Nový problém můžete odeslat tady:", "BuildTroubleshootingMessage3": "Do názvu zprávy o chybě zahrňte [{package_name}] Build error, následující informace o verzi v popisu chyby a připojte všechny relevantní protokoly chyb z výše uvedených možností.", @@ -146,7 +176,7 @@ "BuildingPackage": "{spec} se setavuje…", "BuildingPackageFailed": "sestavení {spec} selhalo s: {build_result}", "BuildingPackageFailedDueToMissingDeps": "kvůli následujícím chybějícím závislostem:", - "BuiltInTriplets": "integrovaná trojčata vcpkg:", + "BuiltInTriplets": "Předdefinovaná trojčata:", "BuiltWithIncorrectArchitecture": "Následující soubory byly vytvořeny pro nesprávnou architekturu:", "CISettingsExclude": "Seznam portů, které se mají přeskočit, oddělený čárkami", "CISettingsOptCIBase": "Cesta k souboru ci.baseline.txt. Používá se k přeskočení portů a detekci regresí.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "Soubor pro výstup všech určených hodnot hash balíčků", "CISettingsOptParentHashes": "Soubor pro čtení hodnot hash balíčků pro nadřazený stav CI, aby se snížila sada změněných balíčků", "CISettingsOptSkippedCascadeCount": "Vyhodnotí, že počet příkazů --exclude a supports se přesně rovná tomuto číslu", - "CISettingsOptXUnit": "Soubor pro výstup výsledků ve formátu XUnit (interní)", - "CISettingsVerifyGitTree": "Umožňuje ověřit, že každý objekt stromu git odpovídá jeho deklarované verzi (je to velmi pomalé).", - "CISettingsVerifyVersion": "Místo chyb umožňuje vytisknout výsledek pro každý port.", - "CISwitchOptAllowUnexpectedPassing": "Udává, že výsledky „Předávání, odebrání ze seznamu selhání“ by se neměly generovat.", - "CISwitchOptDryRun": "Vytisknout plán bez provedení", - "CISwitchOptRandomize": "Náhodně uspořádat pořadí instalace", - "CISwitchOptSkipFailures": "Udává, že porty označené jako =fail v souboru ci.baseline.txt by se měly přeskočit.", - "CISwitchOptXUnitAll": "Ohlásit také nezměněné porty do výstupu XUnit (interní)", + "CISettingsOptXUnit": "Soubor pro výstup výsledků ve formátu XUnit", + "CISettingsVerifyGitTree": "Ověřuje, že každý objekt stromu git odpovídá jeho deklarované verzi (je to velmi pomalé).", + "CISettingsVerifyVersion": "Vytiskne výsledek pro každý port, nikoli jenom chyby", + "CISkipInstallation": "Následující balíčky jsou již nainstalovány a nebudou znovu sestavovány:", + "CISwitchOptAllowUnexpectedPassing": "Potlačí výsledky předávání, odebrání ze seznamu selhání", + "CISwitchOptDryRun": "Vytiskne plán bez provedení", + "CISwitchOptRandomize": "Náhodně vybere pořadí instalace", + "CISwitchOptSkipFailures": "Přeskočí porty označené jako =fail v souboru ci.baseline.txt.", + "CISwitchOptXUnitAll": "Ohlásí nezměněné porty ve výstupu XUnit", "CMakeTargetsUsage": "{package_name} poskytuje cíle CMake:", "CMakeTargetsUsageHeuristicMessage": "# toto je heuristicky generované a nemusí být správné", "CMakeToolChainFile": "Projekty CMake by měly používat: -DCMAKE_TOOLCHAIN_FILE={path}", "CMakeUsingExportedLibs": "Pokud chcete v projektech CMake používat exportované knihovny, přidejte do příkazového řádku CMake {value}.", - "CacheHelp": "Argument by měl být podřetězec, který se má vyhledat, nebo žádný argument pro zobrazení všech knihoven v mezipaměti.", "CheckedOutGitSha": "Rezervováno v Git SHA: {commit_sha}", "CheckedOutObjectMissingManifest": "Rezervovaný objekt neobsahuje soubor CONTROL nebo vcpkg.json.", "ChecksFailedCheck": "vcpkg se zhroutilo. blížší podrobnosti nejsou k dispozici.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "aktualizace vcpkg opětovným spuštěním bootstrap-vcpkg může tuto chybu vyřešit.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "Parametr --allow-unexpected-passing lze použít pouze v případě, že je směrný plán poskytnut prostřednictvím parametru --ci-baseline.", "CiBaselineDisallowedCascade": "REGRESE: {spec} kaskádovité, ale je nutný úspěch. ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "REGRESE: Nezávislá specifikace {spec} selhala s {build_result}.", "CiBaselineRegression": "REGRESE: Akce {spec} selhala s výsledkem: {build_result}. Pokud se to očekávalo, přidejte {spec}=fail do cesty {path}.", "CiBaselineRegressionHeader": "REGRESE:", + "CiBaselineUnexpectedFail": "REGRESSION: {spec} je označen jako neúspěšný, ale pro {triplet} se nepodporuje.", + "CiBaselineUnexpectedFailCascade": "REGRESE: {spec} je označena jako neúspěšná, ale jedna závislost se pro {triplet} nepodporuje.", "CiBaselineUnexpectedPass": "PŘEDÁVÁNÍ, ODEBRAT ZE SEZNAMU SELHÁNÍ: {spec} ({path}).", "ClearingContents": "Mazání obsahu cesty {path}.", "CmakeTargetsExcluded": "poznámka: Nezobrazuje se tento počet dalších cílů: {count}.", - "CmdAddVersionOptAll": "Verze procesu pro všechny porty.", - "CmdAddVersionOptOverwriteVersion": "Přepsat git-tree existující verze.", - "CmdAddVersionOptSkipFormatChk": "Přeskočí kontrolu formátování souborů vcpkg.json.", - "CmdAddVersionOptSkipVersionFormatChk": "Přeskočí kontrolu formátu verze.", - "CmdAddVersionOptVerbose": "Vytisknout zprávy o úspěchu místo o chybách.", + "CmdAcquireExample1": "vcpkg acquire ", + "CmdAcquireProjectSynopsis": "Získá všechny artefakty, na které odkazuje manifest", + "CmdAcquireSynopsis": "Získá pojmenovaný artefakt.", + "CmdActivateSynopsis": "Aktivuje artefakty z manifestu", + "CmdAddExample1": "vcpkg add port ", + "CmdAddExample2": "přidat artefakt vcpkg ", + "CmdAddSynopsis": "Přidá závislost do manifestu", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "Zpracuje verze pro všechny porty", + "CmdAddVersionOptOverwriteVersion": "Přepíše git-tree existující verze", + "CmdAddVersionOptSkipFormatChk": "Přeskočí kontrolu formátování souborů vcpkg.json", + "CmdAddVersionOptSkipVersionFormatChk": "Přeskočí kontrolu formátu verze", + "CmdAddVersionOptVerbose": "Vytiskne zprávy o úspěchu, nikoli pouze chyby", + "CmdAddVersionSynopsis": "Přidá verzi do databáze verzí", + "CmdBootstrapStandaloneSynopsis": "Spustí kořen vcpkg jenom z binárního souboru vcpkg.", + "CmdBuildExample1": "sestavení vcpkg ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "Vytvoří port z cesty", + "CmdBuildSynopsis": "Vytvoří port", + "CmdCacheExample1": "vcpkg cache ", + "CmdCacheSynopsis": "Výpis specifikace balíčků", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "Testuje, jestli je port podporovaný bez jeho sestavení", + "CmdCiCleanSynopsis": "Vymaže všechny soubory a připraví se na spuštění CI", + "CmdCiSynopsis": "Pokusí se sestavit všechny porty pro testování CI", + "CmdCiVerifyVersionsSynopsis": "Zkontroluje integritu databáze verzí", "CmdContactOptSurvey": "Spustit výchozí prohlížeč pro aktuální průzkum vcpkg", - "CmdDependInfoOptDGML": "Vytvoří graf na základě dgml.", - "CmdDependInfoOptDepth": "Zobrazit hloubku rekurze ve výstupu", - "CmdDependInfoOptDot": "Vytvoří graf na základě dot", - "CmdDependInfoOptMaxRecurse": "Nastavit maximální hloubku rekurze, hodnota -1 udává hloubku bez omezení", - "CmdDependInfoOptSort": "Nastavit pořadí řazení pro seznam závislostí, přípustné hodnoty jsou: lexikografické, topologické (výchozí), x-tree, obrácené", - "CmdEditOptAll": "Otevřít editor na portu i v podsložce stromu buildu specifické pro port", - "CmdEditOptBuildTrees": "Otevřít editor v podsložce stromu buildu specifické pro port", - "CmdEnvOptions": "Přidat nainstalovanou cestu {path} do {env_var}", - "CmdExportOpt7Zip": "Exportovat do souboru 7zip (.7z)", - "CmdExportOptChocolatey": "Exportovat balíček Chocolatey (experimentální funkce)", + "CmdCreateExample1": "vcpkg create ", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create ", + "CmdDeactivateSynopsis": "Odebere všechny aktivace artefaktů z aktuálního prostředí", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "Byly zadány konfliktní formáty. Přijímá se jenom jedna z těchto hodnot: --format, --dgml nebo --dot.", + "CmdDependInfoFormatHelp": "Zvolí výstupní formát, jeden z těchto formátů: list, tree, mermaid, dot nebo dgml", + "CmdDependInfoFormatInvalid": "--format={value} není rozpoznaný formát. Argument --format musí být list, tree, mermaid, dot nebo dgml.", + "CmdDependInfoOptDepth": "Zobrazuje hloubku rekurze ve výstupu list", + "CmdDependInfoOptMaxRecurse": "Nastaví maximální hloubku rekurze. Výchozí hodnota není nijak omezena", + "CmdDependInfoOptSort": "Zvolí pořadí řazení pro formát list, jeden z lexicographical, topological (výchozí), reverse.", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth se dá použít jenom s formáty list a tree.", + "CmdDependInfoXtreeTree": "--sort=x-tree nejde použít s jinými formáty než strom", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Stáhne soubor", + "CmdEditExample1": "vcpkg edit ", + "CmdEditOptAll": "Otevře editor na portu i v podsložce stromu buildu specifické pro port", + "CmdEditOptBuildTrees": "Otevře editor v podsložce stromu buildu specifické pro port", + "CmdEnvOptions": "Přidá nainstalovanou cestu {path} do {env_var}.", + "CmdExportEmptyPlan": "Odmítnutí vytvořit export nulových balíčků. Před exportem nainstalujte balíčky.", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", + "CmdExportOpt7Zip": "Exportuje do souboru 7zip (.7z).", + "CmdExportOptChocolatey": "Exportuje balíček Chocolatey (experimentální)", "CmdExportOptDebug": "Povolit předběžné ladění", - "CmdExportOptDryRun": "Doopravdy neexportovat.", - "CmdExportOptIFW": "Exportovat do instalačního programu založeného na IFW", - "CmdExportOptInstalled": "Exportovat všechny nainstalované balíčky", - "CmdExportOptMaven": "Povolit Maven", - "CmdExportOptNuget": "Exportovat balíček NuGet", - "CmdExportOptPrefab": "Exportovat do formátu Prefab", - "CmdExportOptRaw": "Exportovat do nekomprimovaného adresáře", - "CmdExportOptZip": "Exportovat do souboru ZIP", - "CmdExportSettingChocolateyMaint": "Zadejte správce exportovaného balíčku Chocolatey (experimentální funkce).", - "CmdExportSettingChocolateyVersion": "Zadejte příponu verze, kterou chcete přidat pro exportovaný balíček Chocolatey (experimentální funkce).", - "CmdExportSettingConfigFile": "Zadejte cestu k dočasnému souboru pro konfiguraci instalačního programu.", - "CmdExportSettingInstallerPath": "Zadejte cestu k souboru pro exportovaný instalační program.", - "CmdExportSettingNugetDesc": "Zadejte popis exportovaného balíčku NuGet.", - "CmdExportSettingNugetID": "Zadejte ID exportovaného balíčku NuGet (přepíše --output).", - "CmdExportSettingNugetVersion": "Zadejte verzi exportovaného balíčku NuGet.", - "CmdExportSettingOutput": "Zadejte název výstupu (slouží k vytvoření názvu souboru).", - "CmdExportSettingOutputDir": "Zadat výstupní adresář pro vytvořené artefakty", - "CmdExportSettingPkgDir": "Zadejte cestu k dočasnému adresáři pro znovu zabalené balíčky.", + "CmdExportOptDryRun": "Ve skutečnosti neexportuje", + "CmdExportOptIFW": "Exportuje do instalačního programu založeného na IFW", + "CmdExportOptInstalled": "Exportuje všechny nainstalované balíčky", + "CmdExportOptMaven": "Povolí Maven", + "CmdExportOptNuget": "Exportuje balíček NuGet", + "CmdExportOptPrefab": "Exportuje do formátu Prefab", + "CmdExportOptRaw": "Exportuje do nekomprimovaného adresáře", + "CmdExportOptZip": "Exporty do souboru ZIP", + "CmdExportSettingChocolateyMaint": "Správce exportovaného balíčku Chocolatey (experimentální)", + "CmdExportSettingChocolateyVersion": "Přípona verze, kterou chcete přidat pro exportovaný balíček Chocolatey (experimentální)", + "CmdExportSettingConfigFile": "Cesta k dočasnému souboru pro konfiguraci instalačního programu", + "CmdExportSettingInstallerPath": "Cesta k souboru pro exportovaný instalační program", + "CmdExportSettingNugetDesc": "Popis exportovaného balíčku NuGet", + "CmdExportSettingNugetID": "ID exportovaného balíčku NuGet (přepíše --output)", + "CmdExportSettingNugetVersion": "Verze exportovaného balíčku NuGet.", + "CmdExportSettingOutput": "Název výstupu (slouží k sestavení názvu souboru)", + "CmdExportSettingOutputDir": "Výstupní adresář pro vytvořené artefakty", + "CmdExportSettingPkgDir": "Cesta k dočasnému adresáři pro znovu zabalené balíčky", "CmdExportSettingPrefabArtifactID": "ID artefaktu je název projektu podle specifikací Maven", "CmdExportSettingPrefabGroupID": "GroupId jednoznačně identifikuje váš projekt podle specifikací Maven.", "CmdExportSettingPrefabVersion": "Verze je název projektu podle specifikací Maven.", - "CmdExportSettingRepoDir": "Zadejte cestu k adresáři pro exportované úložiště.", - "CmdExportSettingRepoURL": "Zadejte adresu URL vzdáleného úložiště pro online instalační program.", + "CmdExportSettingRepoDir": "Cesta k adresáři pro exportované úložiště", + "CmdExportSettingRepoURL": "Adresa URL vzdáleného úložiště pro online instalační program", "CmdExportSettingSDKMinVersion": "Minimální podporovaná verze sady SDK pro Android", - "CmdExportSettingSDKTargetVersion": "Cílová verze sady Sdk pro Android.", - "CmdFetchOptXStderrStatus": "Přímé zprávy o stavu nebo stahování do stderr místo stdout (Chyby nebo selhání jdou stále na stdout)", - "CmdFormatManifestOptAll": "Naformátovat soubory manifestu všech portů.", - "CmdFormatManifestOptConvertControl": "Převést soubory CONTROL na soubory manifestu.", - "CmdGenerateMessageMapOptNoOutputComments": "Při generování mapy zpráv vyloučit komentáře (užitečné pro generování souboru s anglickou lokalizací)", - "CmdInfoOptInstalled": "(experimentální) Hlásit nainstalované balíčky místo dostupných", - "CmdInfoOptTransitive": "(experimentální) Vytvořit sestavu také o závislostech nainstalovaných balíčků", - "CmdNewOptApplication": "Vytvořit manifest aplikace (nevyžaduje název ani verzi).", - "CmdNewOptSingleFile": "Vložit soubor vcpkg-configuration.json do souboru vcpkg.json.", - "CmdNewOptVersionDate": "Interpretovat --version jako datum ISO 8601. (RRRR-MM-DD)", - "CmdNewOptVersionRelaxed": "Interpretovat --version jako uvolněnou číselnou verzi. (Nezáporná čísla oddělená tečkami).", - "CmdNewOptVersionString": "Interpretovat --version jako řetězec bez chování řazení.", - "CmdNewSettingName": "Název nového manifestu.", - "CmdNewSettingVersion": "Verze nového manifestu.", - "CmdRegenerateOptDryRun": "ve skutečnosti tuto akci neprovádí, zobrazuje jenom to, co by se provedlo", - "CmdRegenerateOptForce": "pokračuje (potenciálně nebezpečnou) akcí bez potvrzení", - "CmdRegenerateOptNormalize": "použít jakékoli opravy vyřazení z provozu", - "CmdRemoveOptDryRun": "Vytisknout balíčky, které se mají odebrat, ale neodebírat je", - "CmdRemoveOptOutdated": "Vybrat všechny balíčky s verzemi, které neodpovídají souborům portů", - "CmdRemoveOptRecurse": "Povolit odebrání balíčků, které nejsou explicitně zadané na příkazovém řádku", - "CmdSetInstalledOptDryRun": "Doopravdy nevytvářet ani neinstalovat", - "CmdSetInstalledOptNoUsage": "Po instalaci netisknout informace o využití CMake.", - "CmdSetInstalledOptWritePkgConfig": "Zapíše soubor ve formátu NuGet packages.config pro použití s externím binárním ukládáním do mezipaměti.\nDalší informace najdete v vcpkg help binarycaching.", + "CmdExportSettingSDKTargetVersion": "Cílová verze sady SDK pro Android", + "CmdExportSynopsis": "Vytvoří samostatné nasazení nainstalovaných portů", + "CmdFetchOptXStderrStatus": "Vytiskne zprávy o stavu nebo stahování do stderr místo stdout (Chyby nebo selhání jdou stále na stdout)", + "CmdFetchSynopsis": "Načte něco ze systému nebo z internetu", + "CmdFindExample1": "vcpkg find port ", + "CmdFindExample2": "vcpkg find artifact ", + "CmdFindSynopsis": "Najde port nebo artefakt, který může být nainstalován nebo aktivován", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "Formátuje soubory manifestu všech portů", + "CmdFormatManifestOptConvertControl": "Převede soubory CONTROL na soubory manifestu", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "Generuje soubory msbuild .props, jako by aktivoval závislosti artefaktu manifestu, aniž by je získal.", + "CmdGenerateMessageMapOptNoOutputComments": "Vyloučí komentáře při generování mapy zpráv (užitečné pro generování anglického lokalizačního souboru).", + "CmdHashExample1": "vcpkg hash ", + "CmdHashExample2": "vcpkg hash SHA256", + "CmdHashSynopsis": "Získá SHA256 nebo SHA512 souboru", + "CmdHelpCommandSynopsis": "Zobrazí podrobnosti nápovědy pro ", + "CmdHelpCommands": "nápověda ", + "CmdHelpCommandsSynopsis": "Zobrazí úplný seznam příkazů, včetně výjimečných příkazů, které tu nejsou uvedené.", + "CmdHelpTopic": "nápověda ", + "CmdInfoOptInstalled": "(experimentální) Hlásí nainstalované balíčky, nikoli dostupné", + "CmdInfoOptTransitive": "(experimentální) Také vytváří sestavy závislosti nainstalovaných balíčků", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Vytvoří prázdný registr Gitu", + "CmdInstallExample1": "vcpkg install ...", + "CmdIntegrateSynopsis": "Integruje vcpkg s počítači, projekty nebo prostředími", + "CmdListExample2": "vcpkg list ", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "Vytvoří manifest aplikace (nevyžaduje název ani verzi).", + "CmdNewOptSingleFile": "Vloží soubor vcpkg-configuration.json do souboru vcpkg.json", + "CmdNewOptVersionDate": "Interpretuje --version jako datum ISO 8601. (RRRR-MM-DD)", + "CmdNewOptVersionRelaxed": "Interpretuje --version jako uvolněnou číselnou verzi (Nezáporná čísla oddělená tečkami).", + "CmdNewOptVersionString": "Interpretuje --version jako řetězec bez chování řazení.", + "CmdNewSettingName": "Název nového manifestu", + "CmdNewSettingVersion": "Verze nového manifestu", + "CmdNewSynposis": "Vytvoří nový manifest", + "CmdOwnsExample1": "vcpkg owns ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "Rozdílové změny ve verzích portů mezi potvrzeními", + "CmdRegenerateOptDryRun": "Ve skutečnosti tuto akci neprovádí, zobrazuje jenom to, co by se provedlo", + "CmdRegenerateOptForce": "Pokračuje (potenciálně nebezpečnou) akcí bez potvrzení", + "CmdRegenerateOptNormalize": "Použije všechny opravy vyřazení z provozu", + "CmdRemoveExample1": "vcpkg remove ...", + "CmdRemoveOptDryRun": "Vytiskne balíčky, které se mají odebrat, ale neodebere je", + "CmdRemoveOptOutdated": "Odebere všechny balíčky s verzemi, které neodpovídají integrovanému registru", + "CmdRemoveOptRecurse": "Umožňuje odebrání závislých balíčků, které nejsou explicitně zadané", + "CmdSearchExample1": "vcpkg search ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "Ve skutečnosti se nesestavuje ani neinstaluje", + "CmdSetInstalledOptNoUsage": "Po instalaci netisknout informace o využití CMake", + "CmdSetInstalledOptWritePkgConfig": "Zapíše soubor ve formátu NuGet packages.config pro použití s externí binární mezipamětí. Další informace najdete v vcpkg help binarycaching", + "CmdSetInstalledSynopsis": "Nainstaluje, upgraduje nebo odebere balíčky tak, aby nainstalované balíčky odpovídaly přesně dodaným balíčkům", "CmdSettingCopiedFilesLog": "Cesta k zkopírovaným souborům protokolu, který se má vytvořit.", "CmdSettingInstalledDir": "Cesta k nainstalovanému stromu, který se má použít.", "CmdSettingTLogFile": "Cesta k souboru tlog, který se má vytvořit.", "CmdSettingTargetBin": "Cesta k binárnímu souboru, který se má analyzovat.", - "CmdUpdateBaselineOptDryRun": "Vytisknout plán bez provedení", - "CmdUpdateBaselineOptInitial": "přidat builtin-baseline do souboru vcpkg.json, který ho ještě nemá", - "CmdUpgradeOptAllowUnsupported": "Místo chyby na nepodporovaném portu pokračovat upozorněním.", + "CmdUpdateBaselineOptDryRun": "Vytiskne plán bez provedení", + "CmdUpdateBaselineOptInitial": "Přidá builtin-baseline do souboru vcpkg.json, který ho ještě nemá", + "CmdUpdateBaselineSynopsis": "Aktualizuje standardní hodnoty registrů Git v manifestu na potvrzení HEAD těchto registrů", + "CmdUpdateRegistryAll": "Aktualizuje všechny známé registry artefaktů", + "CmdUpdateRegistryAllExcludesTargets": "Aktualizovat registr --all se nedá použít se seznamem registrů artefaktů", + "CmdUpdateRegistryAllOrTargets": "Aktualizace registru vyžaduje k aktualizaci buď seznam názvů registru artefaktů, nebo identifikátory URI, nebo --all.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "Znovu stáhne registr artefaktů", "CmdUpgradeOptNoDryRun": "Doopravdy upgradovat", "CmdUpgradeOptNoKeepGoing": "Zastavit instalaci balíčků při selhání", + "CmdUseExample1": "vcpkg use ", + "CmdUseSynopsis": "Aktivace jednoho artefaktu v tomto prostředí", + "CmdVSInstancesSynopsis": "Vypíše zjištěné instance sady Visual Studio", "CmdXDownloadOptHeader": "Další hlavička, která se má použít při načítání z adres URL", "CmdXDownloadOptSha": "Hodnota hash souboru, který se má stáhnout", - "CmdXDownloadOptSkipSha": "Nekontrolovat SHA512 staženého souboru", - "CmdXDownloadOptStore": "Udává, že soubor by se měl uložit, místo aby se načetl", + "CmdXDownloadOptSkipSha": "Přeskočí kontrolu SHA512 staženého souboru.", + "CmdXDownloadOptStore": "Uloží soubor tak, aby se nenačetl", "CmdXDownloadOptUrl": "Adresa URL, která se má stáhnout a uložit, pokud v mezipaměti chybí", + "CmdZApplocalSynopsis": "Zkopíruje závislosti binárního souboru z nainstalovaného stromu do umístění tohoto binárního souboru pro nasazení app-local.", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "Počet úvodních adresářů, které se mají odstranit ze všech cest", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", "CommandFailed": "Příkaz:\n{command_line}\nselhal s následujícími výsledky:", - "Commands": "Příkazy:", - "CommunityTriplets": "Trojčata komunity VCPKG:", + "CommunityTriplets": "Trojčata komunity:", "ComparingUtf8Decoders": "Porovnání kodérů Utf8Decoder s různými původy; toto je vždy chyba", "CompressFolderFailed": "Nepovedlo se zkomprimovat složku „{path}“:", "ComputingInstallPlan": "Počítá se plán instalace…", "ConfigurationErrorRegistriesWithoutBaseline": "Konfigurace definovaná v cestě {path} je neplatná.\n\n Použití registrů vyžaduje, aby byl pro výchozí registr nastaven směrný plán nebo aby výchozí registr byl null.\n\n Další podrobnosti najdete na adrese {url}.", "ConfigurationNestedDemands": "[\"{json_field}\"] obsahuje vnořený objekt demands (vnořené demands nemají žádný účinek).", "ConflictingFiles": "Následující soubory jsou už nainstalované v {path} a jsou v konfliktu s {spec}.", + "ConsideredVersions": "Následující spustitelné soubory byly zvažovány, ale byly vyřazeny, protože je vyžadována verze {version}:", "ConstraintViolation": "Bylo nalezeno porušení omezení:", "ContinueCodeUnitInStart": "našla se jednotka kódu pro pokračování na počáteční pozici", "ControlAndManifestFilesPresent": "V adresáři portů existuje jak soubor manifestu, tak soubor CONTROL: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "Databáze je poškozena.", "CorruptedInstallTree": "Strom vcpkg installed je poškozený.", "CouldNotDeduceNugetIdAndVersion": "Nepovedlo se odvodit ID a verzi NuGet z názvu souboru: {path}", - "CouldNotFindBaseline": "V souboru standardní hodnoty {path} se nepovedlo najít explicitně zadanou standardní hodnotu {commit_sha}.", - "CouldNotFindBaselineForRepo": "Nepovedlo se najít standardní hodnotu {commit_sha} pro úložiště {package_name}.", - "CouldNotFindBaselineInCommit": "V potvrzení {commit_sha} z úložiště {package_name} se nepovedlo najít standardní hodnotu:", + "CouldNotFindBaselineInCommit": "Nepovedlo se najít směrný plán v adrese {url} na {commit_sha} pro {package_name}.", "CouldNotFindGitTreeAtCommit": "Nepovedlo se najít strom Git pro „versions“ v úložišti {package_name} při potvrzení {commit_sha}.", "CouldNotFindToolVersion": "V {path} se nepovedlo najít v {path}.", "CouldNotFindVersionDatabaseFile": "Nepovedlo se najít soubor databáze verzí: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "Proměnná prostředí VCPKG_DEFAULT_BINARY_CACHE musí být adresář (byla: {path}).", "DefaultBinaryCacheRequiresAbsolutePath": "Proměnná prostředí VCPKG_DEFAULT_BINARY_CACHE musí být absolutní (byla: {path}).", "DefaultBinaryCacheRequiresDirectory": "Proměnná prostředí VCPKG_DEFAULT_BINARY_CACHE musí být adresář (byla: {path}).", - "DefaultBrowserLaunched": "Výchozí prohlížeč spuštěný pro {url}", + "DefaultFeatureCore": "funkce core vypne výchozí funkce, a proto nemůže být v seznamu výchozích funkcí.", + "DefaultFeatureDefault": "funkce default odkazuje na sadu výchozích funkcí, a proto nemůže být v seznamu výchozích funkcí.", + "DefaultFeatureIdentifier": "názvy výchozích funkcí musí být identifikátory.", "DefaultFlag": "Nastavuje se výchozí hodnota --{option}.", "DefaultRegistryIsArtifact": "Výchozí registr nemůže být registr artefaktů.", - "DefaultTriplet": "Od verze ze září 2023 se výchozí triplet pro knihovny vcpkg změní z x86-windows na zjištěný hostitelský triplet ({triplet}). Pokud chcete tuto zprávu vyřešit, přidejte --triplet x86-windows, aby se zachovalo stejné chování.", + "DefaultTripletChanged": "Ve verzi ze září 2023 se výchozí triplety knihoven vcpkg změnily z formátu x86-windows na zjištěný hostitelský triplet ({triplet}). Pro původní chování přidejte --triplet x86-windows. Pokud chcete tuto zprávu potlačit, přidejte --triplet {triplet}.", "DeleteVcpkgConfigFromManifest": "-- Nebo odeberte vcpkg-configuration ze souboru manifestu {path}.", + "DependencyFeatureCore": "funkce core nemůže být v seznamu funkcí závislosti. Pokud chcete vypnout výchozí funkce, přidejte místo toho default-features: false.", + "DependencyFeatureDefault": "funkce default nemůže být v seznamu funkcí závislosti. Pokud chcete zapnout výchozí funkce, přidejte místo toho default-features: true.", + "DependencyGraphCalculation": "Odesílání grafu závislostí je povolené.", + "DependencyGraphFailure": "Odeslání grafu závislostí se nezdařilo.", + "DependencyGraphSuccess": "Odeslání grafu závislostí proběhlo úspěšně.", "DeprecatedPrefabDebugOption": "--prefab-debug je teď zastaralý.", "DetectCompilerHash": "Rozpoznává se hodnota hash kompilátoru pro triplet {triplet}...", "DocumentedFieldsSuggestUpdate": "Pokud se jedná o zdokumentovaná pole, která by se měla rozpoznat, zkuste aktualizovat nástroj vcpkg.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "Soubor nemá očekávanou hodnotu hash:\nurl: {url}\nSoubor: {path}\nOčekávaná hodnota hash: {expected}\nSkutečná hodnota hash: {actual}", "DownloadFailedRetrying": "Stahování se nezdařilo – opakuje se pokus za {value}ms.", "DownloadFailedStatusCode": "{url}: neúspěšné: stavový kód {value}", - "DownloadRootsDir": "Zadejte kořenový adresář pro stahování.\n(výchozí: {env_var})", + "DownloadRootsDir": "Stáhne adresář (výchozí: {env_var})", "DownloadWinHttpError": "{url}: {system_api} selhalo s ukončovacím kódem {exit_code}.", "DownloadedSources": "Stažené zdroje pro {spec}", "DownloadingPortableToolVersionX": "Nenašla se vhodná verze {tool_name} (požadovánA v{version}) Stahuje se přenosný {tool_name} {version}...", "DownloadingTool": "Stahuje se {tool_name}...\n{url}->{path}", "DownloadingUrl": "Stahuje se adresa {url}.", - "DownloadingVcpkgCeBundle": "Stahuje se sada vcpkg-artifacts {verze}", - "DownloadingVcpkgCeBundleLatest": "Stahuje se nejnovější sada vcpkg-artifacts", "DownloadingVcpkgStandaloneBundle": "Stahuje se samostatná sada {version}.", "DownloadingVcpkgStandaloneBundleLatest": "Stahuje se nejnovější samostatná sada.", "DuplicatePackagePattern": "{package_name} balíčku je duplicitní.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "při zjišťování informací o kompilátoru:\nObsah souboru protokolu v { path} je:", "ErrorIndividualPackagesUnsupported": "V režimu manifestu nástroj vcpkg install nepodporuje jednotlivé argumenty balíčku.\nPokud chcete nainstalovat další balíčky, upravte soubor vcpkg.json a pak spusťte příkaz vcpkg install bez argumentů balíčku.", "ErrorInvalidClassicModeOption": "Možnost --{option} se klasickém režimu podporuje a nenašel se žádný manifest.", + "ErrorInvalidExtractOption": "Parametr --{option} musí být nastaven na nezáporné celé číslo nebo hodnotu „AUTO“.", "ErrorInvalidManifestModeOption": "Možnost --{option} se v režimu manifestu nepodporuje.", "ErrorMessage": "chyba: ", "ErrorMessageMustUsePrintError": "Zpráva s názvem {value} začíná chybou: je nutné ji změnit tak, aby místo ní byla předřazená ErrorMessage.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "Při parsování cesty {path} došlo k chybám.", "ErrorWhileWriting": "Při zápisu {path} došlo k chybě.", "ErrorsFound": "Byly nalezeny následující chyby:", - "Example": "příklad:", + "ExamplesHeader": "Příklady:", "ExceededRecursionDepth": "Byla překročena hloubka rekurze.", "ExcludedPackage": "Vyloučené {spec}", "ExcludedPackages": "Následující balíčky jsou vyloučeny:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Exportuje se nástroj pro údržbu...", "ExportingPackage": "Exportuje se {package_name}...", "ExtendedDocumentationAtUrl": "Rozšířená dokumentace je k dispozici na adrese {url}.", + "ExtractHelp": "Extrahuje archiv.", "ExtractingTool": "Extrahování {tool_name}...", "FailedPostBuildChecks": "Našel se tento počet problémů po kontrole sestavení: {count}. Pokud chcete odeslat tyto porty do kurátorovaných katalogů, nejprve opravte soubor portu: {path}", "FailedToAcquireMutant": "nepovedlo se získat mutantní {path}", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "Nepodařilo se určit aktuální zápis:", "FailedToDownloadFromMirrorSet": "Nepovedlo se stáhnout ze zrcadlené sady", "FailedToExtract": "{path} se nepodařilo extrahovat:", - "FailedToFetchError": "{error_msg}\nNepovedlo se načíst {package_name}:", - "FailedToFindBaseline": "Nepovedlo se najít baseline.json.", + "FailedToFetchRepo": "Nepovedlo se načíst adresu {url}.", "FailedToFindPortFeature": "{package_name} nezahrnuje žádnou funkci s názvem {feature}.", "FailedToFormatMissingFile": "Nejsou k dispozici žádné soubory k formátování.\nPředejte prosím buď --all, nebo explicitní soubory, které se mají formátovat nebo převést.", "FailedToLoadInstalledManifest": "Soubor ovládacího prvku nebo manifestu pro {package_name} nelze načíst z důvodu následující chyby. Odeberte prosím {package_name} a zkuste to znovu.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "Nepovedlo se uzamknout systém souborů na {path}.", "FailedToWriteManifest": "Nepovedlo se zapsat soubor manifestu {path}", "FailedVendorAuthentication": "Ověření nejméně jednoho zprostředkovatele přihlašovacích údajů {vendor} se nepovedlo. Další podrobnosti o tom, jak zadat přihlašovací údaje, najdete adrese {url}.", - "FeedbackAppreciated": "Děkujeme vám za váš názor!", "FetchingBaselineInfo": "Načítá se informace o směrném plánu z {package_name}...", "FetchingRegistryInfo": "Načítá se informace registru z adresy {url} ({value})...", "FieldKindDidNotHaveExpectedValue": "„druh“ neměl očekávanou hodnotu: (očekávala se jedna z těchto hodnot: {expected}; nalezená hodnota: {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "V následujících souborech byly nalezeny absolutní cesty:", "FilesExported": "Soubory exportované v: {path}", "FindHelp": "Vyhledá označený artefakt nebo port. Když za „artifact“ nebo „port“ nebude žádný parametr, zobrazí se všechno.", + "FindVersionArtifactsOnly": "--version se nedá použít s hledáním vcpkg nebo vcpkg vyhledávacím portem.", "FishCompletion": "Dokončení vcpkg fish je už přidáno do {path}.", "FloatingPointConstTooBig": "Konstanta čísla s plovoucí desetinnou čárkou je příliš velká: {count}", "FollowingPackagesMissingControl": "Následující balíčky nemají platnou hodnotu CONTROL nebo vcpkg.json:", "FollowingPackagesNotInstalled": "Následující balíčky nejsou nainstalovány:", "FollowingPackagesUpgraded": "Následující balíčky jsou aktuální:", + "ForMoreHelp": "Další pomoc", "ForceSystemBinariesOnWeirdPlatforms": "Proměnná prostředí VCPKG_FORCE_SYSTEM_BINARIES musí být nastavená na platformách arm, s390x, ppc64le a riscv.", "FormattedParseMessageExpression": "výraz on: {value}", "GHAParametersMissing": "Binární zdroj GHA vyžaduje nastavení proměnných prostředí ACTIONS_RUNTIME_TOKEN a ACTIONS_CACHE_URL. Podrobnosti najdete na adrese {url}.", @@ -470,7 +590,7 @@ "GitCommandFailed": "spuštění příkazu se nepovedlo: {command_line}", "GitFailedToFetch": "Nepovedlo se načíst referenční {value} z {url} úložiště.", "GitFailedToInitializeLocalRepository": "Nepovedlo se inicializovat místní úložiště {path}.", - "GitRegistryMustHaveBaseline": "Položka registru Git pro {package_name} musí mít pole „standardní hodnoty“, které je platné SHA potvrzení gitu (40 šestnáctkových znaků).\nAktuální HEAD tohoto úložiště je {value}.", + "GitRegistryMustHaveBaseline": "Registr Git {url} musí mít pole ‚baseline‘, které je platným kódem SHA potvrzení Gitu (40 šestnáctkových znaků).\nPokud chcete použít aktuální nejnovější verze, nastavte směrný plán na HEAD úložiště {commit_sha}.", "GitStatusOutputExpectedFileName": "očekával se název souboru", "GitStatusOutputExpectedNewLine": "očekával se nový řádek", "GitStatusOutputExpectedRenameOrNewline": "očekával se přejmenovaný soubor nebo nové řádky", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "Git vytvořil neočekávaný výstup při spuštění {command_line}.", "GraphCycleDetected": "V grafu byl zjištěn cyklus v {package_name}:", "HashFileFailureToRead": "Nepodařilo se přečíst soubor {path} pro hashování: ", + "HashPortManyFiles": "{package_name} obsahuje {count} souborů. Použití algoritmů hash u tohoto obsahu při určování hodnoty hash ABI pro ukládání binárních dat do mezipaměti může trvat dlouho. Zvažte snížení počtu souborů. Častou příčinou je náhodné zahrnutí zdrojových nebo buildovacích souborů do adresáře portu.", "HeaderOnlyUsage": "{package_name} je jenom hlavička a dá se použít z CMake přes:", "HelpAssetCaching": "**Experimentální funkce: může se změnit nebo odebrat bez upozornění.**\n\nVcpkg může ukládat stažené prostředky do mezipaměti pomocí zrcadlení a zajistit tak plynulý provoz i v případě, že se původní zdroj změní nebo zmizí.\n\nUkládání prostředků do mezipaměti je možné nakonfigurovat buď nastavením proměnné prostředí X_VCPKG_ASSET_SOURCES na seznam zdrojů oddělený středníky, nebo předáním posloupnosti možností příkazového řádku --x-asset-sources=. Zdroje příkazového řádku se interpretují po zdrojích prostředí. Čárky, středníky a obrácené čárky je možné uvozovat pomocí obrácené čárky (`).\n\nVolitelný parametr pro určité řetězce určuje, jak se k nim bude přistupovat. Je možné ho zadat jako read, write nebo readwrite s výchozí hodnotou read.\n\nPlatné zdroje:", "HelpAssetCachingAzUrl": "Přidá zdroj Azure Blob Storage, volitelně pomocí ověření sdíleného přístupového podpisu. Adresa URL by měla obsahovat cestu ke kontejneru a měla by končit koncovým znakem /. , pokud je definován, by měl mít předponu ?. Servery mimo Azure budou fungovat také v případě, že reagují na žádosti GET a PUT ve tvaru: .", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "Určuje časový limit služby NuGet pro síťové operace NuGet. Je ekvivalentem parametru -Timeout rozhraní příkazového řádku NuGet.", "HelpBuiltinBase": "Směrný plán odkazuje na potvrzení v úložišti vcpkg, které určuje minimální verzi každé závislosti v grafu. Pokud například nejsou zadána žádná jiná omezení (přímo nebo přechodně), bude verze přeložena na směrný plán manifestu nejvyšší úrovně. Směrné plány přechodných závislostí se ignorují.", "HelpCachingClear": "Odebere všechny předchozí zdroje včetně výchozích.", - "HelpContactCommand": "Umožňuje zobrazit kontaktní informace pro odeslání názoru.", - "HelpCreateCommand": "Vytvořte nový port.", - "HelpDependInfoCommand": "Zobrazí seznam závislostí pro porty.", - "HelpEditCommand": "Otevřete port pro úpravy (pomocí proměnné prostředí {env_var} nastavte program editoru, výchozí hodnota je code).", - "HelpEnvCommand": "Vytvoří čisté prostředí pro vývoj nebo kompilaci.", - "HelpExampleCommand": "Další nápovědu (včetně příkladů) najdete v doprovodné složce README.md a docs.", + "HelpContactCommand": "Zobrazí kontaktní informace pro odeslání názoru", + "HelpCreateCommand": "Vytvoří nový port", + "HelpDependInfoCommand": "Zobrazí seznam závislostí pro porty", + "HelpEditCommand": "Upraví port, volitelně s {env_var}, výchozí hodnota je code", + "HelpEnvCommand": "Vytvoří čisté prostředí pro vývoj nebo kompilaci", + "HelpExampleCommand": "Další nápovědu (včetně příkladů) najdete na https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Ukázkový manifest:", "HelpExportCommand": "Exportuje balíček.", - "HelpFormatManifestCommand": "Formátuje všechny soubory vcpkg.json. Před potvrzením do vcpkg spusťte tento příkaz.", "HelpHashCommand": "Zatřiďte soubor podle konkrétního algoritmu, výchozí SHA512.", - "HelpInitializeRegistryCommand": "Inicializuje registr v adresáři .", - "HelpInstallCommand": "Nainstalujte balíček.", - "HelpListCommand": "Vypíše nainstalované balíčky.", + "HelpInstallCommand": "Nainstaluje balíček", + "HelpListCommand": "Vypíše nainstalované balíčky", "HelpManifestConstraints": "Manifesty můžou u používaných verzí nastavit tři druhy omezení.", "HelpMinVersion": "Vcpkg vybere minimální zjištěnou verzi, která odpovídá všem použitelným omezením, včetně verze ze směrného plánu zadaného na nejvyšší úrovni, a všech omezení version>= v grafu.", "HelpOverrides": "Při použití jako manifest nejvyšší úrovně (například při spuštění vcpkg install v adresáři) umožňují přepsání manifestu zkrátit řešení závislostí a přesně určit verzi, která se má použít. Je možné je použít k řešení konfliktů verzí, například u závislostí version-string. Při přechodné závislosti se neberou v úvahu.", - "HelpOwnsCommand": "Vyhledejte soubory v nainstalovaných balíčcích.", + "HelpOwnsCommand": "Vyhledá vlastníka souboru v nainstalovaných balíčcích", "HelpPackagePublisher": "Kromě toho mohou vydavatelé balíčků používat omezení version>=, aby zajistili, že uživatelé používají alespoň určitou minimální verzi dané závislosti. Například pokud knihovna potřebuje API přidané do boost-asio ve verzi 1.70, omezení version>= zajistí, že přechodní uživatelé budou používat dostatečnou verzi, a to i vzhledem k přepisům jednotlivých verzí nebo odkazům napříč registry.", - "HelpPortVersionScheme": "Každá verze má navíc verzi portu, což je nezáporné celé číslo. Při vykreslování jako text se verze portu (pokud není nula) přidá jako přípona k textu primární verze oddělenému hashem (#). Verze portů jsou seřazené lexograficky podle textu primární verze, například:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Odinstalujte balíček.", - "HelpRemoveOutdatedCommand": "Odinstalujte všechny zastaralé balíčky.", - "HelpResponseFileCommand": "Zadejte soubor odpovědí pro zadání dalších parametrů.", - "HelpSearchCommand": "Vyhledejte balíčky, které jsou k dispozici k sestavení.", - "HelpTextOptFullDesc": "Nezkracovat dlouhý text.", - "HelpTopicCommand": "Zobrazí nápovědu pro konkrétní téma.", - "HelpTopicsCommand": "Umožňuje zobrazit seznam témat nápovědy.", - "HelpTxtOptAllowUnsupportedPort": "Místo chyby na nepodporovaném portu pokračovat upozorněním.", - "HelpTxtOptCleanAfterBuild": "Vyčistit stromy buildu, balíčky a stažené soubory po sestavení každého balíčku.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Vyčistit strom buildu po sestavení každého balíčku.", - "HelpTxtOptCleanDownloadsAfterBuild": "Vyčistit stažené soubory po sestavení každého balíčku.", - "HelpTxtOptCleanPkgAfterBuild": "Vyčistit balíčky po sestavení každého balíčku.", - "HelpTxtOptDryRun": "Doopravdy nevytvářet ani neinstalovat.", - "HelpTxtOptEditable": "Zakázání opětovné extrakce zdroje a binárního ukládání do mezipaměti pro knihovny na příkazovém řádku (klasický režim)", - "HelpTxtOptEnforcePortChecks": "Neúspěšná instalace, pokud port zjistil problémy nebo se pokusí použít zastaralou funkci", - "HelpTxtOptKeepGoing": "Pokračovat v instalaci balíčků při selhání.", - "HelpTxtOptManifestFeature": "Další funkce z manifestu nejvyšší úrovně pro instalaci (režim manifestu).", - "HelpTxtOptManifestNoDefault": "Neinstalujte výchozí funkce z manifestu nejvyšší úrovně (režim manifestu).", - "HelpTxtOptNoDownloads": "Nestahovat nové zdroje.", - "HelpTxtOptNoUsage": "Po instalaci netiskněte informace o využití CMake.", - "HelpTxtOptOnlyBinCache": "Selhání, pokud nejsou k dispozici binární soubory uložené v mezipaměti.", - "HelpTxtOptOnlyDownloads": "Pokuste se co nejlépe stáhnout zdroje bez sestavení.", - "HelpTxtOptRecurse": "Povolit odebrání balíčků v rámci instalace.", - "HelpTxtOptUseAria2": "Použití aria2 k provádění úloh stahování.", - "HelpTxtOptUseHeadVersion": "Instalace knihoven na příkazový řádek pomocí nejnovějších zdrojů pro odesílání dat (klasický režim).", - "HelpTxtOptWritePkgConfig": "Zapíše soubor ve formátu NuGet packages.config pro použití s externím binárním ukládáním do mezipaměti.\n Další informace najdete v tématu vcpkg help binarycaching.", - "HelpUpdateBaseline": "Nejlepším přístupem k udržování knihoven v aktuálním stavu je aktualizace základní referenční hodnoty. Tím zajistíte aktualizaci všech balíčků, včetně přechodných. Pokud však potřebujete aktualizovat balíček nezávisle, můžete použít omezení version>=.", - "HelpUpdateCommand": "Vypíše balíčky, které se dají aktualizovat.", - "HelpUpgradeCommand": "Znovu sestavte všechny zastaralé balíčky.", - "HelpVersionCommand": "Zobrazí informace o verzi.", + "HelpPortVersionScheme": "Každá verze má navíc verzi portu, což je nezáporné celé číslo. Při vykreslování jako text se verze portu (pokud není nula) přidá jako přípona k textu primární verze oddělenému hashem (#). Verze portů jsou řazeny lexikograficky, například za textem primární verze:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Odinstaluje balíček", + "HelpResponseFileCommand": "Obsahuje jeden argument na řádek rozšířený v daném umístění", + "HelpSearchCommand": "Vyhledá dostupné balíčky, které se dají sestavit", + "HelpTextOptFullDesc": "Nezkracuje dlouhý text", + "HelpTopicCommand": "Zobrazí konkrétní téma nápovědy", + "HelpTopicsCommand": "Zobrazí úplný seznam témat nápovědy", + "HelpTxtOptAllowUnsupportedPort": "Místo selhání na nepodporovaných portech pokračuje s upozorněním", + "HelpTxtOptCleanAfterBuild": "Vyčistí stromy buildu, balíčky a stažené soubory po sestavení každého balíčku", + "HelpTxtOptCleanBuildTreesAfterBuild": "Vyčistí strom buildu po sestavení každého balíčku", + "HelpTxtOptCleanDownloadsAfterBuild": "Po sestavení každého balíčku vyčistí stažené soubory", + "HelpTxtOptCleanPkgAfterBuild": "Po sestavení každého balíčku vyčistí balíčky", + "HelpTxtOptDryRun": "Ve skutečnosti se nesestavuje ani neinstaluje", + "HelpTxtOptEditable": "Zakáže opětovné extrakce zdroje a binárního ukládání do mezipaměti pro knihovny na příkazovém řádku (klasický režim)", + "HelpTxtOptEnforcePortChecks": "Instalace se nezdaří, pokud port zjistil problémy nebo se pokusí použít zastaralou funkci", + "HelpTxtOptKeepGoing": "Pokračuje v instalaci balíčků při selhání", + "HelpTxtOptManifestFeature": "Další funkce z manifestu nejvyšší úrovně pro instalaci (režim manifestu)", + "HelpTxtOptManifestNoDefault": "Neinstalujte výchozí funkce z manifestu nejvyšší úrovně (režim manifestu)", + "HelpTxtOptNoDownloads": "Nestahuje nové zdroje", + "HelpTxtOptNoUsage": "Po instalaci netisknout informace o využití CMake", + "HelpTxtOptOnlyBinCache": "Selže, pokud nejsou k dispozici binární soubory uložené v mezipaměti", + "HelpTxtOptOnlyDownloads": "Pokusí se co nejlépe stáhnout zdroje bez sestavení", + "HelpTxtOptRecurse": "Povoluje odebrání balíčků v rámci instalace", + "HelpTxtOptUseAria2": "Používá aria2 k provádění úloh stahování", + "HelpTxtOptUseHeadVersion": "Nainstaluje knihovny na příkazový řádek pomocí nejnovějších zdrojů pro odesílání dat (klasický režim)", + "HelpTxtOptWritePkgConfig": "Zapíše soubor ve formátu NuGet packages.config pro použití s externí binární mezipamětí. Další informace najdete v vcpkg help binarycaching", + "HelpUpdateBaseline": "Nejlepší způsob, jak udržovat knihovny v aktualizovaném stavu, je aktualizovat základní referenční informace. Tím se zajistí, že se aktualizují všechny balíčky, včetně přenositelných. Pokud ale potřebujete balíček aktualizovat nezávisle, můžete použít omezení version>=.", + "HelpUpdateCommand": "Vypíše balíčky, které se dají upgradovat", + "HelpUpgradeCommand": "Znovu sestaví všechny zastaralé balíčky", + "HelpVersionCommand": "Zobrazí informace o verzi", "HelpVersionDateScheme": "Datum (2021-01-01.5)", "HelpVersionGreater": "V poli závislosti může být u každé závislosti uvedeno minimální omezení. Tato minimální omezení se použijí při přechodné závislosti na této knihovně. Minimální verzi portu je možné navíc zadat pomocí přípony #.", "HelpVersionScheme": "Posloupnost čísel oddělených tečkami (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Nesprávný podpis souboru archivu", "IncorrectPESignature": "Nesprávný podpis PE", "IncrementedUtf8Decoder": "Inkrementovaný Utf8Decoder na konci řetězce", - "InfoSetEnvVar": "Proměnnou prostředí {env_var} můžete také nastavit ve vámi zvoleném editoru.", + "InfoSetEnvVar": "{env_var} můžete také nastavit ve vámi zvoleném editoru.", "InitRegistryFailedNoRepo": "Na cestě {path} se nepovedlo vytvořit registr, protože se nejedná o kořenový adresář úložiště GIT.\nPomocí příkazu git init {command_line} vytvořte v této složce úložiště GIT.", "InstallCopiedFile": "{path_source} -> {path_destination} dokončena", "InstallFailed": "selhalo: {path}: {error_msg}", "InstallPackageInstruction": "Při otevřeném projektu přejděte na Nástroje->Správce balíčků NuGet->Konzola správce balíčků a vložte: \n Install-Package \"{value}\" -Source \"{path}\"", - "InstallRootDir": "(Experimentální) Zadejte instalační kořenový adresář.", + "InstallRootDir": "Nainstalovaný adresář (experimentální)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} přeskočena, aktuální", "InstallWithSystemManager": "Tento nástroj můžete nainstalovat prostřednictvím správce systémových balíčků.", "InstallWithSystemManagerMono": "Uživatelé Ubuntu 18.04 můžou potřebovat novější verzi mono, která je k dispozici na adrese {url}.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Probíhá instalace portu z umístění: {path}", "InstallingMavenFile": "{path} instaluje soubor Maven", "InstallingPackage": "Instaluje se {action_index}/{count} {spec}...", - "IntegrateBashHelp": "Povolit dokončování karet bash.", - "IntegrateFishHelp": "Povolit dokončování karet fish.", - "IntegrateInstallHelpLinux": "Zpřístupněte nainstalované balíčky všem uživatelům.", - "IntegrateInstallHelpWindows": "Zpřístupněte nainstalované balíčky všem uživatelům. Při prvním použití vyžaduje oprávnění správce.", - "IntegratePowerShellHelp": "Povolte dokončování karet PowerShellu.", - "IntegrateProjectHelp": "Vygenerujte odkazující balíček NuGet pro použití jednotlivých projektů VS.", - "IntegrateRemoveHelp": "Odeberte integraci na úrovni uživatele.", - "IntegrateZshHelp": "Povolit dokončování karet zsh.", - "IntegrationFailed": "Integrace nebyla použita.", + "IntegrateBashHelp": "Povolit dokončování karet bash. Pouze jiný systém než Windows", + "IntegrateFishHelp": "Povolit dokončování karet fish. Pouze jiný systém než Windows", + "IntegrateInstallHelpLinux": "Zpřístupní nainstalované balíčky pro všechny uživatele", + "IntegrateInstallHelpWindows": "Zpřístupní nainstalované balíčky pro všechny uživatele. Při prvním použití vyžaduje oprávnění správce", + "IntegrateNonWindowsOnly": "{command_line} je pouze pro jiné systémy než Windows a není na tomto systému podporován.", + "IntegratePowerShellHelp": "Povolte dokončování karet PowerShellu. Pouze pro Windows", + "IntegrateProjectHelp": "Vygeneruje odkazující balíček NuGet pro jednotlivé Visual Studio použití projektu. Pouze pro Windows", + "IntegrateRemoveHelp": "Odebere integraci pro celou uživatele", + "IntegrateWindowsOnly": "{command_line} je pouze pro Windows a není na tomto systému podporován.", + "IntegrateZshHelp": "Povolit dokončování karet zsh. Pouze jiný systém než Windows", + "IntegrationFailedVS2015": "Integrace nebyla použita pro Visual Studio 2015.", "InternalCICommand": "vcpkg ci je interní příkaz, který se změní nekompatibilně nebo se kdykoli odebere.", "InternalErrorMessage": "vnitřní chyba: ", "InternalErrorMessageContact": "Otevřete prosím problém na adrese https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug, kde uveďte podrobný postup, jak problém vyvolat.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg nepodporuje komentáře ve stylu c, ale většina objektů povoluje použití polí s předponou $jako komentářů.", "InvalidCommitId": "Neplatné ID potvrzení: {commit_sha}", "InvalidDefaultFeatureName": "„default“ je vyhrazený název funkce", - "InvalidDependency": "Závislosti musí být malé alfanumerické znaky a spojovníky, a žádný z rezervovaných názvů.", "InvalidFeature": "Funkce musí obsahovat malé alfanumerické znaky a spojovníky a nesmí obsahovat žádný z rezervovaných názvů", "InvalidFileType": "Chyba: {path} nemůže zpracovat typ souboru.", "InvalidFilename": "Název souboru nemůže obsahovat neplatné znaky {value}, ale byl {path}.", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "Knihovna byla neplatná: Nelze najít člena linkeru.", "InvalidLinkage": "Neplatný typ propojení {system_name}: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "neplatný logický výraz, neočekávaný znak", - "InvalidLogicExpressionUsePipe": "neplatný logický výraz, místo operátoru „or“ použijte znak |.", + "InvalidLogicExpressionUsePipe": "neplatný logický výraz, použijte | místo operátoru or", "InvalidNoVersions": "Soubor neobsahuje žádné verze.", "InvalidOptionForRemove": "Příkaz remove přijímá buď knihovny, nebo --outdated.", "InvalidPortVersonName": "Našel se neplatný název souboru verze portu: {path}.", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "Hodnota [\"{json_field}\"] musí být objekt", "JsonFieldNotString": "Hodnota [\"{json_field}\"] musí být řetězec.", "JsonFileMissingExtension": "Soubor JSON {path} musí mít příponu .json (všechna malá písmena).", - "JsonSwitch": "(Experimentální) Výstup JSON požadavku.", + "JsonSwitch": "Vytiskne JSON místo prostého textu.", "JsonValueNotArray": "hodnota json není pole", "JsonValueNotObject": "Hodnota json není objekt", "JsonValueNotString": "Hodnota json není řetězec", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Dynamická verze (/MD)", "LinkageStaticDebug": "Statické ladění (/MTd)", "LinkageStaticRelease": "Statická vydaná verze (/MT)", - "ListHelp": "Argument by měl být podřetězec, který se má vyhledat, nebo žádný argument pro zobrazení všech nainstalovaných knihoven.", + "ListHelp": "Vypíše nainstalované knihovny", "ListOfValidFieldsForControlFiles": "Toto je seznam platných polí pro soubory CONTROL (rozlišují se malá a velká písmena):", "LoadingCommunityTriplet": "-- [COMMUNITY] Načítání trojité konfigurace z: {path}", "LoadingDependencyInformation": "Načítají se informace o závislostech pro balíčky ({count})...", @@ -708,7 +827,6 @@ "MultiArch": "Hodnota Multi-Arch musí být same, ale byla {option}", "MultipleFeatures": "balíček {package_name} deklaruje funkci {feature} vícekrát; ujistěte se prosím, že funkce mají odlišné názvy", "MutuallyExclusiveOption": "Parametr --{value} nejde použít s parametrem --{option}.", - "NavigateToNPS": "Přejděte prosím na {url} v upřednostňovaném prohlížeči.", "NewConfigurationAlreadyExists": "Vytvoření manifestu by přepsalo soubor vcpkg-configuration.json v {path}.", "NewManifestAlreadyExists": "Manifest už v {path} existuje.", "NewNameCannotBeEmpty": "--name nesmí být prázdné.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "Buď zadáním --name a --version vytvořte manifest určený pro knihovny C++, nebo zadáním --application označte, že se manifest nemá používat jako port.", "NewVersionCannotBeEmpty": "--version nesmí být prázdné.", "NoArgumentsForOption": "Možnost --{option} nepřijímá argument.", - "NoCachedPackages": "Do mezipaměti nejsou uloženy žádné balíčky.", "NoError": "nedošlo k žádné chybě", "NoInstalledPackages": "Nejsou nainstalované žádné balíčky. Měli jste na mysli „hledat“?", "NoLocalizationForMessages": "Žádné lokalizované zprávy pro následující: ", @@ -739,11 +856,13 @@ "OptionRequiresAValue": "možnost {option} vyžaduje hodnotu", "OptionRequiresOption": "--{value} vyžaduje --{option}", "OptionUsedMultipleTimes": "možnost {option} se zadala vícekrát", - "OptionalCommand": "nepovinný příkaz", "Options": "Možnosti", "OriginalBinParagraphHeader": "\nPůvodní binární odstavec", + "OtherCommandsHeader": "Ostatní", "OverlayPatchDir": "Překryvná cesta „{path}“ musí existovat a musí to být adresář.", - "OverlayTriplets": "Překrytí trojčat z {path} :", + "OverlayPortsDirectoriesHelp": "Adresáře překryvných portů (také: {env_var})", + "OverlayTripletDirectoriesHelp": "Adresáře překryvných tripletů (také: {env_var})", + "OverlayTriplets": "Překryvné trojčata z {path}:", "OverwritingFile": "Soubor {path} už existuje a přepíše se.", "PECoffHeaderTooShort": "Při analýze přenosného spustitelného souboru {path} je velikost záhlaví COFF příliš malá na to, aby obsahovala platné záhlaví PE.", "PEConfigCrossesSectionBoundary": "Při analýze přenosného spustitelného souboru {path} protíná konfigurační adresář bitové kopie hranici oddílu.", @@ -752,9 +871,12 @@ "PERvaNotFound": "Při analýze přenosného spustitelného souboru {path} se nepodařilo najít adresu RVA {value:#X}.", "PESignatureMismatch": "Při analýze přenosného spustitelného souboru {path} se neshoduje podpis.", "PackageAlreadyRemoved": "Nepovedlo se odebrat {spec}: už je odebrané.", + "PackageDiscoveryHeader": "Zjišťování balíčků", "PackageFailedtWhileExtracting": "{value} selhalo při extrahování {path}.", - "PackageInfoHelp": "Zobrazit podrobné informace o balíčcích.", - "PackageRootDir": "(Experimentální) Zadejte kořenový adresář balíčků.", + "PackageInfoHelp": "Zobrazit podrobné informace o balíčcích", + "PackageInstallationHeader": "Instalace balíčku", + "PackageManipulationHeader": "Manipulace s balíčky", + "PackageRootDir": "Adresář balíčků (experimentální)", "PackagesToInstall": "Budou sestaveny a nainstalovány následující balíčky:", "PackagesToInstallDirectly": "Následující balíčky se nainstalují přímo:", "PackagesToModify": "Další balíčky (*) budou upraveny za účelem dokončení této operace.", @@ -774,6 +896,7 @@ "ParseControlErrorInfoTypesEntry": "Očekávalo se, že hodnota {value} bude {expected}.", "ParseControlErrorInfoWhileLoading": "při načítání {path}:", "ParseControlErrorInfoWrongTypeFields": "Následující pole měla chybné typy:", + "ParseFeatureNameError": "{package_name} není platný název funkce. Názvy funkcí musí být malé alfanumerické znaky + pomlčky a nesmí být vyhrazené (další informace najdete na adrese {url}).", "ParseIdentifierError": "{value} není platný identifikátor. Identifikátory musí být malé alfanumerické znaky + pomlčky a nesmí být vyhrazené (další informace najdete na adrese {url}).", "ParsePackageNameError": "{package_name} není platný název balíčku. Názvy balíčků musí být malé alfanumerické znaky + pomlčky a nesmí být vyhrazené (další informace najdete na adrese {url}).", "ParsePackagePatternError": "{package_name} není platný vzor balíčku. Vzory balíčků musí používat jenom jeden zástupný znak (*) a musí to být poslední znak ve vzoru (další informace najdete na adrese {url}).", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "Pokud chcete zkontrolovat soubory {extension}, použijte:", "PortBugInvalidCrtLinkage": "Následující binární soubory by měly používat crt {expected}.", "PortBugInvalidCrtLinkageEntry": "{path} odkazuje na:", + "PortBugKernel32FromXbox": "Vybraný triplet cílí na Xbox, ale následující knihovny DLL jsou propojeny s kernel32. Tyto knihovny DLL nelze načíst na konzoli Xbox, kde není k dispozici kernel32. To je obvykle způsobeno propojením s kernel32.lib namísto vhodné knihovny umbrella, jako je onecore_apiset.lib nebo xgameplatform.lib.", "PortBugMergeLibCMakeDir": "Složka /lib/cmake by se měla sloučit s /debug/lib/cmake a přesunout do složky /share/{package_name}/cmake. Použijte pomocnou funkci vcpkg_cmake_config_fixup() z portu vcpkg-cmake-config.", "PortBugMismatchedNumberOfBinaries": "Neshoduje se počet binárních souborů ladění a vydání.", "PortBugMisplacedCMakeFiles": "Následující soubory cmake byly nalezeny mimo /share/{spec}. Umístěte prosím soubory cmake do složky /share/{spec}.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "Pokud se vytvoření bin\\ nebo debug\\bin\\ nedá zakázat, odeberte je pomocí této možnosti v souboru portu.", "PortBugRemoveEmptyDirectories": "Pokud má být adresář naplněn, ale není, může to znamenat chybu v souboru portu.\n Pokud adresáře nepotřebujete a jejich vytváření nejde zakázat, odeberte je v souboru portů následujícím způsobem:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE prázdné adresáře, které ponechala výše uvedená přejmenování)", - "PortBugRestrictedHeaderPaths": "Následující omezená záhlaví můžou zabránit správnému kompilaci základního modulu runtime C++ a dalších balíčků. Za výjimečných okolností lze tuto zásadu zakázat prostřednictvím {env_var}.", + "PortBugRestrictedHeaderPaths": "Následující omezená záhlaví můžou zabránit správnému kompilaci základního modulu runtime C++ a dalších balíčků. Za výjimečných okolností je možné tuto politiku zakázat nastavením proměnné CMake VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS v souboru portfile.cmake.", "PortBugSetDllsWithoutExports": "Knihovny DLL bez exportů jsou pravděpodobně chybou ve skriptu sestavení. Pokud je to záměrné, přidejte do souboru portfile:\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS povoleno).\nNásledující knihovny DLL nemají žádné exporty:", "PortDependencyConflict": "{package_name} portu má následující nepodporované závislosti:", "PortDoesNotExist": "{package_name} neexistuje.", @@ -827,21 +951,26 @@ "PortsDiffHelp": "Aby šel rezervovat, argument by měl být větev, značka nebo hodnota hash.", "PortsNoDiff": "Mezi těmito dvěma potvrzeními nedošlo k žádným změnám portů.", "PortsRemoved": "Odebraly se tyto porty (celkem {count}):", - "PortsUpdated": "\nAktualizovaly se tyto porty (celkem {count}):", + "PortsUpdated": "Aktualizovaly se tyto porty (celkem {count}):", "PrebuiltPackages": "Existují balíčky, které nebyly sestaveny. Pokud je chcete sestavit, spusťte:", "PreviousIntegrationFileRemains": "Předchozí integrační soubor nebyl odebrán.", "ProgramReturnedNonzeroExitCode": "Nástroj {tool_name} selhal s ukončovacím kódem {exit_code}.", "ProvideExportType": "Vyžaduje se aspoň jedna z následujících možností: --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "Nepodařilo se nasdílet změny {vendor} do cesty {path}. Pro další informace použijte --debug.", - "RegeneratesArtifactRegistry": "Znovu vygeneruje registr artefaktů.", + "RegeneratesArtifactRegistry": "Znovu vygeneruje registr artefaktů", "RegistryCreated": "Registr na cestě {path} se úspěšně vytvořil.", "RegistryValueWrongType": "Hodnota registru {path} byla neočekávaného typu.", "RemoveDependencies": "Pokud chcete odebrat závislosti v režimu manifestu, upravte manifest (vcpkg.json) a spusťte install.", "RemovePackageConflict": "{spec} není nainstalovaný, ale {package_name} je nainstalovaný pro {triplet}. Měli jste na mysli {package_name}:{triplet}?", "RemovingPackage": "Odebírá se {action_index}/{count} {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "Byl obnoven balíček z cesty {path}.", - "RestoredPackagesFromVendor": "Za {elapsed} se obnovil tento počet balíčků: {count} z {value}. Pokud si chcete zobrazit další podrobnosti, použijte --debug.", + "RestoredPackagesFromAWS": "Počet obnovených balíčků z AWS: {count} za {elapsed} Pokud si chcete zobrazit další podrobnosti, použijte --debug.", + "RestoredPackagesFromCOS": "Počet obnovených balíčků z COS: {count} za {elapsed}. Pokud si chcete zobrazit další podrobnosti, použijte --debug.", + "RestoredPackagesFromFiles": "Počet obnovených balíčků z cesty {path} za {elapsed}: {count} Pokud si chcete zobrazit další podrobnosti, použijte --debug.", + "RestoredPackagesFromGCS": "Počet obnovených balíčků z GCS: {count} za {elapsed}. Pokud si chcete zobrazit další podrobnosti, použijte --debug.", + "RestoredPackagesFromGHA": "Počet obnovených balíčků z mezipaměti GitHub Actions za {elapsed}: {count} Pokud si chcete zobrazit další podrobnosti, použijte --debug.", + "RestoredPackagesFromHTTP": "Počet obnovených balíčků ze serverů HTTP za {elapsed}: {count}. Pokud si chcete zobrazit další podrobnosti, použijte --debug.", + "RestoredPackagesFromNuGet": "Počet obnovených balíčků z NuGetu: {count} za {elapsed} Pokud si chcete zobrazit další podrobnosti, použijte --debug.", "ResultsHeader": "VÝSLEDKY", "ScriptAssetCacheRequiresScript": "Očekávané argumenty: konfigurace prostředků x-script vyžaduje přesně šablonu exec jako argument.", "SearchHelp": "Argument by měl být podřetězec, který se má vyhledat, nebo žádný argument pro zobrazení všech knihoven.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "Vymazání obsahu cesty {path} se přeskakuje, protože se nejedná o adresář.", "SourceFieldPortNameMismatch": "Pole Source v souboru CONTROL nebo pole name v souboru vcpkg.json má název {package_name} a neodpovídá adresáři portu {path}.", "SpecifiedFeatureTurnedOff": "Funkce {command_name} je konkrétně vypnutá, ale zadala se možnost --{option}.", - "SpecifyDirectoriesContaining": "Zadejte adresáře obsahující soubory triplets.\n(také: {env_var})", - "SpecifyDirectoriesWhenSearching": "Zadejte adresáře, které se mají použít při hledání portů.\n(také: {env_var})", - "SpecifyHostArch": "Zadejte třikrát architekturu hostitele. Podívejte se na článek \"vcpkg help triplet\".\n(výchozí: {env_var})", - "SpecifyTargetArch": "Zadejte trojnásobnou cílovou architekturu. Podívejte se na článek „vcpkg help triplet“.\n(výchozí: {env_var})", + "SpecifyHostArch": "Hostující trojčata. Viz vcpkg help triplet (výchozí: {env_var})", + "SpecifyTargetArch": "Cílová trojčata. Viz vcpkg help triplet (výchozí: {env_var})", "StartCodeUnitInContinue": "našla se jednotka počátečního kódu na pozici pro pokračování", "StoreOptionMissingSha": "Možnost --store je bez sha512 neplatná.", - "StoredBinariesToDestinations": "Binární soubory se uložily v {count} cílech.", + "StoredBinariesToDestinations": "Uložené binární soubory v(e) {count} cílech v {elapsed}.", "StoredBinaryCache": "Uložená binární mezipaměť: {path}", "SuccessfulyExported": "{package_name} se exportoval do cesty {path}.", "SuggestGitPull": "Výsledek může být zastaralý. Nejnovější výsledky získáte spuštěním příkazu git pull.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "Možná bude potřeba aktualizovat binární soubor vcpkg. zkuste spustit {command_line} a provést aktualizaci.", "SupportedPort": "Podporuje se {package_name} portu.", "SwitchUsedMultipleTimes": "příkaz switch {option} se zadal vícekrát", + "SynopsisHeader": "Přehled:", "SystemApiErrorMessage": "volání {system_api} selhalo s ukončovacím kódem {exit_code} ({error_msg}).", "SystemRootMustAlwaysBePresent": "V systému Windows musí vždy být nastavena proměnná prostředí SystemRoot.", "SystemTargetsInstallFailed": "nepodařilo se nainstalovat soubor systémových cílů do {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Koncová čárka v poli", "TrailingCommaInObj": "Koncová čárka v objektu", "TripletFileNotFound": "Soubor triplet {triplet}.cmake se nenašel.", + "TripletLabel": "Triplet:", "TwoFeatureFlagsSpecified": "Jako příznaky funkce se zadala hodnota {value} i -{value}.", "UnableToClearPath": "{path} se nedá odstranit.", "UnableToReadAppDatas": "%LOCALAPPDATA% i %APPDATA% byly nečitelné.", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "'{url}' registru se neaktualizovala: '{value}'", "UpdateBaselineRemoteGitError": "Gitu se nepovedlo načíst vzdálené úložiště {url}.", "UpdateBaselineUpdatedBaseline": "aktualizovala se '{url}' registru: směrný plán '{old_value}' -> '{new_value}'", - "UpgradeInManifest": "Příkaz upgrade v současné době nepodporuje režim manifestu. Místo toho upravte soubor vcpkg.json a spusťte instalaci.", + "UpgradeInManifest": "Upgrade upgraduje instalaci klasického režimu, a proto nepodporuje režim manifestu. Zvažte aktualizaci závislostí aktualizací směrného plánu na aktuální hodnotu pomocí vcpkg x-update-baseline a spuštěním instalace vcpkg.", "UpgradeRunWithNoDryRun": "Pokud jste si jistí, že chcete výše uvedené balíčky znovu sestavit, spusťte tento příkaz s možností --no-dry-run.", "UploadedBinaries": "Binární soubory se nahrály do {count} {vendor}.", "UploadedPackagesToVendor": "Počet balíčků nahraných do {vendor} za {elapsed}: {count}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "neplatný příkaz: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "Hodnota proměnné prostředí X_VCPKG_REGISTRIES_CACHE není adresář: {path}", "VcpkgRootRequired": "Nastavení VCPKG_ROOT se vyžaduje pro samostatné spuštění.", - "VcpkgRootsDir": "Zadejte kořenový adresář vcpkg.\n(výchozí: {env_var})", + "VcpkgRootsDir": "Kořenový adresář vcpkg (výchozí: {env_var})", "VcpkgSendMetricsButDisabled": "předáno --sendmetrics, ale metriky jsou zakázané.", + "VcpkgUsage": "použití: vcpkg [--switches] [--options=values] [arguments] @response_file", "VcvarsRunFailed": "Spuštění souboru vcvarsall.bat za účelem získání prostředí Visual Studio se nezdařilo.", "VcvarsRunFailedExitCode": "Při pokusu o získání prostředí Visual Studio vrátil soubor vcvarsall.bat {exit_code}.", "VersionBaselineMismatch": "Nejnovější verze je {expected}, ale soubor směrného plánu obsahuje {actual}.\nSpusťte:\n{package_name} vcpkg x-add-version\ngit add versions\ngit commit -m \"Aktualizovat databázi verzí\"\na aktualizujte verzi směrného plánu.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "{package_name} v {path} postrádá soubor databáze verzí.\nSpusťte:\n{package_name} vcpkg x-add-version\na vytvořte soubor verzí.", "VersionGitEntryMissing": "ve verzi {version} není pro {package_name} žádná položka databáze verzí.\nDostupné verze:", "VersionInDeclarationDoesNotMatch": "Verze deklarovaná v souboru neodpovídá rezervované verzi: {version}", - "VersionIncomparable1": "konflikt verzí ve specifikaci {spec}: {package_name} požadovalo se {expected}, ale vcpkg nemohl provést porovnání s {actual}.\nDvě verze používaly neporovnatelná schémata:", - "VersionIncomparable2": "verze {version} patřila ke schématu {new_scheme}", - "VersionIncomparable3": "Tento problém lze vyřešit přidáním explicitního přepsání k upřednostňované verzi, například:", - "VersionIncomparable4": "Další informace najdete v nápovědě k „správě verzí vcpkg“.", + "VersionIncomparable1": "Konflikt verzí na {spec}: {constraint_origin} vyžaduje {expected}, což se nedá porovnat se standardní verzí {actual}.", + "VersionIncomparable2": "{version_spec} má schéma {new_scheme}", + "VersionIncomparable3": "Tento problém lze vyřešit přidáním explicitního přepsání do upřednostňované verze. Například:", + "VersionIncomparable4": "Další informace najdete v tématu „vcpkg help versioning“ nebo {url}.", + "VersionIncomparableSchemeString": "Obě verze mají řetězec schématu, ale jiný primární text.", + "VersionIncomparableSchemes": "Verze mají nekompatibilní schémata:", "VersionInvalidDate": "{version} není platná verze data. Data musí být ve formátu RRRR-MM-DD a zpřesňující prvky musí být kladné hodnoty integer oddělené tečkami bez úvodních nul.", "VersionInvalidRelaxed": "{version} není platná uvolněná verze (semver s počtem libovolných numerických prvků)", "VersionInvalidSemver": "{version} není platná sémantická verze, řiďte se .", "VersionMissing": "očekávalo se pole správy verzí (jedna verze, datum verze, verze semver nebo řetězec verze).", - "VersionMissingRequiredFeature": "{spec}@{version} nemá požadovanou funkci {feature}", + "VersionMissingRequiredFeature": "{version_spec} nemá požadovanou funkci {feature}, kterou {constraint_origin} potřebuje.", "VersionNotFound": "{expected} není k dispozici, k dispozici je pouze {actual}", - "VersionNotFoundDuringDiscovery": "během zjišťování se nenašla verze: {spec}@{version}\nToto je vnitřní chyba vcpkg. Založte prosím problém na https://github.com/Microsoft/vcpkg s podrobnými kroky, aby se problém dal reprodukovat.", - "VersionNotFoundInVersionsFile": "Verze {version} nebyla v souboru verzí nalezena.\nSpusťte:\n{package_name} vcpkg x-add-version\na přidejte novou verzi portu.", + "VersionNotFoundInVersionsFile": "Verze {version} se nenašla v souboru verzí pro {package_name}.\nSpuštěním příkazu:\nvcpkg x-add-version {package_name}\npřidáte novou verzi portu.", "VersionRejectedDueToBaselineMissing": "Cesta {path} byla odmítnuta, protože používá {json_field} a nemá předdefinovaný směrný plán. Tento problém můžete vyřešit odebráním použití {json_field} nebo přidáním předdefinovaného směrného plánu.\nDalší informace najdete v vcpkg help versioning.", "VersionRejectedDueToFeatureFlagOff": "Cesta {path} byla odmítnuta, protože používá {json_field} a příznak funkce verze je zakázán. Tento problém můžete vyřešit odebráním {json_field} nebo povolením příznaku funkce verze.\nDalší informace najdete v tématu vcpkg help versioning.", "VersionSchemeMismatch": "Databáze verzí deklaruje verzi {version} jako {expected}, ale {path} ji deklaruje jako {actual}. Verze musí být jedinečné, i když jsou deklarované s různými schématy.\nSpustit:\nvcpkg x-add-version {package_name} --overwrite-version\nza účelem přepsání schématu deklarovaného v databázi verzí schématem deklarovaným v portu.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "Za # musí v textu verze následovat verze portu (nezáporné celé číslo)", "VersionSpecMismatch": "Nepodařilo se načíst port, protože verze jsou nekonzistentní. Soubor „{path}“ obsahuje verzi {actual_version}, ale databáze verzí uvádí, že by to měla být {expected_version}.", "VersionTableHeader": "Verze", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "Čeká se na ukončení podřízených procesů…", "WaitingToTakeFilesystemLock": "čeká se na uzamčení systému souborů na {path}…", "WarnOnParseConfig": "V konfiguraci {path} se našla následující upozornění:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "při ověřování verze: {version}", "WindowsOnlyCommand": "Tento příkaz podporuje jenom Windows.", "WroteNuGetPkgConfInfo": "Do {path} se zapsaly informace o konfiguraci balíčku NuGet", - "UnrecognizedCommand$": "Nerozpoznaný příkaz ${p0}", - "Use$ToGetHelp": "Nápovědu získáte pomocí ${p0}.", - "FatalTheRootFolder$CanNotBeCreated": "Závažné: Kořenovou složku ${p0} nejde vytvořit.", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Závažné: Globální konfigurační soubor ${p0} se nedá vytvořit.", + "FatalTheRootFolder$CannotBeCreated": "Závažné: Kořenovou složku ${p0} nejde vytvořit", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Závažné: Globální konfigurační soubor ${p0} se nedá vytvořit.", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND nebyl nastaven.", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "Spuštění vcpkg interně vrátilo nenulový ukončovací kód: ${p0}.", "failedToDownloadFrom$": "stažení z ${p0} se nezdařilo", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "popis by měl být typu string, našlo se: ${p0}.", "optionsShouldBeASequenceFound$": "možnosti by měly být sekvence, našlo se : ${p0}.", "DuplicateKeysDetectedInManifest$": "V manifestu se zjistily duplicitní klíče: ${p0}.", - "in$Skipping$BecauseItIsA$": "v ${p0} přeskakuje ${p1}, protože se jedná o ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "žádný postscriptový soubor: spusťte ho znovu s funkcí prostředí vcpkg místo spustitelného souboru.", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Duplicitní definice ${p0} během aktivace. Nová hodnota nahradí starou hodnotu.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "Během aktivace se deklaroval duplicitní nástroj ${p0}. Nová hodnota nahradí starou hodnotu.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(neznámý průběh)", "verifying": "ověřování", "downloading$$": "stahuje se ${p0} -> ${p1}", - "unpacking": "rozbalení", "unpacking$": "rozbaluje se ${p0}", "Installing$": "Instaluje se ${p0}…", "$AlreadyInstalled": "${p0} už je nainstalovaný.", "Downloading$": "Stahuje se ${p0}…", "Unpacking$": "Rozbaluje se ${p0}...", "ErrorInstalling$$": "Chyba při instalaci ${p0} – ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "Očekávala se jedna hodnota pro ${p0} – našlo se jich více.", - "Synopsis": "Synopse", - "Description": "Popis", - "Switches": "Přepínače", - "SeeAlso": "Viz také", "error": "chyba:", "warning": "upozornění:", + "ExpectedASingleValueFor$FoundMultiple": "Očekávala se jedna hodnota pro ${p0} – našlo se jich více.", "ExpectedASingleValueFor$": "Očekávala se jedna hodnota pro --${p0}.", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Za předpokladu, že ${p0} je správné; zadejte v metadatech artefaktu hodnotu hash, která tuto zprávu potlačí.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "Stažený soubor ${p0} neměl správnou hodnotu hash (${p1}: ${p2}). ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "V ${p1} se našla neshoda ${p0}. Pro literál ${p2} použijte jako náhradu ${p3}${p4}.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "V ${p1} se nepovedlo najít hodnotu pro {${p0}}. Pokud chcete zapsat hodnotu literálu, použijte místo toho {{${p2}}}.", "MatchedMoreThanOneInstallBlock$": "Odpovídá více než jednomu instalačnímu bloku [${p0}].", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Získá vše, na co projekt odkazuje, bez aktivace.", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "To umožňuje příjemci předběžně stáhnout nástroje potřebné pro projekt.", "UnableToFindProjectInFolderorParentFoldersFor$": "Nepovedlo se najít projekt ve složce (nebo v nadřazených složkách) pro ${p0}", "UnableToAcquireProject": "Nepovedlo se získat projekt.", - "AcquireArtifactsInTheRegistry": "Získat artefakty v registru", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "To umožňuje příjemci získat (stáhnout a rozbalit) artefakty. Aby se artefakty použily, musí se aktivovat.", "NoArtifactsSpecified": "Nezadaly se žádné artefakty.", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Zadalo se více balíčků, ale ne stejný počet přepínačů ${p0}.", "NoArtifactsAreAcquired": "Nezískaly se žádné artefakty.", "AllArtifactsAreAlreadyInstalled": "Všechny artefakty jsou už nainstalované.", "$ArtifactsInstalledSuccessfully": "Artefakty (${p0}) se úspěšně nainstalovaly.", "InstallationFailedStopping": "Instalace se nezdařila – zastavování", - "ActivatesTheToolsRequiredForAProject": "Aktivuje nástroje vyžadované pro projekt.", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "To umožňuje uživateli aktivovat nástroje vyžadované pro projekt. Pokud nástroje ještě nejsou nainstalované, vynutí to jejich stažení a instalaci před aktivací.", - "AddsAnArtifactToTheProject": "Přidá artefakt do projektu.", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "Umožňuje uživateli přidat do projektu artefakt. Tímto se aktivuje i projekt.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Zadalo se více artefaktů, ale ne stejný počet přepínačů ${p0}.", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Pokusili jste se přidat artefakt [${p0}]:${p1}, ale nepovedlo se určit registr, který se má použít.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Pokusili jste se přidat registr ${p0} jako ${p1}, ale už to bylo ${p2}. Přidejte prosím ${p3} do tohoto projektu ručně a zkuste to znovu.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Spuštěním příkazu \\'vcpkg activate\\ použijte aktuální terminál.", - "ManagesTheDownloadCache": "Spravuje mezipaměť pro stahování.", "DownloadsFolderCleared$": "Složka Stažené soubory se vymazala (${p0}). ", - "cleansOutEverythingcacheInstalledArtifacts": "vyčistí vše (mezipaměť, nainstalované artefakty).", - "cleansOutTheDownloadsCache": "vyčistí mezipaměť pro stahování.", - "removesAllTheArtifactsThatAreInstalled": "odebere všechny nainstalované artefakty.", - "cleansUp": "vyčistí", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Umožňuje uživateli vyčistit mezipaměť, nainstalované artefakty atd.", "InstalledArtifactFolderCleared$": "Složka nainstalovaného artefaktu se vymazala (${p0}). ", "CacheFolderCleared$": "Složka mezipaměti se vymazala (${p0}). ", - "DeactivatesTheCurrentSession": "Deaktivuje aktuální relaci.", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "To umožňuje uživateli odebrat nastavení prostředí pro aktuálně aktivní relaci.", - "DeletesAnArtifactFromTheArtifactFolder": "Odstraní artefakt ze složky artefaktů.", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "To umožňuje příjemci odebrat artefakt z disku.", "DeletingArtifact$From$": "Odstraňuje se artefakt ${p0} z ${p1}", - "FindArtifactsInTheRegistry": "Najít artefakty v registru", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "To uživateli umožňuje najít artefakty na základě některých kritérií.", "NoArtifactsFoundMatchingCriteria$": "Nenašly se žádné artefakty odpovídající kritériím: ${p0}.", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Generuje vlastnosti nástroje MSBuild pro aktivaci bez stažení čehokoli pro projekt.", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props vyžaduje --msbuild-props.", "UnableToActivateProject": "Nepovedlo se aktivovat projekt.", - "theNameOfTheCommandForWhichYouWantHelp": "název příkazu, pro který chcete zobrazit nápovědu", - "getHelpOn$OrOneOfTheCommands": "získat nápovědu k ${p0} nebo jednomu z příkazů", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Získá podrobnou nápovědu k ${p0} nebo jednomu z příkazů.", - "Arguments": "Argumenty:", - "Use$ToGetTheListOfAvailableCommands": "Pomocí ${p0} získáte seznam dostupných příkazů.", - "Usage": "Využití", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "Dostupné příkazy ${p0}:", - "ListsTheArtifacts": "Vypíše artefakty.", - "ThisAllowsTheConsumerToListArtifacts": "Umožňuje uživateli vypsat artefakty.", - "regenerateTheIndexForARegistry": "znovu vygenerovat index pro registr", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "To uživateli umožňuje znovu vygenerovat soubory ${p0} pro registr ${p1}.", "RegeneratingIndexFor$": "Znovu se generuje index pro ${p0}", "RegenerationCompleteIndexContains$MetadataFiles": "Opětovné generování dokončeno. Index obsahuje soubory metadat (${p0}).", "Registry$ContainsNoArtifacts": "Registr: ${p0} neobsahuje žádné artefakty.", "error$": "chyba ${p0}: ", - "RemovesAnArtifactFromAProject": "Odebere artefakt z projektu.", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "To umožňuje příjemci odebrat artefakt z projektu. Vynutí opětovnou aktivaci v tomto okně.", "Removing$FromProjectManifest": "${p0} se odebírá z manifestu projektu", "unableToFindArtifact$InTheProjectManifest": "V manifestu projektu se nepovedlo najít artefakt ${p0}.", - "updateTheRegistryFromTheRemote": "aktualizovat registr ze vzdáleného úložiště", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Tato operace stáhne nejnovější obsah registru ze vzdálené služby.", - "DownloadingRegistryData": "Stahování dat registru", - "Updated$RegistryContains$MetadataFiles": "Aktualizováno : ${p0}. Registr obsahuje soubory metadat ${p1}.", - "UnableToDownloadRegistrySnapshot": "Nepovedlo se stáhnout snímek registru.", + "Updated$ItContains$MetadataFiles": "Aktualizováno : ${p0}. Registr obsahuje soubory metadat ${p1}.", + "UnableToDownload$": "Nejde stáhnout ${p0}.", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} se nepovedlo aktualizovat; může být poškozený.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "Příkaz x-update-registry stáhne nové informace registru, a nelze jej proto použít s místními registry. Měli jste na mysli x-regenerovat ${p0}?", "UnableToFindRegistry$": "Nepovedlo se najít registr ${p0}.", - "ArtifactRegistryDataIsNotLoaded": "Data registru artefaktů se nenačetla.", - "AttemptingToUpdateArtifactRegistry": "Probíhá pokus o aktualizaci registru artefaktů", - "UnableToLoadRegistryIndex": "Nelze načíst index registru.", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Okamžitě aktivuje artefakt mimo projekt.", - "ThisWillInstantlyActivateAnArtifact": "Tato akce okamžitě aktivuje artefakt .", "NoArtifactsAreBeingAcquired": "Nezískají se žádné artefakty.", - "removesAllFilesInTheLocalCache": "odebere všechny soubory v místní mezipaměti.", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "povolí režim ladění, zobrazí vnitřní zprávy o tom, jak ${p0} funguje", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "pokračuje (potenciálně nebezpečnou) akcí bez potvrzení", - "showsTheinstalledArtifacts": "zobrazí artefakty _installed_.", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Vypíše proměnné prostředí a další vlastnosti do souboru JSON s cestou poskytnutou uživatelem.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Úplná cesta k souboru, do kterého se zapíší vlastnosti nástroje MSBuild.", - "ApplyAnyDeprecationFixups": "Umožňuje použít jakékoli opravy vyřazení z provozu.", - "overrideThePathToTheProjectFolder": "přepsat cestu ke složce projektu", - "UnableToFindProjectEnvironment$": "Nepovedlo se najít prostředí projektu ${p0}.", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "povolí podrobný režim, zobrazí podrobné zprávy o procesu.", - "aVersionOrVersionRangeToMatch": "verze nebo rozsah verzí, které se mají shodovat" + "UnableToFindProjectEnvironment$": "Nepovedlo se najít prostředí projektu ${p0}." } diff --git a/locales/messages.de.json b/locales/messages.de.json index 28c81490d3..72eb20293f 100644 --- a/locales/messages.de.json +++ b/locales/messages.de.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "eine integrierte Registrierung", "AConfigurationObject": "ein Konfigurationsobjekt", "ADateVersionString": "eine Datumsversionszeichenfolge", + "ADefaultFeature": "ein Standardfeature", "ADemandObject": "ein Anforderungsobjekt", "ADependency": "eine Abhängigkeit", + "ADependencyFeature": "ein Feature einer Abhängigkeit", "ADictionaryOfContacts": "ein Wörterbuch von Kontakten", "AFeature": "ein Feature", + "AFeatureName": "ein Featurename", "AFilesystemRegistry": "eine Dateisystemregistrierung", "AGitObjectSha": "ein GIT-Objekt SHA", "AGitReference": "eine Git-Referenz (z. B. ein Branch)", @@ -44,12 +47,12 @@ "AddArtifactOnlyOne": "„{command_line}“ kann jeweils nur ein Artefakt auf einmal hinzufügen.", "AddCommandFirstArg": "Der erste hinzuzufügende Parameter muss \"artifact\" oder \"port\" sein.", "AddFirstArgument": "Das erste Argument für „{command_line}“ muss „artifact“ oder „port“ sein.", - "AddHelp": "Fügt dem Manifest, das dem aktuellen Verzeichnis zugeordnet ist, den angegebenen Port oder das angegebene Artefakt hinzu.", "AddPortRequiresManifest": "„{command_line}“ erfordert eine aktive Manifestdatei.", "AddPortSucceeded": "Der Datei „vcpkg.json“ konnten erfolgreich Ports hinzugefügt werden.", "AddRecurseOption": "Wenn Sie sicher sind, dass Sie sie entfernen möchten, führen Sie den Befehl mit der Option „--recurse“ aus.", "AddTripletExpressionNotAllowed": "Triplet-Ausdrücke sind hier nicht zulässig. Sie können stattdessen „{package_name}:{triplet}“ in „{package_name}“ ändern.", "AddVersionAddedVersionToFile": "Version {version} zu {path} hinzugefügt", + "AddVersionArtifactsOnly": "--version ist nur Artefakte und kann nicht mit vcpkg-Hinzufügungport verwendet werden.", "AddVersionCommitChangesReminder": "Haben Sie daran gedacht, Ihre Änderungen zu übernehmen?", "AddVersionCommitResultReminder": "Vergessen Sie nicht, das Ergebnis zu committen!", "AddVersionDetectLocalChangesError": "Die Erkennung lokaler Änderungen wird aufgrund eines unerwarteten Formats in der Git-Statusausgabe übersprungen", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "Eingecheckte Dateien für {package_name} wurden geändert, aber die Version wurde nicht aktualisiert", "AddVersionPortFilesShaUnchanged": "Eingecheckte Dateien für {package_name} sind gegenüber Version {version} unverändert", "AddVersionPortHasImproperFormat": "{package_name} ist nicht ordnungsgemäß formatiert", - "AddVersionSuggestNewVersionScheme": "Verwenden Sie das Versionsschema „{new_scheme}“ anstelle von „{old_scheme}“ in Port „{package_name}“. \nVerwenden Sie --{option}, um diese Überprüfung zu deaktivieren.", + "AddVersionSuggestNewVersionScheme": "Verwenden Sie das Versionsschema „{new_scheme}“ anstelle von „{old_scheme}“ in Port „{package_name}“.\nVerwenden Sie --{option}, um diese Überprüfung zu deaktivieren.", "AddVersionUnableToParseVersionsFile": "Die Versionsdatei \"{path}\" kann nicht analysiert werden", "AddVersionUncommittedChanges": "Für {package_name} wurden keine Änderungen ausgeführt", "AddVersionUpdateVersionReminder": "Erinnern Sie sich daran, die Version oder Portversion zu aktualisieren?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} ist bereits installiert.", "AlreadyInstalledNotHead": "{spec} ist bereits installiert – wird nicht aus HEAD erstellt.", "AmbiguousConfigDeleteConfigFile": "Mehrdeutige vcpkg-Konfiguration, die sowohl von Manifest als auch von der Konfigurationsdatei bereitgestellt wird.\n– Konfigurationsdatei {path} löschen", + "AnArrayOfDefaultFeatures": "ein Array von Standardfeatures", "AnArrayOfDependencies": "ein Array von Abhängigkeiten", "AnArrayOfDependencyOverrides": "ein Array von Abhängigkeitsüberschreibungen", + "AnArrayOfFeatures": "ein Array von Features", "AnArrayOfIdentifers": "ein Array von Bezeichnern", "AnArrayOfOverlayPaths": "ein Array von Überlagerungspfaden", "AnArrayOfOverlayTripletsPaths": "ein Array von Überlagerungs-Tripelpfaden", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "Auf dem Computer wird gerade eine andere Installation ausgeführt. 6 Sekunden warten, bevor der Versuch wiederholt wird.", "AppliedUserIntegration": "Die benutzerweite Integration für diesen vcpkg-Stamm wurde angewendet.", "ApplocalProcessing": "vcpkg applocal-Verarbeitung: {path}", + "ArtifactsBootstrapFailed": "vcpkg-artifacts ist nicht installiert und konnte nicht mit dem Bootstrapping ausgeführt werden.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts ist nicht installiert und kann nicht installiert werden, da VCPKG_ROOT als schreibgeschützt angenommen wird. Dieses Problem kann möglicherweise durch erneutes Installieren von vcpkg mithilfe des One Liners behoben werden.", + "ArtifactsNotOfficialWarning": "Verwenden von vcpkg-artifacts mit einer inoffiziellen ", "ArtifactsOptionIncompatibility": "--{option} hat keine Auswirkungen auf \"Artefakt suchen\".", + "ArtifactsOptionJson": "Vollständiger Pfad zur JSON-Datei, in der Umgebungsvariablen und andere Eigenschaften aufgezeichnet werden.", + "ArtifactsOptionMSBuildProps": "Vollständiger Pfad zu der Datei, in die MSBuild-Eigenschaften geschrieben werden", + "ArtifactsOptionVersion": "Eine Version oder ein Versionsbereich, der übereinstimmen soll; nur für Artefakte gültig", + "ArtifactsOptionVersionMismatch": "Die Anzahl der --version-Switches muss mit der Anzahl der benannten Artefakte übereinstimmen.", + "ArtifactsSwitchARM": "Erzwingt die Hosterkennung auf ARM beim Abrufen von Artefakten.", + "ArtifactsSwitchARM64": "Erzwingt die Hosterkennung auf ARM64 beim Abrufen von Artefakten.", + "ArtifactsSwitchAll": "Aktualisiert alle bekannten Artefaktregistrierungen", + "ArtifactsSwitchAllLanguages": "Ruft beim Abrufen von Artefakten alle Sprachdateien ab.", + "ArtifactsSwitchForce": "Erzwingt die erneute Anforderung, wenn bereits ein Artefakt abgerufen wurde.", + "ArtifactsSwitchFreebsd": "Erzwingt die Hosterkennung auf FreeBSD beim Abrufen von Artefakten.", + "ArtifactsSwitchLinux": "Erzwingt die Hosterkennung auf Linux beim Abrufen von Artefakten.", + "ArtifactsSwitchNormalize": "Wendet alle veralteten Fixups an.", + "ArtifactsSwitchOnlyOneHostPlatform": "Es kann nur eine Hostplattform (--x64, --x86, --arm, --arm64) festgelegt werden.", + "ArtifactsSwitchOnlyOneOperatingSystem": "Es kann nur ein Betriebssystem (--windows, --osx, --linux, --freebsd) festgelegt werden.", + "ArtifactsSwitchOnlyOneTargetPlatform": "Es kann nur eine Zielplattform (--target:x64, --target:x86, --target:arm, --target:arm64) festgelegt werden.", + "ArtifactsSwitchOsx": "Erzwingt die Hosterkennung auf MacOS beim Abrufen von Artefakten.", + "ArtifactsSwitchTargetARM": "Legt die Zielerkennung beim Abrufen von Artefakten auf ARM fest.", + "ArtifactsSwitchTargetARM64": "Legt die Zielerkennung beim Abrufen von Artefakten auf ARM64 fest.", + "ArtifactsSwitchTargetX64": "Legt die Zielerkennung beim Abrufen von Artefakten auf x64 fest.", + "ArtifactsSwitchTargetX86": "Legt das Ziel beim Abrufen von Artefakten auf x86 fest.", + "ArtifactsSwitchWindows": "Erzwingt die Hosterkennung auf Windows beim Abrufen von Artefakten.", + "ArtifactsSwitchX64": "Erzwingt die Hosterkennung auf x64 beim Abrufen von Artefakten.", + "ArtifactsSwitchX86": "Erzwingt die Hosterkennung auf x86 beim Abrufen von Artefakten.", "AssetCacheProviderAcceptsNoArguments": "Unerwartete Argumente: \"{value}\" akzeptiert keine Argumente.", - "AssetSourcesArg": "Fügen Sie Quellen für die Ressourcenzwischenspeicherung hinzu. Siehe „vcpkg help assetcaching“.", + "AssetSourcesArg": "Objekt-Cachequellen. Siehe „vcpkg-Hilfe zum Objekt-Zwischenspeichern“", "AttemptingToFetchPackagesFromVendor": "Es wird versucht, {count} Pakete von {vendor} abzurufen.", "AttemptingToSetBuiltInBaseline": "Es wird versucht, die integrierte Baseline in \"vcpkg.json\" festzulegen, während die Standardregistrierung in \"vcpkg-configuration.json\" überschrieben wird.\ndie Standardregistrierung aus \"vcpkg-configuration.json\" wird verwendet.", "AuthenticationMayRequireManualAction": "Mindestens ein {vendor}-Anmeldeinformationsanbieter hat eine manuelle Aktion angefordert. Fügen Sie die binäre Quelle \"interactive\" hinzu, um Interaktivität zuzulassen.", "AutoSettingEnvVar": "-- Automatisches Setzen von {env_var} Umgebungsvariablen auf \"{url}\".", "AutomaticLinkingForMSBuildProjects": "Es ist jetzt möglich, dass alle MSBuild C++-Projekte #include alle installierten Bibliotheken. Die Verknüpfung wird automatisch verarbeitet. Durch die Installation neuer Bibliotheken werden diese sofort verfügbar.", - "AvailableArchitectureTriplets": "Verfügbare Architekturtriplets:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 und höher kann jetzt alle installierten Bibliotheken beinhalten (#include). Die Verknüpfung wird automatisch verarbeitet. Durch die Installation neuer Bibliotheken werden diese sofort verfügbar.", "AvailableHelpTopics": "Verfügbare Hilfethemen:", "AzUrlAssetCacheRequiresBaseUrl": "Unerwartete Argumente: Die Ressourcenkonfiguration \"azurl\" erfordert eine Basis-URL.", "AzUrlAssetCacheRequiresLessThanFour": "Unerwartete Argumente: Die Ressourcenkonfiguration \"azurl\" erfordert weniger als 4 Argumente.", "BaselineConflict": "Die Angabe von \"vcpkg-configuration.default-registry\" in einer Manifestdatei verursacht einen Konflikt mit der integrierten Baseline.\nEntfernen Sie eine dieser widersprüchlichen Einstellungen.", "BaselineFileNoDefaultField": "Die Baselinedatei beim Commit \"{commit_sha}\" war ungültig (kein Feld \"Standard\").", - "BaselineFileNoDefaultFieldPath": "Die Baselinedatei von {path} war ungültig (fehlendes Standardfeld).", "BaselineGitShowFailed": "Beim Auschecken der Baseline aus dem Commit \"{commit_sha}\" konnte \"git show\" versions/baseline.json nicht ausgeführt werden. Dies kann behoben werden, indem Commits mit \"git fetch\" abgerufen werden.", "BaselineMissing": "Die Baselineversion wurde nicht gefunden. Führen Sie Folgendes aus:\nvcpkg x-add-version {package_name}\nGit-Add-Versionen\ngit commit -m \"Versionsdatenbank aktualisieren\"\num die Version {version} als Baselineversion festzulegen.", - "BaselineMissingDefault": "\"baseline.json\" aus dem Commit \"{commit_sha}\" im Repository \"{url}\" war ungültig (enthielt kein Feld \"Standard\").", - "BinarySourcesArg": "Fügen Sie Quellen für die binäre Zwischenspeicherung hinzu. Siehe „vcpkg help binarycaching“.", + "BinaryCacheVendorHTTP": "HTTP-Server", + "BinarySourcesArg": "Binäre Cachequellen. Siehe „vcpkg-Hilfe zu binärem Zwischenspeichern“", "BinaryWithInvalidArchitecture": "{path}\n Erwartet: {expected}, war aber {actual}", "BuildAlreadyInstalled": "„{spec}“ ist bereits installiert; entfernen Sie „{spec}“, bevor Sie versuchen, es zu erstellen.", "BuildDependenciesMissing": "Für den Buildbefehl müssen alle Abhängigkeiten bereits installiert sein.\nDie folgenden Abhängigkeiten fehlen:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "ERFOLGREICH", "BuildResultSummaryHeader": "ZUSAMMENFASSUNG FÜR {triplet}", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(Experimentell) Geben Sie das Buildstrukturstammverzeichnis an.", + "BuildTreesRootDir": "Buildstrukturverzeichnis (experimentell)", "BuildTroubleshootingMessage1": "Stellen Sie sicher, dass Sie die neuesten Portdateien mit „git pull“ und „vcpkg update“ verwenden.\nÜberprüfen Sie dann auf bekannte Probleme unter:", "BuildTroubleshootingMessage2": "Sie können ein neues Problem einreichen unter:", "BuildTroubleshootingMessage3": "Schließen Sie „[{package_name}] Buildfehler“ in Ihren Titel des Fehlerberichts, die folgenden Versionsinformationen in Ihre Fehlerbeschreibung ein, und fügen Sie alle relevanten Fehlerprotokolle von oben an.", "BuildTroubleshootingMessage4": "Bitte verwenden Sie die vorausgefüllte Vorlage von {path}, wenn Sie Ihr Problem melden.", - "BuildTroubleshootingMessageGH": "Sie können ein Problem auch einreichen, indem Sie Folgendes tun (GitHub-Cli muss installiert sein):", + "BuildTroubleshootingMessageGH": "Sie können ein Problem auch einreichen, indem Sie Folgendes tun (GitHub-CLI muss installiert sein):", "BuildingFromHead": "{spec} wird aus HEAD erstellt...", "BuildingPackage": "{spec} wird erstellt...", "BuildingPackageFailed": "Fehler beim Erstellen von \"{spec}\": {build_result}", "BuildingPackageFailedDueToMissingDeps": "aufgrund der folgenden fehlenden Abhängigkeiten:", - "BuiltInTriplets": "vcpkg-integrierte Triplets:", + "BuiltInTriplets": "Integrierte Triplets:", "BuiltWithIncorrectArchitecture": "Die folgenden Dateien wurden für eine falsche Architektur erstellt:", "CISettingsExclude": "Durch Komma getrennte Liste der zu überspringenden Ports", "CISettingsOptCIBase": "Pfad zur Datei \"ci.baseline.txt\". Wird verwendet, um Ports zu überspringen und Regressionen zu erkennen.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "Datei zum Ausgeben aller ermittelten Pakethashes", "CISettingsOptParentHashes": "Datei zum Lesen von Pakethashes für einen übergeordneten CI-Zustand, um den Satz geänderter Pakete zu reduzieren", "CISettingsOptSkippedCascadeCount": "Bestätigt, dass die Anzahl der \"--exclude and supports skips\" genau dieser Anzahl entspricht", - "CISettingsOptXUnit": "Datei, die Ergebnisse im XUnit-Format ausgibt (intern)", - "CISettingsVerifyGitTree": "Vergewissern Sie sich, dass jedes Git-Strukturobjekt mit seiner deklarierten Version übereinstimmt (dies ist sehr langsam).", - "CISettingsVerifyVersion": "Druckergebnis für jeden Port anstatt nur Fehler.", - "CISwitchOptAllowUnexpectedPassing": "Gibt an, dass die Ergebnisse \"Passing, remove from fail list\" (Bestanden, von der Fehlerliste entfernen) nicht ausgegeben werden sollen.", - "CISwitchOptDryRun": "Plan ohne Ausführung drucken", - "CISwitchOptRandomize": "Zufällige Installationsreihenfolge", - "CISwitchOptSkipFailures": "Gibt an, dass Ports, die in \"ci.baseline.txt\" als \"=fail\" gekennzeichnet sind, übersprungen werden sollen.", - "CISwitchOptXUnitAll": "Melden Sie auch unveränderte Ports an die XUnit-Ausgabe (intern).", + "CISettingsOptXUnit": "Datei, die Ergebnisse im XUnit-Format ausgibt", + "CISettingsVerifyGitTree": "Überprüft, ob jedes Git-Strukturobjekt mit seiner deklarierten Version übereinstimmt (dies ist sehr langsam).", + "CISettingsVerifyVersion": "Druckt das Ergebnis für jeden Port und nicht nur für die Fehler", + "CISkipInstallation": "Die folgenden Pakete sind bereits installiert und werden nicht erneut erstellt:", + "CISwitchOptAllowUnexpectedPassing": "Unterdrückt die Ergebnisse „Bestanden, von der Fehlerliste entfernen“.", + "CISwitchOptDryRun": "Druckt Plan ohne Ausführung aus.", + "CISwitchOptRandomize": "Randomisiert die Installationsreihenfolge", + "CISwitchOptSkipFailures": "Überspringt Ports, die in ci.baseline.txt als „=fail“ markiert sind.", + "CISwitchOptXUnitAll": "Meldet unveränderte Ports in der XUnit-Ausgabe.", "CMakeTargetsUsage": "„{package_name}“ stellt CMake-Ziele bereit:", "CMakeTargetsUsageHeuristicMessage": "# this is heuristically generated, and may be not correct", "CMakeToolChainFile": "CMake-Projekte sollten Folgendes verwenden: „-DCMAKE_TOOLCHAIN_FILE={path}“", "CMakeUsingExportedLibs": "Um exportierte Bibliotheken in CMake-Projekten zu verwenden, fügen Sie Ihrer CMake-Befehlszeile {value} hinzu.", - "CacheHelp": "Das Argument muss ein zu suchender substring und darf kein Argument sein, um alle zwischengespeicherten Bibliotheken anzuzeigen.", "CheckedOutGitSha": "Ausgechecktes Git-SHA: {commit_sha}", "CheckedOutObjectMissingManifest": "Das ausgecheckte Objekt enthält keine CONTROL- oder vcpkg.json-Datei.", "ChecksFailedCheck": "„vcpkg“ ist abgestürzt; es sind keine weiteren Details verfügbar.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "Das Aktualisieren von vcpkg durch erneutes Ausführen von „bootstrap-vcpkg“ kann diesen Fehler möglicherweise beheben.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing kann nur verwendet werden, wenn eine Baseline über --ci-baseline bereitgestellt wird.", "CiBaselineDisallowedCascade": "REGRESSION: {spec} überlappend, muss aber übergeben werden. ({path}.)", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "REGRESSION: Fehler bei unabhängigem {spec} mit {build_result}.", "CiBaselineRegression": "REGRESSION: {spec} ist mit {build_result} fehlgeschlagen. Falls erwartet, fügen Sie {spec}=fail zu {path} hinzu.", "CiBaselineRegressionHeader": "REGRESSIONEN:", + "CiBaselineUnexpectedFail": "REGRESSION: {spec} ist als Fehler markiert, wird aber für {triplet} nicht unterstützt.", + "CiBaselineUnexpectedFailCascade": "REGRESSION: {spec} ist als Fehler markiert, aber eine Abhängigkeit wird für {triplet} nicht unterstützt.", "CiBaselineUnexpectedPass": "BESTANDEN, VON DER FEHLERLISTE ENTFERNEN: {spec} ({Pfad}).", "ClearingContents": "Inhalt von {path} wird gelöscht", "CmakeTargetsExcluded": "Hinweis: {count} zusätzliche Ziele werden nicht angezeigt.", - "CmdAddVersionOptAll": "Verarbeiten Sie Versionen für alle Ports.", - "CmdAddVersionOptOverwriteVersion": "Überschreiben Sie \"git-tree\" einer vorhandenen Version.", + "CmdAcquireExample1": "vcpkg abrufen ", + "CmdAcquireProjectSynopsis": "Ruft alle Artefakte ab, auf die von einem Manifest verwiesen wird.", + "CmdAcquireSynopsis": "Ruft das benannte Artefakt ab.", + "CmdActivateSynopsis": "Aktiviert Artefakte aus einem Manifest.", + "CmdAddExample1": "vcpkg-Port hinzufügen ", + "CmdAddExample2": "vcpkg-Artefakt hinzufügen ", + "CmdAddSynopsis": "Fügt dem Manifest eine Abhängigkeit hinzu.", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "Verarbeitet Versionen für alle Ports.", + "CmdAddVersionOptOverwriteVersion": "Überschreibt „git-tree“ einer vorhandenen Version.", "CmdAddVersionOptSkipFormatChk": "Überspringt die Formatierungsprüfung von vcpkg.json-Dateien.", "CmdAddVersionOptSkipVersionFormatChk": "Überspringt die Versionsformatprüfung.", - "CmdAddVersionOptVerbose": "Drucken Sie Erfolgsmeldungen statt nur Fehler.", + "CmdAddVersionOptVerbose": "Druckt Erfolgsmeldungen statt nur Fehler.", + "CmdAddVersionSynopsis": "Fügt der Versionsdatenbank eine Version hinzu.", + "CmdBootstrapStandaloneSynopsis": "Führt ein Bootstrap eines vcpkg-Stamms nur aus einer vcpkg-Binärdatei aus.", + "CmdBuildExample1": "vcpkg-Build ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "Erstellt einen Port aus einem Pfad.", + "CmdBuildSynopsis": "Erstellt einen Port.", + "CmdCacheExample1": "vcpkg-Cache ", + "CmdCacheSynopsis": "Paketspezifikationen auflisten", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "Testet, ob ein Port unterstützt wird, ohne ihn zu erstellen.", + "CmdCiCleanSynopsis": "Löscht alle Dateien, um sich auf eine CI-Ausführung vorzubereiten.", + "CmdCiSynopsis": "Versucht, alle Ports für CI-Tests zu erstellen.", + "CmdCiVerifyVersionsSynopsis": "Überprüft die Integrität der Versionsdatenbank.", "CmdContactOptSurvey": "Standardbrowser für die aktuelle vcpkg-Umfrage starten", - "CmdDependInfoOptDGML": "Erstellt ein Diagramm auf der Grundlage von dgml.", - "CmdDependInfoOptDepth": "Rekursionstiefe in Ausgabe anzeigen", - "CmdDependInfoOptDot": "Erstellt ein Diagramm auf der Grundlage von dot.", - "CmdDependInfoOptMaxRecurse": "Legen Sie die maximale Rekursionstiefe fest. Der Wert -1 gibt an, dass kein Grenzwert vorhanden ist.", - "CmdDependInfoOptSort": "Legen Sie die Sortierreihenfolge für die Liste der Abhängigkeiten fest. Akzeptierte Werte sind: lexikografisch, topologisch (Standard), x-Baumstruktur, umgekehrt", - "CmdEditOptAll": "Öffnen des Editors im Port und im portspezifischen Buildstrukturunterordner", - "CmdEditOptBuildTrees": "Öffnen des Editors im portspezifischen Buildstrukturunterordner", - "CmdEnvOptions": "Installierten {path} zu {env_var} hinzufügen", - "CmdExportOpt7Zip": "In eine 7zip(.7z)-Datei exportieren", - "CmdExportOptChocolatey": "Exportieren eines Chocolatey-Pakets (experimentelles Feature)", - "CmdExportOptDebug": "Prefab-Debuggen aktivieren", - "CmdExportOptDryRun": "Nicht wirklich exportieren.", - "CmdExportOptIFW": "Exportieren in ein IFW-basiertes Installationsprogramm", - "CmdExportOptInstalled": "Alle installierten Pakete exportieren", - "CmdExportOptMaven": "Maven aktivieren", - "CmdExportOptNuget": "NuGet-Paket exportieren", - "CmdExportOptPrefab": "In Prefab-Format exportieren", - "CmdExportOptRaw": "In ein nicht komprimiertes Verzeichnis exportieren", - "CmdExportOptZip": "In eine ZIP-Datei exportieren", - "CmdExportSettingChocolateyMaint": "Geben Sie den Maintainer für das exportierte Chocolatey-Paket an (experimentelles Feature).", - "CmdExportSettingChocolateyVersion": "Geben Sie das Versionssuffix an, das für das exportierte Chocolatey-Paket hinzugefügt werden soll (experimentelles Feature).", - "CmdExportSettingConfigFile": "Geben Sie den temporären Dateipfad für die Installationsprogrammkonfiguration an.", - "CmdExportSettingInstallerPath": "Geben Sie den Dateipfad für das exportierte Installationsprogramm an.", - "CmdExportSettingNugetDesc": "Geben Sie eine Beschreibung für das exportierte NuGet-Paket an.", - "CmdExportSettingNugetID": "Geben Sie die ID für das exportierte NuGet-Paket an (überschreibt --output).", - "CmdExportSettingNugetVersion": "Geben Sie eine Version für das exportierte NuGet-Paket an.", - "CmdExportSettingOutput": "Geben Sie den Ausgabenamen an (wird zum Erstellen des Dateinamens verwendet).", - "CmdExportSettingOutputDir": "Angeben des Ausgabeverzeichnisses für erstellte Artefakte", - "CmdExportSettingPkgDir": "Geben Sie den temporären Verzeichnispfad für die neu gepackten Pakete an.", + "CmdCreateExample1": "vcpkg-Erstellung ", + "CmdCreateExample2": "vcpkg-Erstellung my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg-Erstellung ", + "CmdDeactivateSynopsis": "Entfernt alle Artefaktaktivierungen aus der aktuellen Shell.", + "CmdDependInfoExample1": "vcpkg-Abhängigkeitsinformationen ", + "CmdDependInfoFormatConflict": "In Konflikt stehende Formate angegeben. Es wird nur eines von --format, --dgml oder --dot akzeptiert.", + "CmdDependInfoFormatHelp": "Wählt ein Ausgabeformat aus: \"list\", \"tree\", \"mermaid\", \"dot\" oder \"dgml\".", + "CmdDependInfoFormatInvalid": "--format={value} ist kein bekanntes Format. --format muss einer von \"list\", \"tree\", \"mermaid\", \"dot\" oder \"dgml\" sein.", + "CmdDependInfoOptDepth": "Zeigt die Rekursionstiefe in der Ausgabe „list“ an.", + "CmdDependInfoOptMaxRecurse": "Legt die maximale Rekursionstiefe fest. Der Standardwert ist „kein Grenzwert“.", + "CmdDependInfoOptSort": "Wählt die Sortierreihenfolge für das Format „list“, eines von „exicographical“, „topographic“ (Standard), „reverse“ aus.", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth kann nur mit den Formaten \"list\" und \"tree\" verwendet werden.", + "CmdDependInfoXtreeTree": "--sort=x-tree kann nicht mit anderen Formaten als \"tree\" verwendet werden.", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Lädt eine Datei herunter.", + "CmdEditExample1": "vcpkg-Bearbeitung ", + "CmdEditOptAll": "Öffnet den Editor im Port und im portspezifischen Buildstrukturunterordner", + "CmdEditOptBuildTrees": "Öffnet den Editor im portspezifischen Buildstrukturunterordner.", + "CmdEnvOptions": "Fügt installierten {path} zu {env_var} hinzu.", + "CmdExportEmptyPlan": "Es wird abgelehnt, einen Export von Nullpaketen zu erstellen. Installieren Sie Pakete vor dem Exportieren.", + "CmdExportExample1": "vcpkg-Export [--nuget] [--directory=out_dir]", + "CmdExportOpt7Zip": "Exportiert in eine 7zip(.7z)-Datei.", + "CmdExportOptChocolatey": "Exportiert ein Chocolatey-Paket (experimentell)", + "CmdExportOptDebug": "Aktiviert das Prefab-Debuggen", + "CmdExportOptDryRun": "Exportiert nicht wirklich", + "CmdExportOptIFW": "Exportiert in ein IFW-basiertes Installationsprogramm", + "CmdExportOptInstalled": "Exportiert alle installierten Pakete.", + "CmdExportOptMaven": "Aktiviert Maven.", + "CmdExportOptNuget": "Exportiert ein NuGet-Paket", + "CmdExportOptPrefab": "Exportiert in das Prefab-Format", + "CmdExportOptRaw": "Exportiert in ein nicht komprimiertes Verzeichnis.", + "CmdExportOptZip": "Exportiert in eine ZIP-Datei", + "CmdExportSettingChocolateyMaint": "Der Maintainer für das exportierte Chocolatey-Paket (experimentell).", + "CmdExportSettingChocolateyVersion": "Das Versionssuffix, das für das exportierte Chocolatey-Paket hinzugefügt werden soll (experimentell).", + "CmdExportSettingConfigFile": "Der temporäre Dateipfad für die Installationsprogrammkonfiguration.", + "CmdExportSettingInstallerPath": "Der Dateipfad für das exportierte Installationsprogramm.", + "CmdExportSettingNugetDesc": "Beschreibung für das exportierte NuGet-Paket", + "CmdExportSettingNugetID": "ID für das exportierte NuGet-Paket (überschreibt --output).", + "CmdExportSettingNugetVersion": "Die Version für das exportierte NuGet-Paket.", + "CmdExportSettingOutput": "Der Ausgabename (wird zum Erstellen des Dateinamens verwendet).", + "CmdExportSettingOutputDir": "Das Ausgabeverzeichnis für erstellte Artefakte.", + "CmdExportSettingPkgDir": "Der temporäre Verzeichnispfad für die neu gepackten Pakete.", "CmdExportSettingPrefabArtifactID": "\"Artefakt-ID\" ist der Name des Projekts gemäß Maven-Spezifikationen.", "CmdExportSettingPrefabGroupID": "GroupId identifiziert Ihr Projekt eindeutig gemäß Maven-Spezifikationen.", "CmdExportSettingPrefabVersion": "\"Version\" ist der Name des Projekts gemäß Maven-Spezifikationen.", - "CmdExportSettingRepoDir": "Geben Sie den Verzeichnispfad für das exportierte Repository an.", - "CmdExportSettingRepoURL": "Angeben der Remote-Repository-URL für das Online-Installationsprogramm", + "CmdExportSettingRepoDir": "Der Verzeichnispfad für das exportierte Repository.", + "CmdExportSettingRepoURL": "Die Remote-Repository-URL für das Onlineinstallationsprogramm", "CmdExportSettingSDKMinVersion": "Mindestens unterstützte Android SDK-Version", - "CmdExportSettingSDKTargetVersion": "Android-Ziel-SDK-Version", - "CmdFetchOptXStderrStatus": "Direkter Status/Herunterladen von Nachrichten an \"stderr\" anstelle von \"stdout\". (Fehler/Misserfolge gehen weiterhin zu stdout)", - "CmdFormatManifestOptAll": "Formatieren Sie die Manifestdateien aller Ports.", - "CmdFormatManifestOptConvertControl": "Konvertieren Sie CONTROL-Dateien in Manifestdateien.", - "CmdGenerateMessageMapOptNoOutputComments": "Schließen Sie beim Generieren der Nachrichtenzuordnung Kommentare aus (nützlich zum Generieren der englischen Lokalisierungsdatei).", - "CmdInfoOptInstalled": "(experimentell) Berichte zu installierten Paketen statt verfügbar", - "CmdInfoOptTransitive": "(experimentell) Berichten Sie auch über Abhängigkeiten von installierten Paketen.", - "CmdNewOptApplication": "Erstellen Sie ein Anwendungsmanifest (kein Name oder keine Version erforderlich).", - "CmdNewOptSingleFile": "Betten Sie \"vcpkg-configuration.json\" in \"vcpkg.json\" ein.", - "CmdNewOptVersionDate": "Interpretieren Sie \"--version\" als ISO 8601-Datum. (JJJJ-MM-TT)", - "CmdNewOptVersionRelaxed": "Interpretieren Sie \"--version\" als gelockerte numerische Version. (Nicht negative Zahlen durch Punkte getrennt)", - "CmdNewOptVersionString": "Interpretieren Sie \"--version\" als Zeichenfolge ohne Sortierungsverhalten.", + "CmdExportSettingSDKTargetVersion": "Die Android-Ziel-SDK-Version", + "CmdExportSynopsis": "Erstellt eine eigenständige Bereitstellung installierter Ports.", + "CmdFetchOptXStderrStatus": "Druckt Status/Herunterladen von Nachrichten an „stderr“ anstelle von „stdout“. (Fehler/Misserfolge gehen weiterhin zu „stdout“)", + "CmdFetchSynopsis": "Ruft etwas aus dem System oder dem Internet ab.", + "CmdFindExample1": "vcpkg-Portsuche ", + "CmdFindExample2": "vcpkg-Artefaktsuche ", + "CmdFindSynopsis": "Sucht einen Port oder ein Artefakt, der installiert oder aktiviert werden kann.", + "CmdFormatManifestExample1": "vcpkg-Formatmanifest ", + "CmdFormatManifestOptAll": "Formatiert die Manifestdateien aller Ports.", + "CmdFormatManifestOptConvertControl": "Konvertiert CONTROL-Dateien in Manifestdateien.", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "Generiert MSBuild-PROPS-Dateien, als ob die Artefaktabhängigkeiten eines Manifests aktiviert werden, ohne dass sie abgerufen werden.", + "CmdGenerateMessageMapOptNoOutputComments": "Schließt beim Generieren der Nachrichtenzuordnung Kommentare aus (nützlich zum Generieren der englischen Lokalisierungsdatei).", + "CmdHashExample1": "vcpkg-Hash ", + "CmdHashExample2": "vcpkg-Hash SHA256", + "CmdHashSynopsis": "Ruft SHA256 oder SHA512 einer Datei ab.", + "CmdHelpCommandSynopsis": "Zeigt Hilfedetails für an", + "CmdHelpCommands": "Hilfe ", + "CmdHelpCommandsSynopsis": "Zeigt die vollständige Liste der Befehle an, einschließlich seltener Befehle, die hier nicht aufgeführt sind.", + "CmdHelpTopic": "Hilfe ", + "CmdInfoOptInstalled": "(experimentell) Meldet installierte Pakete anstelle von verfügbar.", + "CmdInfoOptTransitive": "(experimentell) Berichtet auch über Abhängigkeiten von installierten Paketen.", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Erstellt eine leere Git-Registrierung.", + "CmdInstallExample1": "vcpkg-Installation ...", + "CmdIntegrateSynopsis": "Integriert vcpkg in Computer, Projekte oder Shells.", + "CmdListExample2": "vcpkg-Liste ", + "CmdNewExample1": "vcpkg neu --name=example --version=1.0", + "CmdNewOptApplication": "Erstellt ein Anwendungsmanifest (kein Name oder keine Version erforderlich).", + "CmdNewOptSingleFile": "Bettet \"vcpkg-configuration.json\" in \"vcpkg.json\" ein.", + "CmdNewOptVersionDate": "Interpretiert „--version“ als ISO 8601-Datum. (JJJJ-MM-TT)", + "CmdNewOptVersionRelaxed": "Interpretiert „--version“ als gelockerte numerische Version. (Nicht negative Zahlen durch Punkte getrennt)", + "CmdNewOptVersionString": "Interpretiert „--version“ als Zeichenfolge ohne Sortierungsverhalten.", "CmdNewSettingName": "Name für das neue Manifest.", "CmdNewSettingVersion": "Version für das neue Manifest.", - "CmdRegenerateOptDryRun": "führt die Aktion nicht tatsächlich aus, sondern zeigt nur an, was erledigt werden würde.", - "CmdRegenerateOptForce": "fährt ohne Bestätigung mit der (potenziell gefährlichen) Aktion fort.", - "CmdRegenerateOptNormalize": "Anwenden aller veralteten Fixups", - "CmdRemoveOptDryRun": "Zu entfernende Pakete drucken, aber nicht entfernen", - "CmdRemoveOptOutdated": "Wählen Sie alle Pakete mit Versionen aus, die nicht mit den Portdateien übereinstimmen.", - "CmdRemoveOptRecurse": "Entfernen von Paketen zulassen, die nicht explizit in der Befehlszeile angegeben sind", - "CmdSetInstalledOptDryRun": "Nicht erstellen oder installieren", - "CmdSetInstalledOptNoUsage": "Drucken Sie nach der Installation keine CMake-Nutzungsinformationen.", - "CmdSetInstalledOptWritePkgConfig": "Schreibt eine Datei im NuGet packages.config-Format für die Verwendung mit externer binärer Zwischenspeicherung.\n Weitere Informationen finden Sie unter \"vcpkg help binarycaching\".", + "CmdNewSynposis": "Erstellt ein neues Manifest.", + "CmdOwnsExample1": "vcpkg besitzt ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "Vergleicht Änderungen in Portversionen zwischen Commits", + "CmdRegenerateOptDryRun": "Führt die Aktion nicht tatsächlich aus, sondern zeigt nur an, was erledigt werden würde.", + "CmdRegenerateOptForce": "Fährt ohne Bestätigung mit der (potenziell gefährlichen) Aktion fort.", + "CmdRegenerateOptNormalize": "Wendet alle veralteten Fixes an.", + "CmdRemoveExample1": "vcpkg entfernt ...", + "CmdRemoveOptDryRun": "Druckt die zu entfernenden Pakete, entfernt sie aber nicht.", + "CmdRemoveOptOutdated": "Entfernt alle Pakete mit Versionen aus, die nicht mit der integrierten Registrierung übereinstimmen.", + "CmdRemoveOptRecurse": "Ermöglicht das Entfernen abhängiger Pakete, die nicht explizit angegeben sind.", + "CmdSearchExample1": "vcpkg-Suche ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "Erstellt oder installiert nicht", + "CmdSetInstalledOptNoUsage": "Gibt nach der Installation keine CMake-Nutzungsinformationen aus.", + "CmdSetInstalledOptWritePkgConfig": "Schreibt eine Datei im NuGet packages.config-Format für die Verwendung mit externem binärem Zwischenspeichern. Weitere Informationen finden Sie unter „vcpkg-Hilfe zu binärem Zwischenspeichern“.", + "CmdSetInstalledSynopsis": "Installiert, aktualisiert oder entfernt Pakete so, dass die installierten Pakete genau mit den bereitgestellten übereinstimmen", "CmdSettingCopiedFilesLog": "Pfad zum zu erstellenden kopierten Dateiprotokoll", "CmdSettingInstalledDir": "Pfad zur zu verwendenden installierten Struktur", "CmdSettingTLogFile": "Pfad zur zu erstellenden TLOG-Datei", "CmdSettingTargetBin": "Pfad zur zu analysierenden Binärdatei", - "CmdUpdateBaselineOptDryRun": "Plan ohne Ausführung drucken", - "CmdUpdateBaselineOptInitial": "Hinzufügen einer \"integrierten Baseline\" zu einer Datei \"vcpkg.json\", die noch nicht vorhanden ist", - "CmdUpgradeOptAllowUnsupported": "Anstatt einen Fehler an einem nicht unterstützten Port anzuzeigen, fahren Sie mit einer Warnung fort.", + "CmdUpdateBaselineOptDryRun": "Druckt Plan ohne Ausführung aus.", + "CmdUpdateBaselineOptInitial": "Fügt einer vcpkg.json-Datei, die noch nicht über eine integrierte Baseline verfügt, eine integrierte Baseline hinzu.", + "CmdUpdateBaselineSynopsis": "Aktualisiert Baselines von Git-Registrierungen in einem Manifest für den HEAD-Commit dieser Registrierungen.", + "CmdUpdateRegistryAll": "Aktualisiert alle bekannten Artefaktregistrierungen", + "CmdUpdateRegistryAllExcludesTargets": "„Update registry --all“ kann nicht mit einer Liste von Artefaktregistrierungen verwendet werden.", + "CmdUpdateRegistryAllOrTargets": "Dem Befehl „update registry“ muss entweder eine Liste mit Artefaktregistrierungsnamen oder URIs zum Aktualisieren mitgegeben werden, oder „--all“.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "Lädt eine Artefaktregistrierung erneut herunter.", "CmdUpgradeOptNoDryRun": "Tatsächlich upgraden", "CmdUpgradeOptNoKeepGoing": "Installation von Paketen bei Fehler beenden", + "CmdUseExample1": "vcpkg verwendet ", + "CmdUseSynopsis": "Aktivieren eines einzelnen Artefakts in dieser Shell", + "CmdVSInstancesSynopsis": "Listet erkannte Visual Studio-Instanzen auf.", "CmdXDownloadOptHeader": "Zusätzlicher Header, der beim Abrufen aus URLs verwendet werden soll", "CmdXDownloadOptSha": "Der Hash der Datei, die heruntergeladen werden soll", - "CmdXDownloadOptSkipSha": "Überprüfen Sie nicht die SHA512-Datei der heruntergeladenen Datei.", - "CmdXDownloadOptStore": "Gibt an, dass die Datei gespeichert und nicht abgerufen werden soll.", + "CmdXDownloadOptSkipSha": "Überspringt die Überprüfung von SHA512 der heruntergeladenen Datei.", + "CmdXDownloadOptStore": "Speichert die Datei, anstatt sie abzurufen.", "CmdXDownloadOptUrl": "URL zum Herunterladen und Speichern, wenn sie im Cache fehlt", + "CmdZApplocalSynopsis": "Kopiert die Abhängigkeiten einer Binärdatei aus der installierten Struktur an den Speicherort dieser Binärdatei für die lokale App-Bereitstellung.", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "Die Anzahl der führenden Verzeichnisse, die aus allen Pfaden entfernt werden sollen.", + "CommandEnvExample2": "vcpkg env „ninja -C “ --triplet x64-windows", "CommandFailed": "Befehl:\n{command_line}\nmit den folgenden Ergebnissen fehlgeschlagen:", - "Commands": "Befehle:", - "CommunityTriplets": "VCPKG-Community-Triplets:", + "CommunityTriplets": "Community-Triplets:", "ComparingUtf8Decoders": "Utf8Decoders mit unterschiedlicher Herkunft vergleichen; dies ist immer ein Fehler.", "CompressFolderFailed": "Fehler beim Komprimieren des Ordners \"{path}\":", "ComputingInstallPlan": "Installationsplan wird berechnet...", "ConfigurationErrorRegistriesWithoutBaseline": "Die in {path} definierte Konfiguration ist ungültig.\n\nDie Verwendung von Registrierungen erfordert, dass eine Baseline für die Standardregistrierung festgelegt ist, oder dass die Standardregistrierung NULL ist.\n\nWeitere Informationen finden Sie unter {url}.", "ConfigurationNestedDemands": "[\"{json_field}\"] enthält ein geschachteltes \"demands\"-Objekt (geschachtelte \"Anforderungen\" haben keine Auswirkungen)", "ConflictingFiles": "Die folgenden Dateien sind bereits in {path} installiert und stehen in Konflikt mit {spec}", + "ConsideredVersions": "Die folgenden ausführbaren Dateien wurden berücksichtigt, aber aufgrund der Versionsanforderung von {version} verworfen:", "ConstraintViolation": "Es wurde eine Einschränkungsverletzung gefunden:", "ContinueCodeUnitInStart": "Fortsetzungscodeeinheit wurde an der Startposition gefunden.", "ControlAndManifestFilesPresent": "Sowohl eine Manifestdatei als auch eine CONTROL-Datei sind im Portverzeichnis vorhanden: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "Die Datenbank ist beschädigt.", "CorruptedInstallTree": "Die vcpkg-Struktur \"installiert\" ist beschädigt.", "CouldNotDeduceNugetIdAndVersion": "Die NuGet-ID und die Version konnten nicht aus dem Dateinamen abgeleitet werden: {path}", - "CouldNotFindBaseline": "Die explizit angegebene Baseline \"{commit_sha}\" wurde in der Baselinedatei \"{path}\" nicht gefunden.", - "CouldNotFindBaselineForRepo": "Die Baseline \"{commit_sha}\" für das Repository \"{package_name}\" wurde nicht gefunden.", - "CouldNotFindBaselineInCommit": "Die Baseline wurde im Commit \"{commit_sha}\" aus dem Repository \"{package_name}\" nicht gefunden:", + "CouldNotFindBaselineInCommit": "Die Baseline wurde in {url} unter {commit_sha} für {package_name} nicht gefunden.", "CouldNotFindGitTreeAtCommit": "Die Git-Struktur für \"Versionen\" wurde im Repository \"{package_name}\" beim Commit \"{commit_sha}\" nicht gefunden.", "CouldNotFindToolVersion": " in {path} nicht gefunden", "CouldNotFindVersionDatabaseFile": "Die Versionsdatenbankdatei wurde nicht gefunden: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "Die Umgebungsvariable VCPKG_DEFAULT_BINARY_CACHE muss ein Verzeichnis sein (war: {path}).", "DefaultBinaryCacheRequiresAbsolutePath": "Die Umgebungsvariable VCPKG_DEFAULT_BINARY_CACHE muss absolut sein (war: {path}).", "DefaultBinaryCacheRequiresDirectory": "Die Umgebungsvariable VCPKG_DEFAULT_BINARY_CACHE muss ein Verzeichnis sein (war: {path}).", - "DefaultBrowserLaunched": "Der Standardbrowser wurde zum {url} gestartet.", + "DefaultFeatureCore": "Das Feature \"Core\" deaktiviert Standardfeatures und kann daher nicht in der Liste der Standardfeatures enthalten sein.", + "DefaultFeatureDefault": "die Funktion \"Standard\" bezieht sich auf den Satz von Standardfeatures und kann daher nicht in der Liste der Standardfeatures enthalten sein.", + "DefaultFeatureIdentifier": "Die Namen der Standardfeatures müssen Bezeichner sein", "DefaultFlag": "Standardmäßig wird --{option} aktiviert.", "DefaultRegistryIsArtifact": "Die Standardregistrierung kann keine Artefaktregistrierung sein.", - "DefaultTriplet": "Ab dem September 2023-Release ändert sich das Standard-Triplet für vcpkg-Bibliotheken von „x86-Windows“ in das erkannte Host-Triplet ({triplet}). Um diese Meldung zu beheben, fügen Sie „--triplet x86-windows“ hinzu, um dasselbe Verhalten beizubehalten.", + "DefaultTripletChanged": "In der Version vom September 2023 wurde das Standard-Triplet für vcpkg-Bibliotheken von x86-windows in das erkannte Host-Triplet ({triplet}) geändert. Fügen Sie für das alte Verhalten --triplet x86-windows hinzu. Um diese Meldung zu unterdrücken, fügen Sie --triplet {triplet} hinzu.", "DeleteVcpkgConfigFromManifest": "– Oder entfernen Sie \"vcpkg-configuration\" aus der Manifestdatei \"{path}\".", + "DependencyFeatureCore": "das Feature \"Core\" darf nicht in der Featureliste einer Abhängigkeit enthalten sein. Um die Standardfunktionen zu deaktivieren, fügen Sie stattdessen \"default-features\": false hinzu.", + "DependencyFeatureDefault": "das Feature \"default\" darf nicht in der Featureliste einer Abhängigkeit enthalten sein. Um die Standardfunktionen zu aktivieren, fügen Sie stattdessen \"default-features\": true hinzu.", + "DependencyGraphCalculation": "Abhängigkeitsdiagrammübermittlung aktiviert.", + "DependencyGraphFailure": "Fehler bei der Übermittlung des Abhängigkeitsdiagramms.", + "DependencyGraphSuccess": "Die Übermittlung des Abhängigkeitsdiagramms war erfolgreich.", "DeprecatedPrefabDebugOption": "--prefab-debug ist jetzt veraltet.", "DetectCompilerHash": "Compilerhash für Triplet {triplet} wird erkannt...", "DocumentedFieldsSuggestUpdate": "Wenn es sich um dokumentierte Felder handelt, die erkannt werden sollen, aktualisieren Sie das vcpkg-Tool.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "Die Datei weist nicht den erwarteten Hash auf:\nURL: {url}\nDatei: {path}\nErwarteter Hash: {expected}\nTatsächlicher Hash: {actual}", "DownloadFailedRetrying": "Fehler beim Herunterladen. Der Vorgang wird nach {value} ms wiederholt.", "DownloadFailedStatusCode": "{url}: Fehler: Statuscode {value}", - "DownloadRootsDir": "Geben Sie das Stammverzeichnis für Downloads an.\n(Standard: {env_var})", + "DownloadRootsDir": "Downloadverzeichnis (Standard: {env_var})", "DownloadWinHttpError": "{url}: Fehler bei {system_api} mit Exitcode {exit_code}", "DownloadedSources": "Heruntergeladene Quellen für {spec}", "DownloadingPortableToolVersionX": "Eine geeignete Version von {tool_name} wurde nicht gefunden (v{version} erforderlich). Portierbare {tool_name} {version} wird heruntergeladen...", "DownloadingTool": "{tool_name} wird heruntergeladen...\n{url}->{path}", "DownloadingUrl": "{url} wird herunterladen", - "DownloadingVcpkgCeBundle": "vcpkg-Artefaktspaket {version} wird heruntergeladen ...", - "DownloadingVcpkgCeBundleLatest": "Neuestes vcpkg-Artefaktspaket {version} wird heruntergeladen ...", "DownloadingVcpkgStandaloneBundle": "Das eigenständige Paket \"{version}\" wird heruntergeladen.", "DownloadingVcpkgStandaloneBundleLatest": "Das neueste eigenständige Paket wird heruntergeladen.", "DuplicatePackagePattern": "Paket „{package_name}“ ist dupliziert.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "beim Erfassen von Compiler-Informationen:\nDer Inhalt der Protokolldatei unter „{Pfad}“ lautet:", "ErrorIndividualPackagesUnsupported": "Im Manifestmodus unterstützt „vcpkg install“ keine einzelnen Paketargumente.\nUm zusätzliche Pakete zu installieren, bearbeiten Sie „vcpkg.json“, und führen Sie dann „vcpkg install“ ohne Paketargumente aus.", "ErrorInvalidClassicModeOption": "Die Option --{option} wird im klassischen Modus nicht unterstützt, und es wurde kein Manifest gefunden.", + "ErrorInvalidExtractOption": "--{option} muss auf eine nicht negative ganze Zahl oder auf \"AUTO\" festgelegt werden.", "ErrorInvalidManifestModeOption": "Die Option --{option} wird im Manifestmodus nicht unterstützt.", "ErrorMessage": "Fehler: ", "ErrorMessageMustUsePrintError": "Die Nachricht mit dem Namen {value} beginnt mit „error“: Sie muss so geändert werden, dass „ErrorMessage“ stattdessen im Code vorangestellt wird.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "Fehler beim Analysieren von {path}.", "ErrorWhileWriting": "Fehler beim Schreiben von {path}.", "ErrorsFound": "Die folgenden Fehler wurden gefunden:", - "Example": "Beispiel:", + "ExamplesHeader": "Beispiele:", "ExceededRecursionDepth": "Die Rekursionstiefe wurde überschritten.", "ExcludedPackage": "Ausgeschlossen: {spec}", "ExcludedPackages": "Die folgenden Pakete sind ausgeschlossen:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Wartungstool wird exportiert...", "ExportingPackage": "{package_name} wird exportiert...", "ExtendedDocumentationAtUrl": "Unter \"{url}\" ist eine ausführliche Dokumentation erhältlich.", + "ExtractHelp": "Extrahiert ein Archiv.", "ExtractingTool": "{tool_name} wird extrahiert...", "FailedPostBuildChecks": "{count} Problem(e) nach der Buildüberprüfung gefunden. Um diese Ports an zusammengestellte Kataloge zu übermitteln, korrigieren Sie zuerst die Portdatei: {path}", "FailedToAcquireMutant": "Fehler beim Abrufen des Mutant-Objekts {path}", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "Fehler beim Ermitteln des aktuellen Commits:", "FailedToDownloadFromMirrorSet": "Fehler beim Herunterladen aus dem Spiegelsatz.", "FailedToExtract": "Fehler beim Extrahieren von „{path}“:", - "FailedToFetchError": "{error_msg}\nFehler beim Abrufen von \"{package_name}\":", - "FailedToFindBaseline": "Fehler beim Suchen von \"baseline.json\".", + "FailedToFetchRepo": "Fehler beim Abrufen von {url}.", "FailedToFindPortFeature": "{package_name} verfügt über kein Feature mit dem Namen {feature}.", "FailedToFormatMissingFile": "Keine zu formatierenden Dateien.\nÜbergeben Sie entweder \"--all\" oder die expliziten Dateien zum Formatieren oder Konvertieren.", "FailedToLoadInstalledManifest": "Die Steuerelement- oder Manifestdatei für {package_name} konnte aufgrund des folgenden Fehlers nicht geladen werden. Entfernen Sie {package_name}, und versuchen Sie es erneut.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "Fehler beim Aktivieren der Dateisystemsperre für \"{path}\".", "FailedToWriteManifest": "Fehler beim Schreiben der Manifestdatei \"{path}\".", "FailedVendorAuthentication": "Mindestens ein {vendor}-Anmeldeinformationsanbieter konnte nicht authentifiziert werden. Weitere Informationen zum Bereitstellen von Anmeldeinformationen finden Sie unter \"{url}\".", - "FeedbackAppreciated": "Vielen Dank für Ihr Feedback!", "FetchingBaselineInfo": "Baselineinformationen werden von \"{package_name}\" abgerufen...", "FetchingRegistryInfo": "Registrierungsinformationen werden von {url} ({value}) abgerufen...", "FieldKindDidNotHaveExpectedValue": "\"kind\" wies keinen erwarteten Wert auf: (erwarteter Wert: {expected}; gefunden: {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "Absolute Pfade wurden in den folgenden Dateien gefunden:", "FilesExported": "Exportierte Dateien unter: {path}", "FindHelp": "Sucht nach dem angegebenen Artefakt oder Port. Ohne Parameter wird nach „Artefakt\" oder „Port“ alles angezeigt.", + "FindVersionArtifactsOnly": "--version kann nicht mit der vcpkg-Suche oder dem vcpkg-Suchport verwendet werden.", "FishCompletion": "Die vcpkg-fish-Vervollständigung wurde bereits unter „{path}“ hinzugefügt.", "FloatingPointConstTooBig": "Gleitkommakonstante zu groß: {count}", "FollowingPackagesMissingControl": "Die folgenden Pakete verfügen nicht über eine gültige CONTROL- oder vcpkg.json-Datei:", "FollowingPackagesNotInstalled": "Die folgenden Pakete sind nicht installiert:", "FollowingPackagesUpgraded": "Die folgenden Pakete sind auf dem neuesten Stand:", + "ForMoreHelp": "Weitere Hilfe", "ForceSystemBinariesOnWeirdPlatforms": "Die Umgebungsvariable VCPKG_FORCE_SYSTEM_BINARIES muss auf ARM-, S390x-, riscv- und ppc64le-Plattformen festgelegt werden.", "FormattedParseMessageExpression": "beim Ausdruck: {value}", "GHAParametersMissing": "Die binäre GHA-Quelle erfordert, dass die Umgebungsvariablen ACTIONS_RUNTIME_TOKEN und ACTIONS_CACHE_URL festgelegt werden. Weitere Informationen finden Sie unter {url}.", @@ -470,7 +590,7 @@ "GitCommandFailed": "Fehler beim Ausführen von {command_line}", "GitFailedToFetch": "Fehler beim Abrufen von Verweis \"{value}\" aus Repository \"{url}\".", "GitFailedToInitializeLocalRepository": "Fehler beim Initialisieren des lokalen Repositorys \"{path}\".", - "GitRegistryMustHaveBaseline": "Der Git-Registrierungseintrag für \"{package_name}\" muss ein Feld \"Baseline\" aufweisen, das ein gültiger Git-Commit-SHA (40 Hexadezimalzeichen) ist.\nDer aktuelle HEAD-Wert dieses Repositorys ist \"{value}\".", + "GitRegistryMustHaveBaseline": "Die Git-Registrierung \"{url}\" muss über ein \"Baseline\"-Feld verfügen, das ein gültiges GIT-Commit-SHA (40 Hexadezimalzeichen) ist.\nUm die aktuellen Versionen zu verwenden, legen Sie die Baseline auf HEAD dieses Repositorys fest: \"{commit_sha}\".", "GitStatusOutputExpectedFileName": "Es wurde ein Dateiname erwartet.", "GitStatusOutputExpectedNewLine": "Neue Zeile erwartet", "GitStatusOutputExpectedRenameOrNewline": "Umbenannte Datei oder neue Zeilen erwartet", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "Git hat beim Ausführen von {command_line} eine unerwartete Ausgabe erzeugt.", "GraphCycleDetected": "Zyklische Abhängigkeit im Graphen erkannt bei {package_name}:", "HashFileFailureToRead": "Fehler beim Lesen der Datei „{Pfad}“ zum Hashen: ", + "HashPortManyFiles": "{package_name} enthält {count} Dateien. Das Hashen dieser Inhalte kann lange dauern, wenn der ABI-Hash für die binäre Zwischenspeicherung bestimmt wird. Erwägen Sie, die Anzahl der Dateien zu verringern. Häufige Ursachen hierfür sind das versehentliche Auschecken von Quell- oder Builddateien in das Verzeichnis eines Ports.", "HeaderOnlyUsage": "„{package_name}“ ist Header-only und kann von CMake aus verwendet werden über:", "HelpAssetCaching": "**Experimentelles Feature: Kann jederzeit geändert oder entfernt werden**\n\nvcpkg kann Spiegelungen verwenden, um heruntergeladene Ressourcen zwischenzuspeichern, wodurch ein ununterbrochener Betrieb sichergestellt wird, auch wenn sich die ursprüngliche Quelle ändert oder verschwindet.\n\nDie Asset-Zwischenspeicherung kann konfiguriert werden, indem Sie entweder die Umgebungsvariable „X_VCPKG_ASSET_SOURCES“ auf eine durch Semikolons getrennte Liste von Quellen festlegen oder eine Sequenz von „--x-asset-sources=“-Befehlszeilenoptionen übergeben. Befehlszeilenquellen werden nach Umgebungsquellen interpretiert. Kommas, Semikolons und Anführungszeichen (') können als Escapezeichen verwendet werden.\n\nDer optionale Parameter steuert für bestimmte Zeichenfolgen, wie auf sie zugegriffen wird. Sie können „read“, „write“ oder „readwrite“ angeben. Standardmäßig wird der Parameter auf „read“ festgelegt.\n\nGültige Quellen:", "HelpAssetCachingAzUrl": "Fügt eine Azure Blob Storage-Quelle hinzu, die optional eine Überprüfung mithilfe von Shared Access Signature verwendet. Die URL muss den Containerpfad enthalten und mit einem nachstehenden „/“ beendet werden. Falls , definiert ist, muss ein „?“ als Präfix vorangestellt werden. Nicht-Azure-Server funktionieren ebenfalls, sofern sie auf GET- und PUT-Anforderungen im folgenden Format reagieren: „“.", @@ -502,54 +623,51 @@ "HelpBinaryCachingNuGetTimeout": "Gibt ein NuGet-Timeout für NuGet-Netzwerkvorgänge an. Entspricht dem Parameter „-Timeout“ der NuGet-CLI.", "HelpBuiltinBase": "Die Baseline verweist auf einen Commit innerhalb des vcpkg-Repositorys, der eine Mindestversion für jede Abhängigkeit im Diagramm festlegt. Wenn beispielsweise keine anderen Einschränkungen angegeben werden (direkt oder transitiv), wird die Version in die Baseline des Manifests der obersten Ebene aufgelöst. Baselines transitiver Abhängigkeiten werden ignoriert.", "HelpCachingClear": "Entfernt alle vorherigen Quellen, einschließlich Der Standardwerte.", - "HelpContactCommand": "Kontaktinformationen anzeigen, um Feedback zu senden.", - "HelpCreateCommand": "Erstellen Sie einen neuen Port.", + "HelpContactCommand": "Zeigt Kontaktinformationen an, um Feedback zu senden.", + "HelpCreateCommand": "Erstellt einen neuen Port.", "HelpDependInfoCommand": "Zeigt eine Liste der Abhängigkeiten für Ports an.", - "HelpEditCommand": "Öffnen Sie einen Port zum Bearbeiten (verwenden Sie die Umgebungsvariable „{env_var}“, um ein Editorprogramm festzulegen. Standardmäßig wird „code“ verwendet).", + "HelpEditCommand": "Bearbeitet einen Port, optional mit {env_var}. Standardmäßig wird „code“ verwendet.", "HelpEnvCommand": "Erstellt eine bereinigende Shellumgebung für die Entwicklung oder Kompilierung.", - "HelpExampleCommand": "Weitere Hilfe (einschließlich Beispiele) finden Sie im zugehörigen Ordner für README.md und Dokumente.", + "HelpExampleCommand": "Weitere Hilfe (einschließlich Beispielen) finden Sie unter https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Beispielmanifest:", "HelpExportCommand": "Exportiert ein Paket.", - "HelpFormatManifestCommand": "Formatiert alle vcpkg.json-Dateien. Führen Sie dies aus, bevor Sie einen Commit für vcpkg ausführen.", "HelpHashCommand": "Hash einer Datei nach einem bestimmten Algorithmus, Standardmäßig SHA512.", - "HelpInitializeRegistryCommand": "Initialisiert eine Registrierung im Verzeichnis .", - "HelpInstallCommand": "Installieren Sie ein Paket.", - "HelpListCommand": "Listen Sie installierte Pakete auf.", + "HelpInstallCommand": "Installiert ein Paket.", + "HelpListCommand": "Listet installierte Pakete auf.", "HelpManifestConstraints": "Manifeste können drei Arten von Einschränkungen auf die verwendeten Versionen platzieren.", "HelpMinVersion": "Vcpkg wählt die gefundene Mindestversion aus, die allen anwendbaren Einschränkungen entspricht, einschließlich der Version aus der Baseline, die auf oberster Ebene angegeben wurde, sowie alle \"version>=\"-Einschränkungen im Diagramm.", "HelpOverrides": "Bei Verwendung als Manifest der obersten Ebene (z. B. beim Ausführen von \"vcpkg install\" im Verzeichnis) lassen Außerkraftsetzungen zu, dass ein Manifest die Abhängigkeitsauflösung kurzschließt und die zu verwendende Version angibt. Sie können verwendet werden, um Versionskonflikte wie Abhängigkeiten vom Typ \"version-string\" zu behandeln. Sie werden nicht berücksichtigt, wenn sie transitiv abhängig sind.", - "HelpOwnsCommand": "Suchen Sie nach Dateien in installierten Paketen.", + "HelpOwnsCommand": "Sucht nach dem Besitzer einer Datei in installierten Paketen.", "HelpPackagePublisher": "Darüber hinaus können Paketherausgeber Einschränkungen vom Typ “version>=\" verwenden, um sicherzustellen, dass Konsumenten mindestens eine bestimmte Mindestversion einer vorgegebenen Abhängigkeit verwenden. Wenn zu einer Bibliothek beispielsweise eine API benötigt, die Boost Asio in Version 1.70 hinzugefügt wird, stellt eine \"version>=\"-Einschränkung sicher, dass transitive Benutzer selbst bei Überschreibungen einzelner Versionen oder registrierungsübergreifenden Verweisen eine ausreichende Version verwenden.", - "HelpPortVersionScheme": "Jede Version hat zusätzlich eine \"port-version\", bei der es sich um eine nicht negative ganze Zahl handelt. Wenn sie als Text gerendert wird, wird die Portversion (falls ungleich null) als Suffix zum primären Versionstext hinzugefügt und durch einen Hash (#) getrennt. Portversionen werden lexografisch nach dem primären Versionstext sortiert, z. B.:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Deinstallieren Sie ein Paket.", - "HelpRemoveOutdatedCommand": "Deinstallieren Sie alle veralteten Pakete.", - "HelpResponseFileCommand": "Geben Sie eine Antwortdatei an, um zusätzliche Parameter bereitzustellen.", - "HelpSearchCommand": "Suchen Sie nach verfügbaren Paketen, die erstellt werden können.", - "HelpTextOptFullDesc": "Langen Text nicht abschneiden", - "HelpTopicCommand": "Hilfe zu einem bestimmten Thema anzeigen.", - "HelpTopicsCommand": "Zeigt die Liste der Hilfethemen an.", - "HelpTxtOptAllowUnsupportedPort": "Anstatt einen Fehler an einem nicht unterstützten Port anzuzeigen, fahren Sie mit einer Warnung fort.", - "HelpTxtOptCleanAfterBuild": "Buildstrukturen, Pakete und Downloads nach dem Erstellen der einzelnen Pakete bereinigen", - "HelpTxtOptCleanBuildTreesAfterBuild": "Buildstrukturen nach dem Erstellen der einzelnen Pakete bereinigen", - "HelpTxtOptCleanDownloadsAfterBuild": "Downloads nach der Erstellung jedes Pakets bereinigen", - "HelpTxtOptCleanPkgAfterBuild": "Pakete nach der Erstellung jedes Pakets bereinigen", - "HelpTxtOptDryRun": "Nicht erstellen oder installieren.", - "HelpTxtOptEditable": "Erneute Quellextraktion und binäre Zwischenspeicherung für Bibliotheken in der Befehlszeile deaktivieren (klassischer Modus)", - "HelpTxtOptEnforcePortChecks": "Fehler bei der Installation, wenn ein Port Probleme erkannt hat oder versucht, ein veraltetes Feature zu verwenden", - "HelpTxtOptKeepGoing": "Mit der Installation von Paketen fortfahren, wenn ein Fehler auftritt.", - "HelpTxtOptManifestFeature": "Zusätzliches Feature aus dem zu installierenden Manifest der obersten Ebene (Manifestmodus).", - "HelpTxtOptManifestNoDefault": "Installieren Sie nicht die Standardfeatures aus dem Manifest der obersten Ebene (Manifestmodus).", - "HelpTxtOptNoDownloads": "Keine neuen Quellen herunterladen", - "HelpTxtOptNoUsage": "Geben Sie nach der Installation keine CMake-Nutzungsinformationen aus.", - "HelpTxtOptOnlyBinCache": "Fehler, wenn zwischengespeicherte Binärdateien nicht verfügbar sind.", - "HelpTxtOptOnlyDownloads": "Best-Effort-Versuch durchführen, um Quellen ohne Erstellung herunterzuladen.", - "HelpTxtOptRecurse": "Entfernen von Paketen im Rahmen der Installation zulassen.", - "HelpTxtOptUseAria2": "Aria2 verwenden, um Downloadaufgaben auszuführen.", - "HelpTxtOptUseHeadVersion": "Bibliotheken über die Befehlszeile mit den neuesten Upstreamquellen (klassischer Modus) installieren.", - "HelpTxtOptWritePkgConfig": "Schreibt eine Datei im NuGet packages.config-Format für die Verwendung mit externer binärer Zwischenspeicherung.\n Weitere Informationen finden Sie unter \"vcpkg help binarycaching\".", - "HelpUpdateBaseline": "Der beste Ansatz, um Ihre Bibliotheken auf dem neuesten Stand zu halten, besteht im Aktualisieren Ihres Baselineverweises. Hierdurch wird sichergestellt, dass alle Pakete, einschließlich transitiver Pakete, aktualisiert werden. Wenn Sie jedoch ein Paket unabhängig aktualisieren müssen, können Sie eine \"version>=\"-Einschränkung verwenden.", - "HelpUpdateCommand": "Listet Pakete auf, die aktualisiert werden können.", - "HelpUpgradeCommand": "Alle veralteten Pakete neu erstellen.", + "HelpPortVersionScheme": "Jede Version verfügt zusätzlich über eine „Portversion“, bei der es sich um eine nicht negative ganze Zahl handelt. Beim Rendern als Text wird die Portversion (wenn nicht null) als Suffix zum Text der primären Version hinzugefügt, getrennt durch einen Hash (#). Portversionen werden lexikgrafisch nach dem Text der primären Version sortiert, z. B.:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Deinstalliert ein Paket.", + "HelpResponseFileCommand": "Enthält ein Argument pro Zeile, das an dieser Position erweitert wird.", + "HelpSearchCommand": "Sucht nach verfügbaren Paketen, die erstellt werden können.", + "HelpTextOptFullDesc": "Schneidet langen Text nicht ab.", + "HelpTopicCommand": "Zeigt ein bestimmtes Hilfethema an.", + "HelpTopicsCommand": "Zeigt die vollständige Liste der Hilfethemen an.", + "HelpTxtOptAllowUnsupportedPort": "Wird mit einer Warnung an nicht unterstützten Ports fortgesetzt, anstatt einen Fehler zu verursachen.", + "HelpTxtOptCleanAfterBuild": "Bereinigt Buildstrukturen, Pakete und Downloads nach dem Erstellen der einzelnen Pakete.", + "HelpTxtOptCleanBuildTreesAfterBuild": "Bereinigt Buildstrukturen nach dem Erstellen der einzelnen Pakete.", + "HelpTxtOptCleanDownloadsAfterBuild": "Bereinigt Downloads nach der Erstellung jedes Pakets.", + "HelpTxtOptCleanPkgAfterBuild": "Bereinigt Pakete nach der Erstellung jedes Pakets.", + "HelpTxtOptDryRun": "Erstellt oder installiert nicht", + "HelpTxtOptEditable": "Deaktiviert die erneute Quellenextrahierung und binäre Zwischenspeicherung für Bibliotheken in der Befehlszeile (klassischer Modus).", + "HelpTxtOptEnforcePortChecks": "Fehler bei der Installation, wenn ein Port Probleme erkannt hat oder versucht, ein veraltetes Feature zu verwenden.", + "HelpTxtOptKeepGoing": "Setzt die Installation von Paketen nach einem Fehler fort.", + "HelpTxtOptManifestFeature": "Zusätzliche Features des zu installierenden Manifests der obersten Ebene (Manifestmodus)", + "HelpTxtOptManifestNoDefault": "Installiert nicht die Standardfeatures aus dem Manifest der obersten Ebene (Manifestmodus).", + "HelpTxtOptNoDownloads": "Neue Quellen werden nicht heruntergeladen", + "HelpTxtOptNoUsage": "Gibt nach der Installation keine CMake-Nutzungsinformationen aus.", + "HelpTxtOptOnlyBinCache": "Fehler, wenn zwischengespeicherte Binärdateien nicht verfügbar sind", + "HelpTxtOptOnlyDownloads": "Führt Best-Effort-Versuch aus, Quellen ohne Erstellung herunterzuladen.", + "HelpTxtOptRecurse": "Ermöglicht das Entfernen von Paketen im Rahmen der Installation.", + "HelpTxtOptUseAria2": "Verwendet aria2 zum Ausführen von Downloadaufgaben", + "HelpTxtOptUseHeadVersion": "Installiert die Bibliotheken in der Befehlszeile mithilfe der neuesten Upstreamquellen (klassischer Modus).", + "HelpTxtOptWritePkgConfig": "Schreibt eine Datei im NuGet packages.config-Format für die Verwendung mit externem binärem Zwischenspeichern. Weitere Informationen finden Sie unter \"vcpkg-Hilfe zu binärem Zwischenspeichern\".", + "HelpUpdateBaseline": "Der beste Ansatz, um Ihre Bibliotheken auf dem neuesten Stand zu halten, besteht im Aktualisieren Ihres Baselineverweises. Hierdurch wird sichergestellt, dass alle Pakete, einschließlich transitiver Pakete, aktualisiert werden. Wenn Sie jedoch ein Paket unabhängig aktualisieren müssen, können Sie eine „version>=“-Einschränkung verwenden.", + "HelpUpdateCommand": "Listet Pakete auf, für die ein Upgrade ausgeführt werden kann.", + "HelpUpgradeCommand": "Erstellt alle veralteten Pakete neu.", "HelpVersionCommand": "Zeigt Versionsinformationen an.", "HelpVersionDateScheme": "Ein Datum (01.01.2021)", "HelpVersionGreater": "Innerhalb des Felds \"Abhängigkeiten\" kann für jede Abhängigkeit eine Mindesteinschränkung aufgelistet werden. Diese Mindesteinschränkungen werden abhängig von dieser Bibliothek transitiv verwendet. Zusätzlich kann eine minimale Portversion mit dem Suffix \"#\" angegeben werden.", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Falsche Archivdateisignatur", "IncorrectPESignature": "Falsche PE-Signatur", "IncrementedUtf8Decoder": "Erhöhter Utf8Decoder am Ende der Zeichenfolge", - "InfoSetEnvVar": "Sie können die Umgebungsvariable „{env_var}“ auch auf den Editor Ihrer Wahl festlegen.", + "InfoSetEnvVar": "Sie können {env_var} auch auf Ihren bevorzugten Editor festlegen.", "InitRegistryFailedNoRepo": "Unter {path} konnte keine Registrierung erstellt werden, da es sich nicht um einen Git-Repositorystamm handelt.\nVerwenden Sie „git init {command_line}“, um ein Git-Repository in diesem Ordner zu erstellen.", "InstallCopiedFile": "{path_source} -> {path_destination} abgeschlossen", "InstallFailed": "Fehler: {path}: {error_msg}", "InstallPackageInstruction": "Wechseln Sie bei geöffnetem Projekt zu Tools > NuGet-Paket-Manager-> Paket-Manager Konsole und fügen Sie Folgendes ein:\n Install-Package „{ wert}“ -Quelle „{path}“", - "InstallRootDir": "(Experimentell) Geben Sie das Installationsstammverzeichnis an.", + "InstallRootDir": "Installiertes Verzeichnis (experimentell)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} übersprungen, aktuell", "InstallWithSystemManager": "Möglicherweise können Sie dieses Tool über Ihren Systempaket-Manager installieren.", "InstallWithSystemManagerMono": "Ubuntu 18.04-Benutzer benötigen möglicherweise eine neuere Version von Mono, die unter {url} verfügbar ist.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Installation des Ports von Speicherort: {Pfad}", "InstallingMavenFile": "{path}-Installation der Maven-Datei", "InstallingPackage": "Installing {action_index}/{count} {spec}...", - "IntegrateBashHelp": "Aktivieren Sie die Tab-Vervollständigung in bash.", - "IntegrateFishHelp": "Aktivieren Sie die Tab-Vervollständigung in Fish.", - "IntegrateInstallHelpLinux": "Machen Sie installierte Pakete benutzerweit verfügbar.", - "IntegrateInstallHelpWindows": "Machen Sie installierte Pakete benutzerweit verfügbar. Dies erfordert bei der ersten Verwendung Administratorrechte.", - "IntegratePowerShellHelp": "Aktivieren Sie die Tab-Vervollständigung in PowerShell.", - "IntegrateProjectHelp": "Generiert ein verweisendes NuGet-Paket für die Verwendung in einzelnen VS-Projekten.", - "IntegrateRemoveHelp": "Entfernen Sie die benutzerweite Integration.", - "IntegrateZshHelp": "Aktivieren Sie die Tab-Vervollständigung in zsh.", - "IntegrationFailed": "Die Integration wurde nicht angewendet.", + "IntegrateBashHelp": "Aktivieren Sie die Tab-Vervollständigung in bash. Nur Nicht-Windows", + "IntegrateFishHelp": "Aktivieren Sie die Tab-Vervollständigung in Fish. Nur Nicht-Windows", + "IntegrateInstallHelpLinux": "Macht installierte Pakete benutzerweit verfügbar", + "IntegrateInstallHelpWindows": "Stellt installierte Pakete benutzerweit zur Verfügung. Erfordert Administratorrechte bei der ersten Verwendung", + "IntegrateNonWindowsOnly": "{command_line} ist nur für Nicht-Windows verfügbar und wird auf diesem System nicht unterstützt.", + "IntegratePowerShellHelp": "Aktivieren Sie die Tab-Vervollständigung in PowerShell. Nur Windows", + "IntegrateProjectHelp": "Generiert ein verweisendes NuGet-Paket für einzelne Visual Studio-Projektverwendung. Nur Windows", + "IntegrateRemoveHelp": "Entfernt die benutzerweite Integration.", + "IntegrateWindowsOnly": "{command_line} ist nur für Windows verfügbar und wird auf diesem System nicht unterstützt.", + "IntegrateZshHelp": "Aktivieren Sie die Tab-Vervollständigung in zsh. Nur Nicht-Windows", + "IntegrationFailedVS2015": "Die Integration wurde für Visual Studio 2015 nicht angewendet.", "InternalCICommand": "vcpkg ci ist ein interner Befehl, der sich inkompatibel ändert oder jederzeit entfernt wird.", "InternalErrorMessage": "Interner Fehler: ", "InternalErrorMessageContact": "Geben Sie unter „https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug“ das Problem mit detaillierten Schritten an, um das Problem zu reproduzieren.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg unterstützt keine Kommentare im C-Stil, aber die meisten Objekte ermöglichen die Verwendung von Feldern mit dem Präfix $ als Kommentare.", "InvalidCommitId": "Ungültige Commit-ID: {commit_sha}", "InvalidDefaultFeatureName": "„Standard“ ist ein reservierter Featurename", - "InvalidDependency": "-Abhängigkeiten müssen alphanumerische Zeichen und Bindestriche in Kleinbuchstaben und nicht einer der reservierten Namen sein.", "InvalidFeature": "-Features müssen alphanumerische Zeichen und Bindestriche in Kleinbuchstaben und nicht einer der reservierten Namen sein.", "InvalidFileType": "Fehler: {path} kann den Dateityp nicht verarbeiten", "InvalidFilename": "Der Dateiname darf keine ungültigen Zeichen {value} enthalten, lautete aber {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "Die Bibliothek war ungültig: Es wurde kein Linkerelement gefunden.", "InvalidLinkage": "Ungültiger {system_name} Bindungstyp: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "Ungültiger logischer Ausdruck, unerwartetes Zeichen", - "InvalidLogicExpressionUsePipe": "Ungültiger Logikausdruck. Verwenden Sie \"|\" anstelle von „oder.", + "InvalidLogicExpressionUsePipe": "Ungültiger Logikausdruck. Verwenden Sie \"|\" anstelle von \"or\".", "InvalidNoVersions": "Die Datei enthält keine Versionen.", "InvalidOptionForRemove": "„remove“ akzeptiert entweder Bibliotheken oder „--outdated“", "InvalidPortVersonName": "Ungültiger Dateiname der Portversion gefunden: {path}.", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "Der Wert von [\"{json_field}\"] muss ein Objekt sein.", "JsonFieldNotString": "Der Wert von [\"{json_field}\"] muss eine Zeichenfolge sein.", "JsonFileMissingExtension": "Die JSON-Datei \"{path}\" muss die Erweiterung .json (nur Kleinbuchstaben) aufweisen.", - "JsonSwitch": "(Experimentell) JSON-Ausgabe anfordern.", + "JsonSwitch": "Druckt JSON anstelle von Nur-Text.", "JsonValueNotArray": "JSON-Wert ist kein Array.", "JsonValueNotObject": "Der JSON-Wert ist kein Objekt.", "JsonValueNotString": "Der JSON-Wert ist keine Zeichenfolge.", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Dynamisches Release (/MD)", "LinkageStaticDebug": "Statisches Debuggen (/MTd)", "LinkageStaticRelease": "Statisches Release (/MT)", - "ListHelp": "Das Argument muss ein zu suchender substring und darf kein Argument sein, um alle installierten Bibliotheken anzuzeigen.", + "ListHelp": "Listet installierte Bibliotheken auf", "ListOfValidFieldsForControlFiles": "Dies ist die Liste der gültigen Felder für CONTROL-Dateien (Groß-/Kleinschreibung beachten):", "LoadingCommunityTriplet": "-- [COMMUNITY] Laden der Triplet-Konfiguration von: {Pfad}", "LoadingDependencyInformation": "Abhängigkeitsinformationen für {count} Pakete werden geladen...", @@ -707,8 +826,7 @@ "MsiexecFailedToExtract": "msiexec-Fehler beim Extrahieren von „{path}“ mit Start- oder Exitcode {exit_code} und Meldung:", "MultiArch": "Multi-Arch muss \"same\" sein, war aber {option}", "MultipleFeatures": "Das Paket {package_name} deklariert das Feature {feature} mehrmals. Stellen Sie sicher, dass Features unterschiedliche Namen haben.", - "MutuallyExclusiveOption": "„--{value}“ kann nicht mit „--{option}“ verwendet werden.", - "NavigateToNPS": "Navigieren Sie zu {url} in Ihrem bevorzugten Browser.", + "MutuallyExclusiveOption": "--{value} kann nicht mit --{option} verwendet werden.", "NewConfigurationAlreadyExists": "Das Erstellen eines Manifests würde eine vcpkg-configuration.json unter „{path}“ überschreiben.", "NewManifestAlreadyExists": "Unter „{path}“ ist bereits ein Manifest vorhanden.", "NewNameCannotBeEmpty": "„--name“ darf nicht leer sein.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "Geben Sie entweder „--name“ und „--version“ an, um ein Manifest für C++-Bibliotheken zu erstellen, oder geben Sie „--application“ an, um anzugeben, dass das Manifest nicht als Port verwendet werden soll.", "NewVersionCannotBeEmpty": "„--version“ darf nicht leer sein.", "NoArgumentsForOption": "Die Option --{option} akzeptiert kein Argument.", - "NoCachedPackages": "Es sind keine Pakete zwischengespeichert.", "NoError": "Kein Fehler", "NoInstalledPackages": "Es sind keine Pakete installiert. Meinten Sie „Suchen“?", "NoLocalizationForMessages": "Keine lokalisierte Meldungen für Folgendes: ", @@ -739,22 +856,27 @@ "OptionRequiresAValue": "Für die Option \"{option}\" ist ein Wert erforderlich.", "OptionRequiresOption": "--{value} erfordert --{option}", "OptionUsedMultipleTimes": "Die Option \"{option}\" wurde mehrmals angegeben.", - "OptionalCommand": "optionale Befehl", "Options": "Optionen", "OriginalBinParagraphHeader": "\nUrsprünglicher binärer Absatz", + "OtherCommandsHeader": "Andere", "OverlayPatchDir": "Der Überlagerungspfad „{path}“ muss vorhanden sein und muss ein Verzeichnis sein.", - "OverlayTriplets": "Überlagerungstriplets aus {Pfad} :", + "OverlayPortsDirectoriesHelp": "Verzeichnisse von Überlagerungsports (auch: {env_var})", + "OverlayTripletDirectoriesHelp": "Verzeichnisse von Überlagerungstriplets (auch: {env_var})", + "OverlayTriplets": "Überlagerungstriplets aus „{path}“:", "OverwritingFile": "Die Datei {path} war bereits vorhanden und wird überschrieben", "PECoffHeaderTooShort": "Beim Analysieren der portablen ausführbaren Datei \"{path}\" ist die Größe des COFF-Headers zu klein, um einen gültigen PE-Header zu enthalten.", - "PEConfigCrossesSectionBoundary": "Beim Analysieren der portablen ausführbaren Datei \"{path}\" überschreitet das Imagekonfigurationsverzeichnis eine Secionsgrenze.", - "PEImportCrossesSectionBoundary": "Beim Analysieren der portierbaren ausführbaren Datei \"{path}\" überschreitet die Importtabelle eine Grenze für die Secion.", + "PEConfigCrossesSectionBoundary": "Beim Analysieren der portablen ausführbaren Datei \"{path}\" überschreitet das Imagekonfigurationsverzeichnis eine Abschnittsgrenze.", + "PEImportCrossesSectionBoundary": "Beim Analysieren der portablen ausführbaren Datei \"{path}\" überschreitet die Importtabelle eine Abschnittsgrenze.", "PEPlusTagInvalid": "Beim Analysieren der portierbaren ausführbaren Datei \"{path}\" war der optionale Header weder PE32 noch PE32+.", "PERvaNotFound": "Beim Analysieren der portablen ausführbaren Datei \"{path}\" wurde das RVA {value:#X} nicht gefunden.", "PESignatureMismatch": "Beim Analysieren der portablen ausführbaren Datei \"{path}\" stimmt die Signatur nicht überein.", "PackageAlreadyRemoved": "{spec} kann nicht entfernt werden: bereits entfernt", + "PackageDiscoveryHeader": "Paketermittlung", "PackageFailedtWhileExtracting": "Fehler bei „{value}“ beim Extrahieren von „{path}“.", - "PackageInfoHelp": "Detaillierte Informationen zu Paketen anzeigen.", - "PackageRootDir": "(Experimentell) Geben Sie das Buildstrukturstammverzeichnis an.", + "PackageInfoHelp": "Detaillierte Informationen zu Paketen anzeigen", + "PackageInstallationHeader": "Paketinstallation", + "PackageManipulationHeader": "Paketmanipulation", + "PackageRootDir": "Paketverzeichnis (experimentell)", "PackagesToInstall": "Die folgenden Pakete werden erstellt und installiert:", "PackagesToInstallDirectly": "Die folgenden Pakete werden direkt installiert:", "PackagesToModify": "Zusätzliche Pakete (*) werden geändert, um diesen Vorgang abzuschließen.", @@ -774,6 +896,7 @@ "ParseControlErrorInfoTypesEntry": "{value} wurde als {expected} erwartet", "ParseControlErrorInfoWhileLoading": "beim Laden von {path}:", "ParseControlErrorInfoWrongTypeFields": "Die folgenden Felder wiesen die falschen Typen auf:", + "ParseFeatureNameError": "\"{package_name}\" ist kein gültiger Featurename. Featurenamen müssen aus alphanumerischen Kleinbuchstaben+Bindestrichen bestehen und dürfen nicht reserviert sein (weitere Informationen finden Sie unter {url}).", "ParseIdentifierError": "„{value}“ ist kein gültiger Bezeichner. Bezeichner müssen aus alphanumerischen Kleinbuchstaben+Bindestrichen bestehen und dürfen nicht reserviert sein (weitere Informationen finden Sie unter {url}).", "ParsePackageNameError": "„{package_name}“ ist kein gültiger Paketname. Paketnamen müssen aus alphanumerischen Kleinbuchstaben+Bindestrichen bestehen und dürfen nicht reserviert sein (weitere Informationen finden Sie unter {url}).", "ParsePackagePatternError": "„{package_name}“ ist kein gültiges Paketmuster. Paketmuster dürfen nur ein Platzhalterzeichen (*) verwenden, und es muss das letzte Zeichen im Muster sein (weitere Informationen finden Sie unter {url}).", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "Verwenden Sie Folgendes, um die {extension}-Dateien zu überprüfen:", "PortBugInvalidCrtLinkage": "Die folgenden Binärdateien sollten die CRT „{expected}“ verwenden.", "PortBugInvalidCrtLinkageEntry": "{path} verbindet mit:", + "PortBugKernel32FromXbox": "Das ausgewählte Triplet ist auf Xbox ausgerichtet, aber die folgenden DLLs sind mit kernel32 verknüpft. Diese DLLs können nicht auf Xbox geladen werden, wenn kernel32 nicht vorhanden ist. Dies wird in der Regel durch das Verknüpfen mit kernel32.lib und nicht durch eine geeignete Umbrella-Bibliothek verursacht, z. B. onecore_apiset.lib oder xgameplatform.lib.", "PortBugMergeLibCMakeDir": "Der Ordner „/lib/cmake“ sollte mit „/debug/lib/cmake“ zusammengeführt und nach „/share/{package_name}/cmake“ verschoben werden. Verwenden Sie die Hilfsfunktion „vcpkg_cmake_config_fixup()“ aus dem Port „vcpkg-cmake-config“.", "PortBugMismatchedNumberOfBinaries": "Die Anzahl der Debug- und Releasebinärdateien stimmt nicht überein.", "PortBugMisplacedCMakeFiles": "Die folgenden CMAKE-Dateien wurden außerhalb von \"/share/{spec}\" gefunden. Platzieren Sie cmake-Dateien in \"/share/{spec}\".", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "Wenn die Erstellung von \"bin\\\" und/oder \"debug\\bin\\\" nicht deaktiviert werden kann, verwenden Sie dies in der Portdatei, um sie zu entfernen.", "PortBugRemoveEmptyDirectories": "Wenn ein Verzeichnis aufgefüllt werden soll, aber nicht vorhanden ist, kann dies auf einen Fehler in der Portdatei hinweisen.\nWenn die Verzeichnisse nicht benötigt werden und ihre Erstellung nicht deaktiviert werden kann, entfernen Sie sie in der Portdatei zum Beispiel wie folgt:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE leere Verzeichnisse, die von den oben genannten Umbenennungen übrig bleiben)", - "PortBugRestrictedHeaderPaths": "Die folgenden eingeschränkten Header können verhindern, dass die C++-Kernruntime und andere Pakete ordnungsgemäß kompiliert werden. In Ausnahmefällen kann diese Richtlinie über {env_var} deaktiviert werden.", + "PortBugRestrictedHeaderPaths": "Die folgenden eingeschränkten Header können verhindern, dass die C++-Kernruntime und andere Pakete ordnungsgemäß kompiliert werden. In Ausnahmefällen kann diese Richtlinie deaktiviert werden, indem die CMake-Variable VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS in „portfile.cmake“ festgelegt wird.", "PortBugSetDllsWithoutExports": "DLLs ohne Exporte sind wahrscheinlich ein Fehler im Buildskript. Wenn dies beabsichtigt ist, fügen Sie die folgende Zeile in der Portdatei hinzu:\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS aktiviert)\nDie folgenden DLLs haben keine Exporte:", "PortDependencyConflict": "Port {package_name} weist die folgenden nicht unterstützten Abhängigkeiten auf:", "PortDoesNotExist": "{package_name} ist nicht vorhanden", @@ -827,7 +951,7 @@ "PortsDiffHelp": "Das Argument muss zum Auschecken ein Branch/Tag/Hash sein.", "PortsNoDiff": "Es wurden keine Änderungen an den Ports zwischen den beiden Commits vorgenommen.", "PortsRemoved": "Die folgenden {count} Ports wurden entfernt:", - "PortsUpdated": "\nDie folgenden {count} Ports wurden entfernt:", + "PortsUpdated": "Die folgenden {count} Ports wurden entfernt:", "PrebuiltPackages": "Es gibt Pakete, die nicht erstellt wurden. Führen Sie die folgenden Ausführungen aus, um sie zu erstellen:", "PreviousIntegrationFileRemains": "Die vorherige Integrationsdatei wurde nicht entfernt.", "ProgramReturnedNonzeroExitCode": "Fehler bei {tool_name}. Exitcode: ({exit_code}).", @@ -840,8 +964,13 @@ "RemovePackageConflict": "{spec} ist nicht installiert, {package_name} ist jedoch für {triplet} installiert. Meinten Sie {package_name}:{triplet}?", "RemovingPackage": "{action_index}/{count} {spec} wird entfernt.", "ResponseFileCode": "@response_file", - "RestoredPackage": "Das Paket wurde aus „{path}“ wiederhergestellt.", - "RestoredPackagesFromVendor": "{count} Paket(e) wurde(n) von {value} in {elapsed} wiederhergestellt. Verwenden Sie \"--debug\", um weitere Details anzuzeigen.", + "RestoredPackagesFromAWS": "{count} Paket(e) wurde(n) von AWS in {elapsed} wiederhergestellt. Verwenden Sie „--debug\", um weitere Details anzuzeigen.", + "RestoredPackagesFromCOS": "{count} Paket(e) wurde(n) von COS in {elapsed} wiederhergestellt. Verwenden Sie „--debug\", um weitere Details anzuzeigen.", + "RestoredPackagesFromFiles": "{count} Paket(e) wurde(n) von {path} in {elapsed} wiederhergestellt. Verwenden Sie „--debug\", um weitere Details anzuzeigen.", + "RestoredPackagesFromGCS": "{count} Paket(e) wurde(n) von GCS in {elapsed} wiederhergestellt. Verwenden Sie „--debug\", um weitere Details anzuzeigen.", + "RestoredPackagesFromGHA": "{count} Paket(e) wurde(n) von GitHub Actions Cache in {elapsed} wiederhergestellt. Verwenden Sie „--debug\", um weitere Details anzuzeigen.", + "RestoredPackagesFromHTTP": "{count} Paket(e) wurde(n) von HTTP-Servern in {elapsed} wiederhergestellt. Verwenden Sie „--debug\", um weitere Details anzuzeigen.", + "RestoredPackagesFromNuGet": "{count} Paket(e) wurde(n) von NuGet in {elapsed} wiederhergestellt. Verwenden Sie „--debug\", um weitere Details anzuzeigen.", "ResultsHeader": "ERGEBNISSE", "ScriptAssetCacheRequiresScript": "Erwartete Argumente: Die Objektkonfiguration \"x-script\" erfordert genau die exec-Vorlage als Argument.", "SearchHelp": "Das Argument muss ein zu suchender substring und darf kein Argument sein, um alle Bibliotheken anzuzeigen.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "Das Löschen des Inhalts von {path} wird übersprungen, da es sich nicht um ein Verzeichnis handelte.", "SourceFieldPortNameMismatch": "Das Feld „Source“ innerhalb der CONTROL-Datei oder das Feld „name“ innerhalb der Datei „vcpkg.json“ weist den Namen „{package_name}“ auf und stimmt nicht mit dem Portverzeichnis „{path}“ überein.", "SpecifiedFeatureTurnedOff": "Das Feature '{command_name}' wurde speziell deaktiviert, aber --{option} wurde angegeben.", - "SpecifyDirectoriesContaining": "Geben Sie Verzeichnisse an, die Tripletsdateien enthalten.\n(auch: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "Geben Sie Verzeichnisse an, die bei der Suche nach Ports verwendet werden sollen.\n(auch: '{env_var}')", - "SpecifyHostArch": "Geben Sie das Triplet für die Hostarchitektur an. Siehe „vcpkg help triplet“.\n(Standard: „{env_var}“)", - "SpecifyTargetArch": "Geben Sie das Triplet für die Zielarchitektur an. Siehe „vcpkg help triplet“.\n(Standard: „{env_var}“)", + "SpecifyHostArch": "Host-Triplet. Siehe „vcpkg-Hilfe zu Triplets“ (Standard: {env_var})", + "SpecifyTargetArch": "Ziel-Triplet. Siehe „vcpkg-Hilfe zu Triplets“ (Standard: {env_var})", "StartCodeUnitInContinue": "Startcodeeinheit in Fortsetzungsposition gefunden", "StoreOptionMissingSha": "Die Option \"--store\" ist ohne sha512 ungültig.", - "StoredBinariesToDestinations": "Gespeicherte Binärdateien in {count} Zielen.", + "StoredBinariesToDestinations": "Gespeicherte Binärdateien in {count} Zielen in {elapsed}.", "StoredBinaryCache": "Gespeicherter binärer Cache: „{path}“", "SuccessfulyExported": "{package_name} nach {path} exportiert", "SuggestGitPull": "Das Ergebnis ist möglicherweise veraltet. Führen Sie \"git pull\" aus, um die neuesten Ergebnisse zu erhalten.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "Möglicherweise müssen Sie die vcpkg-Binärdatei aktualisieren. Versuchen Sie, {command_line} zum Aktualisieren auszuführen.", "SupportedPort": "Port {package_name} wird unterstützt.", "SwitchUsedMultipleTimes": "Der Schalter \"{option}\" wurde mehrmals angegeben.", + "SynopsisHeader": "Synopsis:", "SystemApiErrorMessage": "Fehler beim Aufrufen von {system_api}. {exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "Es wurde erwartet, dass die SystemRoot-Umgebungsvariable immer unter Windows festgelegt ist.", "SystemTargetsInstallFailed": "Fehler beim Installieren der Systemzieldatei {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Nachgestelltes Komma im Array", "TrailingCommaInObj": "Nachgestelltes Komma in einem Objekt", "TripletFileNotFound": "Die Tripletdatei \"{triplet}.cmake\" wurde nicht gefunden.", + "TripletLabel": "Triplet:", "TwoFeatureFlagsSpecified": "Sowohl „{value}“ als auch -“{value}“ wurden als Featurekennzeichen angegeben.", "UnableToClearPath": "{path} kann nicht gelöscht werden.", "UnableToReadAppDatas": "%LOCALAPPDATA% und %APPDATA% waren nicht lesbar.", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "Registry „{url}“ nicht aktualisiert: „{value}", "UpdateBaselineRemoteGitError": "Git konnte das Remote-Repository „{url}“ nicht abrufen", "UpdateBaselineUpdatedBaseline": "aktualisierte Registry „{url}“: Baseline „{old_value}“ -> „{new_value}“", - "UpgradeInManifest": "Der Upgradebefehl unterstützt derzeit nicht den Manifestmodus. Ändern Sie stattdessen \"vcpkg.json\", und führen Sie die Installation aus.", + "UpgradeInManifest": "Upgrade aktualisiert eine Installation im klassischen Modus und unterstützt daher keinen Manifestmodus. Erwägen Sie, Ihre Abhängigkeiten zu aktualisieren, indem Sie Ihre Baseline mit vcpkg x-update-baseline auf einen aktuellen Wert aktualisieren und die vcpkg-Installation ausführen.", "UpgradeRunWithNoDryRun": "Wenn Sie sicher sind, dass Sie die obigen Pakete neu erstellen möchten, führen Sie diesen Befehl mit der Option \"--no-dry-run\" aus.", "UploadedBinaries": "Binärdateien wurden in {count} {vendor} hochgeladen.", "UploadedPackagesToVendor": "{count} Pakete in {vendor} in {elapsed} hochgeladen", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "Ungültiger Befehl: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "Der Wert der Umgebungsvariablen X_VCPKG_REGISTRIES_CACHE ist kein Verzeichnis: {path}", "VcpkgRootRequired": "Das Festlegen VCPKG_ROOT ist für den eigenständigen Bootstrap erforderlich.", - "VcpkgRootsDir": "Geben Sie das vcpkg Stammverzeichnis für Downloads an.\n(Standard: „{env_var}“)", + "VcpkgRootsDir": "Das vcpkg-Stammverzeichnis für Downloads (Standard: {env_var})", "VcpkgSendMetricsButDisabled": "--sendmetrics wurde übergeben, Metriken sind jedoch deaktiviert.", + "VcpkgUsage": "Syntax: vcpkg [--switches] [--options=values] [Argumente] @response_file", "VcvarsRunFailed": "Fehler beim Ausführen von \"vcvarsall.bat\", um eine Visual Studio-Umgebung abzurufen.", "VcvarsRunFailedExitCode": "beim Versuch, eine Visual Studio-Umgebung abzurufen, hat vcvarsall.bat \"{exit_code}\" zurückgegeben.", "VersionBaselineMismatch": "Die neueste Version ist {expected}, aber die Baselinedatei enthält {actual}.\nFühren Sie Folgendes aus:\nvcpkg x-add-version {package_name}\nGit-Add-Versionen\ngit commit -m \"Versionsdatenbank aktualisieren\"\nDadurch wird die Baselineversion aktualisiert.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "Dem Paket {package_name} fehlt eine Versionsdatenbankdatei im Pfad {path}.\nAusführen:\nvcpkg x-add-version {package_name}\num die Versionsdatei zu erstellen.", "VersionGitEntryMissing": "Kein Versionsdatenbankeintrag für das Paket {package_name} in der Version {version}.\nVerfügbare Versionen:", "VersionInDeclarationDoesNotMatch": "Die in der Datei deklarierte Version stimmt nicht mit der ausgecheckten Version überein: {version}", - "VersionIncomparable1": "Versionskonflikt auf {spec}: Das Paket {package_name} erforderte {expected}, vcpkg konnte es jedoch nicht mit {actual} vergleichen.\nDie beiden Versionen verwendeten nicht kompatible Schemas:", - "VersionIncomparable2": "Die Version „{version}“ hatte das Schema {new_scheme}", + "VersionIncomparable1": "Versionskonflikt für {spec}: {constraint_origin} erfordert {expected}, der nicht mit der Baselineversion {actual} verglichen werden kann.", + "VersionIncomparable2": "{version_spec} weist das Schema „{new_scheme}“ auf", "VersionIncomparable3": "Dies kann behoben werden, indem der bevorzugten Version eine explizite Außerkraftsetzung hinzugefügt wird, z. B.:", - "VersionIncomparable4": "Weitere Informationen finden Sie unter „vcpkg-Hilfeversionsverwaltung“.", + "VersionIncomparable4": "Weitere Informationen finden Sie unter „vcpkg help versioning“ oder {url}.", + "VersionIncomparableSchemeString": "Beide Versionen haben eine Schemazeichenfolge, aber einen anderen primären Text.", + "VersionIncomparableSchemes": "Die Versionen weisen nicht kompatible Schemas auf:", "VersionInvalidDate": "„{version}“ ist keine gültige Datumsversion. Datumsangaben müssen dem Format „JJJJ-MM-TT“ entsprechen, und Disambiguatoren müssen durch Punkte getrennte positive ganzzahlige Werte ohne führende Nullen sein.", "VersionInvalidRelaxed": "„{version}“ ist keine gültige gelockerte Version (SemVer mit beliebiger numerischer Elementanzahl).", "VersionInvalidSemver": "„{version}“ ist keine gültige semantische Version. Weitere Informationen finden Sie unter .", "VersionMissing": "Es wurde ein Versionsverwaltungsfeld erwartet (version, version-date, version-semver oder version-string).", - "VersionMissingRequiredFeature": "{spec}@{version} verfügt nicht über das erforderliche Feature {feature}", + "VersionMissingRequiredFeature": "{version_spec} verfügt nicht über die erforderliche Funktion {feature}, die von {constraint_origin} benötigt wird", "VersionNotFound": "{expected} nicht verfügbar. Es ist nur {actual} verfügbar.", - "VersionNotFoundDuringDiscovery": "Die Version wurde während der Ermittlung nicht gefunden: {spec}@{version}\nDies ist ein interner vcpkg-Fehler. Öffnen Sie ein Problem auf https://github.com/Microsoft/vcpkg mit detaillierten Schritten zum Reproduzieren des Problems.", - "VersionNotFoundInVersionsFile": "Die Version {version} wurde in der Versionsdatei nicht gefunden.\nFühren Sie Folgendes aus:\nvcpkg x-add-version {package_name}.\nDadurch wird die neue Portversion hinzugefügt.", + "VersionNotFoundInVersionsFile": "Version {version} wurde in der Versionsdatei für {Paketname} nicht gefunden.\nAusführen:\nvcpkg x-add-version {Paket_name}\num die neue Portversion hinzuzufügen.", "VersionRejectedDueToBaselineMissing": "{path} wurde abgelehnt, weil er „{json_field}“ verwendet wird und keine integrierte Baseline aufweist. Dies kann behoben werden, indem die Verwendung von „{json_field}“ entfernt oder eine „integrierte Baseline“ hinzugefügt wird.\nWeitere Informationen finden Sie unter „Versionsverwaltung der vcpkg-Hilfe“.", "VersionRejectedDueToFeatureFlagOff": "{path} wurde abgelehnt, weil er „{json_field}“ verwendet wird und das Feature-Flag „versions“ deaktiviert ist. Dies kann behoben werden, indem „{json_field}“ entfernt oder das Feature-Flag „versions“ aktiviert wird.\nWeitere Informationen finden Sie unter „Versionsverwaltung der vcpkg-Hilfe“.", "VersionSchemeMismatch": "Die Versionsdatenbank deklariert die Version {version} als {expected}, der {path} deklariert sie jedoch als {actual}. Versionen müssen eindeutig sein, auch wenn sie mit unterschiedlichen Schemas deklariert sind.:\nFühren Sie Folgendes aus:\nvcpkg x-add-version {package_name} --overwrite-version\nDadurch wird das in der Versionsdatenbank deklarierte Schema mit dem im Port deklarierten Schema überschrieben.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "Auf \"#\" im Versionstext muss eine Portversion folgen (eine nicht negative ganze Zahl).", "VersionSpecMismatch": "Fehler beim Laden des Ports, da die Versionen inkonsistent sind. Die Datei „{path}“ enthält die Version {actual_version}, aber die Versionsdatenbank gibt an, dass sie {expected_version} sein soll.", "VersionTableHeader": "Version", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "Es wird auf das Beenden untergeordneter Prozesse gewartet...", "WaitingToTakeFilesystemLock": "Es wird auf die Sperre des Dateisystems für „{path}“ gewartet...", "WarnOnParseConfig": "In der Konfiguration {path} wurden die folgenden Warnungen gefunden:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "beim Überprüfen der Version: {version}", "WindowsOnlyCommand": "Dieser Befehl unterstützt nur Windows.", "WroteNuGetPkgConfInfo": "NuGet-Paketkonfigurationsinformationen wurden in {path} geschrieben.", - "UnrecognizedCommand$": "Unbekannter Befehl \"${p0}\"", - "Use$ToGetHelp": "${p0} verwenden, um Hilfe zu erhalten", - "FatalTheRootFolder$CanNotBeCreated": "Schwerwiegend: Der Stammordner \"${p0}\" kann nicht erstellt werden.", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Schwerwiegend: Die globale Konfigurationsdatei \"${p0}\" kann nicht erstellt werden.", + "FatalTheRootFolder$CannotBeCreated": "Schwerwiegend: Der Stammordner \"${p0}\" kann nicht erstellt werden.", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Schwerwiegend: Die globale Konfigurationsdatei \"${p0}\" kann nicht erstellt werden.", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND wurde nicht festgelegt.", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "Beim internen Ausführen von vcpkg wurde ein Exitcode ungleich 0 zurückgegeben: ${p0}", "failedToDownloadFrom$": "Fehler beim Herunterladen von ${p0}", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "Die Beschreibung muss vom Typ \"string\" sein, gefunden wurde \"${p0}\".", "optionsShouldBeASequenceFound$": "Die Optionen sollten eine Sequenz sein, gefunden wurde \"${p0}\".", "DuplicateKeysDetectedInManifest$": "Doppelte Schlüssel im Manifest erkannt: \"${p0}\"", - "in$Skipping$BecauseItIsA$": "in ${p0} überspringt ${p1}, da es sich um ${p2} handelt.", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "keine Postscript-Datei: Führen Sie die Ausführung mit der vcpkg-Shellfunktion statt mit der ausführbaren Datei erneut aus.", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Definieren Sie ${p0} während der Aktivierung doppelt. Der neue Wert ersetzt den alten Wert.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "Doppeltes Tool hat ${p0} während der Aktivierung deklariert. Der neue Wert ersetzt den alten Wert.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(Status unbekannt)", "verifying": "Wird überprüft", "downloading$$": "${p0} -> ${p1} wird heruntergeladen.", - "unpacking": "Auspacken", "unpacking$": "${p0} wird entpackt.", "Installing$": "${p0} wird installiert...", "$AlreadyInstalled": "${p0} ist bereits installiert.", "Downloading$": "${p0} wird heruntergeladen...", "Unpacking$": "${p0} wird entpackt...", "ErrorInstalling$$": "Fehler beim Installieren von ${p0} – ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "Es wurde ein einzelner Wert für ${p0} erwartet. Es wurden mehrere gefunden.", - "Synopsis": "Synopsis", - "Description": "Beschreibung", - "Switches": "Schalter", - "SeeAlso": "Siehe auch", "error": "Fehler:", "warning": "Warnung:", + "ExpectedASingleValueFor$FoundMultiple": "Es wurde ein einzelner Wert für ${p0} erwartet. Es wurden mehrere gefunden.", "ExpectedASingleValueFor$": "Es wurde ein einzelner Wert für \"--${p0}\" erwartet.", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Angenommen, \"${p0}\" ist richtig; geben Sie einen Hash in den Artefaktmetadaten an, um diese Nachricht zu unterdrücken.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "Die heruntergeladene Datei \"${p0}\" hat nicht den richtigen Hash (${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "Es wurde ein nicht übereinstimmender ${p0} in \"${p1}\" gefunden. Verwenden Sie für ein Literal ${p2} stattdessen ${p3}${p4}.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "Es wurde kein Wert für {${p0}} in \"${p1}\" gefunden. Verwenden Sie stattdessen \"{{${p2}}}\", um den Literalwert zu schreiben.", "MatchedMoreThanOneInstallBlock$": "Mehrere Installationsblöcke wurden abgeglichen [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Ruft alles ab, auf das von einem Projekt verwiesen wird, ohne zu aktivieren", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "Dies ermöglicht dem Consumer das Vorabdownloaden von Tools, die für ein Projekt erforderlich sind.", "UnableToFindProjectInFolderorParentFoldersFor$": "Projekt in Ordner (oder übergeordneten Ordnern) für ${p0} nicht gefunden", "UnableToAcquireProject": "Das Projekt kann nicht abgerufen werden.", - "AcquireArtifactsInTheRegistry": "Artefakte in der Registrierung abrufen", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "Dadurch kann der Consumer Artefakte abrufen (herunterladen und entpacken). Artefakte müssen aktiviert werden, damit sie verwendet werden können.", "NoArtifactsSpecified": "Es wurden keine Artefakte angegeben.", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Es wurden mehrere Pakete angegeben, aber nicht die gleiche Anzahl von ${p0}-Switches.", "NoArtifactsAreAcquired": "Es werden keine Artefakte abgerufen.", "AllArtifactsAreAlreadyInstalled": "Alle Artefakte sind bereits installiert.", "$ArtifactsInstalledSuccessfully": "${p0} Artefakte erfolgreich installiert", "InstallationFailedStopping": "Fehler bei der Installation -- wird beendet", - "ActivatesTheToolsRequiredForAProject": "Aktiviert die für ein Projekt erforderlichen Tools.", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "Dadurch kann der Consumer die für ein Projekt erforderlichen Tools aktivieren. Wenn die Tools noch nicht installiert sind, wird erzwungen, dass sie vor der Aktivierung heruntergeladen und installiert werden.", - "AddsAnArtifactToTheProject": "Fügt dem Projekt ein Artefakt hinzu.", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "Dadurch kann der Consumer dem Projekt ein Artefakt hinzufügen. Dadurch wird auch das Projekt aktiviert.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Es wurden mehrere Artefakte angegeben, aber nicht die gleiche Anzahl von ${p0}-Schaltern.", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Es wurde versucht, [${p0}]:${p1} ein Artefakt hinzuzufügen, die zu verwendende Registrierung konnte jedoch nicht bestimmt werden.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Es wurde versucht, die Registrierung ${p0} als ${p1} hinzuzufügen, aber es war bereits ${p2}. Fügen Sie ${p3} diesem Projekt manuell hinzu, und versuchen Sie es erneut.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Führen Sie \"vcpkg activate\\\" aus, um es auf das aktuelle Terminal anzuwenden.", - "ManagesTheDownloadCache": "Verwaltet den Downloadcache.", "DownloadsFolderCleared$": "Ordner \"Downloads\" gelöscht (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "bereinigt alles (Cache, installierte Artefakte)", - "cleansOutTheDownloadsCache": "bereinigt den Downloadcache.", - "removesAllTheArtifactsThatAreInstalled": "entfernt alle installierten Artefakte.", - "cleansUp": "bereinigt", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Ermöglicht dem Benutzer das Bereinigen des Caches, der installierten Artefakte usw.", "InstalledArtifactFolderCleared$": "Installierter Artefaktordner gelöscht (${p0}) ", "CacheFolderCleared$": "Cacheordner gelöscht (${p0}) ", - "DeactivatesTheCurrentSession": "Deaktiviert die aktuelle Sitzung.", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "Dadurch kann der Consumer Umgebungseinstellungen für die aktuell aktive Sitzung entfernen.", - "DeletesAnArtifactFromTheArtifactFolder": "Löscht ein Artefakt aus dem Artefaktordner.", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "Dadurch kann der Consumer ein Artefakt vom Datenträger entfernen.", "DeletingArtifact$From$": "Artefakt ${p0} wird aus ${p1} gelöscht", - "FindArtifactsInTheRegistry": "Suchen von Artefakten in der Registrierung", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "Dies ermöglicht dem Benutzer, Artefakte basierend auf einigen Kriterien zu finden.", "NoArtifactsFoundMatchingCriteria$": "Es wurden keine Artefakte gefunden, die den Kriterien entsprechen: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Generiert MSBuild-Eigenschaften für eine Aktivierung, ohne etwas für ein Projekt herunterzuladen.", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props erfordert \"--msbuild-props\".", "UnableToActivateProject": "Das Projekt kann nicht aktiviert werden.", - "theNameOfTheCommandForWhichYouWantHelp": "der Name des Befehls, für den Sie Hilfe benötigen", - "getHelpOn$OrOneOfTheCommands": "Hilfe zu ${p0} oder einem der Befehle erhalten", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Ruft ausführliche Hilfe zu ${p0} oder einem der Befehle ab.", - "Arguments": "Argumente:", - "Use$ToGetTheListOfAvailableCommands": "Verwenden Sie ${p0}, um die Liste der verfügbaren Befehle abzurufen.", - "Usage": "Verwendung", - "$COMMANDargumentsswitches": "${p0} BEFEHL [--switches]", - "Available$Commands": "Verfügbare ${p0}-Befehle:", - "ListsTheArtifacts": "Listet die Artefakte auf.", - "ThisAllowsTheConsumerToListArtifacts": "Dadurch kann der Consumer Artefakte auflisten.", - "regenerateTheIndexForARegistry": "Neugenerieren des Index für eine Registrierung", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "Dadurch kann der Benutzer die ${p0}-Dateien für eine ${p1}-Registrierung erneut generieren.", "RegeneratingIndexFor$": "Der Index für ${p0} wird neu generiert.", "RegenerationCompleteIndexContains$MetadataFiles": "Die Erneute Generierung ist abgeschlossen. Der Index enthält ${p0} Metadatendateien.", "Registry$ContainsNoArtifacts": "Registrierung: \"${p0}\" enthält keine Artefakte.", "error$": "Fehler ${p0}: ", - "RemovesAnArtifactFromAProject": "Entfernt ein Artefakt aus einem Projekt.", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "Dadurch kann der Consumer ein Artefakt aus dem Projekt entfernen. Erzwingt die Reaktivierung in diesem Fenster.", "Removing$FromProjectManifest": "${p0} wird aus Projektmanifest entfernt.", "unableToFindArtifact$InTheProjectManifest": "Das Artefakt \"${p0}\" wurde im Projektmanifest nicht gefunden.", - "updateTheRegistryFromTheRemote": "Registrierung über die Remoteverbindung aktualisieren", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Dadurch werden die neuesten Inhalte der Registrierung vom Remotedienst heruntergeladen.", - "DownloadingRegistryData": "Registrierungsdaten werden heruntergeladen.", - "Updated$RegistryContains$MetadataFiles": "${p0} aktualisiert. Die Registrierung enthält ${p1} Metadatendateien.", - "UnableToDownloadRegistrySnapshot": "Registrierungsmomentaufnahme kann nicht heruntergeladen werden", - "UnableToFindRegistry$": "Die Registrierung \"${p0}\" wurde nicht gefunden.", - "ArtifactRegistryDataIsNotLoaded": "Die Artefaktregistrierungsdaten wurden nicht geladen.", - "AttemptingToUpdateArtifactRegistry": "Es wird versucht, die Artefaktregistrierung zu aktualisieren.", - "UnableToLoadRegistryIndex": "Registrierungsindex kann nicht geladen werden", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Aktiviert sofort ein Artefakt außerhalb des Projekts", - "ThisWillInstantlyActivateAnArtifact": "Dadurch wird sofort ein Artefakt aktiviert.", + "Updated$ItContains$MetadataFiles": "${p0} aktualisiert. Enthält ${p1}-Metadatendateien.", + "UnableToDownload$": "${p0} konnte nicht heruntergeladen werden.", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} konnte nicht aktualisiert werden und ist möglicherweise falsch formatiert.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "Der Befehl „x-update-registry“ lädt neue Registrierungsinformationen herunter und kann daher nicht mit lokalen Registrierungen verwendet werden. Meinten Sie „x-regenerate ${p0}“?", + "UnableToFindRegistry$": "Die Registrierung ${p0} wurde nicht gefunden.", "NoArtifactsAreBeingAcquired": "Es werden keine Artefakte abgerufen.", - "removesAllFilesInTheLocalCache": "entfernt alle Dateien im lokalen Cache.", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "aktiviert den Debugmodus, zeigt interne Fehler zur Funktionsweise von ${p0} an.", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "fährt ohne Bestätigung mit der (potenziell gefährlichen) Aktion fort.", - "showsTheinstalledArtifacts": "zeigt die _installed_-Artefakte an.", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Sichern Sie Umgebungsvariablen und andere Eigenschaften in einer JSON-Datei mit dem vom Benutzer angegebenen Pfad.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Vollständiger Pfad zu der Datei, in die MSBuild-Eigenschaften geschrieben werden.", - "ApplyAnyDeprecationFixups": "Reparaturen aller veralteten Funktionen anwenden.", - "overrideThePathToTheProjectFolder": "Überschreiben des Pfads zum Projektordner", - "UnableToFindProjectEnvironment$": "Die Projektumgebung \"${p0}\" wurde nicht gefunden.", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "aktiviert den ausführlichen Modus, zeigt ausführliche Meldungen zum Prozess an.", - "aVersionOrVersionRangeToMatch": "eine Version oder ein Versionsbereich, der übereinstimmen soll" + "UnableToFindProjectEnvironment$": "Die Projektumgebung \"${p0}\" wurde nicht gefunden." } diff --git a/locales/messages.es.json b/locales/messages.es.json index 63173dd6f6..49140e27a1 100644 --- a/locales/messages.es.json +++ b/locales/messages.es.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "un registro integrado", "AConfigurationObject": "un objeto de configuración", "ADateVersionString": "una cadena de versión de fecha", + "ADefaultFeature": "una característica por defecto", "ADemandObject": "un objeto a petición", "ADependency": "una dependencia", + "ADependencyFeature": "una característica de una dependencia", "ADictionaryOfContacts": "un diccionario de contactos", "AFeature": "una característica", + "AFeatureName": "un nombre de característica", "AFilesystemRegistry": "un registro del sistema de archivos", "AGitObjectSha": "un SHA de objeto Git", "AGitReference": "una referencia git (por ejemplo, una rama)", @@ -37,19 +40,19 @@ "AStringStringDictionary": "una \"cadena\": diccionario :\"cadena\"", "AUrl": "una dirección URL", "AVcpkgRepositoryCommit": "una confirmación de repositorio vcpkg", - "AVersionConstraint": "una constante de versión", + "AVersionConstraint": "restricción de versión", "AVersionDatabaseEntry": "una entrada de base de datos de versión", "AVersionObject": "un objeto de versión", "AVersionOfAnyType": "una versión de cualquier tipo", "AddArtifactOnlyOne": "'{command_line}' solo puede agregar un artefacto a la vez.", "AddCommandFirstArg": "El primer parámetro que se va a agregar debe ser \"artefacto\" o \"puerto\".", "AddFirstArgument": "El primer argumento para \"{command_line}\" debe ser \"artifact\" o \"port\".", - "AddHelp": "Agrega el puerto o artefacto indicado al manifiesto asociado al directorio actual.", "AddPortRequiresManifest": "'{command_line}' requiere un archivo de manifiesto activo.", "AddPortSucceeded": "Los puertos se agregaron correctamente al archivo vcpkg.json.", "AddRecurseOption": "Si está seguro de que quiere quitarlos, ejecute el comando con la opción --recurse.", "AddTripletExpressionNotAllowed": "aquí no se permiten expresiones de triplete. Es posible que quiera cambiar \"{package_name}:{triplet}\" a \"{package_name}\" en su lugar.", "AddVersionAddedVersionToFile": "se ha agregado la versión {version} a {path}", + "AddVersionArtifactsOnly": "--La versión es solo artefactos y no se puede usar con vcpkg add port", "AddVersionCommitChangesReminder": "¿Se acordó de confirmar los cambios?", "AddVersionCommitResultReminder": "No olvide confirmar el resultado.", "AddVersionDetectLocalChangesError": "omitiendo la detección de cambios locales debido a un formato inesperado en la salida de estado de GIT", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "Los archivos protegidos de {package_name} han cambiado, pero no se ha actualizado la versión", "AddVersionPortFilesShaUnchanged": "los archivos protegidos de {package_name} no cambian con respecto a la versión {version}", "AddVersionPortHasImproperFormat": "{package_name} no tiene el formato correcto.", - "AddVersionSuggestNewVersionScheme": "Use el esquema de versión \"{new_scheme}\" en lugar de \"{old_scheme}\" en el puerto \"{package_name}\".\nUse \"--{option}\" para deshabilitar esta comprobación.", + "AddVersionSuggestNewVersionScheme": "Utilice el esquema de versión \"{new_scheme}\" en lugar de \"{old_scheme}\" en el puerto \"{package_name}\".\nUtilice --{option} para deshabilitar esta comprobación.", "AddVersionUnableToParseVersionsFile": "no se puede analizar el archivo de versiones {path}", "AddVersionUncommittedChanges": "hay cambios no confirmados para {package_name}", "AddVersionUpdateVersionReminder": "¿Recuerda actualizar la versión o la versión del puerto?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} ya está instalado", "AlreadyInstalledNotHead": "{spec} ya está instalado; no se está compilando desde HEAD", "AmbiguousConfigDeleteConfigFile": "Configuración ambigua de vcpkg proporcionada por el manifiesto y el archivo de configuración.\n-- Eliminar archivo de configuración {path}", + "AnArrayOfDefaultFeatures": "una matriz de características por defecto", "AnArrayOfDependencies": "una matriz de dependencias", "AnArrayOfDependencyOverrides": "una matriz de invalidaciones de dependencia", + "AnArrayOfFeatures": "una matriz de características", "AnArrayOfIdentifers": "una matriz de identificadores", "AnArrayOfOverlayPaths": "una matriz de rutas de superposición", "AnArrayOfOverlayTripletsPaths": "una matriz de rutas de triplete superpuestas", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "Hay otra instalación en curso en la máquina, en suspensión 6 s antes de volver a intentarlo.", "AppliedUserIntegration": "Integración aplicada en todo el usuario para esta raíz vcpkg.", "ApplocalProcessing": "Procesamiento applocal vcpkg: {path}", + "ArtifactsBootstrapFailed": "vcpkg-artifacts no está instalado y no se pudo arrancar.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts no está instalado y no se puede instalar porque se supone que VCPKG_ROOT es de solo lectura. La reinstalación de vcpkg mediante el \"un liner\" puede solucionar este problema.", + "ArtifactsNotOfficialWarning": "Uso de vcpkg-artifacts con una invitación ", "ArtifactsOptionIncompatibility": "--{option} no tiene ningún efecto en la búsqueda de artefactos.", + "ArtifactsOptionJson": "Ruta de acceso completa al archivo JSON donde se registran las variables de entorno y otras propiedades", + "ArtifactsOptionMSBuildProps": "Ruta de acceso completa al archivo en el que se escribirán las propiedades de MSBuild", + "ArtifactsOptionVersion": "Una versión o un intervalo de versiones para coincidir; solo es válido para artefactos", + "ArtifactsOptionVersionMismatch": "La cantidad de modificadores --version debe coincidir con la cantidad de artefactos nombrados", + "ArtifactsSwitchARM": "Fuerza la detección de host a ARM al adquirir artefactos", + "ArtifactsSwitchARM64": "Fuerza la detección de host a ARM64 al adquirir artefactos", + "ArtifactsSwitchAll": "Actualiza todos los registros de artefactos conocidos", + "ArtifactsSwitchAllLanguages": "Adquiere todos los archivos de idioma al adquirir artefactos.", + "ArtifactsSwitchForce": "Fuerza la requisición si ya se ha adquirido un artefacto", + "ArtifactsSwitchFreebsd": "Fuerza la detección de host a FreeBSD al adquirir artefactos", + "ArtifactsSwitchLinux": "Fuerza la detección de host en Linux al adquirir artefactos", + "ArtifactsSwitchNormalize": "Aplica las correcciones de desuso", + "ArtifactsSwitchOnlyOneHostPlatform": "Sólo se puede configurar una plataforma de host (--x64, --x86, --arm, --arm64).", + "ArtifactsSwitchOnlyOneOperatingSystem": "Sólo se puede configurar un sistema operativo (--windows, --osx, --linux, --freebsd).", + "ArtifactsSwitchOnlyOneTargetPlatform": "Solo se puede configurar una plataforma de destino (--target:x64, --target:x86, --target:arm, --target:arm64).", + "ArtifactsSwitchOsx": "Fuerza la detección de host en MacOS al adquirir artefactos", + "ArtifactsSwitchTargetARM": "Establece la detección de destino en ARM al adquirir artefactos", + "ArtifactsSwitchTargetARM64": "Establece la detección de destino en ARM64 al adquirir artefactos", + "ArtifactsSwitchTargetX64": "Establece la detección de destino en x64 al adquirir artefactos", + "ArtifactsSwitchTargetX86": "Establece el destino en x86 al adquirir artefactos", + "ArtifactsSwitchWindows": "Fuerza la detección de host en Windows al adquirir artefactos", + "ArtifactsSwitchX64": "Fuerza la detección de host a x64 al adquirir artefactos", + "ArtifactsSwitchX86": "Fuerza la detección de host a x86 al adquirir artefactos", "AssetCacheProviderAcceptsNoArguments": "argumentos inesperados: \"{value}\" no acepta argumentos", - "AssetSourcesArg": "Agregue orígenes para el almacenamiento en caché de recursos. Consulte \"vcpkg help assetcaching\".", + "AssetSourcesArg": "Orígenes de almacenamiento en caché de recursos. Consulte \"vcpkg help assetcaching\"", "AttemptingToFetchPackagesFromVendor": "Intentando capturar {count} paquetes de {vendor}", "AttemptingToSetBuiltInBaseline": "intentando establecer builtin-baseline en vcpkg.json al invalidar default-registry en vcpkg-configuration.json.\nse usará default-registry de vcpkg-configuration.json.", "AuthenticationMayRequireManualAction": "Uno o más proveedores de credenciales de {vendor} solicitaron una acción manual. Agregue el origen binario \"interactivo\" para permitir la interactividad.", "AutoSettingEnvVar": "-- Estableciendo automáticamente variables de entorno {env_var} en {url}.", "AutomaticLinkingForMSBuildProjects": "Todos los proyectos de MSBuild C++ ahora pueden #include cualquier biblioteca instalada. La vinculación se controlará automáticamente. La instalación de nuevas bibliotecas hará que estén disponibles al instante.", - "AvailableArchitectureTriplets": "Tripletes de arquitectura disponibles:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 y versiones posteriores ahora pueden #incluir cualquier biblioteca instalada. La vinculación se controlará automáticamente. La instalación de nuevas bibliotecas hará que estén disponibles al instante.", "AvailableHelpTopics": "Temas de ayuda disponibles:", "AzUrlAssetCacheRequiresBaseUrl": "argumentos inesperados: la configuración de recursos \"azurl\" requiere una URL base", "AzUrlAssetCacheRequiresLessThanFour": "argumentos inesperados: la configuración de recursos \"azurl\" requiere menos de 4 argumentos", "BaselineConflict": "La especificación de vcpkg-configuration.default-registry en un archivo de manifiesto entra en conflicto con la línea base.\nQuite una de estas configuraciones en conflicto.", "BaselineFileNoDefaultField": "El archivo de referencia en el comando {commit_sha} no era válido (no había campo \"predeterminado\").", - "BaselineFileNoDefaultFieldPath": "El archivo de línea base en {path} fue no válido (no hay ningún campo \"default\")", "BaselineGitShowFailed": "Error en `git show` versions/baseline.json al restaurar la línea base de la confirmación \"{commit_sha}\". Esto puede solucionarse recuperando las confirmaciones con `git fetch`.", "BaselineMissing": "No se encontró la versión de línea base. Ejecute:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\npara establecer {version} como la versión de línea base.", - "BaselineMissingDefault": "El valor baseline.json del comando `\"{commit_sha}\"` en el repositorio {url} no era válido (no contenía un campo \"predeterminado\").", - "BinarySourcesArg": "Agregue orígenes para el almacenamiento en caché binario. Consulte \"vcpkg help binarycaching\".", + "BinaryCacheVendorHTTP": "Servidores HTTP", + "BinarySourcesArg": "Orígenes de almacenamiento en caché binarios. Consulte \"vcpkg help binarycaching\"", "BinaryWithInvalidArchitecture": "{path}\n Se esperaba: {expected}, pero fue {actual}", "BuildAlreadyInstalled": "{spec} ya está instalado; quite {spec} antes de intentar compilarlo.", "BuildDependenciesMissing": "El comando de compilación requiere que todas las dependencias estén instaladas.\nFaltan las siguientes dependencias:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "CORRECTO", "BuildResultSummaryHeader": "RESUMEN DE {triplet}", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(Experimental) Especifique el directorio raíz de buildtrees.", + "BuildTreesRootDir": "Directorio del árbol de compilación (experimental)", "BuildTroubleshootingMessage1": "Asegúrese de que usa los archivos de puerto más recientes con \"git pull\" y \"vcpkg update\".\nA continuación, compruebe si hay problemas conocidos en:", "BuildTroubleshootingMessage2": "Puede enviar un nuevo problema en:", "BuildTroubleshootingMessage3": "Incluya \"Error de compilación de [{package_name}]\" en el título del informe de errores, la siguiente información de versión en la descripción del error y adjunte los registros de errores relevantes de arriba.", "BuildTroubleshootingMessage4": "Use la plantilla rellenada previamente de {path} al informar del problema.", - "BuildTroubleshootingMessageGH": "También puede enviar un problema mediante la ejecución (debe estar instalada la CLI de GitHub):", + "BuildTroubleshootingMessageGH": "También puede enviar una incidencia ejecutando (GitHub CLI debe estar instalado):", "BuildingFromHead": "Compilando {spec} de HEAD...", "BuildingPackage": "Compilando {spec}...", "BuildingPackageFailed": "error en la compilación de {spec} con: {build_result}", "BuildingPackageFailedDueToMissingDeps": "debido a que faltan las siguientes dependencias:", - "BuiltInTriplets": "Tripletes integrados de vcpkg:", + "BuiltInTriplets": "Tripletes integrados:", "BuiltWithIncorrectArchitecture": "Los siguientes archivos se compilaron para una arquitectura incorrecta:", "CISettingsExclude": "Lista de puertos separados por comas que se omitirán", "CISettingsOptCIBase": "Ruta de acceso al archivo ci.baseline.txt. Se usa para omitir puertos y detectar regresiones.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "Archivo para imprimir todos los hash de paquete determinados", "CISettingsOptParentHashes": "Archivo para leer los hash del paquete para un estado de CI primario para reducir el conjunto de paquetes modificados", "CISettingsOptSkippedCascadeCount": "Asevera que el número de --exclude y soportes omite exactamente lo que sea igual a este número", - "CISettingsOptXUnit": "Archivo para resultados de salida en formato XUnit (interno)", - "CISettingsVerifyGitTree": "Comprobar que cada objeto de árbol git coincida con su versión declarada (esto es muy lento)", - "CISettingsVerifyVersion": "Resultado de impresión para cada puerto en lugar de solo errores.", - "CISwitchOptAllowUnexpectedPassing": "Indica que no se deberán emitir los resultados de \"Pasar, quitar de la lista de errores\".", - "CISwitchOptDryRun": "Imprimir plan sin ejecución", - "CISwitchOptRandomize": "Aleatorizar el orden de instalación", - "CISwitchOptSkipFailures": "Indica que se deberán omitir los puertos marcados como \"=fail\" en ci.baseline.txt.", - "CISwitchOptXUnitAll": "Informar también de puertos sin cambios a la salida XUnit (interno)", + "CISettingsOptXUnit": "Archivo de salida de resultados en formato XUnit", + "CISettingsVerifyGitTree": "Verifica que cada objeto del árbol git coincide con su versión declarada (esto es muy lento)", + "CISettingsVerifyVersion": "Imprime el resultado de cada puerto en lugar de solo errores.", + "CISkipInstallation": "Los siguientes paquetes ya están instalados y no se volverán a compilar:", + "CISwitchOptAllowUnexpectedPassing": "Suprime los resultados de \"Aprobado, eliminar de la lista de suspensos\"", + "CISwitchOptDryRun": "Imprime el plan sin ejecución", + "CISwitchOptRandomize": "Aleatoriza el orden de instalación", + "CISwitchOptSkipFailures": "Omite los puertos marcados como \"=fail\" en ci.baseline.txt.", + "CISwitchOptXUnitAll": "Notifica puertos sin cambios en la salida de XUnit", "CMakeTargetsUsage": "{package_name} proporciona destinos de CMake:", "CMakeTargetsUsageHeuristicMessage": "# esto se genera de forma heurística y puede que no sea correcto", "CMakeToolChainFile": "Los proyectos de CMake deben usar\" \"-DCMAKE_TOOLCHAIN_FILE={path}\"", "CMakeUsingExportedLibs": "Para usar bibliotecas exportadas en proyectos de CMake, agregue {value} a la línea de comandos de CMake.", - "CacheHelp": "El argumento debe ser substring para buscar o ningún argumento para mostrar todas las bibliotecas almacenadas en caché.", "CheckedOutGitSha": "SHA de Git restaurado: {commit_sha}", "CheckedOutObjectMissingManifest": "El objeto restaurado no contiene un archivo CONTROL ni un archivo vcpkg.json.", "ChecksFailedCheck": "vcpkg se bloqueó; no hay detalles adicionales disponibles.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "actualizar vcpkg volviendo a ejecutar bootstrap-vcpkg puede resolver este error.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing solo se puede usar si se proporciona una base de referencia mediante --ci-baseline.", "CiBaselineDisallowedCascade": "REGRESIÓN: {spec} en cascada, pero es necesario pasar. ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "REGRESIÓN: error de {spec} independiente con {build_result}.", "CiBaselineRegression": "REGRESSION: error de {spec} con {build_result}. Si estaba previsto, añada {spec}=fail a {path}.", "CiBaselineRegressionHeader": "REGRESIONES:", + "CiBaselineUnexpectedFail": "REGRESIÓN: {spec} está marcado como error, pero no se admite para {triplet}.", + "CiBaselineUnexpectedFailCascade": "REGRESIÓN: {spec} está marcado como error, pero no se admite una dependencia para {triplet}.", "CiBaselineUnexpectedPass": "PASANDO, QUITAR DE LA LISTA DE ERRORES: {spec} ({path}).", "ClearingContents": "Borrando el contenido de {path}", "CmakeTargetsExcluded": "nota: {count} destinos adicionales no se muestran.", - "CmdAddVersionOptAll": "Procesar versiones para todos los puertos.", - "CmdAddVersionOptOverwriteVersion": "Sobrescribir \"git-tree\" de una versión existente.", - "CmdAddVersionOptSkipFormatChk": "Omite la comprobación de formato de los archivos vcpkg.json.", + "CmdAcquireExample1": "vcpkg acquire ", + "CmdAcquireProjectSynopsis": "Adquiere todos los artefactos a los que hace referencia un manifiesto", + "CmdAcquireSynopsis": "Adquiere el artefacto con nombre", + "CmdActivateSynopsis": "Activa artefactos desde un manifiesto", + "CmdAddExample1": "vcpkg add port ", + "CmdAddExample2": "vcpkg add artifact ", + "CmdAddSynopsis": "Agrega dependencia al manifiesto", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "Procesa versiones para todos los puertos", + "CmdAddVersionOptOverwriteVersion": "Sobrescribe el git-tree de una versión existente", + "CmdAddVersionOptSkipFormatChk": "Omite la comprobación del formato de los archivos vcpkg.json", "CmdAddVersionOptSkipVersionFormatChk": "Omite la comprobación de formato de versión.", - "CmdAddVersionOptVerbose": "Imprimir mensajes de éxito en lugar de solo errores.", + "CmdAddVersionOptVerbose": "Imprime mensajes correctos en lugar de solo errores", + "CmdAddVersionSynopsis": "Agrega una versión a la base de datos de versión", + "CmdBootstrapStandaloneSynopsis": "Arranca una raíz vcpkg a partir de sólo un binario vcpkg", + "CmdBuildExample1": "vcpkg build ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\ruta\\al\\directorio\\con\\vcpkg.json", + "CmdBuildExternalSynopsis": "Compila el puerto a partir de una ruta de acceso.", + "CmdBuildSynopsis": "Compila un puerto", + "CmdCacheExample1": "vcpkg cache ", + "CmdCacheSynopsis": "Enumeración de especificaciones de paquetes", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "Comprueba si se admite un puerto sin compilarlo", + "CmdCiCleanSynopsis": "Borra todos los archivos para prepararse para una ejecución de CI.", + "CmdCiSynopsis": "Intenta crear todos los puertos para las pruebas de integración continua", + "CmdCiVerifyVersionsSynopsis": "Comprueba la integridad de la base de datos de versiones", "CmdContactOptSurvey": "Iniciar el explorador predeterminado en la encuesta de vcpkg actual", - "CmdDependInfoOptDGML": "Crea un gráfico basado en dgml", - "CmdDependInfoOptDepth": "Mostrar profundidad de recursividad en la salida", - "CmdDependInfoOptDot": "Crea un gráfico basado en puntos", - "CmdDependInfoOptMaxRecurse": "Establecer profundidad de recursividad máxima, donde un valor de -1 indicará que no hay límite", - "CmdDependInfoOptSort": "Establecer criterio de ordenación para la lista de dependencias. Los valores aceptados son: lexicográfico, topológico (predeterminado), árbol x, inverso", - "CmdEditOptAll": "Abrir editor en el puerto y en la subcarpeta del árbol de compilación específica del puerto", - "CmdEditOptBuildTrees": "Abrir el editor en la subcarpeta del árbol de compilación específico del puerto", - "CmdEnvOptions": "Agregar {path} instalado a {env_var}", - "CmdExportOpt7Zip": "Exportar a un archivo 7zip (.7z)", - "CmdExportOptChocolatey": "Exportar un paquete Chocolatey (característica experimental)", - "CmdExportOptDebug": "Habilitar depuración prefab", - "CmdExportOptDryRun": "No exportar realmente.", - "CmdExportOptIFW": "Exportar a un instalador basado en IFW", - "CmdExportOptInstalled": "Exportar todos los paquetes instalados", - "CmdExportOptMaven": "Habilitar Maven", - "CmdExportOptNuget": "Exportar un paquete NuGet", - "CmdExportOptPrefab": "Exportar a formato Prefab", - "CmdExportOptRaw": "Exportar a un directorio sin comprimir", - "CmdExportOptZip": "Exportar a un archivo zip", - "CmdExportSettingChocolateyMaint": "Especificar el mantenedor para el paquete Chocolatey exportado (característica experimental).", - "CmdExportSettingChocolateyVersion": "Especificar el sufijo de versión que se agregará para el paquete Chocolatey exportado (característica experimental).", - "CmdExportSettingConfigFile": "Especificar la ruta de acceso al archivo temporal para la configuración del instalador", - "CmdExportSettingInstallerPath": "Especifique la ruta de acceso del archivo para el instalador exportado", - "CmdExportSettingNugetDesc": "Especificar una descripción para el paquete NuGet exportado", - "CmdExportSettingNugetID": "Especificar el id. del paquete NuGet exportado (reemplazará --output).", - "CmdExportSettingNugetVersion": "Especificar la versión para el paquete NuGet exportado", - "CmdExportSettingOutput": "Especificar el nombre de salida (usado para construir el nombre de archivo)", - "CmdExportSettingOutputDir": "Especificar el directorio de salida para los artefactos producidos", - "CmdExportSettingPkgDir": "Especificar la ruta de acceso del directorio temporal para los paquetes empaquetados de nuevo", + "CmdCreateExample1": "vcpkg create ", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create ", + "CmdDeactivateSynopsis": "Quita todas las activaciones de artefactos del shell actual.", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "Formatos en conflicto especificados. Solo se acepta --format, --dgml o --dot.", + "CmdDependInfoFormatHelp": "Elige el formato de salida, uno de los siguientes: \"list\", \"tree\", \"hair\", \"dot\" o \"dgml\".", + "CmdDependInfoFormatInvalid": "--format={value} no es un formato reconocido. --format debe ser \"list\", \"tree\", \"mermaid\", \"dot\" o \"dgml\".", + "CmdDependInfoOptDepth": "Muestra la profundidad de la recursión en la salida \"list\"", + "CmdDependInfoOptMaxRecurse": "Establece la profundidad máxima de recursión. Por defecto es sin límite", + "CmdDependInfoOptSort": "Elige el orden de clasificación para el formato \"list\", uno de entre \"lexicográfico\", \"topológico\" (por defecto), \"reverse\"", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth solo se puede usar con los formatos \"list\" y \"tree\".", + "CmdDependInfoXtreeTree": "--sort=x-tree no se puede usar con formatos distintos de tree", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Descarga un archivo", + "CmdEditExample1": "vcpkg edit ", + "CmdEditOptAll": "Abre el editor en el puerto, así como en la subcarpeta del árbol de compilación específico del puerto", + "CmdEditOptBuildTrees": "Abre el editor en la subcarpeta del árbol de compilación específico del puerto", + "CmdEnvOptions": "Añade {path} instalada a {env_var}", + "CmdExportEmptyPlan": "Se rechaza la creación de una exportación de cero paquetes. Instale los paquetes antes de exportarlos.", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", + "CmdExportOpt7Zip": "Exporta a un archivo 7zip (.7z)", + "CmdExportOptChocolatey": "Exporta un paquete Chocolatey (experimental)", + "CmdExportOptDebug": "Activa la depuración de prefabricados", + "CmdExportOptDryRun": "No exporta realmente", + "CmdExportOptIFW": "Exportación a un instalador basado en IFW", + "CmdExportOptInstalled": "Exporta todos los paquetes instalados", + "CmdExportOptMaven": "Habilita Maven", + "CmdExportOptNuget": "Exporta un paquete NuGet", + "CmdExportOptPrefab": "Exportaciones al formato prefabricado", + "CmdExportOptRaw": "Exporta a un directorio sin comprimir", + "CmdExportOptZip": "Exportaciones a un archivo ZIP", + "CmdExportSettingChocolateyMaint": "El mantenedor del paquete Chocolatey exportado (experimental)", + "CmdExportSettingChocolateyVersion": "El sufijo de versión a añadir para el paquete Chocolatey exportado (experimental)", + "CmdExportSettingConfigFile": "La ruta de acceso temporal del archivo para la configuración del instalador", + "CmdExportSettingInstallerPath": "Ruta de acceso del archivo para el instalador exportado", + "CmdExportSettingNugetDesc": "Descripción para el paquete NuGet exportado", + "CmdExportSettingNugetID": "Identificador para el paquete NuGet exportado (anula --output)", + "CmdExportSettingNugetVersion": "La versión para el paquete NuGet exportado", + "CmdExportSettingOutput": "El nombre de salida (se usa para construir el nombre de archivo)", + "CmdExportSettingOutputDir": "El directorio de salida para los artefactos producidos", + "CmdExportSettingPkgDir": "Ruta de acceso del directorio temporal para los paquetes empaquetados de nuevo", "CmdExportSettingPrefabArtifactID": "El Id. de artefacto es el nombre del proyecto según las especificaciones de Maven", "CmdExportSettingPrefabGroupID": "GroupId identifica de forma única el proyecto según las especificaciones de Maven", "CmdExportSettingPrefabVersion": "La versión es el nombre del proyecto según las especificaciones de Maven", - "CmdExportSettingRepoDir": "Especificar la ruta de acceso del directorio para el repositorio exportado", - "CmdExportSettingRepoURL": "Especificar la dirección URL del repositorio remoto para el instalador en línea", - "CmdExportSettingSDKMinVersion": "Versión mínima de SDK compatible con Android", - "CmdExportSettingSDKTargetVersion": "Versión del SDK de destino de Android", - "CmdFetchOptXStderrStatus": "Mensajes de estado/descarga directos en stderr en lugar de stdout. (Los errores seguirán yendo a stdout)", - "CmdFormatManifestOptAll": "Dar formato a todos los archivos de manifiesto de los puertos.", - "CmdFormatManifestOptConvertControl": "Convertir archivos de CONTROL en archivos de manifiesto.", - "CmdGenerateMessageMapOptNoOutputComments": "Al generar el mapa de mensajes, excluir los comentarios (útiles para generar el archivo de localización en inglés)", - "CmdInfoOptInstalled": "(experimental) Informar sobre los paquetes instalados en lugar de los disponibles", - "CmdInfoOptTransitive": "(experimental) Informar también sobre las dependencias de los paquetes instalados", - "CmdNewOptApplication": "Crear un manifiesto de aplicación (no requiere nombre ni versión).", - "CmdNewOptSingleFile": "Insertar vcpkg-configuration.json en vcpkg.json.", - "CmdNewOptVersionDate": "Interpretar --version como una fecha ISO 8601. (AAAA-MM-DD)", - "CmdNewOptVersionRelaxed": "Interpretar --version como una versión relaxed-numeric. (Números no negativos separados por puntos)", - "CmdNewOptVersionString": "Interpretar --version como una cadena sin comportamiento de ordenación.", - "CmdNewSettingName": "Nombre del nuevo manifiesto.", + "CmdExportSettingRepoDir": "La ruta del directorio para el repositorio exportado", + "CmdExportSettingRepoURL": "Dirección URL del repositorio remoto para el instalador en línea", + "CmdExportSettingSDKMinVersion": "Versión mínima admitida del SDK de Android", + "CmdExportSettingSDKTargetVersion": "La versión del SDK de destino de Android", + "CmdExportSynopsis": "Crea una implementación independiente de los puertos instalados", + "CmdFetchOptXStderrStatus": "Imprime mensajes de estado o descarga en stderr en lugar de stdout (los errores siguen en stdout)", + "CmdFetchSynopsis": "Captura algo del sistema o de Internet", + "CmdFindExample1": "vcpkg find port ", + "CmdFindExample2": "vcpkg find artifact ", + "CmdFindSynopsis": "Encuentra un puerto o artefacto que puede ser instalado o activado", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "Da formato a los archivos de manifiesto de todos los puertos", + "CmdFormatManifestOptConvertControl": "Convierte los archivos CONTROL en archivos de manifiesto", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "Genera archivos .props de msbuild como si se activaran las dependencias de artefacto de un manifiesto, sin adquirirlos.", + "CmdGenerateMessageMapOptNoOutputComments": "Excluye los comentarios al generar el mapa de mensajes (útil para generar el archivo de localización en inglés)", + "CmdHashExample1": "vcpkg hash ", + "CmdHashExample2": "vcpkg hash SHA256", + "CmdHashSynopsis": "Obtiene sha256 o SHA512 de un archivo", + "CmdHelpCommandSynopsis": "Muestra los detalles de ayuda de ", + "CmdHelpCommands": "help ", + "CmdHelpCommandsSynopsis": "Muestra la lista completa de comandos, incluidos los poco frecuentes que no aparecen aquí", + "CmdHelpTopic": "help ", + "CmdInfoOptInstalled": "(experimental) Informa de los paquetes instalados en lugar de los disponibles", + "CmdInfoOptTransitive": "(experimental) También informa de las dependencias de los paquetes instalados", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Crea un registro Git en blanco", + "CmdInstallExample1": "vcpkg install ...", + "CmdIntegrateSynopsis": "Integra vcpkg con máquinas, proyectos o shells", + "CmdListExample2": "vcpkg list ", + "CmdNewExample1": "vcpkg new --name=ejemplo --version=1.0", + "CmdNewOptApplication": "Crea un manifiesto de aplicación (no requiere nombre ni versión)", + "CmdNewOptSingleFile": "Inserta vcpkg-configuration.json en vcpkg.json.", + "CmdNewOptVersionDate": "Interpreta --version como una fecha ISO 8601. (AAAA-MM-DD)", + "CmdNewOptVersionRelaxed": "Interpreta --version como una versión numérica relajada (números no negativos separados por puntos)", + "CmdNewOptVersionString": "Interpreta --version como una cadena sin comportamiento de ordenación", + "CmdNewSettingName": "Nombre para el nuevo manifiesto", "CmdNewSettingVersion": "Versión del nuevo manifiesto.", - "CmdRegenerateOptDryRun": "no realiza realmente la acción, muestra solo lo que se haría", - "CmdRegenerateOptForce": "continúa con la acción (potencialmente peligrosa) sin confirmación", - "CmdRegenerateOptNormalize": "aplicar cualquier corrección de desuso", - "CmdRemoveOptDryRun": "Imprimir los paquetes que se vayan a quitar, pero no quitarlos", - "CmdRemoveOptOutdated": "Seleccionar todos los paquetes con versiones que no coincidan con los archivos de puerto", - "CmdRemoveOptRecurse": "Permitir la eliminación de paquetes no especificados explícitamente en la línea de comandos", - "CmdSetInstalledOptDryRun": "No compilar o instalar realmente", - "CmdSetInstalledOptNoUsage": "No imprimir la información de uso de CMake después de la instalación.", - "CmdSetInstalledOptWritePkgConfig": "Escribe un archivo con formato packages.config de NuGet para usarlo con almacenamiento en caché binario externo.\n Consulte \"vcpkg ayuda de binarycaching\" para obtener más información.", + "CmdNewSynposis": "Crea un nuevo manifiesto", + "CmdOwnsExample1": "vcpkg owns ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "Diferencia los cambios en las versiones de los puertos entre commits", + "CmdRegenerateOptDryRun": "No realiza realmente la acción, sólo muestra lo que se haría", + "CmdRegenerateOptForce": "Procede con la acción (potencialmente peligrosa) sin confirmación", + "CmdRegenerateOptNormalize": "Aplica las correcciones de desuso.", + "CmdRemoveExample1": "vcpkg remove ...", + "CmdRemoveOptDryRun": "Imprime los paquetes que se van a quitar, pero no los quita.", + "CmdRemoveOptOutdated": "Quita todos los paquetes con versiones que no coinciden con el registro integrado.", + "CmdRemoveOptRecurse": "Permite eliminar paquetes dependientes no especificados explícitamente", + "CmdSearchExample1": "vcpkg search ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "No compila o instala realmente", + "CmdSetInstalledOptNoUsage": "No imprime la información de uso de CMake después de la instalación", + "CmdSetInstalledOptWritePkgConfig": "Escribe un archivo con formato packages.config de NuGet para usarlo con almacenamiento en caché binario externo. Consulte \"vcpkg help binarycaching\" para obtener más información", + "CmdSetInstalledSynopsis": "Instala, actualiza o elimina paquetes de forma que lo instalado coincida exactamente con lo suministrado", "CmdSettingCopiedFilesLog": "Ruta de acceso al registro de archivos copiados que se va a crear", "CmdSettingInstalledDir": "Ruta de acceso al árbol instalado que se va a usar", "CmdSettingTLogFile": "Ruta de acceso al archivo tlog que se va a crear", "CmdSettingTargetBin": "Ruta de acceso al binario que se va a analizar", - "CmdUpdateBaselineOptDryRun": "Imprimir plan sin ejecución", - "CmdUpdateBaselineOptInitial": "agregar un \"builtin-baseline\" a un vcpkg.json que aún no lo tenga", - "CmdUpgradeOptAllowUnsupported": "En lugar de dar error en un puerto no admitido, continúe con una advertencia.", + "CmdUpdateBaselineOptDryRun": "Imprime el plan sin ejecución", + "CmdUpdateBaselineOptInitial": "Agrega un elemento \"builtin-baseline\" a un archivo vcpkg.json que aún no lo tiene.", + "CmdUpdateBaselineSynopsis": "Actualiza las líneas de base de los registros git en un manifiesto al \"HEAD commit\" de esos registros", + "CmdUpdateRegistryAll": "Actualiza todos los registros de artefactos conocidos", + "CmdUpdateRegistryAllExcludesTargets": "El registro de actualización --all no se puede usar con una lista de registros de artefactos", + "CmdUpdateRegistryAllOrTargets": "La actualización del registro requiere una lista de nombres de registro de artefactos o interfaces de usuario para actualizar, o --all.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "Vuelve a descargar un registro de artefactos", "CmdUpgradeOptNoDryRun": "Actualizar realmente", "CmdUpgradeOptNoKeepGoing": "Detener la instalación de paquetes en caso de error", + "CmdUseExample1": "vcpkg use ", + "CmdUseSynopsis": "Activar un único artefacto en este shell", + "CmdVSInstancesSynopsis": "Lista las instancias de Visual Studio detectadas", "CmdXDownloadOptHeader": "Encabezado adicional que se usará al obtener de direcciones URL", "CmdXDownloadOptSha": "Hash del archivo que se va a descargar", - "CmdXDownloadOptSkipSha": "No comprobar el SHA512 del archivo descargado", - "CmdXDownloadOptStore": "Indica que el archivo deberá almacenarse en lugar de capturarse", + "CmdXDownloadOptSkipSha": "Omite la comprobación del SHA512 del archivo descargado", + "CmdXDownloadOptStore": "Almacena el el archivo debe padre que buscarlo", "CmdXDownloadOptUrl": "Dirección URL que se descargará y almacenará si faltase en la memoria caché", + "CmdZApplocalSynopsis": "Copia las dependencias de un binario desde el árbol instalado hasta la ubicación de ese binario para su implementación app-local.", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract origen.zip origen_diretorio --strip 2", + "CmdZExtractOptStrip": "El número de directorios principales a eliminar de todas las rutas", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", "CommandFailed": "command:\n{command_line}\nha fallado con los siguientes resultados:", - "Commands": "Comandos:", - "CommunityTriplets": "Tripletes de la comunidad VCPKG:", + "CommunityTriplets": "Tripletes de la comunidad:", "ComparingUtf8Decoders": "Comparación de Utf8Decoders con otra proveniencia; esto siempre es un error", "CompressFolderFailed": "No se pudo comprimir la carpeta \"{path}\":", "ComputingInstallPlan": "Calculando plan de instalación...", "ConfigurationErrorRegistriesWithoutBaseline": "La configuración definida en {path} no es válida.\n\nEl uso de registros requiere que se establezca una línea base para el registro predeterminado o que el registro predeterminado sea null.\n\nConsulte {url} para obtener más detalles.", "ConfigurationNestedDemands": "[\"{json_field}\"] contiene un objeto `demands` anidado (las `demands` anidadas no tienen ningún efecto)", "ConflictingFiles": "Los siguientes archivos ya están instalados en {path} y están en conflicto con {spec}", + "ConsideredVersions": "Se tuvieron en cuenta los siguientes ejecutables, pero se descartaron debido al requisito de versión de {version}:", "ConstraintViolation": "Se ha encontrado una infracción de restricción:", "ContinueCodeUnitInStart": "se encontró la unidad de código de continuación en la posición inicial", "ControlAndManifestFilesPresent": "Tanto un archivo de manifiesto como un archivo CONTROL existen en el directorio de puertos: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "Base de datos dañada.", "CorruptedInstallTree": "El árbol vcpkg \"installed\" está dañado.", "CouldNotDeduceNugetIdAndVersion": "No se pudo deducir el id. y la versión de NuGet del nombre de archivo: {path}", - "CouldNotFindBaseline": "No se pudo encontrar la línea de base especificada explícitamente `\"{commit_sha}\"` en el archivo de línea de base {path}", - "CouldNotFindBaselineForRepo": "No fue posible encontrar la línea de base `\"{commit_sha}\"` para el repositorio {package_name}", - "CouldNotFindBaselineInCommit": "No se pudo encontrar la línea de base en el comando `\"{commit_sha}\"` del repositorio {package_name}:", + "CouldNotFindBaselineInCommit": "No se pudo encontrar la línea base en {url} en {commit_sha} para {package_name}.", "CouldNotFindGitTreeAtCommit": "no se pudo encontrar el árbol git para \"versiones\" en el repositorio {package_name} en el comando {commit_sha}", "CouldNotFindToolVersion": "No se encontró en {path}", "CouldNotFindVersionDatabaseFile": "No se pudo encontrar el archivo de base de datos de las versiones: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "La variable de entorno VCPKG_DEFAULT_BINARY_CACHE debe ser un directorio (era: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "La variable de entorno VCPKG_DEFAULT_BINARY_CACHE debe ser absoluta (era: {path})", "DefaultBinaryCacheRequiresDirectory": "La variable de entorno VCPKG_DEFAULT_BINARY_CACHE debe ser un directorio (era: {path})", - "DefaultBrowserLaunched": "Explorador predeterminado iniciado para {url}.", + "DefaultFeatureCore": "la característica \"core\" desactiva las características por defecto y por lo tanto no puede estar en la lista de características por defecto", + "DefaultFeatureDefault": "la característica \"por defecto\" se refiere al conjunto de características por defecto y por lo tanto no puede estar en la lista de características por defecto", + "DefaultFeatureIdentifier": "los nombres de las características por defecto deben ser identificadores", "DefaultFlag": "El valor predeterminado es --{option} activado.", "DefaultRegistryIsArtifact": "El Registro predeterminado no puede ser un registro de artefacto.", - "DefaultTriplet": "A partir de la versión de septiembre de 2023, el triplete predeterminado para las bibliotecas vcpkg cambiará de x86-windows al triplete de host detectado ({triplet}). Para resolver este mensaje, agregue --triplet x86-windows para mantener el mismo comportamiento.", + "DefaultTripletChanged": "En la versión de septiembre de 2023, el triplete predeterminado para las bibliotecas vcpkg cambió de x86-windows al triplete del host detectado ({triplet}). Para obtener el comportamiento antiguo, añada --triplet x86-windows . Para suprimir este mensaje, añada --triplet {triplet} .", "DeleteVcpkgConfigFromManifest": "-- O bien, quite “vcpkg-configuration” del archivo de manifiesto {path}.", + "DependencyFeatureCore": "la característica \"core\" no puede estar en la lista de características de una dependencia. Para desactivar las características por defecto, agregue \"default-features\": false en su lugar.", + "DependencyFeatureDefault": "la característica \"por defecto\" no puede estar en la lista de características de una dependencia. Para activar las características por defecto, agregue \"default-features\": true en su lugar.", + "DependencyGraphCalculation": "Se ha habilitado el envío del gráfico de dependencias.", + "DependencyGraphFailure": "Error al enviar el gráfico de dependencias.", + "DependencyGraphSuccess": "El gráfico de dependencias se envió correctamente.", "DeprecatedPrefabDebugOption": "--prefab-debug está en desuso.", "DetectCompilerHash": "Detectando hash del compilador para el triplete {triplet}...", "DocumentedFieldsSuggestUpdate": "Si se trata de campos documentados que deben reconocerse, intente actualizar la herramienta vcpkg.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "El archivo no tiene el hash esperado:\nURL: {url}\nArchivo: {path}\nHash esperado: {expected}\nHash real: {actual}", "DownloadFailedRetrying": "Error de descarga: reintentar después de {value}ms", "DownloadFailedStatusCode": "{url}: error: código de estado {value}", - "DownloadRootsDir": "Especifique el directorio raíz de descargas.\n(predeterminado: {env_var})", + "DownloadRootsDir": "Descarga el directorio (predeterminado: {env_var})", "DownloadWinHttpError": "{url}: error de {system_api} con el código de salida {exit_code}", "DownloadedSources": "Orígenes descargados para {spec}", "DownloadingPortableToolVersionX": "No se encontró la versión adecuada de {tool_name} (se requiere v{version}). Descargando {tool_name} portable {version}...", "DownloadingTool": "Descargando {tool_name}...\n{url}->{path}", "DownloadingUrl": "Descargando {url}", - "DownloadingVcpkgCeBundle": "Descargando paquete vcpkg-artifacts {version}...", - "DownloadingVcpkgCeBundleLatest": "Descargando versión de paquete vcpkg-artifacts más reciente...", "DownloadingVcpkgStandaloneBundle": "Descargando el paquete independiente {version}.", "DownloadingVcpkgStandaloneBundleLatest": "Descargando el paquete independiente más reciente.", "DuplicatePackagePattern": "El paquete \"{package_name}\" está duplicado.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "al detectar información del compilador:\nEl contenido del archivo de registro en \"{path}\" es:", "ErrorIndividualPackagesUnsupported": "En modo de manifiesto, \"vcpkg install\" no admite argumentos de paquete individuales.\nPara instalar paquetes adicionales, edite vcpkg.json y, a continuación, ejecute \"vcpkg install\" sin argumentos de paquete.", "ErrorInvalidClassicModeOption": "La opción --{option} no se admite en el modo clásico y no se encontró ningún manifiesto.", + "ErrorInvalidExtractOption": "--{option} debe establecerse en un entero no negativo o “AUTO”.", "ErrorInvalidManifestModeOption": "La opción --{option} no se admite en modo de manifiesto.", "ErrorMessage": "error: ", "ErrorMessageMustUsePrintError": "El mensaje denominado {value} empieza por error:, debe cambiarse para anteponer ErrorMessage en el código en su lugar.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "Se produjeron errores al analizar {path}.", "ErrorWhileWriting": "Error al escribir {path}.", "ErrorsFound": "Se encontraron los siguientes errores:", - "Example": "Ejemplo:", + "ExamplesHeader": "Ejemplos:", "ExceededRecursionDepth": "La profundidad de recursividad superó el límite.", "ExcludedPackage": "{spec} excluido", "ExcludedPackages": "Se excluyen los siguientes paquetes:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Exportando herramienta de mantenimiento...", "ExportingPackage": "Exportando {package_name}...", "ExtendedDocumentationAtUrl": "Documentación ampliada disponible en \"{url}\".", + "ExtractHelp": "Extrae un archivo.", "ExtractingTool": "Extrayendo {tool_name}...", "FailedPostBuildChecks": "Se encontraron {count} problemas posteriores a la compilación. Para enviar estos puertos a catálogos protegidos, corrija primero el archivo de puerto: {path}", "FailedToAcquireMutant": "no se pudo adquirir el {path} mutante", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "No se pudo determinar commit actual:", "FailedToDownloadFromMirrorSet": "Ha ocurrido un error en la descarga del conjunto de réplicas", "FailedToExtract": "No se pudieron extraer \"{path}\":", - "FailedToFetchError": "{error_msg}\nHa ocurrido un error en la obtención de {package_name}:", - "FailedToFindBaseline": "No se ha podido encontrar baseline.json", + "FailedToFetchRepo": "No se pudo recuperar la {url}.", "FailedToFindPortFeature": "{package_name} no tiene ninguna característica denominada {feature}.", "FailedToFormatMissingFile": "No hay archivos a los que aplicar formato.\nPase --all o los archivos explícitos para aplicar formato o convertir.", "FailedToLoadInstalledManifest": "No se ha podido cargar el control o el archivo de manifiesto para {package_name} debido al siguiente error. Quite {package_name} y vuelva a intentarlo.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "No se pudo realizar el bloqueo del sistema de archivos en {path}", "FailedToWriteManifest": "No se pudo escribir el archivo de manifiesto {path}", "FailedVendorAuthentication": "No se pudieron autenticar uno o varios proveedores de credenciales de {vendor}. Consulte \"{url}\" para obtener más detalles sobre cómo proporcionar credenciales.", - "FeedbackAppreciated": "Gracias por sus comentarios.", "FetchingBaselineInfo": "Obteniendo información de referencia de {package_name}...", "FetchingRegistryInfo": "Obteniendo información del registro de {url} ({valor})...", "FieldKindDidNotHaveExpectedValue": "\"kind\" no tenía un valor esperado: (se esperaba uno de: {expected}; se encontró {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "Se han encontrado rutas de acceso absolutas en los siguientes archivos:", "FilesExported": "Archivos exportados en: {path}", "FindHelp": "Busca el artefacto o puerto indicado. Sin ningún parámetro después de \"artifact\" o \"port\", muestra todo.", + "FindVersionArtifactsOnly": "--La versión no se puede utilizar con vcpkg search o vcpkg find port", "FishCompletion": "La finalización del pez vcpkg ya se agregó en \"{path}\".", "FloatingPointConstTooBig": "Constante en punto flotante demasiado grande: {count}", "FollowingPackagesMissingControl": "Los siguientes paquetes no tienen un CONTROL o vcpkg.json válido:", "FollowingPackagesNotInstalled": "Los paquetes siguientes no están instalados:", "FollowingPackagesUpgraded": "Los siguientes paquetes están actualizados:", + "ForMoreHelp": "Para obtener más ayuda", "ForceSystemBinariesOnWeirdPlatforms": "La variable de entorno VCPKG_FORCE_SYSTEM_BINARIES debe establecerse en las plataformas arm, s390x, ppc64le y riscv.", "FormattedParseMessageExpression": "en expresión: {value}", "GHAParametersMissing": "El origen binario GHA requiere que se establezcan las variables de entorno ACTIONS_RUNTIME_TOKEN y ACTIONS_CACHE_URL. Consulte {url} para obtener más detalles.", @@ -470,7 +590,7 @@ "GitCommandFailed": "no se pudo ejecutar: {command_line}", "GitFailedToFetch": "error al capturar la referencia {value} del repositorio {url}", "GitFailedToInitializeLocalRepository": "no se pudo inicializar el repositorio local {path}", - "GitRegistryMustHaveBaseline": "La entrada del registro de git para \"{package_name}\" debe tener un campo \"línea base\" que sea un SHA de confirmación de git válido (40 caracteres hexadecimales). \nEl encabezado actual de ese repositorio es \"{value}\".", + "GitRegistryMustHaveBaseline": "La \"{url}\" del Registro git debe tener un campo \"baseline\" que sea un SHA de confirmación de GIT válido (40 caracteres hexadecimales).\nPara usar las últimas versiones actuales, establezca la línea base en HEAD, \"{commit_sha}\" del repositorio.", "GitStatusOutputExpectedFileName": "se esperaba un nombre de archivo", "GitStatusOutputExpectedNewLine": "se esperaba una nueva línea", "GitStatusOutputExpectedRenameOrNewline": "se esperaba un archivo con nombre cambiado o líneas nuevas", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "Git generó una salida inesperada al ejecutar {command_line}", "GraphCycleDetected": "Ciclo detectado en el gráfico en {package_name}:", "HashFileFailureToRead": "no se pudo leer el \"{path}\" de archivo para el algoritmo hash: ", + "HashPortManyFiles": "{package_name} contiene {count} archivos. El hash de este contenido puede tardar mucho tiempo al determinar el hash de ABI para el almacenamiento en caché binario. Considera la posibilidad de reducir el número de archivos. Las causas comunes de esto son extraer accidentalmente los archivos de origen o de compilación en el directorio de un puerto.", "HeaderOnlyUsage": "{package_name} es de solo encabezado y se puede usar desde CMake a través de:", "HelpAssetCaching": "**Característica experimental: esto puede cambiar o quitarse en cualquier momento**\n\nvcpkg puede usar reflejos para almacenar en caché los recursos descargados, lo que garantiza una operación continua aunque el origen original cambie o desaparezca.\n\nEl almacenamiento en caché de recursos se puede configurar estableciendo la variable de entorno X_VCPKG_ASSET_SOURCES en una lista de orígenes delimitada por punto y coma o pasando una secuencia de opciones de línea de comando --x-asset-sources=. Los orígenes de línea de comandos se interpretan después de los orígenes de entorno. Las comas, los puntos y comas, y los acentos graves pueden escaparse utilizando el acento grave (`).\n\nEl parámetro opcional para determinadas cadenas controla cómo se tendrá acceso a las cadenas. Se puede especificar como \"read\", \"write\" o \"readwrite\" y el valor predeterminado es \"read\".\n\nOrígenes válidos:", "HelpAssetCachingAzUrl": "Agrega un origen de Azure Blob Storage, opcionalmente mediante la validación de Firma de acceso compartido. La dirección URL debe incluir la ruta de acceso del contenedor y terminar con el signo \"/\" final. , si se define, debe ir precedida de \"?\". Los servidores que no son de Azure también funcionarán si responden a las solicitudes GET y PUT del formulario: \"\".", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "Especifica un tiempo de espera de NuGet para las operaciones de red de NuGet; equivalente al parámetro \"-Timeout\" de la CLI de NuGet.", "HelpBuiltinBase": "La línea base hace referencia a una confirmación dentro del repositorio vcpkg que establece una versión mínima en cada dependencia del gráfico. Por ejemplo, si no se especifica ninguna otra restricción (directa o transitivamente), la versión se resolverá en la línea base del manifiesto de nivel superior. Se omiten las líneas base de las dependencias transitivas.", "HelpCachingClear": "Quita todos los orígenes anteriores, incluidos los valores predeterminados.", - "HelpContactCommand": "Mostrar información de contacto para enviar comentarios.", - "HelpCreateCommand": "Crear un puerto nuevo.", - "HelpDependInfoCommand": "Mostrar una lista de dependencias para los puertos.", - "HelpEditCommand": "Abra un puerto para editarlo (use la variable de entorno '{env_var}' para establecer un programa editor; el valor predeterminado es \"code\").", - "HelpEnvCommand": "Crea un entorno de shell limpio para el desarrollo o la compilación.", - "HelpExampleCommand": "Para obtener más ayuda (incluidos ejemplos), consulte la carpeta README.md y documentos que lo acompaña.", + "HelpContactCommand": "Muestra información de contacto para enviar comentarios", + "HelpCreateCommand": "Crea un puerto nuevo", + "HelpDependInfoCommand": "Muestra una lista de dependencias para los puertos", + "HelpEditCommand": "Edita un puerto, opcionalmente con {env_var}, el valor predeterminado es \"code\"", + "HelpEnvCommand": "Crea un entorno shell limpio para el desarrollo o la compilación", + "HelpExampleCommand": "Para obtener más ayuda (incluidos ejemplos), consulte https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Manifiesto de ejemplo:", "HelpExportCommand": "Exporta un paquete.", - "HelpFormatManifestCommand": "Da formato a todos los archivos vcpkg.json. Ejecute esto antes de confirmar en vcpkg.", "HelpHashCommand": "Aplicar hash a un archivo por algoritmo específico, SHA512 predeterminado.", - "HelpInitializeRegistryCommand": "Inicializa un registro en el directorio .", - "HelpInstallCommand": "Instalar un paquete.", - "HelpListCommand": "Mostrar los paquetes instalados.", + "HelpInstallCommand": "Instala un paquete", + "HelpListCommand": "Enumera los paquetes instalados", "HelpManifestConstraints": "Los manifiestos pueden colocar tres tipos de restricciones en las versiones usadas", "HelpMinVersion": "Vcpkg seleccionará la versión mínima encontrada que coincida con todas las restricciones aplicables, incluida la versión de la línea base especificada en el nivel superior, así como cualquier restricción \"version>=\" en el gráfico.", "HelpOverrides": "Cuando se usa como manifiesto de nivel superior (por ejemplo, cuando se ejecuta \"vcpkg install\" en el directorio), las invalidaciones permiten a un manifiesto cortocircuitar la resolución de dependencias y especifican exactamente la versión que se va a usar. Se pueden usar para controlar los conflictos de versión, como con las dependencias \"version-string\". No se tendrán en cuenta cuando dependan de forma transitiva.", - "HelpOwnsCommand": "Busque archivos en los paquetes instalados.", + "HelpOwnsCommand": "Busca el propietario de un archivo en los paquetes instalados", "HelpPackagePublisher": "Además, los publicadores de paquetes pueden usar restricciones \"version>=\" para asegurarse de que los consumidores usan al menos una versión mínima determinada de una dependencia determinada. Por ejemplo, si una biblioteca necesita una API agregada a boost-asio en la versión 1.70, una restricción \"version>=\" garantizará que los usuarios usen una versión suficiente incluso en caso de invalidaciones de versión individuales o referencias entre registros.", - "HelpPortVersionScheme": "Además, cada versión tiene una \"versión de puerto\". que es un entero no negativo. Cuando se representa como texto, la versión del puerto (si es distinta de cero) se agrega como sufijo al texto de la versión principal separado por un hash (#). Las versiones de puerto se ordenan lexográficamente después del texto de la versión principal, por ejemplo: \n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Desinstalar un paquete.", - "HelpRemoveOutdatedCommand": "Desinstale todos los paquetes obsoletos.", - "HelpResponseFileCommand": "Especifique un archivo de respuesta para proporcionar parámetros adicionales.", - "HelpSearchCommand": "Buscar paquetes disponibles para compilar.", - "HelpTextOptFullDesc": "No recortar texto largo.", - "HelpTopicCommand": "Mostrar ayuda para un tema específico.", - "HelpTopicsCommand": "Mostrar la lista de temas de ayuda.", - "HelpTxtOptAllowUnsupportedPort": "En lugar de dar error en un puerto no admitido, continúe con una advertencia.", - "HelpTxtOptCleanAfterBuild": "Limpiar los árboles de compilación, los paquetes y las descargas después de compilar cada paquete.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Limpiar los árboles de compilación después de compilar cada paquete.", - "HelpTxtOptCleanDownloadsAfterBuild": "Limpiar las descargas después de compilar cada paquete.", - "HelpTxtOptCleanPkgAfterBuild": "Limpiar paquetes después de compilar cada paquete.", - "HelpTxtOptDryRun": "No compilar o instalar realmente.", - "HelpTxtOptEditable": "Deshabilitar la reextracción de origen y el almacenamiento en caché binario para las bibliotecas en la línea de comandos (modo clásico)", + "HelpPortVersionScheme": "Cada versión tiene además una \"versión de puerto\" que es un número entero no negativo. Cuando se representa como texto, la versión del puerto (si es distinta de cero) se añade como sufijo al texto de la versión primaria separado por una almohadilla (#). Las versiones de puerto se ordenan lexicográficamente después del texto de la versión primaria, por ejemplo:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Desinstala un paquete", + "HelpResponseFileCommand": "Contiene un argumento por línea expandida en ese lugar", + "HelpSearchCommand": "Busca paquetes disponibles para compilar", + "HelpTextOptFullDesc": "No trunca el texto largo", + "HelpTopicCommand": "Muestra un tema de ayuda específico", + "HelpTopicsCommand": "Muestra la lista completa de temas de ayuda", + "HelpTxtOptAllowUnsupportedPort": "Continúa con una advertencia en puertos no soportados, en lugar de fallar", + "HelpTxtOptCleanAfterBuild": "Limpia los árbol de compilación, los paquetes y las descargas después de compilar cada paquete", + "HelpTxtOptCleanBuildTreesAfterBuild": "Limpia los árboles de compilación después de compilar cada paquete", + "HelpTxtOptCleanDownloadsAfterBuild": "Limpia las descargas después de compilar cada paquete", + "HelpTxtOptCleanPkgAfterBuild": "Limpia los paquetes después de compilar cada paquete", + "HelpTxtOptDryRun": "No compila o instala realmente", + "HelpTxtOptEditable": "Deshabilita la reextracción de origen y el almacenamiento en caché binario para las bibliotecas en la línea de comandos (modo clásico)", "HelpTxtOptEnforcePortChecks": "No se puede instalar si un puerto ha detectado problemas o intenta usar una característica en desuso", - "HelpTxtOptKeepGoing": "Continuar instalando paquetes en caso de error.", - "HelpTxtOptManifestFeature": "Característica adicional del manifiesto de nivel superior que se instalará (modo de manifiesto).", - "HelpTxtOptManifestNoDefault": "No instale las características predeterminadas desde el manifiesto de nivel superior (modo de manifiesto).", - "HelpTxtOptNoDownloads": "No descargar nuevos orígenes.", - "HelpTxtOptNoUsage": "No imprima la información de uso de CMake después de la instalación.", - "HelpTxtOptOnlyBinCache": "Se produce un error si los archivos binarios almacenados en caché no están disponibles.", - "HelpTxtOptOnlyDownloads": "Haz lo mejor que puedas para descargar fuentes sin compilar.", - "HelpTxtOptRecurse": "Permitir la eliminación de paquetes como parte de la instalación.", - "HelpTxtOptUseAria2": "Usar aria2 para realizar tareas de descarga.", - "HelpTxtOptUseHeadVersion": "Instalar las bibliotecas en la línea de comandos mediante los orígenes ascendentes más recientes (modo clásico).", - "HelpTxtOptWritePkgConfig": "Escriba un archivo con formato packages.config de NuGet para usarlo con almacenamiento en caché binario externo.\nConsulte \"vcpkg help binarycaching\" para obtener más información.", - "HelpUpdateBaseline": "El mejor enfoque para mantener las bibliotecas actualizadas es actualizar la referencia de línea base. Esto garantizará que se actualicen todos los paquetes, incluidos los transitivos. Sin embargo, si necesita actualizar un paquete de forma independiente, puede usar una restricción \"version>=\".", - "HelpUpdateCommand": "Enumerar los paquetes que se pueden actualizar.", - "HelpUpgradeCommand": "Recompilar todos los paquetes obsoletos.", - "HelpVersionCommand": "Mostrar información de versión.", + "HelpTxtOptKeepGoing": "Continúa la instalación de paquetes en caso de error", + "HelpTxtOptManifestFeature": "Características adicionales del manifiesto de nivel superior que se van a instalar (modo de manifiesto)", + "HelpTxtOptManifestNoDefault": "No instala las características predeterminadas del manifiesto de nivel superior (modo de manifiesto)", + "HelpTxtOptNoDownloads": "No descarga nuevos orígenes", + "HelpTxtOptNoUsage": "No imprime la información de uso de CMake después de la instalación", + "HelpTxtOptOnlyBinCache": "Se produce un error si los archivos binarios almacenados en caché no están disponibles", + "HelpTxtOptOnlyDownloads": "Realiza el mejor esfuerzo al intentar descargar orígenes sin crear", + "HelpTxtOptRecurse": "Permite la eliminación de paquetes como parte de la instalación", + "HelpTxtOptUseAria2": "Usa aria2 para realizar tareas de descarga", + "HelpTxtOptUseHeadVersion": "Instala las bibliotecas en la línea de comandos con los orígenes ascendentes más recientes (modo clásico)", + "HelpTxtOptWritePkgConfig": "Escribe un archivo con formato packages.config de NuGet para usarlo con almacenamiento en caché binario externo. Consulte \"vcpkg help binarycaching\" para obtener más información", + "HelpUpdateBaseline": "El mejor enfoque para mantener actualizadas las bibliotecas es actualizar la referencia de línea base. Esto garantizará que se actualicen todos los paquetes, incluidos los transitivos. Sin embargo, si necesita actualizar un paquete de forma independiente, puede usar una restricción \"versión>=\".", + "HelpUpdateCommand": "Enumera los paquetes que se pueden actualizar", + "HelpUpgradeCommand": "Vuelve a generar todos los paquetes obsoletos", + "HelpVersionCommand": "Muestra información de versión", "HelpVersionDateScheme": "Una fecha (2021-01-01.5)", "HelpVersionGreater": "Dentro del campo \"dependencias\", cada dependencia puede tener una restricción mínima en la lista. Estas restricciones mínimas se usarán cuando se dependa de forma transitiva de esta biblioteca. Además, se puede especificar una versión de puerto mínima con un sufijo '#'.", "HelpVersionScheme": "Secuencia de números separados por puntos (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Firma de archivo incorrecta", "IncorrectPESignature": "Firma incorrecta del PE", "IncrementedUtf8Decoder": "Utf8Decoder incrementado al final de la cadena", - "InfoSetEnvVar": "También puede establecer la variable de entorno \"{env_var}\" en el editor de su elección.", + "InfoSetEnvVar": "También puede establecer {env_var} en el editor que prefiera.", "InitRegistryFailedNoRepo": "No se pudo crear un registro en {path} porque no es una raíz de repositorio git.\nUse \"git init {command_line}\" para crear un repositorio git en esta carpeta.", "InstallCopiedFile": "{path_source} -> {path_destination} listo", "InstallFailed": "error: {path}: {error_msg}", "InstallPackageInstruction": "Cuando se abra un proyecto, vaya a Herramientas->Administrador de paquetes de NuGet->Consola de administrador de paquetes:\n Instalar-Paquete \"{value}\" -Origen \"{path}\"", - "InstallRootDir": "(Experimental) Especifique el directorio raíz de instalación.", + "InstallRootDir": "Directorio instalado (experimental)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} omitido, actualizado", "InstallWithSystemManager": "Es posible que pueda instalar esta herramienta a través del administrador de paquetes del sistema.", "InstallWithSystemManagerMono": "Es posible que los usuarios de Ubuntu 18.04 necesiten una versión más reciente de mono, disponible en {url}.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Instalando el puerto desde la ubicación: {path}", "InstallingMavenFile": "{path} instalando el archivo Maven", "InstallingPackage": "Instalando {action_index}/{count} {spec}...", - "IntegrateBashHelp": "Habilite la finalización con tabulación de Bash.", - "IntegrateFishHelp": "Habilitar la finalización de tabulaciones de pez.", - "IntegrateInstallHelpLinux": "Hacer que los paquetes instalados estén disponibles para todo el usuario.", - "IntegrateInstallHelpWindows": "Hacer que los paquetes instalados estén disponibles para todo el usuario. Requiere privilegios de administrador en el primer uso.", - "IntegratePowerShellHelp": "Habilite la finalización con tabulación de PowerShell.", - "IntegrateProjectHelp": "Genere un paquete NuGet de referencia para el uso individual de un proyecto de VS.", - "IntegrateRemoveHelp": "Quite la integración en todo el usuario.", - "IntegrateZshHelp": "Habilite la finalización con tabulación zsh.", - "IntegrationFailed": "No se aplicó la integración.", + "IntegrateBashHelp": "Habilitar la finalización con tabulación de Bash. Solo para usuarios que no son de Windows", + "IntegrateFishHelp": "Habilitar la finalización de tabulación de pez. Solo para usuarios que no son de Windows", + "IntegrateInstallHelpLinux": "Hace que los paquetes instalados estén disponibles para todo el usuario", + "IntegrateInstallHelpWindows": "Hace que los paquetes instalados estén disponibles para todo el usuario. Requiere privilegios de administrador en el primer uso", + "IntegrateNonWindowsOnly": "{command_line} no es de solo Windows y no se admite en este sistema.", + "IntegratePowerShellHelp": "Habilite la finalización con tabulación de PowerShell. Solo Windows", + "IntegrateProjectHelp": "Genera un paquete NuGet de referencia para el uso de proyectos de Visual Studio individuales. Solo Windows", + "IntegrateRemoveHelp": "Quita la integración de todo el usuario", + "IntegrateWindowsOnly": "{command_line} es solo de Windows y no se admite en este sistema.", + "IntegrateZshHelp": "Habilitar la finalización con tabulación zsh. Solo para usuarios que no son de Windows", + "IntegrationFailedVS2015": "No se aplicó la integración para Visual Studio 2015.", "InternalCICommand": "vcpkg ci es un comando interno que cambiará de forma incompatible o se quitará en cualquier momento.", "InternalErrorMessage": "Error interno:", "InternalErrorMessageContact": "Abra un problema en https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug con los pasos detallados para reproducir el problema.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg no admite comentarios de estilo c, sin embargo la mayoría de los objetos permiten usar campos prefijados con $ como comentarios.", "InvalidCommitId": "Id. de confirmación no válido: {commit_sha}", "InvalidDefaultFeatureName": "\"default\" es un nombre de característica reservado", - "InvalidDependency": "las dependencias deben ser alfanuméricas y guiones en minúsculas, y no uno de los nombres reservados", "InvalidFeature": "las características deben ser alfanuméricas y guiones en minúsculas, y no uno de los nombres reservados", "InvalidFileType": "error: {path} no puede controlar el tipo de archivo", "InvalidFilename": "El nombre de archivo no puede contener los caracteres que no son válidos {value}, pero tenía la ruta {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "La biblioteca no era válida: no se pudo encontrar un miembro vinculador.", "InvalidLinkage": "Tipo de vinculación de {system_name} no válido: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "expresión lógica no válida, carácter inesperado", - "InvalidLogicExpressionUsePipe": "expresión lógica no válida, use '|' en lugar de 'or'", + "InvalidLogicExpressionUsePipe": "expresión lógica no válida, use \"|\" en lugar de \"or\"", "InvalidNoVersions": "El archivo no contiene versiones.", "InvalidOptionForRemove": "'remove' acepta bibliotecas o '--outdated'", "InvalidPortVersonName": "Se ha encontrado un nombre de archivo de versión de puerto no válido: \"{path}\".", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "el valor de [\"{json_field}\"] debe ser un objeto", "JsonFieldNotString": "el valor de [\"{json_field}\"] debe ser una cadena", "JsonFileMissingExtension": "el archivo JSON {path} debe tener una extensión .json (todo en minúsculas)", - "JsonSwitch": "(Experimental) Solicitar salida JSON.", + "JsonSwitch": "Imprime JSON en lugar de un texto sin formato", "JsonValueNotArray": "el valor json no es una matriz", "JsonValueNotObject": "el valor json no es un objeto", "JsonValueNotString": "el valor json no es una cadena", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Versión dinámica (/MD)", "LinkageStaticDebug": "Depuración estática (/MTd)", "LinkageStaticRelease": "Versión estática (/MT)", - "ListHelp": "El argumento debe ser substring que se va a buscar o ningún argumento para mostrar todas las bibliotecas instaladas.", + "ListHelp": "Enumera las bibliotecas instaladas", "ListOfValidFieldsForControlFiles": "Esta es la lista de campos válidos para los archivos CONTROL (distingue mayúsculas de minúsculas):", "LoadingCommunityTriplet": "-- [COMMUNITY] Cargando configuración de triplet desde: {path}", "LoadingDependencyInformation": "Cargando información de dependencia para {count} paquetes...", @@ -708,7 +827,6 @@ "MultiArch": "La arquitectura multiarquitectura debe ser \"igual\", pero era {option}", "MultipleFeatures": "{package_name} declara {feature} varias veces; asegúrese de que las características tengan nombres distintos.", "MutuallyExclusiveOption": "--{value} no se puede usar con --{option}.", - "NavigateToNPS": "Vaya a {url} en su explorador preferido.", "NewConfigurationAlreadyExists": "Al crear un manifiesto, se sobrescribirá vcpkg-configuration.json en {path}.", "NewManifestAlreadyExists": "Ya existe un manifiesto en {path}.", "NewNameCannotBeEmpty": "--nombre no puede estar vacío.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "Especifique el --nombre y la --version para generar un manifiesto destinado a bibliotecas de C++, o bien especifique --aplicación para indicar que el manifiesto no está destinado a usarse como puerto.", "NewVersionCannotBeEmpty": "--versión no puede estar vacía.", "NoArgumentsForOption": "La opción --{option} no acepta ningún argumento.", - "NoCachedPackages": "No hay paquetes en caché.", "NoError": "sin errores", "NoInstalledPackages": "No hay paquetes instalados. ¿Quiso decir \"buscar\"?", "NoLocalizationForMessages": "No hay mensajes localizados para lo siguiente: ", @@ -739,22 +856,27 @@ "OptionRequiresAValue": "la opción '{option}' requiere un valor", "OptionRequiresOption": "--{value} requiere --{option}", "OptionUsedMultipleTimes": "la opción '{option}' ha sido especificada varias veces", - "OptionalCommand": "comando opcional", "Options": "Opciones", "OriginalBinParagraphHeader": "\nPárrafo binario original", + "OtherCommandsHeader": "Otro", "OverlayPatchDir": "La ruta de acceso de superposición \"{path}\" debe existir y debe ser un directorio.", - "OverlayTriplets": "Superponer tripletes de {path}:", + "OverlayPortsDirectoriesHelp": "Directorios de puertos superpuestos (también: {env_var})", + "OverlayTripletDirectoriesHelp": "Directorios de tripletes superpuestos (también: {env_var})", + "OverlayTriplets": "Tripletes superpuestos de \"{path}\":", "OverwritingFile": "El archivo {path} ya estaba presente y se sobrescribirá", "PECoffHeaderTooShort": "Al analizar el ejecutable portable {path}, el tamaño del encabezado COFF es demasiado pequeño para contener un encabezado PE válido.", - "PEConfigCrossesSectionBoundary": "Al analizar el portable executable {path}, el directorio de configuración de imagen cruza un límite de sección.", - "PEImportCrossesSectionBoundary": "Al analizar el ejecutable portable {path}, la tabla de importación cruza un límite de sección.", + "PEConfigCrossesSectionBoundary": "Al analizar el ejecutable portátil {path}, el directorio de configuración de imágenes cruza un límite de sección.", + "PEImportCrossesSectionBoundary": "Al analizar el ejecutable portátil {path}, la tabla de importación cruza un límite de sección.", "PEPlusTagInvalid": "Al analizar el ejecutable portable {path}, el encabezado opcional no era ni PE32 ni PE32+.", "PERvaNotFound": "Al analizar el ejecutable portable {path}, no se encontró RVA {value:#X}.", "PESignatureMismatch": "Al analizar el ejecutable portable {path}, la firma no coincide.", "PackageAlreadyRemoved": "no se puede quitar {spec}: ya se ha quitado", + "PackageDiscoveryHeader": "Detección de paquetes", "PackageFailedtWhileExtracting": "Error de '{value}' al extraer {path}.", - "PackageInfoHelp": "Muestra información detallada sobre los paquetes.", - "PackageRootDir": "(Experimental) Especifique el directorio raíz de paquetes.", + "PackageInfoHelp": "Mostrar información detallada sobre los paquetes", + "PackageInstallationHeader": "Instalación de paquetes", + "PackageManipulationHeader": "Manipulación de paquetes", + "PackageRootDir": "Directorio de paquetes (experimental)", "PackagesToInstall": "Se compilarán e instalarán los siguientes paquetes:", "PackagesToInstallDirectly": "Los siguientes paquetes se instalarán directamente:", "PackagesToModify": "Se modificarán paquetes adicionales (*) para completar esta operación.", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "Se esperaba que {value} fuera {expected}", "ParseControlErrorInfoWhileLoading": "al cargar {path}:", "ParseControlErrorInfoWrongTypeFields": "Los siguientes campos tenían los tipos incorrectos:", - "ParseIdentifierError": "\"{value}\" no es un identificador válido. Los identificadores deben ser alfanuméricos en minúsculas y guiones y no deben estar reservados (consulte {url} para obtener más información).", - "ParsePackageNameError": "\"{package_name}\" no es un nombre de paquete válido. Los nombres de paquete deben tener caracteres alfanuméricos en minúscula y guiones y no deben estar reservados (consulte {url} para obtener más información).", - "ParsePackagePatternError": "\"{package_name}\" no es un patrón de paquete válido. Los patrones de paquete solo deben usar un carácter comodín (*) y debe ser el último carácter del patrón (consulte {url} para obtener más información).", + "ParseFeatureNameError": "\"{package_name}\" no es un nombre de característica válido. Los nombres de las características deben ser alfanuméricos en minúsculas+hipónimos y no estar reservados (consulte {url} para obtener más información).", + "ParseIdentifierError": "\"{value}\" no es un identificador válido. Los identificadores deben ser alfanuméricos en minúsculas+hipónimos y no reservados (consulte {url} para obtener más información).", + "ParsePackageNameError": "\"{package_name}\" no es un nombre de paquete válido. Los nombres de los paquetes deben ser alfanuméricos en minúsculas+hipónimos y no estar reservados (consulte {url} para obtener más información).", + "ParsePackagePatternError": "\"{package_name}\" no es un patrón de paquete válido. Los patrones de paquetes deben utilizar solo un carácter comodín (*) y debe ser el último carácter del patrón (consulte {url} para obtener más información).", "PathMustBeAbsolute": "El valor de la variable de entorno X_VCPKG_REGISTRIES_CACHE no es absoluto: {path}", "PerformingPostBuildValidation": "-- Realizando validación posterior a la compilación", "PortBugAllowRestrictedHeaders": "En circunstancias excepcionales, esta directiva se puede deshabilitar mediante {env_var}", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "Para inspeccionar los archivos {extension}, use:", "PortBugInvalidCrtLinkage": "Los archivos binarios siguientes deben usar CRT {expected}.", "PortBugInvalidCrtLinkageEntry": "{path} se vincula con:", + "PortBugKernel32FromXbox": "El triplo seleccionado tiene como objetivo Xbox, pero las siguientes DLL se vinculan con kernel32. Estas DLL no se pueden cargar en Xbox, donde kernel32 no está presente. Esto suele deberse a que se vinculan con kernel32.lib en lugar de con una biblioteca paraguas adecuada, como onecore_apiset.lib o xgameplatform.lib.", "PortBugMergeLibCMakeDir": "La carpeta /lib/cmake debe combinarse con /debug/lib/cmake y moverse a /share/{package_name}/cmake. Use la función auxiliar `vcpkg_cmake_config_fixup()` del puerto vcpkg-cmake-config.`", "PortBugMismatchedNumberOfBinaries": "El número de archivos binarios de depuración y versión no coincide.", "PortBugMisplacedCMakeFiles": "Se encontraron los siguientes archivos de CMake fuera de /share/{spec}. Coloque los archivos de CMake en /share/{spec}.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "Si no se puede deshabilitar la creación de bin\\ o debug\\bin\\, úselo en el archivo de puerto para quitarlos", "PortBugRemoveEmptyDirectories": "Si se debe rellenar un directorio pero no lo está, esto podría indicar un error en el archivo de puerto.\nSi los directorios no son necesarios y su creación no se puede deshabilitar, use algo como esto en el archivo de puerto para quitarlos:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE directorios vacíos dejados por los cambios de nombre anteriores)", - "PortBugRestrictedHeaderPaths": "Los siguientes encabezados restringidos pueden impedir que el entorno de ejecución de C++ principal y otros paquetes se compilen correctamente. En circunstancias excepcionales, esta directiva se puede deshabilitar mediante {env_var}.", + "PortBugRestrictedHeaderPaths": "Los siguientes encabezados restringidos pueden impedir que el entorno de ejecución principal de C++ y otros paquetes se compilen correctamente. En circunstancias excepcionales, esta directiva se puede deshabilitar estableciendo la variable de CMake VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS en portfile.cmake.", "PortBugSetDllsWithoutExports": "Es probable que las DLL sin exportaciones sean un error en el script de compilación. Si se trata de esto, agregue la siguiente línea en el archivo de puerto:\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS habilitado)\nLas siguientes DLL no tienen exportaciones:", "PortDependencyConflict": "El puerto {package_name} tiene las siguientes dependencias no admitidas:", "PortDoesNotExist": "{package_name} no existe", @@ -827,21 +951,26 @@ "PortsDiffHelp": "El argumento debe ser una rama, etiqueta o hash para restaurar.", "PortsNoDiff": "No hubo cambios en los puertos entre las dos confirmaciones.", "PortsRemoved": "Se quitaron los siguientes {count} puertos:", - "PortsUpdated": "\nSe actualizaron los siguientes {count} puertos:", + "PortsUpdated": "Se actualizaron los siguientes {count} puertos:", "PrebuiltPackages": "Hay paquetes que no se han compilado. Para compilarlos, ejecute:", "PreviousIntegrationFileRemains": "No se quitó el archivo de integración anterior.", "ProgramReturnedNonzeroExitCode": "Error de {tool_name} con código de salida: ({exit_code})", "ProvideExportType": "Se requiere al menos una de las siguientes opciones: --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "Error al insertar {vendor} en \"{path}\". Use --debug para obtener más información.", - "RegeneratesArtifactRegistry": "Regenera un registro de artefactos.", + "RegeneratesArtifactRegistry": "Regenera un registro de artefactos", "RegistryCreated": "El registro se creó correctamente en {path}", "RegistryValueWrongType": "El valor del registro {path} fue un tipo inesperado.", "RemoveDependencies": "Para quitar dependencias en modo de manifiesto, edite el manifiesto (vcpkg.json) y ejecute 'install'.", "RemovePackageConflict": "{spec} no está instalado, pero {package_name} está instalado para {triplet}. ¿Quiso decir {package_name}:{triplet}?", "RemovingPackage": "Quitando {action_index}/{count} {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "Paquete restaurado desde \"{path}\"", - "RestoredPackagesFromVendor": "Se restauraron {count} paquetes de {value} en {elapsed}. Use --debug para ver más detalles.", + "RestoredPackagesFromAWS": "Se restauraron {count} paquetes de AWS en {elapsed}. Use --debug para ver más detalles.", + "RestoredPackagesFromCOS": "Se restauraron {count} paquetes de COS en {elapsed}. Use --debug para ver más detalles.", + "RestoredPackagesFromFiles": "Se restauraron {count} paquetes de {path} en {elapsed}. Use --debug para ver más detalles.", + "RestoredPackagesFromGCS": "Se restauraron {count} paquetes de GCS en {elapsed}. Use --debug para ver más detalles.", + "RestoredPackagesFromGHA": "Se restauraron {count} paquetes de la caché de Acciones de GitHub en {elapsed}. Use --debug para ver más detalles.", + "RestoredPackagesFromHTTP": "Se restauraron {count} paquetes de servidores HTTP en {elapsed}. Use --debug para ver más detalles.", + "RestoredPackagesFromNuGet": "Se restauraron {count} paquetes de NuGet en {elapsed}. Use --debug para ver más detalles.", "ResultsHeader": "RESULTADOS", "ScriptAssetCacheRequiresScript": "argumentos esperados: la configuración de recursos \"x-script\" requiere exactamente la plantilla exec como argumento", "SearchHelp": "El argumento debe ser substring que se va a buscar o ningún argumento para mostrar todas las bibliotecas.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "Omitiendo el borrado del contenido de {path} porque no era un directorio.", "SourceFieldPortNameMismatch": "El campo \"Source\" dentro del archivo CONTROL o \"name\" dentro del archivo vcpkg.json tiene el nombre {package_name} y no coincide con el directorio de puerto \"{path}\".", "SpecifiedFeatureTurnedOff": "La característica '{command_name}' está desactivada específicamente, pero se especificó --{option}.", - "SpecifyDirectoriesContaining": "Directorios de especificación que contienen archivos de trillizos.\n(también: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "Especifique los directorios que se usarán al buscar puertos.\n(también: '{env_var}')", - "SpecifyHostArch": "Especifique el triplete de la arquitectura de host. Vea \"vcpkg help triplet\".\n(predeterminado: '{env_var}')", - "SpecifyTargetArch": "Especifique el triplete de arquitectura de destino. Consulte \"vcpkg help triplet\".\n(valor predeterminado: '{env_var}')", + "SpecifyHostArch": "Triplete de host. Consulte \"vcpkg help triplet\" (valor predeterminado: {env_var})", + "SpecifyTargetArch": "Triplete de destino. Consulte \"vcpkg help triplet\" (valor predeterminado: {env_var})", "StartCodeUnitInContinue": "se encontró la unidad de código de inicio en la posición de continuación", "StoreOptionMissingSha": "La opción --store no es válida sin sha512", - "StoredBinariesToDestinations": "Archivos binarios almacenados en {count} destinos.", + "StoredBinariesToDestinations": "Archivos binarios almacenados en {count} destinos en {elapsed}.", "StoredBinaryCache": "Caché binaria almacenada: \"{path}\"", "SuccessfulyExported": "Se exportó {package_name} a {path}", "SuggestGitPull": "El resultado puede estar obsoleto. Ejecute `git pull` para obtener los resultados más recientes.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "Es posible que tenga que actualizar el binario vcpkg; intente ejecutar {command_line} para actualizar.", "SupportedPort": "Se admite el puerto {package_name}.", "SwitchUsedMultipleTimes": "el modificador '{option}' se especificó varias veces", + "SynopsisHeader": "Sinopsis:", "SystemApiErrorMessage": "error al llamar a {system_api} con {exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "Se esperaba que la variable de entorno SystemRoot siempre se estableciera en Windows.", "SystemTargetsInstallFailed": "no se pudo instalar el archivo de destinos del sistema en {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Coma al final de la matriz", "TrailingCommaInObj": "Coma final en un objeto", "TripletFileNotFound": "No se encontró el archivo de triplo {triplet}.cmake", + "TripletLabel": "Triplete:", "TwoFeatureFlagsSpecified": "Se especificaron '{value}' y -'{value}' como marcas de característica.", "UnableToClearPath": "no se puede eliminar {path}", "UnableToReadAppDatas": "%LOCALAPPDATA% y %APPDATA% eran ilegibles", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "registro \"{url}\" no actualizado: \"{value}\"", "UpdateBaselineRemoteGitError": "git no ha podido recuperar el repositorio remoto \"{url}\".", "UpdateBaselineUpdatedBaseline": "se actualizó el registro \"{url}\": línea base \"{old_value}\" -> \"{new_value}\"", - "UpgradeInManifest": "El comando de actualización no admite actualmente el modo de manifiesto. En su lugar, modifique su vcpkg.json y ejecute la instalación.", + "UpgradeInManifest": "La actualización actualiza una instalación en modo clásico y, por tanto, no es compatible con el modo manifiesto. Considere la posibilidad de actualizar las dependencias actualizando la línea base a un valor actual con vcpkg x-update-baseline y ejecutando la instalación de vcpkg.", "UpgradeRunWithNoDryRun": "Si está seguro de que desea recompilar los paquetes anteriores, ejecute este comando con la opción --no-dry-run.", "UploadedBinaries": "Archivos binarios cargados en {count} {vendor}.", "UploadedPackagesToVendor": "{count} paquetes cargados en {vendor} en {elapsed}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "comando no válido: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "El valor de la variable de entorno X_VCPKG_REGISTRIES_CACHE no es un directorio: {path}", "VcpkgRootRequired": "La configuración VCPKG_ROOT es necesaria para el arranque independiente.", - "VcpkgRootsDir": "Especifique el directorio raíz vcpkg.\n(predeterminado: '{env_var}')", + "VcpkgRootsDir": "El directorio raíz vcpkg (valor predeterminado: {env_var})", "VcpkgSendMetricsButDisabled": "se pasó --sendmetrics, pero las métricas están deshabilitadas.", + "VcpkgUsage": "uso: vcpkg [--switches] [--options=values] [arguments] @archivo_respuesta", "VcvarsRunFailed": "no se pudo ejecutar vcvarsall.bat para obtener un entorno de Visual Studio", "VcvarsRunFailedExitCode": "al intentar obtener un entorno de Visual Studio, vcvarsall.bat devolvió {exit_code}", "VersionBaselineMismatch": "La versión más reciente es {expected}, pero el archivo de línea base contiene {actual}.\nEjecute:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\npara actualizar la versión de línea base.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "Falta un archivo de base de datos de versión en {package_name} en {path}\nEjecute:\nvcpkg x-add-version {package_name}\npara crear el archivo de versiones.", "VersionGitEntryMissing": "no hay ninguna entrada de base de datos de versión para {package_name} en {version}.\nVersiones disponibles:", "VersionInDeclarationDoesNotMatch": "La versión declarada en el archivo no coincide con la versión restaurada: {version}", - "VersionIncomparable1": "conflicto de versión en {spec}: {package_name} requería {expected}, pero vcpkg no pudo compararlo con {actual}.\nLas dos versiones usaban esquemas incomparables:", - "VersionIncomparable2": "\"{version}\" era del esquema {new_scheme}", - "VersionIncomparable3": "Esto se puede resolver agregando una invalidación explícita a la versión preferida, por ejemplo:", - "VersionIncomparable4": "Consulte el \"control de versiones de ayuda de vcpkg\" para obtener más información.", + "VersionIncomparable1": "conflicto de versión en {spec}: {constraint_origin} requerido {expected}, que no se puede comparar con la versión de línea base {actual}.", + "VersionIncomparable2": "{version_spec} tiene el esquema {new_scheme}", + "VersionIncomparable3": "Esto se puede resolver agregando una invalidación explícita a la versión preferida. Por ejemplo:", + "VersionIncomparable4": "Consulte \"vcpkg help versioning\" o {url} para obtener más información.", + "VersionIncomparableSchemeString": "Ambas versiones tienen una cadena de esquema, pero texto principal diferente.", + "VersionIncomparableSchemes": "Las versiones tienen esquemas de error:", "VersionInvalidDate": "'{version}' no es una versión de fecha válida. Las fechas deben tener el formato AAAA-MM-DD y los desambiguadores deben ser valores enteros positivos separados por puntos sin ceros iniciales.", "VersionInvalidRelaxed": "'{version}' no es una versión relajada válida (semver con recuento de elementos numéricos arbitrarios).", "VersionInvalidSemver": "'{version}' no es una versión semántica válida, consulte .", "VersionMissing": "se esperaba un campo de control de versión (versión, fecha-versión, versión-servidor o versión-cadena)", - "VersionMissingRequiredFeature": "{spec}@{version} no tiene la característica {feature} necesaria", + "VersionMissingRequiredFeature": "{version_spec} no tiene la característica {feature} necesaria necesaria para {constraint_origin}", "VersionNotFound": "{expected} no está disponible, solo {actual} está disponible", - "VersionNotFoundDuringDiscovery": "no se encontró la versión durante la detección: {spec}@{version}\nEste es un error interno de vcpkg. Genere una incidencia en https://github.com/Microsoft/vcpkg con los pasos detallados para reproducir el problema.", - "VersionNotFoundInVersionsFile": "No se encontró la versión {version} en el archivo de versiones.\nEjecute:\nvcpkg x-add-version {package_name}\npara agregar la nueva versión del puerto.", + "VersionNotFoundInVersionsFile": "No se encontró la versión {versión} en el archivo de versiones de {package_name}.\n Ejecute:\nvcpkg x-add-versión {package_name}\npara agregar la nueva versión del puerto.", "VersionRejectedDueToBaselineMissing": "{path} se rechazó porque usa \"{json_field}\" y no tiene una \"línea base integrada\". Esto se puede corregir quitando los usos de \"{json_field}\" o agregando una \"línea base integrada\".\nConsulte `vcpkg help versioning` para obtener más información.", "VersionRejectedDueToFeatureFlagOff": "{path} se rechazó porque usa \"{json_field}\" y la marca de característica `versions` está deshabilitada. Esto se puede corregir quitando \"{json_field}\" o habilitando la marca de característica \"`versions`.\nConsulte `vcpkg help versioning` para obtener más información.", "VersionSchemeMismatch": "La base de datos de versión declara {version} como {expected}, pero {path} lo declara como {actual}. Las versiones deben ser únicas, incluso si se declaran con esquemas diferentes.\nEjecute:\nvcpkg x-add-version {package_name} --overwrite-version\npara sobrescribir el esquema declarado en la base de datos de la versión con el declarado en el puerto.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "\"#\" en el texto de la versión debe ir seguido de una versión de puerto (un número entero no negativo)", "VersionSpecMismatch": "No se pudo cargar el puerto porque las versiones no coinciden. El archivo \"{path}\" contiene la versión {actual_version}, pero la base de datos de versión indica que debe ser {expected_version}.", "VersionTableHeader": "Versión", - "VersionVerifiedOK": "Aceptar: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "De acuerdo: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "Esperando a que se cierren los procesos secundarios...", "WaitingToTakeFilesystemLock": "esperando para realizar el bloqueo del sistema de archivos en {path}...", "WarnOnParseConfig": "Se encontraron las siguientes advertencias en la configuración {path}:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "al validar la versión: {version}", "WindowsOnlyCommand": "Este comando solo admite Windows.", "WroteNuGetPkgConfInfo": "Se escribió la información de configuración del paquete NuGet en {path}", - "UnrecognizedCommand$": "Comando no reconocido '${p0}'", - "Use$ToGetHelp": "Usa ${p0} para obtener ayuda", - "FatalTheRootFolder$CanNotBeCreated": "Irrecuperable: no se puede crear la carpeta raíz “${p0}”", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Irrecuperable: no se puede crear el archivo de configuración global “${p0}”", + "FatalTheRootFolder$CannotBeCreated": "Irrecuperable: no se puede crear la carpeta raíz \"${p0}\"", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Irrecuperable: no se puede crear el archivo de configuración global \"${p0}\"", "VCPKGCOMMANDWasNotSet": "no se estableció VCPKG_COMMAND", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "La ejecución de vcpkg devolvió internamente un código de salida distinto de cero: ${p0}", "failedToDownloadFrom$": "no se pudo descargar desde ${p0}", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "la descripción debe ser de tipo \"string\"; se encontró \"${p0}\".", "optionsShouldBeASequenceFound$": "las opciones deben ser una secuencia, se encontró \"${p0}\"", "DuplicateKeysDetectedInManifest$": "Claves duplicadas detectadas en el manifiesto: \"${p0}\"", - "in$Skipping$BecauseItIsA$": "en ${p0} omitiendo ${p1} porque es un ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "no hay ningún archivo postscript: vuelva a ejecutar con la función shell vcpkg en lugar de con el ejecutable", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Definición duplicada ${p0} durante la activación. El nuevo valor reemplazará al antiguo.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "La herramienta duplicada declaró ${p0} durante la activación. El nuevo valor reemplazará al antiguo.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(progreso desconocido)", "verifying": "comprobando", "downloading$$": "descargando ${p0} -> ${p1}", - "unpacking": "desempaquetando", "unpacking$": "desempaquetando ${p0}", "Installing$": "Instalando ${p0}...", "$AlreadyInstalled": "${p0} ya se ha instalado.", "Downloading$": "Descargando ${p0}...", "Unpacking$": "Desempaquetando${p0}...", "ErrorInstalling$$": "Error al instalar ${p0} - ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "Se esperaba un único valor para ${p0}, se encontraron varios", - "Synopsis": "Sinopsis", - "Description": "Descripción", - "Switches": "Conmutadores", - "SeeAlso": "Consulta también", "error": "error:", "warning": "advertencia:", + "ExpectedASingleValueFor$FoundMultiple": "Se esperaba un único valor para ${p0}, se encontraron varios", "ExpectedASingleValueFor$": "Se esperaba un único valor para “--${p0}”.", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Se supone que “${p0}” es correcto; proporcione un hash en los metadatos del artefacto para suprimir este mensaje.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "El archivo descargado “${p0}” no tenía el hash correcto (${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "Se encontró un ${p0} no coincidente en “${p1}”. Para un ${p2} literal, use ${p3}${p4} en su lugar.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "No se pudo encontrar un valor para {${p0}} en \"${p1}\". Para escribir el valor literal, use \"{{${p2}}}\" en su lugar.", "MatchedMoreThanOneInstallBlock$": "Coincidencia con más de un bloque de instalación [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Adquiere todo lo referenciado por un proyecto, sin activarlo", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "Esto permite al consumidor descargar previamente las herramientas necesarias para un proyecto.", "UnableToFindProjectInFolderorParentFoldersFor$": "No se encuentra el proyecto en la carpeta (o carpetas primarias) de ${p0}", "UnableToAcquireProject": "No se puede adquirir el proyecto", - "AcquireArtifactsInTheRegistry": "Adquirir artefactos en el registro", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "Esto permite al consumidor adquirir (descargar y desempaquetar) artefactos. Los artefactos deben activarse para usarse", "NoArtifactsSpecified": "No se especificó ningún artefacto.", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Se especificaron varios paquetes, pero no un número igual de conmutadores ${p0}", "NoArtifactsAreAcquired": "No se adquirió ningún artefacto", "AllArtifactsAreAlreadyInstalled": "Todos los artefactos ya están instalados", "$ArtifactsInstalledSuccessfully": "${p0} artefactos instalados correctamente", "InstallationFailedStopping": "Error de instalación: deteniendo", - "ActivatesTheToolsRequiredForAProject": "Activa las herramientas necesarias para un proyecto", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "Esto permite al consumidor activar las herramientas necesarias para un proyecto. Si las herramientas aún no están instaladas, esto obligará a que se descarguen e instalen antes de la activación.", - "AddsAnArtifactToTheProject": "Agrega un artefacto al proyecto", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "Esto permite al consumidor agregar un artefacto al proyecto. Esto también activará el proyecto.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Se especificaron varios artefactos, pero no un número igual de conmutadores ${p0}", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Se intentó agregar un artefacto [${p0}]:${p1}, pero no se pudo determinar el registro que se va a usar.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Se intentó agregar el registro ${p0} como ${p1}, pero ya era ${p2}. Agrega ${p3} a este proyecto manualmente e inténtalo de nuevo.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Ejecute \\`vcpkg activate\\` para aplicarlo al terminal actual", - "ManagesTheDownloadCache": "Administra la memoria caché de descarga", "DownloadsFolderCleared$": "Carpeta de descargas borrada (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "limpia todo (caché, artefactos instalados)", - "cleansOutTheDownloadsCache": "limpia la caché de descargas", - "removesAllTheArtifactsThatAreInstalled": "quita todos los artefactos que están instalados.", - "cleansUp": "limpia", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Permite al usuario limpiar la memoria caché, los artefactos instalados, etc.", "InstalledArtifactFolderCleared$": "Carpeta de artefactos instalada borrada (${p0}) ", "CacheFolderCleared$": "Carpeta de caché borrada (${p0}) ", - "DeactivatesTheCurrentSession": "Desactiva la sesión actual", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "Esto permite al consumidor quitar la configuración del entorno de la sesión activa actualmente.", - "DeletesAnArtifactFromTheArtifactFolder": "Elimina un artefacto de la carpeta de artefactos", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "Esto permite al consumidor quitar un artefacto del disco.", "DeletingArtifact$From$": "Eliminando el artefacto ${p0} de ${p1}", - "FindArtifactsInTheRegistry": "Buscar artefactos en el registro", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "Esto permite al usuario buscar artefactos en función de algunos criterios.", "NoArtifactsFoundMatchingCriteria$": "No se encontraron artefactos que coincidan con los criterios: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Genera propiedades de MSBuild para una activación sin ninguna descarga para un proyecto", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props requiere --msbuild-props", "UnableToActivateProject": "No se puede activar el proyecto", - "theNameOfTheCommandForWhichYouWantHelp": "el nombre del comando para el que quires obtener ayuda", - "getHelpOn$OrOneOfTheCommands": "obtener ayuda sobre ${p0} o uno de los comandos", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Obtiene ayuda detallada sobre ${p0} o uno de los comandos", - "Arguments": "Argumentos:", - "Use$ToGetTheListOfAvailableCommands": "Usa ${p0} para obtener la lista de comandos disponibles", - "Usage": "Uso", - "$COMMANDargumentsswitches": "${p0} COMANDO [--switches]", - "Available$Commands": "Comandos de ${p0} disponibles:", - "ListsTheArtifacts": "Enumera los artefactos", - "ThisAllowsTheConsumerToListArtifacts": "Esto permite al consumidor enumerar los artefactos.", - "regenerateTheIndexForARegistry": "regenerar el índice de un registro", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "Esto permite al usuario regenerar los archivos ${p0} para un registro ${p1}.", "RegeneratingIndexFor$": "Regenerando índice para ${p0}", "RegenerationCompleteIndexContains$MetadataFiles": "Regeneración completada. El índice contiene ${p0} archivos de metadatos", "Registry$ContainsNoArtifacts": "Registro: \"${p0}\" no contiene artefactos.", "error$": "error ${p0}: ", - "RemovesAnArtifactFromAProject": "Quita un artefacto de un proyecto", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "Esto permite al consumidor quitar un artefacto del proyecto. Fuerza la reactivación en esta ventana.", "Removing$FromProjectManifest": "Quitando ${p0} del manifiesto del proyecto", "unableToFindArtifact$InTheProjectManifest": "no se puede encontrar el artefacto ${p0} en el manifiesto del proyecto", - "updateTheRegistryFromTheRemote": "actualizar el registro desde el remoto", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Esto descarga el contenido más reciente del registro desde el servicio remoto.", - "DownloadingRegistryData": "Descargando datos del registro", - "Updated$RegistryContains$MetadataFiles": "Se actualizó ${p0}. El registro contiene ${p1} archivos de metadatos", - "UnableToDownloadRegistrySnapshot": "No se puede descargar la instantánea del registro", - "UnableToFindRegistry$": "No se pudo encontrar el registro ${p0}", - "ArtifactRegistryDataIsNotLoaded": "Los datos del registro de artefactos no están cargados", - "AttemptingToUpdateArtifactRegistry": "Intentando actualizar el registro de artefactos", - "UnableToLoadRegistryIndex": "No se puede cargar el índice del registro", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Activa al instante un artefacto fuera del proyecto", - "ThisWillInstantlyActivateAnArtifact": "Esto activará al instante un artefacto.", + "Updated$ItContains$MetadataFiles": "Se actualizó ${p0}. Contiene ${p1} archivos de metadatos.", + "UnableToDownload$": "No se puede descargar ${p0}.", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} no se pudo actualizar; podría tener un formato incorrecto.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "El comando x-update-registry descarga nueva información del Registro y, por tanto, no se puede usar con registros locales. ¿Querías decir x-regenerar ${p0}?", + "UnableToFindRegistry$": "No se encuentra el registro ${p0}.", "NoArtifactsAreBeingAcquired": "No se está adquiriendo ningún artefacto", - "removesAllFilesInTheLocalCache": "quita todos los archivos de la memoria caché local", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "habilita el modo de depuración, muestra los errores internos sobre cómo funciona ${p0}", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "continúa con la acción (potencialmente peligrosa) sin confirmación", - "showsTheinstalledArtifacts": "muestra los artefactos _installed_", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Volcar variables de entorno y otras propiedades en un archivo JSON con la ruta de acceso proporcionada por el usuario.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Ruta de acceso completa al archivo en el que se escribirán las propiedades de MSBuild.", - "ApplyAnyDeprecationFixups": "Aplique cualquier corrección de desuso.", - "overrideThePathToTheProjectFolder": "invalidar la ruta de acceso a la carpeta del proyecto", - "UnableToFindProjectEnvironment$": "No se encuentra el entorno del proyecto ${p0}", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "habilita el modo detallado, muestra los mensajes detallados sobre el proceso", - "aVersionOrVersionRangeToMatch": "una versión o un intervalo de versiones que coincidan" + "UnableToFindProjectEnvironment$": "No se encuentra el entorno del proyecto ${p0}" } diff --git a/locales/messages.fr.json b/locales/messages.fr.json index 264aae10cf..8fb813d2ec 100644 --- a/locales/messages.fr.json +++ b/locales/messages.fr.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "registre intégré", "AConfigurationObject": "objet de configuration", "ADateVersionString": "chaîne de version de date", + "ADefaultFeature": "une fonctionnalité par défaut", "ADemandObject": "objet de demande", "ADependency": "dépendance", + "ADependencyFeature": "une fonctionnalité d’une dépendance", "ADictionaryOfContacts": "dictionnaire de contacts", "AFeature": "fonctionnalité", + "AFeatureName": "un nom de fonctionnalité", "AFilesystemRegistry": "registre de système de fichiers", "AGitObjectSha": "objet Git SHA", "AGitReference": "référence Git (par exemple, une branche)", @@ -37,19 +40,19 @@ "AStringStringDictionary": "une « chaîne » : dictionnaire « chaîne »", "AUrl": "URL", "AVcpkgRepositoryCommit": "validation de référentiel vcpkg", - "AVersionConstraint": "contrainte de version", + "AVersionConstraint": "une contrainte de version", "AVersionDatabaseEntry": "entrée de base de données de version", "AVersionObject": "objet de version", "AVersionOfAnyType": "version de n’importe quel type", "AddArtifactOnlyOne": "'{command_line}' ne pouvez ajouter qu’un seul artefact à la fois.", "AddCommandFirstArg": "Le premier paramètre à ajouter doit être « artifact » ou « port ».", "AddFirstArgument": "Le premier argument de '{command_line}' doit être 'artifact' ou 'port'.", - "AddHelp": "Ajoute le port ou l’artefact indiqué au manifeste associé au répertoire actif.", "AddPortRequiresManifest": "'{command_line}' requiert un fichier manifeste actif.", "AddPortSucceeded": "L’ajout de ports au fichier vcpkg.json a réussi.", "AddRecurseOption": "Si vous êtes sûr de vouloir les supprimer, exécutez la commande avec l’option --recurse.", "AddTripletExpressionNotAllowed": "Les expressions triplet ne sont pas autorisées ici. Vous pouvez remplacer '{package_name}:{triplet}' par '{package_name}'.", "AddVersionAddedVersionToFile": "version ajoutée {version} à {path}", + "AddVersionArtifactsOnly": "--cette version est composée uniquement d’artefacts et ne peut pas être utilisée avec le port d’ajout vcpkg", "AddVersionCommitChangesReminder": "Avez-vous pensé à valider vos modifications ?", "AddVersionCommitResultReminder": "N'oubliez pas de valider le résultat !", "AddVersionDetectLocalChangesError": "détection des modifications locales ignorée en raison d’un format inattendu dans la sortie d’état git", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "Les fichiers archivés pour {package_name} ont changé mais la version n'a pas été mise à jour.", "AddVersionPortFilesShaUnchanged": "Les fichiers archivés pour {package_name} sont inchangés par rapport à la version {version}.", "AddVersionPortHasImproperFormat": "{package_name} n'a pas un format correct.", - "AddVersionSuggestNewVersionScheme": "Utilisez le schéma de version \"{new_scheme}\" au lieu de \"{old_scheme}\" dans le port \"{package_name}\". \nUtilisez --{option} pour désactiver cette vérification.", + "AddVersionSuggestNewVersionScheme": "Utilisez le schéma de version « {new_scheme} » plutôt que « {old_scheme} » dans le port « {package_name} ».\nUtilisez --{option} pour désactiver cette vérification.", "AddVersionUnableToParseVersionsFile": "Impossible d'analyser les versions du fichier {path}", "AddVersionUncommittedChanges": "il y a des changements non engagés pour {package_name}.", "AddVersionUpdateVersionReminder": "Avez-vous pensé à mettre à jour la version ou la version du port ?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} est déjà installé", "AlreadyInstalledNotHead": "{spec} est déjà installé - ne pas générer à partir de HEAD", "AmbiguousConfigDeleteConfigFile": "Configuration vcpkg ambiguë fournie par le fichier manifeste et le fichier de configuration.\n-- Supprimez le fichier de configuration {path}", + "AnArrayOfDefaultFeatures": "un tableau de fonctionnalités par défaut", "AnArrayOfDependencies": "tableau de dépendances", "AnArrayOfDependencyOverrides": "tableau de remplacements de dépendances", + "AnArrayOfFeatures": "un tableau de fonctionnalités", "AnArrayOfIdentifers": "tableau d’identificateurs", "AnArrayOfOverlayPaths": "tableau de chemins de superposition", "AnArrayOfOverlayTripletsPaths": "tableau de chemins de triplets superposés", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "Une autre installation est en cours sur l’ordinateur, en veille 6 s avant de réessayer.", "AppliedUserIntegration": "Intégration à l’échelle de l’utilisateur appliquée pour cette racine vcpkg.", "ApplocalProcessing": "Traitement applocal vcpkg : {path}", + "ArtifactsBootstrapFailed": "vcpkg-artifacts n’est pas installé et n’a pas pu être lancé.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts n’est pas installé et ne peut pas être installé, car VCPKG_ROOT est supposé être en lecture seule. La réinstallation de vcpkg à l’aide du « one-pack » peut résoudre ce problème.", + "ArtifactsNotOfficialWarning": "Utilisation de vcpkg-artifacts avec une instruction ", "ArtifactsOptionIncompatibility": "--{option} n’a aucun effet sur la recherche d’artefact.", + "ArtifactsOptionJson": "Chemin d’accès complet au fichier JSON où les variables d’environnement et d’autres propriétés sont enregistrées", + "ArtifactsOptionMSBuildProps": "Chemin d’accès complet au fichier, dans lequel les propriétés MSBuild seront écrites", + "ArtifactsOptionVersion": "Une version ou une plage de versions à mettre en correspondance. Valide uniquement pour les artefacts", + "ArtifactsOptionVersionMismatch": "Le nombre de --commutateurs de version doit correspondre au nombre d’artefacts nommés", + "ArtifactsSwitchARM": "Force la détection de l’hôte à ARM lors de l’acquisition d’artefacts", + "ArtifactsSwitchARM64": "Force la détection de l’hôte à ARM64 lors de l’acquisition d’artefacts", + "ArtifactsSwitchAll": "Met à jour tous les registres d’artefacts connus", + "ArtifactsSwitchAllLanguages": "Acquiert tous les fichiers de langage lors de l’acquisition d’artefacts", + "ArtifactsSwitchForce": "Force la réacquire si un artefact est déjà acquis", + "ArtifactsSwitchFreebsd": "Force la détection de l’hôte à FreeBSD lors de l’acquisition d’artefacts", + "ArtifactsSwitchLinux": "Force la détection de l’hôte sur Linux lors de l’acquisition d’artefacts", + "ArtifactsSwitchNormalize": "Applique toutes les corrections de dépréciation", + "ArtifactsSwitchOnlyOneHostPlatform": "Il n’est possible de définir qu’une seule plateforme hôte (--x64, --x86, --arm, --arm64).", + "ArtifactsSwitchOnlyOneOperatingSystem": "Il n’est possible de définir qu’un seul système d’exploitation (--windows, --osx, --linux, --freebsd).", + "ArtifactsSwitchOnlyOneTargetPlatform": "Il n’est possible de définir qu’une seule plateforme cible (--target:x64, --target:x86, --target:arm, --target:arm64).", + "ArtifactsSwitchOsx": "Force la détection de l’hôte sur MacOS lors de l’acquisition d’artefacts", + "ArtifactsSwitchTargetARM": "Définit la détection cible sur ARM lors de l’acquisition d’artefacts", + "ArtifactsSwitchTargetARM64": "Définit la détection cible sur ARM64 lors de l’acquisition d’artefacts", + "ArtifactsSwitchTargetX64": "Définit la détection cible sur x64 lors de l’acquisition d’artefacts", + "ArtifactsSwitchTargetX86": "Définit la cible sur x86 lors de l’acquisition d’artefacts", + "ArtifactsSwitchWindows": "Force la détection de l’hôte à Windows lors de l’acquisition d’artefacts", + "ArtifactsSwitchX64": "Force la détection de l’hôte à x64 lors de l’acquisition d’artefacts", + "ArtifactsSwitchX86": "Force la détection de l’hôte à x86 lors de l’acquisition d’artefacts", "AssetCacheProviderAcceptsNoArguments": "arguments inattendus : ’{value}’ n’accepte pas les arguments", - "AssetSourcesArg": "Ajoutez des sources pour la mise en cache des ressources. Consultez « vcpkg help assetcaching ».", + "AssetSourcesArg": "Sources de mise en cache des ressources. Voir « mise en cache des ressources d’aide vcpkg »", "AttemptingToFetchPackagesFromVendor": "Tentative de récupération du ou des packages {count} à partir de {vendor}", "AttemptingToSetBuiltInBaseline": "tentative de définition d’une ligne de base intégrée dans vcpkg.json lors du remplacement du default-registry dans vcpkg-configuration.json.\nLe default-registry de vcpkg-configuration.json sera utilisé.", "AuthenticationMayRequireManualAction": "Un ou plusieurs fournisseurs d’informations d’identification {vendor} ont demandé une action manuelle. Ajoutez la source binaire « interactive » pour autoriser l’interactivité.", "AutoSettingEnvVar": "-- Définir automatiquement les variables d’environnement {env_var} sur « {url} ».", "AutomaticLinkingForMSBuildProjects": "Tous les projets MSBuild C++ peuvent désormais #include toutes les bibliothèques installées. La liaison sera gérée automatiquement. L’installation de nouvelles bibliothèques les rendra instantanément disponibles.", - "AvailableArchitectureTriplets": "Triplets d’architecture disponibles :", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 et les versions ultérieures peuvent désormais #inclure toutes les bibliothèques installées. La liaison est gérée automatiquement. L’installation de nouvelles bibliothèques les rend instantanément disponibles.", "AvailableHelpTopics": "Rubriques d’aide disponibles :", "AzUrlAssetCacheRequiresBaseUrl": "arguments inattendus : la configuration de la ressource ’azurl’ nécessite une URL de base", "AzUrlAssetCacheRequiresLessThanFour": "arguments inattendus : la configuration de la ressource 'azurl' requiert moins de 4 arguments", "BaselineConflict": "La spécification de vcpkg-configuration.default-registry dans un fichier manifeste est en conflit avec la ligne de base intégrée.\nSupprimez l’un de ces paramètres en conflit.", "BaselineFileNoDefaultField": "Le fichier de base de référence à la validation {commit_sha} n’était pas valide (aucun champ « par défaut »).", - "BaselineFileNoDefaultFieldPath": "fichier de base de référence à {path} n’était pas valide (aucun champ « par défaut »)", "BaselineGitShowFailed": "lors de l’extraction de la ligne de base à partir de la ’{commit_sha}’ de validation, échec de ’git show’ versions/baseline.json. Pour résoudre ce problème, récupérez les validations avec ’git fetch’.", "BaselineMissing": "Version de référence introuvable. Run:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m « Update version database »\n pour définir {version} comme version de base de référence.", - "BaselineMissingDefault": "Le fichier baseline.json de la validation « {commit_sha} » dans le dépôt {url} n’était pas valide (ne contenait pas de champ « default »).", - "BinarySourcesArg": "Ajoutez des sources pour la mise en cache binaire. Consultez « vcpkg help binarycaching ».", + "BinaryCacheVendorHTTP": "Serveurs HTTP", + "BinarySourcesArg": "Sources de mise en cache binaire. Voir « vcpkg help binarycaching »", "BinaryWithInvalidArchitecture": "{path}\n Attendu : {expected}, mais était {actual}", "BuildAlreadyInstalled": "{spec} est déjà installé ; supprimez {spec} avant de tenter de le générer.", "BuildDependenciesMissing": "La commande build nécessite que toutes les dépendances soient déjà installées.\nLes dépendances suivantes sont manquantes :", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "OPÉRATION RÉUSSIE", "BuildResultSummaryHeader": "RÉSUMÉ DE {triplet}", "BuildResultSummaryLine": "{build_result} : {count}", - "BuildTreesRootDir": "(Expérimental) Spécifiez le répertoire racine buildtrees.", + "BuildTreesRootDir": "Répertoire Buildtrees (expérimental)", "BuildTroubleshootingMessage1": "Vérifiez que vous utilisez les derniers fichiers de port avec 'git pull' et 'vcpkg update'.\nRechercher ensuite les problèmes connus sur :", "BuildTroubleshootingMessage2": "Vous pouvez soumettre un nouveau problème à l’adresse :", "BuildTroubleshootingMessage3": "Incluez « [{package_name}] Erreur de build » dans le titre de votre rapport de bogues, les informations de version suivantes dans votre description de bogue et joignez les journaux des échecs pertinents ci-dessus.", "BuildTroubleshootingMessage4": "Utilisez le modèle prérempli de {path} lors du signalement de votre problème.", - "BuildTroubleshootingMessageGH": "Vous pouvez également soumettre un problème en exécutant (GitHub cli doit être installé) :", + "BuildTroubleshootingMessageGH": "Vous pouvez également soumettre un problème en exécutant (l’interface de ligne de commande GitHub doit être installée) :", "BuildingFromHead": "Génération de {spec} à partir de HEAD...", "BuildingPackage": "Génération de {spec}...", "BuildingPackageFailed": "échec de la génération de {spec} avec : {build_result}", "BuildingPackageFailedDueToMissingDeps": "en raison des dépendances manquantes suivantes :", - "BuiltInTriplets": "Triplets intégrés vcpkg :", + "BuiltInTriplets": "Triplets intégrés :", "BuiltWithIncorrectArchitecture": "Les fichiers suivants ont été générés pour une architecture incorrecte :", "CISettingsExclude": "Liste de ports séparés par des virgules à ignorer", "CISettingsOptCIBase": "Chemin du fichier ci.baseline.txt. Utilisé pour ignorer les ports et détecter les régressions.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "Fichier permettant de générer tous les hachages de package déterminés", "CISettingsOptParentHashes": "Fichier permettant de lire les hachages de package d’un état CI parent, afin de réduire l’ensemble des packages modifiés", "CISettingsOptSkippedCascadeCount": "Déclare que le nombre de --exclude et le nombre de fois où le support a été ignoré correspond exactement à ce nombre", - "CISettingsOptXUnit": "Fichier pour générer des résultats au format XUnit (interne)", - "CISettingsVerifyGitTree": "Vérifier que chaque objet d’arborescence Git correspond à sa version déclarée (ce qui est très lent)", - "CISettingsVerifyVersion": "Imprimer le résultat pour chaque port au lieu de seulement les erreurs.", - "CISwitchOptAllowUnexpectedPassing": "Indique que les résultats « Passage, suppression de la liste d’échecs » ne doivent pas être émis.", - "CISwitchOptDryRun": "Imprimer le plan sans exécution", - "CISwitchOptRandomize": "Rendre aléatoire l’ordre d’installation", - "CISwitchOptSkipFailures": "Indique que les ports marqués « =fail » dans ci.baseline.txt doivent être ignorés.", - "CISwitchOptXUnitAll": "Signaler également les ports inchangés à la sortie XUnit (interne)", + "CISettingsOptXUnit": "Fichier pour générer des résultats au format XUnit", + "CISettingsVerifyGitTree": "Vérifie que chaque objet d’arborescence Git correspond à sa version déclarée (c’est très lent)", + "CISettingsVerifyVersion": "Imprime le résultat pour chaque port au lieu de seulement des erreurs", + "CISkipInstallation": "Les packages suivants sont déjà installés et ne seront plus générés :", + "CISwitchOptAllowUnexpectedPassing": "Supprime les résultats « Passage, suppression de la liste d’échecs »", + "CISwitchOptDryRun": "Imprime le plan sans exécution", + "CISwitchOptRandomize": "Rend aléatoire l’ordre d’installation", + "CISwitchOptSkipFailures": "Ignore les ports marqués '=fail' dans ci.baseline.txt", + "CISwitchOptXUnitAll": "Signale les ports inchangés dans la sortie XUnit", "CMakeTargetsUsage": "{package_name} fournit des cibles CMake :", "CMakeTargetsUsageHeuristicMessage": "# ceci est généré de manière heuristique et peut ne pas être correct", "CMakeToolChainFile": "Les projets CMake doivent utiliser : « -DCMAKE_TOOLCHAIN_FILE={path} »", "CMakeUsingExportedLibs": "Pour utiliser des bibliothèques exportées dans des projets CMake, ajoutez {value} à votre ligne de commande CMake.", - "CacheHelp": "L’argument doit être une substring à rechercher ou aucun argument pour afficher toutes les bibliothèques mises en cache.", "CheckedOutGitSha": "Extraction de Git SHA : {commit_sha}", "CheckedOutObjectMissingManifest": "L’objet extrait ne contient pas de fichier CONTROL ou de fichier vcpkg.json.", "ChecksFailedCheck": "vcpkg s’est bloqué; aucun détail supplémentaire n’est disponible.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "la mise à jour de vcpkg en réexécutant bootstrap-vcpkg peut résoudre cet échec.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing ne peut être utilisé que si une ligne de base est fournie via --ci-baseline.", "CiBaselineDisallowedCascade": "RÉGRESSION : {spec} en cascade, mais il est nécessaire de passer. ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "RÉGRESSION : échec de la {spec} indépendante avec {build_result}.", "CiBaselineRegression": "RÉGRESSION : {spec} a échoué avec {build_result}. Si prévu, ajoutez {spec}=échec de la {path}.", "CiBaselineRegressionHeader": "RÉGRESSIONS :", + "CiBaselineUnexpectedFail": "RÉGRESSION : {spec} est marqué comme échec mais n’est pas pris en charge pour {triplet}.", + "CiBaselineUnexpectedFailCascade": "REGRESSION : {spec} est marqué comme échec, mais une dépendance n’est pas prise en charge pour {triplet}.", "CiBaselineUnexpectedPass": "RÉUSSITE, SUPPRESSION DE LA LISTE D’ÉCHEC : {spec} ({path}).", "ClearingContents": "Effacement du contenu de {path}", "CmakeTargetsExcluded": "remarque : {count} cibles supplémentaires ne sont pas affichées.", - "CmdAddVersionOptAll": "Traiter les versions pour tous les ports.", - "CmdAddVersionOptOverwriteVersion": "Remplacer git-tree d’une version existante.", - "CmdAddVersionOptSkipFormatChk": "Ignore la vérification de la mise en forme des fichiers vcpkg.json.", - "CmdAddVersionOptSkipVersionFormatChk": "Ignore la vérification du format de version.", - "CmdAddVersionOptVerbose": "Imprimer les messages de réussite au lieu de seulement les erreurs.", + "CmdAcquireExample1": "vcpkg acquire ", + "CmdAcquireProjectSynopsis": "Acquiert tous les artefacts référencés par un manifeste", + "CmdAcquireSynopsis": "Acquiert l’artefact nommé", + "CmdActivateSynopsis": "Active les artefacts à partir d’un manifeste", + "CmdAddExample1": "vcpkg add port ", + "CmdAddExample2": "vcpkg add artifact ", + "CmdAddSynopsis": "Ajoute une dépendance au manifeste", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "Traite les versions pour tous les ports", + "CmdAddVersionOptOverwriteVersion": "Remplace git-tree d’une version existante", + "CmdAddVersionOptSkipFormatChk": "Ignore la vérification de la mise en forme des fichiers vcpkg.json", + "CmdAddVersionOptSkipVersionFormatChk": "Ignore la vérification du format de version", + "CmdAddVersionOptVerbose": "Imprime les messages de réussite plutôt que uniquement les erreurs", + "CmdAddVersionSynopsis": "Ajoute une version à la base de données de versions", + "CmdBootstrapStandaloneSynopsis": "Démarre une racine vcpkg à partir uniquement d’un fichier binaire vcpkg", + "CmdBuildExample1": "vcpkg build ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "Génère le port à partir d’un chemin d’accès", + "CmdBuildSynopsis": "Génère un port", + "CmdCacheExample1": "vcpkg cache ", + "CmdCacheSynopsis": "Répertorier les spécifications des packages", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "Teste si un port est pris en charge sans le générer", + "CmdCiCleanSynopsis": "Efface tous les fichiers à préparer pour une exécution d’élément de configuration", + "CmdCiSynopsis": "Tente de générer tous les ports pour les tests d’intégration continue", + "CmdCiVerifyVersionsSynopsis": "Vérifie l’intégrité de la base de données de versions", "CmdContactOptSurvey": "Lancer le navigateur par défaut vers l’enquête vcpkg actuelle", - "CmdDependInfoOptDGML": "Crée un graphique sur la base de dgml", - "CmdDependInfoOptDepth": "Afficher la profondeur de récursivité dans la sortie", - "CmdDependInfoOptDot": "Crée un graphique sur la base d’un point", - "CmdDependInfoOptMaxRecurse": "Définir la profondeur de récursivité maximale, une valeur de -1 indique aucune limite", - "CmdDependInfoOptSort": "Définir l’ordre de tri de la liste des dépendances. Les valeurs acceptées sont : lexicographique, topologique (par défaut), x-tree, inverse", - "CmdEditOptAll": "Ouvrir l’éditeur dans le port, ainsi que dans le sous-dossier d’arborescence propre au port", - "CmdEditOptBuildTrees": "Ouvrir l’éditeur dans le sous-dossier d’arborescence spécifique au port", - "CmdEnvOptions": "Ajouter le {path} installé à {env_var}", - "CmdExportOpt7Zip": "Exporter vers un fichier 7zip (.7z)", - "CmdExportOptChocolatey": "Exporter un package Chocolatey (fonctionnalité expérimentale)", - "CmdExportOptDebug": "Activer le débogage Prefab", - "CmdExportOptDryRun": "Ne pas exporter.", - "CmdExportOptIFW": "Exporter vers un programme d’installation basé sur IFW", - "CmdExportOptInstalled": "Exporter tous les packages installés", - "CmdExportOptMaven": "Activer Maven", - "CmdExportOptNuget": "Exporter un package NuGet", - "CmdExportOptPrefab": "Exporter au format Prefab", - "CmdExportOptRaw": "Exporter vers un répertoire non compressé", - "CmdExportOptZip": "Exporter vers un fichier zip", - "CmdExportSettingChocolateyMaint": "Spécifier le chargé de maintenance du package Chocolatey exporté (fonctionnalité expérimentale)", - "CmdExportSettingChocolateyVersion": "Spécifier le suffixe de version à ajouter au package Chocolatey exporté (fonctionnalité expérimentale)", - "CmdExportSettingConfigFile": "Spécifier le chemin d’accès de fichier temporaire pour la configuration du programme d’installation", - "CmdExportSettingInstallerPath": "Spécifier le chemin d’accès au fichier pour le programme d’installation exporté", - "CmdExportSettingNugetDesc": "Spécifier une description du package NuGet exporté", - "CmdExportSettingNugetID": "Spécifier l’ID du package NuGet exporté (remplace --output)", - "CmdExportSettingNugetVersion": "Spécifier la version du package NuGet exporté", - "CmdExportSettingOutput": "Spécifier le nom de sortie (utilisé pour construire le nom de fichier)", - "CmdExportSettingOutputDir": "Spécifier le répertoire de sortie des artefacts produits", - "CmdExportSettingPkgDir": "Spécifier le chemin d’accès de répertoire temporaire de packages réempaquetés", + "CmdCreateExample1": "vcpkg create ", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create ", + "CmdDeactivateSynopsis": "Supprime toutes les activations d’artefacts de l’interpréteur de commandes actuel", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "Formats en conflit spécifiés. Un seul --format, --dgml ou --dot est accepté.", + "CmdDependInfoFormatHelp": "Choisit le format de sortie, l’un des « list », « tree », « url », « dot » ou « dgml »", + "CmdDependInfoFormatInvalid": "--format={value} n’est pas un format reconnu. --format doit être l’un des 'list', 'tree', 'url', 'dot' ou 'dgml'.", + "CmdDependInfoOptDepth": "Affiche la profondeur de récursivité dans la sortie « list »", + "CmdDependInfoOptMaxRecurse": "Définit la profondeur de récursivité maximale. La valeur par défaut n’est pas une limite", + "CmdDependInfoOptSort": "Choisit l’ordre de tri pour le format ' list ', l’un de 'lexicographical', 'topologique' (par défaut), 'reverse'", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth peut uniquement être utilisé avec les formats « list » et « tree ».", + "CmdDependInfoXtreeTree": "--sort=x-tree ne peut pas être utilisé avec des formats autres que l’arborescence", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Télécharge un fichier", + "CmdEditExample1": "vcpkg edit ", + "CmdEditOptAll": "Ouvre l’éditeur dans le port, ainsi que dans le sous-dossier buildtree propre au port", + "CmdEditOptBuildTrees": "Ouvre l’éditeur dans le sous-dossier buildtree spécifique au port", + "CmdEnvOptions": "Ajoute {path} installé à {env_var}", + "CmdExportEmptyPlan": "Refus de la création d’une exportation sans aucun package. Installez des packages avant l’exportation.", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", + "CmdExportOpt7Zip": "Exporte vers un fichier 7zip (.7z)", + "CmdExportOptChocolatey": "Exporte un package Chocolatey (expérimental)", + "CmdExportOptDebug": "Active le débogage de pré-détection", + "CmdExportOptDryRun": "N’exporte pas réellement", + "CmdExportOptIFW": "Exporte vers un programme d’installation basé sur IFW", + "CmdExportOptInstalled": "Exporte tous les packages installés", + "CmdExportOptMaven": "Active Maven", + "CmdExportOptNuget": "Exporte un package NuGet", + "CmdExportOptPrefab": "Exportations au format préfabriqué", + "CmdExportOptRaw": "Exporte vers un répertoire non compressé", + "CmdExportOptZip": "Exporte vers un fichier zip", + "CmdExportSettingChocolateyMaint": "Chargé de maintenance du package Chocolatey exporté (expérimental)", + "CmdExportSettingChocolateyVersion": "Suffixe de version à ajouter pour le package Chocolatey exporté (expérimental)", + "CmdExportSettingConfigFile": "Chemin d’accès de fichier temporaire pour la configuration du programme d’installation", + "CmdExportSettingInstallerPath": "Chemin d’accès du programme d’installation exporté", + "CmdExportSettingNugetDesc": "Description du package NuGet exporté", + "CmdExportSettingNugetID": "ID du package NuGet exporté (remplacements --output)", + "CmdExportSettingNugetVersion": "Version du package NuGet exporté", + "CmdExportSettingOutput": "Nom de sortie (utilisé pour construire le nom de fichier)", + "CmdExportSettingOutputDir": "Répertoire de sortie pour les artefacts produits", + "CmdExportSettingPkgDir": "Chemin d’accès de répertoire temporaire pour les packages repackés", "CmdExportSettingPrefabArtifactID": "L’ID d’artefact est le nom du projet en fonction des spécifications Maven", "CmdExportSettingPrefabGroupID": "GroupId identifie de façon unique votre projet en fonction des spécifications Maven", "CmdExportSettingPrefabVersion": "La version est le nom du projet en fonction des spécifications Maven", - "CmdExportSettingRepoDir": "Spécifier le chemin d’accès au répertoire du référentiel exporté", - "CmdExportSettingRepoURL": "Spécifier l’URL du référentiel distant pour le programme d’installation en ligne", - "CmdExportSettingSDKMinVersion": "Version minimale du kit de développement logiciel (SDK) Android prise en charge", - "CmdExportSettingSDKTargetVersion": "Version du kit de développement logiciel (SDK) cible Android", - "CmdFetchOptXStderrStatus": "État direct/téléchargement des messages vers stderr plutôt que stdout. (Les erreurs/échecs passent toujours à stdout)", - "CmdFormatManifestOptAll": "Mettre en forme les fichiers manifeste de tous les ports.", - "CmdFormatManifestOptConvertControl": "Convertir les fichiers CONTROL en fichiers manifeste.", - "CmdGenerateMessageMapOptNoOutputComments": "Lors de la génération de la carte de messages, exclure les commentaires (utiles pour générer le fichier de localisation anglais)", - "CmdInfoOptInstalled": "(expérimental) Créer un rapport sur les packages installés plutôt que sur les packages disponibles", - "CmdInfoOptTransitive": "(expérimental) Créer également un rapport sur les dépendances des packages installés", - "CmdNewOptApplication": "Créez un manifeste d’application (ne nécessite pas de nom ni de version).", - "CmdNewOptSingleFile": "Incorporer vcpkg-configuration.json dans vcpkg.json.", - "CmdNewOptVersionDate": "Interpréter --version comme une date ISO 8601. (AAAA-MM-JJ)", - "CmdNewOptVersionRelaxed": "Interpréter --version comme une version numérique souple. (Nombres non négatifs séparés par des points)", - "CmdNewOptVersionString": "Interpréter --version comme une chaîne sans comportement de classement.", - "CmdNewSettingName": "Nom du nouveau manifeste.", - "CmdNewSettingVersion": "Version du nouveau manifeste.", - "CmdRegenerateOptDryRun": "n’effectue pas réellement l’action, affiche uniquement ce qui serait fait", - "CmdRegenerateOptForce": "poursuit l’action (potentiellement dangereuse) sans confirmation", - "CmdRegenerateOptNormalize": "appliquer tous les correctifs de dépréciation", - "CmdRemoveOptDryRun": "Imprimer les packages à supprimer, mais sans les supprimer", - "CmdRemoveOptOutdated": "Sélectionner tous les packages dont les versions ne correspondent pas aux fichiers de port", - "CmdRemoveOptRecurse": "Autoriser la suppression des packages non explicitement spécifiés sur la ligne de commande", - "CmdSetInstalledOptDryRun": "Ne pas générer ni installer", - "CmdSetInstalledOptNoUsage": "Ne pas imprimer les informations d’utilisation de CMake après l’installation.", - "CmdSetInstalledOptWritePkgConfig": "Écrit un fichier au format NuGet packages.config à utiliser avec la mise en cache binaire externe.\nPour plus d’informations, consultez `vcpkg help binarycaching`.", + "CmdExportSettingRepoDir": "Chemin d’accès du répertoire exporté", + "CmdExportSettingRepoURL": "URL du référentiel distant pour le programme d’installation en ligne", + "CmdExportSettingSDKMinVersion": "Version minimale du Kit de développement logiciel (SDK) Android prise en charge", + "CmdExportSettingSDKTargetVersion": "Version du Kit de développement logiciel (SDK) cible Android", + "CmdExportSynopsis": "Crée un déploiement autonome des ports installés", + "CmdFetchOptXStderrStatus": "Imprime l’état/le téléchargement des messages vers stderr plutôt que stdout (les erreurs/échecs sont toujours envoyés à stdout)", + "CmdFetchSynopsis": "Extrait un élément du système ou d’Internet", + "CmdFindExample1": "vcpkg find port ", + "CmdFindExample2": "vcpkg find artifact ", + "CmdFindSynopsis": "Recherche un port ou un artefact qui peut être installé ou activé", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "Met en forme les fichiers manifeste de tous les ports", + "CmdFormatManifestOptConvertControl": "Convertit les fichiers CONTROL en fichiers manifeste", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "Génère les fichiers msbuild .props comme si vous activiez les dépendances d’artefact d’un manifeste, sans les acquérir", + "CmdGenerateMessageMapOptNoOutputComments": "Exclut les commentaires lors de la génération du mappage de messages (utile pour générer le fichier de localisation anglais)", + "CmdHashExample1": "vcpkg hash ", + "CmdHashExample2": "vcpkg hash SHA256", + "CmdHashSynopsis": "Obtient sha256 ou SHA512 d’un fichier", + "CmdHelpCommandSynopsis": "Affiche les détails de l’aide pour ", + "CmdHelpCommands": " aide", + "CmdHelpCommandsSynopsis": "Affiche la liste complète des commandes, y compris celles qui ne sont pas répertoriées ici", + "CmdHelpTopic": "aide ", + "CmdInfoOptInstalled": "(expérimental) Signale les packages installés plutôt que disponibles", + "CmdInfoOptTransitive": "(expérimental) Signale également les dépendances des packages installés", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Crée un registre Git vide", + "CmdInstallExample1": "vcpkg install ...", + "CmdIntegrateSynopsis": "Intègre vcpkg avec des machines, des projets ou des interpréteurs de commandes", + "CmdListExample2": "vcpkg list ", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "Crée un manifeste d’application (ne pas exiger de nom ou de version)", + "CmdNewOptSingleFile": "Incorpore vcpkg-configuration.json dans vcpkg.json", + "CmdNewOptVersionDate": "Interprète --version comme une date ISO 8601. (AAAA-MM-JJ)", + "CmdNewOptVersionRelaxed": "Interprète --version comme une version numérique souple (nombres non négatifs séparés par des points)", + "CmdNewOptVersionString": "Interprète --version comme une chaîne sans comportement de classement", + "CmdNewSettingName": "Nom du nouveau manifeste", + "CmdNewSettingVersion": "Version du nouveau manifeste", + "CmdNewSynposis": "Crée un manifeste", + "CmdOwnsExample1": "vcpkg possède ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "Diff. modifications dans les versions de port entre les validations", + "CmdRegenerateOptDryRun": "N’effectue pas réellement l’action, affiche uniquement ce qui serait fait", + "CmdRegenerateOptForce": "Poursuit l’action (potentiellement dangereuse) sans confirmation", + "CmdRegenerateOptNormalize": "Applique tous les correctifs de dépréciation", + "CmdRemoveExample1": "vcpkg remove ...", + "CmdRemoveOptDryRun": "Imprime les packages à supprimer, mais ne les supprime pas", + "CmdRemoveOptOutdated": "Supprime tous les packages avec des versions qui ne correspondent pas au registre intégré", + "CmdRemoveOptRecurse": "Autorise la suppression des packages dépendants qui ne sont pas explicitement spécifiés", + "CmdSearchExample1": "recherche vcpkg ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "Ne génère pas ou n’installe pas réellement", + "CmdSetInstalledOptNoUsage": "N’imprime pas les informations d’utilisation de CMake après l’installation", + "CmdSetInstalledOptWritePkgConfig": "Écrit un fichier nuGet au format packages.config à utiliser avec la mise en cache binaire externe. Pour plus d’informations, consultez « fichier binaire d’aide vcpkg »", + "CmdSetInstalledSynopsis": "Installe, met à niveau ou supprime des packages de sorte que les packages installés correspondent exactement à ceux fournis", "CmdSettingCopiedFilesLog": "Chemin d’accès vers le journal des fichiers copiés à créer", "CmdSettingInstalledDir": "Chemin d’accès vers l’arborescence installée à utiliser", "CmdSettingTLogFile": "Chemin d’accès vers le fichier tlog à créer", "CmdSettingTargetBin": "Chemin d’accès vers le binaire à analyser", - "CmdUpdateBaselineOptDryRun": "Imprimer le plan sans exécution", - "CmdUpdateBaselineOptInitial": "ajouter un 'builtin-baseline' à un fichier vcpkg.json qui ne l’a pas déjà", - "CmdUpgradeOptAllowUnsupported": "Au lieu de renvoyer une erreur sur un port non pris en charge, continuer avec un avertissement.", + "CmdUpdateBaselineOptDryRun": "Imprime le plan sans exécution", + "CmdUpdateBaselineOptInitial": "Ajoute un 'builtin-baseline' à un fichier vcpkg.json qui ne l’a pas déjà", + "CmdUpdateBaselineSynopsis": "Mises à jour les bases de référence des registres git dans un manifeste à la validation HEAD de ces registres", + "CmdUpdateRegistryAll": "Met à jour tous les registres d’artefacts connus", + "CmdUpdateRegistryAllExcludesTargets": "Mettre à jour le Registre --all ne peut pas être utilisé avec une liste de registres d’artefacts", + "CmdUpdateRegistryAllOrTargets": "La mise à jour du Registre nécessite une liste de noms de registre d’artefacts ou d’URI à mettre à jour, ou --all.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "Télécharge à nouveau un registre d’artefacts", "CmdUpgradeOptNoDryRun": "Mettre à niveau", "CmdUpgradeOptNoKeepGoing": "Arrêter l’installation des packages en cas d’échec", + "CmdUseExample1": "vcpkg utilise ", + "CmdUseSynopsis": "Activer un seul artefact dans cet interpréteur de commandes", + "CmdVSInstancesSynopsis": "Listes détectées Visual Studio instances", "CmdXDownloadOptHeader": "En-tête supplémentaire à utiliser lors de la récupération à partir d’URL", "CmdXDownloadOptSha": "Hachage du fichier à télécharger", - "CmdXDownloadOptSkipSha": "Ne pas vérifier le SHA512 du fichier téléchargé", - "CmdXDownloadOptStore": "Indique que le fichier doit être stocké au lieu d’être récupéré", + "CmdXDownloadOptSkipSha": "Ignore case activée de SHA512 du fichier téléchargé", + "CmdXDownloadOptStore": "Stocke le fichier au lieu de le récupérer", "CmdXDownloadOptUrl": "URL à télécharger et à stocker en cas d’absence dans le cache", + "CmdZApplocalSynopsis": "Copie les dépendances d’un binaire à partir de l’arborescence installée vers l’emplacement de ce binaire pour le déploiement local de l’application", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "Nombre de répertoires de début à supprimer de tous les chemins d’accès", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", "CommandFailed": "Commande : \n {command_line}\na échoué avec les résultats suivants :", - "Commands": "Commandes :", - "CommunityTriplets": "Triplets de communauté VCPKG :", + "CommunityTriplets": "Triplets de la communauté :", "ComparingUtf8Decoders": "Comparaison des Utf8Decoders avec une provenance différente ; il s’agit toujours d’une erreur", "CompressFolderFailed": "Échec de la compression du dossier « {path} » :", "ComputingInstallPlan": "Calcul du plan d’installation...", "ConfigurationErrorRegistriesWithoutBaseline": "La configuration définie dans {path} n’est pas valide.\n\nL’utilisation de registres nécessite qu’une ligne de base soit définie pour le Registre par défaut ou que le Registre par défaut soit null.\n\nPour plus d’informations, consultez {url}.", "ConfigurationNestedDemands": "[\"{json_field}\"] contient un objet `demands` imbriqué (les `demands` imbriqués n’ont aucun effet)", "ConflictingFiles": "Les fichiers suivants sont déjà installés dans {path} et sont en conflit avec {spec}", + "ConsideredVersions": "Les exécutables suivants ont été pris en compte mais ignorés en raison de l’exigence de version de {version} :", "ConstraintViolation": "Une violation de contrainte a été trouvée :", "ContinueCodeUnitInStart": "unité de code continue trouvée en position de départ", "ControlAndManifestFilesPresent": "Un fichier manifeste et un fichier CONTROL existent dans le répertoire du port : {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "Base de données endommagée.", "CorruptedInstallTree": "L’arborescence « installé » de votre vcpkg est endommagée.", "CouldNotDeduceNugetIdAndVersion": "Impossible de déduire l’ID nuget et la version à partir du nom de fichier : {path}", - "CouldNotFindBaseline": "La ligne de base spécifiée explicitement « {commit_sha} » est introuvable dans le fichier de référence {path}", - "CouldNotFindBaselineForRepo": "La ligne de base « {commit_sha} » est introuvable pour le dépôt {package_name}", - "CouldNotFindBaselineInCommit": "La base de référence dans la validation « {commit_sha} » est introuvable dans le dépôt {package_name} :", + "CouldNotFindBaselineInCommit": "Base de référence introuvable dans {url} à {commit_sha} pour {package_name}.", "CouldNotFindGitTreeAtCommit": "impossible de trouver l’arborescence Git pour « versions » dans le dépôt {package_name} à la validation {commit_sha}", "CouldNotFindToolVersion": "Impossible de trouver dans {path}", "CouldNotFindVersionDatabaseFile": "Fichier de base de données de versions introuvable : {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "La variable d’environnement VCPKG_DEFAULT_BINARY_CACHE doit être un répertoire (était : {path})", "DefaultBinaryCacheRequiresAbsolutePath": "La variable d’environnement VCPKG_DEFAULT_BINARY_CACHE doit être absolue (était : {path})", "DefaultBinaryCacheRequiresDirectory": "La variable d’environnement VCPKG_DEFAULT_BINARY_CACHE doit être un répertoire (était : {path})", - "DefaultBrowserLaunched": "Navigateur par défaut lancé sur {url}.", + "DefaultFeatureCore": "la fonctionnalité « core » désactive les fonctionnalités par défaut et ne peut donc pas figurer dans la liste des fonctionnalités par défaut", + "DefaultFeatureDefault": "la fonctionnalité « default » fait référence à l’ensemble des fonctionnalités par défaut et ne peut donc pas figurer dans la liste des fonctionnalités par défaut", + "DefaultFeatureIdentifier": "les noms des fonctionnalités par défaut doivent être des identificateurs", "DefaultFlag": "La valeur par défaut est --{option} activée.", "DefaultRegistryIsArtifact": "Le Registre par défaut ne peut pas être un registre d’artefacts.", - "DefaultTriplet": "À compter de la mise en production de septembre 2023, le triplet par défaut des bibliothèques vcpkg va passer de x86-windows au triplet hôte détecté ({triplet}). Pour résoudre ce message, ajoutez --triplet x86-windows pour conserver le même comportement.", + "DefaultTripletChanged": "Dans la version de septembre 2023, le triplet par défaut pour les bibliothèques vcpkg est passé de x86-windows au triplet hôte détecté ({triplet}). Pour l’ancien comportement, ajoutez --triplet x86-windows. Pour supprimer ce message, ajoutez --triplet {triplet}.", "DeleteVcpkgConfigFromManifest": "-- Ou supprimez « vcpkg-configuration » du fichier manifeste {path}.", + "DependencyFeatureCore": "la fonctionnalité « core » ne peut pas figurer dans la liste des fonctionnalités d’une dépendance. Pour désactiver les fonctionnalités par défaut, ajoutez « default-features » : false à la place.", + "DependencyFeatureDefault": "la fonctionnalité « default » ne peut pas figurer dans la liste des fonctionnalités d’une dépendance. Pour activer les fonctionnalités par défaut, ajoutez « default-features » : true à la place.", + "DependencyGraphCalculation": "Soumission du graphe des dépendances activée.", + "DependencyGraphFailure": "Soumission du graphe des dépendances en échec.", + "DependencyGraphSuccess": "Soumission du graphe des dépendances réussie.", "DeprecatedPrefabDebugOption": "--prefab-debug est désormais déconseillé.", "DetectCompilerHash": "Détection du hachage du compilateur pour le triplet {triplet}...", "DocumentedFieldsSuggestUpdate": "S’il s’agit de champs documentés qui doivent être reconnus, essayez de mettre à jour l’outil vcpkg.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "Le fichier n’a pas le hachage attendu :\nURL : {url}\nFichier : {path}\nHachage attendu : {expected}\nHachage réel : {actual}", "DownloadFailedRetrying": "Échec du téléchargement – nouvelle tentative après {value} ms", "DownloadFailedStatusCode": "{url} : échec : code d’état {value}", - "DownloadRootsDir": "Spécifiez le répertoire racine des téléchargements.\n(par défaut : {env_var})", + "DownloadRootsDir": "Répertoire de téléchargements (par défaut : {env_var})", "DownloadWinHttpError": "{url} : {system_api} a échoué avec le code de sortie {exit_code}", "DownloadedSources": "Sources téléchargées pour {spec}", "DownloadingPortableToolVersionX": "Une version appropriée de {tool_name} est introuvable (version requise v{version}) Téléchargement en cours de {tool_name} {version}...", "DownloadingTool": "Téléchargement en cours de {tool_name}...\n{url}->{path}", "DownloadingUrl": "Téléchargement de {url}", - "DownloadingVcpkgCeBundle": "Téléchargement de l’offre groupée vcpkg-artifacts {version}...", - "DownloadingVcpkgCeBundleLatest": "Téléchargement de la dernière offre groupée vcpkg-artifacts...", "DownloadingVcpkgStandaloneBundle": "Téléchargement de l’offre groupée autonome {version}.", "DownloadingVcpkgStandaloneBundleLatest": "Téléchargement de la dernière offre groupée autonome.", "DuplicatePackagePattern": "Le package « {package_name} » est dupliqué.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "lors de la détection des informations du compilateur :\nle contenu du fichier journal sur « {path} » est :", "ErrorIndividualPackagesUnsupported": "En mode manifeste, `vcpkg install` ne supporte pas les arguments individuels des paquets. \nPour installer des paquets supplémentaires, éditez vcpkg.json et exécutez ensuite `vcpkg install` sans aucun argument de paquet.", "ErrorInvalidClassicModeOption": "L’option --{option} n’est pas prise en charge en mode classique et aucun manifeste n’a été trouvé.", + "ErrorInvalidExtractOption": "--{option} doit être défini sur un entier non négatif ou 'AUTO'.", "ErrorInvalidManifestModeOption": "L’option --{option} n’est pas prise en charge en mode manifeste.", "ErrorMessage": "erreur : ", "ErrorMessageMustUsePrintError": "Le message nommé {value} commence par erreur : il doit être remplacé par le préfixe ErrorMessage dans le code.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "Des erreurs se sont produites lors de l’analyse de {path}.", "ErrorWhileWriting": "Une erreur s’est produite lors de l’écriture de {path}.", "ErrorsFound": "Nous avons trouvé les erreurs suivantes :", - "Example": "exemple :", + "ExamplesHeader": "Exemples :", "ExceededRecursionDepth": "Profondeur de récursivité dépassée.", "ExcludedPackage": "{spec} exclus", "ExcludedPackages": "Les packages suivants sont exclus :", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Exportation de l’outil de maintenance...", "ExportingPackage": "Exportation de {package_name}...", "ExtendedDocumentationAtUrl": "Documentation étendue disponible sur '{url}'", + "ExtractHelp": "Extrait une archive.", "ExtractingTool": "Extraction en cours de {tool_name}...", "FailedPostBuildChecks": "{count} problème(s) de vérification post-build trouvé(s). Pour envoyer ces ports à des catalogues organisés, corrigez d’abord le fichier de port : {path}", "FailedToAcquireMutant": "échec de l’acquisition de {path} de {path}", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "Échec de la détermination du commit actuel :", "FailedToDownloadFromMirrorSet": "Échec du téléchargement à partir du jeu de miroirs", "FailedToExtract": "Échec de l’extraction de «{path}» :", - "FailedToFetchError": "{error_msg}\nn’a pas pu récupérer {package_name} :", - "FailedToFindBaseline": "Base de référence.json introuvable", + "FailedToFetchRepo": "Échec de la récupération de {url}.", "FailedToFindPortFeature": "{package_name} n’a aucune fonctionnalité nommée {feature}.", "FailedToFormatMissingFile": "Aucun fichier à mettre en forme.\nVeuillez transmettre --all ou les fichiers explicites à mettre en forme ou convertir.", "FailedToLoadInstalledManifest": "Nous n’avons pas pu charger le fichier de contrôle ou le fichier manifeste pour {package_name} en raison de l’erreur suivante. Supprimez {package_name} et réessayez.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "Échec du verrouillage du système de fichiers sur {path}", "FailedToWriteManifest": "Échec de l’écriture du fichier manifeste {path}", "FailedVendorAuthentication": "Un ou plusieurs fournisseurs d’informations d’identification {vendor} n’ont pas pu s’authentifier. Consultez '{url}' pour plus d’informations sur la façon de fournir des informations d’identification.", - "FeedbackAppreciated": "Merci pour vos commentaires !", "FetchingBaselineInfo": "Récupération des informations de référence à partir de {package_name}...", "FetchingRegistryInfo": "Récupération des informations de Registre à partir de {url} ({value})...", "FieldKindDidNotHaveExpectedValue": "« genre » n’a pas de valeur attendue : (valeur attendue : {expected} ; trouvé {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "Des chemins d’accès absolu ont été trouvés dans les fichiers suivants :", "FilesExported": "Fichiers exportés à : {path}", "FindHelp": "Recherche l’artefact ou le port indiqué. Sans paramètre après 'artifact' ou 'port', affiche tout.", + "FindVersionArtifactsOnly": "--cette version ne peut pas être utilisé avec la recherche vcpkg ou le port de recherche vcpkg", "FishCompletion": "La saisie semi-automatique des poissons vcpkg est déjà ajoutée à \"{path}\".", "FloatingPointConstTooBig": "Constante à virgule flottante trop grande : {count}", "FollowingPackagesMissingControl": "Les packages suivants n’ont pas de contrôle ou vcpkg.json valide :", "FollowingPackagesNotInstalled": "Les packages suivants ne sont pas installés :", "FollowingPackagesUpgraded": "Les packages suivants sont mis à jour :", + "ForMoreHelp": "Pour plus d’aide", "ForceSystemBinariesOnWeirdPlatforms": "La variable d’environnement VCPKG_FORCE_SYSTEM_BINARIES doit être définie sur les plateformes arm, s390x, ppc64le et riscv.", "FormattedParseMessageExpression": "sur l’expression : {value}", "GHAParametersMissing": "La source binaire GHA nécessite la définition des variables d’environnement ACTIONS_RUNTIME_TOKEN et ACTIONS_CACHE_URL. Pour plus d’informations, consultez {url}.", @@ -470,7 +590,7 @@ "GitCommandFailed": "échec de l’exécution : {command_line}", "GitFailedToFetch": "impossible de récupérer des {value} ref à partir du {url} de référentiel", "GitFailedToInitializeLocalRepository": "impossible d’initialiser {path} de dépôt local", - "GitRegistryMustHaveBaseline": "L’entrée de Registre git pour « {package_name} » doit avoir un champ « baseline » qui est un SHA de validation git valide (40 caractères hexadécimals).\nle head actuel de ce référentiel est « {value} ».", + "GitRegistryMustHaveBaseline": "Le registre git « {url} » doit avoir un champ « baseline » qui est un SHA de validation git valide (40 caractères hexadécimals).\nPour utiliser les versions les plus récentes, définissez la ligne de base sur head de ce référentiel, « {commit_sha} ».", "GitStatusOutputExpectedFileName": "nom de fichier attendu", "GitStatusOutputExpectedNewLine": "nouvelle ligne attendue", "GitStatusOutputExpectedRenameOrNewline": "fichier renommé ou nouvelles lignes attendus", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "git a produit une sortie inattendue lors de l’exécution de {command_line}", "GraphCycleDetected": "Cycle détecté dans le graphique à {package_name} :", "HashFileFailureToRead": "échec de la lecture du fichier « {chemin} »pour le hachage : ", + "HashPortManyFiles": "{package_name} contient {count} fichiers. Le hachage de ces contenus peut prendre beaucoup de temps lors de la détermination du hachage ABI pour la mise en cache binaire. Envisagez de réduire le nombre de fichiers. Les causes courantes de cette erreur sont l’extraction accidentelle de fichiers sources ou de builds dans le répertoire d’un port.", "HeaderOnlyUsage": "{package_name} est en-tête uniquement et peut être utilisé à partir de CMake via :", "HelpAssetCaching": "**Fonctionnalité expérimentale : peut changer ou être supprimée à tout moment**\n\nvcpkg peut utiliser des miroirs pour mettre en cache les ressources téléchargées, ce qui garantit la poursuite de l’opération même si la source d’origine change ou disparaît.\n\nLa mise en cache des ressources peut être configurée en définissant la variable d’environnement X_VCPKG_ASSET_SOURCES sur une liste de sources délimitée par des points-virgules ou en passant une séquence d’options de ligne de commande --x-asset-sources=. Les sources de ligne de commande sont interprétées après les sources d’environnement. Les virgules, les points-virgules et les apostrophes inverses peuvent être placés dans une séquence d’échappement à l’aide d’un backtick (').\n\nLe paramètre facultatif pour certaines chaînes contrôle la manière dont elles sont accessibles. Il peut être spécifié en tant que « read », « write » ou « readwrite » et sa valeur par défaut est « read ».\n\nSources valides :", "HelpAssetCachingAzUrl": "Ajoute une source Stockage Blob Azure, en utilisant éventuellement la validation de la signature d’accès partagé. L’URL doit inclure le chemin d’accès du conteneur et se terminer par un « / » de fin. Si elle est définie, elle doit être précédée d’un « ? ». Les serveurs non-Azure fonctionnent également s’ils répondent aux demandes GET et PUT au format «  ».", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "Spécifie un délai d’expiration NuGet pour les opérations réseau NuGet, équivalent au paramètre « -Timeout » de l’interface CLI NuGet.", "HelpBuiltinBase": "La ligne de base référence une validation dans le référentiel vcpkg qui établit une version minimale sur chaque dépendance dans le graphique. Par exemple, si aucune autre contrainte n’est spécifiée (directement ou transitivement), la version est résolue en ligne de base du manifeste de niveau supérieur. Les lignes de base des dépendances transitives sont ignorées.", "HelpCachingClear": "Supprime toutes les sources précédentes, y compris les valeurs par défaut.", - "HelpContactCommand": "Affichez les informations de contact pour envoyer des commentaires.", - "HelpCreateCommand": "Créez un port.", - "HelpDependInfoCommand": "Afficher la liste des dépendances pour les ports.", - "HelpEditCommand": "Ouvrez un port pour la modification (utilisez la variable d’environnement '{env_var}' pour définir un programme d’éditeur, la valeur par défaut est 'code').", - "HelpEnvCommand": "Crée un environnement shell propre pour le développement ou la compilation.", - "HelpExampleCommand": "Pour obtenir de l’aide supplémentaire (notamment des exemples), consultez le dossier des README.md et documents qui l’accompagnent.", + "HelpContactCommand": "Affiche les informations de contact pour envoyer des commentaires", + "HelpCreateCommand": "Crée un port", + "HelpDependInfoCommand": "Affiche une liste des dépendances pour les ports", + "HelpEditCommand": "Modifie un port, éventuellement avec {env_var}, a la valeur par défaut « code »", + "HelpEnvCommand": "Crée un environnement shell propre pour le développement ou la compilation", + "HelpExampleCommand": "Pour obtenir de l’aide supplémentaire (notamment des exemples), voir https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Exemple de manifeste :", "HelpExportCommand": "Exporte un package.", - "HelpFormatManifestCommand": "Met en forme tous les fichiers vcpkg.json. Exécutez ceci avant de valider sur vcpkg.", "HelpHashCommand": "Hacher un fichier par algorithme spécifique, SHA512 par défaut.", - "HelpInitializeRegistryCommand": "Initialise un registre dans le répertoire .", - "HelpInstallCommand": "Installer un package.", - "HelpListCommand": "Répertorie les packages installés.", + "HelpInstallCommand": "Installe un package", + "HelpListCommand": "Répertorie les packages installés", "HelpManifestConstraints": "Les manifestes peuvent placer trois types de contraintes sur les versions utilisées", "HelpMinVersion": "Vcpkg sélectionne la version minimale trouvée qui correspond à toutes les contraintes applicables, y compris la version de la base de référence spécifiée au niveau supérieur, ainsi que toute contrainte « version>= » dans le graphique.", "HelpOverrides": "Lorsqu’ils sont utilisés comme manifeste de niveau supérieur (par exemple, lors de l’exécution de « vcpkg install » dans le répertoire), les remplacements permettent à un manifeste de court-circuiter la résolution des dépendances et de spécifier exactement la version à utiliser. Ils peuvent être utilisés pour gérer les conflits de version, par exemple avec les dépendances « version-string ». Elles ne sont pas prises en compte quand elles dépendent de manière transitive.", - "HelpOwnsCommand": "Recherchez des fichiers dans les packages installés.", + "HelpOwnsCommand": "Recherche le propriétaire d’un fichier dans les packages installés", "HelpPackagePublisher": "En outre, les éditeurs de package peuvent utiliser « version>= » pour s’assurer que les consommateurs utilisent au moins une certaine version minimale d’une dépendance donnée. Par exemple, si une bibliothèque a besoin d’une API ajoutée à boost-asio dans la version 1.70, une contrainte « version>= » garantit que les utilisateurs transitifs utilisent une version suffisante, même en cas de remplacements de version individuels ou de références entre registres.", - "HelpPortVersionScheme": "Chaque version a en outre une « port-version » qui est un entier non négatif. Lorsqu’elle est rendue sous forme de texte, la version du port (si la valeur est différente de zéro) est ajoutée en tant que suffixe au texte de la version principale séparée par un signe dièse (#). Les versions de port sont triées lexographiquement après le texte de la version principale, par exemple :\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Désinstallez un package.", - "HelpRemoveOutdatedCommand": "Désinstallez tous les packages obsolètes.", - "HelpResponseFileCommand": "Spécifiez un fichier réponse pour fournir des paramètres supplémentaires.", - "HelpSearchCommand": "Recherchez les packages disponibles pour la génération.", - "HelpTextOptFullDesc": "Ne tronquez pas un long texte.", - "HelpTopicCommand": "Afficher l’aide d’un sujet spécifique.", - "HelpTopicsCommand": "Affichez la liste des rubriques d’aide.", - "HelpTxtOptAllowUnsupportedPort": "Au lieu de renvoyer une erreur sur un port non pris en charge, continuer avec un avertissement.", - "HelpTxtOptCleanAfterBuild": "Nettoyez les arborescences de build, les packages et les téléchargements après la génération de chaque package.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Nettoyez les arborescences de build après la génération de chaque package.", - "HelpTxtOptCleanDownloadsAfterBuild": "Nettoyez les téléchargements après la génération de chaque package.", - "HelpTxtOptCleanPkgAfterBuild": "Nettoyez les packages après la génération de chaque package.", - "HelpTxtOptDryRun": "Ne pas générer ni installer.", - "HelpTxtOptEditable": "Désactiver la ré-extraction source et la mise en cache binaire pour les bibliothèques sur la ligne de commande (mode classique)", + "HelpPortVersionScheme": "Chaque version a également une « version de port » qui est un entier non négatif. Lorsqu’elle est rendue sous forme de texte, la version du port (si la valeur est différente de zéro) est ajoutée en tant que suffixe au texte de la version principale séparée par un hachage (#). Les versions de port sont triées lexicographiquement après le texte de la version principale, par exemple :\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Désinstalle un package", + "HelpResponseFileCommand": "Contient un argument par ligne développé à cet emplacement", + "HelpSearchCommand": "Recherche les packages disponibles pour la génération", + "HelpTextOptFullDesc": "Ne tronque pas le texte long", + "HelpTopicCommand": "Affiche une rubrique d’aide spécifique", + "HelpTopicsCommand": "Affiche la liste complète des rubriques d’aide", + "HelpTxtOptAllowUnsupportedPort": "Continue avec un avertissement sur les ports non pris en charge, au lieu d’échouer", + "HelpTxtOptCleanAfterBuild": "Nettoie les arborescences de build, les packages et les téléchargements après la génération de chaque package", + "HelpTxtOptCleanBuildTreesAfterBuild": "Nettoie les arborescences de build après la génération de chaque package", + "HelpTxtOptCleanDownloadsAfterBuild": "Nettoie les téléchargements après la génération de chaque package", + "HelpTxtOptCleanPkgAfterBuild": "Nettoie les packages après la génération de chaque package", + "HelpTxtOptDryRun": "Ne génère pas ou n’installe pas réellement", + "HelpTxtOptEditable": "Désactive la re-extraction source et la mise en cache binaire pour les bibliothèques sur la ligne de commande (mode classique)", "HelpTxtOptEnforcePortChecks": "Échec de l’installation si un port a détecté des problèmes ou tente d’utiliser une fonctionnalité déconseillée", - "HelpTxtOptKeepGoing": "Continuez l’installation de packages en cas de défaillance.", - "HelpTxtOptManifestFeature": "Fonctionnalité supplémentaire du manifeste de niveau supérieur à installer (mode manifeste).", - "HelpTxtOptManifestNoDefault": "Ne pas installer les fonctionnalités par défaut à partir du manifeste de niveau supérieur (mode manifeste).", - "HelpTxtOptNoDownloads": "Ne téléchargez pas de nouvelles sources.", - "HelpTxtOptNoUsage": "Ne pas imprimer les informations d’utilisation de CMake après l’installation.", - "HelpTxtOptOnlyBinCache": "Défaillance si les fichiers binaires mis en cache ne sont pas disponibles.", - "HelpTxtOptOnlyDownloads": "Effectuez une tentative optimale pour télécharger des sources sans effectuer de génération.", - "HelpTxtOptRecurse": "Autorisez la suppression de packages dans le cadre de l’installation.", - "HelpTxtOptUseAria2": "Utilisez aria2 pour effectuer des tâches de téléchargement.", - "HelpTxtOptUseHeadVersion": "Installer les bibliothèques sur la ligne de commande en tirant parti des dernières sources en amont (mode classique).", - "HelpTxtOptWritePkgConfig": "Écrit un fichier au format NuGet packages.config à utiliser avec la mise en cache binaire externe.\nPour plus d’informations, consultez `vcpkg help binarycaching`.", - "HelpUpdateBaseline": "La meilleure approche pour maintenir vos bibliothèques à jour consiste à mettre à jour votre référence de base. Cela permet de s’assurer que tous les packages, y compris les packages transitifs, sont mis à jour. Toutefois, si vous devez mettre à jour un package indépendamment, vous pouvez utiliser une contrainte « version>= ».", - "HelpUpdateCommand": "Répertoriez les packages pouvant être mis à jour.", - "HelpUpgradeCommand": "Reconstruisez tous les packages obsolètes.", - "HelpVersionCommand": "Affiche les informations de version.", + "HelpTxtOptKeepGoing": "Continue l’installation des packages en cas d’échec", + "HelpTxtOptManifestFeature": "Fonctionnalités supplémentaires du manifeste de niveau supérieur à installer (mode manifeste)", + "HelpTxtOptManifestNoDefault": "N’installe pas les fonctionnalités par défaut à partir du manifeste de niveau supérieur (mode manifeste)", + "HelpTxtOptNoDownloads": "Ne télécharge pas de nouvelles sources", + "HelpTxtOptNoUsage": "N’imprime pas les informations d’utilisation de CMake après l’installation", + "HelpTxtOptOnlyBinCache": "Échoue si les fichiers binaires mis en cache ne sont pas disponibles", + "HelpTxtOptOnlyDownloads": "Fait le meilleur effort pour essayer de télécharger des sources sans générer", + "HelpTxtOptRecurse": "Autorise la suppression des packages dans le cadre de l’installation", + "HelpTxtOptUseAria2": "Utilise aria2 pour effectuer des tâches de téléchargement", + "HelpTxtOptUseHeadVersion": "Installe les bibliothèques sur la ligne de commande à l’aide des dernières sources en amont (mode classique)", + "HelpTxtOptWritePkgConfig": "Écrit un fichier nuGet au format packages.config à utiliser avec la mise en cache binaire externe. Pour plus d’informations, consultez « fichier binaire d’aide vcpkg »", + "HelpUpdateBaseline": "La meilleure approche pour maintenir vos bibliothèques à jour consiste à mettre à jour votre référence de base. Cela garantira que tous les packages, y compris les packages transitifs, sont mis à jour. Cependant, si vous avez besoin de mettre à jour un package indépendamment, vous pouvez utiliser une contrainte \"version>=\".", + "HelpUpdateCommand": "Répertorie les packages pouvant être mis à niveau", + "HelpUpgradeCommand": "Reconstruit tous les packages obsolètes", + "HelpVersionCommand": "Affiche les informations de version", "HelpVersionDateScheme": "Une date (2021-01-01.5)", "HelpVersionGreater": "Dans le champ « dependencies », chaque dépendance peut avoir une contrainte minimale listée. Ces contraintes minimales seront utilisées en cas de transitivité selon cette bibliothèque. Une version de port minimale peut également être spécifiée avec un suffixe « # ».", "HelpVersionScheme": "Séquence de nombres séparés par des points (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Signature de fichier d’archive incorrecte", "IncorrectPESignature": "Signature PE incorrecte", "IncrementedUtf8Decoder": "Utf8Decoder incrémenté à la fin de la chaîne", - "InfoSetEnvVar": "Vous pouvez également définir la variable d’environnement '{env_var}' sur l’éditeur de votre choix.", + "InfoSetEnvVar": "Vous pouvez également définir {env_var} sur l’éditeur de votre choix.", "InitRegistryFailedNoRepo": "Impossible de créer un registre sur {path}, car il ne s’agit pas d’une racine de dépôt Git.\nUtilisez `git init {command_line}` pour créer un référentiel Git dans ce dossier.", "InstallCopiedFile": "{path_source} -> {path_destination} effectué", "InstallFailed": "échec : {path} : {error_msg}", "InstallPackageInstruction": "Quand un projet est ouvert, accédez à la console Outils->NuGet Gestionnaire de package->Gestionnaire de package et collez :\n Install-Package \"{value}\" -Source \"{path}\"", - "InstallRootDir": "(Expérimental) Spécifiez le répertoire racine d’installation.", + "InstallRootDir": "Répertoire installé (expérimental)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} ignoré, à jour", "InstallWithSystemManager": "Vous pouvez peut-être installer cet outil via votre gestionnaire de packages système.", "InstallWithSystemManagerMono": "Les utilisateurs d’Ubuntu 18.04 peuvent avoir besoin d’une version plus récente de Mono, disponible sur {url}.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Installation du port à partir de l’emplacement : {path}", "InstallingMavenFile": "{path} installation du fichier Maven", "InstallingPackage": "Installation de {action_index}/{count} {spec}...", - "IntegrateBashHelp": "Activez la saisie semi-automatique de tabulation Bash.", - "IntegrateFishHelp": "Activez la saisie semi-automatique des onglets de poisson.", - "IntegrateInstallHelpLinux": "Rendre les packages installés disponibles à l’échelle de l’utilisateur.", - "IntegrateInstallHelpWindows": "Rendre les packages installés disponibles à l’échelle de l’utilisateur. Nécessite des privilèges d’administrateur lors de la première utilisation.", - "IntegratePowerShellHelp": "Activez la saisie semi-automatique des onglets PowerShell.", - "IntegrateProjectHelp": "Générez un package NuGet de référence pour une utilisation individuelle d’un projet VS.", - "IntegrateRemoveHelp": "Supprimez l’intégration à l’échelle de l’utilisateur.", - "IntegrateZshHelp": "Activez la saisie semi-automatique par tabulation zsh.", - "IntegrationFailed": "L’intégration n’a pas été appliquée.", + "IntegrateBashHelp": "Activez la saisie semi-automatique de tabulation Bash. Non-Windows uniquement", + "IntegrateFishHelp": "Activez la saisie semi-automatique des onglets. Non Windows uniquement", + "IntegrateInstallHelpLinux": "Rend les packages installés disponibles à l’échelle de l’utilisateur", + "IntegrateInstallHelpWindows": "Rend les packages installés disponibles à l’échelle de l’utilisateur. Nécessite des privilèges d’administrateur lors de la première utilisation", + "IntegrateNonWindowsOnly": "{command_line} n’est pas Windows uniquement et n’est pas pris en charge sur ce système.", + "IntegratePowerShellHelp": "Activez la saisie semi-automatique des onglets PowerShell. Windows uniquement", + "IntegrateProjectHelp": "Génère un package NuGet référençant pour une utilisation de projet Visual Studio individuelle. Windows uniquement", + "IntegrateRemoveHelp": "Supprime l’intégration à l’échelle de l’utilisateur", + "IntegrateWindowsOnly": "{command_line} est Windows uniquement et n’est pas pris en charge sur ce système.", + "IntegrateZshHelp": "Activez la saisie semi-automatique par tabulation zsh. Non Windows uniquement", + "IntegrationFailedVS2015": "L’intégration n’a pas été appliquée pour Visual Studio 2015.", "InternalCICommand": "vcpkg ci est une commande interne qui change de façon incompatible ou est supprimée à tout moment.", "InternalErrorMessage": "Erreur interne :", "InternalErrorMessageContact": "Ouvrez un problème à https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug avec des étapes détaillées pour reproduire le problème.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg ne prend pas en charge les commentaires de style C, mais la plupart des objets autorisent l’utilisation de champs $-prefixed comme commentaires.", "InvalidCommitId": "ID de validation non valide : {commit_sha}", "InvalidDefaultFeatureName": "'default' est un nom de fonctionnalité réservée", - "InvalidDependency": "les dépendances doivent être des caractères alphanumériques en minuscules+des traits d’union, et non l’un des noms réservés", "InvalidFeature": "les fonctionnalités doivent être des caractères alphanumériques en minuscules+des traits d’union, et non l’un des noms réservés", "InvalidFileType": "échec : {path} ne peut pas gérer le type de fichier", "InvalidFilename": "Le nom de fichier ne peut pas contenir de caractères non valides {value}, mais était {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "La bibliothèque n’était pas valide : aucun membre de l’éditeur de liens n’a été trouvé.", "InvalidLinkage": "Type de liaison {system_name} non valide : [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "expression logique non valide, caractère inattendu", - "InvalidLogicExpressionUsePipe": "expression logique non valide, utilisez « | » au lieu de « or »", + "InvalidLogicExpressionUsePipe": "expression logique non valide, utilisez « | » plutôt que « or »", "InvalidNoVersions": "Le fichier ne contient aucune version.", "InvalidOptionForRemove": "'remove' accepte les bibliothèques ou '--outdated'", "InvalidPortVersonName": "Nom de fichier de version de port non valide trouvé : '{path}'.", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "la valeur de [\"{json_field}\"] doit être un objet", "JsonFieldNotString": "la valeur de [\"{json_field}\"] doit être une chaîne", "JsonFileMissingExtension": "le fichier JSON {path} doit avoir une extension .json (tout en minuscules)", - "JsonSwitch": "(Expérimental) Sortie JSON de la demande.", + "JsonSwitch": "Imprime JSON plutôt que du texte brut", "JsonValueNotArray": "La valeur json n’est pas un tableau", "JsonValueNotObject": "La valeur json n’est pas un objet", "JsonValueNotString": "La valeur json n’est pas une chaîne", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Mise en production dynamique (/MD)", "LinkageStaticDebug": "Débogage statique (/MTd)", "LinkageStaticRelease": "Mise en production statique (/MT)", - "ListHelp": "L’argument doit être une sous-chaîne à rechercher ou aucun argument pour afficher toutes les bibliothèques installées.", + "ListHelp": "Répertorie les bibliothèques installées", "ListOfValidFieldsForControlFiles": "Liste des champs valides pour les fichiers CONTROL (respectant la casse) :", "LoadingCommunityTriplet": "-- [COMMUNITY] Chargement de la configuration triplet à partir de : {path}", "LoadingDependencyInformation": "Chargement des informations de dépendance pour {count} packages...", @@ -708,7 +827,6 @@ "MultiArch": "Multi-Arch doit être 'same' mais était {option}", "MultipleFeatures": "{package_name} déclare {feature} plusieurs fois ; vérifiez que les fonctionnalités ont des noms distincts", "MutuallyExclusiveOption": "--{value} ne peut pas être utilisé avec --{option}.", - "NavigateToNPS": "Accédez à {url} dans votre navigateur préféré.", "NewConfigurationAlreadyExists": "La création d’un manifeste remplacerait vcpkg-configuration.json au {path}.", "NewManifestAlreadyExists": "Un manifeste est déjà présent dans {path}.", "NewNameCannotBeEmpty": "'Nom' ne peut pas être vide.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "Spécifiez --name et --version pour produire un manifeste destiné aux bibliothèques C++, ou spécifiez --application pour indiquer que le manifeste n’est pas destiné à être utilisé en tant que port.", "NewVersionCannotBeEmpty": "--version ne peut pas être vide.", "NoArgumentsForOption": "L’option --{option} n’accepte pas d’argument.", - "NoCachedPackages": "Aucun package n’est mis en cache.", "NoError": "aucune erreur", "NoInstalledPackages": "Aucun package n’est installé. Voulez-vous dire `search` ?", "NoLocalizationForMessages": "Aucun message localisé pour les éléments suivants : ", @@ -739,22 +856,27 @@ "OptionRequiresAValue": "l’option '{option}' requiert une valeur", "OptionRequiresOption": "--{value} nécessite --{option}", "OptionUsedMultipleTimes": "l’option '{option}' a été spécifiée plusieurs fois", - "OptionalCommand": "commande facultative", "Options": "Options", "OriginalBinParagraphHeader": "\nParagraphe binaire d’origine", + "OtherCommandsHeader": "Autre", "OverlayPatchDir": "Le chemin de superposition \"{path}\" doit exister et doit être un répertoire.", + "OverlayPortsDirectoriesHelp": "Répertoires des ports de superposition (également : {env_var})", + "OverlayTripletDirectoriesHelp": "Répertoires des triplets de superposition (également : {env_var})", "OverlayTriplets": "Superposer les triplets à partir de {path} :", "OverwritingFile": "Le fichier {path} était déjà présent et sera remplacé", "PECoffHeaderTooShort": "Lors de l’analyse de l’exécutable portable {path}, la taille de l’en-tête COFF est trop petite pour contenir un en-tête PE valide.", - "PEConfigCrossesSectionBoundary": "Lors de l’analyse de l’exécutable portable {path}, le répertoire de configuration d’image dépasse une limite de séparation.", - "PEImportCrossesSectionBoundary": "Lors de l’analyse de l’exécutable portable {path}, la table d’importation dépasse une limite de séparation.", + "PEConfigCrossesSectionBoundary": "Lors de l’analyse de l’exécutable portable {path}, le répertoire de configuration d’image dépasse une limite de section.", + "PEImportCrossesSectionBoundary": "Lors de l’analyse de l’exécutable portable {path}, la table d’importation dépasse une limite de section.", "PEPlusTagInvalid": "Lors de l’analyse de l’exécutable portable {path}, l’en-tête facultatif n’était ni PE32 ni PE32+.", "PERvaNotFound": "Lors de l’analyse de l’exécutable portable {path}, RVA {value:#X} est introuvable.", "PESignatureMismatch": "Incompatibilité de signature détectée lors de l’analyse de l’exécutable portable {path}.", "PackageAlreadyRemoved": "impossible de supprimer {spec} : déjà supprimé", + "PackageDiscoveryHeader": "Découverte de package", "PackageFailedtWhileExtracting": "échec de '{value}' lors de l’extraction de {path}.", - "PackageInfoHelp": "Affichez des informations détaillées sur les packages.", - "PackageRootDir": "(Expérimental) Spécifiez le répertoire racine des packages.", + "PackageInfoHelp": "Affichez des informations détaillées sur les packages", + "PackageInstallationHeader": "Package Installation", + "PackageManipulationHeader": "Package Manipulation", + "PackageRootDir": "Répertoire packages (expérimental)", "PackagesToInstall": "Les packages suivants seront générés et installés :", "PackagesToInstallDirectly": "Les packages suivants seront installés directement :", "PackagesToModify": "Les packages supplémentaires (*) seront modifiés pour terminer cette opération.", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "{value} était censé être {expected}.", "ParseControlErrorInfoWhileLoading": "lors du chargement {path} :", "ParseControlErrorInfoWrongTypeFields": "Les types des champs suivants sont incorrects :", - "ParseIdentifierError": "« {value} » n’est pas un identificateur valide. Les identificateurs doivent être alphanumériques en minuscules+traits d’union et non réservés (voir {url} pour plus d’informations)", - "ParsePackageNameError": "« {package_name} » n’est pas un nom de package valide. Les noms de package doivent être alphanumériques en minuscules+traits d’union et non réservés (voir {url} pour plus d’informations)", - "ParsePackagePatternError": "« {package_name} » n’est pas un modèle de package valide. Les modèles de package doivent utiliser un seul caractère générique (*) et il doit s’agir du dernier caractère du modèle (voir {url} pour plus d’informations)", + "ParseFeatureNameError": "« {package_name} » n’est pas un nom de fonctionnalité valide. Les noms de package doivent être alphanumériques en minuscules+traits d’union et non réservés (voir {url} pour plus d’informations).", + "ParseIdentifierError": "« {value} » n’est pas un identificateur valide. Les identificateurs doivent être alphanumériques en minuscules+traits d’union et non réservés (voir {url} pour plus d’informations).", + "ParsePackageNameError": "« {package_name} » n’est pas un nom de package valide. Les noms de package doivent être alphanumériques en minuscules+traits d’union et non réservés (voir {url} pour plus d’informations).", + "ParsePackagePatternError": "« {package_name} » n’est pas un modèle de package valide. Les modèles de package doivent utiliser un seul caractère générique (*) et il doit s’agir du dernier caractère du modèle (voir {url} pour plus d’informations).", "PathMustBeAbsolute": "La valeur de la variable d’environnement X_VCPKG_REGISTRIES_CACHE n’est pas absolue : {path}", "PerformingPostBuildValidation": "-- Exécution de la validation post-build", "PortBugAllowRestrictedHeaders": "Dans des circonstances exceptionnelles, cette stratégie peut être désactivée via {env_var}.", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "Pour inspecter les fichiers {extension}, utilisez :", "PortBugInvalidCrtLinkage": "Les fichiers binaires suivants doivent utiliser le CRT {expected}.", "PortBugInvalidCrtLinkageEntry": "Liens {path} avec :", + "PortBugKernel32FromXbox": "Le triplet sélectionné cible Xbox, mais les DLL suivantes sont liées au noyau 32. Ces DLL ne peuvent pas être chargées sur Xbox, où kernel32 n’est pas présent. Cela est généralement dû à la liaison avec kernel32.lib plutôt qu’avec une bibliothèque de parapluies appropriée, comme onecore_apiset.lib ou xgameplatform.lib.", "PortBugMergeLibCMakeDir": "Le dossier /lib/cmake doit être fusionné avec /debug/lib/cmake et déplacé vers /share/{package_name}/cmake. Utilisez la fonction d’assistance `vcpkg_cmake_config_fixup()` à partir du port vcpkg-cmake-config.`", "PortBugMismatchedNumberOfBinaries": "Nombre de fichiers binaires de débogage et de mise en production incompatible.", "PortBugMisplacedCMakeFiles": "Les fichiers cmake suivants ont été trouvés en dehors de /share/{spec}. Placez les fichiers cmake dans /share/{spec}.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "Si la création de bin\\ et/ou debug\\bin\\ ne peut être désactivée, utilisez ceci dans le fichier de port pour les supprimer", "PortBugRemoveEmptyDirectories": "Si un répertoire doit être renseigné mais ne l’est pas, cela peut indiquer une erreur dans le fichier de port.\nSi les répertoires ne sont pas nécessaires et que leur création ne peut pas être désactivée, utilisez un élément comme celui-ci dans le fichier port pour les supprimer :", "PortBugRemoveEmptyDirs": "fichier (répertoires REMOVE_RECURSE vides laissés par les renommages ci-dessus)", - "PortBugRestrictedHeaderPaths": "Les en-têtes restreints suivants peuvent empêcher la compilation correcte du noyau d’exécution C++ et d’autres paquets. Dans des circonstances exceptionnelles, cette stratégie peut être désactivée via {env_var}.", + "PortBugRestrictedHeaderPaths": "Les en-têtes restreints suivants peuvent empêcher le runtime C++ principal et d’autres packages de se compiler correctement. Dans des circonstances exceptionnelles, cette stratégie peut être désactivée en définissant la variable CMake VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS dans portfile.cmake.", "PortBugSetDllsWithoutExports": "Les DLL sans aucune exportation sont probablement un bogue dans le script de build. Si tel est le cas, ajoutez la ligne suivante dans le fichier de port :\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS enabled)\nLes DLL suivantes n’ont pas d’exportations :", "PortDependencyConflict": "Le port {package_name} a les dépendances non prises en charge suivantes :", "PortDoesNotExist": "{package_name} n'existe pas.", @@ -827,21 +951,26 @@ "PortsDiffHelp": "L’argument doit être une branche/balise/hachage à extraire.", "PortsNoDiff": "Il n’y a eu aucune modification dans les ports entre les deux validations.", "PortsRemoved": "Les {count} ports suivants ont été supprimés :", - "PortsUpdated": "\nLes {count} ports suivants ont été mis à jour :", + "PortsUpdated": "Les {count} ports suivants ont été mis à jour :", "PrebuiltPackages": "Certains packages n’ont pas été générés. Pour les générer, exécutez :", "PreviousIntegrationFileRemains": "Le fichier d’intégration précédent n’a pas été supprimé.", "ProgramReturnedNonzeroExitCode": "Échec de {tool_name} avec le code de sortie : ({exit_code}).", "ProvideExportType": "Au moins une des options suivantes est requise : --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "Échec de l’envoi de {vendor} à '{path}'. Utilisez --debug pour plus d’informations.", - "RegeneratesArtifactRegistry": "Régénère un registre d’artefacts.", + "RegeneratesArtifactRegistry": "Régénère un registre d’artefacts", "RegistryCreated": "Le Registre a été créé sur {path}", "RegistryValueWrongType": "La valeur de Registre {path} était un type inattendu.", "RemoveDependencies": "Pour supprimer les dépendances en mode manifeste, modifiez votre manifeste (vcpkg.json) et exécutez 'install'.", "RemovePackageConflict": "{spec} n’est pas installé, mais {package_name} est installé pour {triplet}. Voulez-vous dire {package_name}:{triplet} ?", "RemovingPackage": "Suppression de {action_index}/{count} {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "Package restauré à partir de '{path}'", - "RestoredPackagesFromVendor": "Package(s) {count} restauré(s) à partir de {value} dans {elapsed}. Utilisez --déboguer pour afficher plus de détails.", + "RestoredPackagesFromAWS": "{count} package(s) restauré(s) à partir d’AWS dans {elapsed}. Utilisez --debug pour afficher plus de détails.", + "RestoredPackagesFromCOS": "{count} package(s) restauré(s) à partir du COS dans {elapsed}. Utilisez --debug pour afficher plus de détails.", + "RestoredPackagesFromFiles": "{count} package(s) restauré(s) à partir de {path} dans {elapsed}. Utilisez --debug pour afficher plus de détails.", + "RestoredPackagesFromGCS": "{count} package(s) restauré(s) à partir de GCS dans {elapsed}. Utilisez --debug pour afficher plus de détails.", + "RestoredPackagesFromGHA": "{count} package(s) restauré(s) à partir de GitHub Actions Cache dans {elapsed}. Utilisez --debug pour afficher plus de détails.", + "RestoredPackagesFromHTTP": "{count} package(s) restauré(s) à partir de serveurs HTTP dans {elapsed}. Utilisez --debug pour afficher plus de détails.", + "RestoredPackagesFromNuGet": "{count} package(s) restauré(s) à partir de NuGet dans {elapsed}. Utilisez --debug pour afficher plus de détails.", "ResultsHeader": "Résultats", "ScriptAssetCacheRequiresScript": "arguments attendus : la configuration de ressource 'x-script' requiert exactement le modèle d’exécution en tant qu’argument", "SearchHelp": "L’argument doit être une substring à rechercher ou aucun argument pour afficher toutes les bibliothèques.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "L’effacement du contenu de {path} a été ignoré, car il ne s’agissait pas d’un répertoire.", "SourceFieldPortNameMismatch": "Le champ « Source » dans le fichier CONTROL ou le champ « name » dans le fichier vcpkg.json porte le nom {package_name} et ne correspond pas au répertoire de port {path}.", "SpecifiedFeatureTurnedOff": "La fonctionnalité '{command_name}' a été spécialement désactivée, mais --{option} a été spécifiée.", - "SpecifyDirectoriesContaining": "Spécifie les répertoires contenant des fichiers triplets.\n(également : '{env_var}')", - "SpecifyDirectoriesWhenSearching": "Spécifiez les répertoires à utiliser lors de la recherche de ports.\n(également : '{env_var}')", - "SpecifyHostArch": "Spécifiez le triplet de l’architecture hôte. Consultez « vcpkg help triplet ».\n(valeur par défaut : '{env_var}')", - "SpecifyTargetArch": "Spécifiez le triplet de l’architecture cible. Consultez « vcpkg help triplet ».\n(valeur par défaut : '{env_var}')", + "SpecifyHostArch": "Triplet de l’hôte. Voir « vcpkg help triplet » (par défaut : {env_var})", + "SpecifyTargetArch": "Triplet cible. Voir « vcpkg help triplet » (valeur par défaut : {env_var})", "StartCodeUnitInContinue": "unité de code de démarrage trouvée en position continue", "StoreOptionMissingSha": "L’option --store n’est pas valide sans sha512.", - "StoredBinariesToDestinations": "Fichiers binaires stockés dans {count} destinations.", + "StoredBinariesToDestinations": "Fichiers binaires stockés dans {count} destinations dans {elapsed}.", "StoredBinaryCache": "Cache binaire stocké : '{path}'", "SuccessfulyExported": "{package_name} exporté vers {path}", "SuggestGitPull": "Le résultat peut être obsolète. Exécutez « git pull » pour obtenir les derniers résultats.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "Vous devrez peut-être mettre à jour le binaire vcpkg ; essayez d’exécuter {command_line} à mettre à jour.", "SupportedPort": "Le port {package_name} est pris en charge.", "SwitchUsedMultipleTimes": "le commutateur « {option} » a été spécifié plusieurs fois", + "SynopsisHeader": "Synopsis", "SystemApiErrorMessage": "échec de l’appel {system_api} avec {exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "La variable d’environnement SystemRoot était toujours définie sur Windows.", "SystemTargetsInstallFailed": "échec de l’installation du fichier de cibles système sur {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Virgule de fin dans le tableau", "TrailingCommaInObj": "Virgule de fin dans un objet", "TripletFileNotFound": "Fichier triplet {triplet}.cmake introuvable", + "TripletLabel": "Triplet :", "TwoFeatureFlagsSpecified": "'{value}' et -'{value}' ont tous les deux été spécifiés en tant qu’indicateurs de fonctionnalité.", "UnableToClearPath": "impossible de supprimer {path}", "UnableToReadAppDatas": "les %LOCALAPPDATA% et les %APPDATA% sont illisibles", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "registre '{url}' pas mis à jour : '{value}'", "UpdateBaselineRemoteGitError": "git n’a pas pu récupérer les '{url}' du dépôt distant", "UpdateBaselineUpdatedBaseline": "Registre '{url}' mis à jour : base de référence '{old_value}' -> '{new_value}'", - "UpgradeInManifest": "La commande de mise à niveau ne prend pas actuellement en charge le mode manifeste. Modifiez plutôt vcpkg.json et exécutez l’installation.", + "UpgradeInManifest": "La mise à niveau met à niveau une installation en mode classique et ne prend donc pas en charge le mode manifeste. Envisagez de mettre à jour vos dépendances en mettant à jour votre base de référence avec une valeur actuelle avec vcpkg x-update-baseline et en exécutant l’installation de vcpkg.", "UpgradeRunWithNoDryRun": "Si vous voulez vraiment régénérer les packages ci-dessus, exécutez cette commande avec l’option --no-dry-run.", "UploadedBinaries": "Fichiers binaires chargés sur {count} {vendor}", "UploadedPackagesToVendor": "{count} package(s) chargé(s) sur {vendor} dans {elapsed}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "commande non valide : {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "La valeur de la variable d’environnement X_VCPKG_REGISTRIES_CACHE n’est pas un répertoire : {path}", "VcpkgRootRequired": "La définition VCPKG_ROOT est requise pour l’amorçage autonome.", - "VcpkgRootsDir": "Spécifiez le répertoire racine vcpkg.\n(valeur par défaut : '{env_var}')", + "VcpkgRootsDir": "Répertoire racine vcpkg (par défaut : {env_var})", "VcpkgSendMetricsButDisabled": "Réussite de --sendmetrics, mais les indicateurs de performance sont désactivés.", + "VcpkgUsage": "utilisation : vcpkg [--switches] [--options=values] [arguments] @response_file", "VcvarsRunFailed": "impossible d’exécuter vcvarsall.bat pour obtenir un environnement Visual Studio", "VcvarsRunFailedExitCode": "lors de la tentative d’obtention d’un environnement Visual Studio, vcvarsall.bat retourné {exit_code}", "VersionBaselineMismatch": "La dernière version est {expected}, mais le fichier de base de référence contient {actual}.\nCourir:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m « Mettre à jour la base de données de version »\npour mettre à jour la version de base de référence.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "{package_name} n’a pas de fichier de base de données de version au {path}\nCourir:\nvcpkg x-add-version {package_name}\npour créer le fichier de versions.", "VersionGitEntryMissing": "aucune entrée de base de données de version pour {package_name} à {version}.\nVersions disponibles :", "VersionInDeclarationDoesNotMatch": "La version déclarée dans le fichier ne correspond pas à la version extraite : {version}", - "VersionIncomparable1": "conflit de version sur {spec} : {package_name} {expected} requis, mais vcpkg n’a pas pu le comparer à {actual}.\nLes deux versions utilisaient des schémas plus petits :", - "VersionIncomparable2": "\"{version}\" était du schéma {new_scheme}", - "VersionIncomparable3": "Pour résoudre ce problème, ajoutez un remplacement explicite à la version par défaut, par exemple :", - "VersionIncomparable4": "Pour plus d’informations, consultez « vcpkg help versioning ».", + "VersionIncomparable1": "conflit de version sur {spec} : {constraint_origin} requis {expected}, qui ne peut pas être comparé à la version de référence {actual}.", + "VersionIncomparable2": "{version_spec} a le schéma {new_scheme}", + "VersionIncomparable3": "Cela peut être résolu en ajoutant un remplacement explicite à la version préférée. Par exemple:", + "VersionIncomparable4": "Voir `vcpkg help versioning` ou {url} pour plus d'informations.", + "VersionIncomparableSchemeString": "Les deux versions ont une chaîne de schéma mais un texte principal différent.", + "VersionIncomparableSchemes": "Les versions ont des schémas incomparables :", "VersionInvalidDate": "«{version}» n’est pas une version de date valide. Les dates doivent suivre le format AAAA-MM-JJ et les désambiguïsateurs doivent être des valeurs entières positives séparées par des points sans zéros non significatifs.", "VersionInvalidRelaxed": "«{version}» n’est pas une version souple valide (semver avec un nombre d’éléments numériques arbitraire).", "VersionInvalidSemver": "«{version}» n’est pas une version sémantique valide, consultez .", "VersionMissing": "champ de contrôle de version (version, version-date, version-serveur ou version-chaîne) attendu", - "VersionMissingRequiredFeature": "{spec}@{version} n’a pas la fonctionnalité {feature} requise", + "VersionMissingRequiredFeature": "{version_spec} n'a pas la fonctionnalité requise {feature} requise par {constraint_origin}", "VersionNotFound": "{expected} n’est pas disponible, seul {actual} est disponible", - "VersionNotFoundDuringDiscovery": "version introuvable lors de la découverte : {spec}@{version}\nIl s’agit d’une erreur vcpkg interne. Ouvrez un problème sur https://github.com/Microsoft/vcpkg avec des étapes détaillées pour reproduire le problème.", - "VersionNotFoundInVersionsFile": "La {version} de version est introuvable dans le fichier de versions.\nCourir:\n{package_name} x-add-version vcpkg\npour ajouter la nouvelle version du port.", + "VersionNotFoundInVersionsFile": "La version {version} n'a pas été trouvée dans le fichier de versions pour {package_name}.\nRun :\nvcpkg x-add-version {package_name}\npour ajouter la nouvelle version du port.", "VersionRejectedDueToBaselineMissing": "{path} a été rejeté car il utilise \"{json_field}\" et n'a pas de \"builtin-baseline\". Cela peut être corrigé en supprimant les utilisations de \"{json_field}\" ou en ajoutant une \"builtin-baseline\".\nVoir `vcpkg help versioning` pour plus d'informations.", "VersionRejectedDueToFeatureFlagOff": "{path} a été rejeté car il utilise \"{json_field}\" et l'indicateur de fonctionnalité `versions` est désactivé. Cela peut être résolu en supprimant \"{json_field}\" ou en activant l'indicateur de fonctionnalité `versions`.\nVoir `vcpkg help versioning` pour plus d'informations.", "VersionSchemeMismatch": "La base de données de versions déclare {version} comme {expected}, mais {path} la déclare comme {actual}. Les versions doivent être uniques, même si elles sont déclarées avec des schémas différents.\nCourir:\nvcpkg x-add-version {package_name} --overwrite-version\npour remplacer le schéma déclaré dans la base de données de versions par celui déclaré dans le port.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "« # » dans le texte de version doit être suivi d’une version de port (entier non négatif)", "VersionSpecMismatch": "Échec du chargement du port, car les versions sont incohérentes. Le fichier \"{path}\" contient la version {actual_version}, mais la base de données de versions indique qu’il doit être {expected_version}.", "VersionTableHeader": "Version", - "VersionVerifiedOK": "OK : {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK : {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "En attente de la fermeture des processus enfants...", "WaitingToTakeFilesystemLock": "en attente du verrouillage du système de fichiers sur {path}...", "WarnOnParseConfig": "J'ai trouvé les avertissements suivants dans la configuration {path} :", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "lors de la validation de la version : {version}", "WindowsOnlyCommand": "Cette commande prend uniquement en charge Windows.", "WroteNuGetPkgConfInfo": "A écrit les informations de configuration du package NuGet dans {path}", - "UnrecognizedCommand$": "Commande non reconnue '${p0}'", - "Use$ToGetHelp": "Utilisez ${p0} pour obtenir de l’aide", - "FatalTheRootFolder$CanNotBeCreated": "Irrécupérable : impossible de créer le dossier racine « ${p0} »", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Irrécupérable : impossible de créer le fichier de configuration global « ${p0} »", + "FatalTheRootFolder$CannotBeCreated": "Irrécupérable : impossible de créer le dossier racine « ${p0} »", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Irrécupérable : impossible de créer le fichier de configuration global « ${p0} »", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND n’a pas été définie", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "L’exécution de vcpkg en interne a retourné un code de sortie différent de zéro : ${p0}", "failedToDownloadFrom$": "échec du téléchargement à partir de ${p0}", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "la description doit être de type 'string', '${p0}' trouvé", "optionsShouldBeASequenceFound$": "les options doivent être une séquence, '${p0}' trouvé", "DuplicateKeysDetectedInManifest$": "Clés en double détectées dans le manifeste : « ${p0} »", - "in$Skipping$BecauseItIsA$": "dans ${p0}${p1} ignoré, car il s’agit d’un ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "aucun fichier postscript : réexécutez avec la fonction shell vcpkg au lieu de l’exécutable", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Définissez le double ${p0} pendant l’activation. La nouvelle valeur remplacera l’ancienne.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "Outil dupliqué ${p0} déclaré pendant l’activation. La nouvelle valeur remplacera l’ancienne.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(progression inconnue)", "verifying": "vérification", "downloading$$": "téléchargement en cours de ${p0} -> ${p1}", - "unpacking": "décompression", "unpacking$": "décompression de ${p0}", "Installing$": "Installation en cours de « ${p0} »...", "$AlreadyInstalled": "${p0} est déjà installé.", "Downloading$": "Téléchargement en cours de « ${p0} »...", "Unpacking$": "Décompression de ${p0}...", "ErrorInstalling$$": "Erreur lors de l’installation de ${p0} – ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "Valeur unique attendue pour ${p0} : plusieurs valeurs trouvées", - "Synopsis": "Synopsis", - "Description": "Description", - "Switches": "Commutateurs", - "SeeAlso": "Afficher aussi", "error": "erreur :", "warning": "avertissement :", + "ExpectedASingleValueFor$FoundMultiple": "Valeur unique attendue pour ${p0} : plusieurs valeurs trouvées", "ExpectedASingleValueFor$": "Valeur unique attendue pour « --${p0} ».", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "En supposant que « ${p0} » soit correct, fournissez un hachage dans les métadonnées d’artefact pour supprimer ce message.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "Le fichier téléchargé « ${p0} » n’avait pas le hachage correct (${p1} : ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "Une chaîne ${p0} non correspondante a été trouvée dans « ${p1} ». Pour un littéral ${p2}, utilisez ${p3}${p4} à la place.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "Impossible de trouver une valeur pour {${p0}} dans « ${p1} ». Pour écrire la valeur littérale, utilisez « {{${p2}}} » à la place.", "MatchedMoreThanOneInstallBlock$": "Plusieurs blocs d’installation correspondants [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Acquiert tout ce qui est référencé par un projet, sans activation", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "Cela permet au consommateur de prétélécharger les outils requis pour un projet.", "UnableToFindProjectInFolderorParentFoldersFor$": "Projet introuvable dans le dossier (ou les dossiers parents) pour ${p0}", "UnableToAcquireProject": "Impossible d’acquérir un projet", - "AcquireArtifactsInTheRegistry": "Acquérir des artefacts dans le Registre", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "Cela permet au consommateur d’acquérir (télécharger et décompresser) des artefacts. Les artefacts doivent être activés pour être utilisés", "NoArtifactsSpecified": "Aucun artefact spécifié", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Plusieurs packages spécifiés, mais un nombre inégal de commutateurs ${p0}", "NoArtifactsAreAcquired": "Aucun artefact n’est acquis", "AllArtifactsAreAlreadyInstalled": "Tous les artefacts sont déjà installés", "$ArtifactsInstalledSuccessfully": "${p0} artefacts correctement installés", "InstallationFailedStopping": "Échec de l’installation -- arrêt", - "ActivatesTheToolsRequiredForAProject": "Active les outils nécessaires à un projet", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "Cela permet au consommateur d’activer les outils nécessaires à un projet. Si les outils ne sont pas déjà installés, ils seront forcés à être téléchargés et installés avant l’activation.", - "AddsAnArtifactToTheProject": "Ajoute un artefact au projet", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "Cela permet au consommateur d’ajouter un artefact au projet. Cette opération active également le projet.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Plusieurs artefacts spécifiés, mais un nombre inégal de commutateurs ${p0}", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Tentative d’ajout d’un artefact [${p0}]:${p1} mais n’a pas pu déterminer le Registre à utiliser.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Tentative d’ajout du registre ${p0} en tant que ${p1}, mais il était déjà ${p2}. Ajoutez manuellement ${p3} à ce projet et réessayez.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Exécuter \\'vcpkg activate\\' pour l’appliquer au terminal actuel", - "ManagesTheDownloadCache": "Gère le cache de téléchargement", "DownloadsFolderCleared$": "Dossier des téléchargements effacé (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "nettoie tout (cache, artefacts installés)", - "cleansOutTheDownloadsCache": "nettoie le cache des téléchargements", - "removesAllTheArtifactsThatAreInstalled": "supprime tous les artefacts installés", - "cleansUp": "nettoie", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Autorise l’utilisateur à nettoyer le cache, les artefacts installés, etc.", "InstalledArtifactFolderCleared$": "Dossier d’artefacts installé effacé (${p0}) ", "CacheFolderCleared$": "Dossier de cache effacé (${p0}) ", - "DeactivatesTheCurrentSession": "Désactive la session active", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "Cela permet au consommateur de supprimer les paramètres d’environnement pour la session actuellement active.", - "DeletesAnArtifactFromTheArtifactFolder": "Supprime un artefact du dossier d’artefacts", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "Cela permet au consommateur de supprimer un artefact du disque.", "DeletingArtifact$From$": "Suppression de l’artefact ${p0} de ${p1}", - "FindArtifactsInTheRegistry": "Rechercher des artefacts dans le Registre", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "Cela permet à l’utilisateur de rechercher des artefacts en fonction de certains critères.", "NoArtifactsFoundMatchingCriteria$": "Artefacts correspondant aux critères introuvables : ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Génère les propriétés MSBuild pour une activation sans téléchargement pour un projet", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props nécessite --msbuild-props", "UnableToActivateProject": "Impossible d’activer le projet", - "theNameOfTheCommandForWhichYouWantHelp": "le nom de la commande pour laquelle vous souhaitez obtenir de l’aide", - "getHelpOn$OrOneOfTheCommands": "aide sur ${p0} ou l’une des commandes", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Obtient une aide détaillée sur ${p0} ou l’une des commandes", - "Arguments": "Arguments :", - "Use$ToGetTheListOfAvailableCommands": "Utilisez ${p0} pour obtenir la liste des commandes disponibles", - "Usage": "Utilisation", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "Commandes ${p0} disponibles :", - "ListsTheArtifacts": "Répertorie les artefacts", - "ThisAllowsTheConsumerToListArtifacts": "Cela permet au consommateur de lister les artefacts.", - "regenerateTheIndexForARegistry": "régénérer l’index d’un Registre", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "Cela permet à l’utilisateur de régénérer les fichiers ${p0} pour un registre ${p1}.", "RegeneratingIndexFor$": "Régénération de l’index pour ${p0}", "RegenerationCompleteIndexContains$MetadataFiles": "Régénération terminée. L’index contient ${p0} fichiers de métadonnées", "Registry$ContainsNoArtifacts": "Registre : « ${p0} » ne contient aucun artefact.", "error$": "erreur ${p0} : ", - "RemovesAnArtifactFromAProject": "Supprime un artefact d’un projet", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "Cela permet au consommateur de supprimer un artefact du projet. Force la réactivation dans cette fenêtre.", "Removing$FromProjectManifest": "Suppression de ${p0} du manifeste du projet", "unableToFindArtifact$InTheProjectManifest": "l’artefact ${p0} est introuvable dans le manifeste du projet", - "updateTheRegistryFromTheRemote": "mettre à jour le Registre à partir du serveur distant", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Cette opération télécharge le contenu le plus récent du Registre à partir du service distant.", - "DownloadingRegistryData": "Téléchargement des données du Registre", - "Updated$RegistryContains$MetadataFiles": "${p0} mis à jour. le Registre contient ${p1} fichiers de métadonnées", - "UnableToDownloadRegistrySnapshot": "Impossible de télécharger l’instantané du Registre", - "UnableToFindRegistry$": "Impossible de trouver le registre ${p0}", - "ArtifactRegistryDataIsNotLoaded": "Les données du Registre d’artefacts ne sont pas chargées", - "AttemptingToUpdateArtifactRegistry": "Tentative de mise à jour du Registre d’artefacts", - "UnableToLoadRegistryIndex": "Impossible de charger l’index de Registre", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Active instantanément un artefact en dehors du projet", - "ThisWillInstantlyActivateAnArtifact": "Cette opération active instantanément un artefact.", + "Updated$ItContains$MetadataFiles": "Mise à jour de ${p0}. Il contient des fichiers de métadonnées ${p1}.", + "UnableToDownload$": "Impossible de télécharger ${p0}.", + "$CouldNotBeUpdatedItCouldBeMalformed": "Impossible de mettre à jour ${p0} ; il est peut-être mal formé.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "La commande x-update-registry télécharge les nouvelles informations de Registre et ne peut donc pas être utilisée avec les registres locaux. Voulez-vous dire que x-regénérer ${p0} ?", + "UnableToFindRegistry$": "Le Registre ${p0} est introuvable.", "NoArtifactsAreBeingAcquired": "Aucun artefact n’est en cours d’acquisition", - "removesAllFilesInTheLocalCache": "supprime tous les fichiers du cache local", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "active le mode débogage, affiche les messages internes relatifs au fonctionnement de ${p0}", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "poursuit l’action (potentiellement dangereuse) sans confirmation", - "showsTheinstalledArtifacts": "affiche les artefacts _installed_", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Vider les variables d’environnement et d’autres propriétés dans un fichier JSON avec le chemin fourni par l’utilisateur.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Chemin d’accès complet au fichier dans lequel les propriétés MSBuild seront écrites.", - "ApplyAnyDeprecationFixups": "Appliquer tous les correctifs de désapprobation.", - "overrideThePathToTheProjectFolder": "substituer le chemin d’accès au dossier du projet", - "UnableToFindProjectEnvironment$": "Impossible de trouver l’environnement de projet ${p0}", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "active le mode détaillé, affiche des messages détaillés sur le processus", - "aVersionOrVersionRangeToMatch": "une version ou une plage de versions à faire correspondre" + "UnableToFindProjectEnvironment$": "Impossible de trouver l’environnement de projet ${p0}" } diff --git a/locales/messages.it.json b/locales/messages.it.json index 8789de6e8f..74fc37d3b5 100644 --- a/locales/messages.it.json +++ b/locales/messages.it.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "un registro incorporato", "AConfigurationObject": "un oggetto di configurazione", "ADateVersionString": "una stringa versione della data", + "ADefaultFeature": "una funzionalità predefinita", "ADemandObject": "un oggetto richiesta", "ADependency": "una dipendenza", + "ADependencyFeature": "una funzionalità di una dipendenza", "ADictionaryOfContacts": "un dizionario di contatti", "AFeature": "una funzionalità", + "AFeatureName": "un nome di funzionalità", "AFilesystemRegistry": "un registro del file system", "AGitObjectSha": "un oggetto Git SHA", "AGitReference": "un riferimento GIT (ad esempio, un ramo)", @@ -37,19 +40,19 @@ "AStringStringDictionary": "una \"stringa\": dizionario \"stringa\"", "AUrl": "un url", "AVcpkgRepositoryCommit": "un commit del repository vcpkg", - "AVersionConstraint": "una vincolo della versione", + "AVersionConstraint": "un vincolo di versione", "AVersionDatabaseEntry": "una voce del database di versione", "AVersionObject": "un oggetto versione", "AVersionOfAnyType": "una versione di qualsiasi tipo", "AddArtifactOnlyOne": "'{command_line}' può aggiungere un solo artefatto alla volta.", "AddCommandFirstArg": "Il primo parametro da aggiungere deve essere 'artifact' o 'port'.", "AddFirstArgument": "Il primo argomento di '{command_line}' deve essere 'artifact' o 'port'.", - "AddHelp": "Aggiunge la porta o l'artefatto indicati al manifesto associato alla directory corrente.", "AddPortRequiresManifest": "'{command_line}' richiede un file manifesto attivo.", "AddPortSucceeded": "Aggiunta delle porte al file vcpkg.json completata.", "AddRecurseOption": "Se si è certi di volerli rimuovere, eseguire il comando con l'opzione --recurse.", "AddTripletExpressionNotAllowed": "Le espressioni triple non sono consentite in questo punto. È consigliabile modificare '{package_name}:{triplet}' in '{package_name}'.", "AddVersionAddedVersionToFile": "ha aggiunto la versione {version} a {path}", + "AddVersionArtifactsOnly": "--version è solo artefatto e non può essere utilizzato con la porta di aggiunta vcpkg", "AddVersionCommitChangesReminder": "È stato eseguito il commit delle modifiche?", "AddVersionCommitResultReminder": "Non dimenticarsi di eseguire il commit del risultato.", "AddVersionDetectLocalChangesError": "il rilevamento delle modifiche locali verrà ignorato a causa di un formato imprevisto nell'output dello stato GIT", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "i file archiviati per {package_name} sono stati modificati ma la versione non è stata aggiornata", "AddVersionPortFilesShaUnchanged": "i file archiviati di {package_name} sono invariati rispetto alla versione {version}", "AddVersionPortHasImproperFormat": "Il formato di {package_name} non è corretto", - "AddVersionSuggestNewVersionScheme": "Usare lo schema di versione \"{new_scheme}\" anziché \"{old_scheme}\" nella porta \"{package_name}\".\nUsare --{option} per disabilitare il controllo.", + "AddVersionSuggestNewVersionScheme": "Usare lo schema della versione \"{new_scheme}\" anziché \"{old_scheme}\" nella porta \"{package_name}\".\nUsare --{option} per disabilitare questo controllo.", "AddVersionUnableToParseVersionsFile": "non è possibile analizzare il file delle versioni {path}", "AddVersionUncommittedChanges": "sono presenti modifiche senza commit per {package_name}", "AddVersionUpdateVersionReminder": "La versione o la versione della porta è stata aggiornata?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} è già installato", "AlreadyInstalledNotHead": "{spec} è già installato. Non verrà eseguita la creazione da HEAD", "AmbiguousConfigDeleteConfigFile": "Configurazione vcpkg ambigua fornita sia dal manifesto che dal file di configurazione.\n-- Eliminare il file di configurazione {path}", + "AnArrayOfDefaultFeatures": "una matrice di funzionalità predefinite", "AnArrayOfDependencies": "un array di dipendenze", "AnArrayOfDependencyOverrides": "un array di override dipendenze", + "AnArrayOfFeatures": "una matrice di funzionalità", "AnArrayOfIdentifers": "un array di identificatori", "AnArrayOfOverlayPaths": "un array di percorsi di sovrimpressione", "AnArrayOfOverlayTripletsPaths": "un array di percorsi triplette sovrapposti", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "Nel computer è in corso un'altra installazione, con sospensione di 6 sec. prima di riprovare.", "AppliedUserIntegration": "Integrazione a livello di utente applicata per questa radice vcpkg.", "ApplocalProcessing": "Elaborazione applocal vcpkg: {path}", + "ArtifactsBootstrapFailed": "Vcpkg-artifacts non è installato e non ne è stato possibile eseguire il bootstrap.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts non è installato e non può essere installato perché si presuppone che VCPKG_ROOT sia di sola lettura. La reinstallazione di vcpkg con 'one liner' potrebbe risolvere il problema.", + "ArtifactsNotOfficialWarning": "Uso di vcpkg-artifacts con un elemento non ufficiale ", "ArtifactsOptionIncompatibility": "--{option} non ha alcun effetto sulla ricerca dell'artefatto.", + "ArtifactsOptionJson": "Percorso completo del file JSON in cui vengono registrate le variabili di ambiente e altre proprietà", + "ArtifactsOptionMSBuildProps": "Percorso completo del file in cui verranno scritte le proprietà di MSBuild", + "ArtifactsOptionVersion": "Una versione o un intervallo di versioni da abbinare; valido solo per gli artefatti", + "ArtifactsOptionVersionMismatch": "Il numero di opzioni --version deve corrispondere al numero di elementi denominati", + "ArtifactsSwitchARM": "Forza il rilevamento dell'host su ARM durante l'acquisizione di artefatti", + "ArtifactsSwitchARM64": "Forza il rilevamento dell'host su ARM64 durante l'acquisizione di artefatti", + "ArtifactsSwitchAll": "Aggiorna tutti i registri di artefatti noti", + "ArtifactsSwitchAllLanguages": "Acquisisce tutti i file di linguaggio durante l'acquisizione degli artefatti", + "ArtifactsSwitchForce": "Forza la riacquisizione se un artefatto è già stato acquisito", + "ArtifactsSwitchFreebsd": "Forza il rilevamento dell'host in FreeBSD durante l'acquisizione di artefatti", + "ArtifactsSwitchLinux": "Forza il rilevamento dell'host su Linux durante l'acquisizione di artefatti", + "ArtifactsSwitchNormalize": "Applica tutte le correzioni deprecate", + "ArtifactsSwitchOnlyOneHostPlatform": "È possibile impostare solo una piattaforma host (--x64, --x86, --arm, --arm64).", + "ArtifactsSwitchOnlyOneOperatingSystem": "È possibile impostare un solo sistema operativo (--windows, --osx, --linux, --freebsd).", + "ArtifactsSwitchOnlyOneTargetPlatform": "È possibile impostare solo una piattaforma di destinazione (--target:x64, --target:x86, --target:arm, --target:arm64).", + "ArtifactsSwitchOsx": "Forza il rilevamento host in MacOS durante l'acquisizione di artefatti", + "ArtifactsSwitchTargetARM": "Imposta il rilevamento della destinazione su ARM durante l'acquisizione di artefatti", + "ArtifactsSwitchTargetARM64": "Imposta il rilevamento della destinazione su ARM64 durante l'acquisizione di artefatti", + "ArtifactsSwitchTargetX64": "Imposta il rilevamento di destinazione su x64 durante l'acquisizione di artefatti", + "ArtifactsSwitchTargetX86": "Imposta la destinazione su x86 durante l'acquisizione di artefatti", + "ArtifactsSwitchWindows": "Forza il rilevamento host in Windows durante l'acquisizione di artefatti", + "ArtifactsSwitchX64": "Forza il rilevamento dell'host su x64 durante l'acquisizione di artefatti", + "ArtifactsSwitchX86": "Forza il rilevamento host su x86 durante l'acquisizione di artefatti", "AssetCacheProviderAcceptsNoArguments": "argomenti imprevisti: '{value}' non accetta argomenti", - "AssetSourcesArg": "Aggiungere le origini per la memorizzazione nella cache degli asset. Vedere 'vcpkg help assetcaching'.", + "AssetSourcesArg": "Origini di memorizzazione nella cache degli asset. Vedere \"memorizzazione nella cache asset guida vcpkg\"", "AttemptingToFetchPackagesFromVendor": "Tentativo di recupero di {count} pacchetti da {vendor}", "AttemptingToSetBuiltInBaseline": "tentativo di impostare builtin-baseline in vcpkg.json durante l'override del registro di sistema predefinito in vcpkg-configuration.json.\nVerrà usato il registro di sistema predefinito da vcpkg-configuration.json.", "AuthenticationMayRequireManualAction": "Uno o più provider di credenziali {vendor} hanno richiesto un'azione manuale. Aggiungere l'origine binaria 'interactive' per consentire l'interattività.", "AutoSettingEnvVar": "-- Impostazione automatica delle variabili di ambiente \"{env_var}\" su \"{url}\".", "AutomaticLinkingForMSBuildProjects": "Tutti i progetti MSBuild C++ possono ora #include qualsiasi libreria installata. Il collegamento verrà gestito automaticamente. L'installazione di nuove librerie le renderà immediatamente disponibili.", - "AvailableArchitectureTriplets": "Triplet di architettura disponibili:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 e versioni successive può ora #includere qualsiasi libreria installata. Il collegamento verrà gestito automaticamente. L'installazione di nuove librerie le renderà immediatamente disponibili.", "AvailableHelpTopics": "Argomenti della guida disponibili:", "AzUrlAssetCacheRequiresBaseUrl": "argomenti imprevisti: la configurazione dell'asset 'azurl' richiede un URL di base", "AzUrlAssetCacheRequiresLessThanFour": "argomenti imprevisti: la configurazione dell'asset 'azurl' richiede meno di 4 argomenti", "BaselineConflict": "La specifica di vcpkg-configuration.default-registry in un file manifesto entra in conflitto con la baseline predefinita.\nRimuovere una di queste impostazioni in conflitto.", "BaselineFileNoDefaultField": "Il file baseline nel commit {commit_sha} non è valido (nessun campo \"default\").", - "BaselineFileNoDefaultFieldPath": "file baseline in {path} non valido (nessun campo \"predefinito\")", "BaselineGitShowFailed": "durante il checkout della baseline dal commit '{commit_sha}' non è stato possibile eseguire 'git show' versions/baseline.json. È possibile risolvere il problema recuperando i commit con 'git fetch'.", "BaselineMissing": "Versione baseline non trovata. Eseguire:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Aggiorna database delle versioni\"\nper impostare {version} come versione baseline.", - "BaselineMissingDefault": "Il file baseline.json del commit '\"{commit_sha}\"' nel repository {url} non è valido (non contiene un campo \"default\").", - "BinarySourcesArg": "Aggiungere le origini per la memorizzazione nella cache binaria. Vedere 'vcpkg help binarycaching'.", + "BinaryCacheVendorHTTP": "Server HTTP", + "BinarySourcesArg": "Origini binarie di memorizzazione nella cache. Vedere 'memorizzazione nella cache binaria guida vcpkg'", "BinaryWithInvalidArchitecture": "{path}\n Previsto: {expected}, ma {actual}", "BuildAlreadyInstalled": "{spec} è già installato; rimuovere {spec} prima di provare a crearlo.", "BuildDependenciesMissing": "Il comando di compilazione richiede che tutte le dipendenze siano già installate.\nMancano le dipendenze seguenti:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "OPERAZIONE RIUSCITA", "BuildResultSummaryHeader": "RIEPILOGO PER {triplet}", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(Sperimentale) Specificare la directory radice dell'albero di compilazione.", + "BuildTreesRootDir": "Directory di compilazione (sperimentale)", "BuildTroubleshootingMessage1": "Assicurarsi di usare i file di porta più recenti con 'git pull' e 'vcpkg update'.\nQuindi verificare la presenza di problemi noti in:", "BuildTroubleshootingMessage2": "È possibile inviare un nuovo problema all'indirizzo:", "BuildTroubleshootingMessage3": "Includere 'Errore di compilazione [{package_name}]' nel titolo del report sui bug, le seguenti informazioni sulla versione nella descrizione del bug, e allegare tutti i log di errore rilevanti di cui sopra.", "BuildTroubleshootingMessage4": "Usare il modello precompilato di {path} per la creazione del report del problema.", - "BuildTroubleshootingMessageGH": "È anche possibile sommare un problema eseguendo (è necessario installare l'interfaccia della riga di comando di GitHub):", + "BuildTroubleshootingMessageGH": "È anche possibile inviare un problema eseguendo (è necessario installare l'interfaccia della riga di comando di GitHub):", "BuildingFromHead": "Creazione di {spec} da HEAD...", "BuildingPackage": "Creazione di {spec}...", "BuildingPackageFailed": "compilazione {spec} non riuscita con: {build_result}", "BuildingPackageFailedDueToMissingDeps": "a causa delle seguenti dipendenze mancanti:", - "BuiltInTriplets": "Triplets predefiniti vcpkg:", + "BuiltInTriplets": "Triplette integrate:", "BuiltWithIncorrectArchitecture": "I file seguenti sono stati compilati per un'architettura non corretta:", "CISettingsExclude": "Elenco delimitato da virgole di porte da ignorare", "CISettingsOptCIBase": "Percorso del file ci.baseline.txt. Usato per ignorare le porte e rilevare regressioni.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "File per l'output di tutti gli hash dei pacchetti determinati", "CISettingsOptParentHashes": "File per la lettura degli hash dei pacchetti per uno stato CI padre, per ridurre il set di pacchetti modificati", "CISettingsOptSkippedCascadeCount": "Asserisce che il numero di --exclude e skip di supports corrisponda esattamente a questo numero", - "CISettingsOptXUnit": "File per l'output dei risultati in formato XUnit (interno)", - "CISettingsVerifyGitTree": "Verifica che ogni oggetto dell'albero GIT corrisponda alla versione dichiarata (molto lento)", - "CISettingsVerifyVersion": "Stampa il risultato per ogni porta anziché solo gli errori.", - "CISwitchOptAllowUnexpectedPassing": "Indica che i risultati 'Passaggio, rimozione dall'elenco errori' non devono essere generati.", + "CISettingsOptXUnit": "File per l'output dei risultati in formato XUnit", + "CISettingsVerifyGitTree": "Verifica che ogni oggetto albero Git corrisponda alla versione dichiarata (molto lenta)", + "CISettingsVerifyVersion": "Stampa il risultato per ogni porta anziché solo gli errori", + "CISkipInstallation": "I pacchetti seguenti sono già installati e non verranno compilati di nuovo:", + "CISwitchOptAllowUnexpectedPassing": "Elimina i risultati di 'Passaggio, rimozione dall'elenco di errori'", "CISwitchOptDryRun": "Stampa il piano senza esecuzione", - "CISwitchOptRandomize": "Scegli ordine di installazione in modo casuale", - "CISwitchOptSkipFailures": "Indica che le porte contrassegnate con '=fail' nel file ci.baseline.txt devono essere ignorate.", - "CISwitchOptXUnitAll": "Segnala anche le porte non modificate all'output XUnit (interno)", + "CISwitchOptRandomize": "Genera in modo casuale l'ordine di installazione", + "CISwitchOptSkipFailures": "Ignora le porte contrassegnate come '=fail' in ci.baseline.txt", + "CISwitchOptXUnitAll": "Segnala le porte non modificate nell'output XUnit", "CMakeTargetsUsage": "{package_name} fornisce destinazioni CMake:", "CMakeTargetsUsageHeuristicMessage": "# generato in modo euristico e potrebbe non essere corretto", "CMakeToolChainFile": "I progetti CMake devono usare: \"-DCMAKE_TOOLCHAIN_FILE={path}>", "CMakeUsingExportedLibs": "Per usare le librerie esportate nei progetti CMake, aggiungere {value} alla riga di comando di CMake.", - "CacheHelp": "L'argomento deve essere una sottostringa da cercare oppure nessun argomento per visualizzare tutte le librerie memorizzate nella cache.", "CheckedOutGitSha": "Git SHA estratto: {commit_sha}", "CheckedOutObjectMissingManifest": "L'oggetto estratto non contiene un file CONTROL o vcpkg.json.", "ChecksFailedCheck": "vcpkg si è arrestato in modo anomalo; non sono disponibili altri dettagli.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "l'aggiornamento di vcpkg eseguendo di nuovo bootstrap-vcpkg può risolvere questo errore.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing può essere usato solo se viene fornita una baseline tramite --ci-baseline.", "CiBaselineDisallowedCascade": "REGRESSIONE: {spec} a catena, ma è necessario passarla. ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "REGRESSIONE: {spec} indipendente non riuscito con {build_result}.", "CiBaselineRegression": "REGRESSIONE: {spec} non riuscito con {build_result}. Se previsto, aggiungere {spec}=fail a {path}.", "CiBaselineRegressionHeader": "REGRESSIONI:", + "CiBaselineUnexpectedFail": "REGRESSIONE: {spec} è contrassegnato come non riuscito ma non supportato per {triplet}.", + "CiBaselineUnexpectedFailCascade": "REGRESSIONE: {spec} è contrassegnato come non riuscito ma una dipendenza non è supportata per {triplet}.", "CiBaselineUnexpectedPass": "PASSAGGIO, RIMOZIONE DALL'ELENCO ERRORI: {spec} ({path}).", "ClearingContents": "Cancellazione del contenuto di {path}", "CmakeTargetsExcluded": "nota: {count} destinazioni aggiuntive non vengono visualizzate.", - "CmdAddVersionOptAll": "Elabora le versioni per tutte le porte.", - "CmdAddVersionOptOverwriteVersion": "Sovrascrivi 'git-tree' di una versione esistente.", - "CmdAddVersionOptSkipFormatChk": "Ignora il controllo della formattazione dei file vcpkg.json.", - "CmdAddVersionOptSkipVersionFormatChk": "Ignora il controllo del formato della versione.", - "CmdAddVersionOptVerbose": "Stampa i messaggi di esito positivo anziché solo gli errori.", + "CmdAcquireExample1": "acquisizione vcpkg ", + "CmdAcquireProjectSynopsis": "Acquisisce tutti gli artefatti a cui fa riferimento un manifesto", + "CmdAcquireSynopsis": "Acquisisce l'artefatto denominato", + "CmdActivateSynopsis": "Attiva gli artefatti da un manifesto", + "CmdAddExample1": "aggiunta porta vcpkg ", + "CmdAddExample2": "vcpkg aggiunge l'artefatto ", + "CmdAddSynopsis": "Aggiunge la dipendenza al manifesto", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "Elabora le versioni per tutte le porte", + "CmdAddVersionOptOverwriteVersion": "Sovrascrive l'albero Git di una versione esistente", + "CmdAddVersionOptSkipFormatChk": "Ignora il controllo di formattazione dei file vcpkg.json", + "CmdAddVersionOptSkipVersionFormatChk": "Ignora il controllo del formato della versione", + "CmdAddVersionOptVerbose": "Stampa i messaggi di esito positivo anziché solo gli errori", + "CmdAddVersionSynopsis": "Aggiunge una versione al database della versione", + "CmdBootstrapStandaloneSynopsis": "Esegue il bootstrap di una radice vcpkg solo da un file binario vcpkg", + "CmdBuildExample1": "build vcpkg ", + "CmdBuildExternalExample1": "vcpkg build-external < percorso origine>", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "Compila la porta da un percorso", + "CmdBuildSynopsis": "Compila una porta", + "CmdCacheExample1": "cache vcpkg ", + "CmdCacheSynopsis": "Elenca le specifiche dei pacchetti", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "Verifica se una porta è supportata senza compilarla", + "CmdCiCleanSynopsis": "Cancella tutti i file da preparare per un'esecuzione CI", + "CmdCiSynopsis": "Prova a compilare tutte le porte per il test CI", + "CmdCiVerifyVersionsSynopsis": "Controlla l'integrità del database della versione", "CmdContactOptSurvey": "Avvia il browser predefinito per il sondaggio vcpkg corrente", - "CmdDependInfoOptDGML": "Crea il grafico in base al formato DGML", - "CmdDependInfoOptDepth": "Mostra profondità ricorsione nell'output", - "CmdDependInfoOptDot": "Crea il grafico in base al formato DOT", - "CmdDependInfoOptMaxRecurse": "Imposta profondità massima di ricorsione. Il valore -1 indica nessun limite", - "CmdDependInfoOptSort": "Imposta l'ordinamento per l'elenco delle dipendenze. I valori accettati sono: lessicografico, topologico (predefinito), albero x, inverso", - "CmdEditOptAll": "Apri l'editor nella porta e nella sottocartella buildtree specifica della porta", - "CmdEditOptBuildTrees": "Apri l'editor nella sottocartella buildtree specifica della porta", - "CmdEnvOptions": "Aggiungi {path} installato a {env_var}", + "CmdCreateExample1": "creazione vcpkg ", + "CmdCreateExample2": "creazione vcpkg my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "creazione vcpkg ", + "CmdDeactivateSynopsis": "Rimuove tutte le attivazioni degli artefatti dalla shell corrente", + "CmdDependInfoExample1": "informazioni-dipend vcpkg ", + "CmdDependInfoFormatConflict": "Formati specificati in conflitto. Viene accettato solo uno fra i formati --format, --dgml o --dot.", + "CmdDependInfoFormatHelp": "Sceglie il formato di output, uno di 'list', 'tree', 'mermaid', 'dot' o 'dgml'", + "CmdDependInfoFormatInvalid": "--format={value} non è un formato riconosciuto. --format deve essere `list`, `tree`, `dot` o `dgml`.", + "CmdDependInfoOptDepth": "Mostra la profondità della ricorsione nell'output 'elenco'", + "CmdDependInfoOptMaxRecurse": "Imposta la profondità massima di ricorsione. Il valore predefinito non è un limite", + "CmdDependInfoOptSort": "Sceglie l'ordinamento per il formato `list`, uno fra `lexicographical`, `topological` (impostazione predefinita) e `reverse`", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth può essere usato solo con i formati `list` e `tree`.", + "CmdDependInfoXtreeTree": "--sort=x-tree non può essere usato con formati diversi da albero", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Scarica un file", + "CmdEditExample1": "modifica vcpkg ", + "CmdEditOptAll": "Apre l'editor nella porta e nella sottocartella dell'albero di compilazione specifica della porta", + "CmdEditOptBuildTrees": "Apre l'editor nella sottocartella dell'albero di compilazione specifico della porta", + "CmdEnvOptions": "Aggiunge {path} installato a {env_var}", + "CmdExportEmptyPlan": "Rifiuto di creare un'esportazione di zero pacchetti. Installare i pacchetti prima dell'esportazione.", + "CmdExportExample1": "esportazione vcpkg [--nuget] [--directory=out_dir]", "CmdExportOpt7Zip": "Esporta in un file 7zip (.7z)", - "CmdExportOptChocolatey": "Esporta un pacchetto Chocolatey (funzionalità sperimentale)", - "CmdExportOptDebug": "Abilita debug prefab", - "CmdExportOptDryRun": "Non esportare effettivamente.", + "CmdExportOptChocolatey": "Esporta un pacchetto Chocolatey (sperimentale)", + "CmdExportOptDebug": "Abilita il debug prefab", + "CmdExportOptDryRun": "Non esporta effettivamente", "CmdExportOptIFW": "Esporta in un programma di installazione basato su IFW", "CmdExportOptInstalled": "Esporta tutti i pacchetti installati", "CmdExportOptMaven": "Abilita Maven", "CmdExportOptNuget": "Esporta un pacchetto NuGet", - "CmdExportOptPrefab": "Esporta in formato Prefab", + "CmdExportOptPrefab": "Esporta nel formato prefab", "CmdExportOptRaw": "Esporta in una directory non compressa", "CmdExportOptZip": "Esporta in un file ZIP", - "CmdExportSettingChocolateyMaint": "Specificare il gestore per il pacchetto Chocolatey esportato (funzionalità sperimentale)", - "CmdExportSettingChocolateyVersion": "Specificare il suffisso di versione da aggiungere per il pacchetto Chocolatey esportato (funzionalità sperimentale)", - "CmdExportSettingConfigFile": "Specificare il percorso del file temporaneo per la configurazione del programma di installazione", - "CmdExportSettingInstallerPath": "Specificare il percorso del file per il programma di installazione esportato", - "CmdExportSettingNugetDesc": "Specificare una descrizione per il pacchetto NuGet esportato", - "CmdExportSettingNugetID": "Specificare l'ID per il pacchetto NuGet esportato (esegue l'override di --output)", - "CmdExportSettingNugetVersion": "Specificare la versione per il pacchetto NuGet esportato", - "CmdExportSettingOutput": "Specificare il nome di output (usato per costruire il nome file)", - "CmdExportSettingOutputDir": "Specificare la directory di output per gli artefatti prodotti", - "CmdExportSettingPkgDir": "Specificare il percorso della directory temporanea per i pacchetti ricreati", + "CmdExportSettingChocolateyMaint": "Il gestore del pacchetto Chocolatey esportato (sperimentale)", + "CmdExportSettingChocolateyVersion": "Suffisso di versione da aggiungere per il pacchetto Chocolatey esportato (sperimentale)", + "CmdExportSettingConfigFile": "Percorso del file temporaneo per la configurazione del programma di installazione", + "CmdExportSettingInstallerPath": "Percorso del file per il programma di installazione esportato", + "CmdExportSettingNugetDesc": "Descrizione del pacchetto NuGet esportato", + "CmdExportSettingNugetID": "ID per il pacchetto NuGet esportato (esegue l'override di --output)", + "CmdExportSettingNugetVersion": "Versione del pacchetto NuGet esportato", + "CmdExportSettingOutput": "Nome di output (usato per costruire il nome file)", + "CmdExportSettingOutputDir": "Directory di output per gli artefatti prodotti", + "CmdExportSettingPkgDir": "Percorso della directory temporanea per i pacchetti compressi di nuovo", "CmdExportSettingPrefabArtifactID": "L'ID artefatto è il nome del progetto secondo le specifiche Maven", "CmdExportSettingPrefabGroupID": "GroupId identifica in modo univoco il progetto in base alle specifiche Maven", "CmdExportSettingPrefabVersion": "La versione è il nome del progetto secondo le specifiche Maven", - "CmdExportSettingRepoDir": "Specificare il percorso della directory per il repository esportato", - "CmdExportSettingRepoURL": "Specificare l'URL del repository remoto per il programma di installazione online", - "CmdExportSettingSDKMinVersion": "Versione minima supportata di Android SDK", + "CmdExportSettingRepoDir": "Percorso della directory per il repository esportato", + "CmdExportSettingRepoURL": "URL del repository remoto per il programma di installazione online", + "CmdExportSettingSDKMinVersion": "Versione minima dell'SDK supportata per Android", "CmdExportSettingSDKTargetVersion": "Versione Android SDK di destinazione", - "CmdFetchOptXStderrStatus": "Indirizza messaggi di stato/download a stderr anziché a stdout (gli errori vanno comunque a stdout)", - "CmdFormatManifestOptAll": "Formatta i file manifesto di tutte le porte.", - "CmdFormatManifestOptConvertControl": "Convertire i file CONTROL in file manifesto.", - "CmdGenerateMessageMapOptNoOutputComments": "Durante la generazione della mappa messaggi, escludi i commenti (utile per la generazione del file di localizzazione in inglese)", - "CmdInfoOptInstalled": "(sperimentale) Segnala i pacchetti installati anziché quelli disponibili", + "CmdExportSynopsis": "Crea una distribuzione autonoma delle porte installate", + "CmdFetchOptXStderrStatus": "Stampa i messaggi di stato/download in stderr anziché stdout (gli errori vengono comunque visualizzati in stdout)", + "CmdFetchSynopsis": "Recupera un elemento dal sistema o da Internet", + "CmdFindExample1": "trova porta vcpkg ", + "CmdFindExample2": "trova artefatto vcpkg < nome artefatto>", + "CmdFindSynopsis": "Trova una porta o un artefatto che può essere installato o attivato", + "CmdFormatManifestExample1": "formato-manifesto vcpkg ", + "CmdFormatManifestOptAll": "Formatta i file manifesto di tutte le porte", + "CmdFormatManifestOptConvertControl": "Converte i file CONTROL in file manifesto", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "Genera file msbuild con estensione props come se si attivassero le dipendenze dell'artefatto di un manifesto, senza acquisirle", + "CmdGenerateMessageMapOptNoOutputComments": "Esclude i commenti durante la generazione della mappa messaggi (utile per la generazione del file di localizzazione in inglese)", + "CmdHashExample1": "hash vcpkg ", + "CmdHashExample2": "hash vcpkg SHA256", + "CmdHashSynopsis": "Ottiene SHA256 o SHA512 di un file", + "CmdHelpCommandSynopsis": "Visualizza i dettagli della Guida per ", + "CmdHelpCommands": "guida ", + "CmdHelpCommandsSynopsis": "Visualizza l'elenco completo dei comandi, inclusi quelli rari non elencati qui", + "CmdHelpTopic": "guida ", + "CmdInfoOptInstalled": "(sperimentale) Segnala i pacchetti installati anziché disponibili", "CmdInfoOptTransitive": "(sperimentale) Segnala anche le dipendenze dei pacchetti installati", - "CmdNewOptApplication": "Crea un manifesto dell'applicazione (non richiede nome o versione).", - "CmdNewOptSingleFile": "Incorpora vcpkg-configuration.json in vcpkg.json.", - "CmdNewOptVersionDate": "Interpreta --version come data ISO 8601. (AAAA-MM-GG)", - "CmdNewOptVersionRelaxed": "Interpreta --version come versione numerica di tipo relaxed (numeri non negativi separati da punti).", - "CmdNewOptVersionString": "Interpreta --version come stringa senza alcun comportamento di ordinamento.", - "CmdNewSettingName": "Nome del nuovo manifesto.", - "CmdNewSettingVersion": "Versione del nuovo manifesto.", - "CmdRegenerateOptDryRun": "non esegue effettivamente l'azione, mostra solo ciò che verrebbe fatto", - "CmdRegenerateOptForce": "procede con l'azione (potenzialmente pericolosa) senza conferma", - "CmdRegenerateOptNormalize": "applica tutte le correzioni per deprecazione", - "CmdRemoveOptDryRun": "Stampa i pacchetti da rimuovere, ma non rimuoverli", - "CmdRemoveOptOutdated": "Selezionare tutti i pacchetti con versioni che non corrispondono ai file di porta", - "CmdRemoveOptRecurse": "Consenti la rimozione di pacchetti non specificati in modo esplicito nella riga di comando", - "CmdSetInstalledOptDryRun": "Non compilare o installare effettivamente", - "CmdSetInstalledOptNoUsage": "Non stampare le informazioni sull'utilizzo di CMake dopo l'installazione.", - "CmdSetInstalledOptWritePkgConfig": "Scrive un file packages.config in formato NuGet da usare con la memorizzazione nella cache binaria esterna.\nPer altre informazioni, vedere 'vcpkg help binarycaching'.", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Crea un registro Git vuoto", + "CmdInstallExample1": "installazione vcpkg ...", + "CmdIntegrateSynopsis": "Integra vcpkg con computer, progetti o shell", + "CmdListExample2": "elenco vcpkg ", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "Crea un manifesto dell'applicazione (non richiede nome o versione)", + "CmdNewOptSingleFile": "Incorpora vcpkg-configuration.json in vcpkg.json", + "CmdNewOptVersionDate": "Interpreta --versione come data ISO 8601. (AAAA-MM-GG)", + "CmdNewOptVersionRelaxed": "Interpreta --versione come versione numerica di tipo relaxed (numeri non negativi separati da punti).", + "CmdNewOptVersionString": "Interpreta --versione come stringa senza alcun comportamento di ordinamento", + "CmdNewSettingName": "Nome del nuovo manifesto", + "CmdNewSettingVersion": "Versione del nuovo manifesto", + "CmdNewSynposis": "Crea un nuovo manifesto", + "CmdOwnsExample1": "vcpkg possiede ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "Differenze nelle versioni delle porte tra commit", + "CmdRegenerateOptDryRun": "Non esegue effettivamente l'azione, mostra solo le operazioni che verrebbero eseguite", + "CmdRegenerateOptForce": "Procede con l'azione (potenzialmente pericoloso) senza conferma", + "CmdRegenerateOptNormalize": "Applica eventuali correzioni deprecate", + "CmdRemoveExample1": "rimozione vcpkg ...", + "CmdRemoveOptDryRun": "Stampa i pacchetti da rimuovere, ma non li rimuove", + "CmdRemoveOptOutdated": "Rimuove tutti i pacchetti con versioni che non corrispondono al registro di sistema predefinito", + "CmdRemoveOptRecurse": "Consente la rimozione di pacchetti dipendenti non specificati in modo esplicito", + "CmdSearchExample1": "ricerca vcpkg ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "Non esegue effettivamente la compilazione o l'installazione", + "CmdSetInstalledOptNoUsage": "Non stampa le informazioni sull'utilizzo di CMake dopo l'installazione", + "CmdSetInstalledOptWritePkgConfig": "Scrive un file in formato NuGet packages.config da usare con la memorizzazione nella cache binaria esterna. Per altre informazioni, vedere 'vcpkg help binarycaching'", + "CmdSetInstalledSynopsis": "Installa, aggiorna o rimuove i pacchetti in modo che quelli installati corrispondano esattamente a quelli forniti", "CmdSettingCopiedFilesLog": "Percorso al log dei file copiati da creare", "CmdSettingInstalledDir": "Percorso all'albero installato da usare", "CmdSettingTLogFile": "Percorso al file tlog da creare", "CmdSettingTargetBin": "Percorso al file binario da analizzare", "CmdUpdateBaselineOptDryRun": "Stampa il piano senza esecuzione", - "CmdUpdateBaselineOptInitial": "aggiungi una `builtin-baseline` a un file vcpkg.json che non la contiene già", - "CmdUpgradeOptAllowUnsupported": "Anziché generare un errore di porta non supportata, continua con un avviso.", + "CmdUpdateBaselineOptInitial": "Aggiunge una 'builtin-baseline' a un file vcpkg.json che non lo contiene già", + "CmdUpdateBaselineSynopsis": "Aggiorna le baseline dei registri Git in un manifesto al commit HEAD di tali registri", + "CmdUpdateRegistryAll": "Aggiorna tutti i registri di artefatti noti", + "CmdUpdateRegistryAllExcludesTargets": "Non è possibile usare il comando di aggiornamento registri con il parametro --all per un elenco di registri artefatti", + "CmdUpdateRegistryAllOrTargets": "Il comando di aggiornamento registri richiede un elenco di nomi di registri artefatti o di URI da aggiornare oppure il parametro --all.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "Scarica nuovamente un registro artefatti", "CmdUpgradeOptNoDryRun": "Aggiorna realmente", "CmdUpgradeOptNoKeepGoing": "Interrompi l'installazione dei pacchetti in caso di errore", + "CmdUseExample1": "utilizzo vcpkg ", + "CmdUseSynopsis": "Attivare un singolo artefatto in questa shell", + "CmdVSInstancesSynopsis": "Elenchi rilevati istanze Visual Studio", "CmdXDownloadOptHeader": "Intestazione aggiuntiva da usare per il recupero da URL", "CmdXDownloadOptSha": "Hash del file da scaricare", - "CmdXDownloadOptSkipSha": "Non controllare l'hash SHA512 del file scaricato", - "CmdXDownloadOptStore": "Indica che il file deve essere archiviato anziché recuperato", + "CmdXDownloadOptSkipSha": "Ignora il controllo di SHA512 del file scaricato", + "CmdXDownloadOptStore": "Archivia il file in modo che non venga recuperato", "CmdXDownloadOptUrl": "URL per il download e l'archiviazione se mancante dalla cache", + "CmdZApplocalSynopsis": "Copia le dipendenze di un file binario dall'albero installato in cui si trova il percorso del file binario per la distribuzione locale dell'app", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "Numero di directory iniziali da rimuovere da tutti i percorsi", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", "CommandFailed": "Comando:\n{command_line}\nnon riuscito con i seguenti risultati:", - "Commands": "Comandi:", - "CommunityTriplets": "Triplet della community vcpkg:", + "CommunityTriplets": "Triplette della community:", "ComparingUtf8Decoders": "Confronto di Utf8Decoder con provenienza diversa; si tratta sempre di un errore", "CompressFolderFailed": "Impossibile comprimere la cartella “{path}”:", "ComputingInstallPlan": "Elaborazione del piano di installazione in corso...", "ConfigurationErrorRegistriesWithoutBaseline": "La configurazione definita in {path} non è valida.\n\nL'uso dei registri richiede che sia impostata una baseline per il Registro di sistema predefinito o che il Registro di sistema predefinito sia Null.\n\nPer altri dettagli, vedere {url}.", "ConfigurationNestedDemands": "[\"{json_field}\"] contiene un oggetto 'demands' annidato (gli oggetti 'demands' annidati non hanno effetto)", "ConflictingFiles": "I file seguenti sono già installati in {path} e sono in conflitto con {spec}", + "ConsideredVersions": "I seguenti eseguibili sono stati considerati ma rimossi a causa del requisito di versione di {version}:", "ConstraintViolation": "È stata trovata una violazione di vincolo:", "ContinueCodeUnitInStart": "è stata trovata un'unità di codice continua nella posizione iniziale", "ControlAndManifestFilesPresent": "Nella directory delle porte sono presenti sia un file manifesto che un file CONTROL: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "Database danneggiato.", "CorruptedInstallTree": "L'albero 'installato' vcpkg è danneggiato.", "CouldNotDeduceNugetIdAndVersion": "Non è stato possibile dedurre l'ID NuGet e la versione dal nome file: {path}", - "CouldNotFindBaseline": "Non è stato possibile trovare la baseline specificata in modo esplicito '\"{commit_sha}\"' nel file baseline {path}", - "CouldNotFindBaselineForRepo": "Non è stato possibile trovare la baseline '\"{commit_sha}\"' per il repository {package_name}", - "CouldNotFindBaselineInCommit": "Non è stato possibile trovare la baseline nel commit '\"{commit_sha}\"' dal repository {package_name}:", + "CouldNotFindBaselineInCommit": "Non è stato possibile trovare la baseline in {url} alle {commit_sha} per {package_name}.", "CouldNotFindGitTreeAtCommit": "non è stato possibile trovare l'albero GIT per 'versions' nel repository {package_name} nel commit {commit_sha}", "CouldNotFindToolVersion": "Non è stato possibile trovare in {path}", "CouldNotFindVersionDatabaseFile": "Non è statp possibile trovare il file di database delle versioni: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "La variabile di ambiente VCPKG_DEFAULT_BINARY_CACHE deve essere una directory (è: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "La variabile di ambiente VCPKG_DEFAULT_BINARY_CACHE deve essere assoluta (è: {path})", "DefaultBinaryCacheRequiresDirectory": "La variabile di ambiente VCPKG_DEFAULT_BINARY_CACHE deve essere una directory (è: {path})", - "DefaultBrowserLaunched": "Browser predefinito avviato in {url}.", + "DefaultFeatureCore": "la funzionalità \"core\" disattiva le funzionalità predefinite e quindi non può essere presente nell'elenco delle funzionalità predefinite", + "DefaultFeatureDefault": "la funzionalità \"predefinita\" fa riferimento al set di funzionalità predefinite e pertanto non può essere presente nell'elenco delle funzionalità predefinite", + "DefaultFeatureIdentifier": "i nomi delle funzionalità predefinite devono essere identificatori", "DefaultFlag": "Attivazione dell'impostazione predefinita --{option}.", "DefaultRegistryIsArtifact": "Il registro predefinito non può essere un registro artefatti.", - "DefaultTriplet": "A partire dalla versione di settembre 2023, la tripletta predefinita per le librerie vcpkg passerà da x86-windows alla tripletta host rilevata ({triplet}). Per risolvere il messaggio, aggiungere --triplet x86-windows per mantenere lo stesso comportamento.", + "DefaultTripletChanged": "Nella versione di settembre 2023 la tripletta predefinita per le librerie vcpkg è cambiata da x86-windows a tripletta host rilevata ({triplet}). Per il comportamento precedente, aggiungere --triplet x86-windows. Per eliminare questo messaggio, aggiungere --tripletta {triplet}.", "DeleteVcpkgConfigFromManifest": "-- In alternativa, rimuovere \"vcpkg-configuration\" dal file manifesto {path}.", + "DependencyFeatureCore": "la funzionalità \"core\" non può essere presente nell'elenco delle funzionalità di una dipendenza. Per disattivare le funzionalità predefinite, aggiungere \"default-features\": false.", + "DependencyFeatureDefault": "la funzionalità \"default\" non può essere presente nell'elenco delle funzionalità di una dipendenza. Per attivare le funzionalità predefinite, aggiungere \"default-features\": true.", + "DependencyGraphCalculation": "L'invio del grafico delle dipendenze è stato abilitato.", + "DependencyGraphFailure": "L'invio del grafico delle dipendenze non è riuscito.", + "DependencyGraphSuccess": "L'invio del grafico delle dipendenze è riuscito.", "DeprecatedPrefabDebugOption": "--prefab-debug è ora deprecato.", "DetectCompilerHash": "Rilevamento dell'hash del compilatore per la tripletta {triplet}...", "DocumentedFieldsSuggestUpdate": "Se si tratta di campi documentati che devono essere riconosciuti, provare ad aggiornare lo strumento vcpkg.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "Il file non ha l'hash previsto:\nURL: {url}\nFile: {path}\nHash previsto: {expected}\nHash effettivo: {actual}", "DownloadFailedRetrying": "Download non riuscito. Nuovo tentativo dopo {value}ms", "DownloadFailedStatusCode": "{url}: non riuscito: codice di stato {value}", - "DownloadRootsDir": "Specificare la directory radice dei download.\n(impostazione predefinita: {env_var})", + "DownloadRootsDir": "Scarica la directory (impostazione predefinita: {env_var})", "DownloadWinHttpError": "{url}: {system_api} non riuscito con codice di uscita {exit_code}", "DownloadedSources": "Origini scaricate per {spec}", "DownloadingPortableToolVersionX": "Non è stata trovata una versione appropriata di {tool_name} (versione richiesta v{version}) Download della versione portabile {version} di {tool_name} in corso...", "DownloadingTool": "Download di {tool_name} in corso...\n{url}->{path}", "DownloadingUrl": "Download di {url}", - "DownloadingVcpkgCeBundle": "Download del bundle vcpkg-artifacts {version} in corso...", - "DownloadingVcpkgCeBundleLatest": "Download del bundle vcpkg-artifacts più recente in corso...", "DownloadingVcpkgStandaloneBundle": "Download del bundle autonomo {version}.", "DownloadingVcpkgStandaloneBundleLatest": "Download del bundle autonomo più recente.", "DuplicatePackagePattern": "Il pacchetto \"{package_name}\" è duplicato.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "durante il rilevamento delle informazioni sul compilatore:\nIl contenuto del file di log in \"{path}\" è:", "ErrorIndividualPackagesUnsupported": "In modalità manifesto, 'vcpkg install' non supporta singoli argomenti del pacchetto.\nPer installare pacchetti aggiuntivi, modificare vcpkg.json ed eseguire 'vcpkg install' senza argomenti del pacchetto.", "ErrorInvalidClassicModeOption": "L'opzione --{option} non è supportata nella modalità classica e non è stato trovato alcun manifesto.", + "ErrorInvalidExtractOption": "--{option} deve essere impostato su un numero intero non negativo o su 'AUTO'.", "ErrorInvalidManifestModeOption": "L'opzione --{option} non è supportata nella modalità manifesto.", "ErrorMessage": "errore: ", "ErrorMessageMustUsePrintError": "Il messaggio denominato {value} inizia con Errore:, deve essere modificato in ErrorMessage anteponendolo al codice.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "Si sono verificati errori durante l'analisi di {path}.", "ErrorWhileWriting": "Si è verificato un errore durante la scrittura di {path}.", "ErrorsFound": "Sono stati trovati gli errori seguenti:", - "Example": "esempio:", + "ExamplesHeader": "Esempi:", "ExceededRecursionDepth": "Profondità ricorsiva superata.", "ExcludedPackage": "{spec} escluso", "ExcludedPackages": "I pacchetti seguenti sono esclusi:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Esportazione dello strumento di manutenzione in corso...", "ExportingPackage": "Esportazione di {package_name}...", "ExtendedDocumentationAtUrl": "Documentazione estesa disponibile all'indirizzo '{url}'.", + "ExtractHelp": "Estrae un archivio.", "ExtractingTool": "Estrazione di {tool_name} in corso...", "FailedPostBuildChecks": "Sono stati trovati {count} problemi di controllo post-compilazione. Per inviare queste porte ai cataloghi curati, correggere prima il portfile: {path}", "FailedToAcquireMutant": "non è stato possibile acquisire {path} mutante", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "Non è stato possibile determinare il commit corrente:", "FailedToDownloadFromMirrorSet": "Non è stato possibile eseguire il download dal set di mirror", "FailedToExtract": "Non è stato possibile estrarre \" {path}”:", - "FailedToFetchError": "{error_msg}\nNon è stato possibile recuperare {package_name}:", - "FailedToFindBaseline": "Non è stato possibile trovare baseline.json", + "FailedToFetchRepo": "Non è stato possibile recuperare {url}.", "FailedToFindPortFeature": "{package_name} non dispone di funzionalità denominate {feature}.", "FailedToFormatMissingFile": "Nessun file da formattare.\nPassare --all o i file espliciti da formattare o convertire.", "FailedToLoadInstalledManifest": "Non è stato possibile caricare il file manifesto o di controllo per {package_name} a causa dell'errore seguente. Rimuovere {package_name} e riprovare.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "Non è stato possibile accettare il blocco del file system in {path}", "FailedToWriteManifest": "Non è stato possibile scrivere il file manifesto {path}", "FailedVendorAuthentication": "Impossibile autenticare uno o più provider di credenziali {vendor}. Per altri dettagli su come fornire le credenziali, vedere '{url}'.", - "FeedbackAppreciated": "Grazie per i commenti e suggerimenti", "FetchingBaselineInfo": "Recupero delle informazioni di base da {package_name}...", "FetchingRegistryInfo": "Recupero delle informazioni del Registro di sistema da {url} ({value})...", "FieldKindDidNotHaveExpectedValue": "\"kind\" non contiene un valore previsto: (valore previsto: {expected}; trovato {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "Sono stati trovati percorsi assoluti nei file seguenti:", "FilesExported": "File esportati in: {path}", "FindHelp": "Cerca l'artefatto o la porta indicati. Senza parametri dopo 'artifact' o 'port', visualizza tutto.", + "FindVersionArtifactsOnly": "--version non può essere utilizzato con la ricerca vcpkg o la porta di ricerca vcpkg", "FishCompletion": "Il completamento del pesce vcpkg è già stato aggiunto in \"{path}”.", "FloatingPointConstTooBig": "Costante a virgola mobile troppo grande: {count}", "FollowingPackagesMissingControl": "I pacchetti seguenti non hanno un control o vcpkg.json valido:", "FollowingPackagesNotInstalled": "I pacchetti seguenti non sono installati:", "FollowingPackagesUpgraded": "I pacchetti seguenti sono aggiornati:", + "ForMoreHelp": "Per altra guida", "ForceSystemBinariesOnWeirdPlatforms": "La variabile di ambiente VCPKG_FORCE_SYSTEM_BINARIES deve essere impostata su piattaforme arm, s390x, ppc64le e riscv.", "FormattedParseMessageExpression": "nell'espressione: {value}", "GHAParametersMissing": "L'origine binaria BINARY DI AZURE richiede l'impostazione delle variabili di ambiente ACTIONS_RUNTIME_TOKEN e ACTIONS_CACHE_URL. Per informazioni dettagliate, vedere {url}.", @@ -470,7 +590,7 @@ "GitCommandFailed": "non è stato possibile eseguire: {command_line}", "GitFailedToFetch": "non è stato possibile recuperare il valore {value} di riferimento dal repository {url}", "GitFailedToInitializeLocalRepository": "non è stato possibile inizializzare il repository locale {path}", - "GitRegistryMustHaveBaseline": "La voce del Registro di sistema GIT per \"{package_name}\" deve contenere un campo \"baseline\" che sia un SHA con commit GIT valido (40 caratteri esadecimali).\nL'HEAD corrente del repository è \"{value}\".", + "GitRegistryMustHaveBaseline": "Il registro Git \"{url}\" deve avere un campo \"baseline\" che sia un SHA con commit Git valido (40 caratteri esadecimali).\nPer usare le versioni più recenti correnti, impostare la baseline su HEAD del repository, \"{commit_sha}\".", "GitStatusOutputExpectedFileName": "previsto un nome file", "GitStatusOutputExpectedNewLine": "prevista nuova riga", "GitStatusOutputExpectedRenameOrNewline": "previsto file rinominato o nuove righe", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "git ha prodotto un output imprevisto durante l'esecuzione di {command_line}", "GraphCycleDetected": "Ciclo rilevato nel grafico in {package_name}:", "HashFileFailureToRead": "non è stato possibile leggere il file \"{path}\" per l'hashing: ", + "HashPortManyFiles": "Il pacchetto {package_name} contiene {count} file. L'hashing di questi contenuti può richiedere molto tempo quando si determina l'hash ABI per la memorizzazione nella cache binaria. Provare a ridurre il numero di file. Cause comuni di questo errore sono l'estrazione accidentale dei file di origine o di compilazione nella directory di una porta.", "HeaderOnlyUsage": "{package_name} è di sola intestazione e può essere usato da CMake tramite:", "HelpAssetCaching": "**Funzionalità sperimentale: questa opzione può essere modificata o rimossa in qualsiasi momento**\n\nvcpkg può usare i mirror per memorizzare nella cache le risorse scaricate, garantendo un funzionamento continuo anche se l'origine originale cambia o scompare.\n\nÈ possibile configurare la memorizzazione nella cache delle risorse impostando la variabile di ambiente X_VCPKG_ASSET_SOURCES su un elenco di origini delimitate da punti e virgola o passando una sequenza di opzioni --x-asset-sources= della riga di comando. Le origini della riga di comando vengono interpretate dopo le origini dell'ambiente. Le virgole, i punti e virgola e i backtick possono essere preceduti da un carattere di escape con backtick (').\n\nIl parametro facoltativo per alcune stringhe controlla la modalità di accesso. Può essere specificato come \"read\", \"write\" o \"readwrite\" e il valore predefinito è \"read\".\n\nOrigini valide:", "HelpAssetCachingAzUrl": "Aggiunge un'origine di Archiviazione BLOB di Azure, facoltativamente usando la convalida della firma di accesso condiviso. L'URL deve includere il percorso del contenitore e terminare con un \"/\" finale. , se definito, deve essere preceduto da un prefisso \"?\". I server non di Azure funzioneranno anche se rispondono alle richieste GET e PUT nel formato: \"\".", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "Specifica un timeout di NuGet per le operazioni di rete NuGet. Equivalente al parametro \"-Timeout\" dell'interfaccia della riga di comando di NuGet.", "HelpBuiltinBase": "La baseline fa riferimento a un commit all'interno del repository vcpkg che stabilisce una versione minima di ogni dipendenza nel grafico. Ad esempio, se non vengono specificati altri vincoli (direttamente o transitivamente), la versione verrà risolta nella baseline del manifesto di livello più alto. Le baseline delle dipendenze transitive vengono ignorate.", "HelpCachingClear": "Rimuove tutte le origini precedenti, incluse le impostazioni predefinite.", - "HelpContactCommand": "Visualizza le informazioni sul contatto per inviare il feedback.", - "HelpCreateCommand": "Crea una nuova porta.", - "HelpDependInfoCommand": "Visualizza un elenco di dipendenze per le porte.", - "HelpEditCommand": "Aprire una porta per la modifica (usare la variabile di ambiente '{env_var}' per impostare un programma editor. Valore predefinito: 'code').", - "HelpEnvCommand": "Crea un ambiente shell pulito per lo sviluppo o la compilazione.", - "HelpExampleCommand": "Per altre informazioni, inclusi esempi, vedere il file README.md e la cartella docs.", + "HelpContactCommand": "Visualizza le informazioni di contatto per inviare feedback", + "HelpCreateCommand": "Crea una nuova porta", + "HelpDependInfoCommand": "Visualizza un elenco di dipendenze per le porte", + "HelpEditCommand": "Modifica una porta, facoltativamente con {env_var}, il valore predefinito è \"code\"", + "HelpEnvCommand": "Crea un ambiente shell pulito per lo sviluppo o la compilazione", + "HelpExampleCommand": "Per altre informazioni (inclusi esempi), vedere https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Manifesto di esempio:", "HelpExportCommand": "Esporta un pacchetto.", - "HelpFormatManifestCommand": "Formatta tutti i file vcpkg.json. Eseguire questa operazione prima di eseguire il commit in vcpkg.", "HelpHashCommand": "Esegue l'hash di un file in base a un algoritmo specifico. Valore predefinito: Sha512.", - "HelpInitializeRegistryCommand": "Inizializza un Registro di sistema nella directory .", - "HelpInstallCommand": "Installa un pacchetto.", - "HelpListCommand": "Elenca i pacchetti installati.", + "HelpInstallCommand": "Installa un pacchetto", + "HelpListCommand": "Elenca i pacchetti installati", "HelpManifestConstraints": "I manifesti possono applicare tre tipi di vincoli alle versioni usate", "HelpMinVersion": "Vcpkg selezionerà la versione minima trovata che corrisponde a tutti i vincoli applicabili, inclusa la versione della baseline specificata al livello più alto, nonché qualsiasi vincolo \"version>=\" nel grafico.", "HelpOverrides": "Quando vengono usati come manifesto di livello più alto, ad esempio quando si esegue `vcpkg install` nella directory, gli override consentono a un manifesto di mandare in corto circuito la risoluzione delle dipendenze e specificano esattamente la versione da usare. Possono essere usati per gestire conflitti di versione, ad esempio con le dipendenze `version-string`. Non verranno considerati quando usati come dipendenze in modo transitivo.", - "HelpOwnsCommand": "Cerca i file nei pacchetti installati.", + "HelpOwnsCommand": "Cerca il proprietario di un file nei pacchetti installati", "HelpPackagePublisher": "Inoltre, gli autori di pacchetti possono usare vincoli \"version>=\" per garantire che i consumer usino almeno una certa versione minima di una determinata dipendenza. Ad esempio, se una libreria richiede l'aggiunta di un'API a boost-asio nella versione 1.70, un vincolo \"version>=\" garantirà che gli utenti transitivi usino una versione sufficiente anche in caso di override di singole versioni o riferimenti tra registri.", - "HelpPortVersionScheme": "Ogni versione ha anche un valore \"port-version\" che è un numero intero non negativo. Quando viene eseguito il rendering come testo, la versione della porta (se diversa da zero) viene aggiunta come suffisso al testo della versione primaria separata da cancelletto (#). Le versioni delle porte vengono ordinate in ordine alfabetico dopo il testo della versione primaria, ad esempio:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Disinstalla un pacchetto.", - "HelpRemoveOutdatedCommand": "Disinstalla tutti i pacchetti non aggiornati.", - "HelpResponseFileCommand": "Specificare un file di risposta per fornire parametri aggiuntivi.", - "HelpSearchCommand": "Cerca i pacchetti disponibili per la compilazione.", - "HelpTextOptFullDesc": "Non troncare il testo lungo.", - "HelpTopicCommand": "Visualizza la Guida per un argomento specifico.", - "HelpTopicsCommand": "Visualizza l'elenco degli argomenti della Guida.", - "HelpTxtOptAllowUnsupportedPort": "Anziché generare un errore di porta non supportata, continua con un avviso.", - "HelpTxtOptCleanAfterBuild": "Pulire gli alberi di compilazione, i pacchetti e i download dopo la compilazione di ogni pacchetto.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Pulire gli alberi di compilazione dopo la compilazione di ogni pacchetto.", - "HelpTxtOptCleanDownloadsAfterBuild": "Pulire i download dopo la compilazione di ogni pacchetto.", - "HelpTxtOptCleanPkgAfterBuild": "Pulire i pacchetti dopo la compilazione di ogni pacchetto.", - "HelpTxtOptDryRun": "Non compilare o installare realmente.", - "HelpTxtOptEditable": "Disabilitare la riestrazione dell'origine e la memorizzazione nella cache binaria per le librerie nella riga di comando (modalità classica)", - "HelpTxtOptEnforcePortChecks": "Non è possibile eseguire l'installazione se una porta ha rilevato problemi o tenta di usare una funzionalità deprecata", - "HelpTxtOptKeepGoing": "Continuare l'installazione dei pacchetti in caso di errore.", - "HelpTxtOptManifestFeature": "Funzionalità aggiuntiva del manifesto di primo livello da installare (modalità manifesto).", - "HelpTxtOptManifestNoDefault": "Non installare le funzionalità predefinite dal manifesto di primo livello (modalità manifesto).", - "HelpTxtOptNoDownloads": "Non scaricare nuove origini.", - "HelpTxtOptNoUsage": "Non stampare le informazioni sull'utilizzo di CMake dopo l'installazione.", - "HelpTxtOptOnlyBinCache": "Esito negativo se i file binari memorizzati nella cache non sono disponibili.", - "HelpTxtOptOnlyDownloads": "Eseguire un tentativo migliore di scaricare le origini senza compilare.", - "HelpTxtOptRecurse": "Consentire la rimozione dei pacchetti come parte dell'installazione.", - "HelpTxtOptUseAria2": "Usare aria2 per eseguire attività di download.", - "HelpTxtOptUseHeadVersion": "Installare le librerie nella riga di comando usando le origini upstream più recenti (modalità classica).", - "HelpTxtOptWritePkgConfig": "Scrive un file packages.config in formato NuGet da usare con la memorizzazione nella cache binaria esterna.\nPer altre informazioni, vedere 'vcpkg help binarycaching'.", + "HelpPortVersionScheme": "Ogni versione ha anche un valore \"versione-porta\" che è un numero intero non negativo. Quando viene eseguito il rendering come testo, la versione della porta (se diversa da zero) viene aggiunta come suffisso al testo della versione primaria separata da cancelletto (#). Le versioni delle porte vengono ordinate in ordine alfabetico dopo il testo della versione primaria, ad esempio:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Disinstalla un pacchetto", + "HelpResponseFileCommand": "Contiene un argomento per riga espanso in tale posizione", + "HelpSearchCommand": "Cerca i pacchetti disponibili per la compilazione", + "HelpTextOptFullDesc": "Non tronca il testo lungo", + "HelpTopicCommand": "Visualizza l'argomento della Guida specifico", + "HelpTopicsCommand": "Visualizza l'elenco completo degli argomenti della Guida", + "HelpTxtOptAllowUnsupportedPort": "Continua con un avviso sulle porte non supportate, anziché sugli errori", + "HelpTxtOptCleanAfterBuild": "Pulisce gli alberi di compilazione, i pacchetti e i download dopo la compilazione di ogni pacchetto", + "HelpTxtOptCleanBuildTreesAfterBuild": "Pulisce gli alberi di compilazione dopo la compilazione di ogni pacchetto", + "HelpTxtOptCleanDownloadsAfterBuild": "Pulisce i download dopo la compilazione di ogni pacchetto", + "HelpTxtOptCleanPkgAfterBuild": "Pulisce i pacchetti dopo la compilazione di ogni pacchetto", + "HelpTxtOptDryRun": "Non esegue effettivamente la compilazione o l'installazione", + "HelpTxtOptEditable": "Disabilita la riestrazione dell'origine e la memorizzazione nella cache binaria per le librerie nella riga di comando (modalità classica)", + "HelpTxtOptEnforcePortChecks": "L'installazione non riesce se una porta ha rilevato problemi o tenta di usare una funzionalità deprecata", + "HelpTxtOptKeepGoing": "Continua l'installazione dei pacchetti in caso di errore", + "HelpTxtOptManifestFeature": "Funzionalità aggiuntive del manifesto di primo livello da installare (modalità manifesto)", + "HelpTxtOptManifestNoDefault": "Non installa le funzionalità predefinite dal manifesto di primo livello (modalità manifesto)", + "HelpTxtOptNoDownloads": "Non scarica nuove origini", + "HelpTxtOptNoUsage": "Non stampa le informazioni sull'utilizzo di CMake dopo l'installazione", + "HelpTxtOptOnlyBinCache": "Non riesce se i file binari memorizzati nella cache non sono disponibili", + "HelpTxtOptOnlyDownloads": "Effettua il massimo tentativo di scaricare le origini senza creare", + "HelpTxtOptRecurse": "Consente la rimozione dei pacchetti come parte dell'installazione", + "HelpTxtOptUseAria2": "Usa aria2 per eseguire attività di download", + "HelpTxtOptUseHeadVersion": "Installa le librerie nella riga di comando usando le origini upstream più recenti (modalità classica)", + "HelpTxtOptWritePkgConfig": "Scrive un file in formato NuGet packages.config da usare con la memorizzazione nella cache binaria esterna. Per altre informazioni, vedere 'vcpkg help binarycaching'", "HelpUpdateBaseline": "L'approccio migliore per mantenere aggiornate le librerie consiste nell'aggiornare il riferimento della baseline. In questo modo tutti i pacchetti, inclusi quelli transitivi, verranno aggiornati. Tuttavia, se è necessario aggiornare un pacchetto in modo indipendente, è possibile usare un vincolo \"version>=\".", - "HelpUpdateCommand": "Elenca i pacchetti che è possibile aggiornare.", - "HelpUpgradeCommand": "Ricompila tutti i pacchetti obsoleti.", - "HelpVersionCommand": "Visualizza le informazioni sulla versione.", + "HelpUpdateCommand": "Elenca i pacchetti che possono essere aggiornati", + "HelpUpgradeCommand": "Ricompila tutti i pacchetti obsoleti", + "HelpVersionCommand": "Visualizza le informazioni sulla versione", "HelpVersionDateScheme": "Una data (2021-01-01.5)", "HelpVersionGreater": "All'interno del campo \"dipendenze\", ogni dipendenza può avere un vincolo minimo elencato. Questi vincoli minimi verranno usati in modo transitivo a seconda di questa libreria. È inoltre possibile specificare un valore port-version minimo con un suffisso '#'.", "HelpVersionScheme": "Una sequenza di numeri delimitati da punti (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Firma del file di archivio non corretta", "IncorrectPESignature": "Firma PE non corretta", "IncrementedUtf8Decoder": "Utf8Decoder incrementato alla fine della stringa", - "InfoSetEnvVar": "È anche possibile impostare la variabile di ambiente '{env_var}' sull'editor preferito.", + "InfoSetEnvVar": "Puoi anche impostare {env_var} sul tuo editor preferito.", "InitRegistryFailedNoRepo": "Non è stato possibile creare un Registro di sistema in {path} perché non si tratta di un repository Git root.\nUsa 'git init {command_line}' per creare un repository git in questa cartella.", "InstallCopiedFile": "{path_source} -> {path_destination} completato", "InstallFailed": "non riuscito: {path}: {error_msg}", "InstallPackageInstruction": "Con un progetto aperto, vai a Strumenti-> Gestione pacchetti NuGet-> Gestione pacchetti Console e incolla:\n Install-Package \"{ value}> -Origine > {path}>", - "InstallRootDir": "(Sperimentale) Specificare la directory radice di installazione.", + "InstallRootDir": "Directory installata (sperimentale)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} ignorato, aggiornato", "InstallWithSystemManager": "Potrebbe essere possibile installare questo strumento tramite Gestione pacchetti di sistema.", "InstallWithSystemManagerMono": "Gli utenti Ubuntu 18.04 potrebbero aver bisogno di una versione più recente di Mono, disponibile all'indirizzo {url}.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Installazione della porta dal percorso: {path}", "InstallingMavenFile": "{path} installazione del file Maven", "InstallingPackage": "Installing {action_index}/{count} {spec}...", - "IntegrateBashHelp": "Abilita il completamento della scheda di bash.", - "IntegrateFishHelp": "Abilita il completamento della scheda di fish.", - "IntegrateInstallHelpLinux": "Rende i pacchetti installati disponibili a livello di utente.", - "IntegrateInstallHelpWindows": "Rende i pacchetti installati disponibili a livello di utente. Richiede i privilegi di amministratore al primo utilizzo.", - "IntegratePowerShellHelp": "Abilita il completamento della scheda di PowerShell.", - "IntegrateProjectHelp": "Genera un pacchetto NuGet di riferimento per l'uso di singoli progetti VS.", - "IntegrateRemoveHelp": "Rimuovere l'integrazione a livello di utente.", - "IntegrateZshHelp": "Abilita il completamento della scheda di zsh.", - "IntegrationFailed": "L'integrazione non è stata applicata.", + "IntegrateBashHelp": "Abilitare il completamento tramite tabulazione bash. Solo non Windows", + "IntegrateFishHelp": "Abilitare il completamento tramite tabulazione fish. Solo non Windows", + "IntegrateInstallHelpLinux": "Rende disponibili i pacchetti installati a livello di utente", + "IntegrateInstallHelpWindows": "Rende disponibili i pacchetti installati a livello di utente. Richiede privilegi di amministratore al primo utilizzo", + "IntegrateNonWindowsOnly": "{command_line} non è solo Windows e non è supportato in questo sistema.", + "IntegratePowerShellHelp": "Abilitare il completamento tramite tabulazione di PowerShell. Solo Windows", + "IntegrateProjectHelp": "Genera un pacchetto NuGet di riferimento per l'uso di singoli progetti Visual Studio. Solo Windows", + "IntegrateRemoveHelp": "Rimuove l'integrazione a livello di utente", + "IntegrateWindowsOnly": "{command_line} è solo Windows e non è supportato in questo sistema.", + "IntegrateZshHelp": "Abilitare il completamento tramite tabulazione zsh. Solo non Windows", + "IntegrationFailedVS2015": "L'integrazione non è stata applicata per Visual Studio 2015.", "InternalCICommand": "vcpkg ci è un comando interno che cambia in modo incompatibile o viene rimosso in qualsiasi momento.", "InternalErrorMessage": "errore interno:", "InternalErrorMessageContact": "Apri un problema in https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug con passaggi dettagliati per riprodurre il problema.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg non supporta i commenti di tipo C, ma la maggior parte degli oggetti consente l'utilizzo di campi con prefisso $ come commenti.", "InvalidCommitId": "ID commit non valido: {commit_sha}", "InvalidDefaultFeatureName": "'default' è un nome di funzionalità riservato", - "InvalidDependency": "le dipendenze devono essere caratteri alfanumerici minuscoli e trattini e non uno dei nomi riservati", "InvalidFeature": "le funzionalità devono essere caratteri alfanumerici minuscoli e trattini e non uno dei nomi riservati", "InvalidFileType": "non riuscito: {path} non è in grado di gestire il tipo di file", "InvalidFilename": "Il nome file non può contenere caratteri non validi {value}, ma è stato {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "Libreria non valida: impossibile trovare un membro del linker.", "InvalidLinkage": "Tipo di collegamento {system_name} non valido: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "espressione logica non valida, carattere imprevisto", - "InvalidLogicExpressionUsePipe": "espressione logica non valida. Usare '|' invece di 'or'", + "InvalidLogicExpressionUsePipe": "espressione logica non valida. Usare '|' anziché 'or'", "InvalidNoVersions": "Il file non contiene versioni.", "InvalidOptionForRemove": "'remove' accetta librerie o '--outdated'", "InvalidPortVersonName": "Trovato nome file della versione della porta non valido: '{path}'.", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "il valore di [\"{json_field}\"] deve essere un oggetto", "JsonFieldNotString": "il valore di [\"{json_field}\"] deve essere una stringa", "JsonFileMissingExtension": "il file JSON {path} deve avere un'estensione json (tutto minuscolo)", - "JsonSwitch": "(Sperimentale) Richiedere l'output JSON.", + "JsonSwitch": "Stampa JSON anziché testo normale", "JsonValueNotArray": "Il valore JSON non è una matrice", "JsonValueNotObject": "Il valore JSON non è un oggetto", "JsonValueNotString": "Il valore JSON non è una stringa", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Rilascio dinamico (/MD)", "LinkageStaticDebug": "Debug statico (/MTd)", "LinkageStaticRelease": "Rilascio statico (/MT)", - "ListHelp": "L'argomento deve essere una sottostringa da cercare oppure nessun argomento per visualizzare tutte le librerie installate.", + "ListHelp": "Elenca le librerie installate", "ListOfValidFieldsForControlFiles": "Elenco di campi validi per i file CONTROL (con distinzione tra maiuscole e minuscole):", "LoadingCommunityTriplet": "-- [COMMUNITY] Caricamento della configurazione della tripletta da: {path}", "LoadingDependencyInformation": "Caricamento delle informazioni sulle dipendenze per {count} pacchetti in corso...", @@ -708,7 +827,6 @@ "MultiArch": "Multi-Arch deve essere 'same' mentre è {option}", "MultipleFeatures": "{package_name} dichiara {feature} più volte; assicurarsi che le funzionalità abbiano nomi distinti", "MutuallyExclusiveOption": "--{value} non può essere usato con --{option}.", - "NavigateToNPS": "Passa a {url} nel browser preferito.", "NewConfigurationAlreadyExists": "La creazione di un manifesto sovrascrive un file vcpkg-configuration.json in {path}.", "NewManifestAlreadyExists": "Un manifesto è già presente in {path}.", "NewNameCannotBeEmpty": "Il campo 'Nome' non può essere vuoto.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "Specificare --name e --version per produrre un manifesto destinato alle librerie C++ oppure specificare --application per indicare che il manifesto non deve essere usato come porta.", "NewVersionCannotBeEmpty": "--version non può essere vuoto.", "NoArgumentsForOption": "L'opzione --{option} non accetta un argomento.", - "NoCachedPackages": "Nessun pacchetto memorizzato nella cache.", "NoError": "nessun errore", "NoInstalledPackages": "Nessun pacchetto installato. Si intendeva \"cerca\"?", "NoLocalizationForMessages": "Nessun messaggio localizzato per gli elementi seguenti: ", @@ -739,11 +856,13 @@ "OptionRequiresAValue": "l'opzione '{option}' richiede un valore", "OptionRequiresOption": "--{value} richiede --{option}", "OptionUsedMultipleTimes": "l'opzione '{option}' è stata specificata più volte", - "OptionalCommand": "comando facoltativo", "Options": "Opzioni", "OriginalBinParagraphHeader": "\nParagrafo binario originale", + "OtherCommandsHeader": "Altro", "OverlayPatchDir": "Il percorso di sovrapposizione \"{path}\" deve esistere e deve essere una directory.", - "OverlayTriplets": "Triplet di sovrapposizione da {path}:", + "OverlayPortsDirectoriesHelp": "Directory delle porte di sovrapposizione (anche: {env_var})", + "OverlayTripletDirectoriesHelp": "Directory di triplette di sovrimpressione (anche: {env_var})", + "OverlayTriplets": "Tripletta di sovrapposizione da “{path}”:", "OverwritingFile": "Il file {path} era già presente e verrà sovrascritto", "PECoffHeaderTooShort": "Durante l'analisi del file eseguibile di tipo PE {path}, le dimensioni dell'intestazione COFF erano troppo piccole per contenere un'intestazione PE valida.", "PEConfigCrossesSectionBoundary": "Durante l'analisi del file eseguibile di tipo PE {path}, la directory di configurazione dell'immagine interseca un limite di sezione.", @@ -752,9 +871,12 @@ "PERvaNotFound": "Durante l'analisi del file eseguibile di tipo PE {path}, non è stato possibile trovare l'indirizzo RVA {value:#X}.", "PESignatureMismatch": "Durante l'analisi del file eseguibile di tipo PE {path}, è stata trovata una firma non corrispondente.", "PackageAlreadyRemoved": "non è possibile rimuovere {spec}: già rimosso", + "PackageDiscoveryHeader": "Individuazione pacchetti", "PackageFailedtWhileExtracting": "'{value}' non è riuscito durante l'estrazione di {path}.", - "PackageInfoHelp": "Visualizza informazioni dettagliate sui pacchetti.", - "PackageRootDir": "(Sperimentale) Specificare la directory radice dei pacchetti.", + "PackageInfoHelp": "Visualizza informazioni dettagliate sui pacchetti", + "PackageInstallationHeader": "Installazione del pacchetto", + "PackageManipulationHeader": "Manipolazione del pacchetto", + "PackageRootDir": "Directory dei pacchetti (sperimentale)", "PackagesToInstall": "Verranno compilati e installati i pacchetti seguenti:", "PackagesToInstallDirectly": "I pacchetti seguenti verranno installati direttamente:", "PackagesToModify": "I pacchetti aggiuntivi (*) verranno modificati per completare l'operazione.", @@ -774,6 +896,7 @@ "ParseControlErrorInfoTypesEntry": "{value} previsto {expected}", "ParseControlErrorInfoWhileLoading": "durante il caricamento {path}:", "ParseControlErrorInfoWrongTypeFields": "I campi seguenti hanno tipi errati:", + "ParseFeatureNameError": "\"{package_name}\" non è un nome di funzionalità valido. I nomi delle funzionalità devono essere alfanumerici minuscoli+hypen e non riservati (per altre informazioni, vedere {url}).", "ParseIdentifierError": "\"{valore}\" non è un identificatore valido. Gli identificatori devono essere alfanumerici minuscoli + trattini e devono essere non prenotati (vedere {url} per altre informazioni)", "ParsePackageNameError": "\"{package_name}\" non è un nome di pacchetto valido. I nomi dei pacchetti devono essere alfanumerici minuscoli + trattini e non devono essere prenotati (per altre informazioni, vedere {url})", "ParsePackagePatternError": "\"{package_name}\" non è un modello di pacchetto valido. I modelli di pacchetto devono usare un solo carattere jolly (*) che deve essere l'ultimo carattere del criterio (per altre informazioni, vedere {url})", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "Per ispezionare i file {extension}, usare:", "PortBugInvalidCrtLinkage": "I file binari seguenti devono usare il CRT {expected}.", "PortBugInvalidCrtLinkageEntry": "{path} si collega con:", + "PortBugKernel32FromXbox": "La tripla selezionata è destinata a Xbox, ma le DLL seguenti si collegano a kernel32. Queste DLL non possono essere caricate su Xbox, dove kernel32 non è presente. Questo problema è in genere causato dal collegamento a kernel32.lib anziché a una libreria generica appropriata, ad esempio onecore_apiset.lib o xgameplatform.lib.", "PortBugMergeLibCMakeDir": "La cartella /lib/cmake deve essere unita a /debug/lib/cmake e spostata in /share/{package_name}/cmake. Usare la funzione helper `vcpkg_cmake_config_fixup()` dalla porta vcpkg-cmake-config.`", "PortBugMismatchedNumberOfBinaries": "Numero di file binari di debug e di versione non corrispondente.", "PortBugMisplacedCMakeFiles": "I file cmake seguenti sono stati trovati all'esterno di /share/{spec}. Inserire i file cmake in /share/{spec}.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "Se non è possibile disabilitare la creazione di bin e/o di debug bin, usare questo comando nel portfile per rimuoverli", "PortBugRemoveEmptyDirectories": "Se una directory dovrebbe essere popolata ma non lo è, ciò può indicare un errore nel portfile.\nSe le directory non sono necessarie e la loro creazione non può essere disabilitata, usare una procedura simile a questa nel portfile per rimuoverle:", "PortBugRemoveEmptyDirs": "file (REMOVE_RECURSE directory vuote lasciate dalle ridenominazioni precedenti)", - "PortBugRestrictedHeaderPaths": "Le intestazioni con restrizioni seguenti possono impedire la corretta compilazione del runtime C++ di base e di altri pacchetti. In circostanze eccezionali, questo criterio può essere disabilitato tramite {env_var}.", + "PortBugRestrictedHeaderPaths": "Le intestazioni con restrizioni seguenti possono impedire la corretta compilazione del runtime C++ di base e di altri pacchetti. In circostanze eccezionali, questo criterio può essere disabilitato impostando la variabile CMake VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS in portfile.cmake.", "PortBugSetDllsWithoutExports": "Le DLL senza esportazioni sono probabilmente un bug dello script di compilazione. Se necessario, aggiungere la riga seguente nel portfile:\nimpostare(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS abilitato)\nLe DLL seguenti non hanno esportazioni:", "PortDependencyConflict": "La porta {package_name} ha le seguenti dipendenze non supportate:", "PortDoesNotExist": "{package_name} non esiste", @@ -827,21 +951,26 @@ "PortsDiffHelp": "L'argomento deve essere un ramo/tag/hash da estrarre.", "PortsNoDiff": "Non sono state apportate modifiche alle porte tra i due commit.", "PortsRemoved": "Sono state rimosse le porte {count} seguenti:", - "PortsUpdated": "\nLe porte {count} seguenti sono state aggiornate:", + "PortsUpdated": "Le porte {count} seguenti sono state aggiornate:", "PrebuiltPackages": "Sono presenti pacchetti che non sono stati compilati. Per compilarli, eseguire:", "PreviousIntegrationFileRemains": "Il file di integrazione precedente non è stato rimosso.", "ProgramReturnedNonzeroExitCode": "{tool_name} non riuscito con codice di uscita: ({exit_code}).", "ProvideExportType": "È necessaria almeno una delle opzioni seguenti: --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "Il push di {vendor} in \"{path}\" non è riuscito. Per altre informazioni, usare --debug.", - "RegeneratesArtifactRegistry": "Rigenera un registro artefatti.", + "RegeneratesArtifactRegistry": "Rigenera un registro artefatti", "RegistryCreated": "Il Registro di sistema è stato creato in {path}", "RegistryValueWrongType": "Il valore del Registro di sistema {path} è di tipo imprevisto.", "RemoveDependencies": "Per rimuovere le dipendenze in modalità manifesto, modificare il manifesto (vcpkg.json) ed eseguire 'install'.", "RemovePackageConflict": "{spec} non è installato, ma {package_name} è installato per {triplet}. Intendevi {package_name}:{triplet}?", "RemovingPackage": "Rimozione di {action_index}/{count} {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "Il pacchetto è stato ripristinato da \"{path}\"", - "RestoredPackagesFromVendor": "Sono stati ripristinati {count} pacchetti da {value} in {elapsed}. Usare --debug per visualizzare altri dettagli.", + "RestoredPackagesFromAWS": "Sono stati ripristinati {count} pacchetti da AWS in {elapsed}. Usare --debug per visualizzare altri dettagli.", + "RestoredPackagesFromCOS": "Sono stati ripristinati {count} pacchetti da COS in {elapsed}. Usare --debug per visualizzare altri dettagli.", + "RestoredPackagesFromFiles": "Sono stati ripristinati {count} pacchetti da {path} in {elapsed}. Usare --debug per visualizzare altri dettagli.", + "RestoredPackagesFromGCS": "Sono stati ripristinati {count} pacchetti da GCS in {elapsed}. Usare --debug per visualizzare altri dettagli.", + "RestoredPackagesFromGHA": "Sono stati ripristinati {count} pacchetti da GitHub Actions Cache in {elapsed}. Usare --debug per visualizzare altri dettagli.", + "RestoredPackagesFromHTTP": "Sono stati ripristinati {count} pacchetti da HTTP in {elapsed}. Usare --debug per visualizzare altri dettagli.", + "RestoredPackagesFromNuGet": "Sono stati ripristinati {count} pacchetti da NuGet in {elapsed}. Usare --debug per visualizzare altri dettagli.", "ResultsHeader": "RISULTATI", "ScriptAssetCacheRequiresScript": "argomenti previsti: la configurazione dell'asset 'x-script' richiede esattamente il modello exec come argomento", "SearchHelp": "L'argomento deve essere una sottostringa da cercare oppure nessun argomento per visualizzare tutte le librerie.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "La cancellazione del contenuto di {path} verrà ignorata perché non era una directory.", "SourceFieldPortNameMismatch": "Il campo 'Source' all'interno del file CONTROL o il campo \"name\" all'interno del file vcpkg.json ha il nome {package_name} e non corrisponde alla directory delle porte {path}.", "SpecifiedFeatureTurnedOff": "La funzionalità '{command_name}' è stata disattivata in modo specifico, ma è stato specificato --{option}.", - "SpecifyDirectoriesContaining": "Specificare le directory contenenti file di triplette.\n(anche: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "Specificare le directory da usare per la ricerca delle porte.\n(anche: '{env_var}')", - "SpecifyHostArch": "Specificare la tripletta dell'architettura host. Vedere 'vcpkg help triplet'.\n(impostazione predefinita: '{env_var}')", - "SpecifyTargetArch": "Specificare la tripletta dell'architettura di destinazione. Vedere 'vcpkg help triplet'.\n(impostazione predefinita: '{env_var}')", + "SpecifyHostArch": "Tripletta host. Vedere 'tripletta host vcpkg' (impostazione predefinita: {env_var})", + "SpecifyTargetArch": "Tripletta di destinazione. Vedere 'tripletta guida vcpkg' (impostazione predefinita: {env_var})", "StartCodeUnitInContinue": "è stata trovata un'unità di codice iniziale in posizione continua", "StoreOptionMissingSha": "L'opzione --store non è valida senza sha512", - "StoredBinariesToDestinations": "File binari archiviati in {count} destinazioni.", + "StoredBinariesToDestinations": "File binari archiviati in {count} destinazioni in {elapsed}.", "StoredBinaryCache": "Cache binaria archiviata: \"{path}\"", "SuccessfulyExported": "{package_name} esportato in {path}", "SuggestGitPull": "Il risultato potrebbe essere obsoleto. Eseguire 'git pull' per ottenere i risultati più recenti.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "Potrebbe essere necessario aggiornare il file binario vcpkg; provare a eseguire {command_line} per eseguire l'aggiornamento.", "SupportedPort": "La porta {package_name} è supportata.", "SwitchUsedMultipleTimes": "l'opzione '{option}' è stata specificata più volte", + "SynopsisHeader": "Sinossi:", "SystemApiErrorMessage": "chiamata {system_api} non riuscita con {exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "È previsto che la variabile di ambiente SystemRoot sia sempre impostata in Windows.", "SystemTargetsInstallFailed": "non è stato possibile installare il file di destinazioni del sistema in {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Virgola finale nella matrice", "TrailingCommaInObj": "Virgola finale in un oggetto", "TripletFileNotFound": "Il file triplet {triplet}.cmake non è stato trovato", + "TripletLabel": "Tripletta:", "TwoFeatureFlagsSpecified": "Come flag di funzionalità sono stati specificati sia '{value}' che -'{value}'.", "UnableToClearPath": "non è possibile eliminare {path}", "UnableToReadAppDatas": "%LOCALAPPDATA% e %APPDATA% sono illeggibili", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "registro '{url}' non aggiornato: '{value}'", "UpdateBaselineRemoteGitError": "GIT non è riuscito a recuperare il repository remoto '{url}'", "UpdateBaselineUpdatedBaseline": "registro aggiornato '{url}': baseline '{old_value}' -> '{new_value}'", - "UpgradeInManifest": "Il comando di aggiornamento non supporta attualmente la modalità manifesto. Invece, modificare vcpkg.json ed eseguire l'installazione.", + "UpgradeInManifest": "L'aggiornamento aggiorna un'installazione in modalità classica e pertanto non supporta la modalità manifesto. È consigliabile aggiornare le dipendenze aggiornando la baseline a un valore corrente con vcpkg x-update-baseline ed eseguendo l'installazione di vcpkg.", "UpgradeRunWithNoDryRun": "Se si è certi di voler ricompilare i pacchetti precedenti, eseguire il comando con l'opzione --nessun test-controllato.", "UploadedBinaries": "File binari caricati in {count}.{vendor}.", "UploadedPackagesToVendor": "Sono stati caricati {count} pacchetti a {vendor} in {elapsed}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "comando non valido: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "Il valore della variabile di ambiente X_VCPKG_REGISTRIES_CACHE non è una directory: {path}", "VcpkgRootRequired": "L'impostazione VCPKG_ROOT è necessaria per il bootstrap autonomo.", - "VcpkgRootsDir": "Specificare la directory radice vcpkg.\n(impostazione predefinita: '{env_var}')", + "VcpkgRootsDir": "Directory radice vcpkg (impostazione predefinita: {env_var})", "VcpkgSendMetricsButDisabled": "passato --sendmetrics, ma le metriche sono disabilitate.", + "VcpkgUsage": "utilizzo: vcpkg [--switches] [--options=values] [arguments] @response_file", "VcvarsRunFailed": "non è stato possibile eseguire vcvarsall.bat per ottenere un ambiente di Visual Studio", "VcvarsRunFailedExitCode": "durante il tentativo di ottenere un ambiente di Visual Studio, vcvarsall.bat ha restituito {exit_code}", "VersionBaselineMismatch": "La versione più recente è {expected}, ma il file baseline contiene {actual}.\nEseguire:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Aggiorna database delle versioni\"\nper aggiornare la versione baseline.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "In {package_name} manca un file di database delle versioni in {path}\nEseguire:\nvcpkg x-add-version {package_name}\nper creare il file delle versioni.", "VersionGitEntryMissing": "nessuna voce del database delle versioni per {package_name} in {version}.\nVersioni disponibili:", "VersionInDeclarationDoesNotMatch": "La versione dichiarata nel file non corrisponde alla versione estratta: {version}", - "VersionIncomparable1": "conflitto di versione in {spec}: {package_name} richiede {expected} ma vcpkg non è riuscito a confrontarlo con {actual}.\nLe due versioni usano schemi non confrontabili:", - "VersionIncomparable2": "\"{version}\" era dello schema {new_scheme}", + "VersionIncomparable1": "conflitto di versione in {spec}: {constraint_origin} obbligatorio {expected}, che non può essere confrontato con la versione di base {actual}.", + "VersionIncomparable2": "{version_spec} ha lo schema {new_scheme}", "VersionIncomparable3": "Per risolvere il problema, aggiungere un override esplicito alla versione preferita, ad esempio:", - "VersionIncomparable4": "Per altre informazioni, vedere 'vcpkg help versioning'.", + "VersionIncomparable4": "Per altre informazioni, vedere`vcpkg help versioning` o {url}.", + "VersionIncomparableSchemeString": "Entrambe le versioni hanno una stringa di schema ma testo primario diverso.", + "VersionIncomparableSchemes": "Le versioni contengono schemi incomparabili:", "VersionInvalidDate": "'{version}' non è una versione di data valida. Le date devono essere nel formato AAAA-MM-GG e i disambiguatori devono essere valori interi positivi separati da punti senza zeri iniziali.", "VersionInvalidRelaxed": "'{version}' non è una versione di tipo relaxed valida (semver con conteggio arbitrario di elementi numerici).", "VersionInvalidSemver": "'{version}' non è una versione semantica valida. Consultare .", "VersionMissing": "previsto un campo di controllo delle versioni (uno tra version, version-date, version-semver o version-string)", - "VersionMissingRequiredFeature": "{spec}@{version} non dispone della funzionalità necessaria {feature}", + "VersionMissingRequiredFeature": "{version_spec} non dispone della funzionalità necessaria {feature} richieste da {constraint_origin}", "VersionNotFound": "{expected} non disponibile, è disponibile solo {actual}", - "VersionNotFoundDuringDiscovery": "versione non trovata durante l'individuazione: {spec}@{version}\nSi tratta di un errore vcpkg interno. Aprire un problema in https://github.com/Microsoft/vcpkg con i passaggi dettagliati per riprodurre il problema.", - "VersionNotFoundInVersionsFile": "La versione {version} non trovata nel file delle versioni.\nEseguire:\nvcpkg x-add-version {package_name}\nper aggiungere la nuova versione della porta.", + "VersionNotFoundInVersionsFile": "La versione {version} non trovata nel file delle versioni per {package_name}.\nEseguire:\nvcpkg x-add-version {package_name}\nper aggiungere la nuova versione della porta.", "VersionRejectedDueToBaselineMissing": "{path} è stato rifiutato perché usa \"{json_field}\" e non include una \"baseline predefinita\". Per risolvere questo problema, rimuovere gli usi di \"{json_field}\" o aggiungere una \"baseline predefinita\".\nPer altre informazioni, vedere 'vcpkg help versioning'.", "VersionRejectedDueToFeatureFlagOff": "{path} è stato rifiutato perché usa \"{json_field}\" e il flag della funzionalità 'versions' è disabilitato. Per risolvere questo problema, rimuovere \"{json_field}\" o abilitare il flag della funzionalità 'versions'.\nPer altre informazioni, vedere 'vcpkg help versioning'.", "VersionSchemeMismatch": "Il database delle versioni dichiara {version} come {expected}, ma {path} la dichiara come {actual}. Le versioni devono essere univoche, anche se dichiarate con schemi diversi.\nEseguire:\nvcpkg x-add-version {package_name} --overwrite-version\nper sovrascrivere lo schema dichiarato nel database delle versioni con quello dichiarato nella porta.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "'#' nel testo della versione deve essere seguito dalla versione della porta (un numero intero non negativo)", "VersionSpecMismatch": "Non è stato possibile caricare la porta perché le versioni sono incoerenti. Il file \"{path}\" contiene la versione {actual_version}, ma il database della versione indica che deve essere {expected_version}.", "VersionTableHeader": "Versione", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "In attesa della chiusura dei processi figlio...", "WaitingToTakeFilesystemLock": "in attesa del blocco del file system su {path}...", "WarnOnParseConfig": "Sono stati trovati i seguenti avvisi nel percorso di configurazione {path}:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "durante la convalida della versione: {version}", "WindowsOnlyCommand": "Questo comando supporta solo Windows.", "WroteNuGetPkgConfInfo": "Le informazioni di configurazione del pacchetto NuGet sono stata scritte in {path}.", - "UnrecognizedCommand$": "Comando '${p0}' non riconosciuto", - "Use$ToGetHelp": "Usa ${p0} per ottenere assistenza", - "FatalTheRootFolder$CanNotBeCreated": "Errore irreversibile: non è possibile creare la cartella radice '${p0}'", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Errore irreversibile: non è possibile creare il file di configurazione globale '${p0}'", + "FatalTheRootFolder$CannotBeCreated": "Errore irreversibile: non è possibile creare la cartella radice '${p0}'", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Errore irreversibile: non è possibile creare il file di configurazione globale '${p0}'", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND non è stato impostato", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "L'esecuzione interna di vcpkg ha restituito un codice di uscita diverso da zero: ${p0}", "failedToDownloadFrom$": "Non è stato possibile scaricare da ${p0}", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "la descrizione deve essere di tipo 'string'. Trovato '${p0}'", "optionsShouldBeASequenceFound$": "le opzioni devono essere una sequenza. Trovato '${p0}'", "DuplicateKeysDetectedInManifest$": "Chiavi duplicate rilevate nel manifesto: '${p0}'", - "in$Skipping$BecauseItIsA$": "in ${p0} ignora ${p1} perché è un ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "Nessun file PostScript: eseguire di nuovo con la funzione shell vcpkg anziché con l'eseguibile", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Definizione duplicata ${p0} durante l'attivazione. Il nuovo valore sostituirà quello precedente.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "Strumento duplicato dichiarato ${p0} durante l'attivazione. Il nuovo valore sostituirà quello precedente.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(stato sconosciuto)", "verifying": "verifica in corso", "downloading$$": "download di ${p0} -> ${p1}", - "unpacking": "disimballaggio", "unpacking$": "disimballaggio ${p0}", "Installing$": "Installazione di ${p0}...", "$AlreadyInstalled": "${p0} già installato.", "Downloading$": "Download di ${p0}...", "Unpacking$": "Disimballaggio di ${p0}...", "ErrorInstalling$$": "Errore durante l'installazione di ${p0} - ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "Previsto un singolo valore per ${p0}: ne sono stati trovati diversi", - "Synopsis": "Sinossi", - "Description": "Descrizione", - "Switches": "Opzioni", - "SeeAlso": "Vedi anche", "error": "errore:", "warning": "avviso:", + "ExpectedASingleValueFor$FoundMultiple": "Previsto un singolo valore per ${p0}: ne sono stati trovati diversi", "ExpectedASingleValueFor$": "Previsto un singolo valore per '--${p0}'.", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Supponendo che '${p0}' sia corretto; specificare un hash nei metadati dell'artefatto per eliminare questo messaggio.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "Il file scaricato '${p0}' non contiene l'hash corretto (${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "Trovato un ${p0} non corrispondente in '${p1}'. Per un valore letterale ${p2}, usare ${p3}${p4}.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "Non è stato possibile trovare un valore per {${p0}} in '${p1}'. Per scrivere il valore letterale, usare '{{${p2}}}'.", "MatchedMoreThanOneInstallBlock$": "Corrisponde a più di un blocco di installazione [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Acquisisce tutti gli elementi usati come riferimento da un progetto, senza l’attivazione", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "Ciò consente al consumer di pre-scaricare gli strumenti necessari per un progetto.", "UnableToFindProjectInFolderorParentFoldersFor$": "Non è possibile trovare il progetto nella cartella (o nelle cartelle padre) per ${p0}", "UnableToAcquireProject": "Non è possibile acquisire il progetto", - "AcquireArtifactsInTheRegistry": "Acquisisci artefatti nel Registro di sistema", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "Ciò consente al consumer di acquisire (scaricare e decomprimere) gli artefatti. Per poter essere usati, è necessario attivare gli artefatti", "NoArtifactsSpecified": "Nessun artefatto specificato", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Sono stati specificati più pacchetti, ma non un numero uguale di opzioni ${p0}", "NoArtifactsAreAcquired": "Nessun artefatto acquisito", "AllArtifactsAreAlreadyInstalled": "Tutti gli artefatti sono già installati", "$ArtifactsInstalledSuccessfully": "Installazione completata di ${p0} artefatti", "InstallationFailedStopping": "Installazione non riuscita -- Arresto in corso", - "ActivatesTheToolsRequiredForAProject": "Attiva gli strumenti necessari per un progetto", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "Consente all'utente di attivare gli strumenti necessari per un progetto. Se gli strumenti non sono già stati installati, ne verrà forzato il download e l'installazione prima dell'attivazione.", - "AddsAnArtifactToTheProject": "Aggiunge un artefatto al progetto", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "In questo modo il consumer può aggiungere un artefatto al progetto. Verrà attivato anche il progetto.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Sono stati specificati più artefatti, ma non un numero uguale di opzioni ${p0}", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "È stato tentato di aggiungere un artefatto [${p0}]:${p1}, ma non è stato possibile determinare il Registro di sistema da usare.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Ho provato ad aggiungere il Registro di sistema ${p0} come ${p1}, ma era già ${p2}. Aggiungi ${p3} a questo progetto manualmente e riprova.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Esegui \\'vcpkg activate\\' per applicarlo al terminale corrente", - "ManagesTheDownloadCache": "Gestisce la cache di download", "DownloadsFolderCleared$": "Cartella download cancellata (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "pulisce tutto (cache, artefatti installati)", - "cleansOutTheDownloadsCache": "pulisce la cache dei download", - "removesAllTheArtifactsThatAreInstalled": "rimuove tutti gli artefatti installati", - "cleansUp": "Pulisce", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Consente all'utente di pulire la cache, gli artefatti installati e così via.", "InstalledArtifactFolderCleared$": "Cartella artefatto installata cancellata (${p0}) ", "CacheFolderCleared$": "Cartella cache cancellata (${p0}) ", - "DeactivatesTheCurrentSession": "Disattiva la sessione corrente", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "Ciò consente all'utente di rimuovere le impostazioni di ambiente per la sessione attualmente attiva.", - "DeletesAnArtifactFromTheArtifactFolder": "Elimina un artefatto dalla cartella dell'artefatto", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "Ciò consente al consumer di rimuovere un artefatto dal disco.", "DeletingArtifact$From$": "Eliminazione dell'artefatto ${p0} da ${p1}", - "FindArtifactsInTheRegistry": "Trova artefatti nel Registro di sistema", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "In questo modo l'utente può trovare gli artefatti in base ad alcuni criteri.", "NoArtifactsFoundMatchingCriteria$": "Non sono stati trovati artefatti corrispondenti ai criteri: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Genera le proprietà di MSBuild per un'attivazione senza scaricare alcun elemento per un progetto", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props richiede --msbuild-props", "UnableToActivateProject": "Non è possibile attivare il progetto", - "theNameOfTheCommandForWhichYouWantHelp": "il nome del comando per il quale si desidera assistenza", - "getHelpOn$OrOneOfTheCommands": "ottieni assistenza su ${p0} o su uno dei comandi", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Ottiene informazioni dettagliate su ${p0} o su uno dei comandi", - "Arguments": "Argomenti:", - "Use$ToGetTheListOfAvailableCommands": "Usa ${p0} per ottenere l'elenco dei comandi disponibili", - "Usage": "Utilizzo", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "Comandi ${p0} disponibili:", - "ListsTheArtifacts": "Elenca gli artefatti", - "ThisAllowsTheConsumerToListArtifacts": "In questo modo il consumer può elencare gli artefatti.", - "regenerateTheIndexForARegistry": "rigenera l'indice per un registro", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "In questo modo l'utente può rigenerare i file ${p0} per un registro ${p1}.", "RegeneratingIndexFor$": "Rigenerazione dell'indice per ${p0}", "RegenerationCompleteIndexContains$MetadataFiles": "Rigenerazione completata. L'indice contiene ${p0} file di metadati", "Registry$ContainsNoArtifacts": "Registro di sistema: '${p0}' non contiene artefatti.", "error$": "errore ${p0}: ", - "RemovesAnArtifactFromAProject": "Rimuove un artefatto da un progetto", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "In questo modo il consumer può rimuovere un artefatto dal progetto. Forza la riattivazione in questa finestra.", "Removing$FromProjectManifest": "Rimozione di ${p0} dal manifesto del progetto", "unableToFindArtifact$InTheProjectManifest": "impossibile trovare l'artefatto ${p0} nel manifesto del progetto", - "updateTheRegistryFromTheRemote": "aggiorna il registro dal computer remoto", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Il contenuto più recente del registro viene scaricato dal servizio remoto.", - "DownloadingRegistryData": "Download dei dati del Registro di sistema", - "Updated$RegistryContains$MetadataFiles": "Aggiornamento di ${p0}. Il registro contiene ${p1} file di metadati", - "UnableToDownloadRegistrySnapshot": "Non è possibile scaricare lo snapshot del registro", - "UnableToFindRegistry$": "Impossibile trovare il registro ${p0}", - "ArtifactRegistryDataIsNotLoaded": "I dati del Registro di sistema dell'artefatto non sono stati caricati", - "AttemptingToUpdateArtifactRegistry": "Tentativo di aggiornamento del Registro di sistema degli artefatti", - "UnableToLoadRegistryIndex": "Non è possibile caricare l'indice del registro", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Attiva immediatamente un artefatto all'esterno del progetto", - "ThisWillInstantlyActivateAnArtifact": "Verrà attivato immediatamente un artefatto .", + "Updated$ItContains$MetadataFiles": "Aggiornamento di ${p0}. Contiene ${p1} file di metadati.", + "UnableToDownload$": "Non è possibile scaricare ${p0}.", + "$CouldNotBeUpdatedItCouldBeMalformed": "Non è stato possibile aggiornare ${p0}; potrebbe essere in formato non valido.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "Il comando x-update-registry scarica le nuove informazioni di registro e pertanto non può essere usato con i registri locali. Si intendeva usare x-regenerate ${p0}?", + "UnableToFindRegistry$": "Non è possibile trovare il registro ${p0}.", "NoArtifactsAreBeingAcquired": "Non sono stati acquisiti artefatti", - "removesAllFilesInTheLocalCache": "rimuove tutti i file nella cache locale", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "abilita la modalità di debug, visualizza errori interni sul funzionamento di ${p0}", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "procede con l'azione (potenzialmente pericolosa) senza conferma", - "showsTheinstalledArtifacts": "mostra gli artefatti _installati_", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Esegue il dump delle variabili di ambiente e di altre proprietà in un file JSON con il percorso fornito dall'utente.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Percorso completo del file in cui verranno scritte le proprietà di MSBuild.", - "ApplyAnyDeprecationFixups": "Applica tutte le correzioni per deprecazione.", - "overrideThePathToTheProjectFolder": "esegui l'override del percorso della cartella del progetto", - "UnableToFindProjectEnvironment$": "Non è possibile trovare l'ambiente del progetto ${p0}", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "abilita la modalità dettagliata, visualizza i problemi dettagliati relativi al processo", - "aVersionOrVersionRangeToMatch": "una versione o un intervallo di versioni corrispondente" + "UnableToFindProjectEnvironment$": "Non è possibile trovare l'ambiente del progetto ${p0}" } diff --git a/locales/messages.ja.json b/locales/messages.ja.json index 0e02dbdaee..f10c8ecf20 100644 --- a/locales/messages.ja.json +++ b/locales/messages.ja.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "ビルトイン レジストリ", "AConfigurationObject": "構成オブジェクト", "ADateVersionString": "日付バージョン文字列", + "ADefaultFeature": "既定の機能", "ADemandObject": "要求オブジェクト", "ADependency": "依存関係", + "ADependencyFeature": "依存関係の機能", "ADictionaryOfContacts": "連絡先の辞書", "AFeature": "機能", + "AFeatureName": "機能名", "AFilesystemRegistry": "ファイルシステム レジストリ", "AGitObjectSha": "Git オブジェクト SHA", "AGitReference": "Git 参照 (ブランチなど)", @@ -37,19 +40,19 @@ "AStringStringDictionary": "\"string\": \"string\" ディクショナリ", "AUrl": "URL", "AVcpkgRepositoryCommit": "vcpkg リポジトリ コミット", - "AVersionConstraint": "バージョンの制約", + "AVersionConstraint": "バージョン制約", "AVersionDatabaseEntry": "バージョン データベース エントリ", "AVersionObject": "バージョン オブジェクト", "AVersionOfAnyType": "任意の種類のバージョン", "AddArtifactOnlyOne": "'{command_line}' は一度に 1 つの成果物のみを追加できます。", "AddCommandFirstArg": "追加する最初のパラメーターは 'artifact' または 'port' である必要があります。", "AddFirstArgument": "「{command_line}」の最初の引数は「artifact」または「port」である必要があります。", - "AddHelp": "指定されたポートまたは成果物を、現在のディレクトリに関連付けられているマニフェストに追加します。", "AddPortRequiresManifest": "'{command_line}' にはアクティブなマニフェスト ファイルが必要です。", "AddPortSucceeded": "vcpkg.json ファイルへのポートの追加に成功しました。", "AddRecurseOption": "削除する場合は、--recurse オプションを使用してコマンドを実行します。", "AddTripletExpressionNotAllowed": "ここではトリプレット式は使用できません。代わりに、「{package_name}:{triplet}」を「{package_name}」に変更することができます。", "AddVersionAddedVersionToFile": "バージョン {version} を {path} に追加しました", + "AddVersionArtifactsOnly": "--version は成果物のみであり、vcpkg 追加ポートでは使用できません", "AddVersionCommitChangesReminder": "変更をコミットしたことを覚えていますか?", "AddVersionCommitResultReminder": "結果をコミットすることを忘れないでください。", "AddVersionDetectLocalChangesError": "Git 状態出力で予期しない形式が存在するため、ローカルの変更の検出をスキップしています", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "{package_name} のチェックイン ファイルが変更されましたが、バージョンは更新されませんでした", "AddVersionPortFilesShaUnchanged": "{package_name} のチェックイン ファイルはバージョン {version} から変更されていません", "AddVersionPortHasImproperFormat": "{package_name} が正しく書式設定されていません", - "AddVersionSuggestNewVersionScheme": "ポート \"{new_scheme package_name}\" の \"{old_scheme}\" ではなく、バージョン スキーム \"{package_name}\" を使用します。\n--{option} を使用してこのチェックを無効にします。", + "AddVersionSuggestNewVersionScheme": "ポート \"{package_name}\" で \"{old_scheme}\" ではなくバージョン スキーム \"{new_scheme}\" を\n使用します。このチェックを無効にするには、--{option} を使用します。", "AddVersionUnableToParseVersionsFile": "バージョン ファイル {path} を解析できません", "AddVersionUncommittedChanges": "{package_name} にコミットされていない変更があります", "AddVersionUpdateVersionReminder": "バージョンまたはポートのバージョンを更新したことを覚えていますか?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} は既にインストールされています", "AlreadyInstalledNotHead": "{spec} は既にインストールされています -- HEAD からビルドしていません", "AmbiguousConfigDeleteConfigFile": "マニフェストと構成ファイルの両方によって提供される vcpkg 構成があいまいです。\n-- 構成ファイル {path} の削除", + "AnArrayOfDefaultFeatures": "既定の機能の配列", "AnArrayOfDependencies": "依存関係の配列", "AnArrayOfDependencyOverrides": "依存関係オーバーライドの配列", + "AnArrayOfFeatures": "機能の配列", "AnArrayOfIdentifers": "識別子の配列", "AnArrayOfOverlayPaths": "オーバーレイ パスの配列", "AnArrayOfOverlayTripletsPaths": "オーバーレイ 3 列パスの配列", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "コンピューターで別のインストールが進行中です。再試行する前に 6 をスリープ状態にします。", "AppliedUserIntegration": "この vcpkg ルートにユーザー全体の統合を適用しました。", "ApplocalProcessing": "vcpkg applocal 処理: {path}", + "ArtifactsBootstrapFailed": "vckpg-artifacts がインストールされておらず、ブートストラップできませんでした。", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts がインストールされておらず、VCPKG_ROOT が読み取り専用と見なされているためインストールできません。'one liner' を使用して vcpkg を再インストールすればこの問題を解決できる可能性があります。", + "ArtifactsNotOfficialWarning": "非公式の vcpkg-artifacts を使用しています ", "ArtifactsOptionIncompatibility": "--{option} は成果物の検索には影響しません。", + "ArtifactsOptionJson": "環境変数とその他のプロパティが記録される JSON ファイルへの完全パス", + "ArtifactsOptionMSBuildProps": "MSBuild プロパティが書き込まれるファイルへの完全なパス", + "ArtifactsOptionVersion": "一致するバージョンまたはバージョンの範囲; 成果物に対してのみ有効", + "ArtifactsOptionVersionMismatch": "--version スイッチの数は、名前付き成果物の数と一致する必要があります", + "ArtifactsSwitchARM": "成果物を取得するときにホストの検出を ARM に強制します", + "ArtifactsSwitchARM64": "成果物を取得するときにホストの検出を ARM64 に強制します", + "ArtifactsSwitchAll": "すべての既知の成果物レジストリを更新します", + "ArtifactsSwitchAllLanguages": "成果物を取得するときにすべての言語ファイルを取得します", + "ArtifactsSwitchForce": "成果物が既に取得されている場合は、強制的に再取得します", + "ArtifactsSwitchFreebsd": "成果物を取得するときにホストの検出を FreeBSD に強制します", + "ArtifactsSwitchLinux": "成果物を取得するときにホストを Linux に強制的に検出します", + "ArtifactsSwitchNormalize": "非推奨の修正プログラムを適用します", + "ArtifactsSwitchOnlyOneHostPlatform": "1 つのホスト プラットフォーム (--x64、--x86、--arm、--arm64) のみを設定できます。", + "ArtifactsSwitchOnlyOneOperatingSystem": "1 つのオペレーティング システム (--windows、--osx、--linux、--freebsd) のみを設定できます。", + "ArtifactsSwitchOnlyOneTargetPlatform": "1 つのターゲット プラットフォーム (--target:x64、--target:x86、--target:arm、--target:arm64) のみを設定できます。", + "ArtifactsSwitchOsx": "成果物を取得するときにホストの検出を MacOS に強制します", + "ArtifactsSwitchTargetARM": "成果物を取得するときにターゲット検出を ARM に設定します", + "ArtifactsSwitchTargetARM64": "成果物を取得するときにターゲット検出を ARM64 に設定します", + "ArtifactsSwitchTargetX64": "成果物を取得するときにターゲット検出を x64 に設定します", + "ArtifactsSwitchTargetX86": "成果物を取得するときにターゲットを x86 に設定します", + "ArtifactsSwitchWindows": "成果物を取得するときにホストの検出を Windows に強制します", + "ArtifactsSwitchX64": "成果物を取得するときにホストの検出を x64 に強制します", + "ArtifactsSwitchX86": "成果物を取得するときにホストの検出を x86 に強制します", "AssetCacheProviderAcceptsNoArguments": "予期しない引数: '{value}' は引数を受け付けませんでした", - "AssetSourcesArg": "資産キャッシュのソースを追加します。'vcpkg help assetcaching' を参照してください。", + "AssetSourcesArg": "資産キャッシュ ソース。'vcpkg help assetcaching' を参照してください", "AttemptingToFetchPackagesFromVendor": "{vendor} から {count} 個のパッケージをフェッチしようとしています", "AttemptingToSetBuiltInBaseline": "vcpkg-configuration.json で default-registry をオーバーライドしながら、vcpkg.json で builtin-baseline を設定しようとしています。\nvcpkg-configuration.json の default-registry が使用されます。", "AuthenticationMayRequireManualAction": "1 つ以上の {vendor} 資格情報プロバイダーが手動操作を要求しました。対話機能を許可するには、バイナリ ソース 'interactive' を追加します。", "AutoSettingEnvVar": "-- \"{env_var}\"環境変数を自動的に \"{url}\"に設定しています。", "AutomaticLinkingForMSBuildProjects": "すべての MSBuild C++ プロジェクトで、インストールされているすべてのライブラリの #include を実行できるようになりました。リンクは自動的に処理されます。新しいライブラリをインストールすると、すぐに利用できるようになります。", - "AvailableArchitectureTriplets": "使用可能なアーキテクチャ トリプレット:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 以降では、インストールされている任意のライブラリを #include できるようになりました。リンクは自動的に処理されます。新しいライブラリをインストールすると、すぐに使用できるようになります。", "AvailableHelpTopics": "利用可能なヘルプ トピック:", "AzUrlAssetCacheRequiresBaseUrl": "予期しない引数: アセット構成 'azurl' にはベース URL が必要です", "AzUrlAssetCacheRequiresLessThanFour": "予期しない引数: アセット構成 'azurl' には 4 個未満の引数が必要です", "BaselineConflict": "マニフェスト ファイルで vcpkg-configuration.default-registry を指定すると、組み込みのベースラインと競合します。\nこれらの競合する設定のいずれかを削除してください。", "BaselineFileNoDefaultField": "コミット {commit_sha} のベースライン ファイルが無効でした (\"default\" フィールドがありません)。", - "BaselineFileNoDefaultFieldPath": "{path} のベースライン ファイルが無効でした。(\"default\" フィールドがありません)", "BaselineGitShowFailed": "コミット '{commit_sha}' からベースラインをチェックアウトしているときに、`git show` versions/baseline.json に失敗しました。これは、'git fetch' を使用してコミットをフェッチすることで修正できる可能性があります。", "BaselineMissing": "ベースライン バージョンが見つかりません。以下を実行してください:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\n{version} をベースライン バージョンとして設定します。", - "BaselineMissingDefault": "リポジトリ {url} のコミット `\"{commit_sha}\"` からの baseline.json が無効でした (\"default\" フィールドが含まれていません)。", - "BinarySourcesArg": "バイナリ キャッシュのソースを追加します。'vcpkg help binarycaching' を参照してください。", + "BinaryCacheVendorHTTP": "HTTP サーバー", + "BinarySourcesArg": "バイナリ キャッシュ ソース。'vcpkg help binarycaching' を参照してください", "BinaryWithInvalidArchitecture": "{path}\n 予期された値: {expected} が {actual} でした", "BuildAlreadyInstalled": "{spec} は既にインストールされています。ビルドする前に {spec} を削除してください。", "BuildDependenciesMissing": "ビルド コマンドには、すべての依存関係が既にインストールされている必要があります。\n次の依存関係がありません:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "成功", "BuildResultSummaryHeader": "{triplet} の概要", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(試験段階) buildtrees ルート ディレクトリを指定します。", + "BuildTreesRootDir": "Buildtrees ディレクトリ (試験段階)", "BuildTroubleshootingMessage1": "'git pull' と 'vcpkg update' で最新のポート ファイルを使用していることを確認してください。\nその後、次の場所で既知の問題を確認します:", "BuildTroubleshootingMessage2": "次の場所で新しい問題を送信できます:", "BuildTroubleshootingMessage3": "バグ報告のタイトルに「[{package_name}] ビルド エラー」を含め、バグの説明に次のバージョン情報を含め、関連する失敗ログを上記から添付します。", "BuildTroubleshootingMessage4": "問題を報告するときは、{path} の事前に入力されたテンプレートを使用してください。", - "BuildTroubleshootingMessageGH": "実行して問題を提出することもできます (GitHub cli をインストールする必要があります)。", + "BuildTroubleshootingMessageGH": "実行して問題を提出することもできます (GitHub CLI をインストールする必要があります)。", "BuildingFromHead": "HEAD から {spec} をビルドしています...", "BuildingPackage": "{spec} をビルドしています...", "BuildingPackageFailed": "{spec} のビルドに失敗しました: {build_result}", "BuildingPackageFailedDueToMissingDeps": "次の依存関係がないためです。", - "BuiltInTriplets": "vcpkg 組み込みトリプレット:", + "BuiltInTriplets": "組み込みのトリプレット:", "BuiltWithIncorrectArchitecture": "次のファイルは、正しくないアーキテクチャ用にビルドされました:", "CISettingsExclude": "スキップするポートのコンマ区切りの一覧", "CISettingsOptCIBase": "ci.baseline.txt ファイルへのパス。ポートをスキップし、回帰を検出するために使用されます。", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "決定されたすべてのパッケージ ハッシュを出力するファイル", "CISettingsOptParentHashes": "変更されたパッケージのセットを減らすために、親 CI 状態のパッケージ ハッシュを読み取るファイル", "CISettingsOptSkippedCascadeCount": "--exclude とサポートの数が、この数値と完全に等しい数スキップすることをアサートします", - "CISettingsOptXUnit": "結果を XUnit 形式で出力するファイル (内部)", + "CISettingsOptXUnit": "結果を XUnit 形式で出力するファイル", "CISettingsVerifyGitTree": "各 Git ツリー オブジェクトが宣言されたバージョンと一致することを確認します (これは非常に低速です)", - "CISettingsVerifyVersion": "エラーだけでなく、各ポートの結果を出力します。", - "CISwitchOptAllowUnexpectedPassing": "「合格、失敗リストから削除 」の結果を出力しないことを示します。", - "CISwitchOptDryRun": "プランを実行せずに印刷する", - "CISwitchOptRandomize": "インストール順序をランダム化する", - "CISwitchOptSkipFailures": "ci.baseline.txt で '=fail' とマークされたポートをスキップする必要があることを示します。", - "CISwitchOptXUnitAll": "変更されていないポートも XUnit 出力に報告する (内部)", + "CISettingsVerifyVersion": "エラーだけでなく、各ポートの結果を出力します", + "CISkipInstallation": "次のパッケージは既にインストールされており、再度ビルドされることはありません", + "CISwitchOptAllowUnexpectedPassing": "「合格、失敗リストから削除 」 結果を抑制します", + "CISwitchOptDryRun": "プランを実行せずに印刷します", + "CISwitchOptRandomize": "インストール順序をランダム化します", + "CISwitchOptSkipFailures": "ci.baseline.txt で '=fail' とマークされたポートをスキップします", + "CISwitchOptXUnitAll": "XUnit 出力で変更されていないポートを報告する", "CMakeTargetsUsage": "{package_name} は CMake ターゲットを提供します:", "CMakeTargetsUsageHeuristicMessage": "# これはヒューリスティックに生成され、正しくない可能性があります", "CMakeToolChainFile": "CMake プロジェクトでは次を使用する必要があります: \"-DCMAKE_TOOLCHAIN_FILE={path}\"", "CMakeUsingExportedLibs": "CMake プロジェクトでエクスポートされたライブラリを使用するには、CMake コマンド ラインに {value} を追加します。", - "CacheHelp": "引数は、検索対象のサブ文字列であるか、またはすべてのキャッシュされたライブラリを表示する no 引数である必要があります。", "CheckedOutGitSha": "チェックアウトされた Git SHA: {commit_sha}", "CheckedOutObjectMissingManifest": "チェックアウトされたオブジェクトにコントロール ファイルまたは vcpkg.json ファイルが含まれていません。", "ChecksFailedCheck": "vcpkg がクラッシュしました。その他の詳細はありません。", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "bootstrap-vcpkg を再実行して vcpkg を更新すると、このエラーが解決される可能性があります。", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing は、--ci-baseline を介してベースラインが指定されている場合にのみ使用できます。", "CiBaselineDisallowedCascade": "回帰: {spec} がカスケードされましたが、渡す必要があります。({path})。", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "回帰: 独立した {spec} が {build_result} で失敗しました。", "CiBaselineRegression": "回帰: {spec} は {build_result} で失敗しました。必要な場合は、{spec}=fail を {path} に追加します。", "CiBaselineRegressionHeader": "回帰:", + "CiBaselineUnexpectedFail": "回帰: {spec} は失敗とマークされていますが、{triplet} ではサポートされていません。", + "CiBaselineUnexpectedFailCascade": "回帰: {spec} は失敗とマークされていますが、1 つの依存関係が {triplet} ではサポートされていません。", "CiBaselineUnexpectedPass": "成功、失敗リストから削除: {spec} ({path})。", "ClearingContents": "{path} の内容をクリアしています", "CmakeTargetsExcluded": "注: 追加の {count} 件のターゲットは表示されません。", - "CmdAddVersionOptAll": "すべてのポートのバージョンを処理します。", - "CmdAddVersionOptOverwriteVersion": "既存のバージョンの 'git-tree' を上書きします。", - "CmdAddVersionOptSkipFormatChk": "vcpkg.json ファイルの書式設定チェックをスキップします。", - "CmdAddVersionOptSkipVersionFormatChk": "バージョン形式の確認をスキップします。", - "CmdAddVersionOptVerbose": "エラーだけでなく、成功メッセージを出力します。", + "CmdAcquireExample1": "vcpkg acquire ", + "CmdAcquireProjectSynopsis": "マニフェストによって参照されているすべての成果物を取得します", + "CmdAcquireSynopsis": "名前付き成果物を取得します", + "CmdActivateSynopsis": "マニフェストから成果物をアクティブにします", + "CmdAddExample1": "vcpkg add port ", + "CmdAddExample2": "vcpkg add artifact ", + "CmdAddSynopsis": "マニフェストに依存関係を追加します", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "すべてのポートのバージョンを処理します", + "CmdAddVersionOptOverwriteVersion": "既存のバージョンの git-tree を上書きします", + "CmdAddVersionOptSkipFormatChk": "vcpkg.json ファイルの書式設定チェックをスキップします", + "CmdAddVersionOptSkipVersionFormatChk": "バージョン形式のチェックをスキップします", + "CmdAddVersionOptVerbose": "エラーだけでなく成功メッセージを出力する", + "CmdAddVersionSynopsis": "バージョン データベースにバージョンを追加します", + "CmdBootstrapStandaloneSynopsis": "vcpkg バイナリからのみ vcpkg ルートをブートストラップします", + "CmdBuildExample1": "vcpkg build ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "パスからポートをビルドする", + "CmdBuildSynopsis": "ポートをビルドします", + "CmdCacheExample1": "vcpkg cache ", + "CmdCacheSynopsis": "パッケージの仕様の一覧表示", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "ポートをビルドせずにサポートされているかどうかをテストします", + "CmdCiCleanSynopsis": "CI の実行を準備するためにすべてのファイルをクリアします", + "CmdCiSynopsis": "CI テストのすべてのポートのビルドを試行します", + "CmdCiVerifyVersionsSynopsis": "バージョン データベースの整合性を確認します", "CmdContactOptSurvey": "現在の vcpkg アンケートに対して既定のブラウザーを起動する", - "CmdDependInfoOptDGML": "dgml に基づいてグラフを作成します", - "CmdDependInfoOptDepth": "再帰の深さを出力に表示する", - "CmdDependInfoOptDot": "ドットに基づいてグラフを作成します", - "CmdDependInfoOptMaxRecurse": "再帰の深さの最大値を設定します。値 -1 は制限がないことを示します", - "CmdDependInfoOptSort": "依存関係の一覧の並べ替え順序を設定します。受け入れられる値は: 辞書式、トポロジカル (既定値)、x ツリー、逆順", - "CmdEditOptAll": "ポートとポート固有の buildtree サブフォルダーにエディターを開く", - "CmdEditOptBuildTrees": "ポート固有の buildtree サブフォルダーにエディターを開く", + "CmdCreateExample1": "vcpkg create ", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create ", + "CmdDeactivateSynopsis": "現在のシェルからすべての成果物のアクティブ化を削除します", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "競合する複数の形式が指定されました。--format、--dgml、--dot はいずれか 1 つだけを使用できます。", + "CmdDependInfoFormatHelp": "出力形式として 'list'、'tree'、'mermaid'、'dot'、'dgml' のいずれかを選択します", + "CmdDependInfoFormatInvalid": "--format={value} は形式として認識できません。--format は、'list'、'tree'、'mermaid'、'dot'、'dgml' のいずれかである必要があります。", + "CmdDependInfoOptDepth": "'list' 出力に再帰の深さを表示します", + "CmdDependInfoOptMaxRecurse": "再帰の深さの最大値を設定します。既定値は制限なし", + "CmdDependInfoOptSort": "'list' 形式、`lexicographical` のひとつ、'topographic'(既定値)、'reverse' の並べ替え順序を選択します", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth は、'list' および 'tree' 形式でのみ使用できます。", + "CmdDependInfoXtreeTree": "--sort=x-tree はツリー以外の形式では使用できません", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "ファイルをダウンロードします", + "CmdEditExample1": "vcpkg edit ", + "CmdEditOptAll": "ポートとポート固有の buildtree サブフォルダーにエディターを開きます", + "CmdEditOptBuildTrees": "ポート固有の buildtree サブフォルダーにエディターを開きます", "CmdEnvOptions": "インストールされている {path} を {env_var} に追加します", - "CmdExportOpt7Zip": "7zip (.7z) ファイルにエクスポートする", - "CmdExportOptChocolatey": "Chocolatey パッケージをエクスポートする (試験的な機能)", + "CmdExportEmptyPlan": "0 個のパッケージのエクスポートの作成を拒否しています。エクスポートする前にパッケージをインストールしてください。", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", + "CmdExportOpt7Zip": "7zip (.7z) ファイルにエクスポートします", + "CmdExportOptChocolatey": "Chocolatey パッケージをエクスポートする (試験段階)", "CmdExportOptDebug": "プレハブデバッグを有効にする", - "CmdExportOptDryRun": "実際にはエクスポートしないでください。", + "CmdExportOptDryRun": "実際にはエクスポートしません", "CmdExportOptIFW": "IFW ベースのインストーラーにエクスポートする", - "CmdExportOptInstalled": "インストールされているすべてのパッケージをエクスポートする", - "CmdExportOptMaven": "Maven を有効にする", - "CmdExportOptNuget": "NuGet パッケージをエクスポートする", - "CmdExportOptPrefab": "プレハブ形式にエクスポート", + "CmdExportOptInstalled": "インストールされているすべてのパッケージをエクスポートします", + "CmdExportOptMaven": "Maven を有効にします", + "CmdExportOptNuget": "NuGet パッケージをエクスポートします", + "CmdExportOptPrefab": "プレハブ形式へのエクスポート", "CmdExportOptRaw": "圧縮されていないディレクトリにエクスポートする", "CmdExportOptZip": "zip ファイルにエクスポートする", - "CmdExportSettingChocolateyMaint": "エクスポートされた Chocolatey パッケージのメンテナンスツールを指定する (試験的な機能)", - "CmdExportSettingChocolateyVersion": "エクスポートされた Chocolatey パッケージに追加するバージョン サフィックスを指定します (試験段階の機能)", - "CmdExportSettingConfigFile": "インストーラー構成の一時ファイル パスを指定する", - "CmdExportSettingInstallerPath": "エクスポートしたインストーラーのファイル パスを指定します", - "CmdExportSettingNugetDesc": "エクスポートされた NuGet パッケージの説明を指定する", - "CmdExportSettingNugetID": "エクスポートされた NuGet パッケージの ID を指定します (オーバーライド --output)", - "CmdExportSettingNugetVersion": "エクスポートされた NuGet パッケージのバージョンを指定する", - "CmdExportSettingOutput": "出力名を指定します (ファイル名の作成に使用)", - "CmdExportSettingOutputDir": "生成された成果物の出力ディレクトリを指定する", - "CmdExportSettingPkgDir": "再パックされたパッケージの一時ディレクトリ パスを指定します", + "CmdExportSettingChocolateyMaint": "エクスポートされた Chocolatey パッケージの維持系統 (試験段階)", + "CmdExportSettingChocolateyVersion": "エクスポートされた Chocolatey パッケージに追加するバージョン サフィックス (試験段階)", + "CmdExportSettingConfigFile": "インストーラー構成の一時ファイル パス", + "CmdExportSettingInstallerPath": "エクスポートされたインストーラーのファイル パス", + "CmdExportSettingNugetDesc": "エクスポートされた NuGet パッケージの説明", + "CmdExportSettingNugetID": "エクスポートされた NuGet パッケージの ID (--output をオーバーライド)", + "CmdExportSettingNugetVersion": "エクスポートされた NuGet パッケージのバージョン", + "CmdExportSettingOutput": "出力名 (ファイル名の構築に使用)", + "CmdExportSettingOutputDir": "生成された成果物の出力ディレクトリ", + "CmdExportSettingPkgDir": "再パックされたパッケージの一時ディレクトリ パス", "CmdExportSettingPrefabArtifactID": "成果物 ID は、Maven の仕様に従ったプロジェクトの名前です", "CmdExportSettingPrefabGroupID": "GroupId は Maven の仕様に従ってプロジェクトを一意に識別します", "CmdExportSettingPrefabVersion": "バージョンは、Maven の仕様に従ったプロジェクトの名前です", - "CmdExportSettingRepoDir": "エクスポートされたリポジトリのディレクトリ パスを指定します", - "CmdExportSettingRepoURL": "オンライン インストーラーのリモート リポジトリ URL を指定します", + "CmdExportSettingRepoDir": "エクスポートされたリポジトリのディレクトリ パス", + "CmdExportSettingRepoURL": "オンライン インストーラーのリモート リポジトリ URL", "CmdExportSettingSDKMinVersion": "Android でサポートされている SDK の最小バージョン", "CmdExportSettingSDKTargetVersion": "Android ターゲット SDK のバージョン", - "CmdFetchOptXStderrStatus": "stdout ではなく stderr にメッセージを直接ステータス/ダウンロードしています。(エラー/失敗は引き続き stdout に移動します)", - "CmdFormatManifestOptAll": "すべてのポートのマニフェスト ファイルをフォーマットします。", - "CmdFormatManifestOptConvertControl": "CONTROL ファイルをマニフェスト ファイルに変換します。", - "CmdGenerateMessageMapOptNoOutputComments": "メッセージ マップを生成するときは、コメントを除外します (英語のローカライズ ファイルの生成に役立ちます)", - "CmdInfoOptInstalled": "(試験段階)利用可能ではなくインストール済みパッケージに関するレポート", - "CmdInfoOptTransitive": "(試験段階)インストールされているパッケージの依存関係についても報告する", - "CmdNewOptApplication": "アプリケーション マニフェストを作成します (名前やバージョンは必要ありません)。", - "CmdNewOptSingleFile": "vcpkg-configuration.json を vcpkg.json に埋め込みます。", + "CmdExportSynopsis": "インストールされているポートのスタンドアロン展開を作成します", + "CmdFetchOptXStderrStatus": "stdout ではなく stderr にステータス/ダウンロード メッセージを出力します (エラー/失敗は引き続き stdout に移動します)", + "CmdFetchSynopsis": "システムまたはインターネットから何かをフェッチします", + "CmdFindExample1": "vcpkg find port ", + "CmdFindExample2": "vcpkg find artifact ", + "CmdFindSynopsis": "インストールまたはアクティブ化できるポートまたは成果物を検索します", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "すべてのポートのマニフェスト ファイルをフォーマットします", + "CmdFormatManifestOptConvertControl": "CONTROL ファイルをマニフェスト ファイルに変換します", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "マニフェストの成果物の依存関係を取得せずにアクティブにしたかのように msbuild .props ファイルを生成します", + "CmdGenerateMessageMapOptNoOutputComments": "メッセージ マップを生成するときにコメントを除外します (英語のローカライズ ファイルの生成に役立ちます)", + "CmdHashExample1": "vcpkg hash ", + "CmdHashExample2": "vcpkg hash SHA256", + "CmdHashSynopsis": "ファイルの SHA256 または SHA512 を取得します", + "CmdHelpCommandSynopsis": " のヘルプの詳細を表示します", + "CmdHelpCommands": "help ", + "CmdHelpCommandsSynopsis": "ここに表示されていないまれなコマンドを含む、コマンドの完全なリストを表示します", + "CmdHelpTopic": "help ", + "CmdInfoOptInstalled": "(試験段階)使用できるパッケージではなく、インストールされたパッケージをレポートする", + "CmdInfoOptTransitive": "(試験段階)インストールされているパッケージの依存関係も報告します", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "空の Git レジストリを作成します", + "CmdInstallExample1": "vcpkg install ...", + "CmdIntegrateSynopsis": "vcpkg をコンピューター、プロジェクト、またはシェルと統合します", + "CmdListExample2": "vcpkg list ", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "アプリケーション マニフェストを作成します (名前やバージョンは必要ありません)", + "CmdNewOptSingleFile": "vcpkg-configuration.json を vcpkg.json に埋め込みます", "CmdNewOptVersionDate": "--version を ISO 8601 の日付として解釈します。(YYYY-MM-DD)", - "CmdNewOptVersionRelaxed": "--version を緩やかな数値バージョンとして解釈します。(負でない数値をドットで区切ります)", - "CmdNewOptVersionString": "--version を順序付け動作のない文字列として解釈します。", - "CmdNewSettingName": "新しいマニフェストの名前。", - "CmdNewSettingVersion": "新しいマニフェストのバージョン。", - "CmdRegenerateOptDryRun": "は実際にはアクションを実行せず、実行される内容のみを表示します", - "CmdRegenerateOptForce": "確認せずに (潜在的に危険な) アクションを続行する", - "CmdRegenerateOptNormalize": "非推奨の修正プログラムを適用する", - "CmdRemoveOptDryRun": "削除するパッケージを印刷しますが、削除しないでください", - "CmdRemoveOptOutdated": "ポート ファイルと一致しないバージョンのすべてのパッケージを選択します", - "CmdRemoveOptRecurse": "コマンド ラインで明示的に指定されていないパッケージの削除を許可する", - "CmdSetInstalledOptDryRun": "実際にビルドまたはインストールしない", - "CmdSetInstalledOptNoUsage": "インストール後に CMake の使用状況情報を印刷しないでください。", - "CmdSetInstalledOptWritePkgConfig": "外部バイナリ キャッシュで使用するために NuGet packages.config 形式のファイルを書き込みます。\n詳細については、「vcpkg help binarycaching」を参照してください。", + "CmdNewOptVersionRelaxed": "--version を緩やかな数値バージョンとして解釈します (負でない数値をドットで区切ります)", + "CmdNewOptVersionString": "--version を順序付け動作のない文字列として解釈します", + "CmdNewSettingName": "新しいマニフェストの名前", + "CmdNewSettingVersion": "新しいマニフェストのバージョン", + "CmdNewSynposis": "新しいマニフェストを作成します", + "CmdOwnsExample1": "vcpkg owns ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "コミット間のポート バージョンの差分変更", + "CmdRegenerateOptDryRun": "実際にはアクションを実行せず、実行される内容のみが表示されます", + "CmdRegenerateOptForce": "確認せずに (危険な可能性がある) アクションを続行します", + "CmdRegenerateOptNormalize": "非推奨の修正プログラムを適用します", + "CmdRemoveExample1": "vcpkg remove ...", + "CmdRemoveOptDryRun": "削除するパッケージを印刷しますが、削除しません", + "CmdRemoveOptOutdated": "組み込みのレジストリと一致しないバージョンのすべてのパッケージを削除します", + "CmdRemoveOptRecurse": "明示的に指定されていない依存パッケージの削除を許可します", + "CmdSearchExample1": "vcpkg search ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "実際にはビルドまたはインストールしません", + "CmdSetInstalledOptNoUsage": "インストール後に CMake の使用状況情報を印刷しない", + "CmdSetInstalledOptWritePkgConfig": "外部バイナリ キャッシュで使用するために NuGet packages.config 形式のファイルを書き込みます。詳細については、`vcpkg help binarycaching` を参照してください", + "CmdSetInstalledSynopsis": "インストールされたパッケージが指定されたものと完全に一致するよう、パッケージをインストール、アップグレード、または削除します", "CmdSettingCopiedFilesLog": "作成するコピーされたファイルのログへのパス", "CmdSettingInstalledDir": "使用するインストール済みツリーへのパス", "CmdSettingTLogFile": "作成する tlog ファイルへのパス", "CmdSettingTargetBin": "分析するバイナリへのパス", - "CmdUpdateBaselineOptDryRun": "プランを実行せずに印刷する", - "CmdUpdateBaselineOptInitial": "まだ存在しない vcpkg.json に 'builtin-baseline' を追加する", - "CmdUpgradeOptAllowUnsupported": "サポートされていないポートでエラーが発生する代わりに、警告を続行します。", + "CmdUpdateBaselineOptDryRun": "プランを実行せずに印刷します", + "CmdUpdateBaselineOptInitial": "'builtin-baseline' がまだない vcpkg.json にこれを追加します", + "CmdUpdateBaselineSynopsis": "マニフェスト内の Git レジストリのベースラインをそれらのレジストリの HEAD コミットに更新します", + "CmdUpdateRegistryAll": "すべての既知の成果物レジストリを更新します", + "CmdUpdateRegistryAllExcludesTargets": "update registry --all は、成果物レジストリのリストでは使用できません", + "CmdUpdateRegistryAllOrTargets": "update registry には、更新する成果物レジストリ名または URI のリスト、または --all のいずれかが必要です。", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "成果物レジストリを再ダウンロードします", "CmdUpgradeOptNoDryRun": "実際にアップグレードする", "CmdUpgradeOptNoKeepGoing": "失敗時にパッケージのインストールを停止する", + "CmdUseExample1": "vcpkg use ", + "CmdUseSynopsis": "このシェルで 1 つの成果物をアクティブにします", + "CmdVSInstancesSynopsis": "検出された Visual Studio インスタンスを一覧表示します", "CmdXDownloadOptHeader": "URL からフェッチするときに使用する追加のヘッダー", "CmdXDownloadOptSha": "ダウンロードするファイルのハッシュ", - "CmdXDownloadOptSkipSha": "ダウンロードしたファイルの SHA512 を確認しない", - "CmdXDownloadOptStore": "フェッチする代わりにファイルを格納する必要があることを示します", + "CmdXDownloadOptSkipSha": "ダウンロードしたファイルの SHA512 のチェックをスキップします", + "CmdXDownloadOptStore": "ファイルをフェッチするよりも先にファイルを格納します", "CmdXDownloadOptUrl": "キャッシュに存在しない場合にダウンロードして保存する URL", + "CmdZApplocalSynopsis": "インストールされているツリーから、アプリのローカル配置のバイナリの場所にバイナリの依存関係をコピーします", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "すべてのパスから削除する先頭ディレクトリの数", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", "CommandFailed": "コマンド: \n{command_line}\nに失敗しました。次の結果が返されました:", - "Commands": "コマンド:", - "CommunityTriplets": "VCPKG コミュニティ トリプレット:", + "CommunityTriplets": "コミュニティ トリプレット:", "ComparingUtf8Decoders": "Utf8Decoders と異なる来歴との比較では、常にエラーが発生します", "CompressFolderFailed": "フォルダー \"{path}\":を圧縮できませんでした:", "ComputingInstallPlan": "インストール プランを計算しています...", "ConfigurationErrorRegistriesWithoutBaseline": "{path} で定義されている構成が無効です。\n\nレジストリを使用するには、既定のレジストリにベースラインが設定されているか、既定のレジストリが null である必要があります。\n\n詳細については、{url} を参照してください。", "ConfigurationNestedDemands": "[\"{json_field}\"] に入れ子になった 'demands' オブジェクトが含まれています (入れ子になった 'demands' には効果がありません)", "ConflictingFiles": "次のファイルはすでに {path} にインストールされており、{spec} と競合しています", + "ConsideredVersions": "次の実行可能ファイルが検討されましたが、{version} のバージョン要件により破棄されました。", "ConstraintViolation": "以下の制約違反が見つかりました。", "ContinueCodeUnitInStart": "開始位置で continue コード単位が見つかりました", "ControlAndManifestFilesPresent": "マニフェスト ファイルとコントロール ファイルの両方がポート ディレクトリに存在します: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "データベースが破損しています。", "CorruptedInstallTree": "vcpkg の 'installed' ツリーが破損しています。", "CouldNotDeduceNugetIdAndVersion": "ファイル名 {path} から nuget ID とバージョンを推測できませんでした", - "CouldNotFindBaseline": "ベースライン ファイル {path} に明示的に指定されたベースライン `\"{commit_sha}\"` が見つかりませんでした", - "CouldNotFindBaselineForRepo": "リポジトリ {package_name} のベースライン `\"{commit_sha}\"` が見つかりませんでした", - "CouldNotFindBaselineInCommit": "リポジトリ {package_name} からコミット`\"{commit_sha}\"` にベースラインが見つかりませんでした:", + "CouldNotFindBaselineInCommit": "{package_name} の {commit_sha} で {url} にベースラインが見つかりませんでした。", "CouldNotFindGitTreeAtCommit": "コミット {commit_sha} でリポジトリ {package_name} に `versions` の Git ツリーが見つかりませんでした", "CouldNotFindToolVersion": "{path} に が見つかりませんでした", "CouldNotFindVersionDatabaseFile": "バージョン データベース ファイルが見つかりませんでした: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "環境変数 VCPKG_DEFAULT_BINARY_CACHE はディレクトリである必要があります (旧: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "環境変数 VCPKG_DEFAULT_BINARY_CACHE は絶対変数である必要があります (旧: {path})", "DefaultBinaryCacheRequiresDirectory": "環境変数 VCPKG_DEFAULT_BINARY_CACHE はディレクトリである必要があります (旧: {path})", - "DefaultBrowserLaunched": "既定のブラウザーで {url} が開かれました。", + "DefaultFeatureCore": "\"コア\" 機能は既定の機能をオフにするため、既定の機能一覧に含めることはできません", + "DefaultFeatureDefault": "\"既定\" 機能は既定の機能のセットを参照するため、既定の機能の一覧に含めることはできません", + "DefaultFeatureIdentifier": "既定の機能の名前は識別子である必要があります", "DefaultFlag": "既定で --{option} をオンにしています。", "DefaultRegistryIsArtifact": "既定のレジストリを成果物レジストリにすることはできません。", - "DefaultTriplet": "2023 年 9 月のリリース以降、vcpkg ライブラリのデフォルトのトリプレットは、x86-windows から検出されたホストのトリプレット ({triplet}) に変更されます。このメッセージを解決するには、--triplet x86-windows を追加して、同じ動作を維持します。", + "DefaultTripletChanged": "2023 年 9 月のリリースでは、vcpkg ライブラリのデフォルトのトリプレットは、x86-windows から検出されたホストのトリプレット ({triplet}) に変更されます。以前の動作の場合は、--triplet x86-windows を追加します。このメッセージを非表示にするには、--triplet {triplet} を追加します。", "DeleteVcpkgConfigFromManifest": "-- または、マニフェスト ファイル {path} から \"vcpkg-configuration\" を削除します。", + "DependencyFeatureCore": "\"コア\" 機能を依存関係の機能一覧に含めることはできません。既定の機能を無効にするには、代わりに \"default-features\": false を追加してください。", + "DependencyFeatureDefault": "\"既定\" 機能を依存関係の機能一覧に含めることはできません。既定の機能を有効にするには、代わりに \"default-features\": true を追加してください。", + "DependencyGraphCalculation": "依存関係グラフの送信が有効になっています。", + "DependencyGraphFailure": "依存関係グラフの送信に失敗しました。", + "DependencyGraphSuccess": "依存関係グラフの送信に成功しました。", "DeprecatedPrefabDebugOption": "--prefab-debug は現在非推奨です。", "DetectCompilerHash": "トリプレット「{triplet}」のコンパイラ ハッシュを検出しています...", "DocumentedFieldsSuggestUpdate": "これらのフィールドを認識する必要がある場合は、vcpkg ツールの更新をお試しください。", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "ファイルに必要なハッシュがありません:\nurl: {url}\nファイル: {path}\n必要なハッシュ: {expected}実際の\nハッシュ: {actual}", "DownloadFailedRetrying": "ダウンロードに失敗しました -- {value}ミリ秒後に再試行しています", "DownloadFailedStatusCode": "{url}: 失敗しました: 状態コード {value}", - "DownloadRootsDir": "ダウンロード ルート ディレクトリを指定します。\n(既定値: {env_var})", + "DownloadRootsDir": "ディレクトリをダウンロードします (既定値: {env_var})", "DownloadWinHttpError": "{url}: {system_api} が終了コード {exit_code} で失敗しました", "DownloadedSources": "{spec} 用にダウンロードされたソース", "DownloadingPortableToolVersionX": "{tool_name} の適切なバージョンが見つかりませんでした (v{version} が必要です) ポータブル {tool_name} {version} をダウンロードしています...", "DownloadingTool": "{tool_name} をダウンロードしています...\n{url}->{path}", "DownloadingUrl": "{url} をダウンロードしています", - "DownloadingVcpkgCeBundle": "vcpkg-artifacts バンドル {version} をダウンロードしています...", - "DownloadingVcpkgCeBundleLatest": "最新の vcpkg-artifacts バンドルをダウンロードしています...", "DownloadingVcpkgStandaloneBundle": "スタンドアロン バンドル {version} をダウンロードしています。", "DownloadingVcpkgStandaloneBundleLatest": "最新のスタンドアロン バンドルをダウンロードしています。", "DuplicatePackagePattern": "パッケージ \"{package_name}\" が重複しています。", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "コンパイラ情報の検出中:\n\"{path}\"のログ ファイルの内容は次のとおりです:", "ErrorIndividualPackagesUnsupported": "マニフェスト モードでは、「vcpkg install」は個々のパッケージ引数をサポートしていません。\n追加のパッケージをインストールするには、vcpkg.json を編集し、パッケージ引数を指定せずに「vcpkg install」を実行してください。", "ErrorInvalidClassicModeOption": "オプション --{option}はクラシック モードではサポートされていません。マニフェストが見つかりませんでした。", + "ErrorInvalidExtractOption": "--{option} は、負でない整数または 'AUTO' に設定する必要があります。", "ErrorInvalidManifestModeOption": "オプション --{option}はマニフェスト モードではサポートされていません。", "ErrorMessage": "エラー: ", "ErrorMessageMustUsePrintError": "{value}という名前のメッセージは「error:」で始まります。代わりに、コードの先頭に「ErrorMessage」を追加するように変更する必要があります。", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "{path} の解析中にエラーが発生しました。", "ErrorWhileWriting": "{path} の書き込み中にエラーが発生しました。", "ErrorsFound": "次のエラーが見つかりました:", - "Example": "例:", + "ExamplesHeader": "例:", "ExceededRecursionDepth": "再帰深度を超過しました。", "ExcludedPackage": "{spec} を除外しました", "ExcludedPackages": "次のパッケージは除外されています。", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "メンテナンス ツールをエクスポートしています...", "ExportingPackage": "{package_name} のエクスポート...", "ExtendedDocumentationAtUrl": "'{url}' で利用できる拡張ドキュメント。", + "ExtractHelp": "アーカイブを抽出します。", "ExtractingTool": "{tool_name} を抽出しています...", "FailedPostBuildChecks": "{count} 個のビルド後チェックの問題が見つかりました。これらのポートをキュレーションされたカタログに送信するには、まず portfile を修正してください: {path}", "FailedToAcquireMutant": "ミュータント {path} を取得できませんでした", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "現在のコミットを特定できませんでした:", "FailedToDownloadFromMirrorSet": "ミラー セットからダウンロードできませんでした", "FailedToExtract": "\"{path}\" を抽出できませんでした:", - "FailedToFetchError": "{error_msg}\n {package_name} をフェッチできませんでした:", - "FailedToFindBaseline": "baseline.json が見つかりませんでした", + "FailedToFetchRepo": "{url} をフェッチできませんでした。", "FailedToFindPortFeature": "{package_name} には {feature} という名前の機能がありません。", "FailedToFormatMissingFile": "書式設定するファイルがありません。\n--all または明示的なファイルを渡して、書式設定または変換してください。", "FailedToLoadInstalledManifest": "次のエラーのため、{package_name} の制御ファイルまたはマニフェスト ファイルを読み込めませんでした。{package_name} を削除してから、もう一度お試しください。", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "{path} でファイル システム ロックを取得できませんでした", "FailedToWriteManifest": "マニフェスト ファイル {path} を書き込めませんでした", "FailedVendorAuthentication": "1 つ以上の {vendor} 資格情報プロバイダーを認証できませんでした。資格情報を提供する方法の詳細については、'{url}' を参照してください。", - "FeedbackAppreciated": "フィードバックをお送りいただきありがとうございました。", "FetchingBaselineInfo": "{package_name} からベースライン情報をフェッチしています...", "FetchingRegistryInfo": "{url} ({value}) からレジストリ情報をフェッチしています...", "FieldKindDidNotHaveExpectedValue": "\"kind\" に必要な値がありませんでした: (次のいずれかが必要です: {expected}; {actual} が見つかりました)", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "次のファイルに絶対パスが見つかりました:", "FilesExported": "エクスポートされたファイルの場所: {path}", "FindHelp": "指定された成果物またはポートを検索します。'artifact' または 'port' の後にパラメーターがない場合は、すべてを表示します。", + "FindVersionArtifactsOnly": "--version は vcpkg 検索または vcpkg 検索ポートでは使用できません", "FishCompletion": "vcpkg fish 補完は既に \"{path}\" に追加されています。", "FloatingPointConstTooBig": "浮動小数点定数が大きすぎます: {count}", "FollowingPackagesMissingControl": "次のパッケージには有効な CONTROL または vcpkg.json がありません:", "FollowingPackagesNotInstalled": "次のパッケージはインストールされていません:", "FollowingPackagesUpgraded": "次のパッケージは最新です:", + "ForMoreHelp": "詳細なヘルプ", "ForceSystemBinariesOnWeirdPlatforms": "arm、s390x、ppc64le、riscv プラットフォームでは、環境変数 VCPKG_FORCE_SYSTEM_BINARIES を設定する必要があります。", "FormattedParseMessageExpression": "式: {value}", "GHAParametersMissing": "GHA バイナリ ソースでは、ACTIONS_RUNTIME_TOKEN環境変数とACTIONS_CACHE_URL環境変数を設定する必要があります。詳細については、{url} を参照してください。", @@ -470,7 +590,7 @@ "GitCommandFailed": "{command_line} を実行できませんでした", "GitFailedToFetch": "リポジトリ {url} から参照 {value} をフェッチできませんでした", "GitFailedToInitializeLocalRepository": "ローカル リポジトリ {path} を初期化できませんでした", - "GitRegistryMustHaveBaseline": "\"{package_name}\" の Git レジストリ エントリには、有効な Git コミット SHA (40 文字の 16 進数) である \"ベースライン\" フィールドが必要です。\nそのリポジトリの現在の HEAD は\"{value}\" です。", + "GitRegistryMustHaveBaseline": "Git レジストリ \"{url}\" には、有効な Git コミット SHA (40 文字の 16 進数) である \"ベースライン\" フィールドが必要です。\n現在の最新バージョンを使用するには、ベースラインをそのリポジトリの HEAD、\"{commit_sha}\" に設定します。", "GitStatusOutputExpectedFileName": "ファイル名が必要です", "GitStatusOutputExpectedNewLine": "改行が必要です", "GitStatusOutputExpectedRenameOrNewline": "名前が変更されたファイルまたは改行が必要です", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "Git が {command_line} の実行中に予期しない出力を生成しました", "GraphCycleDetected": "{package_name} のグラフ内で循環が検出されました:", "HashFileFailureToRead": "ハッシュのためにファイル \"{path}\" を読み取れませんでした: ", + "HashPortManyFiles": "{package_name} には {count} 個のファイルが含まれています。バイナリ キャッシュの ABI ハッシュを決定するときに、これらのコンテンツのハッシュ化に時間がかかることがあります。ファイル数を減らすことを検討してください。この一般的な原因は、ソース ファイルまたはビルド ファイルをポートのディレクトリに誤ってチェックアウトすることです。", "HeaderOnlyUsage": "{package_name} はヘッダーのみであり、CMake から次の方法で使用できます:", "HelpAssetCaching": "**実験的な機能: これはいつでも変更または削除される可能性があります**\n\nvcpkg はミラーを使用してダウンロードしたアセットをキャッシュし、元のソースが変更または消失した場合でも操作を継続できるようにします。\n\n資産キャッシュは、環境変数 X_VCPKG_ASSET_SOURCES をセミコロンで区切られたソースのリストに設定するか、一連の --x-asset-sources= コマンド ライン オプションを渡すことによって構成できます。コマンド ライン ソースは、環境ソースの後に解釈されます。コンマ、セミコロン、およびバックティックは、バックティック (`) を使用してエスケープできます。\n\n特定の文字列の オプション パラメーターは、それらへのアクセス方法を制御します。\"read\"、\"write\"、または \"readwrite\" として指定でき、既定値は \"read\" です。\n\n有効なソース:", "HelpAssetCachingAzUrl": "オプションで Shared Access Signature 検証を使用して、Azure Blob Storage ソースを追加します。URL にはコンテナー パスを含め、末尾の \"/\" で終了する必要があります。 が定義されている場合は、\"?\" をプレフィックスとして付ける必要があります。Azure 以外のサーバーも、\"\" の形式の GET および PUT 要求に応答する場合に機能します。", @@ -503,54 +624,51 @@ "HelpBuiltinBase": "ベースラインでは、グラフ内のすべての依存関係で最小バージョンを確立する vcpkg リポジトリ内のコミットを参照しています。たとえば、(直接または推移的に) 指定された他の制約がない場合、バージョンは最上位レベルのマニフェストのベースラインに解決されます。推移的な依存関係のベースラインは無視されます。", "HelpCachingClear": "既定を含め、以前のすべてのソースを削除します。", "HelpContactCommand": "フィードバックを送信するための連絡先情報を表示します。", - "HelpCreateCommand": "新しいポートを作成します。", - "HelpDependInfoCommand": "ポートの依存関係の一覧を表示します。", - "HelpEditCommand": "編集用のポートを開きます (エディター プログラムを設定するには、環境変数 '{env_var}' を使用します。既定値は 'code' です)。", - "HelpEnvCommand": "開発またはコンパイル用にクリーンなシェル環境を作成します。", - "HelpExampleCommand": "ヘルプ (例を含む) については、付属の README.md とドキュメント フォルダーを参照してください。", + "HelpCreateCommand": "新しいポートを作成します", + "HelpDependInfoCommand": "ポートの依存関係の一覧を表示します", + "HelpEditCommand": "必要に応じて {env_var} でポートを編集します。既定値は \"code\" です", + "HelpEnvCommand": "開発またはコンパイル用のクリーンなシェル環境を作成します", + "HelpExampleCommand": "その他のヘルプ (例を含む) については、https://learn.microsoft.com/vcpkg を参照してください", "HelpExampleManifest": "マニフェストの例:", "HelpExportCommand": "パッケージをエクスポートします。", - "HelpFormatManifestCommand": "すべての vcpkg.json ファイルをフォーマットします。vcpkg にコミットする前にこれを実行します。", "HelpHashCommand": "特定のアルゴリズム (既定の SHA512) でファイルをハッシュします。", - "HelpInitializeRegistryCommand": "ディレクトリ 内のレジストリを初期化します。", - "HelpInstallCommand": "パッケージをインストールします。", - "HelpListCommand": "インストールされているパッケージを一覧表示します。", + "HelpInstallCommand": "パッケージをインストールします", + "HelpListCommand": "インストールされているパッケージを一覧表示します", "HelpManifestConstraints": "マニフェストでは、使用中のバージョンに 3 種類の制約を配置できます", "HelpMinVersion": "Vcpkg は、最上位レベルで指定されたベースラインのバージョンやグラフ内の \"version>=\" 制約など、適用可能なすべての制約との一致を検出する最小バージョンを選択します。", "HelpOverrides": "最上位レベルのマニフェストとして使用する場合 (ディレクトリで 'vcpkg install' を実行している場合など)、オーバーライドを使用すると、マニフェストは依存関係の解決をショートし、使用するバージョンを正確に指定できます。これらは、'version-string' 依存関係など、バージョンの競合の処理に使用できます。推移的に依存している場合は考慮されません。", - "HelpOwnsCommand": "インストールされているパッケージ内のファイルを検索します。", + "HelpOwnsCommand": "インストールされているパッケージ内のファイルの所有者を検索します", "HelpPackagePublisher": "また、パッケージ パブリッシャーは \"version>=\" 制約を使用して、コンシューマーが付与された依存関係の少なくとも特定の最小バージョンを使用していることを確認できます。たとえば、ライブラリが 1.70 で boost-asio に API を追加する必要がある場合、\"version>=\" 制約を使用すると、推移ユーザーは、個々のバージョンのオーバーライドやレジストリ間の参照が発生した場合でも、十分なバージョンを使用できます。", - "HelpPortVersionScheme": "また、各バージョンには、負でない整数である \"port-version\" があります。テキストとしてレンダリングされる場合、ポート バージョン (ゼロ以外の場合) は、ハッシュ (#) で区切られたプライマリ バージョン テキストにサフィックスとして追加されます。Port-version は、プライマリ バージョン テキストの後に辞書で並べ替えられます。例: \n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "パッケージをアンインストールします。", - "HelpRemoveOutdatedCommand": "期限切れのパッケージをすべてアンインストールします。", - "HelpResponseFileCommand": "応答ファイルを指定して、追加のパラメーターを指定します。", - "HelpSearchCommand": "ビルド可能なパッケージを検索します。", - "HelpTextOptFullDesc": "長いテキストは切り捨てないでください。", - "HelpTopicCommand": "特定のトピックのヘルプを表示します。", - "HelpTopicsCommand": "ヘルプ トピックの一覧を表示します。", - "HelpTxtOptAllowUnsupportedPort": "サポートされていないポートでエラーが発生する代わりに、警告を続行します。", - "HelpTxtOptCleanAfterBuild": "各パッケージをビルドした後、ビルドツリー、パッケージ、ダウンロードをクリーンアップします。", - "HelpTxtOptCleanBuildTreesAfterBuild": "各パッケージのビルド後にビルドツリーをクリーンアップします。", - "HelpTxtOptCleanDownloadsAfterBuild": "各パッケージをビルドした後、ダウンロードをクリーンします。", - "HelpTxtOptCleanPkgAfterBuild": "各パッケージのビルド後にパッケージをクリーンアップします。", - "HelpTxtOptDryRun": "実際にはビルドまたはインストールしないでください。", - "HelpTxtOptEditable": "コマンド ライン (クラシック モード) でライブラリのソース再抽出とバイナリ キャッシュを無効にする", - "HelpTxtOptEnforcePortChecks": "ポートで問題が検出された場合、または非推奨の機能を使用しようとした場合にインストールに失敗する", - "HelpTxtOptKeepGoing": "エラー発生時にパッケージのインストールを続行します。", - "HelpTxtOptManifestFeature": "インストールする最上位マニフェストの追加機能 (マニフェスト モード)。", - "HelpTxtOptManifestNoDefault": "最上位のマニフェスト (マニフェスト モード) から既定の機能をインストールしないでください。", - "HelpTxtOptNoDownloads": "新しいソースをダウンロードしないでください。", - "HelpTxtOptNoUsage": "インストール後に CMake の使用状況情報を印刷しないでください。", - "HelpTxtOptOnlyBinCache": "キャッシュされたバイナリが使用できない場合は失敗します。", - "HelpTxtOptOnlyDownloads": "ビルドせずにソースをダウンロードするよう最善を尽くしてください。", - "HelpTxtOptRecurse": "インストールの一部としてパッケージの削除を許可します。", - "HelpTxtOptUseAria2": "aria2 を使用してダウンロード タスクを実行します。", - "HelpTxtOptUseHeadVersion": "最新のアップストリーム ソース (クラシック モード) を使用して、コマンド ラインにライブラリをインストールします。", - "HelpTxtOptWritePkgConfig": "外部バイナリ キャッシュで使用するために NuGet packages.config 形式のファイルを書き込みます。\n詳細については、「vcpkg help binarycaching」を参照してください。", - "HelpUpdateBaseline": "ライブラリを最新の状態に保つための最善の方法は、ベースライン参照の更新です。これにより、推移的なパッケージを含むすべてのパッケージが更新されます。ただし、パッケージを個別に更新する必要がある場合は、\"version>=\" 制約を使用できます。", - "HelpUpdateCommand": "更新できるパッケージを一覧表示します。", - "HelpUpgradeCommand": "古いパッケージをすべてリビルドします。", - "HelpVersionCommand": "バージョン情報を表示します。", + "HelpPortVersionScheme": "各バージョンには、負でない整数である \"port-version\" も追加されています。テキストとしてレンダリングされると、ポート バージョン (0 以外の場合) は、ハッシュ (#) で区切られたプライマリ バージョン のテキストにサフィックスとして追加されます。ポート バージョンは、例えば: 1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0 などの\nプライマリ バージョン テキストの後に辞書式で並べ替えられます。", + "HelpRemoveCommand": "パッケージをアンインストールします", + "HelpResponseFileCommand": "その場所で展開された行ごとに 1 つの引数が含まれます", + "HelpSearchCommand": "ビルド可能なパッケージを検索します", + "HelpTextOptFullDesc": "長いテキストを切り捨てない", + "HelpTopicCommand": "特定のヘルプ トピックを表示します", + "HelpTopicsCommand": "ヘルプ トピックの完全な一覧を表示します", + "HelpTxtOptAllowUnsupportedPort": "失敗するのではなく、サポートされていないポートで警告を継続します", + "HelpTxtOptCleanAfterBuild": "各パッケージのビルド後にビルドツリー、パッケージ、ダウンロードをクリーンする", + "HelpTxtOptCleanBuildTreesAfterBuild": "各パッケージのビルド後にビルドツリーをクリーンアップします", + "HelpTxtOptCleanDownloadsAfterBuild": "各パッケージのビルド後にダウンロードをクリーンアップする", + "HelpTxtOptCleanPkgAfterBuild": "各パッケージのビルド後にパッケージをクリーンアップする", + "HelpTxtOptDryRun": "実際にはビルドまたはインストールしません", + "HelpTxtOptEditable": "コマンド ライン (クラシック モード) でライブラリのソース再抽出とバイナリ キャッシュを無効にします", + "HelpTxtOptEnforcePortChecks": "ポートで問題が検出された場合、または非推奨の機能を使用しようとした場合にインストールに失敗します", + "HelpTxtOptKeepGoing": "エラー発生時にパッケージのインストールを続行します", + "HelpTxtOptManifestFeature": "インストールする最上位マニフェストの追加機能 (マニフェスト モード)", + "HelpTxtOptManifestNoDefault": "最上位のマニフェスト (マニフェスト モード) から既定の機能をインストールしません", + "HelpTxtOptNoDownloads": "新しいソースをダウンロードしません", + "HelpTxtOptNoUsage": "インストール後に CMake の使用状況情報を印刷しません", + "HelpTxtOptOnlyBinCache": "キャッシュされたバイナリが使用できない場合は失敗します", + "HelpTxtOptOnlyDownloads": "ビルドせずにソースをダウンロードするよう最善を尽くします", + "HelpTxtOptRecurse": "インストールの一部としてパッケージの削除を許可します", + "HelpTxtOptUseAria2": "aria2 を使用してダウンロード タスクを実行します", + "HelpTxtOptUseHeadVersion": "最新のアップストリーム ソース (クラシック モード) を使用して、コマンド ラインにライブラリをインストールします", + "HelpTxtOptWritePkgConfig": "外部バイナリ キャッシュで使用するために NuGet packages.config 形式のファイルを書き込みます。詳細については、`vcpkg help binarycaching` を参照してください", + "HelpUpdateBaseline": "ライブラリを最新の状態に保つ最善の方法は、ベースライン参照を更新することです。これにより、推移的なパッケージを含むすべてのパッケージが更新されます。ただし、パッケージを個別に更新する必要がある場合は、\"version>=\" 制約を使用できます。", + "HelpUpdateCommand": "アップグレード可能なパッケージを一覧表示します", + "HelpUpgradeCommand": "古いパッケージをすべてリビルドします", + "HelpVersionCommand": "バージョン情報を表示します", "HelpVersionDateScheme": "日付 (2021-01-01.5)", "HelpVersionGreater": "[依存関係] フィールド内では、各依存関係に最小の制約を一覧表示させることができます。これらの最小の制約は、このライブラリに応じて推移的に使用されます。最小 port-version は、さらに '#' サフィックスと共に指定できます。", "HelpVersionScheme": "数字のドット区切りのシーケンス (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "アーカイブ ファイルの署名が正しくありません", "IncorrectPESignature": "PE 署名が正しくありません", "IncrementedUtf8Decoder": "文字列の末尾に増分された Utf8Decoder", - "InfoSetEnvVar": "環境変数「{env_var}」を選択したエディターに設定することもできます。", + "InfoSetEnvVar": "{env_var} を任意のエディターに設定することもできます。", "InitRegistryFailedNoRepo": "これは Git リポジトリのルートではないため、{path} にレジストリを作成できませんでした。\n'git init {command_line}' を使用して、このフォルダーに Git リポジトリを作成します。", "InstallCopiedFile": "{path_source} -> {path_destination} 完了", "InstallFailed": "失敗しました: {path}: {error_msg}", "InstallPackageInstruction": "プロジェクトを開いて、[ツール] -> [NuGet パッケージ マネージャー] -> [パッケージ マネージャー コンソール] に移動し、次を貼り付けます:\n Install-Package \"{value}\" -Source \"{path}\"", - "InstallRootDir": "(試験段階) インストール ルート ディレクトリを指定します。", + "InstallRootDir": "インストール済みディレクトリ (試験段階)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} はスキップされました。最新の状態です", "InstallWithSystemManager": "このツールは、システム パッケージ マネージャーを使用してインストールできる場合があります。", "InstallWithSystemManagerMono": "Ubuntu 18.04 のユーザーは、{url} で入手可能な、新しいバージョンの mono が必要な場合があります。", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- 次の場所からポートをインストールしています: {path}", "InstallingMavenFile": "Maven ファイルをインストールしています {path}", "InstallingPackage": "{action_index}/{count} {spec} をインストールしています...", - "IntegrateBashHelp": "[bash] タブ補完を有効にします。", - "IntegrateFishHelp": "[fish] タブ補完を有効にします。", - "IntegrateInstallHelpLinux": "インストールされているパッケージをユーザー全体で利用できるようにします。", - "IntegrateInstallHelpWindows": "インストールされているパッケージをユーザー全体で利用できるようにします。初めて使用する場合は管理者特権が必要です。", - "IntegratePowerShellHelp": "PowerShell タブ補完を有効にします。", - "IntegrateProjectHelp": "個々の VS プロジェクトで使用するために、参照している NuGet パッケージを生成します。", - "IntegrateRemoveHelp": "ユーザー全体の統合を削除します。", - "IntegrateZshHelp": "[zsh] タブ補完を有効にします。", - "IntegrationFailed": "統合は適用されませんでした。", + "IntegrateBashHelp": "bash タブ補完を有効にします。Windows 以外のみ", + "IntegrateFishHelp": "fish タブ補完を有効にします。Windows 以外のみ", + "IntegrateInstallHelpLinux": "インストールされているパッケージをユーザー全体で利用できるようにします", + "IntegrateInstallHelpWindows": "インストールされているパッケージをユーザー全体で利用できるようにします。初めて使用する場合は管理者特権が必要です", + "IntegrateNonWindowsOnly": "{command_line} は Windows 以外のみではなく、このシステムではサポートされていません。", + "IntegratePowerShellHelp": "PowerShell タブ補完を有効にします。Windows のみ", + "IntegrateProjectHelp": "個々の Visual Studio プロジェクトで使用する参照元の NuGet パッケージを生成します。Windows のみ", + "IntegrateRemoveHelp": "ユーザー全体の統合を削除します", + "IntegrateWindowsOnly": "{command_line} は Windows のみであり、このシステムではサポートされていません。", + "IntegrateZshHelp": "zsh タブ補完を有効にします。Windows 以外のみ", + "IntegrationFailedVS2015": "Visual Studio 2015 には統合が適用されませんでした。", "InternalCICommand": "vcpkg CI は、非互換性に変更されるか、いつでも削除できる内部コマンドです。", "InternalErrorMessage": "内部エラー: ", "InternalErrorMessageContact": "https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug で問題を開き、問題を再現するための詳細な手順を確認してください。", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg は c スタイルのコメントをサポートしていませんが、ほとんどのオブジェクトでは $-prefixed フィールドをコメントとして使用できます。", "InvalidCommitId": "無効なコミット ID: {commit_sha}", "InvalidDefaultFeatureName": "'default' は予約済みの機能名です", - "InvalidDependency": "依存関係は、予約された名前の 1 つではなく、小文字の英数字とハイフンにする必要があります", "InvalidFeature": "機能は、予約された名前の 1 つではなく、小文字の英数字とハイフンにする必要があります", "InvalidFileType": "失敗しました: {path} はファイルの種類を処理できません", "InvalidFilename": "ファイル名に無効な文字 {value} を含めることはできませんが、{path} を含みます", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "[\"{json_field}\"] の値はオブジェクトである必要があります", "JsonFieldNotString": "[\"{json_field}\"] の値は文字列である必要があります", "JsonFileMissingExtension": "JSON ファイル {path} には .json (すべて小文字) 拡張子が必要です", - "JsonSwitch": "(試験段階) JSON 出力を要求します。", + "JsonSwitch": "プレーンテキストではなく JSON を出力する", "JsonValueNotArray": "json 値が配列ではありません", "JsonValueNotObject": "json 値がオブジェクトではありません", "JsonValueNotString": "json が文字列ではありません", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "動的リリース (/MD)", "LinkageStaticDebug": "静的デバッグ (/MTd)", "LinkageStaticRelease": "静的リリース (/MT)", - "ListHelp": "引数は、検索対象のサブ文字列であるか、またはインストールされているすべてのライブラリを表示する no 引数である必要があります。", + "ListHelp": "インストールされているライブラリを一覧表示します", "ListOfValidFieldsForControlFiles": "これは、CONTROL ファイルの有効なフィールドの一覧です (大文字と小文字が区別されます):", "LoadingCommunityTriplet": "-- [COMMUNITY] 以下からトリプレット構成を読み込んでいます: {path}", "LoadingDependencyInformation": "{count} 個のパッケージの依存関係情報を読み込んでいます...", @@ -707,8 +826,7 @@ "MsiexecFailedToExtract": "起動または終了コード {exit_code} とメッセージで \"{path}\" を抽出中に msiexec が失敗しました:", "MultiArch": "Multi-Arch は 'same' である必要がありますが、{option} でした", "MultipleFeatures": "{package_name} が {feature} を複数回宣言しています; 機能に一意の名前があることを確認してください", - "MutuallyExclusiveOption": "--{value} は --{option} と共に使用できません。", - "NavigateToNPS": "任意のブラウザーで {url} に移動してください。", + "MutuallyExclusiveOption": "--{value} を --{option} と共に使用することはできません。", "NewConfigurationAlreadyExists": "マニフェストを作成すると、{path} で vcpkg-configuration.json が上書きされます。", "NewManifestAlreadyExists": "マニフェストは既に {path} に存在します。", "NewNameCannotBeEmpty": "--name を空にすることはできません。", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "C++ ライブラリ用のマニフェストを作成するために --name と --version を指定するか、マニフェストをポートとして使用しないことを示すために --application を指定します。", "NewVersionCannotBeEmpty": "--version を空にすることはできません。", "NoArgumentsForOption": "オプション --{option} は引数を取りません。", - "NoCachedPackages": "パッケージがキャッシュされていません。", "NoError": "エラーはありません", "NoInstalledPackages": "パッケージがインストールされていません。'検索' ということですか?", "NoLocalizationForMessages": "次のローカライズされたメッセージはありません: ", @@ -739,22 +856,27 @@ "OptionRequiresAValue": "オプション '{option}' には値が必要です", "OptionRequiresOption": "--{value} には --{option} が必須です", "OptionUsedMultipleTimes": "オプション '{option}' が複数回指定されました。", - "OptionalCommand": "コメント (オプション)", "Options": "オプション", "OriginalBinParagraphHeader": "\n元のバイナリ段落", + "OtherCommandsHeader": "その他", "OverlayPatchDir": "オーバーレイ パス \"{path}\" が存在し、ディレクトリである必要があります。", - "OverlayTriplets": "{path} からのオーバーレイ トリプレット:", + "OverlayPortsDirectoriesHelp": "オーバーレイ ポートのディレクトリ ({env_var} も含む)", + "OverlayTripletDirectoriesHelp": "オーバーレイ トリプレットのディレクトリ ({env_var} も含む)", + "OverlayTriplets": "\"{path}\" からのトリプレットのオーバーレイ:", "OverwritingFile": "ファイル {path} はすでに存在しているため、上書きされます", "PECoffHeaderTooShort": "ポータブル実行可能ファイル {path} の解析中、COFF ヘッダーのサイズが小さすぎて有効な PE ヘッダーを含めませんでした。", - "PEConfigCrossesSectionBoundary": "ポータブル実行可能ファイル {path} の解析中に、イメージ構成ディレクトリがセッション境界を越えています。", - "PEImportCrossesSectionBoundary": "ポータブル実行可能ファイル {path} の解析中に、インポート テーブルがセッション境界を越えています。", + "PEConfigCrossesSectionBoundary": "ポータブル実行可能ファイル {パス} の解析中に、イメージ構成ディレクトリがセッション境界を越えています。", + "PEImportCrossesSectionBoundary": "ポータブル実行可能ファイル {パス} の解析中に、インポート テーブルがセッション境界を越えています。", "PEPlusTagInvalid": "ポータブル実行可能ファイル {path} の解析中、省略可能なヘッダーは PE32 でも PE32+ でもありません。", "PERvaNotFound": "ポータブル実行可能ファイル {path} の解析中に、RVA {value:#X} が見つかりませんでした。", "PESignatureMismatch": "ポータブル実行可能ファイル {path} の解析中に署名が一致しません。", "PackageAlreadyRemoved": "{spec} を削除できません: すでに削除されています", + "PackageDiscoveryHeader": "パッケージ検出", "PackageFailedtWhileExtracting": "{path} の抽出中に '{value}' が失敗しました。", - "PackageInfoHelp": "パッケージの詳細情報を表示します。", - "PackageRootDir": "(試験段階) パッケージ ルート ディレクトリを指定します。", + "PackageInfoHelp": "パッケージの詳細情報を表示します", + "PackageInstallationHeader": "パッケージのインストール", + "PackageManipulationHeader": "パッケージ操作", + "PackageRootDir": "Packages ディレクトリ (試験段階)", "PackagesToInstall": "次のパッケージが作成され、インストールされます。", "PackagesToInstallDirectly": "次のパッケージが直接インストールされます。", "PackagesToModify": "この操作を完了するために、追加のパッケージ (*) が変更されます。", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "{value}は{expected}である必要があります", "ParseControlErrorInfoWhileLoading": "{path}の読み込み中:", "ParseControlErrorInfoWrongTypeFields": "次のフィールドの型が正しくありません:", - "ParseIdentifierError": "\"{value}\" は有効な識別子ではありません。識別子は小文字の英数字とハイフンにする必要があり、また、予約されていないことが必須になります (詳細については、{url} を参照してください)", - "ParsePackageNameError": "\"{package_name}\" は有効なパッケージ名ではありません。パッケージ名は小文字の英数字とハイフンにする必要があり、また、予約されていないことが必須になります (詳細については、{url} を参照してください)", - "ParsePackagePatternError": "\"{package_name}\" は有効なパッケージ パターンではありません。パッケージ パターンではワイルドカード文字 (*) を 1 つだけ使用し、それをそのパターンの最後の文字にする必要があります (詳細については、{url} を参照してください)", + "ParseFeatureNameError": "\"{package_name}\" は有効な機能名ではありません。機能名は小文字の英数字とハイフンにする必要があり、また、予約されていないことが必須になります (詳細については、{url} を参照してください)。", + "ParseIdentifierError": "\"{値}\" は有効な識別子ではありません。識別子は小文字の英数字とハイフンにする必要があり、また、予約されていないことが必須になります (詳細については、{url} を参照してください)。", + "ParsePackageNameError": "\"{package_name}\" は有効なパッケージ名ではありません。パッケージ名は小文字の英数字とハイフンにする必要があり、また、予約されていないことが必須になります (詳細については、{url} を参照してください)。", + "ParsePackagePatternError": "\"{package_name}\" は有効なパッケージ パターンではありません。パッケージ パターンではワイルドカード文字 (*) を 1 つだけ使用し、それをそのパターンの最後の文字にする必要があります (詳細については、{url} を参照してください)。", "PathMustBeAbsolute": "環境変数 X_VCPKG_REGISTRIES_CACHE の値が絶対ではありません: {path}", "PerformingPostBuildValidation": "-- ビルド後の検証の実行", "PortBugAllowRestrictedHeaders": "例外的な状況では、このポリシーは {env_var} 経由で無効にすることができます", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "{extension} ファイルを調べるには、次を使用します:", "PortBugInvalidCrtLinkage": "次のバイナリは {expected} CRT を使用する必要があります。", "PortBugInvalidCrtLinkageEntry": "{path} のリンク先:", + "PortBugKernel32FromXbox": "選択したトリプレットは Xbox をターゲットにしていますが、次の DLL は kernel32 とリンクしています。kernel32 が存在しない Xbox では、これらの DLL を読み込むことができません。これは通常、onecore_apiset.lib や xgameplatform.lib などの適切な包括ライブラリではなく kernel32.lib とリンクすることによって発生します。", "PortBugMergeLibCMakeDir": "/lib/cmake フォルダーを /debug/lib/cmake とマージし、/share/{package_name}/cmake に移動する必要があります。ポート vcpkg-cmake-config からヘルパー関数 'vcpkg_cmake_config_fixup()' を使用してください。", "PortBugMismatchedNumberOfBinaries": "デバッグ バイナリとリリース バイナリの数が一致しません。", "PortBugMisplacedCMakeFiles": "次の cmake ファイルが /share/{spec} の外部で見つかりました。/share/{spec} に cmake ファイルを配置してください。", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "bin\\ または debug\\bin\\ の作成を無効にできない場合は、ポートファイルでこれを使用して削除します", "PortBugRemoveEmptyDirectories": "ディレクトリを設定する必要があるが設定されていない場合は、portfile でエラーが発生する可能性があります。\nディレクトリが不要で、その作成を無効にできない場合は、portfile で次のように使用して削除します。", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE 上記の名前変更によって残された空のディレクトリ)", - "PortBugRestrictedHeaderPaths": "次の制限付きヘッダーを使用すると、コア C++ ランタイムおよびその他のパッケージが正しくコンパイルされない可能性があります。例外的な状況では、このポリシーは {env_var} 経由で無効にすることができます。", + "PortBugRestrictedHeaderPaths": "次の制限付きヘッダーを使用すると、コア C++ ランタイムおよびその他のパッケージが正しくコンパイルされないようにすることができます。例外的な状況では、portfile.cmake で CMake 変数VCPKG_POLICY_ALLOW_RESTRICTED_HEADERSを設定することで、このポリシーを無効にすることができます。", "PortBugSetDllsWithoutExports": "エクスポートを行わない DLL は、ビルド スクリプトのバグである可能性があります。これが意図されている場合は、以下の行を portfile を追加します:\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS enabled)\n次の DLL にはエクスポートがありません:", "PortDependencyConflict": "ポート {package_name} には、次のサポートされていない依存関係があります。", "PortDoesNotExist": "{package_name} は存在しません", @@ -827,21 +951,26 @@ "PortsDiffHelp": "引数は、チェックアウトするブランチ/タグ/ハッシュである必要があります。", "PortsNoDiff": "2 つのコミットの間にポートの変更点はありませんでした。", "PortsRemoved": "次の {count} 個のポートが削除されました。", - "PortsUpdated": "\n次の {count} 個のポートが更新されました。", + "PortsUpdated": "次の {count} 個のポートが更新されました。", "PrebuiltPackages": "ビルドされていないパッケージがあります。ビルドするには、次のコマンドを実行します:", "PreviousIntegrationFileRemains": "以前の統合ファイルは削除されませんでした。", "ProgramReturnedNonzeroExitCode": "{tool_name} が終了コード: ({exit_code}) で失敗しました。", "ProvideExportType": "次のオプションのうち少なくとも 1 つが必要です: --raw --nuget --ifw --zip --7zip --chocolatey --prefab。", "PushingVendorFailed": "{vendor} を \"{path}\" にプッシュできませんでした。詳細については、--debug を使用してください。", - "RegeneratesArtifactRegistry": "成果物レジストリを再生成します。", + "RegeneratesArtifactRegistry": "成果物レジストリを再生成します", "RegistryCreated": "{path} にレジストリが正常に作成されました", "RegistryValueWrongType": "レジストリ値 {path} が予期しない種類でした。", "RemoveDependencies": "マニフェスト モードで依存関係を削除するには、マニフェスト (vcpkg.json) を編集して 'インストール' を実行します。", "RemovePackageConflict": "{spec} はインストールされていませんが、{triplet} の {package_name} がインストールされています。{package_name}:{triplet} のことですか?", "RemovingPackage": "{action_index}/{count} {spec} を削除しています", "ResponseFileCode": "@response_file", - "RestoredPackage": "\"{path}\" からパッケージを復元しました", - "RestoredPackagesFromVendor": "{elapsed} の {value} から {count} パッケージを復元しました。--debug を使用して詳細を表示します。", + "RestoredPackagesFromAWS": "{elapsed} で AWS から {count} パッケージを復元しました。--debug を使用して詳細を表示します。", + "RestoredPackagesFromCOS": "{elapsed} の COS から {count} パッケージを復元しました。--debug を使用して詳細を表示します。", + "RestoredPackagesFromFiles": "{elapsed} の {path} から {count} パッケージを復元しました。--debug を使用して詳細を表示します。", + "RestoredPackagesFromGCS": "{elapsed} の GCS から {count} パッケージを復元しました。--debug を使用して詳細を表示します。", + "RestoredPackagesFromGHA": "{elapsed} の GitHub Actions Cache から {count} パッケージを復元しました。--debug を使用して詳細を表示します。", + "RestoredPackagesFromHTTP": "{elapsed} の HTTP サーバーから {count} パッケージを復元しました。--debug を使用して詳細を表示します。", + "RestoredPackagesFromNuGet": "{elapsed} の NuGet から {count} パッケージを復元しました。--debug を使用して詳細を表示します。", "ResultsHeader": "結果", "ScriptAssetCacheRequiresScript": "必要な引数: アセット構成 'x-script' には引数として exec テンプレートが厳密に必要です", "SearchHelp": "引数は、検索対象のサブ文字列であるか、またはすべてのライブラリを表示する no 引数である必要があります。", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "ディレクトリでなかったため、{path} のコンテンツのクリアをスキップしています。", "SourceFieldPortNameMismatch": "CONTROL ファイル内の 'Source' フィールド、または vcpkg.json ファイル内の \"name\" フィールドに名前 {package_name} があり、ポート ディレクトリ \"{path}\" と一致しません。", "SpecifiedFeatureTurnedOff": "'{command_name}'機能は明確に無効になっていますが、--{option} が指定されました。", - "SpecifyDirectoriesContaining": "トリプレット ファイルを含むディレクトリを指定します。\n(または: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "ポートを検索するときに使用するディレクトリを指定します。\n(または: '{env_var}')", - "SpecifyHostArch": "ホスト アーキテクチャのトリプレットを指定します。'vcpkg help triplet' を参照してください。\n(既定値: '{env_var}')", - "SpecifyTargetArch": "ターゲット アーキテクチャのトリプレットを指定します。'vcpkg help triplet' を参照してください。\n(既定値: '{env_var}')", + "SpecifyHostArch": "ホスト トリプレット。'vcpkg help triplet' を参照してください (既定値: {env_var})", + "SpecifyTargetArch": "ターゲット トリプレット。'vcpkg help triplet' を参照してください (既定値: {env_var})", "StartCodeUnitInContinue": "続行位置で開始コード単位が見つかりました", "StoreOptionMissingSha": "--store オプションは sha512 なしでは無効です", - "StoredBinariesToDestinations": "{count} 個の宛先に格納されたバイナリ。", + "StoredBinariesToDestinations": "{elapsed} の {count} 件の宛先にバイナリを格納しました。", "StoredBinaryCache": "格納されたバイナリ キャッシュ: \"{path}\"", "SuccessfulyExported": "{package_name} を {path} にエクスポートしました", "SuggestGitPull": "結果は古い可能性があります。'git pull' を実行して最新の結果を取得してください。", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "vcpkg バイナリの更新が必要である可能性があります。{command_line} を実行して更新してみてください。", "SupportedPort": "ポート {package_name} がサポートされています。", "SwitchUsedMultipleTimes": "切り替え '{option}' が複数回指定されました", + "SynopsisHeader": "概要:", "SystemApiErrorMessage": "呼び出し {system_api} が {exit_code} ({error_msg}) で失敗しました", "SystemRootMustAlwaysBePresent": "Windows で SystemRoot 環境変数を常に設定する必要がありました。", "SystemTargetsInstallFailed": "システム ターゲット ファイルを {path} にインストールできませんでした", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "配列の末尾にコンマがあります", "TrailingCommaInObj": "オブジェクトの末尾にコンマがあります", "TripletFileNotFound": "トリプレット ファイル {triplet}.cmake が見つかりません", + "TripletLabel": "トリプレット:", "TwoFeatureFlagsSpecified": "'{value}' と -'{value}' の両方が機能フラグとして指定されました。", "UnableToClearPath": "{path} を削除できません", "UnableToReadAppDatas": "%LOCALAPPDATA% と %APPDATA% の両方が読み取れませんでした", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "レジストリ '{url}' は更新されませんでした: '{value}'", "UpdateBaselineRemoteGitError": "git はリモートリポジトリ '{url}' の取り込みに失敗しました", "UpdateBaselineUpdatedBaseline": "レジストリ '{url}' を更新しました。ベースライン '{old_value}' -> '{new_value}'", - "UpgradeInManifest": "アップグレード コマンドは現在マニフェスト モードをサポートしていません。代わりに、vcpkg.json を変更してインストールを実行してください。", + "UpgradeInManifest": "アップグレードでは、クラシック モードのインストールがアップグレードされるため、マニフェスト モードはサポートされていません。vcpkg x-update-baseline を使用してベースラインを現在の値に更新し、vcpkg インストールを実行して、依存関係を更新することを検討してください。", "UpgradeRunWithNoDryRun": "上記のパッケージを再構築する場合は、--no-dry-run オプションを使用してこのコマンドを実行します。", "UploadedBinaries": "{count} {vendor} にバイナリをアップロードしました。", "UploadedPackagesToVendor": "{count} 個のパッケージを {elapsed} の {vendor} にアップロードしました", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "無効なコマンド: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "環境変数 X_VCPKG_REGISTRIES_CACHE の値がディレクトリではありません: {path}", "VcpkgRootRequired": "スタンドアロン ブートストラップには VCPKG_ROOT の設定が必要です。", - "VcpkgRootsDir": "vcpkg ルート ディレクトリを指定します。\n(既定値: {env_var})", + "VcpkgRootsDir": "vcpkg ルート ディレクトリ (既定値: {env_var})", "VcpkgSendMetricsButDisabled": "sendmetrics が渡されましたが、メトリクスは無効になっています。", + "VcpkgUsage": "usage: vcpkg [--switches] [--options=values] [arguments] @response_file", "VcvarsRunFailed": "Visual Studio 環境を取得するために vcvarsall.bat を実行できませんでした", "VcvarsRunFailedExitCode": "Visual Studio 環境を取得しようとしたときに、vcvarsall.bat が {exit_code} を返しました", "VersionBaselineMismatch": "最新バージョンは {expected} ですが、ベースライン ファイルには {actual} が含まれています。\n以下を実行してください:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\nベースライン バージョンを更新します。", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "{package_name} にバージョン データベース ファイルが {path}にありません\nvcpkg x-add-version {package_name}\nを実行して、\nバージョン ファイルを作成します。", "VersionGitEntryMissing": "{version} に {package_name} のバージョン データベース エントリがありません。\n利用可能なバージョン:", "VersionInDeclarationDoesNotMatch": "ファイルで宣言されたバージョンがチェックアウトされたバージョンと一致しません: {version}", - "VersionIncomparable1": "{spec} でのバージョンの競合: {package_name} に {expected} が必要ですが、vcpkg では {actual} と比較できませんでした。\n比較できないスキームが使用されている 2 つのバージョン:", - "VersionIncomparable2": "\"{version}\" がスキーム {new_scheme} でした", + "VersionIncomparable1": "{spec} でのバージョンの競合: {constraint_origin} には {expected} が必要です。ベースライン バージョン {actual} と比較することはできません。", + "VersionIncomparable2": "{version_spec} にはスキーム {new_scheme} があります", "VersionIncomparable3": "これは、優先するバージョンに明示的なオーバーライドを追加することで解決できます。例:", - "VersionIncomparable4": "詳細については、`vcpkg help versioning` を参照してください。", + "VersionIncomparable4": "詳細については、`vcpkg help versioning` または {url} を参照してください。", + "VersionIncomparableSchemeString": "どちらのバージョンにもスキーム文字列がありますが、プライマリ テキストは異なります。", + "VersionIncomparableSchemes": "バージョンには、比較できないスキームがあります。", "VersionInvalidDate": "'{version}' は有効な日付バージョンではありません。日付は YYYY-MM-DD の形式に従う必要があり、disambiguator は先頭にゼロを付けずにドット区切りの正の整数値にする必要があります。", "VersionInvalidRelaxed": "'{version}' は有効な緩やかなバージョンではありません (任意の数値要素数を持つ semver)。", "VersionInvalidSemver": "'{version}' は有効なセマンティック バージョンではありません。 を参照してください。", "VersionMissing": "バージョン管理フィールドが必要です (version、version-date、version-semver、version-string のいずれか)", - "VersionMissingRequiredFeature": "{spec}@{version} には必要な機能 {feature} がありません", + "VersionMissingRequiredFeature": "{version_spec} には、{constraint_origin} が必要とする機能 {feature} が必要ありません", "VersionNotFound": "{expected} は利用できません。使用できるのは {actual} のみです", - "VersionNotFoundDuringDiscovery": "検出中にバージョンが見つかりませんでした: {spec}@{version}\nこれは内部 vcpkg エラーです。 https://github.com/Microsoft/vcpkg で問題を再現するための詳細な手順を含むイシューを開いてください。", - "VersionNotFoundInVersionsFile": "バージョン {version} がバージョン ファイルに見つかりませんでした。\nvcpkg x-add-version {package_name}\nを実行して、\n新しいポート バージョンを追加します。", + "VersionNotFoundInVersionsFile": "{package_name} のバージョン ファイルにバージョン {version} が見つかりませんでした。\nvcpkg x-add-version {package_name}\nを実行して、\n新しいポート バージョンを追加します。", "VersionRejectedDueToBaselineMissing": "{path} は 「{json_field}」を使用し、「builtin-baseline」がないため拒否されました。これは、「{json_field}」の使用を削除するか、「builtin-baseline」を追加することで修正できます。\n詳細については、「vcpkg ヘルプのバージョン管理」を参照してください。", "VersionRejectedDueToFeatureFlagOff": "「{json_field}」を使用し、'versions' 機能フラグが無効になっているため、{path} は拒否されました。これは、「{json_field}」を削除するか、'versions' 機能フラグを有効にすることで修正できます。\n詳細については、「vcpkg ヘルプのバージョン管理」を参照してください。", "VersionSchemeMismatch": "バージョン データベースは {version} を {expected} として宣言していますが、{path} はそれを {actual} として宣言します。異なるスキームで宣言されている場合でも、バージョンは一意である必要があります。\nvcpkg x-add-version {package_name} --overwrite-version\nを実行して、\nバージョン データベースで宣言されているスキームをポートで宣言されたスキームで上書きします。", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "バージョン テキスト内の '#' の後にはポート バージョン (負でない整数) を指定する必要があります", "VersionSpecMismatch": "バージョンに一貫性がないため、ポートを読み込めませんでした。ファイル「{path}」にはバージョン {actual_version} が含まれていますが、バージョン データベースは {expected_version} であることを示しています。", "VersionTableHeader": "バージョン", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "子プロセスの終了を待機しています...", "WaitingToTakeFilesystemLock": "{path} でファイルシステムのロックを取得するのを待機しています...", "WarnOnParseConfig": "構成 {path} で次の警告が見つかりました:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "バージョンの検証中に: {version}", "WindowsOnlyCommand": "このコマンドは Windows のみをサポートします。", "WroteNuGetPkgConfInfo": "NuGet パッケージ構成情報を {path} に書き込みました", - "UnrecognizedCommand$": "認識できないコマンド '${p0}'", - "Use$ToGetHelp": "${p0} を使用してヘルプを表示する", - "FatalTheRootFolder$CanNotBeCreated": "致命的: ルート フォルダー '${p0}' を作成できません", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "致命的: グローバル構成ファイル '${p0}' を作成できません", + "FatalTheRootFolder$CannotBeCreated": "致命的エラー: ルート フォルダー '${p0}' を作成できません", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "致命的エラー: グローバル構成ファイル '${p0}' を作成できません", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND が設定されていません", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "vcpkg を内部的に実行すると、ゼロ以外の終了コードが返されました: ${p0}", "failedToDownloadFrom$": "${p0} からダウンロードできませんでした", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "description は 'string' 型である必要がありますが、'${p0}' が見つかりました", "optionsShouldBeASequenceFound$": "options はシーケンスである必要があります。'${p0}' が見つかりました", "DuplicateKeysDetectedInManifest$": "マニフェストで検出された重複キー: '${p0}'", - "in$Skipping$BecauseItIsA$": "${p2} であるため、${p0} で ${p1} をスキップします", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "postscript ファイルがありません: 実行可能ファイルではなく vcpkg シェル関数を使用して再度実行してください", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "アクティブ化中に ${p0} の定義が重複しています。古い値は新しい値に置き換わります。", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "アクティブ化中に重複したツールが ${p0} を宣言しました。 古い値は新しい値に置き換わります。", @@ -1080,20 +1208,15 @@ "progressUnknown": "(進行状況不明)", "verifying": "検証中", "downloading$$": "${p0} -> ${p1} をダウンロードしています", - "unpacking": "パック解除", "unpacking$": "${p0} をパック解除する", "Installing$": "${p0} をインストールしています...", "$AlreadyInstalled": "${p0} は既にインストールされています。", "Downloading$": "${p0} をダウンロードしています...", "Unpacking$": "${p0} をパック解除しています...", "ErrorInstalling$$": "インストールでのエラー ${p0} - ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "${p0} には 1 つの値が必要です - 複数の値が見つかりました", - "Synopsis": "概要", - "Description": "説明", - "Switches": "スイッチ", - "SeeAlso": "関連項目", "error": "エラー:", "warning": "警告:", + "ExpectedASingleValueFor$FoundMultiple": "${p0} には 1 つの値が必要です - 複数の値が見つかりました", "ExpectedASingleValueFor$": "'--${p0}' には 1 つの値が必要です。", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "「${p0}」が正しいと仮定します。このメッセージを非表示にするには、成果物メタデータにハッシュを指定してください。", "DownloadedFile$DidNotHaveTheCorrectHash$$": "ダウンロードしたファイル '${p0}' には正しいハッシュがありませんでした (${p1}: ${p2})", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "'${p1}' に一致しない ${p0} が見つかりました。 リテラル ${p2} の場合は、代わりに ${p3}${p4} を使用してください。", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "'${p1}' に {${p0}} の値が見つかりませんでした。 リテラル値を書き込むには、代わりに '{{${p2}}}' を使用します。", "MatchedMoreThanOneInstallBlock$": "複数のインストール ブロック [${p0}] が一致しました", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "アクティブ化せずに、プロジェクトによって参照されるすべてを取得する", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "これにより、コンシューマーはプロジェクトに必要なツールを事前にダウンロードできます。", "UnableToFindProjectInFolderorParentFoldersFor$": "${p0} のフォルダー (または親フォルダー) にプロジェクトが見つかりません", "UnableToAcquireProject": "プロジェクトを取得できません", - "AcquireArtifactsInTheRegistry": "レジストリ内の成果物を取得する", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "これにより、コンシューマーは成果物を取得 (ダウンロードおよびパック解除) できます。成果物を使用するにはアクティブ化する必要があります", "NoArtifactsSpecified": "成果物が指定されていません", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "複数のパッケージが指定されましたが、${p0} スイッチの数が等しくありません", "NoArtifactsAreAcquired": "成果物は取得されません", "AllArtifactsAreAlreadyInstalled": "すべての成果物が既にインストールされています", "$ArtifactsInstalledSuccessfully": "${p0} 成果物が正常にインストールされました", "InstallationFailedStopping": "インストールに失敗しました -- 停止しています", - "ActivatesTheToolsRequiredForAProject": "プロジェクトに必要なツールをアクティブ化する", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "これにより、コンシューマーはプロジェクトに必要なツールをアクティブ化できます。ツールがまだインストールされていない場合は、アクティブ化する前にツールをダウンロードしてインストールする必要があります。", - "AddsAnArtifactToTheProject": "プロジェクトに成果物を追加する", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "これにより、コンシューマーはプロジェクトに成果物を追加できます。これにより、プロジェクトもアクティブになります。", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "複数の成果物が指定されましたが、${p0} スイッチの数が等しくありません", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "成果物 [${p0}]:${p1} を追加しようとしましたが、使用するレジストリを特定できませんでした。", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "レジストリ ${p0} を ${p1} として追加しようとしましたが、既に ${p2} でした。${p3} をこのプロジェクトに手動で追加して、再試行してください。", "RunvcpkgActivateToApplyToTheCurrentTerminal": "\\`vcpkg activate\\` を実行して現在のターミナルに適用する", - "ManagesTheDownloadCache": "ダウンロードキャッシュを管理する", "DownloadsFolderCleared$": "ダウンロード フォルダーがクリアされました (${p0})", - "cleansOutEverythingcacheInstalledArtifacts": "すべてを消去する (キャッシュ、インストールされた成果物)", - "cleansOutTheDownloadsCache": "ダウンロード キャッシュを消去する", - "removesAllTheArtifactsThatAreInstalled": "インストールされているすべての成果物を削除する", - "cleansUp": "クリーンアップ", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "ユーザーがキャッシュ、インストールされた成果物などをクリアできるようにします。", "InstalledArtifactFolderCleared$": "インストールされた成果物フォルダーがクリアされました (${p0})", "CacheFolderCleared$": "キャッシュ フォルダーがクリアされました (${p0})", - "DeactivatesTheCurrentSession": "現在のセッションを非アクティブ化する", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "これにより、コンシューマーは現在アクティブなセッションの環境設定を削除できます。", - "DeletesAnArtifactFromTheArtifactFolder": "成果物フォルダーから成果物を削除する", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "これにより、コンシューマーはディスクから成果物を削除できます。", "DeletingArtifact$From$": "${p1} から成果物 ${p0} を削除しています", - "FindArtifactsInTheRegistry": "レジストリで成果物を見つける", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "これにより、ユーザーはいくつかの基準に基づいて成果物を見つけることができます。", "NoArtifactsFoundMatchingCriteria$": "基準に一致する成果物が見つかりませんでした: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "プロジェクト用に何もダウンロードせずに、アクティブ化用の MSBuild プロパティを生成する", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props requires --msbuild-props", "UnableToActivateProject": "プロジェクトをアクティブ化できません", - "theNameOfTheCommandForWhichYouWantHelp": "ヘルプが必要なコマンドの名前", - "getHelpOn$OrOneOfTheCommands": "${p0} またはコマンドの 1 つに関するヘルプを表示する", - "GetsDetailedHelpOn$OrOneOfTheCommands": "${p0} またはコマンドの 1 つに関する詳細なヘルプを表示する", - "Arguments": "引数:", - "Use$ToGetTheListOfAvailableCommands": "${p0} を使用して、使用可能なコマンドのリストを取得します", - "Usage": "使い方", - "$COMMANDargumentsswitches": "${p0} コマンド <引数> [--switches]", - "Available$Commands": "利用可能な ${p0} コマンド:", - "ListsTheArtifacts": "成果物を一覧表示する", - "ThisAllowsTheConsumerToListArtifacts": "これにより、コンシューマーは成果物トを一覧表示できます。", - "regenerateTheIndexForARegistry": "レジストリのインデックスを再生成する", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "これにより、ユーザーは ${p1} レジストリ ${p0} ファイルを再生成できます。", "RegeneratingIndexFor$": "${p0} のインデックスを再生成しています", "RegenerationCompleteIndexContains$MetadataFiles": "再生成が完了しました。インデックスに ${p0} メタデータ ファイルが含まれています", "Registry$ContainsNoArtifacts": "レジストリ: '${p0}' には成果物が含まれていません。", "error$": "エラー ${p0}: ", - "RemovesAnArtifactFromAProject": "プロジェクトから成果物を削除する", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "これにより、コンシューマーはプロジェクトから成果物を削除できます。このウィンドウで強制的に再アクティブ化します。", "Removing$FromProjectManifest": "プロジェクト マニフェストから ${p0} を削除しています", "unableToFindArtifact$InTheProjectManifest": "プロジェクト マニフェストで成果物 ${p0} が見つかりません", - "updateTheRegistryFromTheRemote": "リモートからレジストリを更新する", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "これにより、レジストリの最新の内容がリモート サービスからダウンロードされます。", - "DownloadingRegistryData": "レジストリ データをダウンロードしています", - "Updated$RegistryContains$MetadataFiles": "${p0} を更新しました。レジストリには ${p1} メタデータ ファイルが含まれています", - "UnableToDownloadRegistrySnapshot": "レジストリ スナップショットをダウンロードできません", - "UnableToFindRegistry$": "レジストリ ${p0} が見つかりません", - "ArtifactRegistryDataIsNotLoaded": "成果物レジストリ データが読み込まれていません", - "AttemptingToUpdateArtifactRegistry": "成果物レジストリを更新しようとしています", - "UnableToLoadRegistryIndex": "レジストリ インデックスを読み込めません", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "プロジェクト外の成果物を即座にアクティブ化する", - "ThisWillInstantlyActivateAnArtifact": "これにより、成果物が即座にアクティブになります。", + "Updated$ItContains$MetadataFiles": "${p0} を更新しました。これには ${p1} メタデータ ファイルが含まれています。", + "UnableToDownload$": "${p0} をダウンロードできません。", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} を更新できませんでした。形式が正しくない可能性があります。", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "x-update-registry コマンドは新しいレジストリ情報をダウンロードするため、ローカル レジストリでは使用できません。x-regenerate ${p0}$ のことですか?", + "UnableToFindRegistry$": "レジストリ ${p0} が見つかりません。", "NoArtifactsAreBeingAcquired": "成果物は取得されていません", - "removesAllFilesInTheLocalCache": "ローカル キャッシュ内のすべてのファイルを削除します", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "デバッグ モードを有効にし、${p0} のしくみに関する内部メッセージを表示します", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "確認せずに (潜在的に危険な) アクションを続行する", - "showsTheinstalledArtifacts": "_installed_ 成果物を表示する", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "ユーザーが指定したパスを使用して、環境変数とその他のプロパティを json ファイルにダンプします。", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "MSBuild プロパティが書き込まれるファイルへの完全なパス。", - "ApplyAnyDeprecationFixups": "非推奨の修正プログラムを適用します。", - "overrideThePathToTheProjectFolder": "プロジェクト フォルダーへのパスをオーバーライドする", - "UnableToFindProjectEnvironment$": "プロジェクト環境 ${p0} が見つかりません", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "詳細モードを有効にし、プロセスに関する詳細メッセージを表示します", - "aVersionOrVersionRangeToMatch": "一致するバージョンまたはバージョンの範囲" + "UnableToFindProjectEnvironment$": "プロジェクト環境 ${p0} が見つかりません" } diff --git a/locales/messages.json b/locales/messages.json index 34de41c536..f9d3196b24 100644 --- a/locales/messages.json +++ b/locales/messages.json @@ -5,11 +5,14 @@ "ABuiltinRegistry": "a builtin registry", "AConfigurationObject": "a configuration object", "ADateVersionString": "a date version string", + "ADefaultFeature": "a default feature", "ADemandObject": "a demand object", "_ADemandObject.comment": "'demands' are a concept in the schema of a JSON file the user can edit", "ADependency": "a dependency", + "ADependencyFeature": "a feature of a dependency", "ADictionaryOfContacts": "a dictionary of contacts", "AFeature": "a feature", + "AFeatureName": "a feature name", "AFilesystemRegistry": "a filesystem registry", "AGitObjectSha": "a git object SHA", "AGitReference": "a git reference (for example, a branch)", @@ -38,7 +41,7 @@ "AStringStringDictionary": "a \"string\": \"string\" dictionary", "AUrl": "a url", "AVcpkgRepositoryCommit": "a vcpkg repository commit", - "AVersionConstraint": "a version constriant", + "AVersionConstraint": "a version constraint", "AVersionDatabaseEntry": "a version database entry", "AVersionObject": "a version object", "AVersionOfAnyType": "a version of any type", @@ -47,7 +50,6 @@ "AddCommandFirstArg": "The first parameter to add must be 'artifact' or 'port'.", "AddFirstArgument": "The first argument to '{command_line}' must be 'artifact' or 'port'.", "_AddFirstArgument.comment": "An example of {command_line} is vcpkg install zlib.", - "AddHelp": "Adds the indicated port or artifact to the manifest associated with the current directory.", "AddPortRequiresManifest": "'{command_line}' requires an active manifest file.", "_AddPortRequiresManifest.comment": "An example of {command_line} is vcpkg install zlib.", "AddPortSucceeded": "Succeeded in adding ports to vcpkg.json file.", @@ -56,6 +58,8 @@ "_AddTripletExpressionNotAllowed.comment": "An example of {package_name} is zlib. An example of {triplet} is x64-windows.", "AddVersionAddedVersionToFile": "added version {version} to {path}", "_AddVersionAddedVersionToFile.comment": "An example of {version} is 1.3.8. An example of {path} is /foo/bar.", + "AddVersionArtifactsOnly": "--version is artifacts only and can't be used with vcpkg add port", + "_AddVersionArtifactsOnly.comment": "'--version', and 'vcpkg add port' are command lines that must not be localized", "AddVersionCommitChangesReminder": "Did you remember to commit your changes?", "AddVersionCommitResultReminder": "Don't forget to commit the result!", "AddVersionDetectLocalChangesError": "skipping detection of local changes due to unexpected format in git status output", @@ -85,7 +89,7 @@ "_AddVersionPortFilesShaUnchanged.comment": "An example of {package_name} is zlib. An example of {version} is 1.3.8.", "AddVersionPortHasImproperFormat": "{package_name} is not properly formatted", "_AddVersionPortHasImproperFormat.comment": "An example of {package_name} is zlib.", - "AddVersionSuggestNewVersionScheme": "Use the version scheme \"{new_scheme}\" instead of \"{old_scheme}\" in port \"{package_name}\".\nUse --{option} to disable this check.", + "AddVersionSuggestNewVersionScheme": "Use the version scheme \"{new_scheme}\" rather than \"{old_scheme}\" in port \"{package_name}\".\nUse --{option} to disable this check.", "_AddVersionSuggestNewVersionScheme.comment": "The -- before {option} must be preserved as they're part of the help message for the user. An example of {new_scheme} is version. An example of {old_scheme} is version-string. An example of {package_name} is zlib. An example of {option} is editable.", "AddVersionUnableToParseVersionsFile": "unable to parse versions file {path}", "_AddVersionUnableToParseVersionsFile.comment": "An example of {path} is /foo/bar.", @@ -113,8 +117,10 @@ "_AlreadyInstalledNotHead.comment": "'HEAD' means the most recent version of source code An example of {spec} is zlib:x64-windows.", "AmbiguousConfigDeleteConfigFile": "Ambiguous vcpkg configuration provided by both manifest and configuration file.\n-- Delete configuration file {path}", "_AmbiguousConfigDeleteConfigFile.comment": "An example of {path} is /foo/bar.", + "AnArrayOfDefaultFeatures": "an array of default features", "AnArrayOfDependencies": "an array of dependencies", "AnArrayOfDependencyOverrides": "an array of dependency overrides", + "AnArrayOfFeatures": "an array of features", "AnArrayOfIdentifers": "an array of identifiers", "AnArrayOfOverlayPaths": "an array of overlay paths", "AnArrayOfOverlayTripletsPaths": "an array of overlay triplets paths", @@ -137,11 +143,41 @@ "AppliedUserIntegration": "Applied user-wide integration for this vcpkg root.", "ApplocalProcessing": "vcpkg applocal processing: {path}", "_ApplocalProcessing.comment": "An example of {path} is /foo/bar.", + "ArtifactsBootstrapFailed": "vcpkg-artifacts is not installed and could not be bootstrapped.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts is not installed, and it can't be installed because VCPKG_ROOT is assumed to be readonly. Reinstalling vcpkg using the 'one liner' may fix this problem.", + "ArtifactsNotOfficialWarning": "Using vcpkg-artifacts with an unofficial ", "ArtifactsOptionIncompatibility": "--{option} has no effect on find artifact.", "_ArtifactsOptionIncompatibility.comment": "An example of {option} is editable.", + "ArtifactsOptionJson": "Full path to JSON file where environment variables and other properties are recorded", + "ArtifactsOptionMSBuildProps": "Full path to the file in which MSBuild properties will be written", + "ArtifactsOptionVersion": "A version or version range to match; only valid for artifacts", + "ArtifactsOptionVersionMismatch": "The number of --version switches must match the number of named artifacts", + "_ArtifactsOptionVersionMismatch.comment": "--version is a command line switch and must not be localized", + "ArtifactsSwitchARM": "Forces host detection to ARM when acquiring artifacts", + "ArtifactsSwitchARM64": "Forces host detection to ARM64 when acquiring artifacts", + "ArtifactsSwitchAll": "Updates all known artifact registries", + "ArtifactsSwitchAllLanguages": "Acquires all language files when acquiring artifacts", + "ArtifactsSwitchForce": "Forces reacquire if an artifact is already acquired", + "ArtifactsSwitchFreebsd": "Forces host detection to FreeBSD when acquiring artifacts", + "ArtifactsSwitchLinux": "Forces host detection to Linux when acquiring artifacts", + "ArtifactsSwitchNormalize": "Applies any deprecation fixups", + "ArtifactsSwitchOnlyOneHostPlatform": "Only one host platform (--x64, --x86, --arm, --arm64) may be set.", + "_ArtifactsSwitchOnlyOneHostPlatform.comment": "The words after -- are command line switches and must not be localized.", + "ArtifactsSwitchOnlyOneOperatingSystem": "Only one operating system (--windows, --osx, --linux, --freebsd) may be set.", + "_ArtifactsSwitchOnlyOneOperatingSystem.comment": "The words after -- are command line switches and must not be localized.", + "ArtifactsSwitchOnlyOneTargetPlatform": "Only one target platform (--target:x64, --target:x86, --target:arm, --target:arm64) may be set.", + "_ArtifactsSwitchOnlyOneTargetPlatform.comment": "The words after -- are command line switches and must not be localized.", + "ArtifactsSwitchOsx": "Forces host detection to MacOS when acquiring artifacts", + "ArtifactsSwitchTargetARM": "Sets target detection to ARM when acquiring artifacts", + "ArtifactsSwitchTargetARM64": "Sets target detection to ARM64 when acquiring artifacts", + "ArtifactsSwitchTargetX64": "Sets target detection to x64 when acquiring artifacts", + "ArtifactsSwitchTargetX86": "Sets target to x86 when acquiring artifacts", + "ArtifactsSwitchWindows": "Forces host detection to Windows when acquiring artifacts", + "ArtifactsSwitchX64": "Forces host detection to x64 when acquiring artifacts", + "ArtifactsSwitchX86": "Forces host detection to x86 when acquiring artifacts", "AssetCacheProviderAcceptsNoArguments": "unexpected arguments: '{value}' does not accept arguments", "_AssetCacheProviderAcceptsNoArguments.comment": "{value} is a asset caching provider name such as azurl, clear, or x-block-origin", - "AssetSourcesArg": "Add sources for asset caching. See 'vcpkg help assetcaching'.", + "AssetSourcesArg": "Asset caching sources. See 'vcpkg help assetcaching'", "AttemptingToFetchPackagesFromVendor": "Attempting to fetch {count} package(s) from {vendor}", "_AttemptingToFetchPackagesFromVendor.comment": "An example of {count} is 42. An example of {vendor} is Azure.", "AttemptingToSetBuiltInBaseline": "attempting to set builtin-baseline in vcpkg.json while overriding the default-registry in vcpkg-configuration.json.\nthe default-registry from vcpkg-configuration.json will be used.", @@ -150,22 +186,20 @@ "AutoSettingEnvVar": "-- Automatically setting {env_var} environment variables to \"{url}\".", "_AutoSettingEnvVar.comment": "An example of env_var is \"HTTP(S)_PROXY\"'--' at the beginning must be preserved An example of {env_var} is VCPKG_DEFAULT_TRIPLET. An example of {url} is https://github.com/microsoft/vcpkg.", "AutomaticLinkingForMSBuildProjects": "All MSBuild C++ projects can now #include any installed libraries. Linking will be handled automatically. Installing new libraries will make them instantly available.", - "AvailableArchitectureTriplets": "Available architecture triplets:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 and later can now #include any installed libraries. Linking will be handled automatically. Installing new libraries will make them instantly available.", "AvailableHelpTopics": "Available help topics:", "AzUrlAssetCacheRequiresBaseUrl": "unexpected arguments: asset config 'azurl' requires a base url", "AzUrlAssetCacheRequiresLessThanFour": "unexpected arguments: asset config 'azurl' requires fewer than 4 arguments", "BaselineConflict": "Specifying vcpkg-configuration.default-registry in a manifest file conflicts with built-in baseline.\nPlease remove one of these conflicting settings.", "BaselineFileNoDefaultField": "The baseline file at commit {commit_sha} was invalid (no \"default\" field).", "_BaselineFileNoDefaultField.comment": "An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949.", - "BaselineFileNoDefaultFieldPath": "baseline file at {path} was invalid (no \"default\" field)", - "_BaselineFileNoDefaultFieldPath.comment": "An example of {path} is /foo/bar.", "BaselineGitShowFailed": "while checking out baseline from commit '{commit_sha}', failed to `git show` versions/baseline.json. This may be fixed by fetching commits with `git fetch`.", "_BaselineGitShowFailed.comment": "An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949.", "BaselineMissing": "Baseline version not found. Run:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\nto set {version} as the baseline version.", "_BaselineMissing.comment": "An example of {package_name} is zlib. An example of {version} is 1.3.8.", - "BaselineMissingDefault": "The baseline.json from commit `\"{commit_sha}\"` in the repo {url} was invalid (did not contain a \"default\" field).", - "_BaselineMissingDefault.comment": "An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949. An example of {url} is https://github.com/microsoft/vcpkg.", - "BinarySourcesArg": "Add sources for binary caching. See 'vcpkg help binarycaching'.", + "BinaryCacheVendorHTTP": "HTTP servers", + "BinarySourcesArg": "Binary caching sources. See 'vcpkg help binarycaching'", + "_BinarySourcesArg.comment": "'vcpkg help binarycaching' is a command line and should not be localized", "BinaryWithInvalidArchitecture": "{path}\n Expected: {expected}, but was {actual}", "_BinaryWithInvalidArchitecture.comment": "{expected} and {actual} are architectures An example of {path} is /foo/bar.", "BuildAlreadyInstalled": "{spec} is already installed; please remove {spec} before attempting to build it.", @@ -193,7 +227,7 @@ "_BuildResultSummaryHeader.comment": "Displayed before a list of a summary installation results. An example of {triplet} is x64-windows.", "BuildResultSummaryLine": "{build_result}: {count}", "_BuildResultSummaryLine.comment": "Displayed to show a count of results of a build_result in a summary. An example of {build_result} is One of the BuildResultXxx messages (such as BuildResultSucceeded/SUCCEEDED). An example of {count} is 42.", - "BuildTreesRootDir": "(Experimental) Specify the buildtrees root directory.", + "BuildTreesRootDir": "Buildtrees directory (experimental)", "BuildTroubleshootingMessage1": "Please ensure you're using the latest port files with `git pull` and `vcpkg update`.\nThen check for known issues at:", "_BuildTroubleshootingMessage1.comment": "First part of build troubleshooting message, printed before the URI to look for existing bugs.", "BuildTroubleshootingMessage2": "You can submit a new issue at:", @@ -202,7 +236,7 @@ "_BuildTroubleshootingMessage3.comment": "Third part of build troubleshooting message, printed after the URI to file a bug but before version information about vcpkg itself. An example of {package_name} is zlib.", "BuildTroubleshootingMessage4": "Please use the prefilled template from {path} when reporting your issue.", "_BuildTroubleshootingMessage4.comment": "Fourth optional part of build troubleshooting message, printed after the versioninformation about vcpkg itself. An example of {path} is /foo/bar.", - "BuildTroubleshootingMessageGH": "You can also sumbit an issue by running (GitHub cli must be installed):", + "BuildTroubleshootingMessageGH": "You can also submit an issue by running (GitHub CLI must be installed):", "_BuildTroubleshootingMessageGH.comment": "Another part of build troubleshooting message, printed after the URI. An alternative version to create an issue in some cases.", "BuildingFromHead": "Building {spec} from HEAD...", "_BuildingFromHead.comment": "'HEAD' means the most recent version of source code An example of {spec} is zlib:x64-windows.", @@ -212,7 +246,7 @@ "_BuildingPackageFailed.comment": "An example of {spec} is zlib:x64-windows. An example of {build_result} is One of the BuildResultXxx messages (such as BuildResultSucceeded/SUCCEEDED).", "BuildingPackageFailedDueToMissingDeps": "due to the following missing dependencies:", "_BuildingPackageFailedDueToMissingDeps.comment": "Printed after BuildingPackageFailed, and followed by a list of dependencies that were missing.", - "BuiltInTriplets": "vcpkg built-in triplets:", + "BuiltInTriplets": "Built-in Triplets:", "BuiltWithIncorrectArchitecture": "The following files were built for an incorrect architecture:", "CISettingsExclude": "Comma-separated list of ports to skip", "CISettingsOptCIBase": "Path to the ci.baseline.txt file. Used to skip ports and detect regressions.", @@ -222,14 +256,16 @@ "CISettingsOptOutputHashes": "File to output all determined package hashes", "CISettingsOptParentHashes": "File to read package hashes for a parent CI state, to reduce the set of changed packages", "CISettingsOptSkippedCascadeCount": "Asserts that the number of --exclude and supports skips exactly equal this number", - "CISettingsOptXUnit": "File to output results in XUnit format (internal)", - "CISettingsVerifyGitTree": "Verify that each git tree object matches its declared version (this is very slow)", - "CISettingsVerifyVersion": "Print result for each port instead of just errors.", - "CISwitchOptAllowUnexpectedPassing": "Indicates that 'Passing, remove from fail list' results should not be emitted.", - "CISwitchOptDryRun": "Print out plan without execution", - "CISwitchOptRandomize": "Randomize the install order", - "CISwitchOptSkipFailures": "Indicates that ports marked `=fail` in ci.baseline.txt should be skipped.", - "CISwitchOptXUnitAll": "Report also unchanged ports to the XUnit output (internal)", + "CISettingsOptXUnit": "File to output results in XUnit format", + "CISettingsVerifyGitTree": "Verifies that each git tree object matches its declared version (this is very slow)", + "CISettingsVerifyVersion": "Prints result for each port rather than only just errors", + "CISkipInstallation": "The following packages are already installed and won't be built again:", + "CISwitchOptAllowUnexpectedPassing": "Suppresses 'Passing, remove from fail list' results", + "CISwitchOptDryRun": "Prints out plan without execution", + "CISwitchOptRandomize": "Randomizes the install order", + "CISwitchOptSkipFailures": "Skips ports marked `=fail` in ci.baseline.txt", + "_CISwitchOptSkipFailures.comment": "=fail is an on-disk format and should not be localized", + "CISwitchOptXUnitAll": "Reports unchanged ports in the XUnit output", "CMakeTargetsUsage": "{package_name} provides CMake targets:", "_CMakeTargetsUsage.comment": "'targets' are a CMake and Makefile concept An example of {package_name} is zlib.", "CMakeTargetsUsageHeuristicMessage": "# this is heuristically generated, and may not be correct", @@ -238,7 +274,6 @@ "_CMakeToolChainFile.comment": "An example of {path} is /foo/bar.", "CMakeUsingExportedLibs": "To use exported libraries in CMake projects, add {value} to your CMake command line.", "_CMakeUsingExportedLibs.comment": "{value} is a CMake command line switch of the form -DFOO=BAR", - "CacheHelp": "The argument should be a substring to search for or no argument to display all cached libraries.", "CheckedOutGitSha": "Checked out Git SHA: {commit_sha}", "_CheckedOutGitSha.comment": "An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949.", "CheckedOutObjectMissingManifest": "The checked-out object does not contain a CONTROL file or vcpkg.json file.", @@ -254,95 +289,228 @@ "_CiBaselineRegression.comment": "An example of {spec} is zlib:x64-windows. An example of {build_result} is One of the BuildResultXxx messages (such as BuildResultSucceeded/SUCCEEDED). An example of {path} is /foo/bar.", "CiBaselineRegressionHeader": "REGRESSIONS:", "_CiBaselineRegressionHeader.comment": "Printed before a series of CiBaselineRegression and/or CiBaselineUnexpectedPass messages.", + "CiBaselineUnexpectedFail": "REGRESSION: {spec} is marked as fail but not supported for {triplet}.", + "_CiBaselineUnexpectedFail.comment": "An example of {spec} is zlib:x64-windows. An example of {triplet} is x64-windows.", + "CiBaselineUnexpectedFailCascade": "REGRESSION: {spec} is marked as fail but one dependency is not supported for {triplet}.", + "_CiBaselineUnexpectedFailCascade.comment": "An example of {spec} is zlib:x64-windows. An example of {triplet} is x64-windows.", "CiBaselineUnexpectedPass": "PASSING, REMOVE FROM FAIL LIST: {spec} ({path}).", "_CiBaselineUnexpectedPass.comment": "An example of {spec} is zlib:x64-windows. An example of {path} is /foo/bar.", "ClearingContents": "Clearing contents of {path}", "_ClearingContents.comment": "An example of {path} is /foo/bar.", "CmakeTargetsExcluded": "note: {count} additional targets are not displayed.", "_CmakeTargetsExcluded.comment": "An example of {count} is 42.", - "CmdAddVersionOptAll": "Process versions for all ports.", - "CmdAddVersionOptOverwriteVersion": "Overwrite `git-tree` of an existing version.", - "CmdAddVersionOptSkipFormatChk": "Skips the formatting check of vcpkg.json files.", - "CmdAddVersionOptSkipVersionFormatChk": "Skips the version format check.", - "CmdAddVersionOptVerbose": "Print success messages instead of just errors.", + "CmdAcquireExample1": "vcpkg acquire ", + "_CmdAcquireExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdAcquireProjectSynopsis": "Acquires all artifacts referenced by a manifest", + "CmdAcquireSynopsis": "Acquires the named artifact", + "CmdActivateSynopsis": "Activates artifacts from a manifest", + "CmdAddExample1": "vcpkg add port ", + "CmdAddExample2": "vcpkg add artifact ", + "CmdAddSynopsis": "Adds dependency to manifest", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "_CmdAddVersionExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdAddVersionOptAll": "Processes versions for all ports", + "CmdAddVersionOptOverwriteVersion": "Overwrites git-tree of an existing version", + "CmdAddVersionOptSkipFormatChk": "Skips the formatting check of vcpkg.json files", + "CmdAddVersionOptSkipVersionFormatChk": "Skips the version format check", + "CmdAddVersionOptVerbose": "Prints success messages rather than only errors", + "CmdAddVersionSynopsis": "Adds a version to the version database", + "CmdBootstrapStandaloneSynopsis": "Bootstraps a vcpkg root from only a vcpkg binary", + "CmdBuildExample1": "vcpkg build ", + "_CmdBuildExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdBuildExternalExample1": "vcpkg build-external ", + "_CmdBuildExternalExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "_CmdBuildExternalExample2.comment": "This is a command line, only the path part should be changed to a path conveying the same idea", + "CmdBuildExternalSynopsis": "Builds port from a path", + "CmdBuildSynopsis": "Builds a port", + "CmdCacheExample1": "vcpkg cache ", + "_CmdCacheExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdCacheSynopsis": "List specs of packages", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "_CmdCheckSupportExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdCheckSupportSynopsis": "Tests whether a port is supported without building it", + "CmdCiCleanSynopsis": "Clears all files to prepare for a CI run", + "_CmdCiCleanSynopsis.comment": "CI is continuous integration (building everything together)", + "CmdCiSynopsis": "Tries building all ports for CI testing", + "_CmdCiSynopsis.comment": "CI is continuous integration (building everything together)", + "CmdCiVerifyVersionsSynopsis": "Checks integrity of the version database", "CmdContactOptSurvey": "Launch default browser to the current vcpkg survey", - "CmdDependInfoOptDGML": "Creates graph on basis of dgml", - "CmdDependInfoOptDepth": "Show recursion depth in output", - "CmdDependInfoOptDot": "Creates graph on basis of dot", - "CmdDependInfoOptMaxRecurse": "Set max recursion depth, a value of -1 indicates no limit", - "CmdDependInfoOptSort": "Set sort order for the list of dependencies, accepted values are: lexicographical, topological (default), x-tree, reverse", - "CmdEditOptAll": "Open editor into the port as well as the port-specific buildtree subfolder", - "CmdEditOptBuildTrees": "Open editor into the port-specific buildtree subfolder", - "CmdEnvOptions": "Add installed {path} to {env_var}", + "CmdCreateExample1": "vcpkg create ", + "_CmdCreateExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "_CmdCreateExample2.comment": "This is a command line, 'my-fancy-port' and 'sources.zip' should probably be localized", + "CmdCreateExample3": "vcpkg create ", + "_CmdCreateExample3.comment": "This is a command line, only the <>s part should be localized", + "CmdDeactivateSynopsis": "Removes all artifact activations from the current shell", + "CmdDependInfoExample1": "vcpkg depend-info ", + "_CmdDependInfoExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdDependInfoFormatConflict": "Conflicting formats specified. Only one of --format, --dgml, or --dot are accepted.", + "CmdDependInfoFormatHelp": "Chooses output format, one of `list`, `tree`, `mermaid`, `dot`, or `dgml`", + "_CmdDependInfoFormatHelp.comment": "The alternatives in ``s must not be localized.", + "CmdDependInfoFormatInvalid": "--format={value} is not a recognized format. --format must be one of `list`, `tree`, `mermaid`, `dot`, or `dgml`.", + "_CmdDependInfoFormatInvalid.comment": "The alternatives in ``s must not be localized. {value} is what the user specified.", + "CmdDependInfoOptDepth": "Shows recursion depth in `list` output", + "CmdDependInfoOptMaxRecurse": "Sets max recursion depth. Default is no limit", + "CmdDependInfoOptSort": "Chooses sort order for the `list` format, one of `lexicographical`, `topological` (default), `reverse`", + "_CmdDependInfoOptSort.comment": "The alternatives in ``s must not be localized, but the localized text can explain what each value means. The value `reverse` means 'reverse-topological'.", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth can only be used with `list` and `tree` formats.", + "CmdDependInfoXtreeTree": "--sort=x-tree cannot be used with formats other than tree", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "_CmdDownloadExample1.comment": "This is a command line, only the part should be localized", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "_CmdDownloadExample2.comment": "This is a command line, only the part should be localized", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "_CmdDownloadExample3.comment": "This is a command line, only the part should be localized", + "CmdDownloadSynopsis": "Downloads a file", + "CmdEditExample1": "vcpkg edit ", + "_CmdEditExample1.comment": "This is a command line, only the part should be localized", + "CmdEditOptAll": "Opens editor into the port as well as the port-specific buildtree subfolder", + "CmdEditOptBuildTrees": "Opens editor into the port-specific buildtree subfolder", + "CmdEnvOptions": "Adds installed {path} to {env_var}", "_CmdEnvOptions.comment": "An example of {path} is /foo/bar. An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", - "CmdExportOpt7Zip": "Export to a 7zip (.7z) file", - "CmdExportOptChocolatey": "Export a Chocolatey package (experimental feature)", - "CmdExportOptDebug": "Enable prefab debug", - "CmdExportOptDryRun": "Do not actually export.", - "CmdExportOptIFW": "Export to an IFW-based installer", - "CmdExportOptInstalled": "Export all installed packages", - "CmdExportOptMaven": "Enable Maven", - "CmdExportOptNuget": "Export a NuGet package", - "CmdExportOptPrefab": "Export to Prefab format", - "CmdExportOptRaw": "Export to an uncompressed directory", - "CmdExportOptZip": "Export to a zip file", - "CmdExportSettingChocolateyMaint": "Specify the maintainer for the exported Chocolatey package (experimental feature)", - "CmdExportSettingChocolateyVersion": "Specify the version suffix to add for the exported Chocolatey package (experimental feature)", - "CmdExportSettingConfigFile": "Specify the temporary file path for the installer configuration", - "CmdExportSettingInstallerPath": "Specify the file path for the exported installer", - "CmdExportSettingNugetDesc": "Specify a description for the exported NuGet package", - "CmdExportSettingNugetID": "Specify the id for the exported NuGet package (overrides --output)", - "CmdExportSettingNugetVersion": "Specify the version for the exported NuGet package", - "CmdExportSettingOutput": "Specify the output name (used to construct filename)", - "CmdExportSettingOutputDir": "Specify the output directory for produced artifacts", - "CmdExportSettingPkgDir": "Specify the temporary directory path for the repacked packages", + "CmdExportEmptyPlan": "Refusing to create an export of zero packages. Install packages before exporting.", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", + "_CmdExportExample1.comment": "This is a command line, only and the out_dir part should be localized", + "CmdExportOpt7Zip": "Exports to a 7zip (.7z) file", + "CmdExportOptChocolatey": "Exports a Chocolatey package (experimental)", + "CmdExportOptDebug": "Enables prefab debug", + "CmdExportOptDryRun": "Does not actually export", + "CmdExportOptIFW": "Exports to an IFW-based installer", + "CmdExportOptInstalled": "Exports all installed packages", + "CmdExportOptMaven": "Enables Maven", + "CmdExportOptNuget": "Exports a NuGet package", + "CmdExportOptPrefab": "Exports to Prefab format", + "CmdExportOptRaw": "Exports to an uncompressed directory", + "CmdExportOptZip": "Exports to a zip file", + "CmdExportSettingChocolateyMaint": "The maintainer for the exported Chocolatey package (experimental)", + "CmdExportSettingChocolateyVersion": "The version suffix to add for the exported Chocolatey package (experimental)", + "CmdExportSettingConfigFile": "The temporary file path for the installer configuration", + "CmdExportSettingInstallerPath": "The file path for the exported installer", + "CmdExportSettingNugetDesc": "Description for the exported NuGet package", + "CmdExportSettingNugetID": "Id for the exported NuGet package (overrides --output)", + "CmdExportSettingNugetVersion": "The version for the exported NuGet package", + "CmdExportSettingOutput": "The output name (used to construct filename)", + "CmdExportSettingOutputDir": "The output directory for produced artifacts", + "CmdExportSettingPkgDir": "The temporary directory path for the repacked packages", "CmdExportSettingPrefabArtifactID": "Artifact Id is the name of the project according Maven specifications", "CmdExportSettingPrefabGroupID": "GroupId uniquely identifies your project according Maven specifications", "CmdExportSettingPrefabVersion": "Version is the name of the project according Maven specifications", - "CmdExportSettingRepoDir": "Specify the directory path for the exported repository", - "CmdExportSettingRepoURL": "Specify the remote repository URL for the online installer", - "CmdExportSettingSDKMinVersion": "Android minimum supported SDK version", - "CmdExportSettingSDKTargetVersion": "Android target sdk version", - "CmdFetchOptXStderrStatus": "Direct status/downloading messages to stderr rather than stdout. (Errors/failures still go to stdout)", - "CmdFormatManifestOptAll": "Format all ports' manifest files.", - "CmdFormatManifestOptConvertControl": "Convert CONTROL files to manifest files.", - "CmdGenerateMessageMapOptNoOutputComments": "When generating the message map, exclude comments (useful for generating the English localization file)", - "CmdInfoOptInstalled": "(experimental) Report on installed packages instead of available", - "CmdInfoOptTransitive": "(experimental) Also report on dependencies of installed packages", - "CmdNewOptApplication": "Create an application manifest (don't require name or version).", - "CmdNewOptSingleFile": "Embed vcpkg-configuration.json into vcpkg.json.", - "CmdNewOptVersionDate": "Interpret --version as an ISO 8601 date. (YYYY-MM-DD)", - "CmdNewOptVersionRelaxed": "Interpret --version as a relaxed-numeric version. (Nonnegative numbers separated by dots)", - "CmdNewOptVersionString": "Interpret --version as a string with no ordering behavior.", - "CmdNewSettingName": "Name for the new manifest.", - "CmdNewSettingVersion": "Version for the new manifest.", - "CmdRegenerateOptDryRun": "does not actually perform the action, shows only what would be done", - "CmdRegenerateOptForce": "proceeds with the (potentially dangerous) action without confirmation", - "CmdRegenerateOptNormalize": "apply any deprecation fixups", - "CmdRemoveOptDryRun": "Print the packages to be removed, but do not remove them", - "CmdRemoveOptOutdated": "Select all packages with versions that do not match the portfiles", - "CmdRemoveOptRecurse": "Allow removal of packages not explicitly specified on the command line", - "CmdSetInstalledOptDryRun": "Do not actually build or install", - "CmdSetInstalledOptNoUsage": "Don't print CMake usage information after install.", - "CmdSetInstalledOptWritePkgConfig": "Writes out a NuGet packages.config-formatted file for use with external binary caching.\nSee `vcpkg help binarycaching` for more information.", + "CmdExportSettingRepoDir": "The directory path for the exported repository", + "CmdExportSettingRepoURL": "The remote repository URL for the online installer", + "CmdExportSettingSDKMinVersion": "The Android minimum supported SDK version", + "CmdExportSettingSDKTargetVersion": "The Android target sdk version", + "CmdExportSynopsis": "Creates a standalone deployment of installed ports", + "CmdFetchOptXStderrStatus": "Prints status/downloading messages to stderr rather than stdout (Errors/failures still go to stdout)", + "CmdFetchSynopsis": "Fetches something from the system or the internet", + "CmdFindExample1": "vcpkg find port ", + "_CmdFindExample1.comment": "This is a command line, only the <>s part should be localized", + "CmdFindExample2": "vcpkg find artifact ", + "_CmdFindExample2.comment": "This is a command line, only the <>s part should be localized", + "CmdFindSynopsis": "Finds a port or artifact that may be installed or activated", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "_CmdFormatManifestExample1.comment": "This is a command line, only the s part should be localized", + "CmdFormatManifestOptAll": "Formats all ports' manifest files", + "CmdFormatManifestOptConvertControl": "Converts CONTROL files to manifest files", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "_CmdGenerateMSBuildPropsExample1.comment": "This is a command line, only the part should be localized", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "_CmdGenerateMSBuildPropsExample2.comment": "This is a command line, only the word 'out' should be localized", + "CmdGenerateMSBuildPropsSynopsis": "Generates msbuild .props files as if activating a manifest's artifact dependencies, without acquiring them", + "CmdGenerateMessageMapOptNoOutputComments": "Excludes comments when generating the message map (useful for generating the English localization file)", + "CmdHashExample1": "vcpkg hash ", + "_CmdHashExample1.comment": "This is a command line, only the part should be localized", + "CmdHashExample2": "vcpkg hash SHA256", + "_CmdHashExample2.comment": "This is a command line, only the part should be localized", + "CmdHashSynopsis": "Gets a file's SHA256 or SHA512", + "CmdHelpCommandSynopsis": "Displays help detail for ", + "CmdHelpCommands": "help ", + "_CmdHelpCommands.comment": "This is a command line, only should be localized.", + "CmdHelpCommandsSynopsis": "Displays full list of commands, including rare ones not listed here", + "CmdHelpTopic": "help ", + "_CmdHelpTopic.comment": "This is a command line, only should be localized.", + "CmdInfoOptInstalled": "(experimental) Reports installed packages rather than available", + "CmdInfoOptTransitive": "(experimental) Also reports dependencies of installed packages", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "_CmdInitRegistryExample1.comment": "This is a command line, only the part should be localized", + "CmdInitRegistrySynopsis": "Creates a blank git registry", + "CmdInstallExample1": "vcpkg install ...", + "_CmdInstallExample1.comment": "This is a command line, only the <> parts should be localized", + "CmdIntegrateSynopsis": "Integrates vcpkg with machines, projects, or shells", + "CmdListExample2": "vcpkg list ", + "_CmdListExample2.comment": "This is a command line, only the part should be localized", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "_CmdNewExample1.comment": "This is a command line, only the word example should be localized", + "CmdNewOptApplication": "Creates an application manifest (don't require name or version)", + "CmdNewOptSingleFile": "Embeds vcpkg-configuration.json into vcpkg.json", + "CmdNewOptVersionDate": "Interprets --version as an ISO 8601 date. (YYYY-MM-DD)", + "CmdNewOptVersionRelaxed": "Interprets --version as a relaxed-numeric version (Nonnegative numbers separated by dots)", + "CmdNewOptVersionString": "Interprets --version as a string with no ordering behavior", + "CmdNewSettingName": "Name for the new manifest", + "CmdNewSettingVersion": "Version for the new manifest", + "CmdNewSynposis": "Creates a new manifest", + "CmdOwnsExample1": "vcpkg owns ", + "_CmdOwnsExample1.comment": "This is a command line, only the part should be localized.", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "_CmdPackageInfoExample1.comment": "This is a command line, only the part should be localized.", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "_CmdPortsdiffExample1.comment": "This is a command line, only the part should be localized", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "_CmdPortsdiffExample2.comment": "This is a command line, only the parts in <>s should be localized", + "CmdPortsdiffSynopsis": "Diffs changes in port versions between commits", + "CmdRegenerateOptDryRun": "Does not actually perform the action, shows only what would be done", + "CmdRegenerateOptForce": "Proceeds with the (potentially dangerous) action without confirmation", + "CmdRegenerateOptNormalize": "Applies any deprecation fixes", + "CmdRemoveExample1": "vcpkg remove ...", + "_CmdRemoveExample1.comment": "This is a command line, only the part should be localized.", + "CmdRemoveOptDryRun": "Prints the packages to be removed, but does not remove them", + "CmdRemoveOptOutdated": "Removes all packages with versions that do not match the built-in registry", + "CmdRemoveOptRecurse": "Allows removal of dependent packages not explicitly specified", + "CmdSearchExample1": "vcpkg search ", + "_CmdSearchExample1.comment": "This is a command line, only the part should be localized.", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "_CmdSetInstalledExample1.comment": "This is a command line, only the part should be localized.", + "CmdSetInstalledOptDryRun": "Does not actually build or install", + "CmdSetInstalledOptNoUsage": "Does not print CMake usage information after install", + "CmdSetInstalledOptWritePkgConfig": "Writes a NuGet packages.config-formatted file for use with external binary caching. See `vcpkg help binarycaching` for more information", + "_CmdSetInstalledOptWritePkgConfig.comment": "'vcpkg help binarycaching' is a command line and should not be localized.", + "CmdSetInstalledSynopsis": "Installs, upgrades, or removes packages such that that installed matches exactly those supplied", "CmdSettingCopiedFilesLog": "Path to the copied files log to create", "CmdSettingInstalledDir": "Path to the installed tree to use", "CmdSettingTLogFile": "Path to the tlog file to create", "CmdSettingTargetBin": "Path to the binary to analyze", - "CmdUpdateBaselineOptDryRun": "Print out plan without execution", - "CmdUpdateBaselineOptInitial": "add a `builtin-baseline` to a vcpkg.json that doesn't already have it", - "CmdUpgradeOptAllowUnsupported": "Instead of erroring on an unsupported port, continue with a warning.", + "CmdUpdateBaselineOptDryRun": "Prints out plan without execution", + "CmdUpdateBaselineOptInitial": "Adds a `builtin-baseline` to a vcpkg.json that doesn't already have it", + "CmdUpdateBaselineSynopsis": "Updates baselines of git registries in a manifest to those registries' HEAD commit", + "CmdUpdateRegistryAll": "Updates all known artifact registries", + "CmdUpdateRegistryAllExcludesTargets": "Update registry --all cannot be used with a list of artifact registries", + "CmdUpdateRegistryAllOrTargets": "Update registry requires either a list of artifact registry names or URiIs to update, or --all.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "_CmdUpdateRegistryExample3.comment": "This is a command line, only the part should be localized.", + "CmdUpdateRegistrySynopsis": "Re-downloads an artifact registry", "CmdUpgradeOptNoDryRun": "Actually upgrade", "CmdUpgradeOptNoKeepGoing": "Stop installing packages on failure", + "CmdUseExample1": "vcpkg use ", + "_CmdUseExample1.comment": "This is a command line, only the part should be localized.", + "CmdUseSynopsis": "Activate a single artifact in this shell", + "CmdVSInstancesSynopsis": "Lists detected Visual Studio instances", "CmdXDownloadOptHeader": "Additional header to use when fetching from URLs", "CmdXDownloadOptSha": "The hash of the file to be downloaded", - "CmdXDownloadOptSkipSha": "Do not check the SHA512 of the downloaded file", - "CmdXDownloadOptStore": "Indicates the file should be stored instead of fetched", + "CmdXDownloadOptSkipSha": "Skips check of SHA512 of the downloaded file", + "CmdXDownloadOptStore": "Stores the the file should father than fetching it", "CmdXDownloadOptUrl": "URL to download and store if missing from cache", + "CmdZApplocalSynopsis": "Copies a binary's dependencies from the installed tree to where that binary's location for app-local deployment", + "CmdZExtractExample1": "vcpkg z-extract ", + "_CmdZExtractExample1.comment": "This is a command line, only the parts in <>s should be localized", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "_CmdZExtractExample2.comment": "This is a command line, the example archive 'source.zip' and the example output directory 'source_dir' should be localized", + "CmdZExtractOptStrip": "The number of leading directories to strip from all paths", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", + "_CommandEnvExample2.comment": "This is a command line, only the part should be localized", "CommandFailed": "command:\n{command_line}\nfailed with the following results:", "_CommandFailed.comment": "An example of {command_line} is vcpkg install zlib.", - "Commands": "Commands:", - "CommunityTriplets": "VCPKG community triplets:", + "CommunityTriplets": "Community Triplets:", "ComparingUtf8Decoders": "Comparing Utf8Decoders with different provenance; this is always an error", "CompressFolderFailed": "Failed to compress folder \"{path}\":", "_CompressFolderFailed.comment": "An example of {path} is /foo/bar.", @@ -353,6 +521,8 @@ "_ConfigurationNestedDemands.comment": "An example of {json_field} is identifer.", "ConflictingFiles": "The following files are already installed in {path} and are in conflict with {spec}", "_ConflictingFiles.comment": "An example of {path} is /foo/bar. An example of {spec} is zlib:x64-windows.", + "ConsideredVersions": "The following executables were considered but discarded because of the version requirement of {version}:", + "_ConsideredVersions.comment": "An example of {version} is 1.3.8.", "ConstraintViolation": "Found a constraint violation:", "ContinueCodeUnitInStart": "found continue code unit in start position", "ControlAndManifestFilesPresent": "Both a manifest file and a CONTROL file exist in port directory: {path}", @@ -364,12 +534,8 @@ "CorruptedInstallTree": "Your vcpkg 'installed' tree is corrupted.", "CouldNotDeduceNugetIdAndVersion": "Could not deduce nuget id and version from filename: {path}", "_CouldNotDeduceNugetIdAndVersion.comment": "An example of {path} is /foo/bar.", - "CouldNotFindBaseline": "Could not find explicitly specified baseline `\"{commit_sha}\"` in baseline file {path}", - "_CouldNotFindBaseline.comment": "An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949. An example of {path} is /foo/bar.", - "CouldNotFindBaselineForRepo": "Couldn't find baseline `\"{commit_sha}\"` for repo {package_name}", - "_CouldNotFindBaselineForRepo.comment": "An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949. An example of {package_name} is zlib.", - "CouldNotFindBaselineInCommit": "Couldn't find baseline in commit `\"{commit_sha}\"` from repo {package_name}:", - "_CouldNotFindBaselineInCommit.comment": "An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949. An example of {package_name} is zlib.", + "CouldNotFindBaselineInCommit": "Couldn't find baseline in {url} at {commit_sha} for {package_name}.", + "_CouldNotFindBaselineInCommit.comment": "An example of {url} is https://github.com/microsoft/vcpkg. An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949. An example of {package_name} is zlib.", "CouldNotFindGitTreeAtCommit": "could not find the git tree for `versions` in repo {package_name} at commit {commit_sha}", "_CouldNotFindGitTreeAtCommit.comment": "An example of {package_name} is zlib. An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949.", "CouldNotFindToolVersion": "Could not find in {path}", @@ -406,15 +572,25 @@ "_DefaultBinaryCacheRequiresAbsolutePath.comment": "An example of {path} is /foo/bar.", "DefaultBinaryCacheRequiresDirectory": "Environment variable VCPKG_DEFAULT_BINARY_CACHE must be a directory (was: {path})", "_DefaultBinaryCacheRequiresDirectory.comment": "An example of {path} is /foo/bar.", - "DefaultBrowserLaunched": "Default browser launched to {url}.", - "_DefaultBrowserLaunched.comment": "An example of {url} is https://github.com/microsoft/vcpkg.", + "DefaultFeatureCore": "the feature \"core\" turns off default features and thus can't be in the default features list", + "_DefaultFeatureCore.comment": "The word \"core\" is an on-disk name that must not be localized.", + "DefaultFeatureDefault": "the feature \"default\" refers to the set of default features and thus can't be in the default features list", + "_DefaultFeatureDefault.comment": "The word \"default\" is an on-disk name that must not be localized.", + "DefaultFeatureIdentifier": "the names of default features must be identifiers", "DefaultFlag": "Defaulting to --{option} being on.", "_DefaultFlag.comment": "An example of {option} is editable.", "DefaultRegistryIsArtifact": "The default registry cannot be an artifact registry.", - "DefaultTriplet": "Starting with the September 2023 release, the default triplet for vcpkg libraries will change from x86-windows to the detected host triplet ({triplet}). To resolve this message, add --triplet x86-windows to keep the same behavior.", - "_DefaultTriplet.comment": "An example of {triplet} is x64-windows.", + "DefaultTripletChanged": "In the September 2023 release, the default triplet for vcpkg libraries changed from x86-windows to the detected host triplet ({triplet}). For the old behavior, add --triplet x86-windows . To suppress this message, add --triplet {triplet} .", + "_DefaultTripletChanged.comment": "The parts naming --triplet are command line switches that should be unlocalized. The space after the last 'triplet' and the period is intended to avoid the period looking like it's part of the command line switch An example of {triplet} is x64-windows.", "DeleteVcpkgConfigFromManifest": "-- Or remove \"vcpkg-configuration\" from the manifest file {path}.", "_DeleteVcpkgConfigFromManifest.comment": "An example of {path} is /foo/bar.", + "DependencyFeatureCore": "the feature \"core\" cannot be in a dependency's feature list. To turn off default features, add \"default-features\": false instead.", + "_DependencyFeatureCore.comment": "The word \"core\" is an on-disk name that must not be localized. The \"default-features\" part is JSON syntax that must be copied verbatim into the user's file.", + "DependencyFeatureDefault": "the feature \"default\" cannot be in a dependency's feature list. To turn on default features, add \"default-features\": true instead.", + "_DependencyFeatureDefault.comment": "The word \"default\" is an on-disk name that must not be localized. The \"default-features\" part is JSON syntax that must be copied verbatim into the user's file.", + "DependencyGraphCalculation": "Dependency graph submission enabled.", + "DependencyGraphFailure": "Dependency graph submission failed.", + "DependencyGraphSuccess": "Dependency graph submission successful.", "DeprecatedPrefabDebugOption": "--prefab-debug is now deprecated.", "DetectCompilerHash": "Detecting compiler hash for triplet {triplet}...", "_DetectCompilerHash.comment": "An example of {triplet} is x64-windows.", @@ -429,7 +605,7 @@ "_DownloadFailedRetrying.comment": "{value} is a number of milliseconds", "DownloadFailedStatusCode": "{url}: failed: status code {value}", "_DownloadFailedStatusCode.comment": "{value} is an HTTP status code An example of {url} is https://github.com/microsoft/vcpkg.", - "DownloadRootsDir": "Specify the downloads root directory.\n(default: {env_var})", + "DownloadRootsDir": "Downloads directory (default: {env_var})", "_DownloadRootsDir.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", "DownloadWinHttpError": "{url}: {system_api} failed with exit code {exit_code}", "_DownloadWinHttpError.comment": "An example of {system_api} is CreateProcessW. An example of {exit_code} is 127. An example of {url} is https://github.com/microsoft/vcpkg.", @@ -441,10 +617,6 @@ "_DownloadingTool.comment": "An example of {tool_name} is aria2. An example of {url} is https://github.com/microsoft/vcpkg. An example of {path} is /foo/bar.", "DownloadingUrl": "Downloading {url}", "_DownloadingUrl.comment": "An example of {url} is https://github.com/microsoft/vcpkg.", - "DownloadingVcpkgCeBundle": "Downloading vcpkg-artifacts bundle {version}...", - "_DownloadingVcpkgCeBundle.comment": "An example of {version} is 1.3.8.", - "DownloadingVcpkgCeBundleLatest": "Downloading latest vcpkg-artifacts bundle...", - "_DownloadingVcpkgCeBundleLatest.comment": "This message is normally displayed only in development.", "DownloadingVcpkgStandaloneBundle": "Downloading standalone bundle {version}.", "_DownloadingVcpkgStandaloneBundle.comment": "An example of {version} is 1.3.8.", "DownloadingVcpkgStandaloneBundleLatest": "Downloading latest standalone bundle.", @@ -480,6 +652,8 @@ "ErrorIndividualPackagesUnsupported": "In manifest mode, `vcpkg install` does not support individual package arguments.\nTo install additional packages, edit vcpkg.json and then run `vcpkg install` without any package arguments.", "ErrorInvalidClassicModeOption": "The option --{option} is not supported in classic mode and no manifest was found.", "_ErrorInvalidClassicModeOption.comment": "An example of {option} is editable.", + "ErrorInvalidExtractOption": "--{option} must be set to a nonnegative integer or 'AUTO'.", + "_ErrorInvalidExtractOption.comment": "The keyword 'AUTO' should not be localized An example of {option} is editable.", "ErrorInvalidManifestModeOption": "The option --{option} is not supported in manifest mode.", "_ErrorInvalidManifestModeOption.comment": "An example of {option} is editable.", "ErrorMessage": "error: ", @@ -512,7 +686,8 @@ "ErrorWhileWriting": "Error occurred while writing {path}.", "_ErrorWhileWriting.comment": "An example of {path} is /foo/bar.", "ErrorsFound": "Found the following errors:", - "Example": "example:", + "ExamplesHeader": "Examples:", + "_ExamplesHeader.comment": "Printed before a list of example command lines", "ExceededRecursionDepth": "Recursion depth exceeded.", "ExcludedPackage": "Excluded {spec}", "_ExcludedPackage.comment": "An example of {spec} is zlib:x64-windows.", @@ -553,6 +728,7 @@ "_ExportingPackage.comment": "An example of {package_name} is zlib.", "ExtendedDocumentationAtUrl": "Extended documentation available at '{url}'.", "_ExtendedDocumentationAtUrl.comment": "An example of {url} is https://github.com/microsoft/vcpkg.", + "ExtractHelp": "Extracts an archive.", "ExtractingTool": "Extracting {tool_name}...", "_ExtractingTool.comment": "An example of {tool_name} is aria2.", "FailedPostBuildChecks": "Found {count} post-build check problem(s). To submit these ports to curated catalogs, please first correct the portfile: {path}", @@ -571,9 +747,8 @@ "FailedToDownloadFromMirrorSet": "Failed to download from mirror set", "FailedToExtract": "Failed to extract \"{path}\":", "_FailedToExtract.comment": "An example of {path} is /foo/bar.", - "FailedToFetchError": "{error_msg}\nFailed to fetch {package_name}:", - "_FailedToFetchError.comment": "An example of {error_msg} is File Not Found. An example of {package_name} is zlib.", - "FailedToFindBaseline": "Failed to find baseline.json", + "FailedToFetchRepo": "Failed to fetch {url}.", + "_FailedToFetchRepo.comment": "An example of {url} is https://github.com/microsoft/vcpkg.", "FailedToFindPortFeature": "{package_name} has no feature named {feature}.", "_FailedToFindPortFeature.comment": "An example of {feature} is avisynthplus. An example of {package_name} is zlib.", "FailedToFormatMissingFile": "No files to format.\nPlease pass either --all, or the explicit files to format or convert.", @@ -629,7 +804,6 @@ "_FailedToWriteManifest.comment": "An example of {path} is /foo/bar.", "FailedVendorAuthentication": "One or more {vendor} credential providers failed to authenticate. See '{url}' for more details on how to provide credentials.", "_FailedVendorAuthentication.comment": "An example of {vendor} is Azure. An example of {url} is https://github.com/microsoft/vcpkg.", - "FeedbackAppreciated": "Thank you for your feedback!", "FetchingBaselineInfo": "Fetching baseline information from {package_name}...", "_FetchingBaselineInfo.comment": "An example of {package_name} is zlib.", "FetchingRegistryInfo": "Fetching registry information from {url} ({value})...", @@ -650,6 +824,8 @@ "_FilesExported.comment": "An example of {path} is /foo/bar.", "FindHelp": "Searches for the indicated artifact or port. With no parameter after 'artifact' or 'port', displays everything.", "_FindHelp.comment": "'artifact' and 'port' are what the user must literally type.", + "FindVersionArtifactsOnly": "--version can't be used with vcpkg search or vcpkg find port", + "_FindVersionArtifactsOnly.comment": "'--version', 'vcpkg search', and 'vcpkg find port' are command lines that must not be localized", "FishCompletion": "vcpkg fish completion is already added at \"{path}\".", "_FishCompletion.comment": "An example of {path} is /foo/bar.", "FloatingPointConstTooBig": "Floating point constant too big: {count}", @@ -657,6 +833,8 @@ "FollowingPackagesMissingControl": "The following packages do not have a valid CONTROL or vcpkg.json:", "FollowingPackagesNotInstalled": "The following packages are not installed:", "FollowingPackagesUpgraded": "The following packages are up-to-date:", + "ForMoreHelp": "For More Help", + "_ForMoreHelp.comment": "Printed before a suggestion for the user to run `vcpkg help `", "ForceSystemBinariesOnWeirdPlatforms": "Environment variable VCPKG_FORCE_SYSTEM_BINARIES must be set on arm, s390x, ppc64le and riscv platforms.", "FormattedParseMessageExpression": "on expression: {value}", "_FormattedParseMessageExpression.comment": "Example of {value} is 'x64 & windows'", @@ -687,8 +865,8 @@ "_GitFailedToFetch.comment": "{value} is a git ref like 'origin/main' An example of {url} is https://github.com/microsoft/vcpkg.", "GitFailedToInitializeLocalRepository": "failed to initialize local repository {path}", "_GitFailedToInitializeLocalRepository.comment": "An example of {path} is /foo/bar.", - "GitRegistryMustHaveBaseline": "The git registry entry for \"{package_name}\" must have a \"baseline\" field that is a valid git commit SHA (40 hexadecimal characters).\nThe current HEAD of that repo is \"{value}\".", - "_GitRegistryMustHaveBaseline.comment": "{value} is a commit sha An example of {package_name} is zlib.", + "GitRegistryMustHaveBaseline": "The git registry \"{url}\" must have a \"baseline\" field that is a valid git commit SHA (40 hexadecimal characters).\nTo use the current latest versions, set baseline to that repo's HEAD, \"{commit_sha}\".", + "_GitRegistryMustHaveBaseline.comment": "An example of {url} is https://github.com/microsoft/vcpkg. An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949.", "GitStatusOutputExpectedFileName": "expected a file name", "GitStatusOutputExpectedNewLine": "expected new line", "GitStatusOutputExpectedRenameOrNewline": "expected renamed file or new lines", @@ -700,6 +878,8 @@ "_GraphCycleDetected.comment": "A list of package names comprising the cycle will be printed after this message. An example of {package_name} is zlib.", "HashFileFailureToRead": "failed to read file \"{path}\" for hashing: ", "_HashFileFailureToRead.comment": "Printed after ErrorMessage and before the specific failing filesystem operation (like file not found) An example of {path} is /foo/bar.", + "HashPortManyFiles": "The {package_name} contains {count} files. Hashing these contents may take a long time when determining the ABI hash for binary caching. Consider reducing the number of files. Common causes of this are accidentally checking out source or build files into a port's directory.", + "_HashPortManyFiles.comment": "An example of {package_name} is zlib. An example of {count} is 42.", "HeaderOnlyUsage": "{package_name} is header-only and can be used from CMake via:", "_HeaderOnlyUsage.comment": "'header' refers to C/C++ .h files An example of {package_name} is zlib.", "HelpAssetCaching": "**Experimental feature: this may change or be removed at any time**\n\nvcpkg can use mirrors to cache downloaded assets, ensuring continued operation even if the original source changes or disappears.\n\nAsset caching can be configured either by setting the environment variable X_VCPKG_ASSET_SOURCES to a semicolon-delimited list of sources or by passing a sequence of --x-asset-sources= command line options. Command line sources are interpreted after environment sources. Commas, semicolons, and backticks can be escaped using backtick (`).\n\nThe optional parameter for certain strings controls how they will be accessed. It can be specified as \"read\", \"write\", or \"readwrite\" and defaults to \"read\".\n\nValid sources:", @@ -744,56 +924,55 @@ "_HelpBinaryCachingNuGetTimeout.comment": "Printed as the 'definition' of 'nugettimeout,'", "HelpBuiltinBase": "The baseline references a commit within the vcpkg repository that establishes a minimum version on every dependency in the graph. For example, if no other constraints are specified (directly or transitively), then the version will resolve to the baseline of the top level manifest. Baselines of transitive dependencies are ignored.", "HelpCachingClear": "Removes all previous sources, including defaults.", - "HelpContactCommand": "Display contact information to send feedback.", - "HelpCreateCommand": "Create a new port.", - "HelpDependInfoCommand": "Display a list of dependencies for ports.", - "HelpEditCommand": "Open a port for editing (use the environment variable '{env_var}' to set an editor program, defaults to 'code').", - "_HelpEditCommand.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", - "HelpEnvCommand": "Creates a clean shell environment for development or compiling.", - "HelpExampleCommand": "For more help (including examples) see the accompanying README.md and docs folder.", + "HelpContactCommand": "Displays contact information to send feedback", + "HelpCreateCommand": "Creates a new port", + "HelpDependInfoCommand": "Displays a list of dependencies for ports", + "HelpEditCommand": "Edits a port, optionally with {env_var}, defaults to \"code\"", + "_HelpEditCommand.comment": "\"code\" is the name of a program and should not be localized. An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", + "HelpEnvCommand": "Creates a clean shell environment for development or compiling", + "HelpExampleCommand": "For more help (including examples) see https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Example manifest:", "HelpExportCommand": "Exports a package.", - "HelpFormatManifestCommand": "Formats all vcpkg.json files. Run this before committing to vcpkg.", "HelpHashCommand": "Hash a file by specific algorithm, default SHA512.", - "HelpInitializeRegistryCommand": "Initializes a registry in the directory .", - "HelpInstallCommand": "Install a package.", - "HelpListCommand": "List installed packages.", + "HelpInstallCommand": "Installs a package", + "HelpListCommand": "Lists installed packages", "HelpManifestConstraints": "Manifests can place three kinds of constraints upon the versions used", "HelpMinVersion": "Vcpkg will select the minimum version found that matches all applicable constraints, including the version from the baseline specified at top-level as well as any \"version>=\" constraints in the graph.", "HelpOverrides": "When used as the top-level manifest (such as when running `vcpkg install` in the directory), overrides allow a manifest to short-circuit dependency resolution and specify exactly the version to use. These can be used to handle version conflicts, such as with `version-string` dependencies. They will not be considered when transitively depended upon.", - "HelpOwnsCommand": "Search for files in installed packages.", + "HelpOwnsCommand": "Searches for the owner of a file in installed packages", "HelpPackagePublisher": "Additionally, package publishers can use \"version>=\" constraints to ensure that consumers are using at least a certain minimum version of a given dependency. For example, if a library needs an API added to boost-asio in 1.70, a \"version>=\" constraint will ensure transitive users use a sufficient version even in the face of individual version overrides or cross-registry references.", - "HelpPortVersionScheme": "Each version additionally has a \"port-version\" which is a nonnegative integer. When rendered as text, the port version (if nonzero) is added as a suffix to the primary version text separated by a hash (#). Port-versions are sorted lexographically after the primary version text, for example:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Uninstall a package.", - "HelpRemoveOutdatedCommand": "Uninstall all out-of-date packages.", - "HelpResponseFileCommand": "Specify a response file to provide additional parameters.", - "HelpSearchCommand": "Search for packages available to be built.", - "HelpTextOptFullDesc": "Do not truncate long text.", - "HelpTopicCommand": "Display help for a specific topic.", - "HelpTopicsCommand": "Display the list of help topics.", - "HelpTxtOptAllowUnsupportedPort": "Instead of erroring on an unsupported port, continue with a warning.", - "HelpTxtOptCleanAfterBuild": "Clean buildtrees, packages and downloads after building each package.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Clean buildtrees after building each package.", - "HelpTxtOptCleanDownloadsAfterBuild": "Clean downloads after building each package.", - "HelpTxtOptCleanPkgAfterBuild": "Clean packages after building each package.", - "HelpTxtOptDryRun": "Do not actually build or install.", - "HelpTxtOptEditable": "Disable source re-extraction and binary caching for libraries on the command line (classic mode)", - "HelpTxtOptEnforcePortChecks": "Fail install if a port has detected problems or attempts to use a deprecated feature", - "HelpTxtOptKeepGoing": "Continue installing packages on failure.", - "HelpTxtOptManifestFeature": "Additional feature from the top-level manifest to install (manifest mode).", - "HelpTxtOptManifestNoDefault": "Don't install the default features from the top-level manifest (manifest mode).", - "HelpTxtOptNoDownloads": "Do not download new sources.", - "HelpTxtOptNoUsage": "Don't print CMake usage information after install.", - "HelpTxtOptOnlyBinCache": "Fail if cached binaries are not available.", - "HelpTxtOptOnlyDownloads": "Make a best-effort attempt to download sources without building.", - "HelpTxtOptRecurse": "Allow removal of packages as part of installation.", - "HelpTxtOptUseAria2": "Use aria2 to perform download tasks.", - "HelpTxtOptUseHeadVersion": "Install the libraries on the command line using the latest upstream sources (classic mode).", - "HelpTxtOptWritePkgConfig": "Writes out a NuGet packages.config-formatted file for use with external binary caching.\nSee `vcpkg help binarycaching` for more information.", - "HelpUpdateBaseline": "The best approach to keep your libraries up to date, the best approach is to update your baseline reference. This will ensure all packages, including transitive ones, are updated. However if you need to update a package independently, you can use a \"version>=\" constraint.", - "HelpUpdateCommand": "List packages that can be updated.", - "HelpUpgradeCommand": "Rebuild all outdated packages.", - "HelpVersionCommand": "Display version information.", + "HelpPortVersionScheme": "Each version additionally has a \"port-version\" which is a nonnegative integer. When rendered as text, the port version (if nonzero) is added as a suffix to the primary version text separated by a hash (#). Port-versions are sorted lexicographically after the primary version text, for example:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Uninstalls a package", + "HelpResponseFileCommand": "Contains one argument per line expanded at that location", + "_HelpResponseFileCommand.comment": "Describing what @response_file does on vcpkg's command line", + "HelpSearchCommand": "Searches for packages available to be built", + "HelpTextOptFullDesc": "Does not truncate long text", + "HelpTopicCommand": "Displays specific help topic", + "HelpTopicsCommand": "Displays full list of help topics", + "HelpTxtOptAllowUnsupportedPort": "Continues with a warning on unsupported ports, rather than failing", + "HelpTxtOptCleanAfterBuild": "Cleans buildtrees, packages and downloads after building each package", + "HelpTxtOptCleanBuildTreesAfterBuild": "Cleans buildtrees after building each package", + "HelpTxtOptCleanDownloadsAfterBuild": "Cleans downloads after building each package", + "HelpTxtOptCleanPkgAfterBuild": "Cleans packages after building each package", + "HelpTxtOptDryRun": "Does not actually build or install", + "HelpTxtOptEditable": "Disables source re-extraction and binary caching for libraries on the command line (classic mode)", + "HelpTxtOptEnforcePortChecks": "Fails install if a port has detected problems or attempts to use a deprecated feature", + "HelpTxtOptKeepGoing": "Continues installing packages on failure", + "HelpTxtOptManifestFeature": "Additional features from the top-level manifest to install (manifest mode)", + "HelpTxtOptManifestNoDefault": "Does not install the default features from the top-level manifest (manifest mode)", + "HelpTxtOptNoDownloads": "Does not download new sources", + "HelpTxtOptNoUsage": "Does not print CMake usage information after install", + "HelpTxtOptOnlyBinCache": "Fails if cached binaries are not available", + "HelpTxtOptOnlyDownloads": "Makes best-effort attempt to download sources without building", + "HelpTxtOptRecurse": "Allows removal of packages as part of installation", + "HelpTxtOptUseAria2": "Uses aria2 to perform download tasks", + "HelpTxtOptUseHeadVersion": "Installs the libraries on the command line using the latest upstream sources (classic mode)", + "HelpTxtOptWritePkgConfig": "Writes a NuGet packages.config-formatted file for use with external binary caching. See `vcpkg help binarycaching` for more information", + "_HelpTxtOptWritePkgConfig.comment": "'vcpkg help binarycaching' is a command line and should not be localized.", + "HelpUpdateBaseline": "The best approach to keep your libraries up to date is to update your baseline reference. This will ensure all packages, including transitive ones, are updated. However if you need to update a package independently, you can use a \"version>=\" constraint.", + "HelpUpdateCommand": "Lists packages that can be upgraded", + "HelpUpgradeCommand": "Rebuilds all outdated packages", + "HelpVersionCommand": "Displays version information", "HelpVersionDateScheme": "A date (2021-01-01.5)", "HelpVersionGreater": "Within the \"dependencies\" field, each dependency can have a minimum constraint listed. These minimum constraints will be used when transitively depending upon this library. A minimum port-version can additionally be specified with a '#' suffix.", "HelpVersionScheme": "A dot-separated sequence of numbers (1.2.3.4)", @@ -810,7 +989,7 @@ "IncorrectArchiveFileSignature": "Incorrect archive file signature", "IncorrectPESignature": "Incorrect PE signature", "IncrementedUtf8Decoder": "Incremented Utf8Decoder at the end of the string", - "InfoSetEnvVar": "You can also set the environment variable '{env_var}' to your editor of choice.", + "InfoSetEnvVar": "You can also set {env_var} to your editor of choice.", "_InfoSetEnvVar.comment": "In this context 'editor' means IDE An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", "InitRegistryFailedNoRepo": "Could not create a registry at {path} because this is not a git repository root.\nUse `git init {command_line}` to create a git repository in this folder.", "_InitRegistryFailedNoRepo.comment": "An example of {path} is /foo/bar. An example of {command_line} is vcpkg install zlib.", @@ -820,7 +999,7 @@ "_InstallFailed.comment": "An example of {path} is /foo/bar. An example of {error_msg} is File Not Found.", "InstallPackageInstruction": "With a project open, go to Tools->NuGet Package Manager->Package Manager Console and paste:\n Install-Package \"{value}\" -Source \"{path}\"", "_InstallPackageInstruction.comment": "'{value}' is the nuget id. An example of {path} is /foo/bar.", - "InstallRootDir": "(Experimental) Specify the install root directory.", + "InstallRootDir": "Installed directory (experimental)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} skipped, up to date", "_InstallSkippedUpToDateFile.comment": "An example of {path_source} is /foo/bar. An example of {path_destination} is /foo/bar.", "InstallWithSystemManager": "You may be able to install this tool via your system package manager.", @@ -838,18 +1017,22 @@ "_InstallingMavenFile.comment": "Printed after a filesystem operation error An example of {path} is /foo/bar.", "InstallingPackage": "Installing {action_index}/{count} {spec}...", "_InstallingPackage.comment": "An example of {action_index} is 340. An example of {count} is 42. An example of {spec} is zlib:x64-windows.", - "IntegrateBashHelp": "Enable bash tab-completion.", + "IntegrateBashHelp": "Enable bash tab-completion. Non-Windows only", "_IntegrateBashHelp.comment": "'bash' is a terminal program which should be unlocalized.", - "IntegrateFishHelp": "Enable fish tab-completion.", + "IntegrateFishHelp": "Enable fish tab-completion. Non-Windows only", "_IntegrateFishHelp.comment": "'fish' is a terminal program which should be unlocalized.", - "IntegrateInstallHelpLinux": "Make installed packages available user-wide.", - "IntegrateInstallHelpWindows": "Make installed packages available user-wide. Requires admin privileges on first use.", - "IntegratePowerShellHelp": "Enable PowerShell tab-completion.", - "IntegrateProjectHelp": "Generate a referencing NuGet package for individual VS project use.", - "IntegrateRemoveHelp": "Remove user-wide integration.", - "IntegrateZshHelp": "Enable zsh tab-completion.", + "IntegrateInstallHelpLinux": "Makes installed packages available user-wide", + "IntegrateInstallHelpWindows": "Makes installed packages available user-wide. Requires admin privileges on first use", + "IntegrateNonWindowsOnly": "{command_line} is non-Windows-only and not supported on this system.", + "_IntegrateNonWindowsOnly.comment": "An example of {command_line} is vcpkg install zlib.", + "IntegratePowerShellHelp": "Enable PowerShell tab-completion. Windows-only", + "IntegrateProjectHelp": "Generates a referencing NuGet package for individual Visual Studio project use. Windows-only", + "IntegrateRemoveHelp": "Removes user-wide integration", + "IntegrateWindowsOnly": "{command_line} is Windows-only and not supported on this system.", + "_IntegrateWindowsOnly.comment": "An example of {command_line} is vcpkg install zlib.", + "IntegrateZshHelp": "Enable zsh tab-completion. Non-Windows only", "_IntegrateZshHelp.comment": "'zsh' is a terminal program which should be unlocalized.", - "IntegrationFailed": "Integration was not applied.", + "IntegrationFailedVS2015": "Integration was not applied for Visual Studio 2015.", "InternalCICommand": "vcpkg ci is an internal command which will change incompatibly or be removed at any time.", "InternalErrorMessage": "internal error: ", "InternalErrorMessageContact": "Please open an issue at https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug with detailed steps to reproduce the problem.", @@ -899,7 +1082,6 @@ "InvalidCommitId": "Invalid commit id: {commit_sha}", "_InvalidCommitId.comment": "An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949.", "InvalidDefaultFeatureName": "'default' is a reserved feature name", - "InvalidDependency": "dependencies must be lowercase alphanumeric+hyphens, and not one of the reserved names", "InvalidFeature": "features must be lowercase alphanumeric+hyphens, and not one of the reserved names", "InvalidFileType": "failed: {path} cannot handle file type", "_InvalidFileType.comment": "An example of {path} is /foo/bar.", @@ -916,7 +1098,7 @@ "InvalidLinkage": "Invalid {system_name} linkage type: [{value}]", "_InvalidLinkage.comment": "'{value}' is the linkage type vcpkg would did not understand. (Correct values would be static ofr dynamic) An example of {system_name} is Darwin.", "InvalidLogicExpressionUnexpectedCharacter": "invalid logic expression, unexpected character", - "InvalidLogicExpressionUsePipe": "invalid logic expression, use '|' instead of 'or'", + "InvalidLogicExpressionUsePipe": "invalid logic expression, use '|' rather than 'or'", "InvalidNoVersions": "File contains no versions.", "InvalidOptionForRemove": "'remove' accepts either libraries or '--outdated'", "_InvalidOptionForRemove.comment": "'remove' is a command that should not be changed.", @@ -940,7 +1122,7 @@ "_JsonFieldNotString.comment": "An example of {json_field} is identifer.", "JsonFileMissingExtension": "the JSON file {path} must have a .json (all lowercase) extension", "_JsonFileMissingExtension.comment": "An example of {path} is /foo/bar.", - "JsonSwitch": "(Experimental) Request JSON output.", + "JsonSwitch": "Prints JSON rather than plain text", "JsonValueNotArray": "json value is not an array", "JsonValueNotObject": "json value is not an object", "JsonValueNotString": "json value is not a string", @@ -979,7 +1161,7 @@ "LinkageDynamicRelease": "Dynamic Release (/MD)", "LinkageStaticDebug": "Static Debug (/MTd)", "LinkageStaticRelease": "Static Release (/MT)", - "ListHelp": "The argument should be a substring to search for, or no argument to display all installed libraries.", + "ListHelp": "Lists installed libraries", "ListOfValidFieldsForControlFiles": "This is the list of valid fields for CONTROL files (case-sensitive):", "LoadingCommunityTriplet": "-- [COMMUNITY] Loading triplet configuration from: {path}", "_LoadingCommunityTriplet.comment": "'-- [COMMUNITY]' at the beginning must be preserved An example of {path} is /foo/bar.", @@ -1029,10 +1211,8 @@ "_MultiArch.comment": "An example of {option} is editable.", "MultipleFeatures": "{package_name} declares {feature} multiple times; please ensure that features have distinct names", "_MultipleFeatures.comment": "An example of {package_name} is zlib. An example of {feature} is avisynthplus.", - "MutuallyExclusiveOption": "--{value} can not be used with --{option}.", + "MutuallyExclusiveOption": "--{value} cannot be used with --{option}.", "_MutuallyExclusiveOption.comment": "{value} is a second {option} switch An example of {option} is editable.", - "NavigateToNPS": "Please navigate to {url} in your preferred browser.", - "_NavigateToNPS.comment": "An example of {url} is https://github.com/microsoft/vcpkg.", "NewConfigurationAlreadyExists": "Creating a manifest would overwrite a vcpkg-configuration.json at {path}.", "_NewConfigurationAlreadyExists.comment": "An example of {path} is /foo/bar.", "NewManifestAlreadyExists": "A manifest is already present at {path}.", @@ -1043,7 +1223,6 @@ "NewVersionCannotBeEmpty": "--version cannot be empty.", "NoArgumentsForOption": "The option --{option} does not accept an argument.", "_NoArgumentsForOption.comment": "An example of {option} is editable.", - "NoCachedPackages": "No packages are cached.", "NoError": "no error", "NoInstalledPackages": "No packages are installed. Did you mean `search`?", "_NoInstalledPackages.comment": "The name 'search' is the name of a command that is not localized.", @@ -1081,34 +1260,41 @@ "_OptionRequiresOption.comment": "{value} is a command line option. An example of {option} is editable.", "OptionUsedMultipleTimes": "the option '{option}' was specified multiple times", "_OptionUsedMultipleTimes.comment": "An example of {option} is editable.", - "OptionalCommand": "optional command", "Options": "Options", "_Options.comment": "Printed just before a list of options for a command", "OriginalBinParagraphHeader": "\nOriginal Binary Paragraph", + "OtherCommandsHeader": "Other", "OverlayPatchDir": "Overlay path \"{path}\" must exist and must be a directory.", "_OverlayPatchDir.comment": "An example of {path} is /foo/bar.", - "OverlayTriplets": "Overlay triplets from {path} :", + "OverlayPortsDirectoriesHelp": "Directories of overlay ports (also: {env_var})", + "_OverlayPortsDirectoriesHelp.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", + "OverlayTripletDirectoriesHelp": "Directories of overlay triplets (also: {env_var})", + "_OverlayTripletDirectoriesHelp.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", + "OverlayTriplets": "Overlay Triplets from \"{path}\":", "_OverlayTriplets.comment": "An example of {path} is /foo/bar.", "OverwritingFile": "File {path} was already present and will be overwritten", "_OverwritingFile.comment": "An example of {path} is /foo/bar.", "PECoffHeaderTooShort": "While parsing Portable Executable {path}, size of COFF header too small to contain a valid PE header.", - "_PECoffHeaderTooShort.comment": "Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format An example of {path} is /foo/bar.", - "PEConfigCrossesSectionBoundary": "While parsing Portable Executable {path}, image config directory crosses a secion boundary.", - "_PEConfigCrossesSectionBoundary.comment": "Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format An example of {path} is /foo/bar.", - "PEImportCrossesSectionBoundary": "While parsing Portable Executable {path}, import table crosses a secion boundary.", - "_PEImportCrossesSectionBoundary.comment": "Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format An example of {path} is /foo/bar.", + "_PECoffHeaderTooShort.comment": "Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format An example of {path} is /foo/bar.", + "PEConfigCrossesSectionBoundary": "While parsing Portable Executable {path}, image config directory crosses a section boundary.", + "_PEConfigCrossesSectionBoundary.comment": "Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format An example of {path} is /foo/bar.", + "PEImportCrossesSectionBoundary": "While parsing Portable Executable {path}, import table crosses a section boundary.", + "_PEImportCrossesSectionBoundary.comment": "Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format An example of {path} is /foo/bar.", "PEPlusTagInvalid": "While parsing Portable Executable {path}, optional header was neither PE32 nor PE32+.", - "_PEPlusTagInvalid.comment": "Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format An example of {path} is /foo/bar.", + "_PEPlusTagInvalid.comment": "Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format An example of {path} is /foo/bar.", "PERvaNotFound": "While parsing Portable Executable {path}, could not find RVA {value:#X}.", - "_PERvaNotFound.comment": "{value:#X} is the Relative Virtual Address sought. Portable executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format An example of {path} is /foo/bar.", + "_PERvaNotFound.comment": "{value:#X} is the Relative Virtual Address sought. Portable executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format An example of {path} is /foo/bar.", "PESignatureMismatch": "While parsing Portable Executable {path}, signature mismatch.", - "_PESignatureMismatch.comment": "Portable Executable is a term-of-art, see https://learn.microsoft.com/en-us/windows/win32/debug/pe-format An example of {path} is /foo/bar.", + "_PESignatureMismatch.comment": "Portable Executable is a term-of-art, see https://learn.microsoft.com/windows/win32/debug/pe-format An example of {path} is /foo/bar.", "PackageAlreadyRemoved": "unable to remove {spec}: already removed", "_PackageAlreadyRemoved.comment": "An example of {spec} is zlib:x64-windows.", + "PackageDiscoveryHeader": "Package Discovery", "PackageFailedtWhileExtracting": "'{value}' failed while extracting {path}.", "_PackageFailedtWhileExtracting.comment": "'{value}' is either a tool name or a package name. An example of {path} is /foo/bar.", - "PackageInfoHelp": "Display detailed information on packages.", - "PackageRootDir": "(Experimental) Specify the packages root directory.", + "PackageInfoHelp": "Display detailed information on packages", + "PackageInstallationHeader": "Package Installation", + "PackageManipulationHeader": "Package Manipulation", + "PackageRootDir": "Packages directory (experimental)", "PackagesToInstall": "The following packages will be built and installed:", "PackagesToInstallDirectly": "The following packages will be directly installed:", "PackagesToModify": "Additional packages (*) will be modified to complete this operation.", @@ -1131,11 +1317,13 @@ "ParseControlErrorInfoWhileLoading": "while loading {path}:", "_ParseControlErrorInfoWhileLoading.comment": "Error messages are is printed after this. An example of {path} is /foo/bar.", "ParseControlErrorInfoWrongTypeFields": "The following fields had the wrong types:", - "ParseIdentifierError": "\"{value}\" is not a valid identifier. Identifiers must be lowercase alphanumeric+hypens and not reserved (see {url} for more information)", + "ParseFeatureNameError": "\"{package_name}\" is not a valid feature name. Feature names must be lowercase alphanumeric+hypens and not reserved (see {url} for more information).", + "_ParseFeatureNameError.comment": "An example of {package_name} is zlib. An example of {url} is https://github.com/microsoft/vcpkg.", + "ParseIdentifierError": "\"{value}\" is not a valid identifier. Identifiers must be lowercase alphanumeric+hypens and not reserved (see {url} for more information).", "_ParseIdentifierError.comment": "{value} is a lowercase identifier like 'boost' An example of {url} is https://github.com/microsoft/vcpkg.", - "ParsePackageNameError": "\"{package_name}\" is not a valid package name. Package names must be lowercase alphanumeric+hypens and not reserved (see {url} for more information)", + "ParsePackageNameError": "\"{package_name}\" is not a valid package name. Package names must be lowercase alphanumeric+hypens and not reserved (see {url} for more information).", "_ParsePackageNameError.comment": "An example of {package_name} is zlib. An example of {url} is https://github.com/microsoft/vcpkg.", - "ParsePackagePatternError": "\"{package_name}\" is not a valid package pattern. Package patterns must use only one wildcard character (*) and it must be the last character in the pattern (see {url} for more information)", + "ParsePackagePatternError": "\"{package_name}\" is not a valid package pattern. Package patterns must use only one wildcard character (*) and it must be the last character in the pattern (see {url} for more information).", "_ParsePackagePatternError.comment": "An example of {package_name} is zlib. An example of {url} is https://github.com/microsoft/vcpkg.", "PathMustBeAbsolute": "Value of environment variable X_VCPKG_REGISTRIES_CACHE is not absolute: {path}", "_PathMustBeAbsolute.comment": "An example of {path} is /foo/bar.", @@ -1163,9 +1351,10 @@ "PortBugInspectFiles": "To inspect the {extension} files, use:", "_PortBugInspectFiles.comment": "An example of {extension} is .exe.", "PortBugInvalidCrtLinkage": "The following binaries should use the {expected} CRT.", - "_PortBugInvalidCrtLinkage.comment": "{expected} is one of LinkageDynamicDebug/LinkageDynamicRelease/LinkageStaticDebug/LinkageStaticRelease. Immediately after this message is a file by file list with what linkages they contain. 'CRT' is an acronym meaning C Runtime. See also: https://learn.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-170. This is complicated because a binary can link with more than one CRT.\nExample fully formatted message:\nThe following binaries should use the Dynamic Debug (/MDd) CRT.\n C:\\some\\path\\to\\sane\\lib links with: Dynamic Release (/MD)\n C:\\some\\path\\to\\lib links with:\n Static Debug (/MTd)\n Dynamic Release (/MD)\n C:\\some\\different\\path\\to\\a\\dll links with:\n Static Debug (/MTd)\n Dynamic Debug (/MDd)\n", + "_PortBugInvalidCrtLinkage.comment": "{expected} is one of LinkageDynamicDebug/LinkageDynamicRelease/LinkageStaticDebug/LinkageStaticRelease. Immediately after this message is a file by file list with what linkages they contain. 'CRT' is an acronym meaning C Runtime. See also: https://learn.microsoft.com/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-170. This is complicated because a binary can link with more than one CRT.\nExample fully formatted message:\nThe following binaries should use the Dynamic Debug (/MDd) CRT.\n C:\\some\\path\\to\\sane\\lib links with: Dynamic Release (/MD)\n C:\\some\\path\\to\\lib links with:\n Static Debug (/MTd)\n Dynamic Release (/MD)\n C:\\some\\different\\path\\to\\a\\dll links with:\n Static Debug (/MTd)\n Dynamic Debug (/MDd)\n", "PortBugInvalidCrtLinkageEntry": "{path} links with:", "_PortBugInvalidCrtLinkageEntry.comment": "See explanation in PortBugInvalidCrtLinkage An example of {path} is /foo/bar.", + "PortBugKernel32FromXbox": "The selected triplet targets Xbox, but the following DLLs link with kernel32. These DLLs cannot be loaded on Xbox, where kernel32 is not present. This is typically caused by linking with kernel32.lib rather than a suitable umbrella library, such as onecore_apiset.lib or xgameplatform.lib.", "PortBugMergeLibCMakeDir": "The /lib/cmake folder should be merged with /debug/lib/cmake and moved to /share/{package_name}/cmake. Please use the helper function `vcpkg_cmake_config_fixup()` from the port vcpkg-cmake-config.`", "_PortBugMergeLibCMakeDir.comment": "An example of {package_name} is zlib.", "PortBugMismatchedNumberOfBinaries": "Mismatching number of debug and release binaries.", @@ -1192,8 +1381,8 @@ "PortBugRemoveEmptyDirectories": "If a directory should be populated but is not, this might indicate an error in the portfile.\nIf the directories are not needed and their creation cannot be disabled, use something like this in the portfile to remove them:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE empty directories left by the above renames)", "_PortBugRemoveEmptyDirs.comment": "Only the 'empty directories left by the above renames' part should be translated", - "PortBugRestrictedHeaderPaths": "The following restricted headers can prevent the core C++ runtime and other packages from compiling correctly. In exceptional circumstances, this policy can be disabled via {env_var}.", - "_PortBugRestrictedHeaderPaths.comment": "A list of restricted headers is printed after this message, one per line. An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", + "PortBugRestrictedHeaderPaths": "The following restricted headers can prevent the core C++ runtime and other packages from compiling correctly. In exceptional circumstances, this policy can be disabled by setting CMake variable VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS in portfile.cmake.", + "_PortBugRestrictedHeaderPaths.comment": "A list of restricted headers is printed after this message, one per line. ", "PortBugSetDllsWithoutExports": "DLLs without any exports are likely a bug in the build script. If this is intended, add the following line in the portfile:\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS enabled)\nThe following DLLs have no exports:", "_PortBugSetDllsWithoutExports.comment": "'exports' means an entry in a DLL's export table. After this message, one file path per line is printed listing each DLL with an empty export table.", "PortDependencyConflict": "Port {package_name} has the following unsupported dependencies:", @@ -1214,7 +1403,7 @@ "PortsNoDiff": "There were no changes in the ports between the two commits.", "PortsRemoved": "The following {count} ports were removed:", "_PortsRemoved.comment": "An example of {count} is 42.", - "PortsUpdated": "\nThe following {count} ports were updated:", + "PortsUpdated": "The following {count} ports were updated:", "_PortsUpdated.comment": "An example of {count} is 42.", "PrebuiltPackages": "There are packages that have not been built. To build them run:", "PreviousIntegrationFileRemains": "Previous integration file was not removed.", @@ -1223,7 +1412,7 @@ "ProvideExportType": "At least one of the following options are required: --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "Pushing {vendor} to \"{path}\" failed. Use --debug for more information.", "_PushingVendorFailed.comment": "An example of {vendor} is Azure. An example of {path} is /foo/bar.", - "RegeneratesArtifactRegistry": "Regenerates an artifact registry.", + "RegeneratesArtifactRegistry": "Regenerates an artifact registry", "RegistryCreated": "Successfully created registry at {path}", "_RegistryCreated.comment": "An example of {path} is /foo/bar.", "RegistryValueWrongType": "The registry value {path} was an unexpected type.", @@ -1235,10 +1424,20 @@ "_RemovingPackage.comment": "An example of {action_index} is 340. An example of {count} is 42. An example of {spec} is zlib:x64-windows.", "ResponseFileCode": "@response_file", "_ResponseFileCode.comment": "Explains to the user that they can use response files on the command line, 'response_file' must have no spaces and be a legal file name.", - "RestoredPackage": "Restored package from \"{path}\"", - "_RestoredPackage.comment": "An example of {path} is /foo/bar.", - "RestoredPackagesFromVendor": "Restored {count} package(s) from {value} in {elapsed}. Use --debug to see more details.", - "_RestoredPackagesFromVendor.comment": "{value} may be either a 'vendor' like 'Azure' or 'NuGet', or a file path like C:\\example or /usr/example An example of {count} is 42. An example of {elapsed} is 3.532 min.", + "RestoredPackagesFromAWS": "Restored {count} package(s) from AWS in {elapsed}. Use --debug to see more details.", + "_RestoredPackagesFromAWS.comment": "An example of {count} is 42. An example of {elapsed} is 3.532 min.", + "RestoredPackagesFromCOS": "Restored {count} package(s) from COS in {elapsed}. Use --debug to see more details.", + "_RestoredPackagesFromCOS.comment": "An example of {count} is 42. An example of {elapsed} is 3.532 min.", + "RestoredPackagesFromFiles": "Restored {count} package(s) from {path} in {elapsed}. Use --debug to see more details.", + "_RestoredPackagesFromFiles.comment": "An example of {count} is 42. An example of {elapsed} is 3.532 min. An example of {path} is /foo/bar.", + "RestoredPackagesFromGCS": "Restored {count} package(s) from GCS in {elapsed}. Use --debug to see more details.", + "_RestoredPackagesFromGCS.comment": "An example of {count} is 42. An example of {elapsed} is 3.532 min.", + "RestoredPackagesFromGHA": "Restored {count} package(s) from GitHub Actions Cache in {elapsed}. Use --debug to see more details.", + "_RestoredPackagesFromGHA.comment": "An example of {count} is 42. An example of {elapsed} is 3.532 min.", + "RestoredPackagesFromHTTP": "Restored {count} package(s) from HTTP servers in {elapsed}. Use --debug to see more details.", + "_RestoredPackagesFromHTTP.comment": "An example of {count} is 42. An example of {elapsed} is 3.532 min.", + "RestoredPackagesFromNuGet": "Restored {count} package(s) from NuGet in {elapsed}. Use --debug to see more details.", + "_RestoredPackagesFromNuGet.comment": "An example of {count} is 42. An example of {elapsed} is 3.532 min.", "ResultsHeader": "RESULTS", "_ResultsHeader.comment": "Displayed before a list of installation results.", "ScriptAssetCacheRequiresScript": "expected arguments: asset config 'x-script' requires exactly the exec template as an argument", @@ -1259,18 +1458,14 @@ "_SourceFieldPortNameMismatch.comment": "{package_name} and \"{path}\" are both names of installable ports/packages. 'Source', 'CONTROL', 'vcpkg.json', and 'name' references are locale-invariant. An example of {package_name} is zlib. An example of {path} is /foo/bar.", "SpecifiedFeatureTurnedOff": "'{command_name}' feature specifically turned off, but --{option} was specified.", "_SpecifiedFeatureTurnedOff.comment": "An example of {command_name} is install. An example of {option} is editable.", - "SpecifyDirectoriesContaining": "Specifiy directories containing triplets files.\n(also: '{env_var}')", - "_SpecifyDirectoriesContaining.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", - "SpecifyDirectoriesWhenSearching": "Specify directories to be used when searching for ports.\n(also: '{env_var}')", - "_SpecifyDirectoriesWhenSearching.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", - "SpecifyHostArch": "Specify the host architecture triplet. See 'vcpkg help triplet'.\n(default: '{env_var}')", - "_SpecifyHostArch.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", - "SpecifyTargetArch": "Specify the target architecture triplet. See 'vcpkg help triplet'.\n(default: '{env_var}')", - "_SpecifyTargetArch.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", + "SpecifyHostArch": "Host triplet. See 'vcpkg help triplet' (default: {env_var})", + "_SpecifyHostArch.comment": "'vcpkg help triplet' is a command line that should not be localized An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", + "SpecifyTargetArch": "Target triplet. See 'vcpkg help triplet' (default: {env_var})", + "_SpecifyTargetArch.comment": "'vcpkg help triplet' is a command line that should not be localized An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", "StartCodeUnitInContinue": "found start code unit in continue position", "StoreOptionMissingSha": "--store option is invalid without a sha512", - "StoredBinariesToDestinations": "Stored binaries in {count} destinations.", - "_StoredBinariesToDestinations.comment": "An example of {count} is 42.", + "StoredBinariesToDestinations": "Stored binaries in {count} destinations in {elapsed}.", + "_StoredBinariesToDestinations.comment": "An example of {count} is 42. An example of {elapsed} is 3.532 min.", "StoredBinaryCache": "Stored binary cache: \"{path}\"", "_StoredBinaryCache.comment": "An example of {path} is /foo/bar.", "SuccessfulyExported": "Exported {package_name} to {path}", @@ -1285,6 +1480,8 @@ "_SupportedPort.comment": "An example of {package_name} is zlib.", "SwitchUsedMultipleTimes": "the switch '{option}' was specified multiple times", "_SwitchUsedMultipleTimes.comment": "An example of {option} is editable.", + "SynopsisHeader": "Synopsis:", + "_SynopsisHeader.comment": "Printed before a description of what a command does", "SystemApiErrorMessage": "calling {system_api} failed with {exit_code} ({error_msg})", "_SystemApiErrorMessage.comment": "An example of {system_api} is CreateProcessW. An example of {exit_code} is 127. An example of {error_msg} is File Not Found.", "SystemRootMustAlwaysBePresent": "Expected the SystemRoot environment variable to be always set on Windows.", @@ -1305,6 +1502,7 @@ "TrailingCommaInObj": "Trailing comma in an object", "TripletFileNotFound": "Triplet file {triplet}.cmake not found", "_TripletFileNotFound.comment": "An example of {triplet} is x64-windows.", + "TripletLabel": "Triplet:", "TwoFeatureFlagsSpecified": "Both '{value}' and -'{value}' were specified as feature flags.", "_TwoFeatureFlagsSpecified.comment": "'{value}' is a feature flag.", "UnableToClearPath": "unable to delete {path}", @@ -1413,7 +1611,8 @@ "_UpdateBaselineRemoteGitError.comment": "An example of {url} is https://github.com/microsoft/vcpkg.", "UpdateBaselineUpdatedBaseline": "updated registry '{url}': baseline '{old_value}' -> '{new_value}'", "_UpdateBaselineUpdatedBaseline.comment": "example of {old_value}, {new_value} is '5507daa796359fe8d45418e694328e878ac2b82f' An example of {url} is https://github.com/microsoft/vcpkg.", - "UpgradeInManifest": "The upgrade command does not currently support manifest mode. Instead, modify your vcpkg.json and run install.", + "UpgradeInManifest": "Upgrade upgrades a classic mode installation and thus does not support manifest mode. Consider updating your dependencies by updating your baseline to a current value with vcpkg x-update-baseline and running vcpkg install.", + "_UpgradeInManifest.comment": "'vcpkg x-update-baseline' and 'vcpkg install' are command lines and should not be localized.", "UpgradeRunWithNoDryRun": "If you are sure you want to rebuild the above packages, run this command with the --no-dry-run option.", "UploadedBinaries": "Uploaded binaries to {count} {vendor}.", "_UploadedBinaries.comment": "An example of {count} is 42. An example of {vendor} is Azure.", @@ -1450,9 +1649,11 @@ "VcpkgRegistriesCacheIsNotDirectory": "Value of environment variable X_VCPKG_REGISTRIES_CACHE is not a directory: {path}", "_VcpkgRegistriesCacheIsNotDirectory.comment": "An example of {path} is /foo/bar.", "VcpkgRootRequired": "Setting VCPKG_ROOT is required for standalone bootstrap.", - "VcpkgRootsDir": "Specify the vcpkg root directory.\n(default: '{env_var}')", + "VcpkgRootsDir": "The vcpkg root directory (default: {env_var})", "_VcpkgRootsDir.comment": "An example of {env_var} is VCPKG_DEFAULT_TRIPLET.", "VcpkgSendMetricsButDisabled": "passed --sendmetrics, but metrics are disabled.", + "VcpkgUsage": "usage: vcpkg [--switches] [--options=values] [arguments] @response_file", + "_VcpkgUsage.comment": "This is describing a command line, everything should be localized except 'vcpkg'; symbols like <>s, []s, or --s should be preserved. @response_file should be localized to be consistent with the message named 'ResponseFileCode'.", "VcvarsRunFailed": "failed to run vcvarsall.bat to get a Visual Studio environment", "VcvarsRunFailedExitCode": "while trying to get a Visual Studio environment, vcvarsall.bat returned {exit_code}", "_VcvarsRunFailedExitCode.comment": "An example of {exit_code} is 127.", @@ -1477,13 +1678,16 @@ "_VersionGitEntryMissing.comment": "A list of versions, 1 per line, are printed after this message. An example of {package_name} is zlib. An example of {version} is 1.3.8.", "VersionInDeclarationDoesNotMatch": "The version declared in file does not match checked-out version: {version}", "_VersionInDeclarationDoesNotMatch.comment": "An example of {version} is 1.3.8.", - "VersionIncomparable1": "version conflict on {spec}: {package_name} required {expected} but vcpkg could not compare it to {actual}.\nThe two versions used incomparable schemes:", - "_VersionIncomparable1.comment": "{expected} and {actual} are versions like 1.0 An example of {spec} is zlib:x64-windows. An example of {package_name} is zlib.", - "VersionIncomparable2": "\"{version}\" was of scheme {new_scheme}", - "_VersionIncomparable2.comment": "An example of {version} is 1.3.8. An example of {new_scheme} is version.", - "VersionIncomparable3": "This can be resolved by adding an explicit override to the preferred version, for example:", + "VersionIncomparable1": "version conflict on {spec}: {constraint_origin} required {expected}, which cannot be compared with the baseline version {actual}.", + "_VersionIncomparable1.comment": "{expected} and {actual} are versions like 1.0 An example of {spec} is zlib:x64-windows. An example of {constraint_origin} is zlib:x64-windows@1.0.0.", + "VersionIncomparable2": "{version_spec} has scheme {new_scheme}", + "_VersionIncomparable2.comment": "An example of {version_spec} is zlib:x64-windows@1.0.0. An example of {new_scheme} is version.", + "VersionIncomparable3": "This can be resolved by adding an explicit override to the preferred version. For example:", "_VersionIncomparable3.comment": "This precedes a JSON document describing the fix", - "VersionIncomparable4": "See `vcpkg help versioning` for more information.", + "VersionIncomparable4": "See `vcpkg help versioning` or {url} for more information.", + "_VersionIncomparable4.comment": "An example of {url} is https://github.com/microsoft/vcpkg.", + "VersionIncomparableSchemeString": "Both versions have scheme string but different primary text.", + "VersionIncomparableSchemes": "The versions have incomparable schemes:", "VersionInvalidDate": "`{version}` is not a valid date version. Dates must follow the format YYYY-MM-DD and disambiguators must be dot-separated positive integer values without leading zeroes.", "_VersionInvalidDate.comment": "An example of {version} is 1.3.8.", "VersionInvalidRelaxed": "`{version}` is not a valid relaxed version (semver with arbitrary numeric element count).", @@ -1492,13 +1696,11 @@ "_VersionInvalidSemver.comment": "An example of {version} is 1.3.8.", "VersionMissing": "expected a versioning field (one of version, version-date, version-semver, or version-string)", "_VersionMissing.comment": "The names version, version-date, version-semver, and version-string are code and must not be localized", - "VersionMissingRequiredFeature": "{spec}@{version} does not have required feature {feature}", - "_VersionMissingRequiredFeature.comment": "An example of {spec} is zlib:x64-windows. An example of {version} is 1.3.8. An example of {feature} is avisynthplus.", + "VersionMissingRequiredFeature": "{version_spec} does not have required feature {feature} needed by {constraint_origin}", + "_VersionMissingRequiredFeature.comment": "An example of {version_spec} is zlib:x64-windows@1.0.0. An example of {feature} is avisynthplus. An example of {constraint_origin} is zlib:x64-windows@1.0.0.", "VersionNotFound": "{expected} not available, only {actual} is available", "_VersionNotFound.comment": "{expected} and {actual} are versions", - "VersionNotFoundDuringDiscovery": "version was not found during discovery: {spec}@{version}\nThis is an internal vcpkg error. Please open an issue on https://github.com/Microsoft/vcpkg with detailed steps to reproduce the problem.", - "_VersionNotFoundDuringDiscovery.comment": "An example of {spec} is zlib:x64-windows. An example of {version} is 1.3.8.", - "VersionNotFoundInVersionsFile": "Version {version} was not found in versions file.\nRun:\nvcpkg x-add-version {package_name}\nto add the new port version.", + "VersionNotFoundInVersionsFile": "Version {version} was not found in versions file for {package_name}.\nRun:\nvcpkg x-add-version {package_name}\nto add the new port version.", "_VersionNotFoundInVersionsFile.comment": "An example of {version} is 1.3.8. An example of {package_name} is zlib.", "VersionRejectedDueToBaselineMissing": "{path} was rejected because it uses \"{json_field}\" and does not have a \"builtin-baseline\". This can be fixed by removing the uses of \"{json_field}\" or adding a \"builtin-baseline\".\nSee `vcpkg help versioning` for more information.", "_VersionRejectedDueToBaselineMissing.comment": "An example of {path} is /foo/bar. An example of {json_field} is identifer.", @@ -1515,8 +1717,8 @@ "VersionSpecMismatch": "Failed to load port because versions are inconsistent. The file \"{path}\" contains the version {actual_version}, but the version database indicates that it should be {expected_version}.", "_VersionSpecMismatch.comment": "An example of {path} is /foo/bar. An example of {expected_version} is 1.3.8. An example of {actual_version} is 1.3.8.", "VersionTableHeader": "Version", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", - "_VersionVerifiedOK.comment": "An example of {package_name} is zlib. An example of {version} is 1.3.8. An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949.", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", + "_VersionVerifiedOK.comment": "An example of {version_spec} is zlib:x64-windows@1.0.0. An example of {commit_sha} is 7cfad47ae9f68b183983090afd6337cd60fd4949.", "WaitingForChildrenToExit": "Waiting for child processes to exit...", "WaitingToTakeFilesystemLock": "waiting to take filesystem lock on {path}...", "_WaitingToTakeFilesystemLock.comment": "An example of {path} is /foo/bar.", @@ -1544,14 +1746,10 @@ "WindowsOnlyCommand": "This command only supports Windows.", "WroteNuGetPkgConfInfo": "Wrote NuGet package config information to {path}", "_WroteNuGetPkgConfInfo.comment": "An example of {path} is /foo/bar.", - "UnrecognizedCommand$": "Unrecognized command '${p0}'", - "_UnrecognizedCommand$.comment": "\n'${p0}' (aka 'commandline.inputs[0]') is a parameter of type 'string'\n", - "Use$ToGetHelp": "Use ${p0} to get help", - "_Use$ToGetHelp.comment": "\n'${p0}' is a parameter of type 'string'\n", - "FatalTheRootFolder$CanNotBeCreated": "Fatal: The root folder '${p0}' can not be created", - "_FatalTheRootFolder$CanNotBeCreated.comment": "\n'${p0}' (aka 'this.homeFolder.fsPath') is a parameter of type 'string'\n", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Fatal: The global configuration file '${p0}' can not be created", - "_FatalTheGlobalConfigurationFile$CanNotBeCreated.comment": "\n'${p0}' (aka 'this.globalConfig.fsPath') is a parameter of type 'string'\n", + "FatalTheRootFolder$CannotBeCreated": "Fatal: The root folder '${p0}' cannot be created", + "_FatalTheRootFolder$CannotBeCreated.comment": "\n'${p0}' (aka 'this.homeFolder.fsPath') is a parameter of type 'string'\n", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Fatal: The global configuration file '${p0}' cannot be created", + "_FatalTheGlobalConfigurationFile$CannotBeCreated.comment": "\n'${p0}' (aka 'this.globalConfig.fsPath') is a parameter of type 'string'\n", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND was not set", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "Running vcpkg internally returned a nonzero exit code: ${p0}", "_RunningVcpkgInternallyReturnedANonzeroExitCode$.comment": "\n'${p0}' is a parameter of type 'number'\n", @@ -1588,8 +1786,6 @@ "_optionsShouldBeASequenceFound$.comment": "\n'${p0}' is a parameter of type 'string'\n", "DuplicateKeysDetectedInManifest$": "Duplicate keys detected in manifest: '${p0}'", "_DuplicateKeysDetectedInManifest$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "in$Skipping$BecauseItIsA$": "in ${p0} skipping ${p1} because it is a ${p2}", - "_in$Skipping$BecauseItIsA$.comment": "\n'${p0}' (aka 'archiveUri.fsPath') is a parameter of type 'string'\n\n'${p1}' (aka 'header.name') is a parameter of type 'string'\n\n'${p2}' (aka 'header?.type || ''') is a parameter of type 'string'\n", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "no postscript file: rerun with the vcpkg shell function rather than executable", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Duplicate define ${p0} during activation. New value will replace old.", "_DuplicateDefine$DuringActivationNewValueWillReplaceOld.comment": "\n'${p0}' is a parameter of type 'string'\n", @@ -1633,7 +1829,6 @@ "verifying": "verifying", "downloading$$": "downloading ${p0} -> ${p1}", "_downloading$$.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'string'\n", - "unpacking": "unpacking", "unpacking$": "unpacking ${p0}", "_unpacking$.comment": "\n'${p0}' (aka 'archiveUri.fsPath') is a parameter of type 'string'\n", "Installing$": "Installing ${p0}...", @@ -1646,14 +1841,10 @@ "_Unpacking$.comment": "\n'${p0}' (aka 'archiveUri.fsPath') is a parameter of type 'string'\n", "ErrorInstalling$$": "Error installing ${p0} - ${p1}", "_ErrorInstalling$$.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'any'\n", - "ExpectedASingleValueFor$FoundMultiple": "Expected a single value for ${p0} - found multiple", - "_ExpectedASingleValueFor$FoundMultiple.comment": "\n'${p0}' is a parameter of type 'string'\n", - "Synopsis": "Synopsis", - "Description": "Description", - "Switches": "Switches", - "SeeAlso": "See Also", "error": "error:", "warning": "warning:", + "ExpectedASingleValueFor$FoundMultiple": "Expected a single value for ${p0} - found multiple", + "_ExpectedASingleValueFor$FoundMultiple.comment": "\n'${p0}' is a parameter of type 'string'\n", "ExpectedASingleValueFor$": "Expected a single value for '--${p0}'.", "_ExpectedASingleValueFor$.comment": "\n'${p0}' (aka 'this.switch') is a parameter of type 'string'\n", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Assuming '${p0}' is correct; supply a hash in the artifact metadata to suppress this message.", @@ -1736,25 +1927,15 @@ "_CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'string'\n\n'${p2}' is a parameter of type 'string'\n", "MatchedMoreThanOneInstallBlock$": "Matched more than one install block [${p0}]", "_MatchedMoreThanOneInstallBlock$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Acquires everything referenced by a project, without activating", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "This allows the consumer to pre-download tools required for a project.", "UnableToFindProjectInFolderorParentFoldersFor$": "Unable to find project in folder (or parent folders) for ${p0}", "_UnableToFindProjectInFolderorParentFoldersFor$.comment": "\n'${p0}' (aka 'session.currentDirectory.fsPath') is a parameter of type 'string'\n", "UnableToAcquireProject": "Unable to acquire project", - "AcquireArtifactsInTheRegistry": "Acquire artifacts in the registry", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "This allows the consumer to acquire (download and unpack) artifacts. Artifacts must be activated to be used", "NoArtifactsSpecified": "No artifacts specified", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Multiple packages specified, but not an equal number of ${p0} switches", - "_MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches.comment": "\n'${p0}' is a parameter of type 'string'\n", "NoArtifactsAreAcquired": "No artifacts are acquired", "AllArtifactsAreAlreadyInstalled": "All artifacts are already installed", "$ArtifactsInstalledSuccessfully": "${p0} artifacts installed successfully", "_$ArtifactsInstalledSuccessfully.comment": "\n'${p0}' is a parameter of type 'number'\n", "InstallationFailedStopping": "Installation failed -- stopping", - "ActivatesTheToolsRequiredForAProject": "Activates the tools required for a project", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "This allows the consumer to Activate the tools required for a project. If the tools are not already installed, this will force them to be downloaded and installed before activation.", - "AddsAnArtifactToTheProject": "Adds an artifact to the project", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "This allows the consumer to add an artifact to the project. This will activate the project as well.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Multiple artifacts specified, but not an equal number of ${p0} switches", "_MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches.comment": "\n'${p0}' is a parameter of type 'string'\n", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Tried to add an artifact [${p0}]:${p1} but could not determine the registry to use.", @@ -1762,49 +1943,17 @@ "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Tried to add registry ${p0} as ${p1}, but it was already ${p2}. Please add ${p3} to this project manually and reattempt.", "_TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt.comment": "\n'${p0}' is a parameter of type 'string | undefined'\n\n'${p1}' is a parameter of type 'string'\n\n'${p2}' is a parameter of type 'string'\n\n'${p3}' is a parameter of type 'string'\n", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Run \\`vcpkg activate\\` to apply to the current terminal", - "ManagesTheDownloadCache": "Manages the download cache", "DownloadsFolderCleared$": "Downloads folder cleared (${p0}) ", "_DownloadsFolderCleared$.comment": "\n'${p0}' (aka 'session.downloads.fsPath') is a parameter of type 'string'\n", - "cleansOutEverythingcacheInstalledArtifacts": "cleans out everything (cache, installed artifacts)", - "cleansOutTheDownloadsCache": "cleans out the downloads cache", - "removesAllTheArtifactsThatAreInstalled": "removes all the artifacts that are installed", - "cleansUp": "cleans up", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Allows the user to clean out the cache, installed artifacts, etc.", "InstalledArtifactFolderCleared$": "Installed Artifact folder cleared (${p0}) ", "_InstalledArtifactFolderCleared$.comment": "\n'${p0}' (aka 'session.installFolder.fsPath') is a parameter of type 'string'\n", "CacheFolderCleared$": "Cache folder cleared (${p0}) ", "_CacheFolderCleared$.comment": "\n'${p0}' (aka 'session.downloads.fsPath') is a parameter of type 'string'\n", - "DeactivatesTheCurrentSession": "Deactivates the current session", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "This allows the consumer to remove environment settings for the currently active session.", - "DeletesAnArtifactFromTheArtifactFolder": "Deletes an artifact from the artifact folder", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "This allows the consumer to remove an artifact from disk.", "DeletingArtifact$From$": "Deleting artifact ${p0} from ${p1}", "_DeletingArtifact$From$.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' (aka 'folder.fsPath') is a parameter of type 'string'\n", - "FindArtifactsInTheRegistry": "Find artifacts in the registry", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "This allows the user to find artifacts based on some criteria.", "NoArtifactsFoundMatchingCriteria$": "No artifacts found matching criteria: ${p0}", "_NoArtifactsFoundMatchingCriteria$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Generates MSBuild properties for an activation without downloading anything for a project", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props requires --msbuild-props", "UnableToActivateProject": "Unable to activate project", - "theNameOfTheCommandForWhichYouWantHelp": "the name of the command for which you want help", - "getHelpOn$OrOneOfTheCommands": "get help on ${p0} or one of the commands", - "_getHelpOn$OrOneOfTheCommands.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Gets detailed help on ${p0}, or one of the commands", - "_GetsDetailedHelpOn$OrOneOfTheCommands.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "Arguments": "Arguments:", - "Use$ToGetTheListOfAvailableCommands": "Use ${p0} to get the list of available commands", - "_Use$ToGetTheListOfAvailableCommands.comment": "\n'${p0}' is a parameter of type 'string'\n", - "Usage": "Usage", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "_$COMMANDargumentsswitches.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "Available$Commands": "Available ${p0} commands:", - "_Available$Commands.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "ListsTheArtifacts": "Lists the artifacts", - "ThisAllowsTheConsumerToListArtifacts": "This allows the consumer to list artifacts.", - "regenerateTheIndexForARegistry": "regenerate the index for a registry", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "This allows the user to regenerate the ${p0} files for a ${p1} registry.", - "_ThisAllowsTheUserToRegenerateThe$FilesForA$Registry.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"index.yaml\"\n'${p1}' is a parameter - it is expecting a value like: \"vcpkg\"", "RegeneratingIndexFor$": "Regenerating index for ${p0}", "_RegeneratingIndexFor$.comment": "\n'${p0}' is a parameter of type 'string'\n", "RegenerationCompleteIndexContains$MetadataFiles": "Regeneration complete. Index contains ${p0} metadata files", @@ -1813,37 +1962,21 @@ "_Registry$ContainsNoArtifacts.comment": "\n'${p0}' is a parameter of type 'string'\n", "error$": "error ${p0}: ", "_error$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "RemovesAnArtifactFromAProject": "Removes an artifact from a project", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "This allows the consumer to remove an artifact from the project. Forces reactivation in this window.", "Removing$FromProjectManifest": "Removing ${p0} from project manifest", "_Removing$FromProjectManifest.comment": "\n'${p0}' is a parameter of type 'string'\n", "unableToFindArtifact$InTheProjectManifest": "unable to find artifact ${p0} in the project manifest", "_unableToFindArtifact$InTheProjectManifest.comment": "\n'${p0}' is a parameter of type 'string'\n", - "updateTheRegistryFromTheRemote": "update the registry from the remote", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "This downloads the latest contents of the registry from the remote service.", - "DownloadingRegistryData": "Downloading registry data", - "Updated$RegistryContains$MetadataFiles": "Updated ${p0}. registry contains ${p1} metadata files", - "_Updated$RegistryContains$MetadataFiles.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'string'\n", - "UnableToDownloadRegistrySnapshot": "Unable to download registry snapshot", - "UnableToFindRegistry$": "Unable to find registry ${p0}", + "Updated$ItContains$MetadataFiles": "Updated ${p0}. It contains ${p1} metadata files.", + "_Updated$ItContains$MetadataFiles.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'string'\n", + "UnableToDownload$": "Unable to download ${p0}.", + "_UnableToDownload$.comment": "\n'${p0}' is a parameter of type 'string'\n", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} could not be updated; it could be malformed.", + "_$CouldNotBeUpdatedItCouldBeMalformed.comment": "\n'${p0}' is a parameter of type 'string'\n", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "The x-update-registry command downloads new registry information and thus cannot be used with local registries. Did you mean x-regenerate ${p0}?", + "_TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$.comment": "\n'${p0}' is a parameter of type 'string'\n", + "UnableToFindRegistry$": "Unable to find registry ${p0}.", "_UnableToFindRegistry$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "ArtifactRegistryDataIsNotLoaded": "Artifact registry data is not loaded", - "AttemptingToUpdateArtifactRegistry": "Attempting to update artifact registry", - "UnableToLoadRegistryIndex": "Unable to load registry index", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Instantly activates an artifact outside of the project", - "ThisWillInstantlyActivateAnArtifact": "This will instantly activate an artifact .", "NoArtifactsAreBeingAcquired": "No artifacts are being acquired", - "removesAllFilesInTheLocalCache": "removes all files in the local cache", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "enables debug mode, displays internal messsages about how ${p0} works", - "_enablesDebugModeDisplaysInternalMesssagesAboutHow$Works.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "proceeds with the (potentially dangerous) action without confirmation", - "showsTheinstalledArtifacts": "shows the _installed_ artifacts", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Dump environment variables and other properties to a json file with the path provided by the user.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Full path to the file in which MSBuild properties will be written.", - "ApplyAnyDeprecationFixups": "Apply any deprecation fixups.", - "overrideThePathToTheProjectFolder": "override the path to the project folder", "UnableToFindProjectEnvironment$": "Unable to find project environment ${p0}", - "_UnableToFindProjectEnvironment$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "enables verbose mode, displays verbose messsages about the process", - "aVersionOrVersionRangeToMatch": "a version or version range to match" + "_UnableToFindProjectEnvironment$.comment": "\n'${p0}' is a parameter of type 'string'\n" } diff --git a/locales/messages.ko.json b/locales/messages.ko.json index 23d2380aa5..ecbe9c2093 100644 --- a/locales/messages.ko.json +++ b/locales/messages.ko.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "기본 제공 레지스트리", "AConfigurationObject": "구성 개체", "ADateVersionString": "날짜 버전 문자열", + "ADefaultFeature": "기본 기능", "ADemandObject": "수요 대상", "ADependency": "종속성", + "ADependencyFeature": "종속성의 기능", "ADictionaryOfContacts": "연락처 사전", "AFeature": "기능", + "AFeatureName": "기능 이름", "AFilesystemRegistry": "파일 시스템 레지스트리", "AGitObjectSha": "Git 개체 SHA", "AGitReference": "Git 참조(예: 분기)", @@ -37,19 +40,19 @@ "AStringStringDictionary": "\"string\": \"string\" 사전", "AUrl": "URL", "AVcpkgRepositoryCommit": "vcpkg 리포지토리 커밋", - "AVersionConstraint": "버전 제약", + "AVersionConstraint": "버전 제약 조건", "AVersionDatabaseEntry": "버전 데이터베이스 항목", "AVersionObject": "버전 개체", "AVersionOfAnyType": "모든 유형의 버전", "AddArtifactOnlyOne": "'{command_line}'은(는) 한 번에 하나의 아티팩트만 추가할 수 있습니다.", "AddCommandFirstArg": "추가할 첫 번째 매개 변수는 'artifact' 또는 'port'여야 합니다.", "AddFirstArgument": "'{command_line}'에 대한 첫 번째 인수는 'artifact' 또는 'port'여야 합니다.", - "AddHelp": "현재 디렉터리에 연결된 매니페스트에 표시된 포트 또는 아티팩트 추가", "AddPortRequiresManifest": "'{command_line}'에는 활성 매니페스트 파일이 필요합니다.", "AddPortSucceeded": "vcpkg.json 파일에 포트 추가에 성공했습니다.", "AddRecurseOption": "제거하려는 경우 --recurse 옵션을 사용하여 명령을 실행합니다.", "AddTripletExpressionNotAllowed": "삼중항 표현은 여기에서 허용되지 않습니다. 대신 `{package_name}:{triplet}`을 `{package_name}`으로 변경할 수 있습니다.", "AddVersionAddedVersionToFile": "버전{version}을(를) {path}에 추가했습니다.", + "AddVersionArtifactsOnly": "--version은 아티팩트 전용이며 vcpkg add port와 함께 사용할 수 없습니다.", "AddVersionCommitChangesReminder": "변경 내용을 커밋하기로 하셨나요?", "AddVersionCommitResultReminder": "잊지 말고 결과를 커밋하세요.", "AddVersionDetectLocalChangesError": "git 상태 출력에서 예기치 않은 형식으로 인해 로컬 변경 탐지를 건너뜁니다.", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "{package_name}에 대해 체크 인된 파일이 변경되었지만 버전이 업데이트되지 않았습니다.", "AddVersionPortFilesShaUnchanged": "{package_name}에 대한 체크 인 파일이 버전 {version}에서 변경되지 않았습니다.", "AddVersionPortHasImproperFormat": "{package_name}의 형식이 잘못되었음", - "AddVersionSuggestNewVersionScheme": "\"{package_name}\" 포트에서 \"{old_scheme}\" 대신 버전 체계 \"{new_scheme}\"을 사용하세요.\n이 검사를 사용하지 않으려면 --{option}을 사용하세요.", + "AddVersionSuggestNewVersionScheme": "포트 \"{package_name}\"에서 \"{old_scheme}\" 대신 \"{new_scheme}\" 버전 체계를 사용합니다.\n--{option}을(를) 사용하여 이 검사를 사용하지 않도록 설정합니다.", "AddVersionUnableToParseVersionsFile": "버전 파일 {path}을(를) 구문 분석할 수 없음", "AddVersionUncommittedChanges": "{package_name}에 대해 커밋되지 않은 변경 내용이 있습니다.", "AddVersionUpdateVersionReminder": "버전이나 포트 버전을 업데이트 하셨나요?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec}이(가) 이미 설치되어 있습니다.", "AlreadyInstalledNotHead": "{spec}은(는) 이미 설치되어 있습니다 -- HEAD에서 빌드하지 않음", "AmbiguousConfigDeleteConfigFile": "매니페스트 및 구성 파일 모두에서 제공하는 모호한 vcpkg 구성입니다.\n-- 구성 파일 {path} 삭제", + "AnArrayOfDefaultFeatures": "기본 기능 배열", "AnArrayOfDependencies": "종속성 배열", "AnArrayOfDependencyOverrides": "종속성 재정의 배열", + "AnArrayOfFeatures": "기능 배열", "AnArrayOfIdentifers": "식별자 배열", "AnArrayOfOverlayPaths": "오버레이 경로의 배열", "AnArrayOfOverlayTripletsPaths": "오버레이 삼중 경로의 배열", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "시스템에서 다른 설치가 진행 중이며 다시 시도하기 전에 6초 동안 절전 모드로 전환됩니다.", "AppliedUserIntegration": "이 vcpkg 루트에 대한 사용자 차원의 통합을 적용했습니다.", "ApplocalProcessing": "vcpkg applocal 처리: {path}", + "ArtifactsBootstrapFailed": "vcpkg-artifacts가 설치되어 있지 않으며 부트스트랩할 수 없습니다.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts가 설치되어 있지 않으며, VCPKG_ROOT가 읽기 전용으로 간주되어 vcpkg-artifacts를 설치할 수 없습니다. 'one liner'를 사용하여 vcpkg를 다시 설치하여 이 문제를 해결할 수 있습니다.", + "ArtifactsNotOfficialWarning": "비공식적으로 vcpkg-artifacts 사용 ", "ArtifactsOptionIncompatibility": "--{option}은(는) 아티팩트 찾기에 영향을 주지 않습니다.", + "ArtifactsOptionJson": "환경 변수 및 기타 속성이 기록되는 JSON 파일의 전체 경로", + "ArtifactsOptionMSBuildProps": "MSBuild 속성이 기록될 파일의 전체 경로", + "ArtifactsOptionVersion": "일치시킬 버전 또는 버전 범위입니다. 아티팩트에 대해서만 유효합니다.", + "ArtifactsOptionVersionMismatch": "--version 스위치의 수는 명명된 아티팩트의 수와 일치해야 합니다.", + "ArtifactsSwitchARM": "아티팩트 획득 시 ARM에 호스트 감지 강제 적용", + "ArtifactsSwitchARM64": "아티팩트 획득 시 ARM64에 호스트 감지 강제 적용", + "ArtifactsSwitchAll": "알려진 모든 아티팩트 레지스트리 업데이트", + "ArtifactsSwitchAllLanguages": "아티팩트 획득 시 모든 언어 파일 획득", + "ArtifactsSwitchForce": "아티팩트가 이미 획득된 경우 다시 획득 강제 적용", + "ArtifactsSwitchFreebsd": "아티팩트 획득 시 FreeBSD에 호스트 감지 강제 적용", + "ArtifactsSwitchLinux": "아티팩트 획득 시 Linux에 호스트 감지 강제 적용", + "ArtifactsSwitchNormalize": "사용 중단 수정 적용", + "ArtifactsSwitchOnlyOneHostPlatform": "하나의 호스트 플랫폼(--x64, --x86, --arm, --arm64)만 설정할 수 있습니다.", + "ArtifactsSwitchOnlyOneOperatingSystem": "하나의 운영 체제(--windows, --osx, --linux, --freebsd)만 설정할 수 있습니다.", + "ArtifactsSwitchOnlyOneTargetPlatform": "하나의 대상 플랫폼(--target:x64, --target:x86, --target:arm, --target:arm64)만 설정할 수 있습니다.", + "ArtifactsSwitchOsx": "아티팩트 획득 시 MacOS에 호스트 감지 강제 적용", + "ArtifactsSwitchTargetARM": "아티팩트 획득 시 대상 감지를 ARM으로 설정", + "ArtifactsSwitchTargetARM64": "아티팩트 획득 시 대상 감지를 ARM64로 설정", + "ArtifactsSwitchTargetX64": "아티팩트 획득 시 대상 감지를 x64로 설정", + "ArtifactsSwitchTargetX86": "아티팩트 획득 시 대상을 x86으로 설정", + "ArtifactsSwitchWindows": "아티팩트 획득 시 Windows에 호스트 감지 강제 적용", + "ArtifactsSwitchX64": "아티팩트 획득 시 x64에 호스트 감지 강제 적용", + "ArtifactsSwitchX86": "아티팩트 획득 시 x86에 호스트 감지 강제 적용", "AssetCacheProviderAcceptsNoArguments": "예기치 않은 인수: '{value}'에는 인수가 허용되지 않음", - "AssetSourcesArg": "자산 캐싱을 위한 원본을 추가합니다. 'vcpkg 도움말 자산 캐싱'을 참조하세요.", + "AssetSourcesArg": "자산 캐싱 원본. 'vcpkg help assetcaching' 참조", "AttemptingToFetchPackagesFromVendor": "{vendor}에서 {count}개의 패키지를 가져오는 중", "AttemptingToSetBuiltInBaseline": "vcpkg-configuration.json.에서 기본 레지스트리를 재정의하는 동안 vcpkg.json에서 기본 제공 기준을 설정하려고 합니다.\nvcpkg-configuration.json의 기본 레지스트리가 사용됩니다.", "AuthenticationMayRequireManualAction": "하나 이상의 {vendor} 자격 증명 제공자가 직접 조치를 요청했습니다. 상호 작용을 허용하려면 이진 파일 원본 'interactive'를 추가하세요.", "AutoSettingEnvVar": "-- 자동으로 {env_var} 환경 변수를 \"{url}\"로 설정합니다.", "AutomaticLinkingForMSBuildProjects": "이제 모든 MSBuild C++ 프로젝트에 설치된 라이브러리를 #include할 수 있습니다. 연결은 자동으로 처리됩니다. 새 라이브러리를 설치하면 즉시 사용할 수 있습니다.", - "AvailableArchitectureTriplets": "사용 가능한 아키텍처 삼중 항목:", + "AutomaticLinkingForVS2017AndLater": "이제 Visual Studio 2017 이상에서 설치된 라이브러리를 #포함할 수 있습니다. 연결은 자동으로 처리됩니다. 새 라이브러리를 설치하면 즉시 사용할 수 있습니다.", "AvailableHelpTopics": "사용 가능한 도움말 항목:", "AzUrlAssetCacheRequiresBaseUrl": "예기치 않은 인수: 자산 구성 'azurl'에는 기본 URL이 필요", "AzUrlAssetCacheRequiresLessThanFour": "예기치 않은 인수: 자산 구성 'azurl'에는 4개 미만의 인수가 필요", "BaselineConflict": "매니페스트 파일에서 vcpkg-configuration.default-registry를 지정하면 기본 제공 기준과 충돌합니다.\n충돌하는 설정 중 하나를 제거하세요.", "BaselineFileNoDefaultField": "{commit_sha} 커밋의 기준 파일이 잘못되었습니다(\"기본값\" 필드 없음).", - "BaselineFileNoDefaultFieldPath": "{path}의 기준 파일이 잘못되었습니다(\"기본값\" 필드 없음).", "BaselineGitShowFailed": "'{commit_sha}' 커밋에서 기준을 체크 아웃하는 동안 `git show` versions/baseline.json에 실패했습니다. 이 문제는 'git fetch'로 커밋을 페치하여 해결할 수 있습니다.", "BaselineMissing": "기준 버전을 찾을 수 없습니다. 실행:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\n{version}을(를) 기본 버전으로 설정합니다.", - "BaselineMissingDefault": "리포지토리 {url}에 있는 커밋 '\"{commit_sha}\"의 baseline.json이 잘못되었습니다(\"default\" 필드가 포함되지 않음).", - "BinarySourcesArg": "이진 캐싱에 대한 원본을 추가합니다. 'vcpkg help binarycaching'을 참조하세요.", + "BinaryCacheVendorHTTP": "HTTP 서버", + "BinarySourcesArg": "이진 캐싱 소스. 'vcpkg help binarycaching' 참조", "BinaryWithInvalidArchitecture": "{path}\n 필요한 항목: {expected}, 실제 항목: {actual}", "BuildAlreadyInstalled": "{spec}이(가) 이미 설치되어 있습니다. 빌드를 시도하기 전에 {spec}을(를) 제거하세요.", "BuildDependenciesMissing": "빌드 명령어를 사용하려면 모든 종속 항목이 이미 설치되어 있어야 합니다.\n다음 종속 항목이 누락되었습니다.", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "성공", "BuildResultSummaryHeader": "{triplet}에 대한 요약", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(실험적) buildtrees 루트 디렉터리를 지정합니다.", + "BuildTreesRootDir": "Buildtrees 디렉터리(실험적)", "BuildTroubleshootingMessage1": "'git pull' 및 'vcpkg update'와 함께 최신 포트 파일을 사용하고 있는지 확인하세요.\n그런 후 다음에서 알려진 문제를 확인합니다.", "BuildTroubleshootingMessage2": "다음 위치에서 새 문제를 제출할 수 있습니다.", "BuildTroubleshootingMessage3": "버그 보고서 제목에 '[{package_name}] 빌드 오류'를 포함하고, 버그 설명에 다음 버전 정보를 포함하고, 위의 관련 오류 로그를 첨부합니다.", "BuildTroubleshootingMessage4": "문제를 보고할 때 {path}에서 미리 채워진 템플릿을 사용하세요.", - "BuildTroubleshootingMessageGH": "실행하여 문제를 합산할 수도 있습니다(GitHub cli를 설치해야 합니다).", + "BuildTroubleshootingMessageGH": "실행하여 문제를 제출할 수도 있습니다(GitHub CLI를 설치해야 합니다):", "BuildingFromHead": "HEAD에서 {spec} 빌드 중...", "BuildingPackage": "{spec} 구축 중...", "BuildingPackageFailed": "{build_result}(으)로 {spec}을(를) 빌드하지 못했습니다.", "BuildingPackageFailedDueToMissingDeps": "다음과 같은 누락된 종속성 때문에", - "BuiltInTriplets": "vcpkg 기본 제공 삼중 항목:", + "BuiltInTriplets": "vcpkg 기본 제공 Triplets:", "BuiltWithIncorrectArchitecture": "다음 파일은 잘못된 아키텍처로 빌드되었습니다.", "CISettingsExclude": "건너뛸 포트를 쉼표로 구분한 목록", "CISettingsOptCIBase": "ci.baseline.txt 파일의 경로입니다. 포트를 건너뛰고 회귀를 검색하는 데 사용됩니다.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "결정된 모든 패키지 해시를 출력할 파일", "CISettingsOptParentHashes": "변경된 패키지 집합을 줄이기 위해 부모 CI 상태에 대한 패키지 해시를 읽는 파일", "CISettingsOptSkippedCascadeCount": "--exclude의 수와 지원 건너 뛰기가 이 숫자와 정확하게 같도록 어설션합니다.", - "CISettingsOptXUnit": "결과를 XUnit 형식으로 출력할 파일(내부)", + "CISettingsOptXUnit": "XUnit 형식으로 결과를 출력하는 파일", "CISettingsVerifyGitTree": "각 Git 트리 개체가 선언된 버전과 일치하는지 확인합니다(매우 느림).", - "CISettingsVerifyVersion": "오류뿐만 아니라 각 포트에 대한 결과를 인쇄합니다.", - "CISwitchOptAllowUnexpectedPassing": "'통과, 실패 목록에서 제거' 결과를 내보내지 않아야 했음을 나타냅니다.", - "CISwitchOptDryRun": "실행하지 않고 계획 인쇄", - "CISwitchOptRandomize": "설치 순서 임의화", - "CISwitchOptSkipFailures": "ci.baseline.txt에서 `=fail`로 표시된 포트를 건너뛰어야 했음을 나타냅니다.", - "CISwitchOptXUnitAll": "변경되지 않은 포트도 XUnit 출력(내부)에 보고", + "CISettingsVerifyVersion": "오류만 아니라 각 포트의 결과를 인쇄합니다.", + "CISkipInstallation": "다음 패키지는 이미 설치되어 있으며 다시 빌드되지 않습니다.", + "CISwitchOptAllowUnexpectedPassing": "'통과, 실패 목록에서 제거' 결과를 표시하지 않습니다.", + "CISwitchOptDryRun": "실행하지 않고 계획 출력", + "CISwitchOptRandomize": "설치 순서를 임의로 지정합니다.", + "CISwitchOptSkipFailures": "ci.baseline.txt에서 '=fail'로 표시된 포트를 건너뜁니다.", + "CISwitchOptXUnitAll": "XUnit 출력에서 변경되지 않은 포트를 보고합니다.", "CMakeTargetsUsage": "{package_name}은 CMake 대상을 제공합니다.", "CMakeTargetsUsageHeuristicMessage": "# 이 값은 추론적으로 생성되며 올바르지 않을 수 있습니다.", "CMakeToolChainFile": "CMake 프로젝트는 \"-DCMAKE_TOOLCHAIN_FILE={path}\"를 사용해야 합니다.", "CMakeUsingExportedLibs": "CMake 프로젝트에서 내보낸 라이브러리를 사용하려면 CMake 명령줄에 {value}을(를) 추가하세요.", - "CacheHelp": "인수는 검색할 substring이거나 모든 캐시된 라이브러리를 표시할 인수가 없어야 합니다.", "CheckedOutGitSha": "Git SHA: {commit_sha} 체크 아웃됨", "CheckedOutObjectMissingManifest": "체크 아웃된 개체에 CONTROL 파일 또는 vcpkg.json 파일이 없습니다.", "ChecksFailedCheck": "vcpkg가 충돌했습니다. 추가 정보가 없습니다.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "bootstrap-vcpkg를 다시 실행하여 vcpkg를 업데이트하면 이 오류가 해결될 수 있습니다.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing은 --ci-baseline을 통해 기준선을 제공하는 경우에만 사용할 수 있습니다.", "CiBaselineDisallowedCascade": "회귀: {spec} 단계식이지만 통과해야 합니다. ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "회귀: {build_result}(으)로 독립 {spec}이(가) 실패했습니다.", "CiBaselineRegression": "회귀: {spec}이(가) {build_result}(으)로 실패했습니다. 필요한 경우 {spec}=fail를 {path}에 추가합니다.", "CiBaselineRegressionHeader": "회귀:", + "CiBaselineUnexpectedFail": "회귀: {spec}이(가) 실패로 표시되었지만 {triplet}에는 지원되지 않습니다.", + "CiBaselineUnexpectedFailCascade": "회귀: {spec}이(가) 실패로 표시되었지만 {triplet}에 대해 하나의 종속성이 지원되지 않습니다.", "CiBaselineUnexpectedPass": "통과, FAIL LIST에서 제거: {spec}({path}).", "ClearingContents": "{path} 내용을 지우는 중", "CmakeTargetsExcluded": "참고: {count}개의 추가 대상이 표시되지 않습니다.", + "CmdAcquireExample1": "vcpkg acquire <아티팩트>", + "CmdAcquireProjectSynopsis": "매니페스트에서 참조하는 모든 아티팩트 가져오기", + "CmdAcquireSynopsis": "명명된 아티팩트 획득", + "CmdActivateSynopsis": "매니페스트에서 아티팩트 활성화", + "CmdAddExample1": "vcpkg add port <포트 이름>", + "CmdAddExample2": "vcpkg add artifact <아티팩트 이름>", + "CmdAddSynopsis": "매니페스트에 종속성 추가", + "CmdAddVersionExample1": "vcpkg x-add-version <포트 이름>", "CmdAddVersionOptAll": "모든 포트의 버전을 처리합니다.", "CmdAddVersionOptOverwriteVersion": "기존 버전의 'git-tree'를 덮어씁니다.", - "CmdAddVersionOptSkipFormatChk": "vcpkg.json 파일의 서식 확인을 건너뜁니다.", + "CmdAddVersionOptSkipFormatChk": "vcpkg.json 파일의 서식 검사를 건너뜁니다.", "CmdAddVersionOptSkipVersionFormatChk": "버전 형식 검사를 건너뜁니다.", - "CmdAddVersionOptVerbose": "오류뿐만 아니라 성공 메시지를 인쇄합니다.", + "CmdAddVersionOptVerbose": "오류만이 아니라 성공 메시지를 인쇄합니다.", + "CmdAddVersionSynopsis": "버전 데이터베이스에 버전 추가", + "CmdBootstrapStandaloneSynopsis": "vcpkg 이진 파일에서만 vcpkg 루트를 부트스트랩합니다.", + "CmdBuildExample1": "vcpkg build <포트 사양>", + "CmdBuildExternalExample1": "vcpkg build-external <포트 이름> <원본 경로>", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "경로에서 포트를 빌드합니다.", + "CmdBuildSynopsis": "포트 빌드", + "CmdCacheExample1": "vcpkg cache <검색 하위문자열>", + "CmdCacheSynopsis": "패키지 사양 나열", + "CmdCheckSupportExample1": "vcpkg x-check-support <포트 이름>", + "CmdCheckSupportSynopsis": "포트를 빌드하지 않고도 지원되는지 테스트", + "CmdCiCleanSynopsis": "CI 실행을 준비하기 위해 모든 파일 지우기", + "CmdCiSynopsis": "CI 테스트를 위해 모든 포트 빌드 시도", + "CmdCiVerifyVersionsSynopsis": "버전 데이터베이스의 무결성 확인", "CmdContactOptSurvey": "현재 vcpkg 설문 조사에 대한 기본 브라우저 시작", - "CmdDependInfoOptDGML": "dgml을 기반으로 그래프 만들기", - "CmdDependInfoOptDepth": "출력에 재귀 깊이 표시", - "CmdDependInfoOptDot": "점 기반 그래프 만들기", - "CmdDependInfoOptMaxRecurse": "최대 재귀 깊이를 설정합니다. 값이 -1이면 제한이 없음을 나타냅니다.", - "CmdDependInfoOptSort": "종속성 목록에 대한 정렬 순서를 설정합니다. 허용되는 값은 사전식, 토폴로지(기본값), x-트리, 역순입니다.", - "CmdEditOptAll": "포트별 빌드 트리 하위 폴더 및 포트로 편집기 열기", + "CmdCreateExample1": "vcpkg create <포트 이름> ", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create <포트 이름> <다운로드된 파일이름>", + "CmdDeactivateSynopsis": "현재 셸에서 모든 아티팩트 활성화 제거", + "CmdDependInfoExample1": "vcpkg depend-info <포트 이름>", + "CmdDependInfoFormatConflict": "충돌하는 형식이 지정되었습니다. --format, --dgml 또는 --dot 중 하나만 허용됩니다.", + "CmdDependInfoFormatHelp": "출력 형식, `list', `tree`, `mermaid`, `dot` 또는 `dgml` 중 하나 선택", + "CmdDependInfoFormatInvalid": "--format={value}은(는) 인식할 수 있는 형식이 아닙니다. --format은 `list`, `tree`, `mermaid`, `dot` 또는 `dgml` 중 하나여야 합니다.", + "CmdDependInfoOptDepth": "`list` 출력에 재귀 깊이를 표시합니다.", + "CmdDependInfoOptMaxRecurse": "최대 재귀 깊이를 설정합니다. 기본값은 제한이 없습니다.", + "CmdDependInfoOptSort": "`list` 형식, `lexicographical`, `topological`(기본값), `reverse` 중 하나에 대한 정렬 순서를 선택합니다.", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth는 `list` 및 `tree` 형식에서만 사용할 수 있습니다.", + "CmdDependInfoXtreeTree": "--sort=x-tree는 트리 이외의 형식과 함께 사용할 수 없습니다.", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download <파일경로> --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "파일 다운로드", + "CmdEditExample1": "vcpkg edit <포트 이름>", + "CmdEditOptAll": "포트별 빌드 트리 하위 폴더뿐만 아니라 포트로 편집기를 엽니다.", "CmdEditOptBuildTrees": "포트별 빌드 트리 하위 폴더로 편집기 열기", - "CmdEnvOptions": "설치된 {path}을(를) {env_var}에 추가", - "CmdExportOpt7Zip": "7zip(.7z) 파일로 내보내기", - "CmdExportOptChocolatey": "Chocolatey 패키지 내보내기(실험적 기능)", + "CmdEnvOptions": "설치된 {path}을(를) {env_var}에 추가합니다.", + "CmdExportEmptyPlan": "제로 패키지 내보내기 생성을 거부합니다. 내보내기 전에 패키지를 설치하세요.", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", + "CmdExportOpt7Zip": "7zip(.7z) 파일로 내보냅니다.", + "CmdExportOptChocolatey": "Chocolatey 패키지를 내보냅니다(실험적).", "CmdExportOptDebug": "프리팹 디버그 사용", "CmdExportOptDryRun": "실제로 내보내지 않습니다.", - "CmdExportOptIFW": "IFW 기반 설치 관리자로 내보내기", - "CmdExportOptInstalled": "설치된 모든 패키지 내보내기", - "CmdExportOptMaven": "Maven 사용", - "CmdExportOptNuget": "NuGet 패키지 내보내기", - "CmdExportOptPrefab": "Prefab 형식으로 내보내기", - "CmdExportOptRaw": "압축되지 않은 디렉터리로 내보내기", - "CmdExportOptZip": "Zip 파일로 내보내기", - "CmdExportSettingChocolateyMaint": "내보낸 Chocolatey 패키지의 관리자 지정(실험적 기능)", - "CmdExportSettingChocolateyVersion": "내보낸 Chocolatey 패키지에 추가할 버전 접미사 지정(실험적 기능)", - "CmdExportSettingConfigFile": "설치 관리자 구성의 임시 파일 경로 지정", - "CmdExportSettingInstallerPath": "내보낸 설치 관리자의 파일 경로 지정", - "CmdExportSettingNugetDesc": "내보낸 NuGet 패키지에 대한 설명 지정", - "CmdExportSettingNugetID": "내보낸 NuGet 패키지의 ID 지정(재정의 --output)", - "CmdExportSettingNugetVersion": "내보낸 NuGet 패키지의 버전 지정", - "CmdExportSettingOutput": "출력 이름 지정(파일 이름을 구성하는 데 사용)", - "CmdExportSettingOutputDir": "생성한 아티팩트에 대한 출력 디렉터리 지정", - "CmdExportSettingPkgDir": "다시 압축한 패키지의 임시 디렉터리 경로 지정", + "CmdExportOptIFW": "IFW 기반 설치 관리자로 내보냅니다.", + "CmdExportOptInstalled": "설치된 모든 패키지를 내보냅니다.", + "CmdExportOptMaven": "Maven 사용 설정", + "CmdExportOptNuget": "NuGet 패키지를 내보냅니다.", + "CmdExportOptPrefab": "Prefab 형식으로 내보냅니다.", + "CmdExportOptRaw": "압축되지 않은 디렉터리로 내보냅니다.", + "CmdExportOptZip": "Zip 파일로 내보냅니다.", + "CmdExportSettingChocolateyMaint": "내보낸 Chocolatey 패키지의 관리자(실험적)", + "CmdExportSettingChocolateyVersion": "내보낸 Chocolatey 패키지에 추가할 버전 접미사(실험적)", + "CmdExportSettingConfigFile": "설치 관리자 구성의 임시 파일 경로", + "CmdExportSettingInstallerPath": "내보낸 설치 관리자의 파일 경로", + "CmdExportSettingNugetDesc": "내보낸 NuGet 패키지에 대한 설명", + "CmdExportSettingNugetID": "내보낸 NuGet 패키지의 ID(재정의 --output)", + "CmdExportSettingNugetVersion": "내보낸 NuGet 패키지의 버전", + "CmdExportSettingOutput": "출력 이름(파일 이름을 구성하는 데 사용)", + "CmdExportSettingOutputDir": "생성된 아티팩트용 출력 디렉터리", + "CmdExportSettingPkgDir": "다시 압축한 패키지의 임시 디렉터리 경로", "CmdExportSettingPrefabArtifactID": "아티팩트 ID는 Maven 사양에 따른 프로젝트의 이름임", "CmdExportSettingPrefabGroupID": "GroupId는 Maven 사양에 따라 프로젝트를 고유하게 식별", "CmdExportSettingPrefabVersion": "버전은 Maven 사양에 따른 프로젝트의 이름임", - "CmdExportSettingRepoDir": "내보낸 리포지토리의 디렉터리 경로 지정", - "CmdExportSettingRepoURL": "온라인 설치 관리자의 원격 리포지토리 URL 지정", + "CmdExportSettingRepoDir": "내보낸 리포지토리의 디렉터리 경로", + "CmdExportSettingRepoURL": "온라인 설치 관리자의 원격 리포지토리 URL", "CmdExportSettingSDKMinVersion": "Android 최소 지원 SDK 버전", "CmdExportSettingSDKTargetVersion": "Android 대상 SDK 버전", - "CmdFetchOptXStderrStatus": "상태/다운로드 메시지를 stdout이 아닌 stderr로 보냅니다. (오류/실패는 여전히 stdout으로 이동)", + "CmdExportSynopsis": "설치된 포트의 독립 실행형 배포를 만듭니다.", + "CmdFetchOptXStderrStatus": "상태/다운로드 메시지를 stdout이 아닌 stderr로 보냅니다(오류/실패는 여전히 stdout으로 이동).", + "CmdFetchSynopsis": "시스템 또는 인터넷에서 항목을 가져옵니다.", + "CmdFindExample1": "vcpkg find port <포트 이름>", + "CmdFindExample2": "vcpkg find artifact <아티팩트 이름>", + "CmdFindSynopsis": "설치 또는 활성화될 수 있는 포트 또는 아티팩트 찾습니다.", + "CmdFormatManifestExample1": "vcpkg format-manifest ", "CmdFormatManifestOptAll": "모든 포트의 매니페스트 파일에 서식을 지정합니다.", "CmdFormatManifestOptConvertControl": "CONTROL 파일을 매니페스트 파일로 변환합니다.", - "CmdGenerateMessageMapOptNoOutputComments": "메시지 맵을 생성할 때 주석 제외(영어 지역화 파일을 생성하는 데 유용)", - "CmdInfoOptInstalled": "(실험적) 사용 가능한 패키지 대신 설치된 패키지에 대한 보고", - "CmdInfoOptTransitive": "(실험적) 설치된 패키지의 종속성도 보고", + "CmdFormatManifestSynopsis": "vcpkg.json 정리", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props <경로>", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "msbuild .props 파일을 가져오지 않고 매니페스트의 아티팩트 종속성을 활성화하는 것처럼 생성", + "CmdGenerateMessageMapOptNoOutputComments": "메시지 맵을 생성할 때 주석을 제외합니다(영어 지역화 파일을 생성하는 데 유용).", + "CmdHashExample1": "vcpkg hash <경로>", + "CmdHashExample2": "vcpkg hash <경로> SHA256", + "CmdHashSynopsis": "파일의 SHA256 또는 SHA512 가져오기", + "CmdHelpCommandSynopsis": "Displays help detail for <명령>", + "CmdHelpCommands": "help <명령>", + "CmdHelpCommandsSynopsis": "여기에 나열되지 않은 드문 명령을 포함하여 명령의 전체 목록 표시", + "CmdHelpTopic": "help <토픽>", + "CmdInfoOptInstalled": "(실험적) 사용 가능한 패키지가 아닌 설치된 패키지를 보고합니다.", + "CmdInfoOptTransitive": "(실험적) 설치된 패키지의 종속성도 보고합니다.", + "CmdInitRegistryExample1": "vcpkg x-init-registry <경로>", + "CmdInitRegistrySynopsis": "빈 Git 레지스트리 만들기", + "CmdInstallExample1": "vcpkg install <포트 이름> <포트 이름>...", + "CmdIntegrateSynopsis": "vcpkg를 컴퓨터, 프로젝트 또는 셸과 통합합니다.", + "CmdListExample2": "vcpkg list <필터>", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", "CmdNewOptApplication": "애플리케이션 매니페스트를 만듭니다(이름 또는 버전이 필요하지 않음).", - "CmdNewOptSingleFile": "vcpkg-configuration.json을 vcpkg.json에 포함합니다.", + "CmdNewOptSingleFile": "vcpkg-configuration.json을 vcpkg.json에 포함", "CmdNewOptVersionDate": "--version을 ISO 8601 날짜로 해석합니다. (YYYY-MM-DD)", - "CmdNewOptVersionRelaxed": "--version을 낮은 숫자 버전으로 해석합니다(음수가 아닌 점으로 구분된 수).", - "CmdNewOptVersionString": "--version을 순서 동작이 없는 문자열로 해석합니다.", - "CmdNewSettingName": "새 매니페스트의 이름입니다.", - "CmdNewSettingVersion": "새 매니페스트의 버전입니다.", + "CmdNewOptVersionRelaxed": "--version을 완화 숫자 버전(점으로 구분된 음수가 아닌 수)으로 해석합니다.", + "CmdNewOptVersionString": "--version을 순서 지정 동작이 없는 문자열로 해석합니다.", + "CmdNewSettingName": "새 매니페스트의 이름", + "CmdNewSettingVersion": "새 매니페스트의 버전", + "CmdNewSynposis": "새 매니페스트를 만듭니다.", + "CmdOwnsExample1": "vcpkg owns <패턴>", + "CmdPackageInfoExample1": "vcpkg x-package-info <패키지 이름>...", + "CmdPortsdiffExample1": "vcpkg portsdiff <분기 이름>", + "CmdPortsdiffExample2": "vcpkg portsdiff <원본> <대상>", + "CmdPortsdiffSynopsis": "커밋 간 포트 버전의 변경 내용 차이", "CmdRegenerateOptDryRun": "실제로 작업을 수행하지 않고, 수행할 작업을 표시만 합니다.", - "CmdRegenerateOptForce": "확인 없이 (잠재적으로 위험한) 작업 진행", - "CmdRegenerateOptNormalize": "사용 중단 수정 적용", - "CmdRemoveOptDryRun": "제거할 패키지를 인쇄하고 제거하지는 않습니다.", - "CmdRemoveOptOutdated": "portfile과 일치하지 않는 버전이 있는 모든 패키지 선택", - "CmdRemoveOptRecurse": "명령줄에 명시적으로 지정되지 않은 패키지 제거 허용", - "CmdSetInstalledOptDryRun": "실제로 빌드 또는 설치 안 함", + "CmdRegenerateOptForce": "확인 없이 (잠재적으로 위험한) 작업을 진행합니다.", + "CmdRegenerateOptNormalize": "사용 중단 수정을 적용합니다.", + "CmdRemoveExample1": "vcpkg remove <패키지 이름>...", + "CmdRemoveOptDryRun": "제거할 패키지를 인쇄하지만 제거하지는 않습니다.", + "CmdRemoveOptOutdated": "기본 제공 레지스트리와 일치하지 않는 버전이 있는 모든 패키지를 제거합니다.", + "CmdRemoveOptRecurse": "명시적으로 지정되지 않은 종속 패키지를 제거할 수 있습니다.", + "CmdSearchExample1": "vcpkg search <패턴>", + "CmdSetInstalledExample1": "vcpkg x-set-installed <패키지 이름> <패키지 이름>...", + "CmdSetInstalledOptDryRun": "실제로 빌드하거나 설치하지 않습니다.", "CmdSetInstalledOptNoUsage": "설치 후 CMake 사용 정보를 인쇄하지 않습니다.", - "CmdSetInstalledOptWritePkgConfig": "외부 이진 캐싱에 사용할 NuGet packages.config 형식 파일을 작성합니다.\n자세한 내용은 `vcpkg help binarycaching`을 참조하세요.", + "CmdSetInstalledOptWritePkgConfig": "외부 이진 캐싱에 사용할 NuGet packages.config 형식 파일을 작성합니다. 자세한 내용은 `vcpkg help binarycaching` 참조", + "CmdSetInstalledSynopsis": "설치된 패키지가 제공된 것과 정확하게 일치하게 패키지를 설치, 업그레이드 또는 제거합니다.", "CmdSettingCopiedFilesLog": "만들 복사된 파일 로그의 경로", "CmdSettingInstalledDir": "사용할 설치된 트리의 경로", "CmdSettingTLogFile": "만들 tlog 파일의 경로", "CmdSettingTargetBin": "분석할 이진 파일의 경로", - "CmdUpdateBaselineOptDryRun": "실행하지 않고 계획 인쇄", + "CmdUpdateBaselineOptDryRun": "실행하지 않고 계획 출력", "CmdUpdateBaselineOptInitial": "이미 없는 vcpkg.json에 'builtin-baseline' 추가", - "CmdUpgradeOptAllowUnsupported": "지원되지 않는 포트에서 오류가 발생하는 대신 경고가 계속 표시됩니다.", + "CmdUpdateBaselineSynopsis": "매니페스트의 git 레지스트리 기준을 해당 레지스트리의 HEAD 커밋으로 업데이트합니다.", + "CmdUpdateRegistryAll": "알려진 모든 아티팩트 레지스트리 업데이트", + "CmdUpdateRegistryAllExcludesTargets": "레지스트리 업데이트 --all은 아티팩트 레지스트리 목록과 함께 사용할 수 없습니다.", + "CmdUpdateRegistryAllOrTargets": "레지스트리를 업데이트하려면 아티팩트 레지스트리 이름 또는 업데이트할 URI 목록 또는 --all이 필요합니다.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry <아티팩트 레지스트리 이름>", + "CmdUpdateRegistrySynopsis": "아티팩트 레지스트리를 다시 다운로드합니다.", "CmdUpgradeOptNoDryRun": "실제로 업그레이드", "CmdUpgradeOptNoKeepGoing": "실패 시 패키지 설치 중지", + "CmdUseExample1": "vcpkg use <아티팩트 이름>", + "CmdUseSynopsis": "이 셸에서 단일 아티팩트 활성화", + "CmdVSInstancesSynopsis": "검색된 Visual Studio 인스턴스 나열", "CmdXDownloadOptHeader": "URL에서 가져올 때 사용할 추가 헤더", "CmdXDownloadOptSha": "다운로드할 파일의 해시", - "CmdXDownloadOptSkipSha": "다운로드한 파일의 SHA512를 확인 안 함", - "CmdXDownloadOptStore": "파일을 가져오는 대신 저장해야 함을 나타냄", + "CmdXDownloadOptSkipSha": "다운로드한 파일의 SHA512 검사를 건너뜁니다.", + "CmdXDownloadOptStore": "파일을 페치하는 것보다 부가해야 하는 파일을 저장합니다.", "CmdXDownloadOptUrl": "캐시에서 누락된 경우 다운로드 및 저장할 URL", + "CmdZApplocalSynopsis": "설치된 트리에서 앱-로컬 배포를 위한 이진의 위치로 이진 파일의 종속성을 복사합니다.", + "CmdZExtractExample1": "vcpkg z-extract <보관 경로> <출력 디렉터리>", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "모든 경로에서 제거할 선행 디렉터리 수", + "CommandEnvExample2": "vcpkg env \"ninja -C <경로>\" --triplet x64-windows", "CommandFailed": "명령:\n{command_line}\n다음 결과와 함께 실패했습니다.", - "Commands": "명령:", - "CommunityTriplets": "VCPKG 커뮤니티 삼중 항목:", + "CommunityTriplets": "커뮤니티 Triplets:", "ComparingUtf8Decoders": "출처가 다른 Utf8Decoder 비교 중; 항상 오류입니다", "CompressFolderFailed": "폴더 \"{path}\"을(를) 압축하지 못했습니다.", "ComputingInstallPlan": "설치 계획을 계산하는 중...", "ConfigurationErrorRegistriesWithoutBaseline": "{path}에 정의된 구성이 잘못되었습니다.\n\n레지스트리를 사용하려면 기본 레지스트리에 대한 기준이 설정되어 있거나 기본 레지스트리가 null여야 합니다.\n\n자세한 내용은 {url}을(를) 참조하세요.", "ConfigurationNestedDemands": "[\"{json_field}\"]에 중첩된 'demands' 개체가 포함되어 있습니다(중첩된 'demands'는 효과가 없음).", "ConflictingFiles": "다음 파일은 {path}에 이미 설치되어 있으며 {spec}과(와) 충돌합니다.", + "ConsideredVersions": "{version}의 버전 요구 사항으로 인해 다음 실행 파일이 고려되었지만 삭제되었습니다.", "ConstraintViolation": "제약 조건 위반 발견:", "ContinueCodeUnitInStart": "시작 위치에서 계속 코드 단위를 찾음", "ControlAndManifestFilesPresent": "매니페스트 파일과 CONTROL 파일이 모두 포트 디렉터리에 있습니다. {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "데이터베이스가 손상되었습니다.", "CorruptedInstallTree": "vcpkg '설치된' 트리가 손상되었습니다.", "CouldNotDeduceNugetIdAndVersion": "파일 이름에서 nuget ID 및 버전을 추론할 수 없음: {path}", - "CouldNotFindBaseline": "기준 파일 {path}에서 명시적으로 지정된 기준 '\"{commit_sha}\"을(를) 찾을 수 없습니다.", - "CouldNotFindBaselineForRepo": "리포지토리 {package_name}에 대한 기준 '\"{commit_sha}\"'을(를) 찾을 수 없습니다.", - "CouldNotFindBaselineInCommit": "리포지토리 {package_name}의 커밋 '\"{commit_sha}\"에서 기준을 찾을 수 없습니다.", + "CouldNotFindBaselineInCommit": "{package_name} 관련 {commit_sha}의 {url}에서 기준을 찾을 수 없습니다.", "CouldNotFindGitTreeAtCommit": "{commit_sha} 커밋의 리포지토리 {package_name}에서 '버전'에 대한 git 트리를 찾을 수 없습니다.", "CouldNotFindToolVersion": "{path}에서 을(를) 찾을 수 없습니다.", "CouldNotFindVersionDatabaseFile": "버전 데이터베이스 파일을 찾을 수 없습니다. {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "환경 변수 VCPKG_DEFAULT_BINARY_CACHE는 디렉터리여야 함(이전: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "환경 변수 VCPKG_DEFAULT_BINARY_CACHE는 절대 변수여야 함(이전: {path})", "DefaultBinaryCacheRequiresDirectory": "환경 변수 VCPKG_DEFAULT_BINARY_CACHE는 디렉터리여야 함(이전: {path})", - "DefaultBrowserLaunched": "기본 브라우저가 {url}(으)로 실행되었습니다.", + "DefaultFeatureCore": "\"core\" 기능은 기본 기능을 해제하므로 기본 기능 목록에 있을 수 없습니다.", + "DefaultFeatureDefault": "\"default\" 기능은 기본 기능 집합을 참조하므로 기본 기능 목록에 있을 수 없습니다.", + "DefaultFeatureIdentifier": "기본 기능의 이름은 반드시 식별자여야 합니다.", "DefaultFlag": "기본적으로 --{option}이 켜져 있습니다.", "DefaultRegistryIsArtifact": "기본 레지스트리는 아티팩트 레지스트리일 수 없습니다.", - "DefaultTriplet": "2023년 9월 릴리스부터 vcpkg 라이브러리의 기본 triplet이 x86-windows에서 감지된 호스트 triplet({triplet})으로 변경됩니다. 이 메시지를 해결하려면 --triplet x86-windows를 추가하여 동일한 동작을 유지하세요.", + "DefaultTripletChanged": "2023년 9월 릴리스에서는 vcpkg 라이브러리의 기본 triplet이 x86-windows에서 감지된 호스트 triplet({triplet})으로 변경되었습니다. 이전 동작의 경우 --triplet x86-windows를 추가하세요. 이 메시지를 표시하지 않으려면 --triplet {triplet} 을 추가하세요.", "DeleteVcpkgConfigFromManifest": "-- 또는 매니페스트 파일 {path}에서 \"vcpkg-configuration\"을 제거합니다.", + "DependencyFeatureCore": "\"core\" 기능은 종속성의 기능 목록에 있을 수 없습니다. 기본 기능을 해제하려면 대신 \"default-features\": false를 추가합니다.", + "DependencyFeatureDefault": "\"default\" 기능은 종속성의 기능 목록에 있을 수 없습니다. 기본 기능을 켜려면 대신 \"default-features\": true를 추가합니다.", + "DependencyGraphCalculation": "종속성 그래프 제출을 활성화했습니다.", + "DependencyGraphFailure": "종속성 그래프 제출에 실패했습니다.", + "DependencyGraphSuccess": "종속성 그래프 제출에 성공했습니다.", "DeprecatedPrefabDebugOption": "--prefab-debug는 이제 더 이상 사용되지 않습니다.", "DetectCompilerHash": "삼중항 {triplet}에 대한 컴파일러 해시 감지 중...", "DocumentedFieldsSuggestUpdate": "인식되어야 하는 문서화된 필드인 경우 vcpkg 도구를 업데이트해 보세요.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "파일에 필요한 해시가 없습니다.\nURL: {url}\n파일: {path}\n필요한 해시: {expected}\n실제 해시: {actual}", "DownloadFailedRetrying": "다운로드 실패 -- {value}ms 후에 다시 시도 중", "DownloadFailedStatusCode": "{url}: 실패: 상태 코드 {value}", - "DownloadRootsDir": "다운로드 루트 디렉토리를 지정합니다.\n(기본값: {env_var})", + "DownloadRootsDir": "디렉터리 다운로드(기본값: {env_var})", "DownloadWinHttpError": "{url}: 종료 코드 {exit_code}(으)로 {system_api}이(가) 실패했습니다.", "DownloadedSources": "{spec}에 대한 다운로드 소스", "DownloadingPortableToolVersionX": "적합한 버전의 {tool_name}을(를) 찾을 수 없습니다(v{version} 필요). 이식 가능한 {tool_name} {version}을(를) 다운로드하는 중...", "DownloadingTool": "{tool_name}을(를) 다운로드하는 중... \n{url}->{path}", "DownloadingUrl": "{url} 다운로드 중", - "DownloadingVcpkgCeBundle": "{version} vcpkg-artifacts 번들을 다운로드하는 중...", - "DownloadingVcpkgCeBundleLatest": "최신 vcpkg-artifacts 번들을 다운로드하는 중...", "DownloadingVcpkgStandaloneBundle": "독립 실행형 번들 {version}을(를) 다운로드하는 중입니다.", "DownloadingVcpkgStandaloneBundleLatest": "최신 독립 실행형 번들을 다운로드하는 중입니다.", "DuplicatePackagePattern": "패키지 \"{package_name}\"이(가) 중복되었습니다.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "컴파일러 정보를 감지하는 동안:\n\"{path}\"의 로그 파일 콘텐츠는 다음과 같습니다.", "ErrorIndividualPackagesUnsupported": "매니페스트 모드에서 `vcpkg install`은 개별 패키지 인수를 지원하지 않습니다.\n추가 패키지를 설치하려면 vcpkg.json을 편집한 다음 패키지 인수 없이 `vcpkg install`을 실행하세요.", "ErrorInvalidClassicModeOption": "--{option} 옵션은 클래식 모드에서 지원되지 않으며 매니페스트를 찾을 수 없습니다.", + "ErrorInvalidExtractOption": "--{option}은(는) 음이 아닌 정수 또는 'AUTO'로 설정해야 합니다.", "ErrorInvalidManifestModeOption": "--{option} 옵션은 매니페스트 모드에서 지원되지 않습니다.", "ErrorMessage": "오류: ", "ErrorMessageMustUsePrintError": "{value}(이)라는 메시지는 error:로 시작합니다. 대신 코드에서 ErrorMessage를 앞에 추가하도록 변경해야 합니다.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "{path}을(를) 구문 분석하는 동안 오류가 발생했습니다.", "ErrorWhileWriting": "{path}을(를) 쓰는 동안 오류가 발생했습니다.", "ErrorsFound": "다음 오류를 발견했습니다.", - "Example": "예:", + "ExamplesHeader": "예:", "ExceededRecursionDepth": "재귀 수준이 초과되었습니다.", "ExcludedPackage": "제외된 {spec}", "ExcludedPackages": "제외되는 패키지:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "유지 관리 도구를 내보내는 중...", "ExportingPackage": "{package_name} 내보내는 중...", "ExtendedDocumentationAtUrl": "확장 문서는 '{url}'에서 사용할 수 있습니다.", + "ExtractHelp": "보관 파일을 추출합니다.", "ExtractingTool": "{tool_name}을(를) 추출하는 중...", "FailedPostBuildChecks": "빌드 후 검사 문제를 {count}개 발견했습니다. 큐레이팅된 카탈로그에 포트를 제출하려면 먼저 포트 파일을 수정하세요. {path}", "FailedToAcquireMutant": "변이 {path}을(를) 가져오지 못했습니다.", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "현재 커밋을 확인하지 못했습니다.", "FailedToDownloadFromMirrorSet": "미러 세트에서 다운로드하지 못함", "FailedToExtract": "\"{path}\"을(를) 추출하지 못했습니다.", - "FailedToFetchError": "{error_msg}\n{package_name}을(를) 가져오지 못했습니다.", - "FailedToFindBaseline": "baseline.json을 찾지 못했습니다.", + "FailedToFetchRepo": "{url}을(를) 가져오지 못했습니다.", "FailedToFindPortFeature": "{package_name}에는 {feature}라는 기능이 없습니다.", "FailedToFormatMissingFile": "형식을 지정할 파일이 없습니다.\n형식을 지정하거나 변환하려면 --all 또는 명시적 파일을 전달하세요.", "FailedToLoadInstalledManifest": "다음 오류로 인해 {package_name}의 컨트롤 또는 매니페스트 파일을 로드할 수 없습니다. {package_name}을(를) 제거하고 다시 시도하세요.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "{path}에서 파일 시스템 잠금을 가져오지 못했습니다.", "FailedToWriteManifest": "매니페스트 파일 {path}을(를) 쓰지 못함", "FailedVendorAuthentication": "하나 이상의 {vendor} 자격 증명 공급자가 인증에 실패했습니다. 자격 증명을 제공하는 방법에 대한 자세한 내용은 '{url}'을(를) 참조하세요.", - "FeedbackAppreciated": "피드백을 주셔서 감사합니다!", "FetchingBaselineInfo": "{package_name}에서 기준 정보를 가져오는 중...", "FetchingRegistryInfo": "{url}({value})에서 레지스트리 정보를 가져오는 중...", "FieldKindDidNotHaveExpectedValue": "\"kind\"에 필요한 값이 없습니다(필요한 값: {expected} 중 하나, 찾은 값 {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "다음 파일에서 절대 경로를 찾았습니다.", "FilesExported": "내보낸 파일: {path}", "FindHelp": "표시된 아티팩트 또는 포트를 검색합니다. '아티팩트' 또는 '포트' 뒤에 매개 변수가 없으면 모든 항목이 표시됩니다.", + "FindVersionArtifactsOnly": "--version은 vcpkg 검색 또는 vcpkg 찾기 포트와 함께 사용할 수 없습니다.", "FishCompletion": "vcpkg 물고기 완성은 이미 \"{path}\"에 추가되었습니다.", "FloatingPointConstTooBig": "부동 소수점 상수가 너무 큼: {count}", "FollowingPackagesMissingControl": "다음 패키지에는 유효한 CONTROL 또는 vcpkg.json이 없습니다.", "FollowingPackagesNotInstalled": "다음 패키지가 설치되지 않았습니다.", "FollowingPackagesUpgraded": "다음 패키지는 최신 상태입니다.", + "ForMoreHelp": "추가 도움말", "ForceSystemBinariesOnWeirdPlatforms": "arm, s390x, ppc64le 및 riscv 플랫폼에서 환경 변수 VCPKG_FORCE_SYSTEM_BINARIES를 설정해야 합니다.", "FormattedParseMessageExpression": "식: {value}", "GHAParametersMissing": "GHA 이진 원본을 사용하려면 ACTIONS_RUNTIME_TOKEN 및 ACTIONS_CACHE_URL 환경 변수를 설정해야 합니다. 자세한 내용은 {url}을(를) 참조하세요.", @@ -470,7 +590,7 @@ "GitCommandFailed": "명령을 실행하지 못했습니다: {command_line}", "GitFailedToFetch": "리포지토리 {url}에서 참조 {value}을(를) 가져오지 못함", "GitFailedToInitializeLocalRepository": "로컬 리포지토리 {path}을(를) 초기화하지 못함", - "GitRegistryMustHaveBaseline": "\"{package_name}\"에 대한 git 레지스트리 항목에는 유효한 git 커밋 SHA(40개의 16진수 문자)인 \"기준\" 필드가 있어야 합니다.\n해당 리포지토리의 현재 HEAD가 \"{value}\"입니다.", + "GitRegistryMustHaveBaseline": "Git 레지스트리 \"{url}\"에는 유효한 Git 커밋 SHA(16진수 문자 40개)인 \"기준\" 필드가 있어야 합니다.\n현재 최신 버전을 사용하려면 해당 리포지토리의 HEAD인 \"{commit_sha}\"로 기준을 설정합니다.", "GitStatusOutputExpectedFileName": "파일 이름이 필요합니다.", "GitStatusOutputExpectedNewLine": "새 줄이 필요합니다.", "GitStatusOutputExpectedRenameOrNewline": "이름이 바뀐 파일 또는 새 줄이 필요합니다.", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "{command_line}을(를) 실행할 때 git에서 예기치 않은 출력이 생성되었음", "GraphCycleDetected": "{package_name}의 그래프 내에서 감지된 주기:", "HashFileFailureToRead": "해시에 대한 파일 \"{path}\"을(를) 읽지 못했습니다. ", + "HashPortManyFiles": "{package_name}에 {count}개의 파일이 포함되어 있습니다. 이진 캐싱에 대한 ABI 해시를 확인할 때 이러한 콘텐츠를 해시하는 데 시간이 오래 걸릴 수 있습니다. 파일 수를 줄이는 것이 좋습니다. 일반적인 원인은 포트의 디렉터리에 소스 또는 빌드 파일을 실수로 체크 아웃하는 것입니다.", "HeaderOnlyUsage": "{package_name}은 헤더 전용이며 다음을 통해 CMake에서 사용할 수 있습니다.", "HelpAssetCaching": "**실험적 기능: 이 기능은 언제든지 변경되거나 제거될 수 있습니다**\n\nvcpkg는 미러를 사용하여 다운로드한 자산을 캐시할 수 있으므로 원본 원본이 변경되거나 사라지더라도 계속 작동할 수 있습니다.\n\n자산 캐싱은 환경 변수 X_VCPKG_ASSET_SOURCES를 세미콜론으로 구분된 원본 목록으로 설정하거나 일련의 --x-asset-sources= 명령줄 옵션을 전달하여 구성할 수 있습니다. 명령줄 원본은 환경 원본 다음에 해석됩니다. 쉼표, 세미콜론 및 백틱은 백틱(`)을 사용하여 이스케이프 처리할 수 있습니다.\n\n특정 문자열에 대한 선택적 매개 변수는 액세스 방법을 제어합니다. \"읽기\", \"쓰기\" 또는 \"읽기쓰기\"로 지정할 수 있으며 기본값은 \"읽기\"입니다.\n\n유효한 원본:", "HelpAssetCachingAzUrl": "선택적으로 공유 액세스 서명 유효성 검사를 사용하여 Azure Blob Storage 원본을 추가합니다. URL은 컨테이너 경로를 포함해야 하며 후행 \"/\"로 종료되어야 합니다. 는 정의된 경우 접두사로 \"?\"를 붙여야 합니다. 비 Azure 서버는 \"\" 형식의 GET 및 PUT 요청에 응답하는 경우에도 작동합니다.", @@ -505,51 +626,48 @@ "HelpContactCommand": "피드백을 보낼 연락처 정보를 표시합니다.", "HelpCreateCommand": "새 포트를 만듭니다.", "HelpDependInfoCommand": "포트에 대한 종속성 목록을 표시합니다.", - "HelpEditCommand": "편집할 포트를 엽니다(환경 변수 '{env_var}'를 사용하여 편집기 프로그램을 설정하고 기본값은 'code').", + "HelpEditCommand": "선택적으로 {env_var}을(를) 사용하여 포트를 편집합니다. 기본값은 \"code\"입니다.", "HelpEnvCommand": "개발 또는 컴파일을 위한 깨끗한 셸 환경을 만듭니다.", - "HelpExampleCommand": "추가 도움말(예제 포함)은 함께 제공되는 README.md 및 docs 폴더를 참조하세요.", + "HelpExampleCommand": "자세한 도움말(예 포함)은 https://learn.microsoft.com/vcpkg 참조", "HelpExampleManifest": "매니페스트 예시:", "HelpExportCommand": "패키지를 내보냅니다.", - "HelpFormatManifestCommand": "모든 vcpkg.json 파일의 형식을 지정합니다. vcpkg에 커밋하기 전에 이것을 실행하세요.", "HelpHashCommand": "특정 알고리즘(기본값 SHA512)으로 파일을 해시합니다.", - "HelpInitializeRegistryCommand": "디렉터리 의 레지스트리를 초기화합니다.", "HelpInstallCommand": "패키지를 설치합니다.", "HelpListCommand": "설치된 패키지를 나열합니다.", "HelpManifestConstraints": "매니페스트는 사용된 버전에 세 가지 종류의 제약을 가할 수 있습니다.", "HelpMinVersion": "Vcpkg는 최상위 수준에 지정된 기준의 버전과 그래프의 \"version>=\" 제약 조건을 포함하여 적용 가능한 모든 제약 조건과 일치하는 발견된 최소 버전을 선택합니다.", "HelpOverrides": "최상위 매니페스트로 사용되는 경우(예: 디렉터리에서 `vcpkg install`을 실행할 때) 재정의를 사용하면 매니페스트가 종속성 해결을 단축하고 사용할 버전을 정확히 지정할 수 있습니다. 이는 `version-string` 종속성과 같은 버전 충돌을 처리하는 데 사용할 수 있습니다. 전이적으로 의존하는 경우에는 고려되지 않습니다.", - "HelpOwnsCommand": "설치된 패키지에서 파일을 검색합니다.", + "HelpOwnsCommand": "설치된 패키지에서 파일 소유자를 검색합니다.", "HelpPackagePublisher": "또한 패키지 게시자는 \"version>=\" 제약 조건을 사용하여 소비자가 지정된 종속성의 특정 최소 버전을 사용하고 있는지 확인할 수 있습니다. 예를 들어 라이브러리가 1.70에서 boost-asio에 추가된 API가 필요한 경우 \"version>=\" 제약 조건은 개별 버전 재정의 또는 레지스트리 간 참조를 사용하는 경우에도 전이 사용자가 충분한 버전을 사용하도록 합니다.", "HelpPortVersionScheme": "각 버전에는 음이 아닌 정수인 \"port-version\"이 추가로 있습니다. 텍스트로 렌더링되면 포트 버전(0이 아닌 경우)이 해시(#)로 구분된 기본 버전 텍스트에 접미사로 추가됩니다. 포트 버전은 기본 버전 텍스트 다음에 사전순으로 정렬됩니다. 예:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", "HelpRemoveCommand": "패키지를 제거합니다.", - "HelpRemoveOutdatedCommand": "오래된 패키지를 모두 제거합니다.", - "HelpResponseFileCommand": "추가 매개 변수를 제공하려면 응답 파일을 지정하세요.", + "HelpResponseFileCommand": "해당 위치에서 확장된 줄당 하나의 인수를 포함합니다.", "HelpSearchCommand": "빌드할 수 있는 패키지를 검색합니다.", "HelpTextOptFullDesc": "긴 텍스트를 자르지 않습니다.", - "HelpTopicCommand": "특정 토픽에 대한 도움말을 표시합니다.", - "HelpTopicsCommand": "도움말 항목 목록을 표시합니다.", - "HelpTxtOptAllowUnsupportedPort": "지원되지 않는 포트에서 오류가 발생하는 대신 경고가 계속 표시됩니다.", + "HelpTopicCommand": "특정 도움말 항목을 표시합니다.", + "HelpTopicsCommand": "도움말 토픽의 전체 목록을 표시합니다.", + "HelpTxtOptAllowUnsupportedPort": "실패하지 않고 지원되지 않는 포트에서 경고를 계속합니다.", "HelpTxtOptCleanAfterBuild": "각 패키지를 빌드한 후 빌드 트리, 패키지 및 다운로드를 정리합니다.", - "HelpTxtOptCleanBuildTreesAfterBuild": "각 패키지를 빌드한 후 빌드 트리를 정리합니다.", + "HelpTxtOptCleanBuildTreesAfterBuild": "각 패키지를 빌드한 후 빌드 트리 정리", "HelpTxtOptCleanDownloadsAfterBuild": "각 패키지를 빌드한 후 다운로드를 정리합니다.", "HelpTxtOptCleanPkgAfterBuild": "각 패키지를 빌드한 후 패키지를 정리합니다.", "HelpTxtOptDryRun": "실제로 빌드하거나 설치하지 않습니다.", "HelpTxtOptEditable": "명령줄에서 라이브러리에 대한 원본 재추출 및 이진 캐싱 사용 안 함(클래식 모드)", "HelpTxtOptEnforcePortChecks": "포트에서 문제를 감지했거나 더 이상 사용되지 않는 기능을 사용하려는 경우 설치 실패", - "HelpTxtOptKeepGoing": "실패 시 패키지를 계속 설치합니다.", - "HelpTxtOptManifestFeature": "설치할 최상위 매니페스트의 추가 기능(매니페스트 모드).", - "HelpTxtOptManifestNoDefault": "최상위 매니페스트(매니페스트 모드)의 기본 기능을 설치하지 마세요.", - "HelpTxtOptNoDownloads": "새 원본을 다운로드하지 않습니다.", + "HelpTxtOptKeepGoing": "실패 시 패키지를 계속 설치", + "HelpTxtOptManifestFeature": "설치할 최상위 매니페스트의 추가 기능(매니페스트 모드)", + "HelpTxtOptManifestNoDefault": "최상위 매니페스트(매니페스트 모드)의 기본 기능을 설치하지 않음", + "HelpTxtOptNoDownloads": "새 원본을 다운로드하지 않음", "HelpTxtOptNoUsage": "설치 후 CMake 사용 정보를 인쇄하지 않음", - "HelpTxtOptOnlyBinCache": "캐시된 이진 파일을 사용할 수 없는 경우 실패합니다.", - "HelpTxtOptOnlyDownloads": "빌드하지 않고 원본을 다운로드하기 위해 최선을 다합니다.", - "HelpTxtOptRecurse": "설치의 일부로 패키지 제거를 허용합니다.", - "HelpTxtOptUseAria2": "aria2를 사용하여 다운로드 작업을 수행합니다.", - "HelpTxtOptUseHeadVersion": "최신 업스트림 원본(클래식 모드)를 사용하여 명령줄에 라이브러리를 설치합니다.", - "HelpTxtOptWritePkgConfig": "외부 이진 캐싱에 사용할 NuGet packages.config 형식 파일을 작성합니다.\n자세한 내용은 `vcpkg help binarycaching`을 참조하세요.", - "HelpUpdateBaseline": "라이브러리를 최신 상태로 유지하는 가장 좋은 방법은 기준 참조를 업데이트하는 것입니다. 이렇게 하면 전이 패키지를 포함한 모든 패키지가 업데이트됩니다. 그러나 패키지를 독립적으로 업데이트해야 하는 경우 \"version>=\" 제약 조건을 사용할 수 있습니다.", - "HelpUpdateCommand": "업데이트할 수 있는 패키지를 나열합니다.", - "HelpUpgradeCommand": "모든 오래된 패키지를 다시 빌드하세요.", + "HelpTxtOptOnlyBinCache": "캐시된 이진 파일을 사용할 수 없는 경우 실패", + "HelpTxtOptOnlyDownloads": "빌드하지 않고 원본을 다운로드하기 위해 최선을 다함", + "HelpTxtOptRecurse": "설치의 일부로 패키지 제거 허용", + "HelpTxtOptUseAria2": "aria2를 사용하여 다운로드 작업 수행합", + "HelpTxtOptUseHeadVersion": "최신 업스트림 원본(클래식 모드)를 사용하여 명령줄에 라이브러리 설치", + "HelpTxtOptWritePkgConfig": "외부 이진 캐싱에 사용할 NuGet packages.config 형식 파일을 작성합니다. 자세한 내용은 `vcpkg help binarycaching` 참조", + "HelpUpdateBaseline": "라이브러리를 최신 상태로 유지하는 가장 좋은 방법은 기준 참조를 업데이트하는 것입니다. 이렇게 하면 전이 패키지를 포함한 모든 패키지가 업데이트됩니다. 하지만 패키지를 독립적으로 업데이트해야 하는 경우 \"version>=\" 제약 조건을 사용할 수 있습니다.", + "HelpUpdateCommand": "업그레이드할 수 있는 패키지를 나열합니다.", + "HelpUpgradeCommand": "오래된 모든 패키지를 다시 빌드합니다.", "HelpVersionCommand": "버전 정보를 표시합니다.", "HelpVersionDateScheme": "날짜(2021-01-01.5)", "HelpVersionGreater": "\"종속성\" 필드 내에서 각 종속성은 나열된 최소 제약 조건을 가질 수 있습니다. 이러한 최소 제약 조건은 이 라이브러리에 전이적으로 의존할 때 사용됩니다. '#' 접미사를 사용하여 최소 포트 버전을 추가로 지정할 수 있습니다.", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "잘못된 보관 파일 서명", "IncorrectPESignature": "잘못된 PE 서명", "IncrementedUtf8Decoder": "문자열 끝에 증분된 Utf8Decoder", - "InfoSetEnvVar": "환경 변수 '{env_var}'를 선택한 편집기로 설정할 수도 있습니다.", + "InfoSetEnvVar": "{env_var}을(를) 선택한 편집기로 설정할 수도 있습니다.", "InitRegistryFailedNoRepo": "git 리포지토리 루트가 아니므로 {path}에 레지스트리를 만들 수 없습니다.\n`git init {command_line}`을(를) 사용하여 이 폴더에 git 리포지토리를 만듭니다.", "InstallCopiedFile": "{path_source} -> {path_destination} 완료", "InstallFailed": "실패: {path}: {error_msg}", "InstallPackageInstruction": "프로젝트를 연 상태에서 도구->NuGet 패키지 관리자->패키지 관리자 콘솔로 이동하여 다음을 붙여넣습니다.\n Install-Package \"{value}\" -원본 \"{path}\"", - "InstallRootDir": "(실험적) 설치 루트 디렉터리를 지정합니다.", + "InstallRootDir": "설치된 디렉터리(실험적)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination}을(를) 건너뛰었습니다. 최신 상태입니다.", "InstallWithSystemManager": "시스템 패키지 관리자를 통해 이 도구를 설치할 수 있습니다.", "InstallWithSystemManagerMono": "Ubuntu 18.04 사용자는 {url}에서 사용할 수 있는 최신 버전의 모노가 필요할 수 있습니다.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- 위치에서 포트를 설치하는 중: {path}", "InstallingMavenFile": "Maven 파일을 설치하는 {path}", "InstallingPackage": "{action_index}/{count} {spec}을(를) 설치하는 중...", - "IntegrateBashHelp": "bash 탭 완성을 사용하도록 설정합니다.", - "IntegrateFishHelp": "fish 탭 완성을 사용하도록 설정합니다.", - "IntegrateInstallHelpLinux": "설치된 패키지를 사용자 전체가 사용할 수 있도록 합니다.", + "IntegrateBashHelp": "bash 탭 완성을 사용합니다. 비 Windows 전용입니다.", + "IntegrateFishHelp": "fish 탭 완성을 사용합니다. 비 Windows 전용입니다.", + "IntegrateInstallHelpLinux": "설치된 패키지를 사용자 전체가 사용할 수 있도록 함", "IntegrateInstallHelpWindows": "설치된 패키지를 사용자 전체가 사용할 수 있도록 합니다. 처음 사용할 때 관리자 권한이 필요합니다.", - "IntegratePowerShellHelp": "PowerShell 탭 완성을 사용하도록 설정합니다.", - "IntegrateProjectHelp": "개별 VS 프로젝트 사용을 위해 참조하는 NuGet 패키지를 생성합니다.", - "IntegrateRemoveHelp": "사용자 전체 통합을 제거합니다.", - "IntegrateZshHelp": "zsh 탭 완성을 사용하도록 설정합니다.", - "IntegrationFailed": "통합이 적용되지 않았습니다.", + "IntegrateNonWindowsOnly": "{command_line}은(는) Windows 전용이 아니므로 이 시스템에서 지원되지 않습니다.", + "IntegratePowerShellHelp": "PowerShell 탭 완성을 사용합니다. Windows 전용입니다.", + "IntegrateProjectHelp": "개별 Visual Studio 프로젝트 사용에 대한 참조 NuGet 패키지를 생성합니다. Windows 전용입니다.", + "IntegrateRemoveHelp": "사용자 전체 통합 제거", + "IntegrateWindowsOnly": "{command_line}은(는) Windows 전용이므로 이 시스템에서 지원되지 않습니다.", + "IntegrateZshHelp": "zsh 탭 완성을 사용합니다. 비 Windows 전용입니다.", + "IntegrationFailedVS2015": "Visual Studio 2015에 통합이 적용되지 않았습니다.", "InternalCICommand": "vcpkg ci는 호환되지 않는 방식으로 변경되거나 언제든지 제거될 내부 명령입니다.", "InternalErrorMessage": "내부 오류: ", "InternalErrorMessageContact": "https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug에서 문제를 재현하기 위한 자세한 단계와 함께 문제를 여세요.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg는 c 스타일 주석을 지원하지 않지만 대부분의 개체는 $-prefixed 필드를 주석으로 사용할 수 있도록 허용합니다.", "InvalidCommitId": "잘못된 커밋 ID: {commit_sha}", "InvalidDefaultFeatureName": "'기본값'은 예약된 기능 이름입니다.", - "InvalidDependency": "종속성은 소문자 영숫자+하이픈이어야 하며 예약된 이름 중 하나가 아니어야 합니다.", "InvalidFeature": "기능은 소문자 영숫자+하이픈이어야 하며 예약된 이름 중 하나가 아니어야 합니다.", "InvalidFileType": "실패: {path}이(가) 파일 형식을 처리할 수 없습니다.", "InvalidFilename": "파일 이름에 유효하지 않은 문자({value})를 포함할 수 없습니다. 입력값: {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "라이브러리가 잘못되었습니다. 링커 멤버를 찾을 수 없습니다.", "InvalidLinkage": "잘못된 {system_name} 연결 유형: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "논리식이 잘못되었습니다. 예기치 않은 문자입니다.", - "InvalidLogicExpressionUsePipe": "논리식이 잘못되었습니다. 'or' 대신 '|'을 사용하세요.", + "InvalidLogicExpressionUsePipe": "논리 식이 잘못되었습니다. 'or' 대신 '|'를 사용하세요.", "InvalidNoVersions": "파일에 버전이 없습니다.", "InvalidOptionForRemove": "'remove'는 라이브러리 또는 '--outdated'를 수락합니다.", "InvalidPortVersonName": "잘못된 포트 버전 파일 이름 '{path}'을(를) 찾았습니다.", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "[\"{json_field}\"] 값은 개체여야 합니다.", "JsonFieldNotString": "[\"{json_field}\"] 값은 문자열이어야 합니다.", "JsonFileMissingExtension": "JSON 파일 {path}의 확장명은 .json(모두 소문자)이어야 합니다.", - "JsonSwitch": "(실험적) JSON 출력을 요청합니다.", + "JsonSwitch": "일반 텍스트가 아닌 JSON 인쇄", "JsonValueNotArray": "json 값이 배열이 아닙니다.", "JsonValueNotObject": "json 값이 개체가 아닙니다.", "JsonValueNotString": "json 값이 문자열이 아닙니다.", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "동적 릴리스(/MD)", "LinkageStaticDebug": "정적 디버그(/MTd)", "LinkageStaticRelease": "정적 릴리스(/MT)", - "ListHelp": "인수는 검색할 substring이거나 설치된 모든 라이브러리를 표시할 인수가 없어야 합니다.", + "ListHelp": "설치된 라이브러리 나열", "ListOfValidFieldsForControlFiles": "CONTROL 파일의 유효한 필드 목록입니다(대/소문자 구분).", "LoadingCommunityTriplet": "-- [COMMUNITY] {path}에서 삼중항 구성 로드 중", "LoadingDependencyInformation": "{count}개 패키지에 대한 종속성 정보를 로드하는 중...", @@ -707,8 +826,7 @@ "MsiexecFailedToExtract": "시작 또는 종료 코드 {exit_code} 및 메시지와 함께 \"{path}\"을(를) 추출하는 동안 msiexec가 실패했습니다.", "MultiArch": "다중 아키텍처는 '동일'해야 하지만 {option}입니다.", "MultipleFeatures": "{package_name}이(가) {feature}을(를) 여러 번 선언합니다. 기능에 고유한 이름이 있는지 확인하세요.", - "MutuallyExclusiveOption": "--{option}과(와) 함께 --{value}을(를) 사용할 수 없습니다.", - "NavigateToNPS": "선호하는 브라우저에서 {url}(으)로 이동하세요.", + "MutuallyExclusiveOption": "--{value}은(는) --{option}과(와) 함께 사용할 수 없습니다.", "NewConfigurationAlreadyExists": "매니페스트를 만들면 {path}에서 vcpkg-configuration.json이 덮어쓰입니다.", "NewManifestAlreadyExists": "매니페스트가 {path}에 이미 있습니다.", "NewNameCannotBeEmpty": "--name은 비워 둘 수 없습니다.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "--name 및 --version을 지정하여 C++ 라이브러리용 매니페스트를 생성하거나 --application을 지정하여 매니페스트가 포트로 사용되지 않도록 지정합니다.", "NewVersionCannotBeEmpty": "--version은 비워 둘 수 없습니다.", "NoArgumentsForOption": "--{option} 옵션은 인수를 허용하지 않습니다.", - "NoCachedPackages": "캐시된 패키지가 없습니다.", "NoError": "오류 없음", "NoInstalledPackages": "패키지가 설치되어 있지 않습니다. 의도한 명령이 `search`인가요?", "NoLocalizationForMessages": "다음에 대한 지역화된 메시지가 없습니다. ", @@ -739,22 +856,27 @@ "OptionRequiresAValue": "'{option}' 옵션에 값이 필요합니다.", "OptionRequiresOption": "--{value}에 --{option} 필요", "OptionUsedMultipleTimes": "'{option}' 옵션을 여러 번 지정했습니다.", - "OptionalCommand": "선택적 명령", "Options": "옵션", "OriginalBinParagraphHeader": "\n원래 이진 단락", + "OtherCommandsHeader": "기타", "OverlayPatchDir": "오버레이 경로 \"{path}\" 는 존재해야 하며 디렉터리여야 합니다.", - "OverlayTriplets": "{path}의 오버레이 삼중 항목:", + "OverlayPortsDirectoriesHelp": "오버레이 포트의 디렉터리(또한: {env_var})", + "OverlayTripletDirectoriesHelp": "오버레이 삼중 항목의 디렉터리(또한: {env_var})", + "OverlayTriplets": "{path}의 오버레이 Triplets", "OverwritingFile": "파일 {path}이(가) 이미 있으며 덮어쓰여집니다.", "PECoffHeaderTooShort": "이식 가능한 실행 파일 {path}을(를) 구문 분석하는 동안 COFF 헤더의 크기가 너무 작아서 올바른 PE 헤더를 포함할 수 없습니다.", - "PEConfigCrossesSectionBoundary": "이식 가능한 실행 파일 {path}을(를) 구문 분석하는 동안 이미지 구성 디렉터리가 secion 경계를 넘습니다.", - "PEImportCrossesSectionBoundary": "이식 가능한 실행 파일 {path}을(를) 구문 분석하는 동안 가져오기 테이블이 secion 경계를 넘습니다.", + "PEConfigCrossesSectionBoundary": "이식 가능한 실행 파일 {path}을(를) 구문 분석하는 동안 이미지 구성 디렉터리가 구역 경계를 넘습니다.", + "PEImportCrossesSectionBoundary": "이식 가능한 실행 파일 {path}을(를) 구문 분석하는 동안 가져오기 테이블이 구역 경계를 넘습니다.", "PEPlusTagInvalid": "이식 가능한 실행 파일 {path}을(를) 구문 분석하는 동안 선택적 헤더가 PE32 또는 PE32+가 아닙니다.", "PERvaNotFound": "이식 가능한 실행 파일 {path}을(를) 구문 분석하는 동안 RVA {value:#X}을(를) 찾을 수 없습니다.", "PESignatureMismatch": "이식 가능한 실행 파일 {path}을(를) 구문 분석하는 동안 서명이 일치하지 않습니다.", "PackageAlreadyRemoved": "{spec}을(를) 제거할 수 없음: 이미 제거됨", + "PackageDiscoveryHeader": "패키지 검색", "PackageFailedtWhileExtracting": "{path}을(를) 추출하는 동안 '{value}'이(가) 실패했습니다.", - "PackageInfoHelp": "패키지에 대한 자세한 정보를 표시합니다.", - "PackageRootDir": "(실험적) 패키지 루트 디렉터리를 지정합니다.", + "PackageInfoHelp": "패키지에 대한 자세한 정보 표시", + "PackageInstallationHeader": "패키지 설치", + "PackageManipulationHeader": "패키지 조작", + "PackageRootDir": "패키지 디렉터리(실험적)", "PackagesToInstall": "빌드 및 설치할 패키지:", "PackagesToInstallDirectly": "직접 설치할 패키지:", "PackagesToModify": "이 작업을 완료하기 위해 추가 패키지(*)가 수정됩니다.", @@ -774,6 +896,7 @@ "ParseControlErrorInfoTypesEntry": "{value}은(는) {expected}로 예상되었습니다.", "ParseControlErrorInfoWhileLoading": "{path}을(를) 로드하는 동안:", "ParseControlErrorInfoWrongTypeFields": "다음 필드의 유형이 잘못되었습니다.", + "ParseFeatureNameError": "\"{package_name}\"은(는) 유효한 기능 이름이 아닙니다. 기능 이름은 소문자 영숫자+하이픈이어야 하며 예약되지 않아야 합니다(자세한 내용은 {url} 참조).", "ParseIdentifierError": "\"{value}\"는 유효한 식별자가 아닙니다. 식별자는 소문자 영숫자+하이픈이어야 하며 예약되지 않아야 합니다(자세한 내용은 {url} 참조).", "ParsePackageNameError": "\"{package_name}\"은(는) 유효한 패키지 이름이 아닙니다. 패키지 이름은 소문자 영숫자+하이픈이어야 하며 예약되지 않아야 합니다(자세한 내용은 {url} 참조).", "ParsePackagePatternError": "\"{package_name}\"은(는) 유효한 패키지 패턴이 아닙니다. 패키지 패턴에는 와일드카드 문자(*)를 하나만 사용해야 하며 패턴의 맨 끝에 써야 합니다(자세한 내용은 {url} 참조).", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "{extension} 파일을 검사하려면 다음을 사용하세요.", "PortBugInvalidCrtLinkage": "다음 이진 파일은 {expected} CRT를 사용해야 합니다.", "PortBugInvalidCrtLinkageEntry": "다음이 포함된 {path} 링크:", + "PortBugKernel32FromXbox": "선택한 삼중 항목은 Xbox를 대상으로 하지만 다음 DLL은 kernel32와 연결됩니다. 이러한 DLL은 kernel32가 없는 Xbox에서 로드할 수 없습니다. 이는 일반적으로 onecore_apiset.lib 또는 xgameplatform.lib와 같은 적절한 우산 라이브러리가 아닌 kernel32.lib와 연결하여 발생합니다.", "PortBugMergeLibCMakeDir": "/lib/cmake 폴더는 /debug/lib/cmake와 병합하고 /share/{package_name}/cmake로 이동해야 합니다. vcpkg-cmake-config 포트에서 `vcpkg_cmake_config_fixup()` 도우미 함수를 사용하세요.`", "PortBugMismatchedNumberOfBinaries": "디버그와 릴리스 이진 파일 수가 일치하지 않습니다.", "PortBugMisplacedCMakeFiles": "/share/{spec} 외부에서 다음 cmake 파일을 찾았습니다. cmake 파일을 /share/{spec}에 배치하세요.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "bin\\ 및/또는 debug\\bin\\을 만들 수 없도록 설정할 수 없는 경우 포트 파일에서 이 항목을 사용하여 제거하세요.", "PortBugRemoveEmptyDirectories": "디렉터리를 채워야 하지만 채워지지 않는 경우 포트 파일에서 오류가 발생할 수 있습니다.\n디렉터리가 필요하지 않고 디렉터리 만들기를 사용하지 않도록 설정할 수 없는 경우 포트 파일에서 다음과 같은 항목을 사용하여 제거하세요.", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE 위 이름 바꾸기에서 빈 디렉터리를 남김)", - "PortBugRestrictedHeaderPaths": "다음 제한된 헤더로 인해 코어 C++ 런타임 및 기타 패키지가 제대로 컴파일되지 않습니다. 예외적인 상황에서는 {env_var}을(를) 통해 이 정책을 사용하지 않도록 설정할 수 있습니다.", + "PortBugRestrictedHeaderPaths": "다음 제한된 헤더로 인해 코어 C++ 런타임 및 기타 패키지가 제대로 컴파일되지 않습니다. 예외적인 상황에서는portfile.cmake에서 CMake 변수 VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS를 설정하여 이 정책을 사용하지 않도록 설정할 수 있습니다.", "PortBugSetDllsWithoutExports": "내보내기가 없는 DLL은 빌드 스크립트의 버그일 수 있습니다. 의도한 경우 포트 파일에서 다음 줄을 추가하세요.\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS 사용)\n다음 DLL에 내보내기가 없습니다.", "PortDependencyConflict": "포트 {package_name}에는 다음과 같은 지원되지 않는 종속성이 있습니다.", "PortDoesNotExist": "{package_name}이(가) 없습니다.", @@ -827,21 +951,26 @@ "PortsDiffHelp": "인수는 체크 아웃할 분기/태그/해시여야 합니다.", "PortsNoDiff": "두 커밋 사이의 포트에 변경 내용이 없습니다.", "PortsRemoved": "다음 {count}개 포트가 제거되었습니다.", - "PortsUpdated": "\n다음 {count}개 포트가 업데이트되었습니다.", + "PortsUpdated": "다음 {count}개 포트가 업데이트되었습니다.", "PrebuiltPackages": "빌드되지 않은 패키지가 있습니다. 빌드하려면 다음을 실행하세요.", "PreviousIntegrationFileRemains": "이전 통합 파일이 제거되지 않았습니다.", "ProgramReturnedNonzeroExitCode": "{tool_name}이(가) 종료 코드 ({exit_code})과(와) 함께 실패했습니다.", "ProvideExportType": "--raw --nuget --ifw --zip --7zip --chocolatey --prefab 옵션 중 하나 이상이 필요합니다.", "PushingVendorFailed": "{vendor}를 \"{path}\"(으)로 푸시하지 못했습니다. 자세한 내용은 --debug를 사용하세요.", - "RegeneratesArtifactRegistry": "아티팩트 레지스트리를 다시 생성합니다.", + "RegeneratesArtifactRegistry": "아티팩트 레지스트리를 다시 생성", "RegistryCreated": "{path}에 레지스트리를 만들었습니다.", "RegistryValueWrongType": "레지스트리 값 {path}은(는) 예기치 않은 유형입니다.", "RemoveDependencies": "매니페스트 모드에서 종속성을 제거하려면 매니페스트(vcpkg.json)을(를) 편집하고 'install'을 실행합니다.", "RemovePackageConflict": "{spec}이(가) 설치되지 않았지만 {triplet}용으로 {package_name}이(가) 설치되었습니다. {package_name}:{triplet}을(를) 의미했나요?", "RemovingPackage": "{action_index}/{count} {spec}을(를) 제거하는 중", "ResponseFileCode": "@response_file", - "RestoredPackage": "\"{path}\"에서 복원된 패키지", - "RestoredPackagesFromVendor": "{elapsed}의 {value}에서 {count} 패키지를 복원했습니다. 자세한 내용을 보려면 --debug를 사용하세요.", + "RestoredPackagesFromAWS": "{elapsed} 후 AWS의 패키지 {count}개를 복원했습니다. 자세한 내용을 보려면 --debug를 사용하세요.", + "RestoredPackagesFromCOS": "{elapsed} 후 COS의 패키지 {count}개를 복원했습니다. 자세한 내용을 보려면 --debug를 사용하세요.", + "RestoredPackagesFromFiles": "{elapsed} 후 {path}의 패키지 {count}개를 복원했습니다. 자세한 내용을 보려면 --debug를 사용하세요.", + "RestoredPackagesFromGCS": "{elapsed} 후 GCS의 패키지 {count}개를 복원했습니다. 자세한 내용을 보려면 --debug를 사용하세요.", + "RestoredPackagesFromGHA": "{elapsed} 후 GitHub Actions 캐시에서 패키지 {count}개를 복원했습니다. 자세한 내용을 보려면 --debug를 사용하세요.", + "RestoredPackagesFromHTTP": "{elapsed} 후 HTTP 서버의 패키지 {count}개를 복원했습니다. 자세한 내용을 보려면 --debug를 사용하세요.", + "RestoredPackagesFromNuGet": "{elapsed} 후 NuGet의 패키지 {count}개를 복원했습니다. 자세한 내용을 보려면 --debug를 사용하세요.", "ResultsHeader": "결과", "ScriptAssetCacheRequiresScript": "필요한 인수: 자산 구성 'x-script'에는 인수로 정확히 exec 템플릿이 필요", "SearchHelp": "인수는 검색할 substring이거나 모든 라이브러리를 표시할 인수가 없어야 합니다.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "디렉터리가 아니므로 {path} 내용 지우기를 건너뜁니다.", "SourceFieldPortNameMismatch": "CONTROL 파일 내의 'Source' 필드 또는 vcpkg.json 파일 내의 \"name\" 필드는 이름이 {package_name}이고 포트 디렉터리 \"{path}\"과(와) 일치하지 않습니다.", "SpecifiedFeatureTurnedOff": "'{command_name}' 기능이 특별히 꺼져 있지만 --{option}이(가) 지정되었습니다.", - "SpecifyDirectoriesContaining": "삼중항 파일이 포함된 디렉터리를 지정합니다.\n(또한: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "포트를 검색할 때 사용할 디렉터리를 지정합니다.\n(또한: '{env_var}')", - "SpecifyHostArch": "호스트 아키텍처 트리플렛을 지정합니다. 'vcpkg help triplet'을 참조하세요.\n(기본값: '{env_var}')", - "SpecifyTargetArch": "대상 아키텍처 트리플렛을 지정합니다. 'vcpkg help triplet'을 참조하세요.\n(기본값: '{env_var}')", + "SpecifyHostArch": "호스트 triplet. 'vcpkg help triplet'(기본값: {env_var}) 참조", + "SpecifyTargetArch": "대상 triplet. 'vcpkg help triplet'(기본값: {env_var}) 참조", "StartCodeUnitInContinue": "계속 위치에서 시작 코드 단위를 찾았습니다.", "StoreOptionMissingSha": "--store 옵션이 sha512 없어 유효하지 않습니다.", - "StoredBinariesToDestinations": "{count}개의 대상에 이진 파일 저장됨.", + "StoredBinariesToDestinations": "{elapsed} 후 대상 {count}개에 이진 파일이 저장됨.", "StoredBinaryCache": "저장된 이진 파일 캐시: \"{path}\"", "SuccessfulyExported": "{package_name}을(를) {path}(으)로 내보냄", "SuggestGitPull": "결과가 오래되었을 수 있습니다. 'git pull'을 실행하여 최신 결과를 가져옵니다.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "vcpkg 이진 파일을 업데이트해야 할 수 있습니다. {command_line}을(를) 실행하여 업데이트해 보세요.", "SupportedPort": "{package_name} 포트가 지원됩니다.", "SwitchUsedMultipleTimes": "'{option}' 전환을 여러 번 지정했습니다.", + "SynopsisHeader": "시놉시스:", "SystemApiErrorMessage": "{exit_code}({error_msg})(으)로 인해 {system_api} 호출에 실패했습니다.", "SystemRootMustAlwaysBePresent": "Windows에서는 SystemRoot 환경 변수가 항상 설정되어야 합니다.", "SystemTargetsInstallFailed": "{path}에 시스템 대상 파일을 설치하지 못했습니다.", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "배열의 후행 쉼표", "TrailingCommaInObj": "개체의 후행 쉼표", "TripletFileNotFound": "삼중 파일 {triplet}.cmake를 찾을 수 없습니다.", + "TripletLabel": "Triplet:", "TwoFeatureFlagsSpecified": "'{value}' 및 -'{value}'이(가) 기능 플래그로 지정되었습니다.", "UnableToClearPath": "{path}을(를) 삭제할 수 없음", "UnableToReadAppDatas": "%LOCALAPPDATA% 및 %APPDATA% 모두 읽을 수 없음", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "레지스트리 '{url}'이(가) 업데이트되지 않았습니다. '{value}'", "UpdateBaselineRemoteGitError": "git에서 원격 리포지토리 '{url}'을(를) 가져오지 못했습니다.", "UpdateBaselineUpdatedBaseline": "업데이트된 레지스트리 '{url}': 기준 '{old_value}' -> '{new_value}'", - "UpgradeInManifest": "업그레이드 명령은 현재 매니페스트 모드를 지원하지 않습니다. 대신 vcpkg.json을 수정하고 설치를 실행하세요.", + "UpgradeInManifest": "업그레이드하면 클래식 모드 설치가 업그레이드되므로 매니페스트 모드를 지원하지 않습니다. vcpkg x-update-baseline을 사용하여 기준을 현재 값으로 업데이트하고 vcpkg 설치를 실행하여 종속성을 업데이트하는 것이 좋습니다.", "UpgradeRunWithNoDryRun": "위의 패키지를 다시 빌드하려는 경우 --no-dry-run 옵션을 사용하여 이 명령을 실행합니다.", "UploadedBinaries": "이진 파일을 {count} {vendor}에 업로드했습니다.", "UploadedPackagesToVendor": "{count}개의 패키지를 {elapsed}에서 {vendor}에 업로드함", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "잘못된 명령: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "환경 변수 X_VCPKG_REGISTRIES_CACHE 값이 디렉터리가 아닙니다. {path}", "VcpkgRootRequired": "독립 실행형 부트스트랩에는 VCPKG_ROOT 설정이 필요합니다.", - "VcpkgRootsDir": "vcpkg 루트 디렉터리를 지정합니다.\n(기본값: '{env_var}')", + "VcpkgRootsDir": "vcpkg 루트 디렉터리(기본값: {env_var})", "VcpkgSendMetricsButDisabled": "--sendmetrics를 전달했지만 메트릭이 비활성화되었습니다.", + "VcpkgUsage": "사용법: vcpkg <명령> [--switches] [--options=values] [arguments] @response_file", "VcvarsRunFailed": "Visual Studio 환경을 가져오기 위한 vcvarsall.bat를 실행하지 못함", "VcvarsRunFailedExitCode": "Visual Studio 환경을 가져오려고 하는 동안 vcvarsall.bat이 {exit_code}을(를) 반환함", "VersionBaselineMismatch": "최신 버전은 {expected}이지만 기본 파일에는 {actual}이(가) 포함되어 있습니다.\n실행:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\n기본 버전을 업데이트합니다.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "{package_name}은(는) {path}에 버전 데이터베이스 파일이 없습니다.\n실행:\nvcpkg x-add-version {package_name}\n버전 파일을 만듭니다.", "VersionGitEntryMissing": "{version}의 {package_name}에 대한 버전 데이터베이스 항목이 없습니다.\n사용 가능한 버전:", "VersionInDeclarationDoesNotMatch": "파일에 선언된 버전이 체크 아웃된 버전과 일치하지 않습니다. {version}", - "VersionIncomparable1": "{spec}의 버전 충돌: {package_name}에 {expected}이(가) 필요하지만 vcpkg는 {actual}에 비교할 수 없습니다.\n비교할 수 없는 스키마를 사용한 두 버전은 다음과 같습니다.", - "VersionIncomparable2": "\"{version}\"은(는) 스키마 {new_scheme}입니다.", - "VersionIncomparable3": "이는 기본 설정 버전에 명시적 재정의를 추가하여 해결할 수 있습니다. 예:", - "VersionIncomparable4": "자세한 내용은 'vcpkg 도움말 버전 관리'를 참조하세요.", + "VersionIncomparable1": "{spec}의 버전 충돌: {constraint_origin}에 {expected}이(가) 필요하므로 기준 버전 {actual}과(와) 비교할 수 없습니다.", + "VersionIncomparable2": "{version_spec}에 {new_scheme} 체계가 있음", + "VersionIncomparable3": "이 문제는 기본 설정 버전에 명시적 재정의를 추가하여 해결할 수 있습니다. 예:", + "VersionIncomparable4": "자세한 내용은 'vcpkg 도움말 버전 관리' 또는 {url}을(를) 참조하세요.", + "VersionIncomparableSchemeString": "두 버전 모두 체계 문자열이 있지만 기본 텍스트가 다릅니다.", + "VersionIncomparableSchemes": "버전에 호환되지 않는 체계가 있습니다.", "VersionInvalidDate": "`{version}`은(는) 올바른 날짜 버전이 아닙니다. 날짜는 YYYY-MM-DD 형식을 따라야 하며 명확성은 선행 0이 없는 점으로 구분된 양의 정수 값이어야 합니다.", "VersionInvalidRelaxed": "`{version}`은(는) 올바른 완화 버전이 아닙니다(임의의 숫자 요소 개수가 있는 semver).", "VersionInvalidSemver": "'{version}'은(는) 올바른 의미 체계 버전이 아닙니다. 를 참조하세요.", "VersionMissing": "버전 관리 필드(버전, 버전 날짜, 버전 셈버 또는 버전 문자열 중 하나)가 필요합니다.", - "VersionMissingRequiredFeature": "{spec}@{version}에 필수 기능 {feature}이(가) 없습니다.", + "VersionMissingRequiredFeature": "{version_spec}에 {constraint_origin}에 필요한 기능 {feature}이(가) 없음", "VersionNotFound": "{expected}을(를) 사용할 수 없습니다. {actual}만 사용할 수 있습니다.", - "VersionNotFoundDuringDiscovery": "검색하는 동안 버전을 찾을 수 없었습니다. {spec}@{version}\n내부 vcpkg 오류입니다. 문제를 재현하기위한 자세한 단계와 함께 https://github.com/microsoft/vcpkg에서 문제를 열어주세요.", - "VersionNotFoundInVersionsFile": "버전 파일에서 버전 {version}을(를) 찾을 수 없습니다.\n실행:\nvcpkg x-add-version {package_name}\n새 포트 버전을 추가합니다.", + "VersionNotFoundInVersionsFile": "{package_name}의 버전 파일에서 버전 {version}을(를) 찾을 수 없습니다.\n실행:\nvcpkg x-add-version {package_name}\n새 포트 버전을 추가합니다.", "VersionRejectedDueToBaselineMissing": "{path}에서 \"{json_field}\"를 사용하고 \"builtin-baseline\"이 없으므로 {path}가 거부되었습니다. 이 문제는 \"{json_field}\"의 사용을 제거하거나 \"builtin-baseline\"을 추가하여 해결할 수 있습니다.\n자세한 내용은 `vcpkg help versioning`를 참조하세요.", "VersionRejectedDueToFeatureFlagOff": "{path}에서 \"{json_field}\"를 사용하고 `versions` 기능 플래그가 비활성화되어 있으므로 {path}가 거부되었습니다. 이 문제는 \"{json_field}\"를 제거하거나 `versions` 기능 플래그를 활성화하여 해결할 수 있습니다.\n자세한 내용은 `vcpkg help versioning`를 참조하세요.", "VersionSchemeMismatch": "버전 데이터베이스는 {version}을(를) {expected}(으)로 선언하지만 {path}은(는) {actual}(으)로 선언합니다. 버전은 서로 다른 체계로 선언된 경우에도 고유해야 합니다.\n실행:\nvcpkg x-add-version {package_name} --overwrite-version\n버전 데이터베이스에 선언된 체계를 포트에 선언된 스키마로 덮어씁니다.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "버전 텍스트의 '#' 다음에는 포트 버전(음이 아닌 정수)이 와야 합니다.", "VersionSpecMismatch": "버전이 일치하지 않아 포트를 로드하지 못했습니다. 파일 \"{path}\"에 {actual_version} 버전이 포함되어 있지만 버전 데이터베이스는 {expected_version}이어야 한다고 표시합니다.", "VersionTableHeader": "버전", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "확인: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "자식 프로세스가 종료되기를 기다리는 중...", "WaitingToTakeFilesystemLock": "{path}에 대한 파일 시스템 잠금을 기다리는 중...", "WarnOnParseConfig": "구성 {path}에서 다음 경고가 발견되었습니다.", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "{version} 버전 유효성을 검사하는 동안", "WindowsOnlyCommand": "이 명령은 Windows만 지원합니다.", "WroteNuGetPkgConfInfo": "NuGet 패키지 구성 정보를 {path}에 기록함", - "UnrecognizedCommand$": "인식할 수 없는 명령 '${p0}'", - "Use$ToGetHelp": "${p0}을(를) 사용하여 도움말 보기", - "FatalTheRootFolder$CanNotBeCreated": "치명적: 루트 폴더 '${p0}'을(를) 만들 수 없습니다.", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "치명적: 전역 구성 파일 '${p0}'을(를) 만들 수 없습니다.", + "FatalTheRootFolder$CannotBeCreated": "치명적: 루트 폴더 '${p0}'을(를) 만들 수 없습니다.", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "치명적: 전역 구성 파일 '${p0}'을(를) 만들 수 없습니다.", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND가 설정되지 않았습니다.", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "vcpkg를 실행하면 내부적으로 0이 아닌 종료 코드가 반환됨: ${p0}", "failedToDownloadFrom$": "${p0}에서 다운로드하지 못했습니다.", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "설명은 'string' 형식이어야 하는데 '${p0}'이(가) 있습니다.", "optionsShouldBeASequenceFound$": "옵션은 시퀀스여야 하는데 '${p0}'이(가) 있습니다.", "DuplicateKeysDetectedInManifest$": "매니페스트에서 검색된 중복 키: '${p0}'", - "in$Skipping$BecauseItIsA$": "${p0}에서 ${p1}은(는) ${p2}이므로 건너뜁니다.", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "포스트스크립트 파일 없음: 실행 파일이 아닌 vcpkg 셸 함수로 다시 실행", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "활성화 중에 중복 정의 ${p0}. 새로운 가치는 오래된 것을 대체할 것입니다.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "활성화 중에 중복 도구가 ${p0}(으)로 선언되었습니다. 새로운 값은 오래된 값을 대체할 것입니다.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(진행 상황을 알 수 없음)", "verifying": "확인 중", "downloading$$": "${p0} -> ${p1} 다운로드 중", - "unpacking": "압축을 푸는 중", "unpacking$": "${p0} 압축을 푸는 중", "Installing$": "${p0} 설치 중...", "$AlreadyInstalled": "${p0}이(가) 이미 설치되었습니다.", "Downloading$": "${p0} 다운로드 중...", "Unpacking$": "${p0}의 압축을 푸는 중...", "ErrorInstalling$$": "${p0} - ${p1} 설치 오류", - "ExpectedASingleValueFor$FoundMultiple": "${p0}에 대한 단일 값이 필요하지만 - 여러 값을 찾았습니다.", - "Synopsis": "시놉시스", - "Description": "설명", - "Switches": "스위치", - "SeeAlso": "참고 항목", "error": "오류:", "warning": "경고:", + "ExpectedASingleValueFor$FoundMultiple": "${p0}에 대한 단일 값이 필요하지만 - 여러 값을 찾았습니다.", "ExpectedASingleValueFor$": "'--${p0}'에 대해 단일 값이 필요합니다.", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "'${p0}'이 맞다고 가정합니다. 이 메시지를 표시하지 않으려면 아티팩트 메타데이터에 해시를 제공하세요.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "다운로드한 파일 '${p0}'에 올바른 해시가 없습니다(${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "'${p1}'에서 일치하지 않는 ${p0}을(를) 찾았습니다. 리터럴 ${p2}의 경우 ${p3}${p4}을(를) 대신 사용하세요.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "'${p1}'에서 {${p0}}에 대한 값을 찾을 수 없습니다. 리터럴 값을 쓰려면 '{{${p2}}}'를 대신 사용하세요.", "MatchedMoreThanOneInstallBlock$": "둘 이상의 설치 블록 [${p0}]과(와) 일치했습니다.", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "활성화하지 않고 프로젝트에서 참조하는 모든 항목 획득", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "이를 통해 소비자는 프로젝트에 필요한 도구를 미리 다운로드할 수 있습니다.", "UnableToFindProjectInFolderorParentFoldersFor$": "${p0}에 대한 폴더(또는 상위 폴더)에서 프로젝트를 찾을 수 없습니다.", "UnableToAcquireProject": "프로젝트를 가져올 수 없습니다.", - "AcquireArtifactsInTheRegistry": "레지스트리에서 아티팩트 획득", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "이를 통해 소비자는 아티팩트를 획득(다운로드 및 압축 풀기)할 수 있습니다. 아티팩트가 활성화되어 있어야 사용할 수 있습니다.", "NoArtifactsSpecified": "아티팩트가 지정되지 않았습니다.", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "여러 패키지가 지정되었지만 동일한 수의 ${p0} 스위치가 아님", "NoArtifactsAreAcquired": "획득한 아티팩트가 없습니다.", "AllArtifactsAreAlreadyInstalled": "모든 아티팩트가 이미 설치되었습니다.", "$ArtifactsInstalledSuccessfully": "${p0} 아티팩트가 설치되었습니다.", "InstallationFailedStopping": "설치 실패 -- 중지", - "ActivatesTheToolsRequiredForAProject": "프로젝트에 필요한 도구 활성화", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "이를 통해 소비자는 프로젝트에 필요한 도구를 활성화할 수 있습니다. 도구가 아직 설치되지 않은 경우 활성화 전에 도구를 강제로 다운로드하여 설치합니다.", - "AddsAnArtifactToTheProject": "프로젝트에 아티팩트를 추가합니다.", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "이렇게 하면 소비자가 프로젝트에 아티팩트를 추가할 수 있습니다. 또한 프로젝트도 활성화됩니다.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "여러 아티팩트가 지정되었지만 동일한 수의 ${p0} 스위치가 아님", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "아티팩트 [${p0}]:${p1}을(를) 추가하려고 했지만 사용할 레지스트리를 확인할 수 없습니다.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "레지스트리 ${p0}을(를) ${p1}(으)로 추가하려고 했지만 이미 ${p2}입니다. ${p3}을(를) 이 프로젝트에 수동으로 추가하고 다시 시도하세요.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "\\'vcpkg activate\\'를 실행하여 현재 터미널에 적용", - "ManagesTheDownloadCache": "다운로드 캐시 관리", "DownloadsFolderCleared$": "다운로드 폴더 삭제됨(${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "모든 항목(캐시, 설치된 아티팩트)을 정리합니다.", - "cleansOutTheDownloadsCache": "다운로드 캐시를 정리합니다.", - "removesAllTheArtifactsThatAreInstalled": "설치된 모든 아티팩트를 제거합니다.", - "cleansUp": "정리", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "사용자가 캐시, 설치된 아티팩트 등을 정리할 수 있습니다.", "InstalledArtifactFolderCleared$": "설치된 Artifact 폴더가 지워짐(${p0}) ", "CacheFolderCleared$": "캐시 폴더 삭제됨(${p0}) ", - "DeactivatesTheCurrentSession": "현재 세션을 비활성화합니다.", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "이를 통해 소비자는 현재 활성 세션에 대한 환경 설정을 제거할 수 있습니다.", - "DeletesAnArtifactFromTheArtifactFolder": "아티팩트 폴더에서 아티팩트를 삭제합니다.", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "이렇게 하면 소비자가 디스크에서 아티팩트를 제거할 수 있습니다.", "DeletingArtifact$From$": "${p1}에서 ${p0} 아티팩트 삭제", - "FindArtifactsInTheRegistry": "레지스트리에서 아티팩트 찾기", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "이렇게 하면 사용자가 몇 가지 조건에 따라 아티팩트 찾을 수 있습니다.", "NoArtifactsFoundMatchingCriteria$": "기준과 일치하는 아티팩트 없음: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "프로젝트에 대해 아무것도 다운로드하지 않고 활성화를 위한 MSBuild 속성을 생성합니다.", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props에는 --msbuild-props가 필요합니다.", "UnableToActivateProject": "프로젝트를 활성화할 수 없습니다.", - "theNameOfTheCommandForWhichYouWantHelp": "도움말을 보려는 명령의 이름", - "getHelpOn$OrOneOfTheCommands": "${p0} 또는 명령 중 하나에 대한 도움말 보기", - "GetsDetailedHelpOn$OrOneOfTheCommands": "${p0} 또는 명령 중 하나에 대한 자세한 도움말을 얻습니다.", - "Arguments": "인수:", - "Use$ToGetTheListOfAvailableCommands": "${p0}을(를) 사용하여 사용 가능한 명령 목록 가져오기", - "Usage": "사용법", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "사용 가능한 ${p0} 명령:", - "ListsTheArtifacts": "아티팩트를 나열합니다.", - "ThisAllowsTheConsumerToListArtifacts": "이렇게 하면 소비자가 아티팩트 목록을 표시할 수 있습니다.", - "regenerateTheIndexForARegistry": "레지스트리에 대한 인덱스 다시 생성", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "이렇게 하면 사용자가 ${p1} 레지스트리에 대한 ${p0} 파일을 다시 생성할 수 있습니다.", "RegeneratingIndexFor$": "${p0}에 대한 인덱스 다시 생성 중", "RegenerationCompleteIndexContains$MetadataFiles": "다시 생성 완료. 인덱스에는 ${p0} 메타데이터 파일이 포함되어 있습니다.", "Registry$ContainsNoArtifacts": "레지스트리: '${p0}'에 아티팩트가 없습니다.", "error$": "오류 ${p0}: ", - "RemovesAnArtifactFromAProject": "프로젝트에서 아티팩트를 제거합니다.", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "이를 통해 소비자는 프로젝트에서 아티팩트를 제거할 수 있습니다. 이 창에서 강제로 다시 활성화합니다.", "Removing$FromProjectManifest": "프로젝트 매니페스트에서 ${p0} 제거", "unableToFindArtifact$InTheProjectManifest": "프로젝트 매니페스트에서 아티팩트 ${p0}을(를) 찾을 수 없습니다.", - "updateTheRegistryFromTheRemote": "원격에서 레지스트리 업데이트", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "원격 서비스에서 레지스트리의 최신 콘텐츠를 다운로드합니다.", - "DownloadingRegistryData": "레지스트리 데이터 다운로드", - "Updated$RegistryContains$MetadataFiles": "${p0}을(를) 업데이트했습니다. 레지스트리에 ${p1}개의 메타데이터 파일이 포함되어 있습니다.", - "UnableToDownloadRegistrySnapshot": "레지스트리 스냅샷을 다운로드할 수 없습니다.", - "UnableToFindRegistry$": "레지스트리 ${p0}을(를) 찾을 수 없습니다.", - "ArtifactRegistryDataIsNotLoaded": "Artifact Registry 데이터가 로드되지 않음", - "AttemptingToUpdateArtifactRegistry": "아티팩트 레지스트리 업데이트 시도", - "UnableToLoadRegistryIndex": "레지스트리 인덱스를 로드할 수 없습니다.", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "프로젝트 외부의 아티팩트를 즉시 활성화합니다.", - "ThisWillInstantlyActivateAnArtifact": "그러면 아티팩트가 즉시 활성화됩니다.", + "Updated$ItContains$MetadataFiles": "${p0}을(를) 업데이트했습니다. 여기에는 ${p1} 메타데이터 파일이 포함되어 있습니다.", + "UnableToDownload$": "${p0}을(를) 다운로드할 수 없습니다.", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0}을(를) 업데이트할 수 없습니다. 형식이 잘못되었을 수 있습니다.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "x-update-registry 명령은 새 레지스트리 정보를 다운로드하므로 로컬 레지스트리와 함께 사용할 수 없습니다. x-재생성 ${p0}을(를) 의미했습니까?", + "UnableToFindRegistry$": "${p0} 레지스트리를 찾을 수 없습니다.", "NoArtifactsAreBeingAcquired": "획득 중인 아티팩트가 없습니다.", - "removesAllFilesInTheLocalCache": "로컬 캐시의 모든 파일을 제거합니다.", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "디버그 모드를 사용하도록 설정하고 ${p0}의 작동 방식에 대한 내부 메시지를 표시합니다.", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "확인 없이 (잠재적으로 위험한) 작업 진행", - "showsTheinstalledArtifacts": "설치된 아티팩트 표시", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "사용자가 제공한 경로를 사용하여 환경 변수 및 기타 속성을 json 파일로 덤프합니다.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "MSBuild 속성이 기록될 파일의 전체 경로입니다.", - "ApplyAnyDeprecationFixups": "지원 중단 수정 사항을 적용합니다.", - "overrideThePathToTheProjectFolder": "프로젝트 폴더의 경로를 재정의합니다.", - "UnableToFindProjectEnvironment$": "프로젝트 환경 ${p0}을(를) 찾을 수 없습니다.", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "자세한 정보 표시 모드를 사용하도록 설정하고 프로세스에 대한 자세한 메시지를 표시합니다.", - "aVersionOrVersionRangeToMatch": "일치시킬 버전 또는 버전 범위" + "UnableToFindProjectEnvironment$": "프로젝트 환경 ${p0}을(를) 찾을 수 없습니다." } diff --git a/locales/messages.pl.json b/locales/messages.pl.json index 2f3851d5ee..38ad0e1a0a 100644 --- a/locales/messages.pl.json +++ b/locales/messages.pl.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "wbudowany rejestr", "AConfigurationObject": "obiekt konfiguracji", "ADateVersionString": "ciąg wersji daty", + "ADefaultFeature": "funkcja domyślna", "ADemandObject": "obiekt żądania", "ADependency": "zależność", + "ADependencyFeature": "funkcja zależności", "ADictionaryOfContacts": "słownik kontaktów", "AFeature": "funkcja", + "AFeatureName": "nazwa funkcji", "AFilesystemRegistry": "rejestr systemu plików", "AGitObjectSha": "SHA obiektu Git", "AGitReference": "odwołanie Git (na przykład gałąź)", @@ -37,19 +40,19 @@ "AStringStringDictionary": "słownik „string”: „string”", "AUrl": "adres URL", "AVcpkgRepositoryCommit": "zatwierdzenie repozytorium vcpkg", - "AVersionConstraint": "wskaźnik wersji", + "AVersionConstraint": "ograniczenie wersji", "AVersionDatabaseEntry": "wpis bazy danych wersji", "AVersionObject": "obiekt wersji", "AVersionOfAnyType": "wersja dowolnego typu", "AddArtifactOnlyOne": "„{command_line}” może dodać tylko jeden artefakt naraz.", "AddCommandFirstArg": "Pierwszym parametrem do dodania musi być „artefakt” lub „port”.", "AddFirstArgument": "Pierwszym argumentem polecenia „{command_line}” musi być „artefakt” lub „port”.", - "AddHelp": "Dodaje wskazany port lub artefakt do manifestu skojarzonego z bieżącym katalogiem.", "AddPortRequiresManifest": "'{command_line}' wymaga aktywnego pliku manifestu.", "AddPortSucceeded": "Pomyślnie dodano porty do pliku vcpkg.json.", "AddRecurseOption": "Jeśli na pewno chcesz je usunąć, uruchom polecenie z opcją --recurse.", "AddTripletExpressionNotAllowed": "Wyrażenia potrójne są niedozwolone w tym miejscu. Zamiast tego możesz zmienić „{package_name}:{triplet}” na „{package_name}”.", "AddVersionAddedVersionToFile": "dodano wersję {version} do ścieżki {path}", + "AddVersionArtifactsOnly": "Parametr --version jest tylko dla artefaktów i nie można go używać z portem dodawania vcpkg", "AddVersionCommitChangesReminder": "Czy pamiętasz o zatwierdzeniu zmian?", "AddVersionCommitResultReminder": "Nie zapomnij zatwierdzić wyniku!", "AddVersionDetectLocalChangesError": "pomijanie wykrywania zmian lokalnych z powodu nieoczekiwanego formatu w danych wyjściowych stanu git", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "pliki zaewidencjonowane dla pakietu {package_name} zostały zmienione, ale wersja nie została zaktualizowana", "AddVersionPortFilesShaUnchanged": "pliki zaewidencjonowane dla pakietu {package_name} nie uległy zmianie od wersji {version}", "AddVersionPortHasImproperFormat": "Pakiet {package_name} jest niepoprawnie sformatowany", - "AddVersionSuggestNewVersionScheme": "Użyj schematu wersji „{new_scheme}” zamiast „{old_scheme}” w pakiecie portu „{package_name}”.\nUżyj parametru --{option}, aby wyłączyć tę kontrolę.", + "AddVersionSuggestNewVersionScheme": "Użycie schematu wersji „{new_scheme}” zamiast „{old_scheme}” w porcie „{nazwa_pakietu}”.\nUżyj --{opcja} aby wyłączyć to sprawdzanie.", "AddVersionUnableToParseVersionsFile": "nie można przeanalizować ścieżki pliku wersji {path}", "AddVersionUncommittedChanges": "istnieją niezatwierdzone zmiany dla pakietu {package_name}", "AddVersionUpdateVersionReminder": "Czy pamiętasz o zaktualizowaniu wersji lub wersji portu?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "Już zainstalowano {spec}", "AlreadyInstalledNotHead": "{spec} jest już zainstalowana — nie kompilowanie z nagłówka", "AmbiguousConfigDeleteConfigFile": "Niejednoznaczna konfiguracja vcpkg dostarczona zarówno przez plik manifestu, jak i plik konfiguracji.\n-- Usuń plik konfiguracji {path}", + "AnArrayOfDefaultFeatures": "tablica funkcji domyślnych", "AnArrayOfDependencies": "tablica zależności", "AnArrayOfDependencyOverrides": "tablica zastąpień zależności", + "AnArrayOfFeatures": "tablica funkcji", "AnArrayOfIdentifers": "tablica identyfikatorów", "AnArrayOfOverlayPaths": "tablica ścieżek nakładek", "AnArrayOfOverlayTripletsPaths": "tablica ścieżek nakładanych trójkątów", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "Inna instalacja jest w toku na maszynie, uśpienie na 6 s przed ponowieniem próby.", "AppliedUserIntegration": "Zastosowano integrację na poziomie użytkownika dla tego katalogu głównego menedżera vcpkg.", "ApplocalProcessing": "Przetwarzanie applocal vcpkg: {path}", + "ArtifactsBootstrapFailed": "Element vcpkg-artifacts nie jest zainstalowany i nie można go uruchomić.", + "ArtifactsNotInstalledReadonlyRoot": "Element vcpkg-artifacts nie jest zainstalowany i nie można go zainstalować, ponieważ zakłada się, że VCPKG_ROOT jest tylko do odczytu. Ponowne zainstalowanie programu vcpkg przy użyciu polecenia „one liner” może rozwiązać ten problem.", + "ArtifactsNotOfficialWarning": "Korzystanie z artefaktów vcpkg z nieoficjalnym ", "ArtifactsOptionIncompatibility": "Opcja --{option} nie ma wpływu na znajdowanie artefaktu.", + "ArtifactsOptionJson": "Pełna ścieżka do pliku JSON, w którym są rejestrowane zmienne środowiskowe i inne właściwości", + "ArtifactsOptionMSBuildProps": "Pełna ścieżka do pliku, w którym zostaną zapisane właściwości programu MSBuild", + "ArtifactsOptionVersion": "Wersja lub zakres wersji do dopasowania; prawidłowe tylko dla artefaktów", + "ArtifactsOptionVersionMismatch": "Liczba przełączników --version musi być zgodna z liczbą nazwanych artefaktów", + "ArtifactsSwitchARM": "Wymusza wykrywanie hosta na usługę ARM podczas uzyskiwania artefaktów", + "ArtifactsSwitchARM64": "Wymusza wykrywanie hosta na architekturze arm64 podczas uzyskiwania artefaktów", + "ArtifactsSwitchAll": "Aktualizowanie wszystkich znanych rejestrów artefaktów", + "ArtifactsSwitchAllLanguages": "Uzyskuje wszystkie pliki językowe podczas uzyskiwania artefaktów", + "ArtifactsSwitchForce": "Wymusza ponowne uzyskanie, jeśli artefakt został już uzyskany", + "ArtifactsSwitchFreebsd": "Wymusza wykrywanie hosta na system FreeBSD podczas uzyskiwania artefaktów", + "ArtifactsSwitchLinux": "Wymusza wykrywanie hosta w systemie Linux podczas uzyskiwania artefaktów", + "ArtifactsSwitchNormalize": "Stosuje wszelkie poprawki wycofania", + "ArtifactsSwitchOnlyOneHostPlatform": "Można ustawić tylko jedną platformę hosta (--x64, --x86, --arm, --arm64).", + "ArtifactsSwitchOnlyOneOperatingSystem": "Można ustawić tylko jeden system operacyjny (--windows, --osx, --linux, --freebsd).", + "ArtifactsSwitchOnlyOneTargetPlatform": "Można ustawić tylko jedną platformę docelową (--target:x64, --target:x86, --target:arm, --target:arm64).", + "ArtifactsSwitchOsx": "Wymusza wykrywanie hosta w systemie MacOS podczas uzyskiwania artefaktów", + "ArtifactsSwitchTargetARM": "Ustawia wykrywanie obiektu docelowego na usługę ARM podczas uzyskiwania artefaktów", + "ArtifactsSwitchTargetARM64": "Ustaw wykrywanie obiektu docelowego na architekturę ARM64 podczas uzyskiwania artefaktów", + "ArtifactsSwitchTargetX64": "Ustaw wykrywanie obiektu docelowego na architekturę x64 podczas uzyskiwania artefaktów", + "ArtifactsSwitchTargetX86": "Ustaw element docelowy na architekturę x86 podczas uzyskiwania artefaktów", + "ArtifactsSwitchWindows": "Wymusza wykrywanie hosta na system Windows podczas uzyskiwania artefaktów", + "ArtifactsSwitchX64": "Wymusza wykrywanie hosta na architekturę x64 podczas uzyskiwania artefaktów", + "ArtifactsSwitchX86": "Wymusza wykrywanie hosta na architekturze x86 podczas uzyskiwania artefaktów", "AssetCacheProviderAcceptsNoArguments": "nieoczekiwane argumenty: „{value}” nie akceptuje argumentów", - "AssetSourcesArg": "Dodaj źródła buforowania zasobów. Zobacz „vcpkg help assetcaching”.", + "AssetSourcesArg": "Źródła buforowania zasobów. Zobacz „vcpkg help assetcaching”", "AttemptingToFetchPackagesFromVendor": "Próba pobrania następującej liczby pakietów od dostawcy {vendor}: {count}", "AttemptingToSetBuiltInBaseline": "próba ustawienia wbudowanego punktu odniesienia w pliku vcpkg.json podczas zastępowania rejestru domyślnego w pliku vcpkg-configuration.json.\n zostanie użyty rejestr domyślny z pliku vcpkg-configuration.json.", "AuthenticationMayRequireManualAction": "Co najmniej jeden dostawca poświadczeń {vendor} zażądał wykonania akcji ręcznej. Dodaj źródło binarne „interactive”, aby zezwolić na interakcyjność.", "AutoSettingEnvVar": "-- Automatyczne ustawianie zmiennych środowiskowych {env_var} na stronie „{url}”.", "AutomaticLinkingForMSBuildProjects": "Wszystkie projekty platformy MSBuild w języku C++ mogą teraz #include każdą zainstalowaną bibliotekę. Łączenie będzie obsługiwane automatycznie. Zainstalowanie nowych bibliotek spowoduje ich natychmiastowe udostępnienie.", - "AvailableArchitectureTriplets": "Dostępne tryplety architektury:", + "AutomaticLinkingForVS2017AndLater": "Program Visual Studio 2017 i nowsze wersje mogą teraz #zawierać wszystkie zainstalowane biblioteki. Łączenie będzie obsługiwane automatycznie. Zainstalowanie nowych bibliotek spowoduje ich natychmiastowe udostępnienie.", "AvailableHelpTopics": "Dostępne tematy pomocy:", "AzUrlAssetCacheRequiresBaseUrl": "nieoczekiwane argumenty: konfiguracja zasobu „azurl” wymaga podstawowego adresu URL", "AzUrlAssetCacheRequiresLessThanFour": "nieoczekiwane argumenty: konfiguracja zasobu „azurl” wymaga mniej niż 4 argumenty", "BaselineConflict": "Określenie pliku vcpkg-configuration.default-registry w pliku manifestu powoduje konflikt z wbudowanym punkt odniesienia.\nUsuń jedno z tych ustawień powodujących konflikt.", "BaselineFileNoDefaultField": "Plik punktu odniesienia w zatwierdzeniu {commit_sha} był nieprawidłowy (brak pola „default”).", - "BaselineFileNoDefaultFieldPath": "plik punktu odniesienia w ścieżce {path} był nieprawidłowy (brak pola „default”)", "BaselineGitShowFailed": "podczas wyewidencjonowywania punktu odniesienia z „{commit_sha}” zatwierdzania nie można wykonać operacji „git show” versions/baseline.json. Ten problem można naprawić, pobierając zatwierdzenia za pomocą polecenia „git fetch”.", "BaselineMissing": "Nie znaleziono wersji punktu odniesienia. Uruchom:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\nw celu ustawienia wersji {version} jako wersji punktu odniesienia.", - "BaselineMissingDefault": "Plik baseline.json z zatwierdzenia `\"{commit_sha}\"` w repozytorium {url} był nieprawidłowy (nie zawierał pola „default”).", - "BinarySourcesArg": "Dodaj źródła buforowania binarnego. Zobacz „vcpkg help binarycaching”.", + "BinaryCacheVendorHTTP": "Serwery HTTP", + "BinarySourcesArg": "Binarne źródła buforowania. Zobacz „vcpkg help binarycaching”", "BinaryWithInvalidArchitecture": "{path}\nOczekiwano: {expected}, ale było {actual}", "BuildAlreadyInstalled": "{spec} jest już zainstalowana; usuń {spec} przed podjęciem próby jej skompilowania.", "BuildDependenciesMissing": "Polecenie kompilacji wymaga zainstalowania wszystkich zależności.\nBrak następujących zależności:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "POWODZENIE", "BuildResultSummaryHeader": "PODSUMOWANIE DLA :{triplet}", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(Eksperymentalne) Określ katalog główny elementu buildtrees.", + "BuildTreesRootDir": "Katalog Buildtrees (eksperymentalny)", "BuildTroubleshootingMessage1": "Upewnij się, że używasz najnowszych plików portów z elementami „git pull” i „vcpkg update”.\nNastępnie sprawdź, czy występują znane problemy pod adresem:", "BuildTroubleshootingMessage2": "Możesz przesłać nowy problem pod adresem:", "BuildTroubleshootingMessage3": "W tytule raportu o usterce wpisz „[{package_name}] Błąd kompilacji”, w opisie usterki podaj następujące informacje o wersji oraz dołącz wszelkie odpowiednie dzienniki błędów z powyższych.", "BuildTroubleshootingMessage4": "Podczas zgłaszania problemu użyj wstępnie wypełnionego szablonu ze ścieżki {path}.", - "BuildTroubleshootingMessageGH": "Możesz również przesłać problem, uruchamiając polecenie (należy zainstalować interfejs wiersza polecenia usługi GitHub):", + "BuildTroubleshootingMessageGH": "Możesz również przesłać problem, uruchamiając (należy zainstalować interfejs wiersza polecenia usługi GitHub):", "BuildingFromHead": "Trwa kompilowanie {spec} z nagłówka...", "BuildingPackage": "Trwa kompilowanie {spec}...", "BuildingPackageFailed": "kompilowanie {spec} nie powiodło się. {build_result}", "BuildingPackageFailedDueToMissingDeps": "z powodu następujących brakujących zależności:", - "BuiltInTriplets": "Wbudowane tryplety vcpkg:", + "BuiltInTriplets": "Wbudowane trójki:", "BuiltWithIncorrectArchitecture": "Następujące pliki zostały skompilowane dla nieprawidłowej architektury:", "CISettingsExclude": "Rozdzielana przecinkami lista portów do pominięcia", "CISettingsOptCIBase": "Ścieżka do pliku ci.baseline.txt. Służy do pomijania portów i wykrywania regresji.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "Plik wyjściowy wszystkich określonych skrótów pakietów", "CISettingsOptParentHashes": "Plik do odczytu skrótów pakietu dla nadrzędnego stanu ciągłej integracji w celu zmniejszenia zestawu zmienionych pakietów", "CISettingsOptSkippedCascadeCount": "Potwierdza, że liczba parametrów --exclude i obsługujących pominięcia jest dokładnie równa tej liczbie", - "CISettingsOptXUnit": "Plik do wyników wyjściowych w formacie XUnit (wewnętrzny)", - "CISettingsVerifyGitTree": "Sprawdź, czy każdy obiekt drzewa Git jest zgodny z jego zadeklarowaną wersją (jest to bardzo wolne działanie)", - "CISettingsVerifyVersion": "Wydrukuj wynik dla każdego portu zamiast tylko błędów.", - "CISwitchOptAllowUnexpectedPassing": "Wskazuje, że wyniki „Przekazywanie, usuwanie z listy błędów” nie powinny być emitowane.", + "CISettingsOptXUnit": "Plik do wyników wyjściowych w formacie XUnit", + "CISettingsVerifyGitTree": "Sprawdza, czy każdy obiekt drzewa git pasuje do zadeklarowanej wersji (jest to bardzo powolne działanie)", + "CISettingsVerifyVersion": "Drukuje wynik dla każdego portu, a nie tylko dla błędów", + "CISkipInstallation": "Następujące pakiety są już zainstalowane i nie zostaną utworzone ponownie:", + "CISwitchOptAllowUnexpectedPassing": "Pomija wyniki „Przekazywanie, usuwanie z listy niepowodzeń”", "CISwitchOptDryRun": "Wydrukuj plan bez wykonywania", "CISwitchOptRandomize": "Losowe określanie kolejności instalacji", - "CISwitchOptSkipFailures": "Wskazuje, że porty oznaczone jako „=fail” w pliku ci.baseline.txt powinny zostać pominięte.", - "CISwitchOptXUnitAll": "Zgłoś również niezmienione porty do danych wyjściowych XUnit (wewnętrzne)", + "CISwitchOptSkipFailures": "Pomija porty oznaczone `=fail` w ci.baseline.txt", + "CISwitchOptXUnitAll": "Raportuje niezmienione porty w danych wyjściowych XUnit", "CMakeTargetsUsage": "{package_name} udostępnia elementy docelowe narzędzia CMake:", "CMakeTargetsUsageHeuristicMessage": "# ten element jest generowany heurystycznie i może być niepoprawny", "CMakeToolChainFile": "Projekty w narzędziu CMake powinny używać ścieżki: \"-DCMAKE_TOOLCHAIN_FILE={path}\"", "CMakeUsingExportedLibs": "Aby używać wyeksportowanych bibliotek w projektach narzędzia CMake, dodaj {value} do wiersza polecenia narzędzia CMake.", - "CacheHelp": "Argument powinien być podciągiem do wyszukania lub bez argumentu umożliwiającego wyświetlenie wszystkich buforowanych bibliotek.", "CheckedOutGitSha": "Wyewidencjonowano algorytm Git SHA: {commit_sha}", "CheckedOutObjectMissingManifest": "Wyewidencjonowany obiekt nie zawiera pliku CONTROL ani pliku vcpkg.json.", "ChecksFailedCheck": "Pakiet vcpkg uległ awarii; nie są dostępne żadne dodatkowe szczegóły", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "zaktualizowanie pakietu vcpkg przez ponowne uruchomienie pakietu bootstrap-vcpkg może rozwiązać ten problem.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "Parametru --allow-unexpected-passing można użyć tylko wtedy, gdy punkt odniesienia jest dostarczany za pośrednictwem --ci-baseline.", "CiBaselineDisallowedCascade": "REGRESJA: {spec} kaskadowo, ale jest wymagana do przekazania. ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "REGRESJA: niezależne {spec} nie powiodło się z {build_result}.", "CiBaselineRegression": "REGRESJA: {spec} nie powiodło się z powodu {build_result}. Jeśli trzeba, dodaj {spec}=fail to {path}.", "CiBaselineRegressionHeader": "REGRESJE:", + "CiBaselineUnexpectedFail": "REGRESJA: parametr {spec} jest oznaczony jako niepowodzenie, ale nie jest obsługiwany dla parametru {triplet}.", + "CiBaselineUnexpectedFailCascade": "REGRESJA: parametr {spec} jest oznaczony jako niepowodzenie, ale jedna zależność nie jest obsługiwana dla parametru {triplet}.", "CiBaselineUnexpectedPass": "PRZEKAZYWANIE, USUWANIE Z LISTY BŁĘDÓW: {spec} ({path}).", "ClearingContents": "Czyszczenie zawartości ścieżki {path}", "CmakeTargetsExcluded": "uwaga: nie jest wyświetlana następująca liczba elementów docelowych: {count}.", - "CmdAddVersionOptAll": "Przetwórz wersje dla wszystkich portów.", - "CmdAddVersionOptOverwriteVersion": "Zastąp element „git-tree” istniejącej wersji.", + "CmdAcquireExample1": "uzyskanie vcpkg ", + "CmdAcquireProjectSynopsis": "Pobiera wszystkie artefakty przywoływane przez manifest", + "CmdAcquireSynopsis": "Uzyskuje nazwany artefakt", + "CmdActivateSynopsis": "Aktywuje artefakty z manifestu", + "CmdAddExample1": "vcpkg dodaje port ", + "CmdAddExample2": "vcpkg dodaje nazwę artefaktu ", + "CmdAddSynopsis": "Dodaje zależność do manifestu", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "Przetwórz wersje dla wszystkich portów", + "CmdAddVersionOptOverwriteVersion": "Zastępuje drzewo git istniejącej wersji", "CmdAddVersionOptSkipFormatChk": "Pomija sprawdzanie formatowania plików vcpkg.json.", - "CmdAddVersionOptSkipVersionFormatChk": "Pomija sprawdzanie formatu wersji.", - "CmdAddVersionOptVerbose": "Drukuj komunikaty o powodzeniu zamiast tylko błędów.", + "CmdAddVersionOptSkipVersionFormatChk": "Pomija sprawdzanie formatu wersji", + "CmdAddVersionOptVerbose": "Drukuje komunikaty o powodzeniu, a nie tylko o błędach", + "CmdAddVersionSynopsis": "Dodaje wersję do bazy danych wersji", + "CmdBootstrapStandaloneSynopsis": "Uruchamia element główne narzędzie vcpkg tylko z pliku binarnego vcpkg", + "CmdBuildExample1": "kompilacja vcpkg ", + "CmdBuildExternalExample1": "zewnętrzna kompilacja vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "Kompiluje port ze ścieżki", + "CmdBuildSynopsis": "Tworzy port", + "CmdCacheExample1": "pamięć podręczna vcpkg ", + "CmdCacheSynopsis": "Wyświetla specyfikację pakietów", + "CmdCheckSupportExample1": "pomoc techniczna vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "Sprawdza, czy port jest obsługiwany bez kompilowania go", + "CmdCiCleanSynopsis": "Czyści wszystkie pliki, aby przygotować się do uruchomienia ciągłej integracji", + "CmdCiSynopsis": "Próbuje skompilować wszystkie porty na potrzeby testowania ciągłej integracji", + "CmdCiVerifyVersionsSynopsis": "Sprawdza integralność bazy danych wersji", "CmdContactOptSurvey": "Uruchom domyślną przeglądarkę w bieżącej ankiecie vcpkg", - "CmdDependInfoOptDGML": "Tworzy wykres na podstawie kodu dgml", - "CmdDependInfoOptDepth": "Pokaż głębokość rekursji w danych wyjściowych", - "CmdDependInfoOptDot": "Tworzy wykres na podstawie kropki", - "CmdDependInfoOptMaxRecurse": "Ustaw maksymalną głębokość rekursji, wartość -1 oznacza brak limitu", - "CmdDependInfoOptSort": "Ustaw kolejność sortowania dla listy zależności. Akceptowane wartości to: leksykograficzny, topologiczny (domyślny), x-tree, odwrotny", - "CmdEditOptAll": "Otwórz edytor w porcie, a także w podfolderze drzewa kompilacji specyficznego dla portu", - "CmdEditOptBuildTrees": "Otwórz edytor w podfolderze buildtree specyficznym dla portu", - "CmdEnvOptions": "Dodaj zainstalowaną ścieżkę {path} do {env_var}", + "CmdCreateExample1": "tworzenie vcpkg ", + "CmdCreateExample2": "vcpkg utwórz my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "tworzy vcpkg ", + "CmdDeactivateSynopsis": "Usuwa wszystkie aktywacje artefaktów z bieżącej powłoki", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "Określono formaty powodujące konflikt. Akceptowany jest tylko jeden z następujących formatów: --format, --dgml lub --dot.", + "CmdDependInfoFormatHelp": "Wybierz format wyjściowy w postaci jednej z następujących wartości: „list”, „tree”, „mermaid”, „dot” lub „dgml”", + "CmdDependInfoFormatInvalid": "Wartość --format={value} nie jest rozpoznawanym formatem. Parametr --format musi określać jedna z następujących wartości: „list”, „tree”, „mermaid”, „dot” lub „dgml”.", + "CmdDependInfoOptDepth": "Pokaż głębokość rekursji w danych wyjściowych na „liście”", + "CmdDependInfoOptMaxRecurse": "Ustawia maksymalną głębokość rekursji. Wartość domyślna nie ma limitu", + "CmdDependInfoOptSort": "Wybierz kolejność sortowania dla formatu „listy”, jeden z „leksykograficznych”, „topologiczny\" (domyślny), „odwrotny”", + "CmdDependInfoShowDepthFormatMismatch": "Formatu --show-depth można używać tylko z formatami „lista” i „drzewo”.", + "CmdDependInfoXtreeTree": "Format --sort=x-tree nie może być używane z formatami innymi niż drzewo", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Pobiera plik", + "CmdEditExample1": "edycja vcpkg ", + "CmdEditOptAll": "Otwiera edytor portu oraz podfolder drzewa kompilacji specyficznego dla portu", + "CmdEditOptBuildTrees": "Otwiera edytor w podfolderze drzewa kompilacji specyficznym dla portu", + "CmdEnvOptions": "Dodaje zainstalowaną ścieżkę {path} do {env_var}", + "CmdExportEmptyPlan": "Odmowa utworzenia eksportu pakietów o wartości zero. Zainstaluj pakiety przed wyeksportowaniem.", + "CmdExportExample1": "eksportuje vcpkg [--nuget] [--directory=out_dir]", "CmdExportOpt7Zip": "Eksportuj do pliku 7zip (.7z)", - "CmdExportOptChocolatey": "Eksportuj pakiet Chocolatey (funkcja eksperymentalna)", - "CmdExportOptDebug": "Włącz debugowanie prefab", - "CmdExportOptDryRun": "Nie eksportuj.", + "CmdExportOptChocolatey": "Eksportuje pakiet Chocolatey (eksperymentalny)", + "CmdExportOptDebug": "Włącza debugowanie prefab", + "CmdExportOptDryRun": "W rzeczywistości nie eksportuje", "CmdExportOptIFW": "Eksportuj do instalatora opartego na technologii IFW", "CmdExportOptInstalled": "Eksportuj wszystkie zainstalowane pakiety", - "CmdExportOptMaven": "Włącz narzędzie Maven", - "CmdExportOptNuget": "Eksportowanie pakietu NuGet", - "CmdExportOptPrefab": "Eksportuj do formatu Prefab", - "CmdExportOptRaw": "Eksportuj do nieskompresowanego katalogu", - "CmdExportOptZip": "Eksportuj do pliku zip", + "CmdExportOptMaven": "Włącza narzędzie Maven", + "CmdExportOptNuget": "Eksportuje pakiet NuGet", + "CmdExportOptPrefab": "Eksportuje do formatu prefab", + "CmdExportOptRaw": "Eksportuje do nieskompresowanego katalogu", + "CmdExportOptZip": "Eksporty do pliku zip", "CmdExportSettingChocolateyMaint": "Określ opiekuna wyeksportowanego pakietu Chocolatey (funkcja eksperymentalna)", "CmdExportSettingChocolateyVersion": "Określ sufiks wersji do dodania dla wyeksportowanego pakietu Chocolatey (funkcja eksperymentalna)", "CmdExportSettingConfigFile": "Określ tymczasową ścieżkę pliku dla konfiguracji instalatora", - "CmdExportSettingInstallerPath": "Określ ścieżkę pliku dla wyeksportowanego instalatora", + "CmdExportSettingInstallerPath": "Ścieżka do pliku wyeksportowanego instalatora", "CmdExportSettingNugetDesc": "Określ opis wyeksportowanego pakietu NuGet", - "CmdExportSettingNugetID": "Określ identyfikator wyeksportowanego pakietu NuGet (zastępuje --output)", - "CmdExportSettingNugetVersion": "Określ wersję wyeksportowanego pakietu NuGet", - "CmdExportSettingOutput": "Określ nazwę wyjściową (używaną do konstruowania nazwy pliku)", + "CmdExportSettingNugetID": "Identyfikator wyeksportowanego pakietu NuGet (zastępuje --output)", + "CmdExportSettingNugetVersion": "Wersja wyeksportowanego pakietu NuGet", + "CmdExportSettingOutput": "Nazwa wyjściowa (używana do skonstruowania nazwy pliku)", "CmdExportSettingOutputDir": "Określ katalog wyjściowy dla utworzonych artefaktów", - "CmdExportSettingPkgDir": "Określ tymczasową ścieżkę katalogu dla pakietów ponownie spakowanych", + "CmdExportSettingPkgDir": "Ścieżka katalogu tymczasowego dla ponownie spakowanych pakietów", "CmdExportSettingPrefabArtifactID": "Identyfikator artefaktu to nazwa projektu zgodnie ze specyfikacjami narzędzia Maven", "CmdExportSettingPrefabGroupID": "Identyfikator GroupId jednoznacznie identyfikuje projekt zgodnie ze specyfikacjami narzędzia Maven", "CmdExportSettingPrefabVersion": "Wersja jest nazwą projektu zgodnie ze specyfikacjami narzędzia Maven", "CmdExportSettingRepoDir": "Określ ścieżkę katalogu dla wyeksportowanego repozytorium", - "CmdExportSettingRepoURL": "Określ adres URL repozytorium zdalnego instalatora online", - "CmdExportSettingSDKMinVersion": "Minimalna obsługiwana wersja zestawu SDK systemu Android", + "CmdExportSettingRepoURL": "Adres URL zdalnego repozytorium dla instalatora online", + "CmdExportSettingSDKMinVersion": "Minimalna obsługiwana wersja zestawu SDK dla systemu Android", "CmdExportSettingSDKTargetVersion": "Wersja docelowego zestawu SDK systemu Android", - "CmdFetchOptXStderrStatus": "Bezpośredni stan/pobieranie komunikatów do stderr zamiast stdout. (Błędy/błędy nadal przechodzą do stdout)", - "CmdFormatManifestOptAll": "Sformatuj wszystkie pliki manifestu portów.", - "CmdFormatManifestOptConvertControl": "Konwertuj pliki CONTROL na pliki manifestu.", - "CmdGenerateMessageMapOptNoOutputComments": "Podczas generowania mapy komunikatów wyklucz komentarze (przydatne do generowania pliku lokalizacji w języku angielskim)", - "CmdInfoOptInstalled": "(eksperymentalne) Raport dotyczący zainstalowanych pakietów zamiast dostępnych", + "CmdExportSynopsis": "Tworzy autonomiczne wdrożenie zainstalowanych portów", + "CmdFetchOptXStderrStatus": "Drukuje komunikaty o stanie/pobieraniu na stderr zamiast na stdout (błędy/awarie nadal trafiają na stdout)", + "CmdFetchSynopsis": "Pobiera coś z systemu lub Internetu", + "CmdFindExample1": "znajdź port vcpkg ", + "CmdFindExample2": "vcpkg znajdź artefakt ", + "CmdFindSynopsis": "Znajduje port lub artefakt, który może być zainstalowany lub aktywowany", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "Formatuje pliki manifestu wszystkich portów", + "CmdFormatManifestOptConvertControl": "Konwertuje pliki CONTROL na pliki manifestu", + "CmdFormatManifestSynopsis": "Plik prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "Generuje pliki msbuild .props tak, jakby aktywował zależności artefaktów manifestu, bez ich pozyskiwania", + "CmdGenerateMessageMapOptNoOutputComments": "Wyklucza komentarze podczas generowania mapy komunikatów (przydatne do generowania pliku lokalizacji w języku angielskim)", + "CmdHashExample1": "skrót vcpkg ", + "CmdHashExample2": "skrót vcpkg SHA256", + "CmdHashSynopsis": "Pobiera SHA256 lub SHA512 pliku", + "CmdHelpCommandSynopsis": "Wyświetla szczegóły pomocy dla ", + "CmdHelpCommands": "pomoc ", + "CmdHelpCommandsSynopsis": "Wyświetla pełną listę poleceń, w tym rzadkie polecenia niewymienione tutaj", + "CmdHelpTopic": "pomoc ", + "CmdInfoOptInstalled": "(eksperymentalne) Raporty dotyczące zainstalowanych pakietów zamiast dostępnych", "CmdInfoOptTransitive": "(eksperymentalne) Raportuj również o zależnościach zainstalowanych pakietów", - "CmdNewOptApplication": "Utwórz manifest aplikacji (nie wymagaj nazwy ani wersji).", - "CmdNewOptSingleFile": "Osadź plik vcpkg-configuration.json w pliku vcpkg.json.", + "CmdInitRegistryExample1": "rejestr vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Tworzy pusty rejestr git", + "CmdInstallExample1": "instalowanie vcpkg ...", + "CmdIntegrateSynopsis": "Integruje vcpkg z maszynami, projektami lub powłokami", + "CmdListExample2": "lista vcpkg ", + "CmdNewExample1": "vcpkg nowy --name=example --version=1.0", + "CmdNewOptApplication": "Tworzy manifest aplikacji (nie wymaga nazwy ani wersji)", + "CmdNewOptSingleFile": "Osadza plik vcpkg-configuration.json w pliku vcpkg.json.", "CmdNewOptVersionDate": "Interpretuj --version jako datę ISO 8601. (RRRR-MM-DD)", - "CmdNewOptVersionRelaxed": "Interpretuj --version jako wersję swobodną-liczbową. (Liczby nieujemne rozdzielone kropkami)", - "CmdNewOptVersionString": "Interpretuj --version jako ciąg bez zachowania porządkowania.", - "CmdNewSettingName": "Nazwa nowego manifestu.", - "CmdNewSettingVersion": "Wersja nowego manifestu.", - "CmdRegenerateOptDryRun": "w rzeczywistości nie wykonuje akcji, pokazuje tylko to, co zostałoby wykonane", - "CmdRegenerateOptForce": "kontynuuje akcję (potencjalnie niebezpieczną) bez potwierdzenia", - "CmdRegenerateOptNormalize": "zastosuj wszelkie poprawki wycofania", - "CmdRemoveOptDryRun": "Wydrukuj pakiety do usunięcia, ale nie usuwaj ich", - "CmdRemoveOptOutdated": "Wybierz wszystkie pakiety z wersjami niezgodnymi z plikami portów", - "CmdRemoveOptRecurse": "Zezwalaj na usuwanie pakietów, które nie zostały jawnie określone w wierszu polecenia", - "CmdSetInstalledOptDryRun": "Nie kompiluj ani nie instaluj", - "CmdSetInstalledOptNoUsage": "Nie drukuj informacji o użyciu narzędzia CMake po instalacji.", - "CmdSetInstalledOptWritePkgConfig": "Zapisuje plik w formacie NuGet packages.config do użycia z zewnętrznym buforowaniem binarnym.\nAby uzyskać więcej informacji, zobacz sekcję „vcpkg help binarycaching”.", + "CmdNewOptVersionRelaxed": "Interpretuje --version jako wersję swobodną-liczbową. (Liczby nieujemne rozdzielone kropkami)", + "CmdNewOptVersionString": "Interpretuje --version jako ciąg znaków bez zachowania kolejności", + "CmdNewSettingName": "Nazwa nowego manifestu", + "CmdNewSettingVersion": "Wersja nowego manifestu", + "CmdNewSynposis": "Tworzy nowy manifest", + "CmdOwnsExample1": "vcpkg jest właścicielem ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "Różnicuje zmiany w wersjach portów między zatwierdzeniami", + "CmdRegenerateOptDryRun": "W rzeczywistości nie wykonuje akcji, pokazuje tylko, co zostałoby zrobione", + "CmdRegenerateOptForce": "Kontynuuje (potencjalnie niebezpieczną) akcję bez potwierdzenia", + "CmdRegenerateOptNormalize": "Stosuje wszelkie poprawki wycofania", + "CmdRemoveExample1": "usuń vcpkg ...", + "CmdRemoveOptDryRun": "Drukuje pakiety do usunięcia, ale ich nie usuwa", + "CmdRemoveOptOutdated": "Usuwa wszystkie pakiety z wersjami, które nie pasują do wbudowanego rejestru", + "CmdRemoveOptRecurse": "Umożliwia usunięcie zależnych pakietów, które nie zostały jawnie określone", + "CmdSearchExample1": "wyszukiwanie vcpkg ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "W rzeczywistości nie kompiluje ani nie instaluje", + "CmdSetInstalledOptNoUsage": "Nie drukuje informacji o użyciu narzędzia CMake po instalacji", + "CmdSetInstalledOptWritePkgConfig": "Zapisuje sformatowany plik NuGet packages.config do użytku z zewnętrznym buforowaniem binarnym. Zobacz `vcpkg help binarycaching`, aby uzyskać więcej informacji", + "CmdSetInstalledSynopsis": "Instaluje, aktualizuje lub usuwa pakiety w taki sposób, że zainstalowane pakiety odpowiadają dokładnie tym, które zostały dostarczone", "CmdSettingCopiedFilesLog": "Ścieżka do dziennika skopiowanych plików do utworzenia", "CmdSettingInstalledDir": "Ścieżka do zainstalowanego drzewa do użycia", "CmdSettingTLogFile": "Ścieżka do pliku tlog do utworzenia", "CmdSettingTargetBin": "Ścieżka do pliku binarnego do przeanalizowania", "CmdUpdateBaselineOptDryRun": "Wydrukuj plan bez wykonywania", - "CmdUpdateBaselineOptInitial": "dodaj „builtin-baseline” do pliku vcpkg.json, który jeszcze go nie ma", - "CmdUpgradeOptAllowUnsupported": "Zamiast błędów na nieobsługiwanym porcie, kontynuuj z ostrzeżeniem.", + "CmdUpdateBaselineOptInitial": "Dodaje „builtin-baseline” do pliku vcpkg.json, który jeszcze go nie ma", + "CmdUpdateBaselineSynopsis": "Aktualizuje linie bazowe rejestrów git w manifeście do zatwierdzenia HEAD tych rejestrów", + "CmdUpdateRegistryAll": "Aktualizowanie wszystkich znanych rejestrów artefaktów", + "CmdUpdateRegistryAllExcludesTargets": "Rejestru aktualizacji --all nie można używać z listą rejestrów artefaktów", + "CmdUpdateRegistryAllOrTargets": "Aktualizacja rejestru wymaga zaktualizowania listy nazw rejestru artefaktów lub identyfikatorów URI lub --all.", + "CmdUpdateRegistryExample3": "aktualizuj rejestr vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "Ponownie pobiera rejestr artefaktów", "CmdUpgradeOptNoDryRun": "Faktycznie uaktualnij", "CmdUpgradeOptNoKeepGoing": "Zatrzymaj instalowanie pakietów w przypadku niepowodzenia", + "CmdUseExample1": "vcpkg użyj ", + "CmdUseSynopsis": "Aktywuj pojedynczy artefakt w tej powłoce", + "CmdVSInstancesSynopsis": "Listy wykrytych wystąpień programu Visual Studio", "CmdXDownloadOptHeader": "Dodatkowy nagłówek do użycia podczas pobierania z adresów URL", "CmdXDownloadOptSha": "Skrót pliku do pobrania", - "CmdXDownloadOptSkipSha": "Nie sprawdzaj SHA512 pobranego pliku", - "CmdXDownloadOptStore": "Wskazuje, że plik powinien być przechowywany, a nie pobierany", + "CmdXDownloadOptSkipSha": "Pomija sprawdzanie SHA512 pobranego pliku", + "CmdXDownloadOptStore": "Przechowuje plik zamiast go pobierać", "CmdXDownloadOptUrl": "Adres URL do pobrania i zapisania, jeśli brakuje go w pamięci podręcznej", + "CmdZApplocalSynopsis": "Kopiuje zależności pliku binarnego z zainstalowanego drzewa do miejsca, w którym znajduje się ten plik binarny do lokalnego wdrożenia aplikacji", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "Liczba wiodących katalogów do usunięcia ze wszystkich ścieżek", + "CommandEnvExample2": "vcpkg env „ninja -C ” --triplet x64-windows", "CommandFailed": "polecenie:\n{command_line}\nnie powiodło się z następującymi wynikami:", - "Commands": "Polecenia:", - "CommunityTriplets": "Tryplety społeczności VCPKG:", + "CommunityTriplets": "Trójki społeczności:", "ComparingUtf8Decoders": "Porównywanie Utf8Decoders z różnymi pochodzeniami; zawsze jest to błąd", "CompressFolderFailed": "Nie można skompresować folderu „{path}”:", "ComputingInstallPlan": "Trwa obliczanie planu instalacji...", "ConfigurationErrorRegistriesWithoutBaseline": "Konfiguracja zdefiniowana w ścieżce {path} jest nieprawidłowa.\n\nKorzystanie z rejestrów wymaga ustawienia punktu odniesienia dla rejestru domyślnego lub domyślnego rejestru o wartości null.\n\nZobacz {url}, aby uzyskać więcej szczegółów.", "ConfigurationNestedDemands": "[\"{json_field}\"] zawiera zagnieżdżony obiekt „demands” (zagnieżdżony obiekt „demands” nie ma żadnego efektu)", "ConflictingFiles": "Następujące pliki są już zainstalowane w ścieżce {path} i są w konflikcie z {spec}", + "ConsideredVersions": "Następujące pliki wykonywalne zostały uwzględnione, ale odrzucone ze względu na wymaganie wersji {version}:", "ConstraintViolation": "Znaleziono naruszenie ograniczenia:", "ContinueCodeUnitInStart": "znaleziono jednostkę kodu kontynuacji w pozycji początkowej", "ControlAndManifestFilesPresent": "Plik manifestu i plik CONTROL istnieją w katalogu portów: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "Baza danych jest uszkodzona.", "CorruptedInstallTree": "Drzewo „installed” pakietu vcpkg jest uszkodzone.", "CouldNotDeduceNugetIdAndVersion": "Nie można wywnioskować identyfikatora NuGet i wersji z nazwy pliku: {path}", - "CouldNotFindBaseline": "Nie można odnaleźć jawnie określonej linii bazowej `\"{commit_sha}\"` w pliku punktu odniesienia {path}", - "CouldNotFindBaselineForRepo": "Nie można odnaleźć punktu odniesienia `\"{commit_sha}\"` dla repozytorium {package_name}", - "CouldNotFindBaselineInCommit": "Nie można odnaleźć punktu odniesienia w zatwierdzeniu `\"{commit_sha}\"` z repozytorium {package_name}:", + "CouldNotFindBaselineInCommit": "Nie można odnaleźć punktu odniesienia w adresie {url} w lokalizacji {commit_sha} dla elementu {package_name}.", "CouldNotFindGitTreeAtCommit": "Nie można odnaleźć drzewa GIT dla `versions` w repozytorium {package_name} przy zatwierdzeniu {commit_sha}", "CouldNotFindToolVersion": "Nie można odnaleźć narzędzi w ścieżce {path}", "CouldNotFindVersionDatabaseFile": "Nie można odnaleźć pliku bazy danych wersji: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "Zmienna środowiskowa VCPKG_DEFAULT_BINARY_CACHE musi być katalogiem (była: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "Zmienna środowiskowa VCPKG_DEFAULT_BINARY_CACHE musi być ścieżką bezwzględną (była: {path})", "DefaultBinaryCacheRequiresDirectory": "Zmienna środowiskowa VCPKG_DEFAULT_BINARY_CACHE musi być katalogiem (była: {path})", - "DefaultBrowserLaunched": "Przeglądarka domyślna została uruchomiona na {url}.", + "DefaultFeatureCore": "funkcja „rdzeń” wyłącza funkcje domyślne i dlatego nie może znajdować się na liście funkcji domyślnych", + "DefaultFeatureDefault": "funkcja „domyślny” odnosi się do zestawu funkcji domyślnych i dlatego nie może znajdować się na liście funkcji domyślnych", + "DefaultFeatureIdentifier": "nazwy funkcji domyślnych muszą być identyfikatorami", "DefaultFlag": "Domyślnie opcja --{option} jest włączona.", "DefaultRegistryIsArtifact": "Rejestr domyślny nie może być rejestrem artefaktów.", - "DefaultTriplet": "Począwszy od wersji z września 2023 r., domyślny triplet dla bibliotek vcpkg zmieni się z x86-windows na wykryty triplet hosta ({triplet}). Aby rozwiązać ten komunikat, dodaj element --triplet x86-windows, aby zachować to samo zachowanie.", + "DefaultTripletChanged": "W wydaniu z września 2023 r. domyślna trójka dla bibliotek vcpkg zmieniła się z x86-windows na wykrytą trójkę hosta ({triplet}). Aby uzyskać stare zachowanie, dodaj --triplet x86-windows . Aby pominąć ten komunikat, należy dodać --triplet {triplet} .", "DeleteVcpkgConfigFromManifest": "-- Lub usuń \"vcpkg-configuration\" z pliku manifestu {path}.", + "DependencyFeatureCore": "funkcja „rdzeń” nie może znajdować się na liście funkcji zależności. Aby wyłączyć funkcje domyślne, dodaj zamiast tego wartość „funkcje domyślne”: prawda.", + "DependencyFeatureDefault": "funkcja „domyślny” nie może znajdować się na liście funkcji zależności. Aby włączyć funkcje domyślne, dodaj zamiast tego wartość „funkcje domyślne”: prawda.", + "DependencyGraphCalculation": "Przesyłanie grafu zależności jest włączone.", + "DependencyGraphFailure": "Przesyłanie grafu zależności nie powiodło się.", + "DependencyGraphSuccess": "Przesyłanie grafu zależności powiodło się.", "DeprecatedPrefabDebugOption": "Opcja --prefab-debug jest teraz przestarzała.", "DetectCompilerHash": "Trwa wykrywanie skrótu kompilatora dla potrójnego elementu {triplet}...", "DocumentedFieldsSuggestUpdate": "Jeśli są to udokumentowane pola, które powinny zostać rozpoznane, spróbuj zaktualizować narzędzie vcpkg.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "Plik nie ma oczekiwanego skrótu:\nAdres URL: {url}\nPlik: {path}\nOczekiwany skrót: {expected}\nRzeczywisty skrót: {actual}", "DownloadFailedRetrying": "Pobieranie nie powiodło się — ponawianie próby po {value}ms", "DownloadFailedStatusCode": "{url}: niepowodzenie: kodu stanu {value}", - "DownloadRootsDir": "Określ katalog główny pobierań.\n(domyślnie: {env_var})", + "DownloadRootsDir": "Katalog pobierania (domyślnie: {env_var})", "DownloadWinHttpError": "{url}: niepowodzenie interfejsu {system_api} za pomocą kodu zakończenia:{exit_code}", "DownloadedSources": "Pobrane źródła dla {spec}", "DownloadingPortableToolVersionX": "Nie znaleziono odpowiedniej wersji produktu {tool_name} (wymagana wersja v{version}) Trwa pobieranie przenośnej wersji {tool_name} {version}...", "DownloadingTool": "Trwa pobieranie {tool_name}... \n{url}->{path}", "DownloadingUrl": "Pobieranie adresu {ulr}", - "DownloadingVcpkgCeBundle": "Trwa pobieranie pakietu vcpkg-artifacts {version}...", - "DownloadingVcpkgCeBundleLatest": "Trwa pobieranie najnowszego pakietu vcpkg-artifacts...", "DownloadingVcpkgStandaloneBundle": "Pobieranie pakietu autonomicznego {version}.", "DownloadingVcpkgStandaloneBundleLatest": "Pobieranie najnowszego pakietu autonomicznego.", "DuplicatePackagePattern": "Pakiet „{package_name}” jest zduplikowany.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "podczas wykrywania informacji o kompilatorze:\nZawartość pliku dziennika w lokalizacji „{path}” to:", "ErrorIndividualPackagesUnsupported": "W trybie manifestu polecenie „vcpkg install” nie obsługuje poszczególnych argumentów pakietu.\nAby zainstalować dodatkowe pakiety, edytuj plik vcpkg.json, a następnie uruchom polecenie „vcpkg install” bez żadnych argumentów pakietu.", "ErrorInvalidClassicModeOption": "Opcja --{option} nie jest obsługiwana w trybie klasycznym i nie znaleziono manifestu.", + "ErrorInvalidExtractOption": "--{option} musi być ustawiona na nieujemną liczbę całkowitą lub „AUTO”.", "ErrorInvalidManifestModeOption": "Opcja --{option} nie jest obsługiwana w trybie manifestu.", "ErrorMessage": "błąd: ", "ErrorMessageMustUsePrintError": "Komunikat o nazwie {value} zaczyna się od błędu. Zamiast tego należy zmienić go w kodzie tak, aby poprzedzał komunikat ErrorMessage.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "Wystąpiły błędy podczas analizowania ścieżki {path}.", "ErrorWhileWriting": "Wystąpił błąd podczas zapisywania ścieżki {path}.", "ErrorsFound": "Znaleziono następujące błędy:", - "Example": "przykład:", + "ExamplesHeader": "Przykłady:", "ExceededRecursionDepth": "Przekroczono głębokość rekursji.", "ExcludedPackage": "Wykluczono {spec}", "ExcludedPackages": "Następujące pakiety są wykluczone:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Trwa eksportowanie narzędzia do konserwacji...", "ExportingPackage": "Trwa eksportowanie elementu {package_name}...", "ExtendedDocumentationAtUrl": "Dokumentacja rozszerzona dostępna w „{url}”.", + "ExtractHelp": "Wyodrębnia archiwum.", "ExtractingTool": "Trwa wyodrębnianie {tool_name}...", "FailedPostBuildChecks": "Znaleziono problemy z sprawdzeniem po kompilacji: {count}. Aby przesłać te porty do wyselekcjonowanych wykazów, najpierw popraw plik portów: {path}", "FailedToAcquireMutant": "nie można uzyskać zmutowanej ścieżki {path}", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "Nie można określić bieżącego zatwierdzenia:", "FailedToDownloadFromMirrorSet": "Nie można pobrać z zestawu dublowanego", "FailedToExtract": "Nie można wyodrębnić \"{path}\":", - "FailedToFetchError": "{error_msg}\nPobieranie {package_name} nie powiodło się:", - "FailedToFindBaseline": "Nie można odnaleźć pliku baseline.json", + "FailedToFetchRepo": "Nie można pobrać adresu {url}.", "FailedToFindPortFeature": "Pakiet {package_name} nie ma funkcji o nazwie {feature}.", "FailedToFormatMissingFile": "Brak plików do formatowania.\nPrzekaż --all lub jawne pliki do sformatowania lub przekonwertowania.", "FailedToLoadInstalledManifest": "Nie można załadować kontrolki lub pliku manifestu dla pakietu {package_name} z powodu następującego błędu. Usuń pakiet {package_name} i spróbuj ponownie.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "Nie można zablokować systemu plików na ścieżce {path}", "FailedToWriteManifest": "Nie można zapisać pliku manifestu {path}", "FailedVendorAuthentication": "Uwierzytelnienie co najmniej jednego dostawcy poświadczeń {vendor} nie powiodło się. Aby uzyskać więcej informacji na temat sposobu dostarczania poświadczeń, zobacz „{url}”.", - "FeedbackAppreciated": "Dziękujemy za opinię!", "FetchingBaselineInfo": "Trwa pobieranie informacji o punkcie odniesienia z {package_name}...", "FetchingRegistryInfo": "Trwa pobieranie informacji rejestru z adresu {url} ({value})...", "FieldKindDidNotHaveExpectedValue": "Element „kind” nie miał oczekiwanej wartości: (oczekiwano jednej z: {expected}; znaleziono {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "Ścieżki bezwzględne zostały znalezione w następujących plikach:", "FilesExported": "Pliki wyeksportowane do: {path}", "FindHelp": "Wyszukuje wskazany artefakt lub port. Bez parametru po elemencie „artifact” lub „port” wyświetla wszystko.", + "FindVersionArtifactsOnly": "Nie można użyć parametru --version z wyszukiwaniem vcpkg lub portem odkrywania vcpkg", "FishCompletion": "Uzupełnianie powłoki fish w menedżerze vcpkg zostało już dodane w lokalizacji \"{path}\".", "FloatingPointConstTooBig": "Stała zmiennoprzecinkowa jest za duża: {count}", "FollowingPackagesMissingControl": "Następujące pakiety nie mają prawidłowego pliku CONTROL lub vcpkg.json:", "FollowingPackagesNotInstalled": "Następujące pakiety nie są zainstalowane:", "FollowingPackagesUpgraded": "Następujące pakiety są aktualne:", + "ForMoreHelp": "Aby uzyskać dodatkową pomoc", "ForceSystemBinariesOnWeirdPlatforms": "Zmienna środowiskowa VCPKG_FORCE_SYSTEM_BINARIES musi być ustawiona na platformach ARM, s390x, ppc64le i RISCV.", "FormattedParseMessageExpression": "w przypadku wyrażenia: {value}", "GHAParametersMissing": "Źródło binarne GHA wymaga ustawienia zmiennych środowiskowych ACTIONS_RUNTIME_TOKEN i ACTIONS_CACHE_URL. Aby uzyskać szczegółowe informacje, zobacz {url}.", @@ -470,7 +590,7 @@ "GitCommandFailed": "nie można wykonać polecenia: {command_line}", "GitFailedToFetch": "nie można pobrać wartości {value} odwołania z repozytorium {url}", "GitFailedToInitializeLocalRepository": "nie można zainicjować ścieżki {path} lokalnego repozytorium", - "GitRegistryMustHaveBaseline": "Wpis rejestru GIT dla repozytorium „{package_name}” musi mieć pole „punkt odniesienia”, które jest prawidłowym algorytmem SHA zatwierdzenia GIT (40 znaków szesnastkowych).\nAktualny nagłówek tego repozytorium to „{value}”.", + "GitRegistryMustHaveBaseline": "Rejestr git „{url}” musi mieć pole „baseline”, które jest prawidłowym algorytmem SHA zatwierdzenia Git (40 znaków szesnastkowych).\nAby korzystać z bieżących najnowszych wersji, ustaw punkt odniesienia na element HEAD tego repozytorium, „{commit_sha}”.", "GitStatusOutputExpectedFileName": "oczekiwano nazwy pliku", "GitStatusOutputExpectedNewLine": "oczekiwano nowego wiersza", "GitStatusOutputExpectedRenameOrNewline": "oczekiwano pliku ze zmienioną nazwą lub nowe wiersze", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "git wygenerował nieoczekiwane dane wyjściowe podczas uruchamiania {command_line}", "GraphCycleDetected": "Wykryto cykl w grafie przy pakiecie {package_name}:", "HashFileFailureToRead": "nie można odczytać pliku \"{path}\" dla haszowania: ", + "HashPortManyFiles": "Pakiet {package_name} zawiera {count} plików. Skracanie tej zawartości może zająć dużo czasu podczas określania skrótu ABI dla buforowania binarnego. Rozważ zmniejszenie liczby plików. Najczęstsze przyczyny to przypadkowe sprawdzenie plików źródłowych lub kompilacji w katalogu portu.", "HeaderOnlyUsage": "Element {package_name} jest tylko w nagłówku i może być używany z narzędzia CMake za pośrednictwem:", "HelpAssetCaching": "**Funkcja eksperymentalna: ta funkcja może ulec zmianie lub zostać usunięta w dowolnym momencie**\n\nProgram vcpkg może używać duplikatów do buforowania pobranych zasobów, zapewniając kontynuowanie działania, nawet jeśli oryginalne źródło zmieni się lub zniknie.\n\nBuforowanie zasobów można skonfigurować, ustawiając zmienną środowiskową X_VCPKG_ASSET_SOURCES na rozdzielaną średnikami listę źródeł lub przekazując sekwencję opcji wiersza polecenia --x-asset-sources=. Źródła wiersza polecenia są interpretowane po źródłach środowiska. Przecinki, średniki i znaki backtick można oznaczyć znakami ucieczki backtick (`).\n\nOpcjonalny parametr dla niektórych ciągów kontroluje sposób uzyskiwania do nich dostępu. Można go określić jako „read”, „write” lub „readwrite”, a wartość domyślna to „read”.\n\nPrawidłowe źródła:", "HelpAssetCachingAzUrl": "Dodaje źródło usługi Azure Blob Storage, opcjonalnie używając weryfikacji sygnatury dostępu współdzielonego. Adres URL powinien zawierać ścieżkę kontenera i być zakończony znakiem „/”. , jeśli została zdefiniowana, powinna mieć prefiks „?”. Serwery spoza platformy Azure będą również działać, jeśli odpowiedzą na żądania GET i PUT w postaci: „”.", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "Określa limit czasu pakietu NuGet dla operacji sieciowych NuGet; odpowiednik parametru „-Timeout” interfejsu wiersza polecenia NuGet.", "HelpBuiltinBase": "Punkt odniesienia odwołuje się do zatwierdzenia w repozytorium vcpkg, które ustanawia minimalną wersję dla każdej zależności na wykresie. Jeśli na przykład nie określono żadnych innych ograniczeń (bezpośrednio lub przechodnio), wersja zostanie rozpoznana jako punkt odniesienia manifestu najwyższego poziomu. Punkty odniesienia zależności przechodnich są ignorowane.", "HelpCachingClear": "Usuwa wszystkie poprzednie źródła, w tym wartości domyślne.", - "HelpContactCommand": "Wyświetl informacje kontaktowe, aby wysłać opinię.", - "HelpCreateCommand": "Utwórz nowy port.", - "HelpDependInfoCommand": "Wyświetl listę zależności dla portów.", - "HelpEditCommand": "Otwórz port do edycji (użyj zmiennej środowiskowej „{env_var}”, aby ustawić program edytora, wartość domyślna to „kod”).", - "HelpEnvCommand": "Tworzy środowisko czystej powłoki na potrzeby programowania lub kompilowania.", - "HelpExampleCommand": "Aby uzyskać dodatkową pomoc (w tym przykłady), zobacz towarzyszące foldery README.md i dokumentacji.", + "HelpContactCommand": "Wyświetla informacje kontaktowe do wysyłania opinii", + "HelpCreateCommand": "Tworzy nowy port", + "HelpDependInfoCommand": "Wyświetl listę zależności dla portów", + "HelpEditCommand": "Edytuje port, opcjonalnie z {env_var}, domyślnie „code”", + "HelpEnvCommand": "Tworzy środowisko czystej powłoki na potrzeby programowania lub kompilowania", + "HelpExampleCommand": "Aby uzyskać dodatkową pomoc (w tym przykłady), zobacz https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Przykładowy manifest:", "HelpExportCommand": "Eksportuje pakiet.", - "HelpFormatManifestCommand": "Formatuje wszystkie pliki vcpkg.json. Uruchom to przed zatwierdzeniem do programu vcpkg.", "HelpHashCommand": "Utwórz skrót pliku według określonego algorytmu, domyślny algorytm SHA512.", - "HelpInitializeRegistryCommand": "Inicjuje rejestr w katalogu .", - "HelpInstallCommand": "Zainstaluj pakiet.", - "HelpListCommand": "Wyświetl listę zainstalowanych pakietów.", + "HelpInstallCommand": "Instaluje pakiet", + "HelpListCommand": "Wyświetl listę zainstalowanych pakietów", "HelpManifestConstraints": "Manifesty mogą nakładać trzy rodzaje ograniczeń na używane wersje", "HelpMinVersion": "Program Vcpkg wybierze znalezioną wersję minimalną zgodną ze wszystkimi odpowiednimi ograniczeniami, w tym wersję z punktu odniesienia określoną na najwyższym poziomie, a także dowolne ograniczenie „wersja>=” na wykresie.", "HelpOverrides": "W przypadku używania jako manifestu najwyższego poziomu (na przykład podczas uruchamiania polecenia `vcpkg install` w katalogu) przesłonięcia umożliwiają manifestowi rozpoznawanie zależności krótkiego obwodu i określają dokładnie wersję do użycia. Mogą one służyć do obsługi konfliktów wersji, takich jak zależności `version-string`. Nie będą one brane pod uwagę, gdy zależność na nich jest przechodnia.", - "HelpOwnsCommand": "Wyszukaj pliki w zainstalowanych pakietach.", + "HelpOwnsCommand": "Wyszukuje właściciela pliku w zainstalowanych pakietach", "HelpPackagePublisher": "Ponadto, wydawcy pakietów mogą używać ograniczenia „wersja>=”, aby zapewnić, że użytkownicy używają co najmniej określonej minimalnej wersji danej zależności. Jeśli na przykład biblioteka wymaga interfejsu API dodanego do programu boost-asio w wersji 1.70, ograniczenie „wersja>=” spowoduje, że użytkownicy przechodni będą używać wystarczającej wersji nawet w przypadku poszczególnych zastąpień wersji lub odwołań między rejestrami.", - "HelpPortVersionScheme": "Każda wersja ma dodatkowo element „wersja-port”, który jest nieujemną liczbą całkowitą. W przypadku renderowania jako tekst wersja portu (jeśli niezerowa) jest dodawana jako sufiks do tekstu wersji podstawowej oddzielonej znakiem krzyżyka (#). Wersje portów są sortowane leksykograficznie po tekście wersji podstawowej, na przykład:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Odinstaluj pakiet.", - "HelpRemoveOutdatedCommand": "Odinstaluj wszystkie nieaktualne pakiety.", - "HelpResponseFileCommand": "Określ plik odpowiedzi, aby podać dodatkowe parametry.", - "HelpSearchCommand": "Wyszukaj pakiety dostępne do skompilowania.", - "HelpTextOptFullDesc": "Nie obcinaj długiego tekstu.", - "HelpTopicCommand": "Wyświetl pomoc dotyczącą określonego tematu.", - "HelpTopicsCommand": "Wyświetl listę tematów pomocy.", - "HelpTxtOptAllowUnsupportedPort": "Zamiast błędów na nieobsługiwanym porcie, kontynuuj z ostrzeżeniem.", - "HelpTxtOptCleanAfterBuild": "Wyczyść drzewa kompilacji, pakiety i pliki do pobrania po skompilowaniu każdego pakietu.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Wyczyść drzewa kompilacji po skompilowaniu każdego pakietu.", + "HelpPortVersionScheme": "Każda wersja posiada dodatkowo „wersję portu”, która jest nieujemną liczbą całkowitą. Podczas renderowania jako tekst, wersja portu (jeśli jest niezerowa) jest dodawana jako sufiks do tekstu wersji podstawowej, oddzielona hashem (#). Wersje portów są sortowane leksykograficznie po tekście wersji podstawowej, na przykład:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Odinstalowuje pakiet", + "HelpResponseFileCommand": "Zawiera jeden argument na wiersz rozwinięty w tej lokalizacji", + "HelpSearchCommand": "Wyszukuje pakiety dostępne do skompilowania", + "HelpTextOptFullDesc": "Nie obcina długiego tekstu", + "HelpTopicCommand": "Wyświetla określony temat pomocy", + "HelpTopicsCommand": "Wyświetla pełną listę tematów pomocy", + "HelpTxtOptAllowUnsupportedPort": "Kontynuuje z ostrzeżeniem na nieobsługiwanych portach, zamiast zakończyć się niepowodzeniem", + "HelpTxtOptCleanAfterBuild": "Czyści drzewa kompilacji, pakiety i pliki do pobrania po skompilowaniu każdego pakietu", + "HelpTxtOptCleanBuildTreesAfterBuild": "Wyczyść drzewa kompilacji po skompilowaniu każdego pakietu", "HelpTxtOptCleanDownloadsAfterBuild": "Wyczyść pliki do pobrania po skompilowaniu każdego pakietu.", - "HelpTxtOptCleanPkgAfterBuild": "Wyczyść pakiety po skompilowaniu każdego pakietu.", - "HelpTxtOptDryRun": "W rzeczywistości nie kompiluj ani nie instaluj.", - "HelpTxtOptEditable": "Wyłącz ponowne wyodrębnianie źródła i buforowanie binarne dla bibliotek w wierszu polecenia (tryb klasyczny)", + "HelpTxtOptCleanPkgAfterBuild": "Czyści pakiety po utworzeniu każdego pakietu", + "HelpTxtOptDryRun": "W rzeczywistości nie kompiluje ani nie instaluje", + "HelpTxtOptEditable": "Wyłącza ponowne wyodrębnianie źródeł i buforowanie binarne bibliotek w wierszu poleceń (tryb klasyczny)", "HelpTxtOptEnforcePortChecks": "Instalacja nie powiodła się, jeśli port wykrył problemy lub próbuje użyć przestarzałej funkcji", - "HelpTxtOptKeepGoing": "Kontynuuj instalowanie pakietów po awarii.", - "HelpTxtOptManifestFeature": "Dodatkowa funkcja z manifestu najwyższego poziomu do zainstalowania (tryb manifestu).", - "HelpTxtOptManifestNoDefault": "Nie instaluj funkcji domyślnych z manifestu najwyższego poziomu (trybu manifestu).", - "HelpTxtOptNoDownloads": "Nie pobieraj nowych źródeł.", - "HelpTxtOptNoUsage": "Nie drukuj informacji o użyciu narzędzia CMake po instalacji.", - "HelpTxtOptOnlyBinCache": "Niepowodzenie, jeśli buforowane pliki binarne są niedostępne.", - "HelpTxtOptOnlyDownloads": "Podejmij najlepszą próbę pobrania źródeł bez kompilowania.", - "HelpTxtOptRecurse": "Zezwalaj na usuwanie pakietów w ramach instalacji.", - "HelpTxtOptUseAria2": "Użyj narzędzia aria2 do wykonywania zadań pobierania.", - "HelpTxtOptUseHeadVersion": "Zainstaluj biblioteki w wierszu polecenia przy użyciu najnowszych źródeł nadrzędnych (tryb klasyczny).", - "HelpTxtOptWritePkgConfig": "Zapisuje plik w formacie NuGet packages.config do użycia z zewnętrznym buforowaniem binarnym.\nAby uzyskać więcej informacji, zobacz „vcpkg help binarycaching”.", - "HelpUpdateBaseline": "Najlepszym podejściem do aktualizowania bibliotek jest zaktualizowanie bazowego odniesienia. Dzięki temu wszystkie pakiety, w tym przechodnie, zostaną zaktualizowane. Jeśli jednak musisz niezależnie zaktualizować pakiet, możesz użyć ograniczenia „wersja>=”.", - "HelpUpdateCommand": "Wyświetl listę pakietów, które można zaktualizować.", - "HelpUpgradeCommand": "Odbuduj wszystkie nieaktualne pakiety.", - "HelpVersionCommand": "Wyświetl informacje o wersji.", + "HelpTxtOptKeepGoing": "Kontynuuj instalowanie pakietów po awarii", + "HelpTxtOptManifestFeature": "Dodatkowe funkcje z manifestu najwyższego poziomu do zainstalowania (tryb manifestu)", + "HelpTxtOptManifestNoDefault": "Nie instaluje domyślnych funkcji z manifestu najwyższego poziomu (tryb manifestu)", + "HelpTxtOptNoDownloads": "Nie pobieraj nowych źródeł", + "HelpTxtOptNoUsage": "Nie drukuj informacji o użyciu narzędzia CMake po instalacji", + "HelpTxtOptOnlyBinCache": "Niepowodzenie, jeśli buforowane pliki binarne są niedostępne", + "HelpTxtOptOnlyDownloads": "Podejmij najlepszą próbę pobrania źródeł bez kompilowania", + "HelpTxtOptRecurse": "Zezwalaj na usuwanie pakietów w ramach instalacji", + "HelpTxtOptUseAria2": "Użyj narzędzia aria2 do wykonywania zadań pobierania", + "HelpTxtOptUseHeadVersion": "Instaluje biblioteki w wierszu poleceń przy użyciu najnowszych źródeł (tryb klasyczny)", + "HelpTxtOptWritePkgConfig": "Zapisuje sformatowany plik NuGet packages.config do użytku z zewnętrznym buforowaniem binarnym. Zobacz `vcpkg help binarycaching`, aby uzyskać więcej informacji", + "HelpUpdateBaseline": "Najlepszym podejściem do utrzymania aktualnych bibliotek jest aktualizacja odniesienia do linii bazowej. Zapewni to, że wszystkie pakiety, w tym te przechodnie, zostaną zaktualizowane. Jeśli jednak musisz zaktualizować pakiet niezależnie, możesz użyć ograniczenia „wersja>=”.", + "HelpUpdateCommand": "Wyświetla listę pakietów, które można uaktualnić", + "HelpUpgradeCommand": "Odbudowuje wszystkie nieaktualne pakiety", + "HelpVersionCommand": "Wyświetla informacje o wersji", "HelpVersionDateScheme": "Data (2021-01-01.5)", "HelpVersionGreater": "W polu „zależności”, każda zależność może mieć wymienione ograniczenie minimalne. Te minimalne ograniczenia będą używane przechodnio w zależności od tej biblioteki. Można dodatkowo określić minimalną wersję portu za pomocą sufiksu „#”.", "HelpVersionScheme": "Rozdzielana kropkami sekwencja liczb (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Niepoprawny podpis pliku archiwum", "IncorrectPESignature": "Niepoprawny podpis PE", "IncrementedUtf8Decoder": "Zwiększono Utf8Decoder na końcu ciągu", - "InfoSetEnvVar": "Możesz również ustawić zmienną środowiskową „{env_var}” na wybrany edytor.", + "InfoSetEnvVar": "Można również ustawić {env_var} na wybrany edytor.", "InitRegistryFailedNoRepo": "Nie można utworzyć rejestru w lokalizacji {path}, ponieważ nie jest to katalog główny repozytorium GIT.\nUżyj polecenia `git init {command_line}`, aby utworzyć repozytorium GIT w tym folderze.", "InstallCopiedFile": "{path_source} — > wykonano {path_destination}", "InstallFailed": "niepowodzenie: {path}: {error_msg}", "InstallPackageInstruction": "Po otwarciu projektu przejdź do pozycji Narzędzia->Menedżer pakietów NuGet->Konsola menedżera pakietów i wklej:\n Install-Package \"{value}\" -Source \"{path}\"", - "InstallRootDir": "(Eksperymentalne) Określ katalog główny instalacji.", + "InstallRootDir": "Zainstalowany katalog (eksperymentalny)", "InstallSkippedUpToDateFile": "{path_source} -> pominięto {path_destination}, aktualne", "InstallWithSystemManager": "Możesz zainstalować to narzędzie za pośrednictwem menedżera pakietów systemowych.", "InstallWithSystemManagerMono": "Użytkownicy systemu Ubuntu 18.04 mogą potrzebować nowszej wersji platformy Mono dostępnej pod adresem {url}.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Instalowanie portu z lokalizacji: {path}", "InstallingMavenFile": "{path} instaluje plik narzędzia Maven", "InstallingPackage": "Instalowanie {action_index}/{count} {spec}...", - "IntegrateBashHelp": "Włącz bash tab-completion.", - "IntegrateFishHelp": "Włącz uzupełnianie kart programu fish.", - "IntegrateInstallHelpLinux": "Udostępnij zainstalowane pakiety dla całego użytkownika.", - "IntegrateInstallHelpWindows": "Udostępnij zainstalowane pakiety dla całego użytkownika. Wymaga uprawnień administratora przy pierwszym użyciu.", - "IntegratePowerShellHelp": "Włącz uzupełnianie karty programu PowerShell.", - "IntegrateProjectHelp": "Wygeneruj odwołujący się pakiet NuGet dla pojedynczego użycia projektu programu VS.", - "IntegrateRemoveHelp": "Usuń integrację obejmującą całego użytkownika.", - "IntegrateZshHelp": "Włącz zsh tab-completion.", - "IntegrationFailed": "Integracja nie została zastosowana.", + "IntegrateBashHelp": "Włącz bash tab-completion. Dotyczy systemu innego niż Windows", + "IntegrateFishHelp": "Włącz uzupełnianie karty ryby. Dotyczy systemu innego niż Windows", + "IntegrateInstallHelpLinux": "Udostępnia zainstalowane pakiety dla wszystkich użytkowników", + "IntegrateInstallHelpWindows": "Udostępnia zainstalowane pakiety dla wszystkich użytkowników. Wymaga uprawnień administratora przy pierwszym użyciu", + "IntegrateNonWindowsOnly": "{command_line} nie jest przeznaczony tylko dla systemu Windows i nie jest obsługiwany w tym systemie.", + "IntegratePowerShellHelp": "Włącz uzupełnianie karty programu PowerShell. Dotyczy tylko systemu Windows", + "IntegrateProjectHelp": "Wygeneruj odwołujący się pakiet NuGet dla pojedynczego użycia projektu programu Visual Studio. Dotyczy tylko systemu Windows", + "IntegrateRemoveHelp": "Usuwa integrację na poziomie użytkownika", + "IntegrateWindowsOnly": "{command_line} jest przeznaczony tylko dla systemu Windows i nie jest obsługiwany w tym systemie.", + "IntegrateZshHelp": "Włącz uzupełnianie karty zsh. Dotyczy systemu innego niż Windows", + "IntegrationFailedVS2015": "Integracja nie została zastosowana dla programu Visual Studio 2015.", "InternalCICommand": "vcpkg CI to polecenie wewnętrzne, które zmieni się niezgodnie lub zostanie usunięte w dowolnym momencie.", "InternalErrorMessage": "błąd wewnętrzny: ", "InternalErrorMessageContact": "Należy otworzyć problem na stronie https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug, podając szczegółowe kroki w celu odtworzenia problemu.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "Program vcpkg nie obsługuje komentarzy w stylu C, jednak większość obiektów zezwala na używanie pól z prefiksem $ jako komentarzy.", "InvalidCommitId": "Nieprawidłowy identyfikator zatwierdzenia: {commit_sha}", "InvalidDefaultFeatureName": "„default” jest zarezerwowaną nazwą funkcji", - "InvalidDependency": "zależności muszą być małymi literami alfanumerycznymi i łącznikami, a nie jedną z zastrzeżonych nazw", "InvalidFeature": "funkcje muszą być małymi literami alfanumerycznymi i łącznikami, a nie jedną z zastrzeżonych nazw", "InvalidFileType": "niepowodzenie: {path} nie może obsłużyć typu pliku", "InvalidFilename": "Nazwa pliku nie może zawierać nieprawidłowych znaków {value}, ale była {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "Biblioteka była nieprawidłowa: nie można odnaleźć elementu członkowskiego konsolidatora.", "InvalidLinkage": "Nieprawidłowy typ powiązania {system_name}: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "nieprawidłowe wyrażenie logiczne, nieoczekiwany znak", - "InvalidLogicExpressionUsePipe": "nieprawidłowe wyrażenie logiczne, użyj znaku „|” zamiast „or”", + "InvalidLogicExpressionUsePipe": "nieprawidłowe wyrażenie logiki, użyj znaku „|”, a nie znaku „or”", "InvalidNoVersions": "Plik nie zawiera żadnych wersji.", "InvalidOptionForRemove": "Element „usuń” akceptuje biblioteki lub „--outdated”", "InvalidPortVersonName": "Znaleziono nieprawidłową nazwę pliku wersji portu: `{path}`.", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "wartość [\"{json_field}\"] musi być obiektem", "JsonFieldNotString": "wartość [\"{json_field}\"] musi być ciągiem", "JsonFileMissingExtension": "plik JSON {path} musi mieć rozszerzenie json (wszystkie małe litery)", - "JsonSwitch": "(Eksperymentalne) Żądanie danych wyjściowych JSON.", + "JsonSwitch": "Drukuje plik JSON zamiast zwykłego tekstu", "JsonValueNotArray": "Wartość json nie jest tablicą", "JsonValueNotObject": "Wartość json nie jest obiektem", "JsonValueNotString": "Wartość json nie jest ciągiem", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Wydanie dynamiczne (/MD)", "LinkageStaticDebug": "Debugowanie statyczne (/MTd)", "LinkageStaticRelease": "Wydanie statyczne (/MT)", - "ListHelp": "Argument powinien być podciągiem do wyszukania lub bez argumentu umożliwiającego wyświetlenie wszystkich zainstalowanych bibliotek.", + "ListHelp": "Wyświetla listę zainstalowanych bibliotek", "ListOfValidFieldsForControlFiles": "To jest lista prawidłowych pól dla plików CONTROL (z uwzględnieniem wielkości liter):", "LoadingCommunityTriplet": "-- [COMMUNITY] Ładowanie konfiguracji potrójnej z lokalizacji: {path}", "LoadingDependencyInformation": "Trwa ładowanie informacji o zależnościach dla {count} pakietów...", @@ -707,8 +826,7 @@ "MsiexecFailedToExtract": "nie można wykonać procesu msiexec podczas wyodrębniania z lokalizacji \"{path}\" z kodem uruchamiania lub zakończenia {exit_code} i komunikatem:", "MultiArch": "Element Multi-Arch musi mieć wartość „same”, ale miał wartość {option}", "MultipleFeatures": "Pakiet {package_name} deklaruje wielokrotnie funkcję {feature}; upewnij się, że funkcje mają różne nazwy", - "MutuallyExclusiveOption": "Opcji --{value} nie można używać z opcją --{option}.", - "NavigateToNPS": "Przejdź do adresu {url} w preferowanej przeglądarce.", + "MutuallyExclusiveOption": "Wartości --{value} nie można używać z opcją --{option}.", "NewConfigurationAlreadyExists": "Utworzenie manifestu spowoduje zastąpienie pliku vcpkg-configuration.json w lokalizacji {path}.", "NewManifestAlreadyExists": "Manifest jest już obecny w ścieżce {path}.", "NewNameCannotBeEmpty": "parametr --name nie może być pusty.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "Określ parametr --name i --version, aby utworzyć manifest przeznaczony dla bibliotek języka C++ lub określ parametr --application, aby wskazać, że manifest nie jest przeznaczony do użycia jako port.", "NewVersionCannotBeEmpty": "parametr --version nie może być pusty.", "NoArgumentsForOption": "Opcja --{option} nie akceptuje argumentu.", - "NoCachedPackages": "Żadne pakiety nie są buforowane.", "NoError": "brak błędów", "NoInstalledPackages": "Nie zainstalowano żadnych pakietów. Czy chodziło Ci o `search`?", "NoLocalizationForMessages": "Brak zlokalizowanych komunikatów dla następujących elementów: ", @@ -739,22 +856,27 @@ "OptionRequiresAValue": "opcja '{option}' wymaga wartości", "OptionRequiresOption": "--{value} wymaga opcji --{option}", "OptionUsedMultipleTimes": "opcja '{option}' została określona wiele razy", - "OptionalCommand": "opcjonalne polecenie", "Options": "Opcje", "OriginalBinParagraphHeader": "\nOryginalny akapit binarny", + "OtherCommandsHeader": "Inne", "OverlayPatchDir": "Ścieżka nakładki „{path}” musi istnieć i musi być katalogiem.", - "OverlayTriplets": "Nałóż tryplety ze ścieżki {path}:", + "OverlayPortsDirectoriesHelp": "Katalogi portów nakładki (również: {env_var})", + "OverlayTripletDirectoriesHelp": "Katalogi trójek nakładek (również: {env_var})", + "OverlayTriplets": "Nałóż trójki ze ścieżki „{path}”:", "OverwritingFile": "Plik {path} był już obecny i zostanie zastąpiony", "PECoffHeaderTooShort": "Podczas analizowania przenośnego pliku wykonywalnego {path} rozmiar nagłówka COFF jest za mały, aby zawierał prawidłowy nagłówek PE.", - "PEConfigCrossesSectionBoundary": "Podczas analizowania {path} przenośnego pliku wykonywalnego, katalog konfiguracji obrazu przekracza granicę sekcji.", - "PEImportCrossesSectionBoundary": "Podczas analizowania {path} przenośnego pliku wykonywalnego, tabela importu przekracza granicę sekcji.", + "PEConfigCrossesSectionBoundary": "Podczas analizowania przenośnego pliku wykonywalnego {path} katalog konfiguracji obrazu przekracza granicę sekcji.", + "PEImportCrossesSectionBoundary": "Podczas analizowania przenośnego pliku wykonywalnego {path} tabela importu przekracza granicę sekcji.", "PEPlusTagInvalid": "Podczas analizowania przenośnego pliku wykonywalnego {path} opcjonalny nagłówek nie miał wartości PE32 ani PE32+.", "PERvaNotFound": "Podczas analizowania {path} przenośnego pliku wykonywalnego, nie można było znaleźć elementu RVA {value:#X}.", "PESignatureMismatch": "Podczas analizowania {path} przenośnego pliku wykonywalnego, niezgodność podpisów.", "PackageAlreadyRemoved": "nie można usunąć elementu {spec}: już usunięto", + "PackageDiscoveryHeader": "Odnajdywanie pakietów", "PackageFailedtWhileExtracting": "Element \"{value}\" nie działa podczas wyodrębniania ścieżki {path}.", - "PackageInfoHelp": "Wyświetl szczegółowe informacje o pakietach.", - "PackageRootDir": "(Eksperymentalne) Określ katalog główny pakietów.", + "PackageInfoHelp": "Wyświetl szczegółowe informacje o pakietach", + "PackageInstallationHeader": "Instalacja pakietu", + "PackageManipulationHeader": "Manipulowanie pakietami", + "PackageRootDir": "Katalog pakietów (eksperymentalny)", "PackagesToInstall": "Następujące pakiety zostaną skompilowane i zainstalowane:", "PackagesToInstallDirectly": "Następujące pakiety zostaną zainstalowane bezpośrednio:", "PackagesToModify": "Dodatkowe pakiety (*) zostaną zmodyfikowane w celu ukończenia tej operacji.", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "Dla {value} oczekiwano wartości {expected}", "ParseControlErrorInfoWhileLoading": "podczas ładowania ścieżki {path}:", "ParseControlErrorInfoWrongTypeFields": "Następujące pola miały nieprawidłowe typy:", - "ParseIdentifierError": "„{value}” nie jest prawidłowym identyfikatorem. Identyfikatory muszą być pisane małymi literami alfanumerycznymi i łącznikami oraz nie mogą być zastrzeżone (zobacz {url}, aby uzyskać więcej informacji)", - "ParsePackageNameError": "„{package_name}” nie jest prawidłową nazwą pakietu. Nazwy pakietów muszą być pisane małymi literami alfanumeryczne i nie mogą być zastrzeżone (zobacz {url}, aby uzyskać więcej informacji)", - "ParsePackagePatternError": "Pakiet „{package_name}” nie jest prawidłowym wzorcem pakietu. Wzorce pakietów muszą używać tylko jednego symbolu wieloznacznego (*) i musi on być ostatnim znakiem we wzorcu (zobacz {url}, aby uzyskać więcej informacji)", + "ParseFeatureNameError": "„{package_name}” nie jest prawidłową nazwą funkcji. Nazwy funkcji muszą zawierać małe litery alfanumeryczne + myślniki i nie mogą być zastrzeżone (więcej informacji można znaleźć w {url}).", + "ParseIdentifierError": "„{value}” nie jest prawidłowym identyfikatorem. Identyfikatory muszą składać się z małych liter alfanumerycznych + myślników i nie mogą być zastrzeżone (więcej informacji można znaleźć w {url}).", + "ParsePackageNameError": "„{package_name}” nie jest prawidłową nazwą pakietu. Nazwy pakietów muszą zawierać małe litery alfanumeryczne + myślniki i nie mogą być zastrzeżone (więcej informacji można znaleźć w {url}).", + "ParsePackagePatternError": "Pakiet „{package_name}” nie jest prawidłowym wzorcem pakietu. Wzorce pakietów muszą używać tylko jednego znaku wieloznacznego (*) i musi to być ostatni znak we wzorcu (więcej informacji można znaleźć w sekcji {url}).", "PathMustBeAbsolute": "Wartość zmiennej środowiskowej X_VCPKG_REGISTRIES_CACHE nie jest bezwzględna: {path}", "PerformingPostBuildValidation": "-- Przeprowadzanie weryfikacji po kompilacji", "PortBugAllowRestrictedHeaders": "W wyjątkowych okolicznościach te zasady można wyłączyć za pośrednictwem {env_var}", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "Aby sprawdzić pliki {extension}, użyj:", "PortBugInvalidCrtLinkage": "Następujące pliki binarne powinny używać zestawu CRT {expected}.", "PortBugInvalidCrtLinkageEntry": "Linki {path} z:", + "PortBugKernel32FromXbox": "Wybrana potrójna wartość jest przeznaczona dla konsoli Xbox, ale poniższe biblioteki DLL łączą się z jądrem kernel32. Tych bibliotek DLL nie można załadować na konsoli Xbox, w której nie ma jądra kernel32. Jest to zwykle spowodowane połączeniem z biblioteką kernel32.lib, a nie odpowiednią biblioteką umbrella, taką jak onecore_apiset.lib lub xgameplatform.lib.", "PortBugMergeLibCMakeDir": "Folder /lib/cmake powinien zostać scalony z folderem /debug/lib/cmake i przeniesiony do folderu /share/{spec}/cmake. Użyj funkcji pomocnika `vcpkg_cmake_config_fixup()` z portu vcpkg-cmake-config`", "PortBugMismatchedNumberOfBinaries": "Niezgodność liczby plików binarnych debugowania i wydania.", "PortBugMisplacedCMakeFiles": "Następujące pliki cmake zostały znalezione poza elementem /share/{spec}. Umieść pliki cmake w folderze /share/{spec}.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "Jeśli nie można wyłączyć tworzenia pliku bin\\ i/lub debug\\bin\\, użyj go w pliku portów, aby je usunąć", "PortBugRemoveEmptyDirectories": "Jeśli katalog powinien być wypełniony, ale nie, może to oznaczać błąd w pliku portfile.\nJeśli katalogi nie są potrzebne i nie można wyłączyć ich tworzenia, użyj następującego elementu w pliku portów, aby je usunąć:", "PortBugRemoveEmptyDirs": "plik(REMOVE_RECURSE usuń katalogi pozostawione przez powyższe zmiany nazw)", - "PortBugRestrictedHeaderPaths": "Poniższe nagłówki z ograniczeniami mogą uniemożliwić poprawne skompilowanie podstawowego środowiska uruchamiania języka C++ i innych pakietów. W wyjątkowych okolicznościach te zasady można wyłączyć za pośrednictwem usługi {env_var}.", + "PortBugRestrictedHeaderPaths": "Następujące ograniczone nagłówki mogą uniemożliwić poprawną kompilację podstawowego środowiska uruchomieniowego C++ i innych pakietów. W wyjątkowych okolicznościach zasady te można wyłączyć, ustawiając zmienną CMake VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS w pliku portfile.cmake.", "PortBugSetDllsWithoutExports": "Biblioteki DLL bez żadnych eksportów są prawdopodobnie usterką w skrypcie kompilacji. Jeśli jest to zamierzone, dodaj następujący wiersz w pliku portfile:\nustaw(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS włączone)\nNastępujące biblioteki DLL nie mają eksportów:", "PortDependencyConflict": "Port {package_name} ma następujące nieobsługiwane zależności:", "PortDoesNotExist": "Pakiet {package_name} nie istnieje", @@ -827,21 +951,26 @@ "PortsDiffHelp": "Argument powinien być gałęzią/tagiem/skrótem do wyewidencjonowania.", "PortsNoDiff": "Między tymi dwoma zatwierdzeniami nie wprowadzono żadnych zmian w portach.", "PortsRemoved": "Następujące porty ({count}) zostały usunięte:", - "PortsUpdated": "\nAktualizowano następujące porty ({count}):", + "PortsUpdated": "Aktualizowano następujące porty ({count}):", "PrebuiltPackages": "Istnieją pakiety, które nie zostały skompilowane. Aby je skompilować, uruchom:", "PreviousIntegrationFileRemains": "Poprzedni plik integracji nie został usunięty.", "ProgramReturnedNonzeroExitCode": "Operacja {tool_name} nie powiodła się. Kod zakończenia: ({exit_code}).", "ProvideExportType": "Wymagana jest co najmniej jedna z następujących opcji: --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "Wypychanie dostawcy {vendor} do lokalizacji \"{path}\" nie powiodło się. Aby uzyskać więcej informacji, użyj parametru --debug.", - "RegeneratesArtifactRegistry": "Ponownie generuje rejestr artefaktów.", + "RegeneratesArtifactRegistry": "Ponownie generuje rejestr artefaktów", "RegistryCreated": "Pomyślnie utworzono rejestr w lokalizacji {path}", "RegistryValueWrongType": "Scieżka {path} wartości rejestru była nieoczekiwanym typem.", "RemoveDependencies": "Aby usunąć zależności w trybie manifestu, edytuj manifest (vcpkg.json) i uruchom polecenie „instaluj”.", "RemovePackageConflict": "Element {spec} nie jest zainstalowany, ale pakiet {package_name} jest zainstalowany dla {triplet}. Czy chodziło Ci o {package_name}:{triplet}?", "RemovingPackage": "Usuwanie {action_index}/{count} {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "Przywrócono pakiet z lokalizacji \"{path}\"", - "RestoredPackagesFromVendor": "Przywrócono następującą liczbę pakietów: {count} z {value} w lokalizacji {elapsed}. Użyj opcji --debug, aby wyświetlić więcej szczegółów.", + "RestoredPackagesFromAWS": "Przywrócono następującą liczbę pakietów: {count} z platformy AWS w ciągu {elapsed}. Użyj opcji --debug, aby wyświetlić więcej szczegółów.", + "RestoredPackagesFromCOS": "Przywrócono następującą liczbę pakietów: {count} z COS w ciągu {elapsed}. Użyj opcji --debug, aby wyświetlić więcej szczegółów.", + "RestoredPackagesFromFiles": "Przywrócono następującą liczbę pakietów: {count} ze {path} w ciągu {elapsed}. Użyj opcji --debug, aby wyświetlić więcej szczegółów.", + "RestoredPackagesFromGCS": "Przywrócono następującą liczbę pakietów: {count} z GCS w ciągu {elapsed}. Użyj opcji --debug, aby wyświetlić więcej szczegółów.", + "RestoredPackagesFromGHA": "Przywrócono następującą liczbę pakietów: {count} z pamięci podręcznej funkcji GitHub Actions w ciągu {elapsed}. Użyj opcji --debug, aby wyświetlić więcej szczegółów.", + "RestoredPackagesFromHTTP": "Przywrócono następującą liczbę pakietów: {count} z serwerów HTTP w ciągu {elapsed}. Użyj opcji --debug, aby wyświetlić więcej szczegółów.", + "RestoredPackagesFromNuGet": "Przywrócono następującą liczbę pakietów: {count} z menedżera NuGet w ciągu {elapsed}. Użyj opcji --debug, aby wyświetlić więcej szczegółów.", "ResultsHeader": "WYNIKI", "ScriptAssetCacheRequiresScript": "oczekiwane argumenty: konfiguracja zasobu „x-script” wymaga dokładnie szablonu exec jako argumentu", "SearchHelp": "Argument powinien być podciągiem do wyszukania lub bez argumentu umożliwiającego wyświetlenie wszystkich bibliotek.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "Pomijanie czyszczenia zawartości {path}, ponieważ nie był to katalog.", "SourceFieldPortNameMismatch": "Pole „Source” wewnątrz pliku CONTROL lub pole „name” wewnątrz pliku vcpkg.json ma nazwę {package_name} i nie jest zgodne z katalogiem portów w lokalizacji \"{path}\".", "SpecifiedFeatureTurnedOff": "Funkcja „{command_name}” została specjalnie wyłączona, ale określono opcję --{option}.", - "SpecifyDirectoriesContaining": "Określ katalogi zawierające potrójne pliki.\n(również: „{env_var}”)", - "SpecifyDirectoriesWhenSearching": "Określ katalogi, które mają być używane podczas wyszukiwania portów.\n(również: „{env_var}”)", - "SpecifyHostArch": "Określ potrójną architekturę hosta. Zobacz „vcpkg help triplet”.\n(domyślnie: „{env_var}”)", - "SpecifyTargetArch": "Określ potrójną architekturę docelową. Zobacz „vcpkg help triplet”.\n(domyślnie: „{env_var}”)", + "SpecifyHostArch": "Potrójne hostowanie. Zobacz „vcpkg help triplet” (domyślnie: {env_var})", + "SpecifyTargetArch": "Potrójna wartość docelowa. Zobacz „vcpkg help triplet” (domyślnie: {env_var})", "StartCodeUnitInContinue": "znaleziono jednostkę kodu początkowego w pozycji kontynuuj", "StoreOptionMissingSha": "Opcja --store jest nieprawidłowa bez zestawu sha512", - "StoredBinariesToDestinations": "Przechowywane dane binarne w {count} lokalizacjach docelowych.", + "StoredBinariesToDestinations": "Przechowywane dane binarne w {count} lokalizacjach docelowych w ciągu {elapsed}.", "StoredBinaryCache": "Przechowywana pamięć podręczna danych binarnych: \"{path}\"", "SuccessfulyExported": "Wyeksportowano {package_name} do {path}", "SuggestGitPull": "Wynik może być nieaktualny. Uruchom polecenie `git pull`, aby uzyskać najnowsze wyniki.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "Może być konieczne zaktualizowanie pliku binarnego vcpkg; spróbuj uruchomić komendę {command_line}, aby zaktualizować.", "SupportedPort": "Port {package_name} jest obsługiwany.", "SwitchUsedMultipleTimes": "przełącznik '{option}' został określony wiele razy", + "SynopsisHeader": "Streszczenie:", "SystemApiErrorMessage": "wywołanie {system_api} nie powiodło się. Kod zakończenia:{exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "Oczekiwano, że zmienna środowiskowa SystemRoot będzie zawsze ustawiona w systemie Windows.", "SystemTargetsInstallFailed": "nie można zainstalować systemowego pliku obiektów docelowych w ścieżce {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Końcowy przecinek w tablicy", "TrailingCommaInObj": "Końcowy przecinek w obiekcie", "TripletFileNotFound": "Nie znaleziono pliku potrójnego {triplet}.cmake", + "TripletLabel": "Trójka:", "TwoFeatureFlagsSpecified": "Zarówno wartość „{value}”, jak i „{value}” zostały określone jako flagi funkcji.", "UnableToClearPath": "nie można usunąć ścieżki {path}", "UnableToReadAppDatas": "nie można odczytać %LOCALAPPDATA% i %APPDATA%", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "nie zaktualizowano rejestru „{url}”: „{value}”", "UpdateBaselineRemoteGitError": "system git nie może pobrać repozytorium zdalnego „{url}”", "UpdateBaselineUpdatedBaseline": "zaktualizowany rejestr „{url}”: punkt odniesienia „{old_value}” -> „{new_value}”", - "UpgradeInManifest": "Polecenie uaktualnienia nie obsługuje obecnie trybu manifestu. Zamiast tego zmodyfikuj plik vcpkg.json i uruchom instalację.", + "UpgradeInManifest": "Uaktualnienie uaktualnia instalację w trybie klasycznym i w związku z tym nie obsługuje trybu manifestu. Rozważ zaktualizowanie zależności, aktualizując punkt odniesienia do bieżącej wartości za pomocą polecenia vcpkg x-update-baseline i uruchamiając instalację programu vcpkg.", "UpgradeRunWithNoDryRun": "Jeśli chcesz ponownie skompilować powyższe pakiety, uruchom polecenie z opcją --no-dry-run.", "UploadedBinaries": "Przekazano dane binarne do {count} {vendor}.", "UploadedPackagesToVendor": "Przekazano następującą liczbę pakietów do dostawcy {vendor} w {elapsed}: {count}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "nieprawidłowe polecenie: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "Wartość zmiennej środowiskowej X_VCPKG_REGISTRIES_CACHE nie jest katalogiem: {path}", "VcpkgRootRequired": "Ustawienie VCPKG_ROOT jest wymagane dla autonomicznego ładowania początkowego.", - "VcpkgRootsDir": "Określ katalog główny programu vcpkg.\n(domyślnie: „{env_var}”)", + "VcpkgRootsDir": "Katalog główny vcpkg (domyślnie: {env_var})", "VcpkgSendMetricsButDisabled": "Przekazano parametr --sendmetrics, ale metryki są wyłączone.", + "VcpkgUsage": "użycie: vcpkg [--switches] [--options=values] [arguments] @response_file", "VcvarsRunFailed": "nie można uruchomić pliku vcvarsall.bat w celu uzyskania środowiska Visual Studio", "VcvarsRunFailedExitCode": "podczas próby uzyskania środowiska programu Visual Studio plik vcvarsall.bat zwrócił kod {exit_code}", "VersionBaselineMismatch": "Najnowsza wersja jest {expected}, ale plik punktu odniesienia zawiera {actual}.\nUruchom:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\nw celu zaktualizowania wersji punktu odniesienia.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "W ścieżce {path} pakietu {package_name} brakuje pliku bazy danych wersji\nUruchom:\nvcpkg x-add-version {package_name}\nw celu utworzenia pliku wersji.", "VersionGitEntryMissing": "brak wpisu bazy danych wersji dla pakietu {package_name} w wersji {version}.\nDostępne wersje:", "VersionInDeclarationDoesNotMatch": "Wersja zadeklarowana w pliku jest niezgodna z wyewidencjonowaną wersją: {version}", - "VersionIncomparable1": "konflikt wersji w {spec}: {package_name} wymagane {expected}, ale program vcpkg nie może porównać go z {actual}.\nW dwóch wersjach użyto niezgodnych schematów:", - "VersionIncomparable2": "Wersja „{version}” była schematem {new_scheme}", - "VersionIncomparable3": "Można to rozwiązać, dodając jawne przesłonięcie do preferowanej wersji, na przykład:", - "VersionIncomparable4": "Aby uzyskać więcej informacji, zobacz sekcję „vcpkg help versioning”.", + "VersionIncomparable1": "konflikt wersji w elemencie {spec}: {constraint_origin} wymaga {expected}, którego nie można porównać z wersją bazową {actual}.", + "VersionIncomparable2": "{version_spec} ma schemat {new_scheme}", + "VersionIncomparable3": "Można to rozwiązać, dodając jawne zastąpienie do preferowanej wersji. Na przykład:", + "VersionIncomparable4": "Aby uzyskać więcej informacji, zobacz sekcję `vcpkg help versioning`.", + "VersionIncomparableSchemeString": "Obie wersje mają ciąg schematu, ale inny tekst podstawowy.", + "VersionIncomparableSchemes": "Te wersje mają nieporównywalne schematy:", "VersionInvalidDate": "„{version}“ nie jest prawidłową wersją daty. Daty muszą być zgodne z formatem RRRR-MM-DD, a uściślacze muszą być dodatnimi wartościami całkowitymi, rozdzielonymi kropkami, bez zer wiodących.", "VersionInvalidRelaxed": "„{version}“ nie jest prawidłową wersją swobodną (serwer z dowolną liczbą elementów liczbowych).", "VersionInvalidSemver": "„{version}“ nie jest prawidłową wersją semantyczną. Zapoznaj się z .", "VersionMissing": "oczekiwano pola przechowywania wersji (jednej z wersji, version-date, version-semver lub version_string)", - "VersionMissingRequiredFeature": "{spec}@{version} nie ma wymaganej funkcji {feature}", + "VersionMissingRequiredFeature": "{version_spec} nie ma wymaganej funkcji {feature} wymaganej przez użytkownika {constraint_origin}", "VersionNotFound": "{expected} niedostępne, dostępna jest tylko {actual}", - "VersionNotFoundDuringDiscovery": "nie znaleziono wersji podczas odnajdywania: {spec}@{version}\nTo jest wewnętrzny błąd programu vcpkg. Otwórz problem w witrynie https://github.com/Microsoft/vcpkg ze szczegółowymi krokami, aby odtworzyć problem.", - "VersionNotFoundInVersionsFile": "Nie znaleziono wersji {version} w pliku wersji.\nUruchom:\nvcpkg x-add-version {package_name}\nw celu dodania nowej wersji portu.", + "VersionNotFoundInVersionsFile": "Wersja {version} nie została znaleziona w pliku wersji dla {package_name}.\nUruchom:\nvcpkg x-add-version {package_name}\nw celu dodania nowej wersji portu.", "VersionRejectedDueToBaselineMissing": "Ścieżka {path} została odrzucona, ponieważ używa elementu „{json_field}” i nie ma „wbudowanego punktu odniesienia”. Można to naprawić, usuwając zastosowania elementu „{json_field}” lub dodając „wbudowany punkt odniesienia”.\nAby uzyskać więcej informacji, zobacz sekcję `vcpkg help versioning`.", "VersionRejectedDueToFeatureFlagOff": "Ścieżka {path} została odrzucona, ponieważ używa elementu „{json_field}”, a flaga funkcji `versions` jest wyłączona. Można to naprawić, usuwając element „{json_field}” lub włączając flagę funkcji `versions`.\nAby uzyskać więcej informacji, zobacz sekcję `vcpkg help versioning`.", "VersionSchemeMismatch": "Baza danych wersji deklaruje wersję {version} jako {expected}, ale ścieżka {path} deklaruje ją jako {actual}. Wersje muszą być unikatowe, nawet jeśli są zadeklarowane przy użyciu różnych schematów.\nUruchom:\nvcpkg x-add-version {package_name} --overwrite-version\nw celu zastąpienia schematu zadeklarowanego w bazie danych wersji schematem zadeklarowanym w porcie.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "Po znaku „#” w tekście wersji musi następować wersja portu (nieujemna liczba całkowita)", "VersionSpecMismatch": "Nie można załadować portu, ponieważ wersje są niespójne. Plik „{path}” zawiera wersję {actual_version}, ale baza danych wskazuje, że powinna to być wersja {expected_version}.", "VersionTableHeader": "Wersja", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "Trwa oczekiwanie na zakończenie procesów podrzędnych...", "WaitingToTakeFilesystemLock": "trwa oczekiwanie na zablokowanie systemu plików na ścieżce {path}...", "WarnOnParseConfig": "Znaleziono następujące ostrzeżenia w konfiguracji {path}:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "podczas walidacji wersji: {version}", "WindowsOnlyCommand": "To polecenie obsługuje tylko system Windows.", "WroteNuGetPkgConfInfo": "Zapisano informacje o konfiguracji pakietu NuGet w ścieżce {path}", - "UnrecognizedCommand$": "Nierozpoznane polecenie '${p0}'", - "Use$ToGetHelp": "Użyj ${p0}, aby uzyskać pomoc", - "FatalTheRootFolder$CanNotBeCreated": "Krytyczny: nie można utworzyć folderu głównego „${p0}”", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Krytyczny: nie można utworzyć pliku konfiguracji globalnej „${p0}”", + "FatalTheRootFolder$CannotBeCreated": "Krytyczny: nie można utworzyć folderu głównego „${p0}”", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Krytyczny: nie można utworzyć pliku konfiguracji globalnej „${p0}”", "VCPKGCOMMANDWasNotSet": "nie ustawiono VCPKG_COMMAND", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "Uruchomienie programu vcpkg wewnętrznie zwróciło niezerowy kod zakończenia: ${p0}", "failedToDownloadFrom$": "nie można pobrać z pliku ${p0}", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "opis powinien być typu 'string', znaleziono '${p0}'", "optionsShouldBeASequenceFound$": "opcje powinny być sekwencją, znaleziono '${p0}'", "DuplicateKeysDetectedInManifest$": "Wykryto zduplikowane klucze w manifeście: „${p0}”", - "in$Skipping$BecauseItIsA$": "w ${p0} pomijanie ${p1}, ponieważ jest to ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "brak pliku postscript: uruchom ponownie za pomocą funkcji powłoki vcpkg, a nie pliku wykonywalnego", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Zduplikuj definicję ${p0} podczas aktywacji. Nowa wartość zastąpi starą.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "Narzędzie duplikacji zadeklarowało element ${p0} podczas aktywacji. Nowa wartość zastąpi starą.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(nieznany postęp)", "verifying": "weryfikowanie", "downloading$$": "pobieranie pliku ${p0} -> ${p1}", - "unpacking": "rozpakowanie", "unpacking$": "rozpakowywanie ${p0}", "Installing$": "Trwa instalowanie ${p0}...", "$AlreadyInstalled": "Element ${p0} jest już zainstalowany.", "Downloading$": "Trwa pobieranie ${p0}...", "Unpacking$": "Trwa rozpakowywanie ${p0}...", "ErrorInstalling$$": "Błąd podczas instalowania elementu ${p0} — ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "Oczekiwano pojedynczej wartości dla ${p0} — znaleziono wiele", - "Synopsis": "Synopsis", - "Description": "Opis", - "Switches": "Przełączniki", - "SeeAlso": "Zobacz też", "error": "błąd:", "warning": "ostrzeżenie:", + "ExpectedASingleValueFor$FoundMultiple": "Oczekiwano pojedynczej wartości dla ${p0} — znaleziono wiele", "ExpectedASingleValueFor$": "Oczekiwano pojedynczej wartości dla „--${p0}”.", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Przy założeniu, że element „${p0}” jest poprawny; podaj skrót w metadanych artefaktu, aby pominąć ten komunikat.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "Pobrany plik „${p0}” nie miał poprawnego skrótu (${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "Znaleziono niezgodną wartość ${p0} w elemencie „${p1}”. W przypadku literału ${p2} użyj zamiast tego wartości ${p3}${p4}.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "Nie można odnaleźć wartości dla elementu {${p0}} w elemencie „${p1}”. Aby zapisać wartość literału, użyj zamiast tego wartości „{{${p2}}}”.", "MatchedMoreThanOneInstallBlock$": "Dopasowano więcej niż jeden blok instalacji [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Uzyskuje wszystko, do czego odwołuje się projekt, bez aktywowania", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "Dzięki temu użytkownik może wstępnie pobrać narzędzia wymagane dla projektu.", "UnableToFindProjectInFolderorParentFoldersFor$": "Nie można odnaleźć projektu w folderze (lub folderach nadrzędnych) dla elementu ${p0}", "UnableToAcquireProject": "Nie można uzyskać projektu", - "AcquireArtifactsInTheRegistry": "Uzyskiwanie artefaktów w rejestrze", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "Dzięki temu odbiorca może uzyskać (pobrać i rozpakować) artefakty. Artefakty muszą zostać aktywowane, aby można było ich używać", "NoArtifactsSpecified": "Nie określono artefaktów", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Określono wiele pakietów, ale nie jednakową liczbę przełączników ${p0}", "NoArtifactsAreAcquired": "Nie uzyskano żadnych artefaktów", "AllArtifactsAreAlreadyInstalled": "Wszystkie artefakty są już zainstalowane", "$ArtifactsInstalledSuccessfully": "Pomyślnie zainstalowano artefakty (${p0})", "InstallationFailedStopping": "Instalacja nie powiodła się — zatrzymywanie", - "ActivatesTheToolsRequiredForAProject": "Aktywuje narzędzia wymagane dla projektu", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "Dzięki temu użytkownik może aktywować narzędzia wymagane dla projektu. Jeśli narzędzia nie są jeszcze zainstalowane, wymusi to ich pobranie i zainstalowanie przed aktywacją.", - "AddsAnArtifactToTheProject": "Dodaje artefakt do projektu", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "Dzięki temu użytkownik może dodać artefakt do projektu. Spowoduje to również aktywowanie projektu.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Określono wiele artefaktów, ale nie jednakową liczbę przełączników ${p0}", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Podjęto próbę dodania artefaktu [${p0}]:${p1}, ale nie można określić rejestru do użycia.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Podjęto próbę dodania rejestru ${p0} jako ${p1}, ale był on już ${p2}. Dodaj ręcznie ${p3} do tego projektu i przeprowadź ponowną próbę.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Uruchom polecenie \\`vcpkg activate\\`, aby zastosować je do bieżącego terminalu", - "ManagesTheDownloadCache": "Zarządza pamięcią podręczną pobierania", "DownloadsFolderCleared$": "Wyczyszczono folder Pobrane (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "czyści wszystko (pamięć podręczna, zainstalowane artefakty)", - "cleansOutTheDownloadsCache": "czyści pamięć podręczną pobierania", - "removesAllTheArtifactsThatAreInstalled": "usuwa wszystkie zainstalowane artefakty", - "cleansUp": "czyści", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Umożliwia użytkownikowi czyszczenie pamięci podręcznej, zainstalowanych artefaktów itp.", "InstalledArtifactFolderCleared$": "Wyczyszczono zainstalowany folder artefaktu (${p0}) ", "CacheFolderCleared$": "Wyczyszczono folder pamięci podręcznej (${p0}) ", - "DeactivatesTheCurrentSession": "Dezaktywuje bieżącą sesję", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "Dzięki temu użytkownik może usunąć ustawienia środowiska dla aktualnie aktywnej sesji.", - "DeletesAnArtifactFromTheArtifactFolder": "Usuwa artefakt z folderu artefaktów", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "Dzięki temu użytkownik może usunąć artefakt z dysku.", "DeletingArtifact$From$": "Usuwanie artefaktu ${p0} z ${p1}", - "FindArtifactsInTheRegistry": "Znajdowanie artefaktów w rejestrze", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "Dzięki temu użytkownik może znajdować artefakty na podstawie niektórych kryteriów.", "NoArtifactsFoundMatchingCriteria$": "Nie znaleziono artefaktów pasujących do kryteriów: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Generuje właściwości programu MSBuild na potrzeby aktywacji bez pobierania czegokolwiek dla projektu", - "generatemsbuildpropsRequiresmsbuildprops": "parametr generate-msbuild-props wymaga parametru --msbuild-props", "UnableToActivateProject": "Nie można aktywować projektu", - "theNameOfTheCommandForWhichYouWantHelp": "nazwę polecenia, dla którego chcesz uzyskać pomoc", - "getHelpOn$OrOneOfTheCommands": "uzyskaj pomoc dotyczącą ${p0} lub jednego z poleceń", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Uzyskuje szczegółową pomoc dotyczącą elementu ${p0} lub jednego z poleceń", - "Arguments": "Argumenty:", - "Use$ToGetTheListOfAvailableCommands": "Użyj ${p0}, aby uzyskać listę dostępnych poleceń", - "Usage": "Użycie", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "Dostępne polecenia ${p0}:", - "ListsTheArtifacts": "Wyświetla listę artefaktów", - "ThisAllowsTheConsumerToListArtifacts": "Dzięki temu odbiorca może wyświetlić listę artefaktów.", - "regenerateTheIndexForARegistry": "ponowne generowanie indeksu dla rejestru", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "Dzięki temu użytkownik może ponownie wygenerować pliki ${p0} dla rejestru ${p1}.", "RegeneratingIndexFor$": "Ponowne generowanie indeksu dla ${p0}", "RegenerationCompleteIndexContains$MetadataFiles": "Ukończono ponowne generowanie. Indeks zawiera pliki metadanych ${p0}", "Registry$ContainsNoArtifacts": "Rejestr: „${p0}” nie zawiera artefaktów.", "error$": "błąd ${p0}: ", - "RemovesAnArtifactFromAProject": "Usuwa artefakt z projektu", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "Dzięki temu użytkownik może usunąć artefakt z projektu. Wymusza ponowną aktywację w tym oknie.", "Removing$FromProjectManifest": "Usuwanie elementu ${p0} z manifestu projektu", "unableToFindArtifact$InTheProjectManifest": "nie można odnaleźć artefaktu ${p0} w manifeście projektu", - "updateTheRegistryFromTheRemote": "zaktualizuj rejestr ze zdalnego", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Spowoduje to pobranie najnowszej zawartości rejestru z usługi zdalnej.", - "DownloadingRegistryData": "Pobieranie danych rejestru", - "Updated$RegistryContains$MetadataFiles": "Zaktualizowano element ${p0}. rejestr zawiera pliki metadanych ${p1}", - "UnableToDownloadRegistrySnapshot": "Nie można pobrać migawki rejestru", + "Updated$ItContains$MetadataFiles": "Zaktualizowano parametr ${p0}. Zawiera pliki metadanych parametru ${p1}.", + "UnableToDownload$": "Nie można pobrać parametru ${p0}.", + "$CouldNotBeUpdatedItCouldBeMalformed": "Nie można zaktualizować parametru ${p0}; może być źle sformułowany.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "Polecenie x-update-registry pobiera nowe informacje rejestru i dlatego nie może być używane z rejestrami lokalnymi. Czy chodziło Ci o polecenie x-regenerate dla parametru ${p0}?", "UnableToFindRegistry$": "Nie można odnaleźć rejestru ${p0}", - "ArtifactRegistryDataIsNotLoaded": "Dane rejestru artefaktów nie są ładowane", - "AttemptingToUpdateArtifactRegistry": "Próba zaktualizowania rejestru artefaktów", - "UnableToLoadRegistryIndex": "Nie można załadować indeksu rejestru", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Natychmiast aktywuje artefakt poza projektem", - "ThisWillInstantlyActivateAnArtifact": "Spowoduje to natychmiastowe aktywowanie artefaktu.", "NoArtifactsAreBeingAcquired": "Nie są uzyskiwane żadne artefakty", - "removesAllFilesInTheLocalCache": "usuwa wszystkie pliki z lokalnej pamięci podręcznej", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "włącza tryb debugowania, wyświetla wewnętrzne błędy dotyczące sposobu działania elementu ${p0}", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "kontynuuje akcję (potencjalnie niebezpieczną) bez potwierdzenia", - "showsTheinstalledArtifacts": "pokazuje _zainstalowane_ artefakty", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Zrzuć zmienne środowiskowe i inne właściwości do pliku JSON ze ścieżką dostarczoną przez użytkownika.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Pełna ścieżka do pliku, w którym zostaną zapisane właściwości programu MSBuild.", - "ApplyAnyDeprecationFixups": "Zastosuj wszelkie poprawki wycofania.", - "overrideThePathToTheProjectFolder": "zastąp ścieżkę do folderu projektu", - "UnableToFindProjectEnvironment$": "Nie można odnaleźć środowiska projektu ${p0}", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "włącza tryb pełny, wyświetla pełne komunikaty o procesie", - "aVersionOrVersionRangeToMatch": "wersja lub zakres wersji do dopasowania" + "UnableToFindProjectEnvironment$": "Nie można odnaleźć środowiska projektu ${p0}" } diff --git a/locales/messages.pt-BR.json b/locales/messages.pt-BR.json index 3bf0a6df65..f822e89131 100644 --- a/locales/messages.pt-BR.json +++ b/locales/messages.pt-BR.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "um registro interno", "AConfigurationObject": "um objeto de configuração", "ADateVersionString": "uma cadeia de caracteres de versão de data", + "ADefaultFeature": "um recurso padrão", "ADemandObject": "um objeto de demanda", "ADependency": "uma dependência", + "ADependencyFeature": "um recurso de uma dependência", "ADictionaryOfContacts": "um dicionário de contatos", "AFeature": "um recurso", + "AFeatureName": "um nome de recurso", "AFilesystemRegistry": "um registro do sistema de arquivos", "AGitObjectSha": "um objeto git SHA", "AGitReference": "uma referência git (por exemplo, um branch)", @@ -44,12 +47,12 @@ "AddArtifactOnlyOne": "'{command_line}' só pode adicionar um artefato por vez.", "AddCommandFirstArg": "O primeiro parâmetro a ser adicionado deve ser 'artefato' ou 'porta'.", "AddFirstArgument": "O primeiro argumento para '{command_line}' deve ser 'artifact' ou 'port'.", - "AddHelp": "Adiciona a porta ou artefato indicado ao manifesto associado ao diretório atual.", "AddPortRequiresManifest": "'{command_line}' requer um arquivo de manifesto ativo.", "AddPortSucceeded": "Conseguiu adicionar portas ao arquivo vcpkg.json.", "AddRecurseOption": "Se você tiver certeza de que deseja removê-los, execute o comando com a opção --recurse.", "AddTripletExpressionNotAllowed": "expressões triplas não são permitidas aqui. Convém alterar `{package_name}:{triplet}` para `{package_name}`.", "AddVersionAddedVersionToFile": "versão adicionada {version} para {path}", + "AddVersionArtifactsOnly": "--version é somente artefatos e não pode ser usado com vcpkg add port", "AddVersionCommitChangesReminder": "Você se lembrou de confirmar suas alterações?", "AddVersionCommitResultReminder": "Não se esqueça de confirmar o resultado!", "AddVersionDetectLocalChangesError": "ignorando a detecção de alterações locais devido a um formato inesperado na saída de status do git", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} já está instalado", "AlreadyInstalledNotHead": "{spec} já está instalado -- não está sendo criado pela HEAD", "AmbiguousConfigDeleteConfigFile": "Configuração vcpkg ambígua fornecida pelo manifesto e pelo arquivo de configuração.\n-- Excluir arquivo de configuração {path}", + "AnArrayOfDefaultFeatures": "uma matriz de recursos padrão", "AnArrayOfDependencies": "uma matriz de dependências", "AnArrayOfDependencyOverrides": "uma matriz de substituições de dependência", + "AnArrayOfFeatures": "uma matriz de recursos", "AnArrayOfIdentifers": "uma matriz de identificadores", "AnArrayOfOverlayPaths": "uma matriz de caminhos de sobreposição", "AnArrayOfOverlayTripletsPaths": "uma matriz de caminhos de tripletas de sobreposição", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "Outra instalação está em andamento no computador, suspenso 6s antes de tentar novamente.", "AppliedUserIntegration": "Integração aplicada para todo o usuário para esta raiz vcpkg.", "ApplocalProcessing": "Processamento applocal vcpkg: {path}", + "ArtifactsBootstrapFailed": "vcpkg-artifacts não está instalado e não pôde ser inicializado.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-artifacts não está instalado e não pode ser instalado porque VCPKG_ROOT é considerado somente leitura. A reinstalação do vcpkg usando o 'one liner' pode corrigir esse problema.", + "ArtifactsNotOfficialWarning": "Usando vcpkg-artifacts com um não oficial ", "ArtifactsOptionIncompatibility": "--{option} não tem efeito em localizar artefato.", + "ArtifactsOptionJson": "Caminho completo para o arquivo JSON no qual as variáveis de ambiente e outras propriedades são registradas", + "ArtifactsOptionMSBuildProps": "Caminho completo para o arquivo no qual as propriedades do MSBuild serão gravadas.", + "ArtifactsOptionVersion": "Um intervalo de versão ou versão a ser correspondido; válido somente para artefatos", + "ArtifactsOptionVersionMismatch": "O número de opções --version deve corresponder ao número de artefatos nomeados", + "ArtifactsSwitchARM": "Força a detecção de host para ARM ao adquirir artefatos", + "ArtifactsSwitchARM64": "Força a detecção de host para ARM64 ao adquirir artefatos", + "ArtifactsSwitchAll": "Atualiza todos os registros de artefatos conhecidos", + "ArtifactsSwitchAllLanguages": "Adquire todos os arquivos de idioma ao adquirir artefatos", + "ArtifactsSwitchForce": "As forças readquirem se um artefato já estiver adquirido", + "ArtifactsSwitchFreebsd": "Força a detecção de host para o FreeBSD ao adquirir artefatos", + "ArtifactsSwitchLinux": "Força a detecção de host para Linux ao adquirir artefatos", + "ArtifactsSwitchNormalize": "Aplica quaisquer correções de depreciação", + "ArtifactsSwitchOnlyOneHostPlatform": "Somente uma plataforma de host (--x64, --x86, --arm, --arm64) pode ser definida.", + "ArtifactsSwitchOnlyOneOperatingSystem": "Somente um sistema operacional (--windows, --osx, --linux, --freebsd) pode ser definido.", + "ArtifactsSwitchOnlyOneTargetPlatform": "Somente uma plataforma de destino (--target:x64, --target:x86, --target:arm, --target:arm64) pode ser definida.", + "ArtifactsSwitchOsx": "Força a detecção de host para o MacOS ao adquirir artefatos", + "ArtifactsSwitchTargetARM": "Define a detecção de destino como ARM ao adquirir artefatos", + "ArtifactsSwitchTargetARM64": "Define a detecção de destino como ARM64 ao adquirir artefatos", + "ArtifactsSwitchTargetX64": "Define a detecção de destino como x64 ao adquirir artefatos", + "ArtifactsSwitchTargetX86": "Define o destino como x86 ao adquirir artefatos", + "ArtifactsSwitchWindows": "Força a detecção de host para o Windows ao adquirir artefatos", + "ArtifactsSwitchX64": "Força a detecção de host para x64 ao adquirir artefatos", + "ArtifactsSwitchX86": "Força a detecção de host para x86 ao adquirir artefatos", "AssetCacheProviderAcceptsNoArguments": "argumentos inesperados: '{value}' não aceita argumentos", - "AssetSourcesArg": "Adicionar fontes para o cache de ativos. Consulte 'vcpkg help assetcaching'.", + "AssetSourcesArg": "Fontes do cache de ativos. Consulte 'vcpkg help assetcaching'", "AttemptingToFetchPackagesFromVendor": "Tentando buscar {count} pacote(s) do {vendor}", "AttemptingToSetBuiltInBaseline": "tentativa de definir a linha de base interna em vcpkg.json ao substituir o registro padrão em vcpkg-configuration.json.\no registro padrão de vcpkg-configuration.json será usado.", "AuthenticationMayRequireManualAction": "Um ou mais provedores de credenciais do {vendor} solicitaram ação manual. Adicione a fonte binária 'interativa' para permitir a interatividade.", "AutoSettingEnvVar": "-- Definindo automaticamente {env_var} variáveis de ambiente para \"{url}\".", "AutomaticLinkingForMSBuildProjects": "Todos os projetos do MSBuild C++ agora podem utilizar #include bibliotecas instaladas. A vinculação será tratada automaticamente. A instalação de novas bibliotecas as disponibilizará instantaneamente.", - "AvailableArchitectureTriplets": "Tripletos de arquitetura disponíveis:", + "AutomaticLinkingForVS2017AndLater": "O Visual Studio 2017 e posterior agora podem #incluir quaisquer bibliotecas instaladas. A vinculação será feita automaticamente. A instalação de novas bibliotecas as tornará instantaneamente disponíveis.", "AvailableHelpTopics": "Tópicos de ajuda disponíveis:", "AzUrlAssetCacheRequiresBaseUrl": "argumentos inesperados: a configuração do ativo 'azurl' requer uma url base", "AzUrlAssetCacheRequiresLessThanFour": "argumentos inesperados: a configuração do ativo 'azurl' requer menos de 4 argumentos", "BaselineConflict": "Especificar vcpkg-configuration.default-registry em um arquivo de manifesto entra em conflito com a linha de base interna.\nRemova uma dessas configurações conflitantes.", "BaselineFileNoDefaultField": "O arquivo de linha de base no commit {commit_sha} era inválido (sem campo \"default\").", - "BaselineFileNoDefaultFieldPath": "arquivo de linha de base em {path} era inválido (sem campo \"padrão\")", "BaselineGitShowFailed": "ao fazer check-out da linha de base do commit '{commit_sha}', falha ao `git show` versions/baseline.json. Isso pode ser corrigido buscando commits com `git fetch`.", "BaselineMissing": "Versão da linha de base não encontrada. Correr:\nvcpkg x-add-version {package_name}\ngit adicionar versões\ngit commit -m \"Atualizar versão do banco de dados\"\npara definir {version} como a versão de linha de base.", - "BaselineMissingDefault": "O baseline.json do commit `\"{commit_sha}\"` no repositório {url} era inválido (não continha um campo \"default\").", - "BinarySourcesArg": "Adicione fontes para cache binário. Consulte 'vcpkg help binarycaching'.", + "BinaryCacheVendorHTTP": "Servidores HTTP", + "BinarySourcesArg": "Fontes de cache binárias. Consulte 'vcpkg help binarycaching'", "BinaryWithInvalidArchitecture": "{path}\n Esperado: {expected}, mas era {actual}", "BuildAlreadyInstalled": "A {spec} já está instalada; remover {spec} antes de tentar compilá-la.", "BuildDependenciesMissing": "O comando build exige que todas as dependências já estejam instaladas.\nAs seguintes dependências estão ausentes:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "BEM-SUCEDIDO", "BuildResultSummaryHeader": "RESUMO PARA {triplet}", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(Experimental) Especifique o diretório raiz de buildtrees.", + "BuildTreesRootDir": "Diretório Buildtrees (experimental)", "BuildTroubleshootingMessage1": "Certifique-se de est arusando os mais recentes arquivos de porta com `git pull' e 'vcpkg update'.\nEm seguida, verifique se há problemas conhecidos em:", "BuildTroubleshootingMessage2": "Você pode enviar a respeito de um novo problema em:", "BuildTroubleshootingMessage3": "Incluir 'Erro de build [{package_name}]' em seu título de relatório de bug, as seguintes informações de versão em sua descrição de bug, e anexe qualquer logs de falha relevante do erro acima.", "BuildTroubleshootingMessage4": "Use o modelo pré-preenchido de {path} ao relatar seu problema.", - "BuildTroubleshootingMessageGH": "Você também pode enviar um problema executando (a CLI do GitHub deve ser instalada):", + "BuildTroubleshootingMessageGH": "Você também pode enviar um problema executando (o GitHub CLI deve estar instalado):", "BuildingFromHead": "Criando {spec} de HEAD...", "BuildingPackage": "Criando {spec}...", "BuildingPackageFailed": "Ocorreu um erro ao compilar {spec} com: {build_result}", "BuildingPackageFailedDueToMissingDeps": "devido às seguintes dependências ausente:", - "BuiltInTriplets": "tripletos integrados do vcpkg:", + "BuiltInTriplets": "Triplos internos:", "BuiltWithIncorrectArchitecture": "Os seguintes arquivos foram criados para uma arquitetura incorreta:", "CISettingsExclude": "Lista separada por vírgulas de portas a serem ignoradas", "CISettingsOptCIBase": "Caminho para o arquivo ci.baseline.txt. Usado para ignorar portas e detectar regressões.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "Arquivo para saída de todos os hashes de pacote determinados", "CISettingsOptParentHashes": "Arquivo para ler hashes de pacote para um estado de CI pai, para reduzir o conjunto de pacotes alterados", "CISettingsOptSkippedCascadeCount": "Declara que o número de --exclude e dá suporte a skips exatamente igual a este número", - "CISettingsOptXUnit": "Arquivo para saída de resultados no formato XUnit (interno)", - "CISettingsVerifyGitTree": "Verifique se cada objeto de árvore git corresponde à sua versão declarada (isso é muito lento)", - "CISettingsVerifyVersion": "Imprimir o resultado de cada porta em vez de apenas erros.", - "CISwitchOptAllowUnexpectedPassing": "Indica que os resultados de 'Passando, remover da lista de falhas' não devem ser emitidos.", - "CISwitchOptDryRun": "Imprimir plano sem execução", - "CISwitchOptRandomize": "Randomizar a ordem de instalação", - "CISwitchOptSkipFailures": "Indica que as portas marcadas como '=fail' em ci.baseline.txt devem ser ignoradas.", - "CISwitchOptXUnitAll": "Relatar também portas inalteradas para a saída XUnit (interna)", + "CISettingsOptXUnit": "Resultados do arquivo para saída no formato XUnit", + "CISettingsVerifyGitTree": "Verifica se cada objeto de árvore git corresponde à sua versão declarada (isso é muito lento)", + "CISettingsVerifyVersion": "Imprime o resultado de cada porta em vez de apenas erros", + "CISkipInstallation": "Os seguintes pacotes já estão instalados e não serão compilados novamente:", + "CISwitchOptAllowUnexpectedPassing": "Suprime os resultados de 'Passando, remover da lista de falhas'", + "CISwitchOptDryRun": "Imprime o plano sem execução", + "CISwitchOptRandomize": "Randomiza a ordem de instalação", + "CISwitchOptSkipFailures": "Ignora as portas marcadas como '=fail' ci.baseline.txt", + "CISwitchOptXUnitAll": "Relata as portas inalteradas na saída XUnit", "CMakeTargetsUsage": "{package_name} fornece destinos CMake:", "CMakeTargetsUsageHeuristicMessage": "# isso é gerado heuristicamente e pode não estar correto", "CMakeToolChainFile": "Os projetos do CMake devem usar: \"-DCMAKE_TOOLCHAIN_FILE={path}\"", "CMakeUsingExportedLibs": "Para usar bibliotecas exportadas em projetos do CMake, adicione {value} à linha de comando do CMake.", - "CacheHelp": "O argumento deve ser uma substring para pesquisar ou nenhum argumento para exibir todas as bibliotecas em cache.", "CheckedOutGitSha": "Verifiquei o Git SHA: {commit_sha}", "CheckedOutObjectMissingManifest": "O objeto com check-out não contém um arquivo CONTROL ou arquivo vcpkg.json.", "ChecksFailedCheck": "vcpkg falhou; nenhum detalhe adicional está disponível.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "atualizar vcpkg executando novamente bootstrap-vcpkg pode resolver essa falha.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing só poderá ser usado se uma linha de base for fornecida por --ci-baseline.", "CiBaselineDisallowedCascade": "REGRESSÃO: {spec} em cascata, mas é necessário passar. ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "REGRESSÃO: {spec} independente falhou com {build_result}.", "CiBaselineRegression": "REGRESSÃO: {spec} falhou com {build_result}. Se esperado, adicione {spec}=falha ao {path}.", "CiBaselineRegressionHeader": "REGRESSÕES:", + "CiBaselineUnexpectedFail": "REGRESSÃO: {spec} está marcada como falha, mas não tem suporte para {triplet}.", + "CiBaselineUnexpectedFailCascade": "REGRESSÃO: {spec} está marcada como falha, mas uma dependência não possui suporte para {triplet}.", "CiBaselineUnexpectedPass": "PASSANDO, REMOVER DA LISTA DE FALHA: {spec} ({path}).", "ClearingContents": "Limpando os conteúdos de {path}", "CmakeTargetsExcluded": "observação: {count} destinos adicionais não são exibidos.", - "CmdAddVersionOptAll": "Processar versões para todas as portas.", - "CmdAddVersionOptOverwriteVersion": "Substitua 'git-tree' de uma versão existente.", - "CmdAddVersionOptSkipFormatChk": "Ignora a verificação de formatação de arquivos vcpkg.json.", + "CmdAcquireExample1": "vcpkg acquire ", + "CmdAcquireProjectSynopsis": "Adquire todos os artefatos referenciados por um manifesto", + "CmdAcquireSynopsis": "Adquire o artefato nomeado", + "CmdActivateSynopsis": "Ativa artefatos de um manifesto", + "CmdAddExample1": "vcpkg add port ", + "CmdAddExample2": "vcpkg add artifact ", + "CmdAddSynopsis": "Adiciona dependência ao manifesto", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "Processa a s versões de todas as portas", + "CmdAddVersionOptOverwriteVersion": "Substitui a árvore git de uma versão existente", + "CmdAddVersionOptSkipFormatChk": "Ignora a verificação de formatação dos arquivos vcpkg.json.", "CmdAddVersionOptSkipVersionFormatChk": "Ignora a verificação de formato da versão.", - "CmdAddVersionOptVerbose": "Imprimir mensagens de êxito em vez de apenas erros.", + "CmdAddVersionOptVerbose": "Imprime mensagens de êxito em vez de apenas erros", + "CmdAddVersionSynopsis": "Adiciona uma versão ao banco de dados de versão", + "CmdBootstrapStandaloneSynopsis": "Inicializa uma raiz vcpkg a partir de apenas um binário vcpkg", + "CmdBuildExample1": "vcpkg build ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "Cria a porta a partir de um caminho", + "CmdBuildSynopsis": "Cria uma porta", + "CmdCacheExample1": "vcpkg cache ", + "CmdCacheSynopsis": "Listar especificações de pacotes", + "CmdCheckSupportExample1": "VCPKG X-Check-Support ", + "CmdCheckSupportSynopsis": "Testa se uma porta é suportada sem criá-la", + "CmdCiCleanSynopsis": "Limpa todos os arquivos para se preparar para uma execução de CI", + "CmdCiSynopsis": "Tenta criar todas as portas para teste de CI", + "CmdCiVerifyVersionsSynopsis": "Verifica a integridade do banco de dados de versão", "CmdContactOptSurvey": "Iniciar o navegador padrão para a pesquisa vcpkg atual", - "CmdDependInfoOptDGML": "Cria um grafo com base em dgml", - "CmdDependInfoOptDepth": "Mostrar profundidade de recursão na saída", - "CmdDependInfoOptDot": "Cria um grafo com base no ponto", - "CmdDependInfoOptMaxRecurse": "Definir profundidade máxima de recursão, um valor de -1 indica que não há limite", - "CmdDependInfoOptSort": "Defina a ordem de classificação para a lista de dependências, os valores aceitos são: lexicográfico, topográfico (padrão), x-tree, inversa", - "CmdEditOptAll": "Abrir o editor na porta, bem como a subpasta da buildtree específica da porta", - "CmdEditOptBuildTrees": "Abrir o editor na subpasta da buildtree específica da porta", - "CmdEnvOptions": "Adicionar {path} instalado a {env_var}", + "CmdCreateExample1": "vcpkg create ", + "CmdCreateExample2": "vcpkg create my-fancy-por https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create ", + "CmdDeactivateSynopsis": "Remove todas as ativações de artefato do shell atual", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "Formatos conflitantes especificados. Somente um de --format, --dgml ou --dot é aceito.", + "CmdDependInfoFormatHelp": "Escolhe o formato de saída, um de 'lista', 'árvore', 'sereia', 'ponto' ou 'dgml'", + "CmdDependInfoFormatInvalid": "--format={value} não é um formato reconhecido. --format deve ser \"list\", \"tree\", \"mermaid\", \"dot\" ou \"dgml\".", + "CmdDependInfoOptDepth": "Mostra a profundidade de recursão na saída 'list'", + "CmdDependInfoOptMaxRecurse": "Define a profundidade máxima de recursão. O padrão não é limite", + "CmdDependInfoOptSort": "Escolhe a ordem de classificação do formato 'list', um de 'lexicographical', 'topological' (padrão), 'reverse'", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth só pode ser usado com formatos \"list\" e \"tree\".", + "CmdDependInfoXtreeTree": "--sort=x-tree não pode ser usado com formatos diferentes de árvore", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Baixa um arquivo", + "CmdEditExample1": "vcpkg edit ", + "CmdEditOptAll": "Abre o editor na porta, bem como na subpasta de árvore de compilação específica da porta", + "CmdEditOptBuildTrees": "Abre o editor na subpasta buildtree específica da porta", + "CmdEnvOptions": "Adiciona {path} instalado a {env_var}", + "CmdExportEmptyPlan": "Recusando-se a criar uma exportação de pacotes zero. Instale os pacotes antes de exportar.", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", "CmdExportOpt7Zip": "Exportar para um arquivo 7zip (.7z)", - "CmdExportOptChocolatey": "Exportar um pacote Chocolatey (recurso experimental)", - "CmdExportOptDebug": "Habilitar depuração pré-fab", - "CmdExportOptDryRun": "Não exportar de fato.", - "CmdExportOptIFW": "Exportar para um instalador baseado em IFW", + "CmdExportOptChocolatey": "Exporta um pacote chocolatey (experimental)", + "CmdExportOptDebug": "Habilita a depuração de pré-fabricada", + "CmdExportOptDryRun": "Na verdade, não exporta", + "CmdExportOptIFW": "Exporta para um instalador baseado em IFW", "CmdExportOptInstalled": "Exportar todos os pacotes instalados", - "CmdExportOptMaven": "Habilitar o Maven", - "CmdExportOptNuget": "Exportar um pacote NuGet", - "CmdExportOptPrefab": "Exportar para o formato pré-fab", - "CmdExportOptRaw": "Exportar para um diretório descompactado", - "CmdExportOptZip": "Exportar para um arquivo zip", - "CmdExportSettingChocolateyMaint": "Especifique o mantenedor para o pacote Chocolatey exportado (recurso experimental)", - "CmdExportSettingChocolateyVersion": "Especifique o sufixo de versão a ser adicionado para o pacote Chocolatey exportado (recurso experimental)", - "CmdExportSettingConfigFile": "Especificar o caminho do arquivo temporário para a configuração do instalador", - "CmdExportSettingInstallerPath": "Especificar o caminho do arquivo para o instalador exportado", - "CmdExportSettingNugetDesc": "Especifique uma descrição para o pacote NuGet exportado", - "CmdExportSettingNugetID": "Especifique a ID do pacote NuGet exportado (substitui --output)", - "CmdExportSettingNugetVersion": "Especifique a versão para o pacote NuGet exportado", - "CmdExportSettingOutput": "Especifique o nome de saída (usado para construir o nome do arquivo)", - "CmdExportSettingOutputDir": "Especificar o diretório de saída para artefatos produzidos", - "CmdExportSettingPkgDir": "Especifique o caminho de diretório temporário para os pacotes recompactados", + "CmdExportOptMaven": "Habilita o Maven", + "CmdExportOptNuget": "Exporta um pacote NuGet", + "CmdExportOptPrefab": "Exporta para o formato Pré-fabricado", + "CmdExportOptRaw": "Exporta para um diretório descompactado", + "CmdExportOptZip": "Exporta para um arquivo zip", + "CmdExportSettingChocolateyMaint": "O mantenedor do pacote chocolatey exportado (experimental)", + "CmdExportSettingChocolateyVersion": "O sufixo de versão a ser adicionado ao pacote chocolatey exportado (experimental)", + "CmdExportSettingConfigFile": "O caminho do arquivo temporário para a configuração do instalador", + "CmdExportSettingInstallerPath": "O caminho do arquivo para o instalador exportado", + "CmdExportSettingNugetDesc": "Descrição do pacote NuGet exportado", + "CmdExportSettingNugetID": "ID do pacote NuGet exportado (substitui --saída)", + "CmdExportSettingNugetVersion": "A versão do pacote NuGet exportado", + "CmdExportSettingOutput": "O nome de saída (usado para construir o nome do arquivo)", + "CmdExportSettingOutputDir": "O diretório de saída dos artefatos produzidos", + "CmdExportSettingPkgDir": "O caminho do diretório temporário para os pacotes recompactados", "CmdExportSettingPrefabArtifactID": "O ID do artefato é o nome do projeto de acordo com as especificações do Maven", "CmdExportSettingPrefabGroupID": "GroupId identifica exclusivamente seu projeto de acordo com as especificações do Maven", "CmdExportSettingPrefabVersion": "A versão é o nome do projeto de acordo com as especificações do Maven", - "CmdExportSettingRepoDir": "Especificar o caminho do diretório para o repositório exportado", - "CmdExportSettingRepoURL": "Especificar a URL do repositório remoto para o instalador online", - "CmdExportSettingSDKMinVersion": "Versão mínima do SDK com suporte do Android", + "CmdExportSettingRepoDir": "O caminho do diretório do repositório exportado", + "CmdExportSettingRepoURL": "A URL do repositório remoto para o instalador online", + "CmdExportSettingSDKMinVersion": "A versão mínima suportada do SDK do Android", "CmdExportSettingSDKTargetVersion": "Versão do SDK de destino do Android", - "CmdFetchOptXStderrStatus": "Status direto/download de mensagens para stderr em vez de stdout. (Erros/falhas ainda vão para stdout)", - "CmdFormatManifestOptAll": "Formatar todos os arquivos de manifesto de portas.", - "CmdFormatManifestOptConvertControl": "Converter arquivos CONTROL em arquivos de manifesto.", - "CmdGenerateMessageMapOptNoOutputComments": "Ao gerar o mapa de mensagens, exclua comentários (útil para gerar o arquivo de localização em inglês)", - "CmdInfoOptInstalled": "(experimental) Relatório sobre pacotes instalados em vez de disponíveis", - "CmdInfoOptTransitive": "(experimental) Relatar também as dependências dos pacotes instalados", - "CmdNewOptApplication": "Crie um manifesto do aplicativo (não exija nome ou versão).", - "CmdNewOptSingleFile": "Insira vcpkg-configuration.json em vcpkg.json.", - "CmdNewOptVersionDate": "Interprete --version como uma data ISO 8601. (AAAA-MM-DD)", - "CmdNewOptVersionRelaxed": "Interprete --version como uma versão numérica reduzida. (Números não negativos separados por pontos)", - "CmdNewOptVersionString": "Interprete --version como uma cadeia de caracteres sem comportamento de ordenação.", + "CmdExportSynopsis": "Cria uma implantação autônoma de portas instaladas", + "CmdFetchOptXStderrStatus": "Imprime o status/download de mensagens no stderr em vez de stdout (erros/falhas ainda vão para stdout)", + "CmdFetchSynopsis": "Busca algo no sistema ou na internet", + "CmdFindExample1": "vcpkg find port ", + "CmdFindExample2": "vcpkg find artifact ", + "CmdFindSynopsis": "Localiza uma porta ou artefato que pode ser instalado ou ativado", + "CmdFormatManifestExample1": "VCPKG format-manifest ", + "CmdFormatManifestOptAll": "Formatar todos os arquivos de manifesto das portas.", + "CmdFormatManifestOptConvertControl": "Converte os arquivos CONTROL nos arquivos de manifesto.", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "Gera arquivos .props msbuild como se estivesse ativando as dependências de artefato de um manifesto, sem adquiri-los", + "CmdGenerateMessageMapOptNoOutputComments": "Exclui comentários ao gerar o mapa de mensagens (útil para gerar o arquivo de localização em inglês)", + "CmdHashExample1": "vcpkg hash ", + "CmdHashExample2": "vcpkg hash SHA256", + "CmdHashSynopsis": "Obtém SHA256 ou SHA512 de um arquivo", + "CmdHelpCommandSynopsis": "Exibe detalhes da ajuda para ", + "CmdHelpCommands": "help ", + "CmdHelpCommandsSynopsis": "Exibe a lista completa de comandos, incluindo os raros não listados aqui", + "CmdHelpTopic": "help ", + "CmdInfoOptInstalled": "(experimental) Relatórios de pacotes instalados em vez de disponíveis", + "CmdInfoOptTransitive": "(experimental) Também relata dependências dos pacotes instalados", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Cria um registro git em branco", + "CmdInstallExample1": "vcpkg install ...", + "CmdIntegrateSynopsis": "Integra vcpkg com máquinas, projetos ou shells", + "CmdListExample2": "vcpkg list ", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "Cria um manifesto do aplicativo (não requer nome ou versão)", + "CmdNewOptSingleFile": "Incorpora vcpkg-configuration.json em vcpkg.json", + "CmdNewOptVersionDate": "Interpreta --versão como uma data ISO 8601. (AAAA-MM-DD)", + "CmdNewOptVersionRelaxed": "Interprete --versão como uma versão numérica reduzida. (Números não negativos separados por pontos)", + "CmdNewOptVersionString": "Interpreta --versão como uma cadeia de caracteres sem comportamento de ordenação", "CmdNewSettingName": "Nome do novo manifesto.", "CmdNewSettingVersion": "Versão do novo manifesto.", - "CmdRegenerateOptDryRun": "na verdade, não executa a ação, mostra apenas o que seria feito", - "CmdRegenerateOptForce": "continua com a ação (potencialmente perigosa) sem confirmação", - "CmdRegenerateOptNormalize": "aplicar quaisquer correções de substituição", - "CmdRemoveOptDryRun": "Imprimir os pacotes a serem removidos, mas não removê-los", - "CmdRemoveOptOutdated": "Selecionar todos os pacotes com versões que não correspondem aos arquivos de porta", - "CmdRemoveOptRecurse": "Permitir a remoção de pacotes não especificados explicitamente na linha de comando", - "CmdSetInstalledOptDryRun": "Não compilar ou instalar", - "CmdSetInstalledOptNoUsage": "Não imprimir informações de uso do CMake após a instalação.", - "CmdSetInstalledOptWritePkgConfig": "Grava um arquivo formatado em packages.config do NuGet para uso com cache binário externo.\nConfira 'vcpkg help binarycaching' para obter mais informações.", + "CmdNewSynposis": "Cria um novo manifesto", + "CmdOwnsExample1": "vcpkg owns", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "Alterações de comparação em versões de porta entre confirmações", + "CmdRegenerateOptDryRun": "Na verdade, não executa a ação, mostra apenas o que seria feito", + "CmdRegenerateOptForce": "Continua com a ação (potencialmente perigosa) sem confirmação", + "CmdRegenerateOptNormalize": "Aplica quaisquer correções de depreciação", + "CmdRemoveExample1": "vcpkg remove ...", + "CmdRemoveOptDryRun": "Imprime os pacotes a serem removidos, mas não os remove", + "CmdRemoveOptOutdated": "Remove todos os pacotes com versões que não correspondem ao registro interno", + "CmdRemoveOptRecurse": "Permite a remoção de pacotes dependentes não especificados explicitamente", + "CmdSearchExample1": "vcpkg search ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "Na verdade, não compila ou instala", + "CmdSetInstalledOptNoUsage": "Não imprime informações de uso do CMake após a instalação", + "CmdSetInstalledOptWritePkgConfig": "Grava um arquivo formatado em packages.config NuGet para uso com cache binário externo. Consulte 'vcpkg help binarycaching' para obter mais informações", + "CmdSetInstalledSynopsis": "Instala, atualiza ou remove pacotes de forma que os instalados correspondam exatamente aos fornecidos", "CmdSettingCopiedFilesLog": "Caminho do log de arquivos copiados a ser criado", "CmdSettingInstalledDir": "Caminho da árvore instalada a ser usada", "CmdSettingTLogFile": "Caminho do arquivo tlog a ser criado", "CmdSettingTargetBin": "Caminho do binário a ser analisado", - "CmdUpdateBaselineOptDryRun": "Imprimir plano sem execução", - "CmdUpdateBaselineOptInitial": "adicionar um 'builtin-baseline' a um vcpkg.json que ainda não o possui", - "CmdUpgradeOptAllowUnsupported": "Em vez de erros em uma porta sem suporte, continuar com um aviso.", + "CmdUpdateBaselineOptDryRun": "Imprime o plano sem execução", + "CmdUpdateBaselineOptInitial": "Adiciona uma 'linha de base interna' a um vcpkg.json que ainda não a tem", + "CmdUpdateBaselineSynopsis": "Atualiza as linhas de base dos registros git em um manifesto para a confirmação HEAD desses registros", + "CmdUpdateRegistryAll": "Atualiza todos os registros de artefatos conhecidos", + "CmdUpdateRegistryAllExcludesTargets": "Atualizar registro --all não pode ser usado com uma lista de registros de artefato", + "CmdUpdateRegistryAllOrTargets": "O registro de atualização requer uma lista de nomes de registro de artefato ou URiIs para atualizar ou --all.", + "CmdUpdateRegistryExample3": "VCPKG x-update-registry ", + "CmdUpdateRegistrySynopsis": "Baixa novamente um registro de artefato", "CmdUpgradeOptNoDryRun": "Atualizar de fato", "CmdUpgradeOptNoKeepGoing": "Parar a instalação de pacotes em caso de falha", + "CmdUseExample1": "vcpkg use ", + "CmdUseSynopsis": "Ativar um único artefato neste shell", + "CmdVSInstancesSynopsis": "Lista instâncias detectadas do Visual Studio", "CmdXDownloadOptHeader": "Cabeçalho adicional a ser usado ao buscar de URLs", "CmdXDownloadOptSha": "O hash do arquivo a ser baixado", - "CmdXDownloadOptSkipSha": "Não verifique o SHA512 do arquivo baixado", - "CmdXDownloadOptStore": "Indica que o arquivo deve ser armazenado em vez de buscado", + "CmdXDownloadOptSkipSha": "Ignora a verificação de SHA512 do arquivo baixado", + "CmdXDownloadOptStore": "Armazena o arquivo deve ser pai do que buscá-lo", "CmdXDownloadOptUrl": "URL a ser baixada e armazenada se estiver ausente no cache", + "CmdZApplocalSynopsis": "Copia as dependências de um binário da árvore instalada para onde o local desse binário para implantação local do aplicativo", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "O número de diretórios principais a serem removidos de todos os caminhos", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", "CommandFailed": "o comando:\n{command_line}\nfalhou com os seguintes resultados:", - "Commands": "Comandos:", - "CommunityTriplets": "Tripletos da comunidade VCPKG:", + "CommunityTriplets": "Tripletos da comunidade:", "ComparingUtf8Decoders": "Comparação de Utf8Decoders com diferentes proveniências; isso é sempre um erro", "CompressFolderFailed": "Falha ao compactar a pasta \"{path}\":", "ComputingInstallPlan": "Plano de instalação de computação...", "ConfigurationErrorRegistriesWithoutBaseline": "A configuração definida em {path} é inválida.\n\nO uso de registros exige que uma linha de base seja definida para o registro padrão ou que o registro padrão seja nulo.\n\nConsulte {url} para obter mais detalhes.", "ConfigurationNestedDemands": "[\"{json_field}\"] contém um objeto aninhado `demands` (`demands` aninhadas não têm efeito)", "ConflictingFiles": "Os seguintes arquivos já estão instalados em {path} e estão em conflito com {spec}", + "ConsideredVersions": "Os executáveis a seguir foram considerados, mas descartados devido ao requisito de versão de {version}:", "ConstraintViolation": "Encontrou uma violação de restrição:", "ContinueCodeUnitInStart": "encontrou unidade de código de continuação na posição inicial", "ControlAndManifestFilesPresent": "Tanto um arquivo manifesto quanto um arquivo CONTROL existem no diretório porta: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "Banco de dados corrompido.", "CorruptedInstallTree": "Sua árvore 'instalada' do vcpkg está corrompida.", "CouldNotDeduceNugetIdAndVersion": "Não foi possível deduzir a ID e a versão do nuget do nome de arquivo: {path}", - "CouldNotFindBaseline": "Não foi possível encontrar a linha de base explicitamente especificada `\"{commit_sha}\"` no arquivo de linha de base {path}", - "CouldNotFindBaselineForRepo": "Não foi possível encontrar a linha de base `\"{commit_sha}\"` para o repositório {package_name}", - "CouldNotFindBaselineInCommit": "Não foi possível encontrar a linha de base no commit `\"{commit_sha}\"` do repositório {package_name}:", + "CouldNotFindBaselineInCommit": "Não foi possível localizar a linha de base {url} em {commit_sha} para {package_name}.", "CouldNotFindGitTreeAtCommit": "não foi possível encontrar a árvore git para `versions` no repositório {package_name} no commit {commit_sha}", "CouldNotFindToolVersion": "Não foi possível localizar em {path}", "CouldNotFindVersionDatabaseFile": "Não foi possível encontrar o arquivo de banco de dados de versões: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "A variável de ambiente VCPKG_DEFAULT_BINARY_CACHE deve ser um diretório (era: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "A variável de ambiente VCPKG_DEFAULT_BINARY_CACHE deve ser absoluta (era: {path})", "DefaultBinaryCacheRequiresDirectory": "A variável de ambiente VCPKG_DEFAULT_BINARY_CACHE deve ser um diretório (era: {path})", - "DefaultBrowserLaunched": "Navegador padrão iniciado para {url}.", + "DefaultFeatureCore": "o recurso \"core\" desabilita os recursos padrão e, portanto, não pode estar na lista de recursos padrão", + "DefaultFeatureDefault": "o recurso \"padrão\" refere-se ao conjunto de recursos padrão e, portanto, não pode estar na lista de recursos padrão", + "DefaultFeatureIdentifier": "os nomes dos recursos padrão devem ser identificadores", "DefaultFlag": "O padrão é --{option} estar ativado.", "DefaultRegistryIsArtifact": "O registro padrão não pode ser um registro de artefato.", - "DefaultTriplet": "A partir da versão de setembro de 2023, o trio padrão para bibliotecas vcpkg será alterado de x86-windows para o trio de host detectado ({triplet}). Para resolver essa mensagem, adicione --triplet x86-windows para manter o mesmo comportamento.", + "DefaultTripletChanged": "Na versão de setembro de 2023, o triplete padrão para bibliotecas vcpkg mudou de x86-windows para o triplet host detectado ({triplet}). Para o comportamento antigo, adicione --triplet x86-windows . Para suprimir essa mensagem, adicione --triplet {triplet} .", "DeleteVcpkgConfigFromManifest": "-- Ou remova \"vcpkg-configuration\" do arquivo de manifesto {path}.", + "DependencyFeatureCore": "o recurso \"core\" não pode estar na lista de recursos de uma dependência. Para desabilitar os recursos padrão, adicione \"default-features\": false.", + "DependencyFeatureDefault": "o recurso \"padrão\" não pode estar na lista de recursos de uma dependência. Para habilitar os recursos padrão, adicione \"default-features\": true.", + "DependencyGraphCalculation": "Envio de grafo de dependência habilitado.", + "DependencyGraphFailure": "Falha no envio do grafo de dependência.", + "DependencyGraphSuccess": "Envio de grafo de dependência realizado com êxito.", "DeprecatedPrefabDebugOption": "--prefab-debug agora está obsoleto.", "DetectCompilerHash": "Detectando hash do compilador para tripleto {triplet}...", "DocumentedFieldsSuggestUpdate": "Se estes forem campos documentados que devem ser reconhecidos, tente atualizar a ferramenta vcpkg.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "O arquivo não tem o hash esperado:\nurl: {url}\nArquivo: {path}\nHash esperado: {expected}\nHash real: {actual}", "DownloadFailedRetrying": "Falha no download – tentando novamente após {value}ms", "DownloadFailedStatusCode": "{url}: falha: código de status {value}", - "DownloadRootsDir": "Especifique o diretório raiz de downloads.\n(padrão: {env_var})", + "DownloadRootsDir": "Baixa o diretório (padrão: {env_var})", "DownloadWinHttpError": "{url}: {system_api} falhou com o código de saída {exit_code}", "DownloadedSources": "Fontes baixadas para {spec}", "DownloadingPortableToolVersionX": "Uma versão adequada de {tool_name} não foi encontrada (v{version} exigida) Baixando {tool_name} {version} portátil...", "DownloadingTool": "Baixando {tool_name}...\n{url}->{path}", "DownloadingUrl": "Baixando {url}", - "DownloadingVcpkgCeBundle": "Baixando o pacote de artefatos-vcpkg {version}...", - "DownloadingVcpkgCeBundleLatest": "Baixando o mais recente pacote de artefatos-vcpkg...", "DownloadingVcpkgStandaloneBundle": "Baixando o pacote autônomo {version}.", "DownloadingVcpkgStandaloneBundleLatest": "Baixando o pacote autônomo mais recente.", "DuplicatePackagePattern": "O pacote \"{Package_name}\" está duplicado.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "ao detectar informações do compilador:\nO conteúdo do arquivo de log em \"{path}\" é:", "ErrorIndividualPackagesUnsupported": "No modo de manifesto, `vcpkg install` não dá suporte a argumentos de pacotes individuais.\nPara instalar pacotes adicionais, edite o vcpkg.json e execute `vcpkg install` sem nenhum argumento de pacote.", "ErrorInvalidClassicModeOption": "A opção --{option} não é suportada no modo clássico e nenhum manifesto foi encontrado.", + "ErrorInvalidExtractOption": "--{option} deve ser definido como um inteiro não negativo ou \"AUTO\".", "ErrorInvalidManifestModeOption": "Não há suporte para a opção --{option} no modo de manifesto.", "ErrorMessage": "erro: ", "ErrorMessageMustUsePrintError": "A mensagem chamada {value} começa com o erro:, ela deve ser alterada para preceder ErrorMessage no código.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "Erros ao analisar {path}.", "ErrorWhileWriting": "Ocorreu um erro ao gravar {path}.", "ErrorsFound": "Encontrou os seguintes erros:", - "Example": "exemplo:", + "ExamplesHeader": "Exemplos:", "ExceededRecursionDepth": "Profundidade de recursão excedida.", "ExcludedPackage": "Excluído {spec}", "ExcludedPackages": "Estão excluídos os seguintes pacotes:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Exportando ferramenta de manutenção...", "ExportingPackage": "Exportando {package_name}...", "ExtendedDocumentationAtUrl": "Documentação estendida disponível em '{url}'.", + "ExtractHelp": "Extrai um arquivo.", "ExtractingTool": "Extraindo {tool_name}...", "FailedPostBuildChecks": "{count} problemas de verificação pós-build encontrados. Para enviar essas portas para catálogos coletados, corrija primeiro o portfile: {path}", "FailedToAcquireMutant": "falhou em adquirir o mutante {path}", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "Falha ao determinar a confirmação atual:", "FailedToDownloadFromMirrorSet": "Falha ao baixar do conjunto de espelhos", "FailedToExtract": "Falha ao extrair \"{path}\":", - "FailedToFetchError": "{error_msg}\nFalha ao buscar {package_name}:", - "FailedToFindBaseline": "Falha ao encontrar baseline.json", + "FailedToFetchRepo": "Falha ao buscar {url}.", "FailedToFindPortFeature": "{package_name} não tem nenhum recurso chamado {feature}.", "FailedToFormatMissingFile": "Nenhum arquivo para formatar.\nPasse --all ou os arquivos explícitos para formatar ou converter.", "FailedToLoadInstalledManifest": "Não foi possível carregar o arquivo de controle ou de manifesto para {package_name} devido ao erro a seguir. Remova {package_name} e tente novamente.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "Falha ao obter o bloqueio do sistema de arquivos em {path}", "FailedToWriteManifest": "Falha ao gravar o arquivo de manifesto {path}", "FailedVendorAuthentication": "Não foi possível autenticar um ou mais provedores de credenciais do {vendor}. Consulte '{url}' para obter mais detalhes sobre como fornecer credenciais.", - "FeedbackAppreciated": "Agradecemos seus comentários!", "FetchingBaselineInfo": "Buscando informações de linha de base de {package_name}...", "FetchingRegistryInfo": "Buscando informações de registro de {url} ({value})...", "FieldKindDidNotHaveExpectedValue": "\"kind\" não tinha um valor esperado: (esperado um de: {expected}; encontrado {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "Caminhos absolutos foram encontrados nos seguintes arquivos:", "FilesExported": "Arquivos exportados em: {path}", "FindHelp": "Procura o artefato ou porta indicado. Sem parâmetro após 'artefato' ou 'porta', exibe tudo.", + "FindVersionArtifactsOnly": "--version não pode ser usado com a porta de localização vcpkg ou pesquisa vcpkg", "FishCompletion": "a conclusão do peixe vcpkg já foi adicionada em \"{path}\".", "FloatingPointConstTooBig": "Constante de ponto flutuante muito grande: {count}", "FollowingPackagesMissingControl": "Os pacotes a seguir não têm um CONTROL ou vcpkg.json válido:", "FollowingPackagesNotInstalled": "Os seguintes pacotes não estão instalados:", "FollowingPackagesUpgraded": "Os seguintes pacotes estão atualizados:", + "ForMoreHelp": "Para obter mais ajuda", "ForceSystemBinariesOnWeirdPlatforms": "A variável de ambiente VCPKG_FORCE_SYSTEM_BINARIES deve ser definida nas plataformas arm, s390x, ppc64le e riscv.", "FormattedParseMessageExpression": "na expressão: {value}", "GHAParametersMissing": "A fonte binária GHA exige que as variáveis de ambiente ACTIONS_RUNTIME_TOKEN e ACTIONS_CACHE_URL sejam definidas. Confira {url} para obter mais informações.", @@ -470,7 +590,7 @@ "GitCommandFailed": "falhou ao executar: {command_line}", "GitFailedToFetch": "falha ao buscar a ref {value} do repositório {url}", "GitFailedToInitializeLocalRepository": "falha ao inicializar o repositório local {path}", - "GitRegistryMustHaveBaseline": "A entrada de registro git para \"{package_name}\" deve ter um campo \"baseline\" que seja um SHA de confirmação git válido (40 caracteres hexadecimais).\nO HEAD atual desse repositório é \"{value}\".", + "GitRegistryMustHaveBaseline": "O registro git \"{url}\" deve ter um campo \"linha de base\" que seja um SHA de confirmação git válido (40 caracteres hexadecimais).\nPara usar as versões mais recentes atuais, defina a linha de base para o HEAD do repositório, \"{commit_sha}\".", "GitStatusOutputExpectedFileName": "esperado nome de arquivo", "GitStatusOutputExpectedNewLine": "nova linha esperada", "GitStatusOutputExpectedRenameOrNewline": "arquivo renomeado esperado ou novas linhas", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "o git produziu uma saída inesperada ao executar {command_line}", "GraphCycleDetected": "Ciclo detectado no gráfico em {package_name}:", "HashFileFailureToRead": "falha ao ler o arquivo \"{path}\" para hash: ", + "HashPortManyFiles": "O {package_name} contém {count} arquivos. O hash desses conteúdos pode levar muito tempo ao determinar o hash da ABI para cache binário. Considere reduzir o número de arquivos. Fazer check-out acidental de arquivos de origem ou build no diretório de uma porta estão entre as causas comuns disso.", "HeaderOnlyUsage": "{package_name} é somente de cabeçalho e pode ser usado da CMake via:", "HelpAssetCaching": "**Recurso experimental: isso pode ser alterado ou ser removido a qualquer momento**\n\nO vcpkg pode usar espelhos para armazenar em cache os ativos baixados, garantindo a operação contínua mesmo se a fonte original mudar ou desaparecer.\n\nO cache de ativos pode ser configurado definindo a variável de ambiente X_VCPKG_ASSET_SOURCES para uma lista de origens delimitada por ponto-e-vírgula ou passando uma sequência de --x-asset-sources= opções de linha de comando. As fontes da linha de comando são interpretadas após as fontes do ambiente. Vírgulas, ponto e vírgula e acentos graves podem ser escapados usando crase (`).\n\nO parâmetro opcional para certas cadeia de caracteres controla como elas serão acessadas. Ele pode ser especificado como \"read\", \"write\" ou \"readwrite\" e o padrão é \"read\".\n\nFontes válidas:", "HelpAssetCachingAzUrl": "Adiciona uma fonte de Armazenamento de Blobs do Azure, opcionalmente usando a validação de Assinatura de Acesso Compartilhado. O URL deve incluir o caminho do contêiner e terminar com um \"/\" à direita. , se definido, deve ser prefixado com um \"?\". Servidores não Azure também funcionarão se responderem a solicitações GET e PUT no formato: \"\".", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "Especifica um tempo limite NuGet para operações de rede NuGet; equivalente ao parâmetro \"-Timeout\" da CLI do NuGet.", "HelpBuiltinBase": "A linha de base faz referência a um commit no repositório vcpkg que estabelece uma versão mínima em cada dependência no gráfico. Por exemplo, se nenhuma outra restrição for especificada (direta ou transitivamente), a versão será resolvida para a linha de base do manifesto de nível superior. As linhas de base de dependências transitivas são ignoradas.", "HelpCachingClear": "Remove todas as fontes anteriores, incluindo padrões.", - "HelpContactCommand": "Exibir informações de contato para enviar comentários.", - "HelpCreateCommand": "Criar uma nova porta.", - "HelpDependInfoCommand": "Exibir uma lista de dependências para portas.", - "HelpEditCommand": "Abra uma porta para edição (use a variável de ambiente '{env_var}' para definir um programa de editor, o padrão é 'code').", + "HelpContactCommand": "Exibe as informações de contato para enviar os comentários.", + "HelpCreateCommand": "Cria uma nova porta", + "HelpDependInfoCommand": "Exibe uma lista de dependências para portas", + "HelpEditCommand": "Edita uma porta, opcionalmente com {env_var}, o padrão para \"code\"", "HelpEnvCommand": "Cria um ambiente de shell limpo para desenvolvimento ou compilação.", - "HelpExampleCommand": "Para obter mais ajuda (incluindo exemplos), consulte a pasta de documentos README.md em anexo.", + "HelpExampleCommand": "Para obter mais ajuda (incluindo exemplos), consulte https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Manifesto de exemplo:", "HelpExportCommand": "Exporta um pacote.", - "HelpFormatManifestCommand": "Formatiza todos os arquivos vcpkg.json. Execute isso antes de confirmar para vcpkg.", "HelpHashCommand": "Hash de um arquivo por algoritmo específico, o padrão é SHA512.", - "HelpInitializeRegistryCommand": "Inicializa um registro no diretório .", - "HelpInstallCommand": "Instalar um pacote.", - "HelpListCommand": "Listar pacotes instalados.", + "HelpInstallCommand": "Instala um pacote", + "HelpListCommand": "Lista os pacotes instalados", "HelpManifestConstraints": "Os manifestos podem colocar três tipos de restrições nas versões usadas", "HelpMinVersion": "Vcpkg selecionará a versão mínima encontrada que corresponda a todas as restrições aplicáveis, incluindo a versão da linha de base especificada no nível superior, bem como quaisquer restrições \"version>=\" no gráfico.", "HelpOverrides": "Quando usado como o manifesto de nível superior (como ao executar `vcpkg install` no diretório), as substituições permitem que um manifesto cause um curto-circuito na resolução de dependências e especifique exatamente a versão a ser usada. Eles podem ser usados para lidar com conflitos de versão, como dependências de `version-string`. Eles não serão considerados quando transitivamente dependentes.", - "HelpOwnsCommand": "Pesquise arquivos em pacotes instalados.", + "HelpOwnsCommand": "Procura o proprietário de um arquivo nos pacotes instalados", "HelpPackagePublisher": "Além disso, os editores de pacotes podem usar restrições \"version>=\" para garantir que os consumidores estejam usando pelo menos uma determinada versão mínima de uma determinada dependência. Por exemplo, se uma biblioteca precisar de uma API adicionada ao boost-asio na versão 1.70, uma restrição \"version>=\" garantirá que os usuários transitivos usem uma versão suficiente, mesmo diante de substituições de versões individuais ou referências entre registros.", - "HelpPortVersionScheme": "Cada versão possui adicionalmente uma \"versão de porta\" que é um número inteiro não negativo. Quando renderizado como texto, a versão da porta (se diferente de zero) é adicionada como um sufixo ao texto da versão primária separada por um hash (#). As versões de porta são classificadas lexograficamente após o texto da versão primária, por exemplo:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Desinstalar um pacote.", - "HelpRemoveOutdatedCommand": "Desinstalar todos os pacotes desatualizados.", - "HelpResponseFileCommand": "Especifique um arquivo de resposta para fornecer parâmetros adicionais.", - "HelpSearchCommand": "Pesquisar os pacotes disponíveis para serem criados.", - "HelpTextOptFullDesc": "Não corte texto longo.", - "HelpTopicCommand": "Exibir ajuda para um tópico específico.", - "HelpTopicsCommand": "Exibir a lista de tópicos de ajuda.", - "HelpTxtOptAllowUnsupportedPort": "Em vez de erros em uma porta sem suporte, continuar com um aviso.", - "HelpTxtOptCleanAfterBuild": "Limpe as árvores de compilação, pacotes e downloads depois de compilar cada pacote.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Limpe as árvores de compilação depois de compilar cada pacote.", + "HelpPortVersionScheme": "Cada versão também tem uma \"versão da porta\", que é um inteiro não negativo. Quando renderizada como texto, a versão da porta (se diferente de zero) é adicionada como um sufixo ao texto da versão primária separado por um hash (#). As versões de porta são classificadas lexicograficamente após o texto da versão primária, por exemplo:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Desinstala um pacote", + "HelpResponseFileCommand": "Contém um argumento por linha expandido nesse local", + "HelpSearchCommand": "Pesquisa pacotes disponíveis para serem criados", + "HelpTextOptFullDesc": "Não trunca textos longos", + "HelpTopicCommand": "Exibe o tópico de ajuda específico", + "HelpTopicsCommand": "Exibe a lista completa dos tópicos de ajuda", + "HelpTxtOptAllowUnsupportedPort": "Continua com um aviso nas portas sem suporte, em vez de falhar", + "HelpTxtOptCleanAfterBuild": "Limpa compilações, pacotes e downloads depois de compilar cada pacote", + "HelpTxtOptCleanBuildTreesAfterBuild": "Limpa buildtrees depois de construir cada pacote", "HelpTxtOptCleanDownloadsAfterBuild": "Limpe os downloads depois de compilar cada pacote.", - "HelpTxtOptCleanPkgAfterBuild": "Limpe os pacotes depois de compilar cada pacote.", - "HelpTxtOptDryRun": "Não compilar ou instalar.", - "HelpTxtOptEditable": "Desabilitar a extração de origem e o cache binário para bibliotecas na linha de comando (modo clássico)", - "HelpTxtOptEnforcePortChecks": "Falha na instalação se uma porta detecta problemas ou tenta usar um recurso preterido", - "HelpTxtOptKeepGoing": "Continue instalando pacotes em caso de falha.", - "HelpTxtOptManifestFeature": "Recurso adicional do manifesto de nível superior a ser instalado (modo de manifesto).", - "HelpTxtOptManifestNoDefault": "Não instale os recursos padrão do manifesto de nível superior (modo de manifesto).", - "HelpTxtOptNoDownloads": "Não baixe novas fontes.", - "HelpTxtOptNoUsage": "Não imprimir informações de uso do CMake após a instalação.", - "HelpTxtOptOnlyBinCache": "Falhará se os binários armazenados em cache não estiverem disponíveis.", - "HelpTxtOptOnlyDownloads": "Faça uma melhor tentativa de baixar fontes sem compilar.", - "HelpTxtOptRecurse": "Permita a remoção de pacotes como parte da instalação.", - "HelpTxtOptUseAria2": "Use aria2 para executar tarefas de download.", - "HelpTxtOptUseHeadVersion": "Instale as bibliotecas na linha de comando usando as fontes upstream mais recentes (modo clássico).", - "HelpTxtOptWritePkgConfig": "Grava um arquivo formatado em packages.config do NuGet para uso com cache binário externo.\nConfira 'vcpkg help binarycaching' para obter mais informações.", - "HelpUpdateBaseline": "A melhor abordagem para manter suas bibliotecas atualizadas, a melhor abordagem é atualizar sua referência de linha de base. Isso garantirá que todos os pacotes, incluindo os transitivos, sejam atualizados. No entanto, se você precisar atualizar um pacote de forma independente, poderá usar uma restrição \"version>=\".", - "HelpUpdateCommand": "Listar pacotes que podem ser atualizados.", - "HelpUpgradeCommand": "Recompilar todos os pacotes desatualizados.", - "HelpVersionCommand": "Exibir as informações de versão.", + "HelpTxtOptCleanPkgAfterBuild": "Limpa os pacotes depois de compilar cada pacote.", + "HelpTxtOptDryRun": "Na verdade, não compila ou instala", + "HelpTxtOptEditable": "Desabilita a re-extração de origem e o cache binário para bibliotecas na linha de comando (modo clássico)", + "HelpTxtOptEnforcePortChecks": "Falha na instalação se uma porta tiver detectado problemas ou tentar usar um recurso preterido", + "HelpTxtOptKeepGoing": "Continua a instalar pacotes em caso de falha", + "HelpTxtOptManifestFeature": "Recursos adicionais do manifesto de nível superior para instalar (modo de manifesto)", + "HelpTxtOptManifestNoDefault": "Não instala os recursos padrão do manifesto de nível superior (modo de manifesto)", + "HelpTxtOptNoDownloads": "Não baixa novas fontes", + "HelpTxtOptNoUsage": "Não imprime informações de uso do CMake após a instalação", + "HelpTxtOptOnlyBinCache": "Falha se os binários armazenados em cache não estiverem disponíveis", + "HelpTxtOptOnlyDownloads": "Faz a melhor tentativa de download de fontes sem criar", + "HelpTxtOptRecurse": "Permite a remoção de pacotes como parte da instalação", + "HelpTxtOptUseAria2": "Usa aria2 para executar tarefas de download", + "HelpTxtOptUseHeadVersion": "Instala as bibliotecas na linha de comando usando as fontes upstream mais recentes (modo clássico)", + "HelpTxtOptWritePkgConfig": "Grava um arquivo formatado em packages.config NuGet para uso com cache binário externo. Consulte 'vcpkg help binarycaching' para obter mais informações", + "HelpUpdateBaseline": "A melhor abordagem para manter suas bibliotecas atualizadas é atualizar sua referência de linha de base. Isso garantirá que todos os pacotes, incluindo os transitivos, sejam atualizados. No entanto, se você precisar atualizar um pacote independentemente, poderá usar uma restrição \"version>=\".", + "HelpUpdateCommand": "Lista os pacotes que podem ser atualizados", + "HelpUpgradeCommand": "Recria todos os pacotes desatualizados", + "HelpVersionCommand": "Exibe as informações de versão.", "HelpVersionDateScheme": "Uma data (2021-01-01.5)", "HelpVersionGreater": "Dentro do campo \"dependências\", cada dependência pode ter uma restrição mínima listada. Essas restrições mínimas serão usadas quando transitivamente dependendo desta biblioteca. Uma versão de porta mínima também pode ser especificada com um sufixo '#'.", "HelpVersionScheme": "Uma sequência de números separada por pontos (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Assinatura incorreta do arquivo morto", "IncorrectPESignature": "Assinatura PE incorreta", "IncrementedUtf8Decoder": "Incrementado Utf8Decoder no final da cadeia de caracteres", - "InfoSetEnvVar": "Você também pode definir a variável de ambiente '{env_var}' para um editor de sua escolha.", + "InfoSetEnvVar": "Você também pode definir {env_var} para o editor da sua escolha.", "InitRegistryFailedNoRepo": "Não foi possível criar um registro em {path} porque este não é um repositório git root.\nUse 'git init {command_line}' para criar um repositório git nesta pasta.", "InstallCopiedFile": "{path_source} -> {path_destination} concluído", "InstallFailed": "falha: {path}: {error_msg}", "InstallPackageInstruction": "Com um projeto aberto, vá para Ferramentas->NuGet Gerenciador de Pacotes->Console Gerenciador de Pacotes e cole:\n Install-Package \"{value}\" -Source \"{path}\"", - "InstallRootDir": "(Experimental) Especificar o diretório raiz de instalação.", + "InstallRootDir": "Diretório instalado (experimental)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} ignorado, atualizado", "InstallWithSystemManager": "Você pode instalar esta ferramenta através do gerenciador de pacotes do sistema.", "InstallWithSystemManagerMono": "Os usuários do Ubuntu 18.04 podem precisar de uma versão mais recente do mono, disponível em {url}.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Instalando porta do local: {path}", "InstallingMavenFile": "{path} instalando arquivo do Maven", "InstallingPackage": "Instalando {action_index}/{count} {spec}...", - "IntegrateBashHelp": "Habilite o preenchimento de tabulação do bash.", - "IntegrateFishHelp": "Habilite o preenchimento de guias de peixes.", - "IntegrateInstallHelpLinux": "Disponibilize os pacotes instalados para todo o usuário.", - "IntegrateInstallHelpWindows": "Disponibilize os pacotes instalados para todo o usuário. Requer privilégios de administrador no primeiro uso.", - "IntegratePowerShellHelp": "Habilite o preenchimento de tabulação do PowerShell.", - "IntegrateProjectHelp": "Gere um pacote NuGet de referência para uso individual do projeto VS.", - "IntegrateRemoveHelp": "Remova a integração de todo o usuário.", - "IntegrateZshHelp": "Habilite o preenchimento de tabulação zsh.", - "IntegrationFailed": "A integração não foi aplicada.", + "IntegrateBashHelp": "Habilite a conclusão de guias bash. Apenas fora do Windows", + "IntegrateFishHelp": "Habilite a conclusão da guia peixe. Apenas fora do Windows", + "IntegrateInstallHelpLinux": "Disponibiliza pacotes instalados em todo o usuário", + "IntegrateInstallHelpWindows": "Disponibiliza pacotes instalados em todo o usuário. Requer privilégios de administrador no primeiro uso", + "IntegrateNonWindowsOnly": "{command_line} não é apenas para Windows e não é compatível com este sistema.", + "IntegratePowerShellHelp": "Habilite a conclusão de guias do PowerShell. Somente Windows", + "IntegrateProjectHelp": "Gera um pacote NuGet de referência para uso individual do projeto do Visual Studio. Somente Windows", + "IntegrateRemoveHelp": "Remove a integração em todo o usuário", + "IntegrateWindowsOnly": "{command_line} é apenas para Windows e não é compatível com este sistema.", + "IntegrateZshHelp": "Habilite a conclusão da guia zsh. Apenas fora do Windows", + "IntegrationFailedVS2015": "A integração não foi aplicada para o Visual Studio 2015.", "InternalCICommand": "vcpkg ci é um comando interno que será alterado incompatibilidade ou removido a qualquer momento.", "InternalErrorMessage": "erro interno: ", "InternalErrorMessageContact": "Abra um problema no https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug com etapas detalhadas para reproduzir o problema.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg não suporta comentários no estilo-c, porém a maioria dos objetos permite que campos com prefixo $ sejam usados como comentários.", "InvalidCommitId": "ID de confirmação inválido: {commit_sha}", "InvalidDefaultFeatureName": "'padrão' é um nome de recurso reservado", - "InvalidDependency": "as dependências devem ser alfanuméricos e hifens minúsculos e não um dos nomes reservados", "InvalidFeature": "os recursos devem ser alfanuméricos e hifens minúsculos e não um dos nomes reservados", "InvalidFileType": "falhou: {path} não pode lidar com o tipo de arquivo", "InvalidFilename": "O nome do arquivo não pode conter caracteres inválidos {value}, mas era {path}", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "o valor de [\"{json_field}\"] deve ser um objeto", "JsonFieldNotString": "o valor de [\"{json_field}\"] deve ser uma cadeia de caracteres", "JsonFileMissingExtension": "o arquivo JSON {path} deve ter uma extensão .json (todas as minúsculas)", - "JsonSwitch": "(Experimental) Solicitar saída JSON.", + "JsonSwitch": "Imprime JSON em vez de texto sem formatação", "JsonValueNotArray": "valor json não é uma matriz", "JsonValueNotObject": "valor json não é um objeto", "JsonValueNotString": "valor json não é uma cadeia de caracteres", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Versão Dinâmica (/MD)", "LinkageStaticDebug": "Depuração Estática (/MTd)", "LinkageStaticRelease": "Versão Estática (/MT)", - "ListHelp": "O argumento deve ser uma substring para pesquisar ou nenhum argumento para exibir todas as bibliotecas instaladas.", + "ListHelp": "Lista bibliotecas instaladas", "ListOfValidFieldsForControlFiles": "Esta é a lista de campos válidos para arquivos CONTROL (diferencia maiúsculas de minúsculas):", "LoadingCommunityTriplet": "-- [COMMUNITY] Carregando a configuração triplet de: {path}", "LoadingDependencyInformation": "Carregando informações de dependência para {count} pacotes...", @@ -708,7 +827,6 @@ "MultiArch": "O Multi-Arch deve ser 'o mesmo', mas era {option}", "MultipleFeatures": "{package_name} declara {feature} várias vezes; certifique-se de que os recursos tenham nomes distintos", "MutuallyExclusiveOption": "--{value} não pode ser usado com --{option}.", - "NavigateToNPS": "Navegue até {url} em seu navegador preferido.", "NewConfigurationAlreadyExists": "A criação de um manifesto substituiria um vcpkg-configuration.json em {path}.", "NewManifestAlreadyExists": "Um manifesto já está presente no {path}.", "NewNameCannotBeEmpty": "--name não pode ficar em branco.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "Especifique --name e --version para produzir um manifesto destinado a bibliotecas C++ ou especifique --application para indicar que o manifesto não deve ser usado como uma porta.", "NewVersionCannotBeEmpty": "--version não pode ficar vazia.", "NoArgumentsForOption": "A opção --{option} não aceita um argumento.", - "NoCachedPackages": "Nenhum pacote é armazenado em cache.", "NoError": "nenhum erro", "NoInstalledPackages": "Nenhum pacote está instalado. Você quis dizer 'pesquisar'?", "NoLocalizationForMessages": "Nenhuma mensagem localizada para o seguinte: ", @@ -739,22 +856,27 @@ "OptionRequiresAValue": "a opção “{option}” requer um valor", "OptionRequiresOption": "--{value} requer --{option}", "OptionUsedMultipleTimes": "a opção “{option}” foi especificada várias vezes", - "OptionalCommand": "comando opcional", "Options": "Opções", "OriginalBinParagraphHeader": "\nParágrafo Binário Original", + "OtherCommandsHeader": "Outro", "OverlayPatchDir": "O caminho de sobreposição \"{path}\" deve existir e deve ser um diretório.", + "OverlayPortsDirectoriesHelp": "Diretórios de portas de sobreposição (também: {env_var})", + "OverlayTripletDirectoriesHelp": "Diretórios de trigêmeos sobrepostos (também: {env_var})", "OverlayTriplets": "Sobreposição de triplos de {path}:", "OverwritingFile": "O arquivo {path} já estava presente e será substituído", "PECoffHeaderTooShort": "Ao analisar o Executável Portátil {path}, o tamanho do cabeçalho COFF é muito pequeno para conter um cabeçalho PE válido.", - "PEConfigCrossesSectionBoundary": "Ao analisar o Executável Portátil {path}, o diretório de configuração de imagem cruza um limite de seção.", - "PEImportCrossesSectionBoundary": "Ao analisar o Executável Portátil {path}, a tabela de importação cruza um limite de seção.", + "PEConfigCrossesSectionBoundary": "Ao analisar o Executável Portátil {path}, o diretório de configuração da imagem cruza o limite da seção.", + "PEImportCrossesSectionBoundary": "Ao analisar o Executável Portátil {path}, a tabela de importação cruza o limite de uma seção.", "PEPlusTagInvalid": "Ao analisar o Executável Portátil {path}, o cabeçalho opcional não era PE32 nem PE32+.", "PERvaNotFound": "Ao analisar o Executável Portátil {path}, não foi possível localizar RVA {value:#X}.", "PESignatureMismatch": "Ao analisar o Executável Portátil {path}, a assinatura não é compatível.", "PackageAlreadyRemoved": "não é possível remover {spec}: já removido", + "PackageDiscoveryHeader": "Descoberta de pacotes", "PackageFailedtWhileExtracting": "\"{value}\" falhou ao extrair {path}.", - "PackageInfoHelp": "Exibir informações detalhadas sobre os pacotes.", - "PackageRootDir": "(Experimental) Especifcar o diretório raiz de pacotes.", + "PackageInfoHelp": "Exibe informações detalhadas sobre pacotes", + "PackageInstallationHeader": "Instalação do pacote", + "PackageManipulationHeader": "Manipulação de pacotes", + "PackageRootDir": "Diretório de pacotes (experimental)", "PackagesToInstall": "Os seguintes pacotes serão compilados e instalados:", "PackagesToInstallDirectly": "Os seguintes pacotes serão instalados diretamente:", "PackagesToModify": "Pacotes adicionais (*) serão modificados para completar esta operação.", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "Esperava-se que {value} fosse {expected}", "ParseControlErrorInfoWhileLoading": "ao carregar {path}:", "ParseControlErrorInfoWrongTypeFields": "Os campos a seguir tinham os tipos errados:", - "ParseIdentifierError": "\"{value}\" não é um identificador válido. Os identificadores devem ser alfanuméricos minúsculos + hifens e não reservados (consulte {url} para obter mais informações)", - "ParsePackageNameError": "\"{Package_name}\" não é um nome de pacote válido. Os nomes dos pacotes devem ser alfanuméricos minúsculos + hifens e não reservados (consulte {url} para obter mais informações)", - "ParsePackagePatternError": "\"{Package_name}\" não é um padrão de pacote válido. Os padrões de pacote devem usar somente um caractere (*) e deve ser o último caractere no padrão (consulte {url} para obter mais informações)", + "ParseFeatureNameError": "\"{package_name}\" não é um nome de recurso válido. Os nomes dos recursos devem ser alfanuméricos minúsculos + hifens e não reservados (consulte {url} para obter mais informações).", + "ParseIdentifierError": "\"{value}\" não é um identificador válido. Os identificadores devem ser alfanuméricos minúsculos + hifens e não reservados (consulte {url} para obter mais informações).", + "ParsePackageNameError": "\"{Package_name}\" não é um nome de pacote válido. Os nomes dos pacotes devem ser alfanuméricos minúsculos + hifens e não reservados (consulte {url} para obter mais informações).", + "ParsePackagePatternError": "\"{Package_name}\" não é um padrão de pacote válido. Os padrões de pacote devem usar apenas um caractere curinga (*) e deve ser o último caractere do padrão (consulte {url} para obter mais informações).", "PathMustBeAbsolute": "O valor de variável de ambiente X_VCPKG_REGISTRIES_CACHE não é absoluto: {path}", "PerformingPostBuildValidation": "-- Executando a validação pós-compilação", "PortBugAllowRestrictedHeaders": "Em circunstâncias excepcionais, essa política pode ser desabilitada via {env_var}", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "Para inspecionar os arquivos {extension}, use:", "PortBugInvalidCrtLinkage": "Os binários a seguir devem usar o CRT {expected}.", "PortBugInvalidCrtLinkageEntry": "{path} é vinculado com:", + "PortBugKernel32FromXbox": "O trio selecionado tem como alvo o Xbox, mas as seguintes DLLs estão vinculadas ao kernel32. Essas DLLs não podem ser carregadas no Xbox, onde o kernel32 não está presente. Isso geralmente é causado pela vinculação com kernel32.lib em vez de uma biblioteca abrangente adequada, como onecore_apiset.lib ou xgameplatform.lib.", "PortBugMergeLibCMakeDir": "A pasta /lib/cmake deve ser mesclada com /debug/lib/cmake e movida para /share/{package_name}/cmake. Use a função auxiliar `vcpkg_cmake_config_fixup()` da porta vcpkg-cmake-config`.", "PortBugMismatchedNumberOfBinaries": "Número incompatível de binários de depuração e lançamento.", "PortBugMisplacedCMakeFiles": "Os seguintes arquivos cmake foram encontrados fora de /share/{spec}. Coloque arquivos cmake em /share/{spec}.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "Se a criação de bin\\ e/ou debug\\bin\\ não puder ser desabilitada, use-a no portfile para removê-las", "PortBugRemoveEmptyDirectories": "Se um diretório deve ser preenchido, mas não está, isso pode indicar um erro no portfile.\nSe os diretórios não forem necessários e sua criação não puder ser desabilitada, use algo assim no portfile para removê-los:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE diretórios vazios deixados pelas renomeações acima)", - "PortBugRestrictedHeaderPaths": "Os cabeçalhos restritos a seguir podem impedir que o runtime C++ principal e outros pacotes sejam compilados corretamente. Em circunstâncias excepcionais, esta política pode ser desabilitada via {env_var}.", + "PortBugRestrictedHeaderPaths": "Os cabeçalhos restritos a seguir podem impedir que o runtime principal do C++ e outros pacotes sejam compilados corretamente. Em circunstâncias excepcionais, essa política pode ser desabilitada definindo a variável CMake VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS em portfile.cmake.", "PortBugSetDllsWithoutExports": "DLLs sem nenhuma exportação provavelmente são um bug no script de build. Se isso for desejado, adicione a seguinte linha no portfile:\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS enabled)\nAs seguintes DLLs não têm exportações:", "PortDependencyConflict": "A porta {package_name} tem as seguintes dependências sem suporte:", "PortDoesNotExist": "{package_name} não existe", @@ -827,21 +951,26 @@ "PortsDiffHelp": "O argumento deve ser um branch/tag/hash para checkout.", "PortsNoDiff": "Não houve alterações nas portas entre as duas confirmações.", "PortsRemoved": "As seguintes {count} portas foram removidas:", - "PortsUpdated": "\nAs seguintes portas {count} foram atualizadas:", + "PortsUpdated": "As seguintes portas {count} foram atualizadas:", "PrebuiltPackages": "Existem pacotes que não foram construídos. Para construí-los execute:", "PreviousIntegrationFileRemains": "O arquivo de integração anterior não foi removido.", "ProgramReturnedNonzeroExitCode": "{tool_name} falhou com o código de saída: ({exit_code}).", "ProvideExportType": "Pelo menos uma das seguintes opções é necessária: --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "Falha ao enviar {vendor} para \"{path}\". Use --debug para mais informações.", - "RegeneratesArtifactRegistry": "Gera novamente um registro de artefato.", + "RegeneratesArtifactRegistry": "Regenera um registro de artefato", "RegistryCreated": "Registro criado com êxito em {path}", "RegistryValueWrongType": "O valor do registro {path} era de um tipo inesperado.", "RemoveDependencies": "Para remover dependências no modo manifesto, edite seu manifesto (vcpkg.json) e execute 'install'.", "RemovePackageConflict": "{spec} não está instalado, mas {package_name} está instalado para {triplet}. Você quis dizer {package_name}:{triplet}?", "RemovingPackage": "Removendo {action_index}/{count} {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "Pacote restaurado de \"{path}\"", - "RestoredPackagesFromVendor": "{count} pacote(s) restaurado(s) de {value} em {elapsed}. Utilize --debug para ver mais detalhes.", + "RestoredPackagesFromAWS": "{count} pacote(s) restaurado(s) da AWS em {elapsed}. Use --debug para ver mais detalhes.", + "RestoredPackagesFromCOS": "{count} pacote(s) restaurado(s) do COS em {elapsed}. Use --debug para ver mais detalhes.", + "RestoredPackagesFromFiles": "{count} pacote(s) restaurado(s) de {path} em {elapsed}. Use --debug para ver mais detalhes.", + "RestoredPackagesFromGCS": "{count} pacote(s) restaurado(s) do GCS em {elapsed}. Use --debug para ver mais detalhes.", + "RestoredPackagesFromGHA": "{count} pacote(s) restaurado(s) do GitHub Actions Cache em {elapsed}. Use --debug para ver mais detalhes.", + "RestoredPackagesFromHTTP": "{count} pacote(s) restaurado(s) de servidores HTTP em {elapsed}. Use --debug para ver mais detalhes.", + "RestoredPackagesFromNuGet": "{count} pacote(s) restaurado(s) do NuGet em {elapsed}. Use --debug para ver mais detalhes.", "ResultsHeader": "RESULTADOS", "ScriptAssetCacheRequiresScript": "argumentos esperados: a configuração do ativo 'x-script' requer exatamente o modelo exec como um argumento", "SearchHelp": "O argumento deve ser uma substring para pesquisar ou nenhum argumento para exibir todas as bibliotecas.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "Ignorando a limpeza do conteúdo de {path} porque ele não era um diretório.", "SourceFieldPortNameMismatch": "O campo “Fonte” dentro do arquivo CONTROLE, ou o campo “nome” dentro do arquivo vcpkg.json tem o nome {package_name} e não corresponde ao diretório da porta \"{path}\".", "SpecifiedFeatureTurnedOff": "O recurso '{command_name}' foi especificamente desativado, mas --{option} foi especificado.", - "SpecifyDirectoriesContaining": "Diretórios especificados que contêm arquivos de triplets.\n(também: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "Especificar5 os diretórios a serem usados ao procurar portas.\n(também: '{env_var}')", - "SpecifyHostArch": "Especifique o tripleto da arquitetura do host. Consulte 'vcpkg help triplet'.\n(padrão: '{env_var}')", - "SpecifyTargetArch": "Especificar o tripleto da arquitetura de destino. Consulte 'vcpkg help triplet'.\n(padrão: '{env_var}')", + "SpecifyHostArch": "Tripleto do host. Consulte 'vcpkg help triplet' (padrão: {env_var})", + "SpecifyTargetArch": "Tripleto do destino. Consulte 'vcpkg help triplet' (padrão: {env_var})", "StartCodeUnitInContinue": "unidade de código inicial encontrada na posição continuar", "StoreOptionMissingSha": "--store opção é inválida sem um sha512", - "StoredBinariesToDestinations": "Binários armazenados em {count} destinos.", + "StoredBinariesToDestinations": "Binários armazenados em {count} destinos em {elapsed}.", "StoredBinaryCache": "Cache binário armazenado: \"{path}\"", "SuccessfulyExported": "Exportou {package_name} para {path}", "SuggestGitPull": "O resultado pode estar desatualizado. Execute `git pull` para obter os resultados mais recentes.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "Talvez seja necessário atualizar o binário vcpkg; tente executar {command_line} para atualizar.", "SupportedPort": "Há suporte para a porta {package_name}.", "SwitchUsedMultipleTimes": "a opção “{option}” foi especificada várias vezes", + "SynopsisHeader": "Sinopse:", "SystemApiErrorMessage": "Falha ao chamar {system_api} com {exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "Espera-se que a variável de ambiente SystemRoot seja sempre definida no Windows.", "SystemTargetsInstallFailed": "falha ao instalar o arquivo de destinos do sistema em {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Vírgula à direita na matriz", "TrailingCommaInObj": "Vírgula à direita em um objeto", "TripletFileNotFound": "Arquivo triplo {triplet}.cmake não encontrado", + "TripletLabel": "Triplet:", "TwoFeatureFlagsSpecified": "'{value}' e -'{value}' foram especificados como sinalizadores de recurso.", "UnableToClearPath": "não é possível excluir {path}", "UnableToReadAppDatas": "%LOCALAPPDATA% e %APPDATA% eram ilegíveis", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "registro '{url}' não atualizado: '{value}'", "UpdateBaselineRemoteGitError": "falha do git ao buscar o repositório remoto '{url}'", "UpdateBaselineUpdatedBaseline": "registro atualizado '{url}': linha de base '{old_value}' -> '{new_value}'", - "UpgradeInManifest": "O comando de atualização atualmente não oferece suporte ao modo de manifesto. Em vez disso, modifique seu vcpkg.json e execute instalação.", + "UpgradeInManifest": "A atualização atualiza uma instalação no modo clássico e, portanto, não oferece suporte ao modo manifesto. Considere atualizar suas dependências atualizando sua linha de base para um valor atual com vcpkg x-update-baseline e executando a instalação vcpkg.", "UpgradeRunWithNoDryRun": "Se você tiver certeza de que deseja reconstruir os pacotes acima, execute este comando com a opção --no-dry-run.", "UploadedBinaries": "Binários carregados para {count} {vendor}.", "UploadedPackagesToVendor": "{count} pacote(s) carregado(s) para {vendor} em {elapsed}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "comando inválido: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "O valor de variável de ambiente X_VCPKG_REGISTRIES_CACHE não é um diretório: {path}", "VcpkgRootRequired": "A configuração VCPKG_ROOT é necessária para inicialização autônoma.", - "VcpkgRootsDir": "Especificar o diretório raiz vcpkg.\n(padrão: '{env_var}')", + "VcpkgRootsDir": "O diretório raiz vcpkg (padrão: {env_var})", "VcpkgSendMetricsButDisabled": "--sendmetrics passou, mas as métricas estão desabilitadas.", + "VcpkgUsage": "usage: vcpkg [--switches] [--options=values] [argumentos] @response_file", "VcvarsRunFailed": "falha ao executar vcvarsall.bat para obter um ambiente do Visual Studio", "VcvarsRunFailedExitCode": "ao tentar obter um ambiente do Visual Studio, vcvarsall.bat retornou {exit_code}", "VersionBaselineMismatch": "A versão mais recente é {esperada}, mas o arquivo de linha de base contém {real}.\nCorrer:\nvcpkg x-add-version {package_name}\ngit adicionar versões\ngit commit -m \"Atualizar versão do banco de dados\"\npara atualizar a versão da linha de base.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "{package_name} está faltando um arquivo de banco de dados de versão em {path}\nCorrer:\nvcpkg x-add-version {package_name}\npara criar o arquivo de versões.", "VersionGitEntryMissing": "nenhuma entrada de banco de dados de versão para {package_name} em {version}.\nVersões disponíveis:", "VersionInDeclarationDoesNotMatch": "A versão declarada no arquivo não corresponde à versão verificada: {version}", - "VersionIncomparable1": "conflito de versão em {spec}: {package_name} exigiu {expected}, mas vcpkg não pôde compará-lo com {actual}.\nAs duas versões usavam esquemas incomparáveis:", - "VersionIncomparable2": "\"{version}\" era do esquema {new_scheme}", - "VersionIncomparable3": "Isso pode ser resolvido adicionando uma substituição explícita à versão preferida, por exemplo:", - "VersionIncomparable4": "Veja `vcpkg help versioning` para mais informações.", + "VersionIncomparable1": "conflito de versão em {spec}: {constraint_origin} exigiu {expected}, que não pode ser comparado com a versão de linha de base {actual}.", + "VersionIncomparable2": "{version_spec} tem esquema {new_scheme}", + "VersionIncomparable3": "Isso pode ser resolvido adicionando uma substituição explícita à versão preferencial. Por exemplo:", + "VersionIncomparable4": "Veja `vcpkg help versioning` ou {url} para mais informações.", + "VersionIncomparableSchemeString": "Ambas as versões têm sequência de esquema, mas texto primário diferente.", + "VersionIncomparableSchemes": "As versões têm esquemas incomparáveis:", "VersionInvalidDate": "`{version}` não é uma versão de data válida. As datas devem seguir o formato AAAA-MM-DD e os desambiguadores devem ser valores inteiros positivos separados por ponto sem zeros à esquerda.", "VersionInvalidRelaxed": "`{version}` não é uma versão relaxada válida (semver com contagem de elementos numéricos arbitrários).", "VersionInvalidSemver": "`{version}` não é uma versão semântica válida, consulte .", "VersionMissing": "esperava um campo de controle de versão (uma versão, data da versão, semver de versão ou cadeia de caracteres de versão)", - "VersionMissingRequiredFeature": "{spec}@{version} não tem o recurso obrigatório {feature}", + "VersionMissingRequiredFeature": "{version_spec} não tem o recurso obrigatório {feature} necessário para {constraint_origin}", "VersionNotFound": "{expected} não disponível, apenas {actual} está disponível", - "VersionNotFoundDuringDiscovery": "a versão não foi encontrada durante a descoberta: {spec}@{version}\nEste é um erro interno do vcpkg. Abra um problema em https://github.com/Microsoft/vcpkg com etapas detalhadas para reproduzir o problema.", - "VersionNotFoundInVersionsFile": "A versão {version} não foi encontrada no arquivo de versões.\nCorrer:\nvcpkg x-add-version {package_name}\npara adicionar a nova versão da porta.", + "VersionNotFoundInVersionsFile": "A versão {version} não foi encontrada no arquivo de versões para {package_name}.\nCorrer:\nvcpkg x-add-version {package_name}\npara adicionar a nova versão da porta.", "VersionRejectedDueToBaselineMissing": "{path} foi rejeitado porque usa \"{json_field}\" e não tem uma \"linha de base incorporada\". Isso pode ser corrigido removendo os usos de \"{json_field}\" ou adicionando uma \"linha de base incorporada\".\nConsulte `vcpkg help versioning` para mais informações.", "VersionRejectedDueToFeatureFlagOff": "{path} foi rejeitado porque usa \"{json_field}\" e o sinalizador de recurso `versões` está desativado. Isso pode ser corrigido removendo \"{json_field}\" ou ativando o sinalizador de recurso `versões`.\nConsulte `vcpkg ajuda versionamento` para mais informações.", "VersionSchemeMismatch": "O banco de dados de versão declara {version} como {expected}, mas {path} o declara como {actual}. As versões devem ser únicas, mesmo que sejam declaradas com esquemas diferentes.\nCorrer:\nvcpkg x-add-version {package_name} --overwrite-version\npara sobrescrever o esquema declarado no banco de dados da versão com o declarado na porta.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "\"#\" no texto da versão deve ser seguido por uma versão de porta (um inteiro não negativo)", "VersionSpecMismatch": "Falha ao carregar a porta porque as versões são inconsistentes. O arquivo \"{path}\" contém a versão {actual_version}, mas o banco de dados de versões indica que deve ser {expected_version}.", "VersionTableHeader": "Versão", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "Aguardando a saída dos processos filhos...", "WaitingToTakeFilesystemLock": "esperando para ativar o bloqueio do sistema de arquivos {path}...", "WarnOnParseConfig": "Os seguintes avisos foram encontrados na configuração {path}:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "ao validar a versão: {version}", "WindowsOnlyCommand": "Este comando oferece suporte apenas ao Windows.", "WroteNuGetPkgConfInfo": "Escreveu as informações de configuração do pacote NuGet para {path}", - "UnrecognizedCommand$": "Comando não reconhecido '${p0}'", - "Use$ToGetHelp": "Use ${p0} para obter ajuda", - "FatalTheRootFolder$CanNotBeCreated": "Fatal: a pasta raiz '${p0}' não pode ser criada", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Fatal: o arquivo de configuração global '${p0}' não pode ser criado", + "FatalTheRootFolder$CannotBeCreated": "Fatal: não é possível criar a pasta raiz \"${p0}\"", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Fatal: não é possível criar o arquivo de configuração global \"${p0}\"", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND não foi definido", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "A execução do vcpkg retornou internamente um código de saída diferente de zero: ${p0}", "failedToDownloadFrom$": "falha ao baixar de ${p0}", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "descrição deve ser do tipo 'string', encontrado '${p0}'", "optionsShouldBeASequenceFound$": "as opções devem ser uma sequência, encontradas '${p0}'", "DuplicateKeysDetectedInManifest$": "Chaves duplicadas detectadas no manifesto: '${p0}'", - "in$Skipping$BecauseItIsA$": "em ${p0} ignorando ${p1} porque é um ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "nenhum arquivo postscript: execute novamente com a função shell vcpkg em vez do executável", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Duplicar definir ${p0} durante a ativação. O novo valor substituirá o antigo.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "Ferramenta duplicada declarada ${p0} durante a ativação. O novo valor substituirá o antigo.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(progresso desconhecido)", "verifying": "verificando", "downloading$$": "baixando ${p0} -> ${p1}", - "unpacking": "Desembalar", "unpacking$": "desempacotar ${p0}", "Installing$": "Instalando ${p0}...", "$AlreadyInstalled": "${p0} já instalado.", "Downloading$": "Baixando ${p0}...", "Unpacking$": "Desempacotamento de ${p0}...", "ErrorInstalling$$": "Erro ao instalar ${p0} - ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "Esperado um único valor para ${p0} - encontrado vários", - "Synopsis": "Sinopse", - "Description": "Descrição", - "Switches": "Opções", - "SeeAlso": "Confira também", "error": "erro:", "warning": "aviso:", + "ExpectedASingleValueFor$FoundMultiple": "Esperado um único valor para ${p0} - encontrado vários", "ExpectedASingleValueFor$": "Esperava-se um único valor para '--${p0}'.", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Supondo que '${p0}' esteja correto; forneça um hash nos metadados do artefato para suprimir essa mensagem.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "O arquivo '${p0}' baixado não tinha o hash correto (${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "Encontrou um ${p0} incompatível em '${p1}'. Para um ${p2} literal, use ${p3}${p4}.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "Não foi possível encontrar um valor para {${p0}} em '${p1}'. Para escrever o valor literal, use '{{${p2}}}'.", "MatchedMoreThanOneInstallBlock$": "Correspondeu a mais de um bloco de instalação [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Adquire tudo o que é referenciado por um projeto, sem ativar", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "Isso permite que o consumidor baixe previamente as ferramentas necessárias para um projeto.", "UnableToFindProjectInFolderorParentFoldersFor$": "Não é possível localizar o projeto na pasta (ou pastas pai) para ${p0}", "UnableToAcquireProject": "Não é possível adquirir o projeto", - "AcquireArtifactsInTheRegistry": "Adquirir artefatos no registro", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "Isso permite que o consumidor adquira (baixe e descompacte) artefatos. Os artefatos devem ser ativados para serem usados", "NoArtifactsSpecified": "Nenhum artefato especificado", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Vários pacotes especificados, mas não um número igual de ${p0} comutadores", "NoArtifactsAreAcquired": "Nenhum artefato foi adquirido", "AllArtifactsAreAlreadyInstalled": "Todos os artefatos já estão instalados", "$ArtifactsInstalledSuccessfully": "${p0} artefatos instalados com êxito", "InstallationFailedStopping": "Falha na instalação -- parando", - "ActivatesTheToolsRequiredForAProject": "Ativa as ferramentas necessárias para um projeto", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "Isso permite que o consumidor ative as ferramentas necessárias para um projeto. Se as ferramentas ainda não estiverem instaladas, isso as forçará a serem baixadas e instaladas antes da ativação.", - "AddsAnArtifactToTheProject": "Adiciona um artefato ao projeto", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "Isso permite que o consumidor adicione um artefato ao projeto. Isso ativará o projeto também.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Vários artefatos especificados, mas não um número igual de ${p0} comutadores", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Tentativa de adicionar um artefato [${p0}]:${p1}, mas não foi possível determinar o Registro a ser usado.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Tentou adicionar o registro ${p0} como ${p1}, mas ele já era ${p2}. Adicione ${p3} a este projeto manualmente e tente novamente.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Execute \\'vcpkg activate\\' para aplicar ao terminal atual", - "ManagesTheDownloadCache": "Gerencia o cache de download", "DownloadsFolderCleared$": "Pasta de downloads desmarcada (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "limpa tudo (cache, artefatos instalados)", - "cleansOutTheDownloadsCache": "limpa o cache de downloads", - "removesAllTheArtifactsThatAreInstalled": "remove todos os artefatos instalados", - "cleansUp": "Limpa", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Permite que o usuário limpe o cache, os artefatos instalados etc.", "InstalledArtifactFolderCleared$": "Pasta Artefato instalada desmarcada (${p0}) ", "CacheFolderCleared$": "Pasta de cache desmarcada (${p0}) ", - "DeactivatesTheCurrentSession": "Desativa a sessão atual", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "Isso permite que o consumidor remova as configurações de ambiente da sessão ativa no momento.", - "DeletesAnArtifactFromTheArtifactFolder": "Exclui um artefato da pasta de artefatos", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "Isso permite que o consumidor remova um artefato do disco.", "DeletingArtifact$From$": "Excluindo o artefato ${p0} de ${p1}", - "FindArtifactsInTheRegistry": "Localizar artefatos no registro", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "Isso permite que o usuário localize artefatos com base em alguns critérios.", "NoArtifactsFoundMatchingCriteria$": "Nenhum artefato encontrado correspondendo aos critérios: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Gera propriedades do MSBuild para uma ativação sem baixar nada para um projeto", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props requires --msbuild-props", "UnableToActivateProject": "Não é possível ativar o projeto", - "theNameOfTheCommandForWhichYouWantHelp": "o nome do comando para o qual você deseja ajuda", - "getHelpOn$OrOneOfTheCommands": "obter ajuda sobre ${p0} ou um dos comandos", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Obtém ajuda detalhada sobre ${p0} ou um dos comandos", - "Arguments": "Argumentos:", - "Use$ToGetTheListOfAvailableCommands": "Use ${p0} para obter a lista de comandos disponíveis", - "Usage": "Uso", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "Comandos ${p0} disponíveis:", - "ListsTheArtifacts": "Lista os artefatos", - "ThisAllowsTheConsumerToListArtifacts": "Isso permite que o consumidor liste artefatos.", - "regenerateTheIndexForARegistry": "regenerar o índice de um registro", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "Isso permite que o usuário regenere os arquivos ${p0} para um registro ${p1}.", "RegeneratingIndexFor$": "Regenerando índice para ${p0}", "RegenerationCompleteIndexContains$MetadataFiles": "Regeneração concluída. O índice contém ${p0} arquivos de metadados", "Registry$ContainsNoArtifacts": "Registro: '${p0}' não contém artefatos.", "error$": "erro ${p0}: ", - "RemovesAnArtifactFromAProject": "Remove um artefato de um projeto", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "Isso permite que o consumidor remova um artefato do projeto. Força a reativação nesta janela.", "Removing$FromProjectManifest": "Removendo ${p0} do manifesto do projeto", "unableToFindArtifact$InTheProjectManifest": "não é possível localizar o artefato ${p0} no manifesto do projeto", - "updateTheRegistryFromTheRemote": "atualizar o registro do remoto", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Isso baixa o conteúdo mais recente do Registro do serviço remoto.", - "DownloadingRegistryData": "Baixando dados do registro", - "Updated$RegistryContains$MetadataFiles": "Atualizado ${p0}. o registro contém ${p1} arquivos de metadados", - "UnableToDownloadRegistrySnapshot": "Não é possível baixar o instantâneo do registro", - "UnableToFindRegistry$": "Não é possível localizar o registro ${p0}", - "ArtifactRegistryDataIsNotLoaded": "Os dados do registro de artefato não foram carregados", - "AttemptingToUpdateArtifactRegistry": "Tentando atualizar o registro de artefato", - "UnableToLoadRegistryIndex": "Não é possível carregar o índice do registro", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Ativa instantaneamente um artefato fora do projeto", - "ThisWillInstantlyActivateAnArtifact": "Isso ativará instantaneamente um artefato.", + "Updated$ItContains$MetadataFiles": "Atualizado ${p0}. Contém ${p1} arquivos de metadados.", + "UnableToDownload$": "Não é possível baixar ${p0}.", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} não pôde ser atualizado; ele pode estar malformado.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "O comando x-update-registry baixa novas informações do registro e, portanto, não pode ser usado com registros locais. Você quis dizer x-regenerate ${p0}?", + "UnableToFindRegistry$": "Não é possível localizar o registro ${p0}.", "NoArtifactsAreBeingAcquired": "Nenhum artefato está sendo adquirido", - "removesAllFilesInTheLocalCache": "remove todos os arquivos no cache local", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "habilita o modo de depuração, exibe mensagens internas sobre como ${p0} funciona", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "continua com a ação (potencialmente perigosa) sem confirmação", - "showsTheinstalledArtifacts": "mostra os artefatos _instalados_", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Despejar variáveis de ambiente e outras propriedades em um arquivo json com o caminho fornecido pelo usuário.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Caminho completo para o arquivo no qual as propriedades do MSBuild serão gravadas.", - "ApplyAnyDeprecationFixups": "Aplicar quaisquer correções de substituição.", - "overrideThePathToTheProjectFolder": "substituir o caminho para a pasta do projeto", - "UnableToFindProjectEnvironment$": "Não é possível localizar o ambiente de projeto ${p0}", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "habilita o modo detalhado, exibe mensagens detalhadas sobre o processo", - "aVersionOrVersionRangeToMatch": "uma versão ou intervalo de versão a ser correspondido" + "UnableToFindProjectEnvironment$": "Não é possível localizar o ambiente de projeto ${p0}" } diff --git a/locales/messages.ru.json b/locales/messages.ru.json index 5674cf51ce..178c252879 100644 --- a/locales/messages.ru.json +++ b/locales/messages.ru.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "встроенный реестр", "AConfigurationObject": "объект конфигурации", "ADateVersionString": "строка версии даты", + "ADefaultFeature": "компонент по умолчанию", "ADemandObject": "объект требования", "ADependency": "зависимость", + "ADependencyFeature": "компонент зависимости", "ADictionaryOfContacts": "словарь контактов", "AFeature": "компонент", + "AFeatureName": "имя компонента", "AFilesystemRegistry": "реестр файловой системы", "AGitObjectSha": "SHA объекта Git", "AGitReference": "ссылка Git (например, ветвь)", @@ -44,12 +47,12 @@ "AddArtifactOnlyOne": "\"{command_line}\" может добавлять только один артефакт за раз.", "AddCommandFirstArg": "Первым добавляемым параметром должен быть \"артефакт\" или \"порт\".", "AddFirstArgument": "Первым аргументом для \"{command_line}\" должен быть 'artifact' или 'port'.", - "AddHelp": "Добавляет указанный порт или артефакт в манифест, связанный с текущим каталогом.", "AddPortRequiresManifest": "\"{command_line}\" требуется активный файл манифеста.", "AddPortSucceeded": "Порты успешно добавлены в файл vcpkg.json.", "AddRecurseOption": "Если вы действительно хотите удалить их, выполните команду с параметром --recurse.", "AddTripletExpressionNotAllowed": "тройные выражения здесь не допускаются. Вы можете изменить `{package_name}:{triplet}` на `{package_name}`.", "AddVersionAddedVersionToFile": "добавлена версия {version} в {path}", + "AddVersionArtifactsOnly": "--version содержит только артефакты и не может использоваться с портом добавления vcpkg", "AddVersionCommitChangesReminder": "Вы не забыли зафиксировать изменения?", "AddVersionCommitResultReminder": "Не забудьте зафиксировать результат!", "AddVersionDetectLocalChangesError": "пропуск обнаружения локальных изменений из-за непредвиденного формата в выходных данных состояния git", @@ -67,7 +70,7 @@ "AddVersionPortFilesShaChanged": "зарегистрированные файлы для {package_name} изменились, но версия не обновлена", "AddVersionPortFilesShaUnchanged": "зарегистрированные файлы для {package_name} не изменялись с версии {version}", "AddVersionPortHasImproperFormat": "Неверный формат {package_name}", - "AddVersionSuggestNewVersionScheme": "Используйте схему \"{new_scheme}\" вместо \"{old_scheme}\" в порте \"{package_name}\".\nЧтобы отключить эту проверку, используйте --{option}.", + "AddVersionSuggestNewVersionScheme": "Используйте схему версий \"{new_scheme}\", а не \"{old_scheme}\" в порте \"{package_name}\".\nЧтобы отключить эту проверку, используйте --{option}.", "AddVersionUnableToParseVersionsFile": "не удалось проанализировать файл версий {path}", "AddVersionUncommittedChanges": "для {package_name} есть незафиксированные изменения", "AddVersionUpdateVersionReminder": "Вы не забыли обновить версию или версию порта?", @@ -83,8 +86,10 @@ "AlreadyInstalled": "Уже установлено: {spec}", "AlreadyInstalledNotHead": "{spec} уже установлено -- сборка не выполняется из HEAD", "AmbiguousConfigDeleteConfigFile": "Неоднозначная конфигурация vcpkg, указанная как в манифесте, так и в файле конфигурации.\n-- Удалить {path} файла конфигурации", + "AnArrayOfDefaultFeatures": "массив компонентов по умолчанию", "AnArrayOfDependencies": "массив зависимостей", "AnArrayOfDependencyOverrides": "массив переопределений зависимостей", + "AnArrayOfFeatures": "массив функций", "AnArrayOfIdentifers": "массив идентификаторов", "AnArrayOfOverlayPaths": "массив путей наложения", "AnArrayOfOverlayTripletsPaths": "массив тройных путей наложения", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "На машине выполняется другая установка, которая находится в спящем режиме в течение 6 секунд, прежде чем повторить попытку.", "AppliedUserIntegration": "Применена общепользовательская интеграция для этого корня vcpkg.", "ApplocalProcessing": "Обработка vcpkg applocal: {path}", + "ArtifactsBootstrapFailed": "vcpkg-артефакты не установлены и не могут использоваться для начальной загрузки.", + "ArtifactsNotInstalledReadonlyRoot": "vcpkg-артефакты не установлены, и их невозможно установить, так как предполагается, что VCPKG_ROOT доступен только для чтения. Переустановка vcpkg с помощью \"one liner\" может устранить эту проблему.", + "ArtifactsNotOfficialWarning": "Использование vcpkg-артефактов с неофициальной версией ", "ArtifactsOptionIncompatibility": "--{option} не влияет на поиск артефакта.", + "ArtifactsOptionJson": "Полный путь к файлу JSON, в котором записаны переменные среды и другие свойства", + "ArtifactsOptionMSBuildProps": "Полный путь к файлу, в который будут записаны свойства MSBuild", + "ArtifactsOptionVersion": "Версия или диапазон версий для сопоставления; допустимо только для артефактов", + "ArtifactsOptionVersionMismatch": "Число переключателей --version должно соответствовать числу именованных артефактов", + "ArtifactsSwitchARM": "Принудительно обнаруживает узел для ARM при получении артефактов", + "ArtifactsSwitchARM64": "Принудительно обнаруживает узел на ARM64 при получении артефактов", + "ArtifactsSwitchAll": "Обновляет все известные реестры артефактов", + "ArtifactsSwitchAllLanguages": "Получает все языковые файлы при получении артефактов", + "ArtifactsSwitchForce": "Принудительно запускает повторное получение, если артефакт уже получен", + "ArtifactsSwitchFreebsd": "Принудительно обнаруживает узел для FreeBSD при получении артефактов", + "ArtifactsSwitchLinux": "Принудительно обнаруживает узел в Linux при получении артефактов", + "ArtifactsSwitchNormalize": "Применяет все исправления нерекомендуемых элементов", + "ArtifactsSwitchOnlyOneHostPlatform": "Можно установить только одну платформу узла (--x64, --x86, --arm, --arm64).", + "ArtifactsSwitchOnlyOneOperatingSystem": "Можно установить только одну операционную систему (--windows, --osx, --linux, --freebsd).", + "ArtifactsSwitchOnlyOneTargetPlatform": "Можно установить только одну целевую платформу (--target:x64, --target:x86, --target:arm, --target:arm64).", + "ArtifactsSwitchOsx": "Принудительно обнаруживает узел в MacOS при получении артефактов", + "ArtifactsSwitchTargetARM": "Устанавливает обнаружение целевого объекта на ARM при получении артефактов.", + "ArtifactsSwitchTargetARM64": "Устанавливает обнаружение цели на ARM64 при получении артефактов", + "ArtifactsSwitchTargetX64": "Устанавливает обнаружение целевого объекта на x64 при получении артефактов", + "ArtifactsSwitchTargetX86": "Устанавливает целевой объект на x86 при получении артефактов", + "ArtifactsSwitchWindows": "Принудительно обнаруживает узел в Windows при получении артефактов", + "ArtifactsSwitchX64": "Принудительно обнаруживает узел в x64 при получении артефактов", + "ArtifactsSwitchX86": "Принудительно обнаруживает узел на x86 при получении артефактов", "AssetCacheProviderAcceptsNoArguments": "непредвиденные аргументы: \"{value}\" не принимает аргументы", - "AssetSourcesArg": "Добавление источников для кэширования ресурсов. См. раздел 'vcpkg help assetcaching'.", + "AssetSourcesArg": "Источники для кэширования ресурсов. См. \"vcpkg help assetcaching\"", "AttemptingToFetchPackagesFromVendor": "Попытка получить {count} пакетов от {vendor}", "AttemptingToSetBuiltInBaseline": "попытка задать встроенный базовый план в vcpkg.json при переопределения default-registry в vcpkg-configuration.json.\nБудет использоваться default-registry из vcpkg-configuration.json.", "AuthenticationMayRequireManualAction": "Один или несколько поставщиков учетных данных {vendor} запросили действие вручную. Добавьте двоичный источник «интерактивный», чтобы обеспечить интерактивность.", "AutoSettingEnvVar": "-- Автоматическая установка переменных среды {env_var} в \"{url}\".", "AutomaticLinkingForMSBuildProjects": "Все проекты MSBuild C++ теперь могут #include любые установленные библиотеки. Связывание будет выполнено автоматически. Установка новых библиотек сделает их мгновенно доступными.", - "AvailableArchitectureTriplets": "Доступные триплеты архитектуры:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 и более поздние версии теперь могут включать (#include) любые установленные библиотеки. Связывание будет выполнено автоматически. Установка новых библиотек сделает их мгновенно доступными.", "AvailableHelpTopics": "Доступные разделы справки:", "AzUrlAssetCacheRequiresBaseUrl": "непредвиденные аргументы: для конфигурации ресурса \"azurl\" требуется базовый URL-адрес", "AzUrlAssetCacheRequiresLessThanFour": "непредвиденные аргументы: для конфигурации ресурса \"azurl\" требуется менее 4 аргументов", "BaselineConflict": "Указание vcpkg-configuration.default-registry в файле манифеста конфликтует со встроенным базовым планом.\nУдалите один из этих конфликтующих параметров.", "BaselineFileNoDefaultField": "Базовый файл при фиксации {commit_sha} был недопустимым (нет поля \"по умолчанию\").", - "BaselineFileNoDefaultFieldPath": "базовый файл в {path} недопустим (поле \"default\" отсутствует)", "BaselineGitShowFailed": "при проверке базовых показателей из фиксации \"{commit_sha}\" не удалось \"git show\" versions/baseline.json. Это можно исправить путем получения фиксаций с помощью \"git fetch\".", "BaselineMissing": "Базовая версия не найдена. Запустите:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\",\nчтобы установить {version} в качестве базовой версии.", - "BaselineMissingDefault": "Файл baseline.json из фиксации \"{commit_sha}\" в репозитории {url} был недопустимым (не содержал поля \"по умолчанию\").", - "BinarySourcesArg": "Добавьте источники для бинарного кэширования. См. \"vcpkg help binarycaching\".", + "BinaryCacheVendorHTTP": "HTTP-серверы", + "BinarySourcesArg": "Источники для двоичного кэширования. См. \"vcpkg help binarycaching\"", "BinaryWithInvalidArchitecture": "{path}\n Ожидалась архитектура {expected}, а была {actual}", "BuildAlreadyInstalled": "{spec} — уже установлено. Удалите {spec}, прежде чем выполнять сборку.", "BuildDependenciesMissing": "Для команды сборки необходимо установить все зависимости.\nОтсутствуют следующие зависимости:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "УСПЕШНО", "BuildResultSummaryHeader": "СВОДКА ПО {triplet}", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(Экспериментально) Укажите корневой каталог buildtrees.", + "BuildTreesRootDir": "Каталог Buildtrees (экспериментальная функция)", "BuildTroubleshootingMessage1": "Используйте последние файлы портов с \"git pull\" и \"vcpkg update\".\nЗатем проверьте наличие известных проблем в:", "BuildTroubleshootingMessage2": "Вы можете отправить новую проблему в:", "BuildTroubleshootingMessage3": "Добавьте \"Ошибка сборки [{package_name}]\" в название отчета об ошибке, следующие сведения о версии в описании ошибки и вложите любые релевантные журналы ошибок из раздела выше.", "BuildTroubleshootingMessage4": "Используйте предварительно заполненный шаблон из {path} при отправке сообщения о проблеме.", - "BuildTroubleshootingMessageGH": "Вы также можете отправить проблему, запустив (необходимо установить интерфейс командной строки GitHub):", + "BuildTroubleshootingMessageGH": "Вы также можете отправить проблему с помощью запуска (необходимо установить интерфейс командной строки GitHub):", "BuildingFromHead": "Сборка {spec} из HEAD...", "BuildingPackage": "Сборка {spec}...", "BuildingPackageFailed": "сбой {spec} при построении: {build_result}", "BuildingPackageFailedDueToMissingDeps": "из-за следующих отсутствующих зависимостей:", - "BuiltInTriplets": "Встроенные триплеты vcpkg:", + "BuiltInTriplets": "Встроенные триплеты:", "BuiltWithIncorrectArchitecture": "Следующие файлы были созданы для неправильной архитектуры:", "CISettingsExclude": "Список разделенных запятыми портов, которые нужно пропустить", "CISettingsOptCIBase": "Путь к файлу ci.baseline.txt. Используется для пропуска портов и обнаружения регрессий.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "Файл для вывода всех определенных хэшей пакетов", "CISettingsOptParentHashes": "Чтение файлов хэшей пакетов для родительского состояния CI для уменьшения набора измененных пакетов.", "CISettingsOptSkippedCascadeCount": "Указывает, что число параметров --exclude и supports в точности равно этому числу", - "CISettingsOptXUnit": "Файл для вывода результатов в формате XUnit (внутренний)", - "CISettingsVerifyGitTree": "Проверьте, каждый ли объект дерева git соответствует объявленной версии (это очень медленно)", - "CISettingsVerifyVersion": "Печать результатов для каждого порта, а не только для ошибок.", - "CISwitchOptAllowUnexpectedPassing": "Указывает, что результаты \"Передача, удаление из списка сбоев\" не должны выдаваться.", - "CISwitchOptDryRun": "Распечатать план без исполнения", - "CISwitchOptRandomize": "Произвольный порядок установки", - "CISwitchOptSkipFailures": "Указывает, что порты с пометкой \"=fail\" в ci.baseline.txt следует пропускать.", - "CISwitchOptXUnitAll": "Сообщать также о неизмененных портах на выходе XUnit (внутреннем)", + "CISettingsOptXUnit": "Файл для вывода результатов в формате XUnit", + "CISettingsVerifyGitTree": "Проверяет, соответствует ли каждый объект дерева git объявленной версии (это очень медленно)", + "CISettingsVerifyVersion": "Печатает результат для каждого порта, а не только для ошибок", + "CISkipInstallation": "Следующие пакеты уже установлены и больше не будут собираться:", + "CISwitchOptAllowUnexpectedPassing": "Скрывает результаты \"Передача, удаление из списка сбоев\"", + "CISwitchOptDryRun": "Распечатывает план без выполнения", + "CISwitchOptRandomize": "Применяет произвольный порядок установки", + "CISwitchOptSkipFailures": "Пропускает порты, помеченные как \"=fail\" в ci.baseline.txt", + "CISwitchOptXUnitAll": "Сообщает о неизмененных портах в выходных данных XUnit", "CMakeTargetsUsage": "{package_name} предоставляет целевые объекты CMake:", "CMakeTargetsUsageHeuristicMessage": "# этот элемент создан эвристически и может быть неверным", "CMakeToolChainFile": "В проектах CMake следует использовать: \"-DCMAKE_TOOLCHAIN_FILE={path}\"", "CMakeUsingExportedLibs": "Чтобы использовать экспортированные библиотеки в проектах CMake, добавьте {value} в командную строку CMake.", - "CacheHelp": "Аргумент должен быть подстрокой для поиска или не должен содержать аргумент для отображения всех кэшированных библиотек.", "CheckedOutGitSha": "Извлеченный Git SHA: {commit_sha}", "CheckedOutObjectMissingManifest": "Извлеченный объект не содержит файла CONTROL или файла vcpkg.json.", "ChecksFailedCheck": "сбой vcpkg; дополнительные сведения недоступны.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "обновление vcpkg путем повторного запуска bootstrap-vcpkg может устранить этот сбой.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing-passing можно использовать, только если указан базовый план с помощью --ci-baseline.", "CiBaselineDisallowedCascade": "Регрессия: значение {spec} является каскадным, но необходима его передача ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "РЕГРЕССИЯ: сбой независимого объекта {spec} с {build_result}.", "CiBaselineRegression": "РЕГРЕССИЯ: {spec} с ошибкой {build_result}. Если требуется, добавьте {spec}=fail в {path}.", "CiBaselineRegressionHeader": "РЕГРЕССИИ:", + "CiBaselineUnexpectedFail": "РЕГРЕССИЯ: {spec} помечен как сбой, но не поддерживается для {triplet}.", + "CiBaselineUnexpectedFailCascade": "РЕГРЕССИЯ: {spec} помечен как сбой, но одна зависимость не поддерживается для {triplet}.", "CiBaselineUnexpectedPass": "ПЕРЕДАЧА, УДАЛЕНИЕ ИЗ СПИСКА СБОЕВ: {spec} ({path}).", "ClearingContents": "Очистка содержимого {path}", "CmakeTargetsExcluded": "примечание. Дополнительные целевые объекты ({count}) не отображаются.", - "CmdAddVersionOptAll": "Обработать версии для всех портов.", - "CmdAddVersionOptOverwriteVersion": "Перезаписать \"git-tree\" существующей версии.", - "CmdAddVersionOptSkipFormatChk": "Пропускает проверку форматирования файлов vcpkg.json.", - "CmdAddVersionOptSkipVersionFormatChk": "Пропускает проверку формата версии.", - "CmdAddVersionOptVerbose": "Печатать сообщения об успехе, а не только об ошибках.", + "CmdAcquireExample1": "vcpkg acquire ", + "CmdAcquireProjectSynopsis": "Получает все артефакты, на которые ссылается манифест", + "CmdAcquireSynopsis": "Получает именуемый артефакт", + "CmdActivateSynopsis": "Активирует артефакты из манифеста", + "CmdAddExample1": "vcpkg add port ", + "CmdAddExample2": "vcpkg add artifact ", + "CmdAddSynopsis": "Добавляет зависимость в манифест", + "CmdAddVersionExample1": "vcpkg x-add-version <имя порта>", + "CmdAddVersionOptAll": "Обрабатывает версии для всех портов", + "CmdAddVersionOptOverwriteVersion": "Перезаписывает git-tree существующей версии", + "CmdAddVersionOptSkipFormatChk": "Пропускает проверку форматирования файлов vcpkg.json", + "CmdAddVersionOptSkipVersionFormatChk": "Пропускает проверку формата версии", + "CmdAddVersionOptVerbose": "Печатает сообщения об успешном выполнении, а не только ошибки", + "CmdAddVersionSynopsis": "Добавляет версию в базу данных версий", + "CmdBootstrapStandaloneSynopsis": "Выполняет начальную загрузку корня vcpkg только из двоичного файла vcpkg", + "CmdBuildExample1": "vcpkg build ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\путь\\к\\каталогу\\с\\vcpkg.json", + "CmdBuildExternalSynopsis": "Выполняет сборку порта из пути", + "CmdBuildSynopsis": "Собирает порт", + "CmdCacheExample1": "vcpkg cache ", + "CmdCacheSynopsis": "Список спецификаций пакетов", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "Проверяет, поддерживается ли порт, без его сборки.", + "CmdCiCleanSynopsis": "Очищает все файлы для подготовки к запуску CI.", + "CmdCiSynopsis": "Пытается собрать все порты для CI-тестирования.", + "CmdCiVerifyVersionsSynopsis": "Проверяет целостность базы данных версий", "CmdContactOptSurvey": "Запуск браузера по умолчанию для текущего опроса VCPKG", - "CmdDependInfoOptDGML": "Создает график на основе dgml", - "CmdDependInfoOptDepth": "Показывать глубину рекурсии в выходных данных", - "CmdDependInfoOptDot": "Создает график на основе точки", - "CmdDependInfoOptMaxRecurse": "Установите максимальную глубину рекурсии, значение -1 указывает на отсутствие ограничений", - "CmdDependInfoOptSort": "Установить порядок сортировки для списка зависимостей, допустимые значения: лексикографические, топологические (по умолчанию), x-tree, обратные", - "CmdEditOptAll": "Откройте редактор в порте, а также в подпапке buildtree для конкретного порта.", - "CmdEditOptBuildTrees": "Открыть редактор в подпапке дерева сборки для конкретного порта.", - "CmdEnvOptions": "Добавить установленный {path} в {env_var}", - "CmdExportOpt7Zip": "Экспорт в файл 7zip (.7z)", - "CmdExportOptChocolatey": "Экспорт в пакет Chocolatey (экспериментальная функция)", - "CmdExportOptDebug": "Включить отладку prefab", - "CmdExportOptDryRun": "Не экспортировать фактически.", - "CmdExportOptIFW": "Экспорт в установщик на основе IFW", - "CmdExportOptInstalled": "Экспорт всех установленных пакетов", - "CmdExportOptMaven": "Включить Maven", - "CmdExportOptNuget": "Экспорт пакета NuGet", - "CmdExportOptPrefab": "Экспорт в формат Prefab", - "CmdExportOptRaw": "Экспорт в несжатый каталог", - "CmdExportOptZip": "Экспорт в ZIP-файл", - "CmdExportSettingChocolateyMaint": "Указать программу обслуживания для экспортированного пакета Chocolatey (экспериментальная функция)", - "CmdExportSettingChocolateyVersion": "Укажите суффикс версии для добавления к экспортированному пакету Chocolatey (экспериментальная функция).", - "CmdExportSettingConfigFile": "Указать путь к временному файлу для конфигурации установщика", - "CmdExportSettingInstallerPath": "Указать путь к файлу экспортированного установщика", - "CmdExportSettingNugetDesc": "Укажите описание для экспортированного пакета NuGet.", - "CmdExportSettingNugetID": "Указать идентификатор для экспортированного пакета NuGet (переопределяет параметр --output).", - "CmdExportSettingNugetVersion": "Указать версию экспортированного пакета NuGet.", - "CmdExportSettingOutput": "Указать выходное имя (используется для создания имени файла)", - "CmdExportSettingOutputDir": "Указать выходной каталог для производства артефактов", - "CmdExportSettingPkgDir": "Указать временный путь к каталогу для переупакованных пакетов", + "CmdCreateExample1": "vcpkg create ", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create ", + "CmdDeactivateSynopsis": "Удаляет все активации артефактов из текущей оболочки", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "Указаны конфликтующие форматы. Допускается только один из следующих: --format, --dgml или --dot.", + "CmdDependInfoFormatHelp": "Выбирает формат вывода: \"list\", \"tree\", \"mermaid\", \"dot\" или \"dgml\"", + "CmdDependInfoFormatInvalid": "--format={value} является нераспознанным форматом. --format должен иметь одно из следующих значений: \"list\", \"tree\", \"mermaid\", \"dot\" или \"dgml\".", + "CmdDependInfoOptDepth": "Показывает глубину рекурсии в выходных данных \"list\"", + "CmdDependInfoOptMaxRecurse": "Задает максимальную глубину рекурсии. Значение по умолчанию — \"Без ограничений\"", + "CmdDependInfoOptSort": "Выбирает одно из следующих значений для порядка сортировки формата \"list\": \"lexicographical\" (лексикографический), \"topological\" (топологический) (по умолчанию), \"reverse\" (обратный)", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth можно использовать только с форматами \"list\" и \"tree\".", + "CmdDependInfoXtreeTree": "--sort=x-tree не может использоваться с форматами, отличными от \"tree\"", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Скачивает файл", + "CmdEditExample1": "vcpkg edit ", + "CmdEditOptAll": "Открывает редактор в порте, а также в подпапке дерева сборки для конкретного порта", + "CmdEditOptBuildTrees": "Открывает редактор во вложенной папке buildtree для конкретного порта.", + "CmdEnvOptions": "Добавляет установленный {path} в {env_var}", + "CmdExportEmptyPlan": "Отказ от создания экспорта нулевых пакетов. Установите пакеты перед экспортом.", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", + "CmdExportOpt7Zip": "Экспортирует в файл 7zip (.7z)", + "CmdExportOptChocolatey": "Экспортирует в пакет Chocolatey (экспериментальная функция)", + "CmdExportOptDebug": "Включает отладку prefab", + "CmdExportOptDryRun": "Фактически не выполняет экспорт", + "CmdExportOptIFW": "Экспортирует в установщик на основе IFW", + "CmdExportOptInstalled": "Экспортирует все установленные пакеты", + "CmdExportOptMaven": "Включает Maven", + "CmdExportOptNuget": "Экспортирует пакет NuGet", + "CmdExportOptPrefab": "Экспортирует в формат Prefab", + "CmdExportOptRaw": "Экспортирует в несжатый каталог", + "CmdExportOptZip": "Экспортирует в ZIP-файл", + "CmdExportSettingChocolateyMaint": "Программа обслуживания для экспортированного пакета Chocolatey (экспериментальная функция)", + "CmdExportSettingChocolateyVersion": "Суффикс версии для добавления к экспортированному пакету Chocolatey (экспериментальная функция)", + "CmdExportSettingConfigFile": "Путь к временному файлу конфигурации установщика", + "CmdExportSettingInstallerPath": "Путь к файлу экспортированного установщика", + "CmdExportSettingNugetDesc": "Описание для экспортированного пакета NuGet", + "CmdExportSettingNugetID": "Идентификатор для экспортированного пакета NuGet (переопределяет параметр --output)", + "CmdExportSettingNugetVersion": "Версия экспортированного пакета NuGet", + "CmdExportSettingOutput": "Выходное имя (используется для создания имени файла)", + "CmdExportSettingOutputDir": "Выходной каталог для производства артефактов", + "CmdExportSettingPkgDir": "Путь к временному каталогу для переупакованных пакетов.", "CmdExportSettingPrefabArtifactID": "Идентификатор артефакта — это имя проекта в соответствии со спецификациями Maven", "CmdExportSettingPrefabGroupID": "GroupId однозначно идентифицирует проект в соответствии со спецификациями Maven", "CmdExportSettingPrefabVersion": "Версия — это имя проекта в соответствии со спецификациями Maven", - "CmdExportSettingRepoDir": "Указать путь к каталогу для экспортированного репозитория.", - "CmdExportSettingRepoURL": "Указать URL-адрес удаленного репозитория для веб-установщика.", - "CmdExportSettingSDKMinVersion": "Минимальная поддерживаемая версия Android SDK", + "CmdExportSettingRepoDir": "Путь к каталогу для экспортированного репозитория", + "CmdExportSettingRepoURL": "URL-адрес удаленного репозитория для веб-установщика.", + "CmdExportSettingSDKMinVersion": "Минимальная поддерживаемая версия SDK для Android", "CmdExportSettingSDKTargetVersion": "Версия целевого SDK для Android", - "CmdFetchOptXStderrStatus": "Направлять сообщения о состоянии и скачивании на stderr, а не на stdout. (Ошибки и сбои по-прежнему отправляются на stdout)", - "CmdFormatManifestOptAll": "Форматирование файлов манифеста всех портов.", - "CmdFormatManifestOptConvertControl": "Преобразование файлов CONTROL в файлы манифеста.", - "CmdGenerateMessageMapOptNoOutputComments": "При создании карты сообщения исключить комментарии (полезно для создания файла локализации на английском языке)", - "CmdInfoOptInstalled": "(экспериментально) Отчет об установленных пакетах вместо доступных", - "CmdInfoOptTransitive": "(экспериментальная) Также сообщать о зависимостях установленных пакетов", - "CmdNewOptApplication": "Создать манифест приложения (не требует имени или версии).", - "CmdNewOptSingleFile": "Вставить vcpkg-configuration.json в vcpkg.json.", - "CmdNewOptVersionDate": "Интерпретировать --version как дату ISO 8601. (ДД-ММ-ГГГГ)", - "CmdNewOptVersionRelaxed": "Интерпретировать --version как упрощенно-числовую версию. (Неотрицательные числа разделены точками)", - "CmdNewOptVersionString": "Интерпретировать --version как строку без поведения упорядочения.", - "CmdNewSettingName": "Имя для нового манифеста.", - "CmdNewSettingVersion": "Версия нового манифеста.", - "CmdRegenerateOptDryRun": "фактически не выполняет действие, отображает только то, что было бы выполнено", - "CmdRegenerateOptForce": "выполняется (потенциально опасное) действие без подтверждения", - "CmdRegenerateOptNormalize": "применить любые нерекомендуемые исправления", - "CmdRemoveOptDryRun": "Распечатать удаляемые пакеты, но не удалять их", - "CmdRemoveOptOutdated": "Выбрать все пакеты с несоответствующими портам версиями", - "CmdRemoveOptRecurse": "Разрешить удаление пакетов, не указанных явно в командной строке", - "CmdSetInstalledOptDryRun": "Не создавать сборку и не устанавливать", - "CmdSetInstalledOptNoUsage": "Не печатать сведения об использовании CMake после установки.", - "CmdSetInstalledOptWritePkgConfig": "Записывает файл в формате NuGet packages.config для использования с внешним двоичным кэшированием.\nСмотрите \"vcpkg help binarycaching\" для получения дополнительных сведений.", + "CmdExportSynopsis": "Создает изолированное развертывание установленных портов", + "CmdFetchOptXStderrStatus": "Печатает сообщения о состоянии и скачивании в stderr, а не в stdout (ошибки и сбои по-прежнему отправляются в stdout)", + "CmdFetchSynopsis": "Извлекает содержимое из системы или Интернета", + "CmdFindExample1": "vcpkg find port ", + "CmdFindExample2": "vcpkg find artifact ", + "CmdFindSynopsis": "Выполняет поиск порта или артефакта, который может быть установлен или активирован", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "Форматирует файлы манифеста всех портов", + "CmdFormatManifestOptConvertControl": "Преобразует файлы CONTROL в файлы манифеста", + "CmdFormatManifestSynopsis": "Улучшает vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props <путь>", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "Создает файлы msbuild .props, как если бы они активировали зависимости артефакта манифеста, без их получения.", + "CmdGenerateMessageMapOptNoOutputComments": "Исключает комментарии при создании карты сообщения (удобно для создания файла локализации на английском языке)", + "CmdHashExample1": "vcpkg hash ", + "CmdHashExample2": "vcpkg hash SHA256", + "CmdHashSynopsis": "Получает SHA256 или SHA512 файла", + "CmdHelpCommandSynopsis": "Отображает подробную справку для ", + "CmdHelpCommands": "help <команда>", + "CmdHelpCommandsSynopsis": "Отображает полный список команд, включая редкие, не указанные здесь.", + "CmdHelpTopic": "help ", + "CmdInfoOptInstalled": "Сообщает о установленных пакетах, а не о доступных (экспериментальная функция)", + "CmdInfoOptTransitive": "Также сообщает о зависимостях установленных пакетов (экспериментальная функция)", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Создает пустой реестр git.", + "CmdInstallExample1": "vcpkg install ...", + "CmdIntegrateSynopsis": "Интегрирует vcpkg с компьютерами, проектами или оболочками", + "CmdListExample2": "vcpkg list ", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "Создает манифест приложения (не требует имени или версии)", + "CmdNewOptSingleFile": "Встраивает vcpkg-configuration.json в vcpkg.json.", + "CmdNewOptVersionDate": "Интерпретирует --version как дату ISO 8601. (ДД-ММ-ГГГГ)", + "CmdNewOptVersionRelaxed": "Интерпретирует --version как упрощенно-числовую версию (неотрицательные числа разделены точками)", + "CmdNewOptVersionString": "Интерпретирует --version как строку без поведения упорядочения", + "CmdNewSettingName": "Имя для нового манифеста", + "CmdNewSettingVersion": "Версия нового манифеста", + "CmdNewSynposis": "Создает новый манифест", + "CmdOwnsExample1": "vcpkg owns <шаблон>", + "CmdPackageInfoExample1": "vcpkg x-package-info <имя пакета>...", + "CmdPortsdiffExample1": "vcpkg portsdiff <имя ветви>", + "CmdPortsdiffExample2": "vcpkg portsdiff <из> <в>", + "CmdPortsdiffSynopsis": "Разностные изменения в версиях портов между фиксациями", + "CmdRegenerateOptDryRun": "Фактически не выполняет действие, отображает только то, что было бы выполнено", + "CmdRegenerateOptForce": "Выполняет (потенциально опасное) действие без подтверждения", + "CmdRegenerateOptNormalize": "Применяет все исправления нерекомендуемых элементов", + "CmdRemoveExample1": "vcpkg remove <имя пакета>...", + "CmdRemoveOptDryRun": "Печатает удаляемые пакеты, но не удаляет их", + "CmdRemoveOptOutdated": "Удаляет все пакеты с версиями, не соответствующими встроенному реестру", + "CmdRemoveOptRecurse": "Позволяет удалять зависимые пакеты, не указанные явным образом", + "CmdSearchExample1": "vcpkg search <шаблон>", + "CmdSetInstalledExample1": "vcpkg x-set-installed <имя пакета> <имя пакета>...", + "CmdSetInstalledOptDryRun": "Фактически не выполняет сборку и установку", + "CmdSetInstalledOptNoUsage": "Не печатает сведения об использовании CMake после установки", + "CmdSetInstalledOptWritePkgConfig": "Записывает файл в формате NuGet packages.config для использования с внешним двоичным кэшированием. Дополнительные сведения см. в \"vcpkg help binarcaching\"", + "CmdSetInstalledSynopsis": "Устанавливает, обновляет или удаляет пакеты, чтобы установленные пакеты совпадали с указанными", "CmdSettingCopiedFilesLog": "Путь к создаваемому журналу скопированных файлов", "CmdSettingInstalledDir": "Путь к установленному дереву для использования", "CmdSettingTLogFile": "Путь к создаваемому TLOG-файлу", "CmdSettingTargetBin": "Путь к двоичному файлу для анализа", - "CmdUpdateBaselineOptDryRun": "Распечатать план без исполнения", - "CmdUpdateBaselineOptInitial": "добавить \"builtin-baseline\" в vcpkg.json, который его еще не содержит", - "CmdUpgradeOptAllowUnsupported": "Вместо ошибки на неподдерживаемом порту продолжить с предупреждением.", + "CmdUpdateBaselineOptDryRun": "Распечатывает план без выполнения", + "CmdUpdateBaselineOptInitial": "Добавляет \"builtin-baseline\" в vcpkg.json, который его еще не содержит", + "CmdUpdateBaselineSynopsis": "Обновляет базовые показатели реестров Git в манифесте для фиксации HEAD реестров", + "CmdUpdateRegistryAll": "Обновляет все известные реестры артефактов", + "CmdUpdateRegistryAllExcludesTargets": "Обновить реестр --all нельзя использовать со списком реестров артефактов", + "CmdUpdateRegistryAllOrTargets": "Для обновления реестра требуется список имен реестра артефактов или URiIs, или --all.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry <имя реестра артефактов>", + "CmdUpdateRegistrySynopsis": "Повторно скачивает реестр артефактов", "CmdUpgradeOptNoDryRun": "Фактическое обновление", "CmdUpgradeOptNoKeepGoing": "Остановить установку пакетов при сбое", + "CmdUseExample1": "vcpkg use <имя артефакта>", + "CmdUseSynopsis": "Активировать один артефакт в этой оболочке", + "CmdVSInstancesSynopsis": "Перечисляет обнаруженные экземпляры Visual Studio", "CmdXDownloadOptHeader": "Дополнительный заголовок для использования при извлечении из URL-адресов", "CmdXDownloadOptSha": "Хэш загружаемого файла", - "CmdXDownloadOptSkipSha": "Не проверять SHA512 загруженного файла", - "CmdXDownloadOptStore": "Указывает, что файл следует сохранить, а не извлечь", + "CmdXDownloadOptSkipSha": "Пропускает проверку SHA512 загруженного файла", + "CmdXDownloadOptStore": "Сохраняет файл вместо его извлечения", "CmdXDownloadOptUrl": "URL-адрес для скачивания и хранения, если он отсутствует в кэше", + "CmdZApplocalSynopsis": "Копирует зависимости двоичного файла из установленного дерева в расположение этого двоичного файла для локального развертывания приложения", + "CmdZExtractExample1": "vcpkg z-extract <путь к архиву> <выходной каталог>", + "CmdZExtractExample2": "vcpkg z-extract источник.zip исходный_каталог --strip 2", + "CmdZExtractOptStrip": "Количество начальных каталогов, которые нужно удалить из всех путей", + "CommandEnvExample2": "vcpkg env \"ninja -C <путь>\" --triplet x64-windows", "CommandFailed": "команда:\n{command_line}\nсбой со следующими результатами:", - "Commands": "Команды:", - "CommunityTriplets": "Триплеты сообщества VCPKG:", + "CommunityTriplets": "Триплеты сообщества:", "ComparingUtf8Decoders": "Сравнение Utf8Decoders с разным происхождением — это всегда ошибка", "CompressFolderFailed": "Сбой сжатия папки \"{path}\":", "ComputingInstallPlan": "Вычисление плана установки...", "ConfigurationErrorRegistriesWithoutBaseline": "Конфигурация, определенная в {path}, недопустима..\n\nПри использовании реестров необходимо, чтобы для стандартного реестра были настроены базовые показатели или чтобы стандартному реестру было присвоено значение NULL.\n\nДополнительные сведения: {url}.", "ConfigurationNestedDemands": "[\"{json_field}\"] содержит вложенный объект \"demands\" (вложенный объект \"demands\" не оказывает влияния)", "ConflictingFiles": "Следующие файлы уже установлены в {path} и конфликтуют с {spec}", + "ConsideredVersions": "Следующие исполняемые файлы были рассмотрены, но отклонены из-за требования версии {version}:", "ConstraintViolation": "Обнаружено нарушение ограничения:", "ContinueCodeUnitInStart": "найдена единица кода продолжения в начальной позиции", "ControlAndManifestFilesPresent": "Файл манифеста и файл CONTROL существуют в каталоге порта: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "База данных повреждена.", "CorruptedInstallTree": "Дерево vcpkg \"installed\" повреждено.", "CouldNotDeduceNugetIdAndVersion": "Не удалось определить идентификатор nuget и версию по имени файла: {path}", - "CouldNotFindBaseline": "Не удалось найти явно указанный базовый план \"{commit_sha}\" в базовом файле {path}", - "CouldNotFindBaselineForRepo": "Не удалось найти базовый план \"{commit_sha}\" для репозитория {package_name}", - "CouldNotFindBaselineInCommit": "Не удалось найти базовый план в фиксации\"{commit_sha}\" из репозитория {package_name}:", + "CouldNotFindBaselineInCommit": "Не удалось найти базовый показатель в ссылке {url} в {commit_sha} для {package_name}.", "CouldNotFindGitTreeAtCommit": "не удалось найти дерево Git для \"versions\" в репозитории {package_name} фиксации {commit_sha}", "CouldNotFindToolVersion": "Не удалось найти в {path}", "CouldNotFindVersionDatabaseFile": "Не удалось найти файл базы данных версий: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "Переменная среды VCPKG_DEFAULT_BINARY_CACHE должна быть каталогом (было: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "Значение переменной среды VCPKG_DEFAULT_BINARY_CACHE должно быть абсолютным (было: {path})", "DefaultBinaryCacheRequiresDirectory": "Переменная среды VCPKG_DEFAULT_BINARY_CACHE должна быть каталогом (было: {path})", - "DefaultBrowserLaunched": "Браузер по умолчанию запущен на {url}.", + "DefaultFeatureCore": "компонент \"core\" отключает компоненты по умолчанию и поэтому не может находиться в списке компонентов по умолчанию", + "DefaultFeatureDefault": "компонент \"default\" ссылается на список компонентов по умолчанию и поэтому не может находиться в списке компонентов по умолчанию", + "DefaultFeatureIdentifier": "имена компонентов по умолчанию должны быть идентификаторами", "DefaultFlag": "По умолчанию включено --{option}.", "DefaultRegistryIsArtifact": "Реестр, используемый по умолчанию, не может быть реестром артефактов.", - "DefaultTriplet": "Начиная с выпуска за сентябрь 2023 г. триплет по умолчанию для библиотек vcpkg изменится с x86-windows на триплет обнаруженного узла ({triplet}). Чтобы разрешить это сообщение, добавьте параметр --triplet x86-windows, чтобы сохранить то же поведение.", + "DefaultTripletChanged": "В выпуске за сентябрь 2023 г. триплет по умолчанию для библиотек vcpkg изменен с x86-windows на триплет обнаруженного узла ({triplet}). Добавьте параметр --triplet x86-windows для использования старого поведения. Добавьте параметр --triplet {triplet}, чтобы скрыть это сообщение.", "DeleteVcpkgConfigFromManifest": "-- Или удалите \"vcpkg-configuration\" из {path} файла манифеста.", + "DependencyFeatureCore": "компонент \"core\" не может находиться в списке компонентов зависимости. Чтобы отключить компоненты по умолчанию, добавьте \"default-features\": false.", + "DependencyFeatureDefault": "компонент \"default\" не может находиться в списке компонентов зависимости. Чтобы включить компоненты по умолчанию, добавьте \"default-features\": true.", + "DependencyGraphCalculation": "Отправка графа зависимостей включена.", + "DependencyGraphFailure": "Сбой отправки графа зависимостей.", + "DependencyGraphSuccess": "Граф зависимостей успешно отправлен.", "DeprecatedPrefabDebugOption": "Параметр --prefab-debug упразднен.", "DetectCompilerHash": "Обнаружение хэша компилятора для триплета {triplet}...", "DocumentedFieldsSuggestUpdate": "Если это задокументированные поля, которые следует распознать, попробуйте обновить средство VCPKG.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "Файл не содержит ожидаемого хэша:\nURL-адрес: {url}\nФайл: {path}\nОжидаемый хэш: {expected}\nФактический хэш: {actual}", "DownloadFailedRetrying": "Сбой скачивания — повторная попытка через {value} мс", "DownloadFailedStatusCode": "{url}: сбой: код состояния {value}", - "DownloadRootsDir": "Укажите корневой каталог загрузки.\n(по умолчанию: {env_var})", + "DownloadRootsDir": "Скачивает каталог (по умолчанию: {env_var})", "DownloadWinHttpError": "{url}: сбой {system_api} с кодом завершения {exit_code}", "DownloadedSources": "Скачанные источники для {spec}", "DownloadingPortableToolVersionX": "Не найдена подходящая версия {tool_name} (требуется v{version}) Скачивание переносимой версии {tool_name} {version}...", "DownloadingTool": "Скачивание {tool_name}...\n{url}->{path}", "DownloadingUrl": "Выполняется скачивание {url}", - "DownloadingVcpkgCeBundle": "Загрузка пакета артефактов vcpkg {version}...", - "DownloadingVcpkgCeBundleLatest": "Загрузка последней версии пакета артефактов vcpkg...", "DownloadingVcpkgStandaloneBundle": "Скачивание изолированного пакета {version}.", "DownloadingVcpkgStandaloneBundleLatest": "Скачивание новейшего изолированного пакета.", "DuplicatePackagePattern": "Пакет \"{package_name}\" дублируется.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "при обнаружении сведений о компиляторе:\nсодержимое файла журнала в \"{path}\":", "ErrorIndividualPackagesUnsupported": "В режиме манифеста \"установка vcpkg\" не поддерживает отдельные аргументы пакета. \nЧтобы установить дополнительные пакеты, отредактируете vcpkg.json и запустите \"vcpkg install\" без аргументов пакета.", "ErrorInvalidClassicModeOption": "Параметр --{option} не поддерживается в классическом режиме, и манифест не найден.", + "ErrorInvalidExtractOption": "В качестве параметра --{option} должно быть установлено неотрицательное целое число или значение \"AUTO\".", "ErrorInvalidManifestModeOption": "Параметр --{option} не поддерживается в режиме манифеста.", "ErrorMessage": "ошибка: ", "ErrorMessageMustUsePrintError": "Сообщение с именем {value} начинается с ошибки: вместо этого его необходимо изменить на prepend ErrorMessage в коде.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "При анализе {path} возникли ошибки.", "ErrorWhileWriting": "Произошла ошибка при записи {path}.", "ErrorsFound": "Обнаружены следующие ошибки:", - "Example": "пример:", + "ExamplesHeader": "Примеры:", "ExceededRecursionDepth": "Превышена глубина рекурсии.", "ExcludedPackage": "Исключено: {spec}", "ExcludedPackages": "Исключены следующие пакеты:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Экспорт средства обслуживания...", "ExportingPackage": "Экспорт {package_name}...", "ExtendedDocumentationAtUrl": "Расширенная документация доступна по адресу '{url}'.", + "ExtractHelp": "Извлекает архив.", "ExtractingTool": "Извлечение {tool_name}...", "FailedPostBuildChecks": "Обнаружено столько проблем при проверке после сборки: {count}. Чтобы отправить эти порты в проверенные каталоги, сначала исправьте файл порта: {path}", "FailedToAcquireMutant": "не удалось получить {path} мутанта", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "Не удалось определить текущую фиксацию:", "FailedToDownloadFromMirrorSet": "Не удалось скачать из зеркального набора", "FailedToExtract": "Сбой извлечения \" {path}\":", - "FailedToFetchError": "{error_msg}\nНе удалось получить {package_name}:", - "FailedToFindBaseline": "Не удалось найти baseline.json", + "FailedToFetchRepo": "Не удалось получить {url}.", "FailedToFindPortFeature": "{package_name} не содержит функции с именем {feature}.", "FailedToFormatMissingFile": "Нет файлов для форматирования.\nПередайте либо --all, либо явные файлы для форматирования или преобразования.", "FailedToLoadInstalledManifest": "Не удалось загрузить файл управления или манифеста для {package_name} из-за следующей ошибки. Удалите {package_name} и повторите попытку.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "Не удалось заблокировать файловую систему в {path}", "FailedToWriteManifest": "Не удалось записать файл манифеста {path}", "FailedVendorAuthentication": "Одному или нескольким поставщикам учетных данных {vendor} не удалось пройти аутентификацию. См. «{url}» для получения дополнительной информации о том, как предоставить учетные данные.", - "FeedbackAppreciated": "Спасибо за отзыв!", "FetchingBaselineInfo": "Извлечение базовой информации из {package_name}...", "FetchingRegistryInfo": "Получение сведений реестра из {url} ({value})...", "FieldKindDidNotHaveExpectedValue": "неожиданное значение \"kind\": (ожидалось одно из следующих значений: {expected}; найдено {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "Абсолютные пути найдены в следующих файлах:", "FilesExported": "Файлы экспортированы в папку: {path}", "FindHelp": "Поиск указанного артефакта или порта. Без параметров после \"artifact\" или \"port\", отображается все.", + "FindVersionArtifactsOnly": "--version нельзя использовать с поиском vcpkg или портом поиска vcpkg", "FishCompletion": "Завершение vcpkg fish уже полностью добавлено в \"{path}\".", "FloatingPointConstTooBig": "Слишком большая константа с плавающей запятой: {count}", "FollowingPackagesMissingControl": "Следующие пакеты не содержат допустимый CONTROL или vcpkg.json.", "FollowingPackagesNotInstalled": "Следующие пакеты не установлены.", "FollowingPackagesUpgraded": "Следующие пакеты обновлены.", + "ForMoreHelp": "Для получения дополнительной справки", "ForceSystemBinariesOnWeirdPlatforms": "Переменная среды VCPKG_FORCE_SYSTEM_BINARIES должна быть задана на платформах ARM, s390x, ppc64le и RISC.", "FormattedParseMessageExpression": "в выражении: {value}", "GHAParametersMissing": "Для двоичного источника GHA требуется настройка переменных среды ACTIONS_RUNTIME_TOKEN и ACTIONS_CACHE_URL. Дополнительные сведения: {url}.", @@ -470,7 +590,7 @@ "GitCommandFailed": "не удалось выполнить: {command_line}", "GitFailedToFetch": "не удалось получить ссылку {value} из репозитория {url}", "GitFailedToInitializeLocalRepository": "не удалось инициализировать локальный репозиторий {path}", - "GitRegistryMustHaveBaseline": "Запись реестра Git для \"{package_name}\" должна иметь поле \"baseline\", которое является допустимым SHA фиксации Git (40 шестнадцатеричных символов).\nТекущим HEAD этого репозитория является \"{value}\".", + "GitRegistryMustHaveBaseline": "Поле реестра Git \"{url}\" должно содержать поле \"baseline\", которое является допустимым SHA фиксации Git (40 шестнадцатеричных символов).\nЧтобы использовать последние версии, задайте базовый показатель для этого репозитория HEAD, \"{commit_sha}\".", "GitStatusOutputExpectedFileName": "требуется имя файла", "GitStatusOutputExpectedNewLine": "ожидалась новая строка", "GitStatusOutputExpectedRenameOrNewline": "ожидался переименованный файл или новые строки", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "Git создал непредвиденные выходные данные при выполнении {command_line}", "GraphCycleDetected": "Обнаружен цикл в графе в {package_name}:", "HashFileFailureToRead": "сбой при чтении файла \"{path}\" для хеширования: ", + "HashPortManyFiles": "{package_name} содержит несколько ({count}) файлов. Хэширование этого содержимого может занять много времени при определении хэша ABI для двоичного кэширования. Рассмотрите возможность уменьшения количества файлов. Распространенные причины: случайное извлечение исходных файлов или файлов сборки в каталог порта.", "HeaderOnlyUsage": "{package_name} является заголовочным и может использоваться из CMake через:", "HelpAssetCaching": "**Экспериментальная функция: она может быть изменена или удалена в любое время**\n\nvcpkg может использовать зеркала для кэширования скачанных ресурсов, что гарантирует продолжение операции, даже если исходный источник изменяется или исчезает.\n\nКэширование ресурсов можно настроить, задав для переменной среды X_VCPKG_ASSET_SOURCES список источников с разделителями-точками с запятой или передав последовательность параметров командной строки --x-asset-sources=. Источники командной строки интерпретируются после источников среды. Запятые, точки с запятой и обратные апострофы можно экранировать с помощью обратного апострофа (`).\n\nНеобязательный параметр для определенных строк управляет способом получения к ним доступа. Для него можно указать значения \"read\", \"write\" или \"readwrite\". По умолчанию используется \"read\".\n\nДопустимые источники:", "HelpAssetCachingAzUrl": "Добавляет источник Хранилища BLOB-объектов Azure, используя при необходимости проверку подписанных URL-адресов. URL-адрес должен содержать путь к контейнеру и заканчиваться конечным символом \"/\". , если определен, должен иметь префикс \"?\". Серверы, отличные от Azure, также будут работать, если отвечают на запросы GET и PUT в формате \"\".", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "Указывает время ожидания NuGet для сетевых операций NuGet. Эквивалент параметра \"-Timeout\" в NuGet CLI.", "HelpBuiltinBase": "Базовый план ссылается на фиксацию в репозитории vcpkg, устанавливающую минимальную версию для каждой зависимости в графе. Например, если никакие другие ограничения не указаны (напрямую или транзитивно), версия будет разрешаться в базовый план манифеста верхнего уровня. Базовые линии транзитивных зависимостей игнорируются.", "HelpCachingClear": "Удаляет все предыдущие источники, включая значения по умолчанию.", - "HelpContactCommand": "Отображение контактных данных для отправки отзыва.", - "HelpCreateCommand": "Создайте новый порт.", - "HelpDependInfoCommand": "Отобразить список зависимостей для портов.", - "HelpEditCommand": "Откройте порт для редактирования (используйте переменную среды \"{env_var}\", чтобы установить программу-редактор, по умолчанию 'code').", - "HelpEnvCommand": "Создает среду чистой оболочки для разработки или компиляции.", - "HelpExampleCommand": "Дополнительную справку (включая примеры) см. в прилагаемой папке README.md и docs.", + "HelpContactCommand": "Отображает контактные данные для отправки отзыва", + "HelpCreateCommand": "Создает новый порт", + "HelpDependInfoCommand": "Отображает список зависимостей для портов", + "HelpEditCommand": "Изменяет порт, при необходимости с {env_var}, по умолчанию — \"code\"", + "HelpEnvCommand": "Создает среду чистой оболочки для разработки или компиляции", + "HelpExampleCommand": "Дополнительные сведения (включая примеры) см. на странице https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Пример манифеста:", "HelpExportCommand": "Экспортирует пакет.", - "HelpFormatManifestCommand": "Форматирует все файлы vcpkg.json. Запустите это перед фиксацией в vcpkg.", "HelpHashCommand": "Хешировать файл по определенному алгоритму, по умолчанию SHA512.", - "HelpInitializeRegistryCommand": "Инициализирует реестр в каталоге .", - "HelpInstallCommand": "Установка пакета", - "HelpListCommand": "Список установленных пакетов.", + "HelpInstallCommand": "Устанавливает пакет", + "HelpListCommand": "Выводит список установленных пакетов", "HelpManifestConstraints": "Манифесты могут накладывать три типа ограничений на используемые версии.", "HelpMinVersion": "Vcpkg выберет минимальную найденную версию, соответствующую всем применимым ограничениям, включая версию из базовой линии, указанной на верхнем уровне, а также любые ограничения \"version>=\" в графе.", "HelpOverrides": "При использовании в качестве манифеста верхнего уровня (например, при запуске \"vcpkg install\" в каталоге) переопределения позволяют манифесту сократить разрешение зависимостей и точно указать используемую версию. Их можно использовать для обработки конфликтов версий, например, с зависимостями \"version-string\". Они не будут рассматриваться, когда от них зависит транзитивно.", - "HelpOwnsCommand": "Поиск файлов в установленных пакетах.", + "HelpOwnsCommand": "Выполняет поиск владельца файла в установленных пакетах", "HelpPackagePublisher": "Кроме того, издатели пакетов могут использовать ограничения \"version>=\" для обеспечения использования потребителями хотя бы некоторой минимальной версии данной зависимости. Например, если библиотеке требуется API, добавленный в boost-asio в версии 1.70, ограничение \"version>=\" гарантирует, что переходные пользователи будут использовать достаточную версию даже при переопределении отдельных версий или перекрестных ссылках реестра.", - "HelpPortVersionScheme": "Каждая версия дополнительно содержит \"версию порта\", представляющую собой неотрицательное целое число. При отображении в виде текста версия порта (если она не равна нулю) добавляется как суффикс к тексту основной версии, разделенному решеткой (#). Порт-версии сортируются лексографически после текста основной версии, например:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Удалить пакет.", - "HelpRemoveOutdatedCommand": "Удалите все устаревшие пакеты.", - "HelpResponseFileCommand": "Укажите файл отклика для предоставления дополнительных параметров.", - "HelpSearchCommand": "Поиск пакетов, доступных для сборки.", - "HelpTextOptFullDesc": "Не обрезать длинный текст.", - "HelpTopicCommand": "Отображение справки по определенной теме.", - "HelpTopicsCommand": "Показать список разделов справки.", - "HelpTxtOptAllowUnsupportedPort": "Вместо ошибки на неподдерживаемом порту продолжить с предупреждением.", - "HelpTxtOptCleanAfterBuild": "Очистка деревьев сборки, пакетов и загрузок после сборки каждого пакета.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Очистка деревьев сборки после сборки каждого пакета", - "HelpTxtOptCleanDownloadsAfterBuild": "Очистка загрузки после сборки каждого пакета.", - "HelpTxtOptCleanPkgAfterBuild": "Очистка пакетов после создания каждого пакета.", - "HelpTxtOptDryRun": "Не создавать сборку фактически и не устанавливать.", - "HelpTxtOptEditable": "Отключить повторное извлечение исходного кода и кэширование двоичных файлов для библиотек в командной строке (классический режим)", - "HelpTxtOptEnforcePortChecks": "Ошибка установки, если порт обнаружил проблемы или пытается использовать устаревшую функцию.", - "HelpTxtOptKeepGoing": "Продолжить установку пакетов в случае сбоя.", - "HelpTxtOptManifestFeature": "Дополнительная функция из манифеста верхнего уровня для установки (режим манифеста).", - "HelpTxtOptManifestNoDefault": "Не устанавливайте функции по умолчанию из манифеста верхнего уровня (режим манифеста).", - "HelpTxtOptNoDownloads": "Не скачивать новые источники.", - "HelpTxtOptNoUsage": "Не распечатывайте информацию об использовании CMake после установки.", - "HelpTxtOptOnlyBinCache": "Завершать сбоем, если кэшированные двоичные файлы недоступны.", - "HelpTxtOptOnlyDownloads": "Делать все возможное, чтобы скачать источники без сборки.", - "HelpTxtOptRecurse": "Разрешить удаление пакетов в процессе установки.", - "HelpTxtOptUseAria2": "Использовать aria2 для выполнения задач загрузки.", - "HelpTxtOptUseHeadVersion": "Установите библиотеки из командной строки, используя последние исходные коды основной ветки разработки (классический режим).", - "HelpTxtOptWritePkgConfig": "Записывает файл в формате NuGet packages.config для использования с внешним двоичным кэшированием.\nСмотрите `vcpkg help binarycaching` для получения дополнительной информации.", + "HelpPortVersionScheme": "Каждая версия дополнительно содержит \"версию порта\", представляющую собой неотрицательное целое число. При отображении в виде текста версия порта (если она не равна нулю) добавляется как суффикс к тексту основной версии, разделенному решеткой (#). Версии порта сортируются лексикографически после текста основной версии, например:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", + "HelpRemoveCommand": "Удаляет пакет", + "HelpResponseFileCommand": "Содержит один аргумент на строку, развернутую в этом расположении", + "HelpSearchCommand": "Выполняет поиск пакетов, доступных для сборки", + "HelpTextOptFullDesc": "Не обрезает длинный текст", + "HelpTopicCommand": "Отображает конкретный раздел справки", + "HelpTopicsCommand": "Отображает полный список разделов справки", + "HelpTxtOptAllowUnsupportedPort": "Продолжает с предупреждением о неподдерживаемых портах вместо сбоя", + "HelpTxtOptCleanAfterBuild": "Очищает деревья сборки, пакеты и загрузки после сборки каждого пакета", + "HelpTxtOptCleanBuildTreesAfterBuild": "Очищает деревья сборки после сборки каждого пакета.", + "HelpTxtOptCleanDownloadsAfterBuild": "Очищает загрузки после сборки каждого пакета", + "HelpTxtOptCleanPkgAfterBuild": "Очищает пакеты после сборки каждого пакета", + "HelpTxtOptDryRun": "Фактически не выполняет сборку и установку", + "HelpTxtOptEditable": "Отключает повторное извлечение исходного кода и двоичное кэширование библиотек в командной строке (классический режим)", + "HelpTxtOptEnforcePortChecks": "Завершает установку сбоем, если порт обнаруживает проблемы или пытается использовать нерекомендуемую функцию.", + "HelpTxtOptKeepGoing": "Продолжить установку пакетов в случае сбоя", + "HelpTxtOptManifestFeature": "Дополнительные функции из манифеста верхнего уровня для установки (режим манифеста)", + "HelpTxtOptManifestNoDefault": "Не устанавливает функции по умолчанию из манифеста верхнего уровня (режим манифеста).", + "HelpTxtOptNoDownloads": "Не скачивает новые исходники", + "HelpTxtOptNoUsage": "Не распечатывает сведения об использовании CMake после установки", + "HelpTxtOptOnlyBinCache": "Завершает работу сбоем, если кэшированные двоичные файлы недоступны.", + "HelpTxtOptOnlyDownloads": "Делает все возможное, чтобы скачать исходники без сборки", + "HelpTxtOptRecurse": "Разрешает удалять пакеты в рамках установки.", + "HelpTxtOptUseAria2": "Использует aria2 для выполнения задач скачивания", + "HelpTxtOptUseHeadVersion": "Устанавливает библиотеки из командной строки, используя последние исходные коды (классический режим).", + "HelpTxtOptWritePkgConfig": "Записывает файл в формате NuGet packages.config для использования с внешним двоичным кэшированием. Дополнительные сведения см. в `vcpkg helpbinarcaching`.", "HelpUpdateBaseline": "Лучший способ поддержания библиотек в актуальном состоянии — обновление базового эталона. Это обеспечит обновление всех пакетов, включая транзитивные. Но если вам нужно обновить пакет независимо, вы можете использовать ограничение \"version>=\".", - "HelpUpdateCommand": "Список пакетов, которые можно обновить.", - "HelpUpgradeCommand": "Пересоберите все устаревшие пакеты.", - "HelpVersionCommand": "Отображение сведений о версии.", + "HelpUpdateCommand": "Перечисляет пакеты, которые можно обновить", + "HelpUpgradeCommand": "Перестраивает все устаревшие пакеты", + "HelpVersionCommand": "Отображает сведения о версии", "HelpVersionDateScheme": "Дата (2021-01-01.5)", "HelpVersionGreater": "В поле \"зависимости\" для каждой зависимости может быть указано минимальное ограничение. Эти минимальные ограничения будут использоваться при транзитивной зависимости от этой библиотеки. Минимальная версия порта может быть дополнительно указана с суффиксом \"#\".", "HelpVersionScheme": "Последовательность чисел, разделенных точками (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Неверная подпись файла архива", "IncorrectPESignature": "Неверная подпись PE", "IncrementedUtf8Decoder": "Добавочный Utf8Decoder в конце строки", - "InfoSetEnvVar": "Вы также можете задать переменную среды '{env_var}' в выбранном редакторе.", + "InfoSetEnvVar": "Вы также можете установить {env_var} в свой редактор.", "InitRegistryFailedNoRepo": "Не удалось создать реестр в {path}: это не корневой каталог репозитория Git.\nИспользуйте команду \"git init {command_line}\", чтобы создать репозиторий Git в этой папке.", "InstallCopiedFile": "{path_source} -> {path_destination}: готово", "InstallFailed": "сбой: {path}: {error_msg}", "InstallPackageInstruction": "Открыв проект, перейдите в Инструменты->Диспетчер пакетов NuGet->Консоль диспетчера пакетов и вставьте:\n Install-Package \"{value}\" -Source \"{path}\"", - "InstallRootDir": "(Экспериментально) Укажите корневой каталог установки.", + "InstallRootDir": "Каталог Installed (экспериментальная функция)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination}: пропущено, обновлено", "InstallWithSystemManager": "Этот инструмент можно установить с помощью системного диспетчера пакетов.", "InstallWithSystemManagerMono": "Пользователям Ubuntu 18.04 может потребоваться более новая версия Mono, доступная по адресу {url}.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Установка порта из расположения: {путь}", "InstallingMavenFile": "{path}: установка файла Maven", "InstallingPackage": "Выполняется установка {action_index}/{count} {spec}…", - "IntegrateBashHelp": "Включить завершение табуляции Bash.", - "IntegrateFishHelp": "Включить завершение табуляции fish.", - "IntegrateInstallHelpLinux": "Сделать установленные пакеты доступными для всех пользователей.", - "IntegrateInstallHelpWindows": "Сделайте установленные пакеты доступными для всех пользователей. Требуются права администратора при первом использовании.", - "IntegratePowerShellHelp": "Включить завершение табуляции PowerShell.", - "IntegrateProjectHelp": "Создайте ссылочный пакет NuGet для использования в отдельном проекте VS.", - "IntegrateRemoveHelp": "Удаление интеграции на уровне пользователя.", - "IntegrateZshHelp": "Включить завершение табуляции zsh.", - "IntegrationFailed": "Интеграция не применена.", + "IntegrateBashHelp": "Включить завершение табуляции bash. Только для систем, отличных от Windows", + "IntegrateFishHelp": "Включить завершение табуляции fish. Только для систем, отличных от Windows.", + "IntegrateInstallHelpLinux": "Делает установленные пакеты доступными на уровне пользователя.", + "IntegrateInstallHelpWindows": "Делает установленные пакеты доступными на уровне пользователя. Требуются права администратора при первом использовании", + "IntegrateNonWindowsOnly": "{command_line} используется только для систем, отличных от Windows, и не поддерживается в этой системе.", + "IntegratePowerShellHelp": "Включите заполнение табуляции Windows PowerShell. Только для Windows", + "IntegrateProjectHelp": "Создает ссылочный пакет NuGet для использования в отдельном проекте Visual Studio. Только для Windows.", + "IntegrateRemoveHelp": "Удаляет интеграцию на уровне пользователя", + "IntegrateWindowsOnly": "{command_line} используется только для Windows и не поддерживается в этой системе.", + "IntegrateZshHelp": "Включить завершение табуляции zsh. Только для систем, отличных от Windows", + "IntegrationFailedVS2015": "Интеграция не была применена для Visual Studio 2015.", "InternalCICommand": "vcpkg ci — внутренняя команда, она может измениться несовместимым образом или может быть удалена в любое время.", "InternalErrorMessage": "внутренняя ошибка: ", "InternalErrorMessageContact": "Откройте проблему на странице https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug с подробными инструкциями по ее воспроизведению.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg не поддерживает комментарии в стиле C, однако большинство объектов позволяют использовать в качестве комментариев поля с префиксом $.", "InvalidCommitId": "Недопустимый ИД фиксации: {commit_sha}", "InvalidDefaultFeatureName": "\"default\" является зарезервированным именем функции", - "InvalidDependency": "для зависимостей должны использоваться строчные буквы, цифры и дефисы, а не одно из зарезервированных имен", "InvalidFeature": "для функций должны использоваться строчные буквы, цифры и дефисы, а не одно из зарезервированных имен", "InvalidFileType": "сбой: {path} не может обработать тип файла", "InvalidFilename": "Имя файла не может содержать недопустимые символы {value}, но использовалось имя {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "Недопустимая библиотека: не удалось найти элемент компоновщика.", "InvalidLinkage": "Недопустимый тип связи {system_name}: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "недопустимое логическое выражение, непредвиденный символ", - "InvalidLogicExpressionUsePipe": "недопустимое логическое выражение, используйте '|' вместо \"или\"", + "InvalidLogicExpressionUsePipe": "недопустимое логическое выражение, используйте \"|\", а не \"или\"", "InvalidNoVersions": "Файл не содержит версий.", "InvalidOptionForRemove": "\"remove\" принимает библиотеки или \"--outdated\"", "InvalidPortVersonName": "Обнаружено недопустимое имя файла версии порта: \"{path}\".", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "значение [\"{json_field}\"] должно быть объектом", "JsonFieldNotString": "значение [\"{json_field}\"] должно быть строкой", "JsonFileMissingExtension": "файл JSON {path} должен иметь расширение .json (все строчные буквы)", - "JsonSwitch": "(Экспериментально) Запрос вывода JSON.", + "JsonSwitch": "Печатает JSON вместо обычного текста", "JsonValueNotArray": "значение json не является массивом", "JsonValueNotObject": "Значение JSON не является объектом", "JsonValueNotString": "значение json не является строкой", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Динамический выпуск (/MD)", "LinkageStaticDebug": "Статическая отладка (/MTd)", "LinkageStaticRelease": "Статический выпуск (/MT)", - "ListHelp": "Аргумент должен быть подстрокой для поиска или не должен содержать аргумент для отображения всех установленных библиотек.", + "ListHelp": "Перечисляет установленные библиотеки", "ListOfValidFieldsForControlFiles": "Список допустимых полей для файлов CONTROL (с учетом регистра):", "LoadingCommunityTriplet": "-- [СООБЩЕСТВО] Загрузка тройной конфигурации из: {путь}", "LoadingDependencyInformation": "Загрузка сведений о зависимостях для пакетов {count}...", @@ -707,8 +826,7 @@ "MsiexecFailedToExtract": "сбой msiexec при извлечении \"{path}\" с кодом запуска или выхода {exit_code} и сообщением:", "MultiArch": "Значение Multi-Arch должно быть \"то же\", но было {option}", "MultipleFeatures": "{package_name} объявляет {feature} несколько раз. Убедитесь, что функции имеют уникальные имена", - "MutuallyExclusiveOption": "--{value} нельзя использовать с --{option}.", - "NavigateToNPS": "Пожалуйста, перейдите на {url} в предпочитаемом вами браузере.", + "MutuallyExclusiveOption": "--{value} не может использоваться с --{option}.", "NewConfigurationAlreadyExists": "При создании манифеста файл vcpkg-configuration.json по адресу {path} будет перезаписан.", "NewManifestAlreadyExists": "Манифест уже присутствует в {path}.", "NewNameCannotBeEmpty": "--name не может быть пустым.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "Чтобы указать, что манифест не предназначен для использования в качестве порта, определите --name и --version для создания манифеста, предназначенного для библиотек C++, или укажите --application.", "NewVersionCannotBeEmpty": "--version не может быть пустой.", "NoArgumentsForOption": "Параметр --{option} не принимает аргумент.", - "NoCachedPackages": "Никакие пакеты не кэшируются.", "NoError": "нет ошибок", "NoInstalledPackages": "Нет установленных пакетов. Вы имели в виду \"search\"?", "NoLocalizationForMessages": "Нет локализованных сообщений для следующего: ", @@ -739,22 +856,27 @@ "OptionRequiresAValue": "параметр \"{option}\" требует значения", "OptionRequiresOption": "Для значения --{value} требуется --{option}", "OptionUsedMultipleTimes": "параметр \"{option}\" указан несколько раз", - "OptionalCommand": "необязательная команда", "Options": "Параметры", "OriginalBinParagraphHeader": "\nАбзац исходного двоичного файла", + "OtherCommandsHeader": "Другое", "OverlayPatchDir": "Путь наложения \"{path}\" должен существовать и быть каталогом.", - "OverlayTriplets": "Триплеты наложения из {path}:", + "OverlayPortsDirectoriesHelp": "Каталоги портов наложения (также: {env_var})", + "OverlayTripletDirectoriesHelp": "Каталоги триплетов наложения (также: {env_var})", + "OverlayTriplets": "Триплеты наложения из \"{path}\":", "OverwritingFile": "Файл {path} уже существует и будет перезаписан", "PECoffHeaderTooShort": "При синтаксическом анализе переносимого исполняемого файла {путь} размер заголовка COFF слишком мал для того, чтобы содержать действительный заголовок PE.", - "PEConfigCrossesSectionBoundary": "При синтаксическом анализе переносимого исполняемого файла {путь} каталог конфигурации изображения пересекает границу раздела.", - "PEImportCrossesSectionBoundary": "При разборе Portable Executable {path} таблица импорта пересекает границу раздела.", + "PEConfigCrossesSectionBoundary": "При синтаксическом анализе переносимого исполняемого файла {path} каталог конфигурации образа пересекает границу раздела.", + "PEImportCrossesSectionBoundary": "При синтаксическом анализе переносимого исполняемого файла {path} таблица импорта пересекает границу раздела.", "PEPlusTagInvalid": "При синтаксическом анализе Portable Executable {path} необязательный заголовок не был ни PE32, ни PE32+.", "PERvaNotFound": "При синтаксическом анализе Portable Executable {path} не удалось найти RVA {value:#X}.", "PESignatureMismatch": "При синтаксическом анализе Portable Executable {path} несоответствие подписи.", "PackageAlreadyRemoved": "не удается удалить {spec}: уже удалено", + "PackageDiscoveryHeader": "Обнаружение пакета", "PackageFailedtWhileExtracting": "Сбой \"{value}\" при извлечении {path}.", - "PackageInfoHelp": "Отображение подробных сведений о пакетах.", - "PackageRootDir": "(Экспериментально) Укажите корневой каталог пакетов.", + "PackageInfoHelp": "Отобразить подробные сведения о пакетах", + "PackageInstallationHeader": "Установка пакета", + "PackageManipulationHeader": "Обработка пакета", + "PackageRootDir": "Каталог Packages (экспериментальная функция)", "PackagesToInstall": "Будут собраны и установлены следующие пакеты:", "PackagesToInstallDirectly": "Следующие пакеты будут непосредственно установлены:", "PackagesToModify": "Дополнительные пакеты (*) будут изменены для завершения этой операции.", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "{value} ожидалось {expected}", "ParseControlErrorInfoWhileLoading": "при загрузке {path}:", "ParseControlErrorInfoWrongTypeFields": "Следующие поля имели неправильные типы:", - "ParseIdentifierError": "\"{value}\" не является допустимым идентификатором. Идентификаторы должны содержать строчные буквы, цифры и дефисы, но не зарезервированные символы (см. {url} для получения дополнительных сведений)", - "ParsePackageNameError": "\"{package_name}\" не является допустимым именем пакета. Имена пакетов должны содержать строчные буквы, цифры и дефисы, но не зарезервированные символы (см. {url} для получения дополнительных сведений)", - "ParsePackagePatternError": "\"{package_name}\" не является недопустимым шаблоном пакета. Шаблоны пакетов должны использовать только один подстановочный знак (*), который должен быть последним символом в шаблоне (см. {url} для получения дополнительных сведений)", + "ParseFeatureNameError": "\"{package_name}\" не является допустимым именем компонента. Имена компонентов должны содержать строчные буквы, цифры и дефисы и не должны быть зарезервированы (см. {url} для получения дополнительных сведений).", + "ParseIdentifierError": "\"{value}\" не является допустимым идентификатором. Идентификаторы должны содержать строчные буквы, цифры и дефисы и не должны быть зарезервированы (см. {url} для получения дополнительных сведений).", + "ParsePackageNameError": "\"{package_name}\" не является допустимым именем пакета. Имена пакетов должны содержать строчные буквы, цифры и дефисы и не должны быть зарезервированы (см. {url} для получения дополнительных сведений).", + "ParsePackagePatternError": "\"{package_name}\" не является допустимым шаблоном пакета. Шаблоны пакетов должны использовать только один подстановочный знак (*), который должен быть последним символом в шаблоне (см. {url} для получения дополнительных сведений).", "PathMustBeAbsolute": "Значение переменной среды X_VCPKG_REGISTRIES_CACHE не является абсолютным: {path}", "PerformingPostBuildValidation": "-- Выполнение проверки после сборки", "PortBugAllowRestrictedHeaders": "В исключительных случаях эту политику можно отключить с помощью {env_var}", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "Для проверки файлов {extension} используйте:", "PortBugInvalidCrtLinkage": "Следующие двоичные файлы должны использовать CRT {expected}.", "PortBugInvalidCrtLinkageEntry": "{path} связывается с:", + "PortBugKernel32FromXbox": "Выбранный триплет нацелен на Xbox, но следующие DLL связаны с kernel32. Эти DLL невозможно загрузить в Xbox, где отсутствует kernel32. Обычно это вызвано связыванием с kernel32.lib вместо подходящей зонтичной библиотеки, например onecore_apiset.lib или xgameplatform.lib.", "PortBugMergeLibCMakeDir": "Папку /lib/cmake следует объединить с /debug/lib/cmake и переместить в /share/{package_name}/cmake. Используйте вспомогательную функцию \"vcpkg_cmake_config_fixup()\" из порта vcpkg-cmake-config.", "PortBugMismatchedNumberOfBinaries": "Несоответствие количества двоичных файлов отладки и выпуска.", "PortBugMisplacedCMakeFiles": "Указанные ниже файлы cmake найдены за пределами /share/{spec}. Поместите файлы cmake в /share/{spec}.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "Если не удается отключить создание bin\\ и/или debug\\bin\\, используйте эту команду в файле порта, чтобы удалить их", "PortBugRemoveEmptyDirectories": "Если каталог должен быть заполнен, но он пуст, это может указывать на ошибку в файле порта.\nЕсли каталоги не требуются, но не удается отключить их создание, используйте следующие команды в файле порта, чтобы удалить их:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE пустые каталоги, оставшиеся после операций переименования)", - "PortBugRestrictedHeaderPaths": "Следующие ограниченные заголовки могут препятствовать правильной компиляции основной среды выполнения C++ и других пакетов. В исключительных случаях эту политику можно отключить с помощью {env_var}.", + "PortBugRestrictedHeaderPaths": "Следующие ограниченные заголовки могут препятствовать правильной компиляции основной среды выполнения C++ и других пакетов. В исключительных случаях эту политику можно отключить путем настройки переменной CMake VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS в portfile.cmake.", "PortBugSetDllsWithoutExports": "DLL без операций экспорта, скорее всего, являются ошибкой в скрипте сборки. Если так и должно быть, добавьте следующую строку в файл порта:\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS enabled)\nСледующие DLL не содержат операций экспорта:", "PortDependencyConflict": "Порт {package_name} имеет следующие неподдерживаемые зависимости:", "PortDoesNotExist": "{package_name} не существует", @@ -827,21 +951,26 @@ "PortsDiffHelp": "Аргумент должен быть ветвью, тегом или хэшом для извлечения.", "PortsNoDiff": "Порты между двумя фиксациями не изменились.", "PortsRemoved": "Удалены следующие порты ({count}):", - "PortsUpdated": "\nОбновлены следующие порты ({count}):", + "PortsUpdated": "Обновлены следующие порты ({count}):", "PrebuiltPackages": "Существуют несобранные пакеты. Чтобы собрать их, выполните:", "PreviousIntegrationFileRemains": "Предыдущий файл интеграции не был удален.", "ProgramReturnedNonzeroExitCode": "Сбой средства {tool_name} с кодом завершения {exit_code}.", "ProvideExportType": "Требуется хотя бы один из следующих параметров: --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "Сбой отправки {vendor} в \"{path}\". Для получения дополнительных сведений, используйте --debug.", - "RegeneratesArtifactRegistry": "Повторное создание реестра артефактов.", + "RegeneratesArtifactRegistry": "Повторно создает реестр артефактов", "RegistryCreated": "Реестр успешно создан в {path}", "RegistryValueWrongType": "Значение реестра {path} имеет непредвиденный тип.", "RemoveDependencies": "Чтобы удалить зависимости в режиме манифеста, измените манифест (vcpkg.json) и выполните команду \"install\".", "RemovePackageConflict": "{spec} не установлено, но {package_name} установлено для {triplet}. Вы имели в виду {package_name}:{triplet}?", "RemovingPackage": "Выполняется удаление {action_index}/{count} {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "Восстановлен пакет из \"{path}\"", - "RestoredPackagesFromVendor": "Восстановлено {count} пакетов из {value} за {elapsed}. Используйте --debug, чтобы увидеть больше деталей.", + "RestoredPackagesFromAWS": "Восстановлено несколько ({count}) пакетов из AWS за {elapsed}. Используйте --debug, чтобы увидеть больше деталей.", + "RestoredPackagesFromCOS": "Восстановлено несколько ({count}) пакетов из COS за {elapsed}. Используйте --debug, чтобы увидеть больше деталей.", + "RestoredPackagesFromFiles": "Восстановлено несколько ({count}) пакетов из {path} за {elapsed}. Используйте --debug, чтобы увидеть больше деталей.", + "RestoredPackagesFromGCS": "Восстановлено несколько ({count}) пакетов из GCS за {elapsed}. Используйте --debug, чтобы увидеть больше деталей.", + "RestoredPackagesFromGHA": "Восстановлено несколько ({count}) пакетов из кэша GitHub Actions за {elapsed}. Используйте --debug, чтобы увидеть больше деталей.", + "RestoredPackagesFromHTTP": "Восстановлено несколько ({count}) пакетов из HTTP-серверов за {elapsed}. Используйте --debug, чтобы увидеть больше деталей.", + "RestoredPackagesFromNuGet": "Восстановлено несколько ({count}) пакетов из NuGet за {elapsed}. Используйте --debug, чтобы увидеть больше деталей.", "ResultsHeader": "РЕЗУЛЬТАТЫ", "ScriptAssetCacheRequiresScript": "ожидаемые аргументы: конфигурация ресурса \"x-script\" требует в качестве аргумента только шаблон exec", "SearchHelp": "Аргумент должен быть подстрокой для поиска или не должен содержать аргумент для отображения всех библиотек.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "Очистка содержимого {path} пропущена: это не каталог.", "SourceFieldPortNameMismatch": "Поле \"Source\" в файле CONTROL или поле \"name\" в файле vcpkg.json содержит имя {package_name} и не соответствует каталогу порта {path}.", "SpecifiedFeatureTurnedOff": "Функция '{command_name}' специально отключена, но указан --{option}.", - "SpecifyDirectoriesContaining": "Указывает каталоги, содержащие файлы триплетов.\n(также: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "Укажите каталоги для использования при поиске портов.\n(также: '{env_var}')", - "SpecifyHostArch": "Укажите триплет архитектуры узла. См. 'vcpkg help triplet'.\n(по умолчанию: '{env_var}')", - "SpecifyTargetArch": "Укажите триплет целевой архитектуры. См. 'vcpkg help triplet'.\n(по умолчанию: '{env_var}')", + "SpecifyHostArch": "Триплет узла. См. \"vcpkg help triplet\" (по умолчанию: {env_var})", + "SpecifyTargetArch": "Триплет целевого объекта. См. \"vcpkg help triplet\" (по умолчанию: {env_var})", "StartCodeUnitInContinue": "найдена единица начального кода в позиции продолжения", "StoreOptionMissingSha": "Параметр --store недопустим без sha512", - "StoredBinariesToDestinations": "Двоичные файлы хранятся в нескольких назначениях ({count}).", + "StoredBinariesToDestinations": "Двоичные файлы сохранены в нескольких ({count}) назначениях за {elapsed}.", "StoredBinaryCache": "Сохраненный двоичный кэш: \"{path}\"", "SuccessfulyExported": "Пакет {package_name} экспортирован в папку {path}", "SuggestGitPull": "Результат может быть устаревшим. Чтобы получить последние результаты, запустите \"git pull\".", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "Возможно, нужно обновить двоичный файл vcpkg; попробуйте запустить {command_line} для обновления.", "SupportedPort": "Порт {package_name} поддерживается.", "SwitchUsedMultipleTimes": "переключатель \"{option}\" указан несколько раз", + "SynopsisHeader": "Описание:", "SystemApiErrorMessage": "Сбой вызова API {system_api} с кодом завершения {exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "Ожидается, что переменная среды SystemRoot всегда установлена ​​в Windows.", "SystemTargetsInstallFailed": "не удалось установить файл целей построения в {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Конечная запятая в массиве", "TrailingCommaInObj": "Конечная запятая в объекте", "TripletFileNotFound": "Файл Triplet {triplet}.cmake не найден", + "TripletLabel": "Триплет:", "TwoFeatureFlagsSpecified": "И '{value}', и -'{value}' были указаны как флаги функций.", "UnableToClearPath": "не удается удалить {path}", "UnableToReadAppDatas": "%LOCALAPPDATA% и %APPDATA% нечитаемы", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "реестр \"{url}\" не обновлен: \"{value}\"", "UpdateBaselineRemoteGitError": "GIT не удалось получить удаленный репозиторий \"{url}\"", "UpdateBaselineUpdatedBaseline": "обновленный реестр \"{url}\": базовый план \"{old_value}\" -> \"{new_value}\"", - "UpgradeInManifest": "Команда обновления сейчас не поддерживает режим манифеста. Вместо этого измените vcpkg.json и запустите установку.", + "UpgradeInManifest": "Обновление обновляет установку в классическом режиме и поэтому не поддерживает режим манифеста. Попробуйте обновить зависимости, обновив базовый план до текущего значения с помощью vcpkg x-update-baseline и запустив установку vcpkg.", "UpgradeRunWithNoDryRun": "Если вы действительно хотите повторно собрать перечисленные выше пакеты, запустите эту команду с параметром --no-dry-run.", "UploadedBinaries": "Загружены двоичные файлы {count} {vendor}.", "UploadedPackagesToVendor": "Отправлено {count} пакетов из {vendor} за {elapsed}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "недопустимая команда: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "Значение переменной среды X_VCPKG_REGISTRIES_CACHE не является каталогом: {path}", "VcpkgRootRequired": "Для изолированной начальной загрузки необходимо настроить VCPKG_ROOT.", - "VcpkgRootsDir": "Укажите корневой каталог vcpkg. (по умолчанию:\n'{env_var}')", + "VcpkgRootsDir": "Корневой каталог vcpkg (по умолчанию: {env_var})", "VcpkgSendMetricsButDisabled": "передан --sendmetrics, но метрики отключены.", + "VcpkgUsage": "использование: vcpkg <команда> [--переключатели] [--параметры=значения] [аргументы] @файл_ответа", "VcvarsRunFailed": "не удалось запустить vcvarsall.bat для получения среды Visual Studio", "VcvarsRunFailedExitCode": "при попытке получить среду Visual Studio vcvarsall.bat вернул {exit_code}", "VersionBaselineMismatch": "Последняя версия — {expected}, но базовый файл содержит {actual}.\nЗапустите:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\nдля обновления базовой версии.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "В {package_name} отсутствует файл базы данных версии в {path}\nЗапустите:\nvcpkg x-add-version {package_name}\nдля создания файла версий.", "VersionGitEntryMissing": "отсутствует запись базы данных версий для {package_name} в {version}.\nДоступные версии:", "VersionInDeclarationDoesNotMatch": "Версия, указанная в файле, не соответствует проверенной версии: {version}", - "VersionIncomparable1": "конфликт версий в {spec}: {package_name} требуется {expected}, но vcpkg не может сравнить его с {actual}.\nВ двух версиях использовались несравнимые схемы:", - "VersionIncomparable2": "\"{version}\" имела схему {new_scheme}", - "VersionIncomparable3": "Это можно устранить, добавив явное переопределение в предпочитаемую версию, например:", - "VersionIncomparable4": "Дополнительные сведения см. в разделе \"управление версиями справки vcpkg\".", + "VersionIncomparable1": "конфликт версий {spec}: для {constraint_origin} требуется {expected}, что невозможно сравнить с базовой версией {actual}.", + "VersionIncomparable2": "{version_spec} использует схему {new_scheme}", + "VersionIncomparable3": "Это можно устранить, добавив явное переопределение в предпочитаемую версию. Например:", + "VersionIncomparable4": "Дополнительные сведения см. в разделе \"управление версиями справки vcpkg\" или по адресу {url}.", + "VersionIncomparableSchemeString": "Обе версии используют строку схемы, но разный основной текст.", + "VersionIncomparableSchemes": "Версии используют несовместимые схемы:", "VersionInvalidDate": "\"{version}\" не является допустимой версией даты. Даты должны быть в формате ГГГГ-ММ-ДД, а неоднозначные значения должны быть положительными целыми числами с разделителями-точками без начальных нулей.", "VersionInvalidRelaxed": "\"{version}\" не является допустимой нестрогой версией (semver с произвольным количеством числовых элементов).", "VersionInvalidSemver": "\"{version}\" не является допустимой семантической версией, см. .", "VersionMissing": "ожидается поле управления версиями (один из вариантов: version, version-date, version-semver или version-string)", - "VersionMissingRequiredFeature": "{spec}@{version} не имеет требуемой функции {feature}", + "VersionMissingRequiredFeature": "{version_spec} не содержит обязательного компонента {feature}, необходимого для {constraint_origin}", "VersionNotFound": "{expected} недоступно, {actual} доступно только {actual}.", - "VersionNotFoundDuringDiscovery": "версия не найдена во время обнаружения: {spec}@{version}\nЭто внутренняя ошибка vcpkg. Откройте проблему на https://github.com/Microsoft/vcpkg с подробными инструкциями по воспроизведению проблемы.", - "VersionNotFoundInVersionsFile": "Версия {version} не найдена в файле версий.\nЗапустите:\nvcpkg x-add-version {package_name},\nчтобы добавить новую версию порта.", + "VersionNotFoundInVersionsFile": "Версия {version} не найдена в файле версий для {package_name}.\nЗапустите:\nvcpkg x-add-version {package_name},\nчтобы добавить новую версию порта.", "VersionRejectedDueToBaselineMissing": "Путь {path} отклонен, поскольку в нем используется \"{json_field}\" и отсутствует \"builtin-baseline\". Чтобы исправить эту ошибку, удалите все вхождения \"{json_field}\" или добавьте \"builtin-baseline\".\nДля получения дополнительных сведений см. \"vcpkg help versioning\".", "VersionRejectedDueToFeatureFlagOff": "Путь {path} отклонен, поскольку в нем используется \"{json_field}\", а флаг функции \"versions\" отключен. Чтобы исправить эту ошибку, удалите \"{json_field}\" или включите флаг функции \"versions\".\nДля получения дополнительных сведений см. \"vcpkg help versioning\".", "VersionSchemeMismatch": "База данных версии объявляет {version} как {expected}, но {path} объявляет ее как {actual}. Версии должны быть уникальными, даже если они объявлены с разными схемами.\nЗапустите:\nvcpkg x-add-version {package_name} --overwrite-version,\nчтобы перезаписать схему, объявленную в базе данных версии, схемой, объявленной в порту.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "после \"#\" в тексте версии должна следовать версия порта (неотрицательное целое число)", "VersionSpecMismatch": "Не удалось загрузить порт, так как версии не согласованы. Файл \"{path}\" содержит версию {actual_version}, но база данных версий указывает, что она должна быть {expected_version}.", "VersionTableHeader": "Версия", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "Ожидание завершения дочерних процессов...", "WaitingToTakeFilesystemLock": "ожидание блокировки файловой системы в {path}...", "WarnOnParseConfig": "Обнаружены следующие предупреждения в конфигурации {path}:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "при проверке версии: {version}", "WindowsOnlyCommand": "Эта команда поддерживает только Windows.", "WroteNuGetPkgConfInfo": "Сведения о конфигурации пакета NuGet записаны в {path}", - "UnrecognizedCommand$": "Нераспознанная команда \"${p0}\"", - "Use$ToGetHelp": "Используйте ${p0} для получения справки", - "FatalTheRootFolder$CanNotBeCreated": "Неустранимая ошибка: не удается создать корневую папку \"${p0}\"", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Неустранимая ошибка: не удается создать глобальный файл конфигурации \"${p0}\".", + "FatalTheRootFolder$CannotBeCreated": "Неустранимая ошибка: не удается создать корневую папку \"${p0}\"", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Неустранимая ошибка: не удается создать глобальный файл конфигурации \"${p0}\".", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND не настроена", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "Запуск vcpkg внутренне вернул ненулевой код выхода: ${p0}", "failedToDownloadFrom$": "не удалось скачать из ${p0}", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "Параметр description должен иметь тип \"string\", обнаружено \"${p0}\"", "optionsShouldBeASequenceFound$": "Параметр options должен быть последовательностью, обнаружено \"${p0}\"", "DuplicateKeysDetectedInManifest$": "В манифесте обнаружены повторяющиеся ключи: \"${p0}\"", - "in$Skipping$BecauseItIsA$": "в ${p0} пропускается ${p1}, так как это ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "нет файла в формате PostScript: перезапустите с помощью функции оболочки vcpkg, а не исполняемого файла", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Дублировать определение ${p0} во время активации. Новое значение заменит старое.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "Во время активации объявлено дублирующее средство ${p0}. Новое значение заменит старое.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(ход выполнения неизвестен)", "verifying": "проверка", "downloading$$": "скачивание ${p0} -> ${p1}", - "unpacking": "распаковка", "unpacking$": "распаковка ${p0}", "Installing$": "Установка ${p0}...", "$AlreadyInstalled": "Уже установлено: ${p0}", "Downloading$": "Скачивание ${p0}...", "Unpacking$": "Распаковка ${p0}...", "ErrorInstalling$$": "Ошибка при установке ${p0} - ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "Ожидалось одиночное значение для ${p0} — найдено несколько", - "Synopsis": "Описание", - "Description": "Описание", - "Switches": "Переходы", - "SeeAlso": "См. также", "error": "ошибка:", "warning": "предупреждение:", + "ExpectedASingleValueFor$FoundMultiple": "Ожидалось одиночное значение для ${p0} — найдено несколько", "ExpectedASingleValueFor$": "Ожидалось одиночное значение для \"--${p0}\".", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Предполагается, что \"${p0}\" правильный; предоставьте хэш в метаданных артефакта, чтобы подавить это сообщение.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "Скачанный файл \"${p0}\" не содержит правильного хэша (${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "Обнаружено несоответствие ${p0} в \"${p1}\". Вместо этого для литерала ${p2} используйте ${p3}${p4}.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "Не удалось найти значение для {${p0}} в \"${p1}\". Чтобы записать литерал, используйте вместо этого \"{{${p2}}}\".", "MatchedMoreThanOneInstallBlock$": "Соответствует более чем одному блоку установки [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Получает все, на что ссылается проект, без активации", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "Это позволяет потребителю предварительно скачать инструменты, необходимые для проекта.", "UnableToFindProjectInFolderorParentFoldersFor$": "Не удается найти проект в папке (или родительских папках) для ${p0}", "UnableToAcquireProject": "Не удается получить проект", - "AcquireArtifactsInTheRegistry": "Получение артефактов в реестре", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "Это позволяет потребителю приобретать (скачивать и распаковывать) артефакты. Артефакты должны быть активированы для использования", "NoArtifactsSpecified": "Артефакты не указаны", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Указано несколько пакетов, но не равное число коммутаторов ${p0}", "NoArtifactsAreAcquired": "Артефакты не приобретены", "AllArtifactsAreAlreadyInstalled": "Все артефакты уже установлены", "$ArtifactsInstalledSuccessfully": "Артефакты ${p0} успешно установлены", "InstallationFailedStopping": "Сбой установки — остановка", - "ActivatesTheToolsRequiredForAProject": "Активирует инструменты, необходимые для проекта", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "Это позволяет клиенту активировать средства, необходимые для проекта. Если средства еще не установлены, то перед активацией их нужно будет скачать и установить.", - "AddsAnArtifactToTheProject": "Добавляет артефакт в проект", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "Это позволяет потребителю добавить артефакт в проект. Это также активирует проект.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Указано несколько артефактов, но не равное число переключателей ${p0}", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Попытка добавить артефакт [${p0}]:${p1}, но не удалось определить используемый реестр.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Попытка добавить реестр ${p0} как ${p1}, но он уже был ${p2}. Добавьте ${p3} в этот проект вручную и повторите попытку.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Запустите команду \\\"vcpkg activate\\\", чтобы применить к текущему терминалу", - "ManagesTheDownloadCache": "Управляет кэшем загрузки", "DownloadsFolderCleared$": "Папка загрузок очищена (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "очищает все (кэш, установленные артефакты)", - "cleansOutTheDownloadsCache": "очищает кэш загрузки", - "removesAllTheArtifactsThatAreInstalled": "удаляет все установленные артефакты", - "cleansUp": "очищает", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Позволяет пользователю очистить кэш, установленные артефакты и т. д.", "InstalledArtifactFolderCleared$": "Папка с установленными артефактами очищена (${p0}) ", "CacheFolderCleared$": "Папка кэша очищена (${p0}) ", - "DeactivatesTheCurrentSession": "Деактивирует текущий сеанс", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "Это позволяет клиенту удалять параметры среды для текущего активного сеанса.", - "DeletesAnArtifactFromTheArtifactFolder": "Удаляет артефакт из папки артефактов", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "Это позволяет потребителю удалить артефакт с диска.", "DeletingArtifact$From$": "Удаление артефакта ${p0} из ${p1}", - "FindArtifactsInTheRegistry": "Поиск артефактов в реестре", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "Это позволяет пользователю находить артефакты на основе некоторых условий.", "NoArtifactsFoundMatchingCriteria$": "Не найдены артефакты, соответствующие критериям: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Создает свойства MSBuild для активации без скачивания чего-либо для проекта", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props требует --msbuild-props", "UnableToActivateProject": "Не удается активировать проект", - "theNameOfTheCommandForWhichYouWantHelp": "имя команды, по которой требуется справка", - "getHelpOn$OrOneOfTheCommands": "получить справку по ${p0} или одной из команд", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Получает подробную справку по ${p0} или по одной из команд", - "Arguments": "Аргументы:", - "Use$ToGetTheListOfAvailableCommands": "Используйте ${p0} для получения списка доступных команд", - "Usage": "Использование", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "Доступные команды ${p0}:", - "ListsTheArtifacts": "Перечисляет артефакты", - "ThisAllowsTheConsumerToListArtifacts": "Это позволяет потребителю перечислить артефакты.", - "regenerateTheIndexForARegistry": "повторно создать индекс для реестра", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "Это позволяет пользователю повторно создавать файлы ${p0} для реестра ${p1}.", "RegeneratingIndexFor$": "Повторное индексирование для ${p0}", "RegenerationCompleteIndexContains$MetadataFiles": "Восстановление завершено. Индекс содержит файлы метаданных ${p0}", "Registry$ContainsNoArtifacts": "Реестр: \"${p0}\" не содержит артефактов.", "error$": "ошибка ${p0}: ", - "RemovesAnArtifactFromAProject": "Удаляет артефакт из проекта", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "Это позволяет потребителю удалить артефакт из проекта. Принудительно выполняет повторную активацию в этом окне.", "Removing$FromProjectManifest": "Удаление ${p0} из манифеста проекта", "unableToFindArtifact$InTheProjectManifest": "не удается найти артефакт ${p0} в манифесте проекта", - "updateTheRegistryFromTheRemote": "обновить реестр из удаленного расположения", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Это приведет к скачиванию последнего содержимого реестра из удаленной службы.", - "DownloadingRegistryData": "Скачивание данных реестра", - "Updated$RegistryContains$MetadataFiles": "Обновлено ${p0}. Реестр содержит файлы метаданных ${p1}", - "UnableToDownloadRegistrySnapshot": "Не удается скачать моментальный снимок реестра", - "UnableToFindRegistry$": "Не удается найти реестр ${p0}", - "ArtifactRegistryDataIsNotLoaded": "Данные реестра артефактов не загружены", - "AttemptingToUpdateArtifactRegistry": "Попытка обновить реестр артефактов", - "UnableToLoadRegistryIndex": "Не удается загрузить индекс реестра", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Мгновенно активирует артефакт вне проекта", - "ThisWillInstantlyActivateAnArtifact": "Это мгновенно активирует артефакт.", + "Updated$ItContains$MetadataFiles": "Обновлено ${p0}. Он содержит файлы метаданных ${p1}.", + "UnableToDownload$": "Не удалось скачать ${p0}.", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} не удалось обновить. Он может быть неправильно сформирован.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "Команда x-update-registry загружает новую информацию реестра и поэтому не может использоваться с локальными реестрами. Вы имели в виду x-regenerate ${p0}?", + "UnableToFindRegistry$": "Не удается найти реестр ${p0}.", "NoArtifactsAreBeingAcquired": "Артефакты не приобретаются", - "removesAllFilesInTheLocalCache": "удаляет все файлы в локальном кэше", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "включает режим отладки, отображает внутренние сообщения о том, как работает ${p0}", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "выполняется (потенциально опасное) действие без подтверждения", - "showsTheinstalledArtifacts": "отображает _установленные_ артефакты", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Дамп переменных среды и других свойств в файл JSON с путем, предоставленным пользователем.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Полный путь к файлу, в который будут записаны свойства MSBuild.", - "ApplyAnyDeprecationFixups": "Примените любые исправления устаревания.", - "overrideThePathToTheProjectFolder": "переопределить путь к папке проекта", - "UnableToFindProjectEnvironment$": "Не удается найти среду проекта ${p0}", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "включает подробный режим, отображает подробные сообщения о процессе", - "aVersionOrVersionRangeToMatch": "версия или диапазон версий для сопоставления" + "UnableToFindProjectEnvironment$": "Не удается найти среду проекта ${p0}" } diff --git a/locales/messages.tr.json b/locales/messages.tr.json index 4d26be2994..bdfb424e40 100644 --- a/locales/messages.tr.json +++ b/locales/messages.tr.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "yerleşik kayıt defteri", "AConfigurationObject": "yapılandırma nesnesi", "ADateVersionString": "tarih sürümü dizesi", + "ADefaultFeature": "varsayılan bir özellik", "ADemandObject": "istek nesnesi", "ADependency": "bağımlılık", + "ADependencyFeature": "bir bağımlılığın özelliği", "ADictionaryOfContacts": "kişi sözlüğü", "AFeature": "özellik", + "AFeatureName": "özellik adı", "AFilesystemRegistry": "filesystem kayıt defteri", "AGitObjectSha": "git nesnesi SHA'sı", "AGitReference": "git başvurusu (örneğin; dal)", @@ -37,19 +40,19 @@ "AStringStringDictionary": "\"string\": \"string\" sözlüğü", "AUrl": "URL", "AVcpkgRepositoryCommit": "vcpkg depo işlemesi", - "AVersionConstraint": "sürüm kısıtlaması", + "AVersionConstraint": "bir sürüm kısıtlaması", "AVersionDatabaseEntry": "sürüm veritabanı girdisi", "AVersionObject": "sürüm nesnesi", "AVersionOfAnyType": "herhangi bir türün sürümü", "AddArtifactOnlyOne": "'{command_line}' aynı anda yalnızca bir yapıt ekleyebilir.", "AddCommandFirstArg": "Eklenecek ilk parametre 'artifact' veya 'port' olmalıdır.", "AddFirstArgument": "'{command_line}' için ilk bağımsız değişken, 'yapıt' veya 'bağlantı noktası' olmalıdır.", - "AddHelp": "Belirtilen bağlantı noktasını ya da yapıtı geçerli dizinle ilişkili bildirime ekle.", "AddPortRequiresManifest": "'{command_line}' etkin bir bildirim dosyası gerektirir.", "AddPortSucceeded": "Bağlantı noktaları vcpkg.json dosyasına başarıyla eklendi.", "AddRecurseOption": "Bunları kaldırmak istediğinizden eminseniz komutu --recurse seçeneğiyle çalıştırın.", "AddTripletExpressionNotAllowed": "Burada üçlü ifadelere izin verilmiyor. Bunun yerine `{package_name}:{triplet}` öğesini `{package_name}` olarak değiştirmek isteyebilirsiniz.", "AddVersionAddedVersionToFile": "{version} sürümü {path} yoluna eklendi", + "AddVersionArtifactsOnly": "--version yalnızca yapıtlar içindir ve vcpkg ekleme bağlantı noktasıyla kullanılamaz", "AddVersionCommitChangesReminder": "Değişikliklerinizi işlediniz mi?", "AddVersionCommitResultReminder": "Sonucu işlemeyi unutmayın!", "AddVersionDetectLocalChangesError": "GIT durum çıkışındaki beklenmeyen biçim nedeniyle yerel değişiklikleri algılama işlemi atlanıyor", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} zaten yüklü", "AlreadyInstalledNotHead": "{spec} zaten yüklü -- HEAD'den derlenemiyor", "AmbiguousConfigDeleteConfigFile": "Hem bildirim hem de yapılandırma dosyası tarafından sağlanan vcpkg yapılandırması belirsiz.\n-- {path} yapılandırma dosyasını sil", + "AnArrayOfDefaultFeatures": "bir dizi varsayılan özellik", "AnArrayOfDependencies": "bağımlılıklar dizisi", "AnArrayOfDependencyOverrides": "bağımlılık geçersiz kılmaları dizisi", + "AnArrayOfFeatures": "özellikler dizisi", "AnArrayOfIdentifers": "tanımlayıcılar dizisi", "AnArrayOfOverlayPaths": "katman yolları dizisi", "AnArrayOfOverlayTripletsPaths": "üçlü katman yolları dizisi", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "Makinede başka bir yükleme devam ediyor, yeniden denemeden önce 6s uykuda.", "AppliedUserIntegration": "Bu vcpkg kökü için kullanıcı genelinde tümleştirme uygulandı.", "ApplocalProcessing": "vcpkg applocal işleme: {path}", + "ArtifactsBootstrapFailed": "Vcpkg yapıtları yüklü değil ve önyükleme yapılamadı.", + "ArtifactsNotInstalledReadonlyRoot": "Vcpkg yapıtları yüklü değil ve VCPKG_ROOT salt okunur varsayıldığından yüklenemiyor. Vcpkg paket yöneticisinin 'tek satırlık' kod kullanılarak yeniden yüklenmesi bu sorunu çözebilir.", + "ArtifactsNotOfficialWarning": "Resmi olmayan uyarı içeren vcpkg yapıtlarını kullanma ", "ArtifactsOptionIncompatibility": "--{option}, yapıtı bulma üzerinde hiçbir etkiye sahip değildir.", + "ArtifactsOptionJson": "Ortam değişkenlerinin ve diğer özelliklerin kaydedildiği JSON dosyasının tam yolu", + "ArtifactsOptionMSBuildProps": "MSBuild özelliklerinin yazılacağı dosyanın tam yolu", + "ArtifactsOptionVersion": "Eşleşecek bir sürüm veya sürüm aralığı; yalnızca yapıtlar için geçerlidir", + "ArtifactsOptionVersionMismatch": "--version anahtarlarının sayısı adlandırılmış yapıt sayısıyla eşleşmelidir", + "ArtifactsSwitchARM": "Yapıtlar alınırken ARM için konak algılamayı zorlar", + "ArtifactsSwitchARM64": "Yapıtlar alınırken ARM64 için konak algılamayı zorlar", + "ArtifactsSwitchAll": "Bilinen tüm yapıt kayıt defterlerini güncelleştirir", + "ArtifactsSwitchAllLanguages": "Yapıtlar alınırken tüm dil dosyalarını alır", + "ArtifactsSwitchForce": "Bir yapıt zaten alınmışsa yeniden almayı zorlar", + "ArtifactsSwitchFreebsd": "Yapıtlar alınırken FreeBSD için konak algılamayı zorlar", + "ArtifactsSwitchLinux": "Yapıtlar alınırken Linux için konak algılamayı zorlar", + "ArtifactsSwitchNormalize": "Kullanımdan kaldırma düzeltmelerini uygular", + "ArtifactsSwitchOnlyOneHostPlatform": "Yalnızca bir konak platformu (--x64, --x86, --arm, --arm64) ayarlanabilir.", + "ArtifactsSwitchOnlyOneOperatingSystem": "Yalnızca bir işletim sistemi (--windows, --osx, --linux, --freebsd) ayarlanabilir.", + "ArtifactsSwitchOnlyOneTargetPlatform": "Yalnızca bir hedef platform (--target:x64, --target:x86, --target:arm, --target:arm64) ayarlanabilir.", + "ArtifactsSwitchOsx": "Yapıtlar alınırken MacOS için konak algılamayı zorlar", + "ArtifactsSwitchTargetARM": "Yapıtlar alınırken ARM için hedef algılamayı ayarlar", + "ArtifactsSwitchTargetARM64": "Yapıtlar alınırken ARM64 için hedef algılamayı ayarlar", + "ArtifactsSwitchTargetX64": "Yapıtlar alınırken x64 için hedef algılamayı ayarlar", + "ArtifactsSwitchTargetX86": "Yapıtlar alınırken x86 için hedefi ayarlar", + "ArtifactsSwitchWindows": "Yapıtlar alınırken Windows için konak algılamayı zorlar", + "ArtifactsSwitchX64": "Yapıtlar alınırken x64 için konak algılamayı zorlar", + "ArtifactsSwitchX86": "Yapıtlar alınırken x86 için konak algılamayı zorlar", "AssetCacheProviderAcceptsNoArguments": "beklenmeyen bağımsız değişkenler: '{value}', bağımsız değişkenleri kabul etmiyor", - "AssetSourcesArg": "Varlık önbelleğe alma için kaynak ekleyin. Bkz. 'vcpkg help assetcaching'.", + "AssetSourcesArg": "Varlık önbelleğe alma kaynakları. Bkz. 'vcpkg help assetcaching'", "AttemptingToFetchPackagesFromVendor": "{count} paket {vendor} tarafından getirilmeye çalışılıyor", "AttemptingToSetBuiltInBaseline": "vcpkg-configuration.json içindeki varsayılan kayıt defteri geçersiz kılınırken vcpkg.json içinde yerleşik taban çizgisi ayarlanmaya çalışılıyor.\nvcpkg-configuration.json dosyasındaki varsayılan kayıt defteri kullanılacak.", "AuthenticationMayRequireManualAction": "Bir veya daha {vendor} kimlik bilgisi sağlayıcısı el ile eylem isteğinde bulundu. Etkileşime izin vermek için 'interactive' ikili kaynağı ekleyin.", "AutoSettingEnvVar": "-- {env_var} ortam değişkenlerini otomatik olarak \"{url}\" olarak ayarlama.", "AutomaticLinkingForMSBuildProjects": "Tüm MSBuild C++ projeleri artık tüm yüklü kitaplıkları içerebilir (#include). Bağlama otomatik olarak gerçekleştirilecektir. Yeni kitaplıklar kurmak, onları anında kullanılabilir hale getirecektir.", - "AvailableArchitectureTriplets": "Mevcut mimari üçlüler:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 ve üzeri artık tüm yüklü kitaplıkları içerebilir (#include). Bağlama işlemi otomatik olarak gerçekleştirilir. Yeni kitaplıklar kurulduğunda, bu kitaplıklar anında kullanılabilir olur.", "AvailableHelpTopics": "Mevcut yardım konuları:", "AzUrlAssetCacheRequiresBaseUrl": "beklenmeyen bağımsız değişkenler: varlık yapılandırması 'azurl', bir temel url gerektiriyor", "AzUrlAssetCacheRequiresLessThanFour": "beklenmeyen bağımsız değişkenler: varlık yapılandırması 'azurl' 4'den az bağımsız değişken gerektirir", "BaselineConflict": "Bildirim dosyasında vcpkg-configuration.default-registry belirtilmesi, yerleşik taban çizgisiyle çakışıyor.\nLütfen bu çakışan ayarlardan birini kaldırın.", "BaselineFileNoDefaultField": "İşleme sırasındaki temel {commit_sha} geçersizdi (\"varsayılan\" alan yok).", - "BaselineFileNoDefaultFieldPath": "{path} öğesindeki ana hat geçersizdi (\"varsayılan\" alan yok)", "BaselineGitShowFailed": "'{commit_sha}' işlemesinden temeli kullanıma alırken `git show` versions/baseline.json başarısız oldu. Bu, `git fetch` ile işlemeler getirilerek düzeltilebilir.", "BaselineMissing": "Temel sürüm bulunamadı. Çalıştır:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\nyazarak {version} sürümünü temel sürüm olarak ayarlayın.", - "BaselineMissingDefault": "Depodaki '\"{commit_sha}\"' işlemesinde bulunan baseline.json {url} geçersizdi (\"default\" alanı içermiyor).", - "BinarySourcesArg": "İkili önbelleğe alma için kaynaklar ekleyin. Bkz. 'vcpkg help binarycaching'.", + "BinaryCacheVendorHTTP": "HTTP sunucuları", + "BinarySourcesArg": "İkili önbelleğe alma kaynakları. Bkz. 'vcpkg help binarycaching'", "BinaryWithInvalidArchitecture": "{path}\n Beklenen: {expected}, ancak bulunan: {actual}", "BuildAlreadyInstalled": "{spec} zaten yüklü; derlemeyi denemeden önce lütfen {spec} öğesini kaldırın.", "BuildDependenciesMissing": "Derleme komutu tüm bağımlılıkların yüklenmiş olmasını gerektirir.\nŞu bağımlılıklar eksik:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "BAŞARILI OLDU", "BuildResultSummaryHeader": "{triplet} ÖZETİ", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(Deneysel) Buildtrees kök dizinini belirtin.", + "BuildTreesRootDir": "Derleme ağaçları dizini (deneysel)", "BuildTroubleshootingMessage1": "Lütfen 'git pull' ve 'vcpkg update' ile en son bağlantı noktası dosyalarını kullandığınızdan emin olun.\nArdından şu konumda bilinen sorunları kontrol edin:", "BuildTroubleshootingMessage2": "Yeni bir sorun gönderebilirsiniz:", "BuildTroubleshootingMessage3": "Hata raporu başlığınıza '[{package_name}] Derleme hatası' ekleyin, hata açıklamanıza aşağıdaki sürüm bilgilerini ekleyin ve yukarıdaki ilgili hata günlüklerini ekleyin.", "BuildTroubleshootingMessage4": "Lütfen sorununuzu bildirirken {path} adresindeki önceden doldurulmuş şablonu kullanın.", - "BuildTroubleshootingMessageGH": "Ayrıca çalıştırarak bir sorunu bildirebilirsiniz (GitHub cli yüklü olmalıdır):", + "BuildTroubleshootingMessageGH": "Ayrıca çalıştırarak bir sorunu gönderebilirsiniz (GitHub CLI yüklü olmalıdır):", "BuildingFromHead": "HEAD'den {spec} derleniyor...", "BuildingPackage": "{spec} derleniyor...", "BuildingPackageFailed": "derleme {spec} başarısız oldu: {build_result}", "BuildingPackageFailedDueToMissingDeps": "şu eksik bağımlılıklar nedeniyle:", - "BuiltInTriplets": "vcpkg yerleşik üçlüler:", + "BuiltInTriplets": "Yerleşik Üçlüler:", "BuiltWithIncorrectArchitecture": "Aşağıdaki dosyalar yanlış bir mimari için oluşturulmuş:", "CISettingsExclude": "Atlanacak bağlantı noktalarının virgülle ayrılmış listesi", "CISettingsOptCIBase": "ci.baseline.txt dosyasının yolu. Bağlantı noktalarını atlamak ve gerilemeleri algılamak için kullanılır.", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "Tüm belirlenen paket karmalarının çıkarılacağı dosya", "CISettingsOptParentHashes": "Değiştirilen paket kümesini azaltmak üzere üst CI durumu için paket karmalarının okunacağı dosya", "CISettingsOptSkippedCascadeCount": "--exclude ve supports atlamaları sayısının tam olarak bu sayıya eşit olduğunu onaylar", - "CISettingsOptXUnit": "Sonuçların XUnit biçiminde çıkarılacağı dosya (dahili)", - "CISettingsVerifyGitTree": "Her git ağacı nesnesinin bildirilen sürümüyle eşleştiğini doğrulayın (bu çok yavaştır)", - "CISettingsVerifyVersion": "Her bağlantı noktası için yalnızca hatalar yerine sonuç yazdır.", - "CISwitchOptAllowUnexpectedPassing": "'Geçiriliyor, başarısız listesinden kaldır' sonuçlarının yayılmaması gerektiğini belirtir.", - "CISwitchOptDryRun": "Planı yürütmeden yazdır", - "CISwitchOptRandomize": "Yükleme sırasını rastgele seç", - "CISwitchOptSkipFailures": "ci.baseline.txt içinde '=fail' olarak işaretlenen bağlantı noktalarının atlanması gerektiğini gösterir.", - "CISwitchOptXUnitAll": "Aynı zamanda değişmemiş bağlantı noktalarını da XUnit çıkışına bildir (dahili)", + "CISettingsOptXUnit": "Sonuçların XUnit biçiminde çıkarılacağı dosya", + "CISettingsVerifyGitTree": "Her git ağacı nesnesinin bildirilen sürümüyle eşleştiğini doğrular (bu çok yavaştır)", + "CISettingsVerifyVersion": "Yalnızca hatalar yerine her bağlantı noktasına ait sonucu yazdırır", + "CISkipInstallation": "Aşağıdaki paketler zaten yüklü ve yeniden derlenemez:", + "CISwitchOptAllowUnexpectedPassing": "'Geçiriliyor, başarısız listesinden kaldırın' sonuçlarını gizler", + "CISwitchOptDryRun": "Planı yürütme olmadan yazdırır", + "CISwitchOptRandomize": "Yükleme sırasını rastgele belirler", + "CISwitchOptSkipFailures": "ci.baseline.txt üzerinde `=fail` olarak işaretlenen bağlantı noktalarını atlar", + "CISwitchOptXUnitAll": "XUnit çıkışındaki değiştirilmemiş bağlantı noktalarını raporlar", "CMakeTargetsUsage": "{package_name} CMake hedefleri sağlar:", "CMakeTargetsUsageHeuristicMessage": "# bu buluşsal olarak oluşturuldu ve doğru olmayabilir", "CMakeToolChainFile": "CMake projeleri \"-DCMAKE_TOOLCHAIN_FILE={path}\" kullanmalıdır", "CMakeUsingExportedLibs": "Dışa aktarılan kitaplıkları CMake projelerinde kullanmak için CMake komut satırınıza {value} ekleyin.", - "CacheHelp": "Bağımsız değişken aranılacak bir alt dize olmalıdır ya da tüm önbelleğe alınmış kitaplıkları görüntülemek için bağımsız değişken olmamalıdır.", "CheckedOutGitSha": "Git SHA kullanıma alındı: {commit_sha}", "CheckedOutObjectMissingManifest": "Kullanıma alınmış nesne DENETİM dosyası ya da vcpkg.json dosyası içermiyor.", "ChecksFailedCheck": "vcpkg kilitlendi; ek ayrıntı yok.", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "vcpkg’nin bootstrap-vcpkg’nin yeniden çalıştırılarak güncelleştirilmesi bu hatayı çözebilir.", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing yalnızca --ci-baseline aracılığıyla bir taban çizgisi sağlandıysa kullanılabilir.", "CiBaselineDisallowedCascade": "GERİLEME: {spec} basamaklandı ancak başarılı olması için gerileme gerekiyor. ({path}).", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "REGRESSION: Bağımsız {spec}, {build_result} ile başarısız oldu.", "CiBaselineRegression": "GERİLEME: {spec}, {build_result} ile başarısız oldu. Bekleniyorsa, {spec}=fail öğesini {path} yoluna ekleyin.", "CiBaselineRegressionHeader": "GERİLEMELER:", + "CiBaselineUnexpectedFail": "REGRESYON: {spec} başarısız olarak işaretlenmiş ancak {triplet} için desteklenmiyor.", + "CiBaselineUnexpectedFailCascade": "REGRESYON: {spec} başarısız olarak işaretlenmiş ancak bir bağımlılık {triplet} için desteklenmiyor.", "CiBaselineUnexpectedPass": "GEÇİRİLİYOR, HATA LİSTESİNDEN KALDIR: {spec} ({path}).", "ClearingContents": "{path} yolunun içeriği temizleniyor", "CmakeTargetsExcluded": "not: {count} ek hedef görüntülenmez.", - "CmdAddVersionOptAll": "Tüm bağlantı noktalarının sürümlerini işle.", - "CmdAddVersionOptOverwriteVersion": "Mevcut bir sürümün `git-tree` öğesinin üzerine yaz.", - "CmdAddVersionOptSkipFormatChk": "vcpkg.json dosyalarının biçimlendirme denetimini atlar.", - "CmdAddVersionOptSkipVersionFormatChk": "Sürüm biçimi denetimini atlar.", - "CmdAddVersionOptVerbose": "Yalnızca hatalar yerine başarı iletilerini yazdır.", + "CmdAcquireExample1": "vcpkg acquire ", + "CmdAcquireProjectSynopsis": "Bir bildirim tarafından başvurulan tüm yapıtları alır", + "CmdAcquireSynopsis": "Adlandırılmış yapıtı alır", + "CmdActivateSynopsis": "Bir bildirimdeki yapıtları etkinleştirir", + "CmdAddExample1": "vcpkg add port ", + "CmdAddExample2": "vcpkg add artifact ", + "CmdAddSynopsis": "Bildirime bağımlılık ekler", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "Tüm bağlantı noktalarının sürümlerini işler", + "CmdAddVersionOptOverwriteVersion": "Mevcut bir sürümün git-tree değerinin üzerine yazar", + "CmdAddVersionOptSkipFormatChk": "vcpkg.json dosyalarının biçimlendirme denetimini atlar", + "CmdAddVersionOptSkipVersionFormatChk": "Sürüm biçimi denetimini atlar", + "CmdAddVersionOptVerbose": "Yalnızca hatalar yerine başarı iletilerini yazdırır", + "CmdAddVersionSynopsis": "Sürüm veritabanına bir sürüm ekler", + "CmdBootstrapStandaloneSynopsis": "vcpkg kökünün yalnızca bir vcpkg ikili dosyasından önyüklemesini gerçekleştirir", + "CmdBuildExample1": "vcpkg build ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "Yol ile bağlantı noktası oluşturur", + "CmdBuildSynopsis": "Bağlantı noktası derler", + "CmdCacheExample1": "vcpkg cache ", + "CmdCacheSynopsis": "Paketlerin belirtimlerini listeler", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "Bağlantı noktasını oluşturmadan desteklenip desteklenmediğini test eder", + "CmdCiCleanSynopsis": "CI çalıştırma işlemine hazırlanmak için tüm dosyaları temizler", + "CmdCiSynopsis": "CI testi için tüm bağlantı noktalarını oluşturmaya çalışır", + "CmdCiVerifyVersionsSynopsis": "Sürüm veritabanının bütünlüğünü denetler", "CmdContactOptSurvey": "Varsayılan tarayıcıyı geçerli vcpkg anketinde başlat", - "CmdDependInfoOptDGML": "dgml temelinde grafik oluşturur", - "CmdDependInfoOptDepth": "Çıkışta özyineleme derinliğini göster", - "CmdDependInfoOptDot": "Nokta temelinde grafik oluşturur", - "CmdDependInfoOptMaxRecurse": "En fazla özyineleme derinliğini ayarla, -1 değeri sınır olmadığını belirtir", - "CmdDependInfoOptSort": "Bağımlılıklar listesi için sıralama düzeni ayarla, kabul edilen değerler: sözlük, topolojik (varsayılan), x ağacı, ters", - "CmdEditOptAll": "Düzenleyiciyi bağlantı noktasına ve bağlantı noktasına özgü derleme ağacı alt klasörüne aç", - "CmdEditOptBuildTrees": "Düzenleyiciyi bağlantı noktasına özgü derleme ağacı alt klasörüne aç", - "CmdEnvOptions": "Yüklü {path} yolunu şuna ekle: {env_var}", - "CmdExportOpt7Zip": "7zip (.7z) dosyasına aktar", - "CmdExportOptChocolatey": "Chocolatey paketini dışarı aktar (deneysel özellik)", - "CmdExportOptDebug": "Prefab hata ayıklamayı etkinleştir", - "CmdExportOptDryRun": "Gerçekten dışarı aktarma.", - "CmdExportOptIFW": "IFW tabanlı yükleyiciye aktar", - "CmdExportOptInstalled": "Yüklü tüm paketleri dışarı aktar", - "CmdExportOptMaven": "Maven'ı etkinleştir", - "CmdExportOptNuget": "NuGet paketini dışarı aktar", - "CmdExportOptPrefab": "Prefab biçimine aktar", - "CmdExportOptRaw": "Sıkıştırılmamış bir dizine aktar", - "CmdExportOptZip": "Zip dosyasına aktar", - "CmdExportSettingChocolateyMaint": "Dışarı aktarılan Chocolatey paketi için bakımcıyı belirtin (deneysel özellik)", - "CmdExportSettingChocolateyVersion": "Dışarı aktarılan Chocolatey paketi için eklenecek sürüm sonekini belirtin (deneysel özellik)", - "CmdExportSettingConfigFile": "Yükleyici yapılandırması için geçici dosya yolunu belirtin", - "CmdExportSettingInstallerPath": "Dışarı aktarılan yükleyici için dosya yolunu belirtin", - "CmdExportSettingNugetDesc": "Dışarı aktarılan NuGet paketi için bir açıklama belirtin", - "CmdExportSettingNugetID": "Dışarı aktarılan NuGet paketinin kimliğini belirtin (--output'u geçersiz kılar)", - "CmdExportSettingNugetVersion": "Dışarı aktarılan NuGet paketinin sürümünü belirtin", - "CmdExportSettingOutput": "Çıkış adını belirtin (dosya adı oluşturmak için kullanılır)", - "CmdExportSettingOutputDir": "Üretilen yapıtlar için çıkış dizinini belirtin", - "CmdExportSettingPkgDir": "Yeniden paketlenen paketler için geçici dizin yolunu belirtin", + "CmdCreateExample1": "vcpkg create ", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create ", + "CmdDeactivateSynopsis": "Geçerli kabuktan tüm yapıt etkinleştirmelerini kaldırır", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "Çakışan biçimler belirtildi. --format, --dgml veya --dot seçeneklerinden yalnızca biri kabul edilir.", + "CmdDependInfoFormatHelp": "Çıkış biçimini `list`, `tree`, `mermaid`, `dot`, veya `dgml` seçeneklerinden biri olarak belirler", + "CmdDependInfoFormatInvalid": "--format={value} tanınan bir biçim değil. --format 'list', 'tree', 'mermaid', 'dot' veya 'dgml' seçeneklerinden biri olmalıdır.", + "CmdDependInfoOptDepth": "`list` çıkışında özyineleme derinliğini gösterir", + "CmdDependInfoOptMaxRecurse": "Maksimum özyineleme derinliğini ayarlayın. Varsayılan değerde sınır yoktur.", + "CmdDependInfoOptSort": "`list` biçimi için `lexicographical`, `topological` (varsayılan), `reverse` biçimlerinden birini seçer", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth yalnızca 'list' ve 'tree' biçimleriyle kullanılabilir.", + "CmdDependInfoXtreeTree": "--sort=x-tree, 'tree' dışındaki biçimlerle kullanılamaz", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "Dosyayı indirir", + "CmdEditExample1": "vcpkg edit ", + "CmdEditOptAll": "Düzenleyiciyi bağlantı noktasına ve bağlantı noktasına özgü derleme ağacı alt klasörüne açar", + "CmdEditOptBuildTrees": "Düzenleyiciyi bağlantı noktasına özgü derleme ağacı alt klasörüne açar", + "CmdEnvOptions": "Yüklü {path} yolunu {env_var} ortam değişkenine ekler", + "CmdExportEmptyPlan": "Sıfır paketlerin dışarı aktarılma işleminin oluşturulması reddediliyor. Dışarı aktarmadan önce paketleri yükleyin.", + "CmdExportExample1": "vcpkg export [--nuget] [--directory=out_dir]", + "CmdExportOpt7Zip": "7zip (.7z) dosyasına aktarır", + "CmdExportOptChocolatey": "Chocolatey paketini dışarı aktarır (deneysel)", + "CmdExportOptDebug": "Prefab hata ayıklamayı etkinleştirir", + "CmdExportOptDryRun": "Gerçekten dışarı aktarmaz", + "CmdExportOptIFW": "IFW tabanlı yükleyiciye aktarır", + "CmdExportOptInstalled": "Yüklü tüm paketleri dışarı aktarır", + "CmdExportOptMaven": "Maven'ı etkinleştirir", + "CmdExportOptNuget": "NuGet paketini dışarı aktarır", + "CmdExportOptPrefab": "Prefab biçimine aktarır", + "CmdExportOptRaw": "Sıkıştırılması kaldırılmış bir dizine aktarır", + "CmdExportOptZip": "Zip dosyasına aktarır", + "CmdExportSettingChocolateyMaint": "Dışarı aktarılan Chocolatey paketi için bakımcı (deneysel özellik)", + "CmdExportSettingChocolateyVersion": "Dışarı aktarılan Chocolatey paketi için eklenecek sürüm soneki (deneysel)", + "CmdExportSettingConfigFile": "Yükleyici yapılandırması için geçici dosya yolu", + "CmdExportSettingInstallerPath": "Dışarı aktarılan yükleyici için dosya yolu", + "CmdExportSettingNugetDesc": "Dışarı aktarılan NuGet paketi hakkında açıklama", + "CmdExportSettingNugetID": "Dışarı aktarılan NuGet paketinin kimliği (--output öğesini geçersiz kılar)", + "CmdExportSettingNugetVersion": "Dışarı aktarılan NuGet paketinin sürümü", + "CmdExportSettingOutput": "Çıkış adı (dosya adı oluşturmak için kullanılır)", + "CmdExportSettingOutputDir": "Üretilen yapıtlar için çıkış dizini", + "CmdExportSettingPkgDir": "Yeniden paketlenen paketler için geçici dizin yolu", "CmdExportSettingPrefabArtifactID": "Yapıt kimliği, Maven belirtimlerine göre projenin adıdır", "CmdExportSettingPrefabGroupID": "GroupId, projenizi Maven belirtimlerine göre benzersiz olarak tanımlar", "CmdExportSettingPrefabVersion": "Sürüm, Maven belirtimlerine göre projenin adıdır", - "CmdExportSettingRepoDir": "Dışarı aktarılan depo için dizin yolunu belirtin", - "CmdExportSettingRepoURL": "Çevrimiçi yükleyici için uzak depo URL'sini belirtin", + "CmdExportSettingRepoDir": "Dışarı aktarılan depo için dizin yolu", + "CmdExportSettingRepoURL": "Çevrimiçi yükleyici için uzak depo URL'si", "CmdExportSettingSDKMinVersion": "Android desteklenen en düşük SDK sürümü", "CmdExportSettingSDKTargetVersion": "Android hedef SDK sürümü", - "CmdFetchOptXStderrStatus": "Durumu/indirilen iletileri stdout yerine stderr’a yönlendir. (Hatalar yine de stdout'a gider)", - "CmdFormatManifestOptAll": "Tüm bağlantı noktalarının bildirim dosyalarını biçimlendir.", - "CmdFormatManifestOptConvertControl": "CONTROL dosyalarını bildirim dosyalarına dönüştür.", - "CmdGenerateMessageMapOptNoOutputComments": "İleti haritası oluşturulurken açıklamaları hariç tut (İngilizce yerelleştirme dosyasını oluşturmak için faydalıdır)", - "CmdInfoOptInstalled": "(deneysel) Kullanılabilir paketler yerine yüklü paketlerde bildir", - "CmdInfoOptTransitive": "(deneysel) Yüklü paketlerin bağımlılıklarında da bildir", - "CmdNewOptApplication": "Uygulama bildirimi oluşturun (ad veya sürüm gerektirmez).", - "CmdNewOptSingleFile": "vcpkg-configuration.json dosyasını vcpkg.json dosyasına ekle.", - "CmdNewOptVersionDate": "--version'ı ISO 8601 tarihi olarak yorumla. (YYYY-AA-GG)", - "CmdNewOptVersionRelaxed": "--version'ı bir esnek sayısal sürüm olarak yorumla. (Noktayla ayrılmış negatif olmayan sayılar)", - "CmdNewOptVersionString": "--version öğesini sıralama davranışı olmayan bir dize olarak yorumla.", - "CmdNewSettingName": "Yeni bildirimin adı.", - "CmdNewSettingVersion": "Yeni bildirimin sürümü.", - "CmdRegenerateOptDryRun": "eylemi gerçekleştirmez, yalnızca nelerin yapılabileceğini gösterir", + "CmdExportSynopsis": "Yüklü bağlantı noktalarının tek başına dağıtımını sağlar", + "CmdFetchOptXStderrStatus": "Durumu/indirme mesajlarını stdout yerine stderr hedefine yazdırır (Hatalar/başarısız işlemler yine de stdout hedefine gider)", + "CmdFetchSynopsis": "Sistemden veya internetten öğeler getirir", + "CmdFindExample1": "vcpkg find port ", + "CmdFindExample2": "vcpkg find artifact ", + "CmdFindSynopsis": "Yüklenilebilir veya etkinleştirilebilir bağlantı noktasını veya yapıtı bulur", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "Tüm bağlantı noktalarının bildirim dosyalarını biçimlendirir", + "CmdFormatManifestOptConvertControl": "CONTROL dosyalarını bildirim dosyalarına dönüştürür", + "CmdFormatManifestSynopsis": "vcpkg.json dosyasını düzeltir", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "msbuild .props dosyalarını, bir bildirimin yapıt bağımlılıklarını etkinleştiriyor gibi bu dosyaları almadan oluşturur", + "CmdGenerateMessageMapOptNoOutputComments": "İleti haritası oluşturulurken açıklamaları dışlar (İngilizce yerelleştirme dosyası oluşturmak için faydalıdır)", + "CmdHashExample1": "vcpkg hash ", + "CmdHashExample2": "vcpkg hash SHA256", + "CmdHashSynopsis": "Bir dosyanın SHA256 veya SHA512'sini alır", + "CmdHelpCommandSynopsis": " komutuyla ilgili yardım ayrıntısını görüntüler", + "CmdHelpCommands": "help ", + "CmdHelpCommandsSynopsis": "Listelenmeyen nadir komutlar da dahil tüm komutların bulunduğu listeyi burada görüntüler", + "CmdHelpTopic": "help ", + "CmdInfoOptInstalled": "(deneysel) Kullanılabilir paketler yerine yüklü paketleri bildirir", + "CmdInfoOptTransitive": "(deneysel) Yüklü paketlerin bağımlılıklarında da bildirir", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "Boş bir git kayıt defteri oluşturur", + "CmdInstallExample1": "vcpkg install ...", + "CmdIntegrateSynopsis": "vcpkg'yi makineler, projeler veya kabuklarla tümleştirir", + "CmdListExample2": "vcpkg list ", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "Uygulama bildirimi oluşturur (ad veya sürüm gerektirmez)", + "CmdNewOptSingleFile": "vcpkg-configuration.json dosyasını vcpkg.json dosyasına ekler", + "CmdNewOptVersionDate": "--version öğesini ISO 8601 tarihi (YYYY-AA-GG) olarak yorumlar", + "CmdNewOptVersionRelaxed": "--version öğesini bir esnek sayısal sürüm olarak yorumlar (Noktayla ayrılmış negatif olmayan sayılar)", + "CmdNewOptVersionString": "--version öğesini sıralama davranışı olmayan bir dize olarak yorumlar", + "CmdNewSettingName": "Yeni bildirimin adı", + "CmdNewSettingVersion": "Yeni bildirimin sürümü", + "CmdNewSynposis": "Yeni bildirim oluşturur", + "CmdOwnsExample1": "vcpkg owns ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "İşlemeler arasındaki bağlantı noktası sürümlerindeki değişikliklere ait farklar", + "CmdRegenerateOptDryRun": "Eylemi gerçekleştirmez, yalnızca nelerin yapılabileceğini gösterir", "CmdRegenerateOptForce": "(tehlikeli olabilecek) eyleme onay olmadan devam eder", - "CmdRegenerateOptNormalize": "kullanımdan kaldırma düzeltmelerini uygula", - "CmdRemoveOptDryRun": "Kaldırılacak paketleri yazdır, ancak kaldırma", - "CmdRemoveOptOutdated": "Bağlantı noktası dosyalarıyla eşleşmeyen sürümleri olan tüm paketleri seçin", - "CmdRemoveOptRecurse": "Komut satırında açıkça belirtilmemiş paketlerin kaldırılmasına izin ver", - "CmdSetInstalledOptDryRun": "Gerçekten oluşturma veya yükleme", - "CmdSetInstalledOptNoUsage": "Yüklemeden sonra CMake kullanım bilgilerini yazdırma.", - "CmdSetInstalledOptWritePkgConfig": "Dış ikili önbelleğe alma ile kullanılmak üzere NuGet packages.config ile biçimlendirilmiş bir dosya yazar.\nDaha fazla bilgi için bkz. 'vcpkg help binarycaching'.", + "CmdRegenerateOptNormalize": "Kullanımdan kaldırma düzeltmelerini uygular", + "CmdRemoveExample1": "vcpkg remove ...", + "CmdRemoveOptDryRun": "Kaldırılacak paketleri yazdırır, ancak kaldırmaz", + "CmdRemoveOptOutdated": "Yerleşik kayıt defteriyle eşleşmeyen sürümlere sahip tüm paketleri kaldırır", + "CmdRemoveOptRecurse": "Açıkça belirtilmemiş bağımlı paketlerin kaldırılmasına izin verir", + "CmdSearchExample1": "vcpkg search ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "Gerçekten oluşturmaz veya yüklemez", + "CmdSetInstalledOptNoUsage": "Yüklemeden sonra CMake kullanım bilgilerini yazdırmaz", + "CmdSetInstalledOptWritePkgConfig": "Dış ikili önbelleğe alma ile kullanılmak üzere NuGet packages.config ile biçimlendirilmiş bir dosya yazar. Daha fazla bilgi için bkz. `vcpkg help binarycaching`.", + "CmdSetInstalledSynopsis": "Yüklenen paketlerle sağlanan paketlerin birbirleriyle tam olarak eşleştiği paketleri yükler, yükseltir veya kaldırır", "CmdSettingCopiedFilesLog": "Oluşturulacak kopyalanan dosyalar günlüğü yolu", "CmdSettingInstalledDir": "Kullanılacak yüklü ağaç yolu", "CmdSettingTLogFile": "Oluşturulacak tlog dosyası yolu", "CmdSettingTargetBin": "Analiz edilecek ikili yolu", - "CmdUpdateBaselineOptDryRun": "Planı yürütmeden yazdır", - "CmdUpdateBaselineOptInitial": "`builtin-baseline` öğesini, bu öğeye sahip olmayan bir vcpkg.json dosyasına ekleyin", - "CmdUpgradeOptAllowUnsupported": "Desteklenmeyen bir bağlantı noktasında hata vermek yerine uyarıyla devam et.", + "CmdUpdateBaselineOptDryRun": "Planı yürütme olmadan yazdırır", + "CmdUpdateBaselineOptInitial": "`builtin-baseline` komutunu, bu komuta sahip olmayan bir vcpkg.json dosyasına ekler", + "CmdUpdateBaselineSynopsis": "Bir bildirimdeki git kayıt defterlerinin temellerini bunların HEAD işlemesi değerlerine güncelleştirir", + "CmdUpdateRegistryAll": "Bilinen tüm yapıt kayıt defterlerini güncelleştirir", + "CmdUpdateRegistryAllExcludesTargets": "“Update registry --all” komutu bir yapıt kayıt defterleri listesiyle kullanılamaz", + "CmdUpdateRegistryAllOrTargets": "“Update registry” komutu güncelleştirilecek yapıt kayıt defteri adlarının listesini veya “--all” parametresini gerektirir.", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "Yapıt kayıt defterini yeniden indirir", "CmdUpgradeOptNoDryRun": "Gerçekten yükselt", "CmdUpgradeOptNoKeepGoing": "Hatada paketleri yüklemeyi durdur", + "CmdUseExample1": "vcpkg use ", + "CmdUseSynopsis": "Bu kabukta tek bir yapıtı etkinleştirir", + "CmdVSInstancesSynopsis": "Algılanan Visual Studio örneklerini listeler", "CmdXDownloadOptHeader": "URL'lerden getirilirken kullanılacak ek üst bilgi", "CmdXDownloadOptSha": "İndirilecek dosyanın karması", - "CmdXDownloadOptSkipSha": "İndirilen dosyanın SHA512'sini denetleme", - "CmdXDownloadOptStore": "Dosyanın getirilmesi yerine depolanması gerektiğini belirtir", + "CmdXDownloadOptSkipSha": "İndirilen dosyada SHA512 denetimini atlar", + "CmdXDownloadOptStore": "Dosyayı getirmek yerine önce depolar", "CmdXDownloadOptUrl": "Önbellekte eksikse indirme ve depolama URL'si", + "CmdZApplocalSynopsis": "İkilinin bağımlılıklarını yüklü ağaçtan uygulama yerel dağıtımı için bu ikilinin konumunun bulunduğu yere kopyalar", + "CmdZExtractExample1": "vcpkg z-extract <çıkış dizini>", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "Tüm yollardan kaldırılacak olan baştaki dizinlerin sayısı", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", "CommandFailed": "command:\n{command_line}\n komutu aşağıdaki sonuçlarla başarısız oldu:", - "Commands": "Komutlar:", - "CommunityTriplets": "VCPKG topluluğu üçlüleri:", + "CommunityTriplets": "Topluluk Üçlüleri:", "ComparingUtf8Decoders": "Farklı kökene sahip Utf8Decoder'ların karşılaştırılması; bu her zaman bir hatadır", "CompressFolderFailed": "\"{path}\" klasörü sıkıştırılamadı:", "ComputingInstallPlan": "Yükleme planı işleniyor...", "ConfigurationErrorRegistriesWithoutBaseline": "{path} yolunda tanımlanan yapılandırma geçersiz.\n\nKayıt defterlerini kullanmak, varsayılan kayıt defteri için bir taban çizgisinin ayarlanmış veya varsayılan kayıt defterinin null olmasını gerektirir.\n\nDaha fazla ayrıntı için {url} adresine gidin.", "ConfigurationNestedDemands": "[\"{json_field}\"], iç içe geçmiş bir `demands` nesnesi içeriyor (iç içe geçmiş `demands`in hiçbir etkisi yoktur)", "ConflictingFiles": "Aşağıdaki dosyalar zaten {path} yolunda yüklü ve {spec} ile çakışıyor", + "ConsideredVersions": "Aşağıdaki yürütülebilir dosyalar dikkate alındı ancak {version} gereksinimi nedeniyle atıldı:", "ConstraintViolation": "Bir kısıtlama ihlali bulundu:", "ContinueCodeUnitInStart": "başlangıç konumunda devam kodu birimi bulundu", "ControlAndManifestFilesPresent": "Bağlantı noktası dizininde hem bildirim dosyası hem de KONTROL dosyası bulunur: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "Veritabanı bozuk.", "CorruptedInstallTree": "vcpkg 'kurulu' ağacınız bozuk.", "CouldNotDeduceNugetIdAndVersion": "{path} dosya adından NuGet kimliği ve sürümü çıkarılamadı", - "CouldNotFindBaseline": "{path} temel dosyasında açıkça belirtilen temel \"\"{commit_sha}\"` bulunamadı", - "CouldNotFindBaselineForRepo": "{package_name} deposu için temel \"\"{commit_sha}\"\" bulunamadı", - "CouldNotFindBaselineInCommit": "{package_name} deposundan `\"{commit_sha}\"` taahhüdünde temel bulunamadı:", + "CouldNotFindBaselineInCommit": "{package_name} için {commit_sha} konumunda {url} içinde temel bulunamadı.", "CouldNotFindGitTreeAtCommit": "{commit_sha} işleminde {package_name} deposundaki \"sürümler\" için git ağacı bulunamadı", "CouldNotFindToolVersion": "{path} içinde bulunamadı", "CouldNotFindVersionDatabaseFile": "Sürümler veritabanı dosyası bulunamadı: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "VCPKG_DEFAULT_BINARY_CACHE ortam değişkeni bir dizin olmalıdır (önceden: {yol})", "DefaultBinaryCacheRequiresAbsolutePath": "VCPKG_DEFAULT_BINARY_CACHE ortam değişkeni mutlak olmalı (önceden: {path})", "DefaultBinaryCacheRequiresDirectory": "VCPKG_DEFAULT_BINARY_CACHE ortam değişkeni bir dizin olmalıdır (önceden: {yol})", - "DefaultBrowserLaunched": "Varsayılan tarayıcı {url} olarak başlatıldı.", + "DefaultFeatureCore": "\"core\" özelliği varsayılan özellikleri kapatır ve bu nedenle varsayılan özellikler listesinde olamaz", + "DefaultFeatureDefault": "\"default\" özelliği varsayılan özellikler kümesine başvurur ve bu nedenle varsayılan özellikler listesinde olamaz", + "DefaultFeatureIdentifier": "varsayılan özelliklerin adları tanımlayıcı olmalıdır", "DefaultFlag": "Varsayılan olarak --{option} açık olarak ayarlanıyor.", "DefaultRegistryIsArtifact": "Varsayılan kayıt defteri yapıt kayıt defteri olamaz.", - "DefaultTriplet": "Eylül 2023 sürümünden başlayarak, vcpkg kitaplıkları için varsayılan üçlü, x86 pencerelerinden algılanan ana bilgisayar üçlüsüne ({üçlü}) değişecektir. Bu mesajı çözmek için, aynı davranışı sürdürmek üzere --triplet x86-windows ekleyin.", + "DefaultTripletChanged": "Eylül 2023 sürümünden başlayarak, vcpkg kitaplıkları için varsayılan üçlü, x86-windows yerine algılanan ana bilgisayar üçlüsüne ({triplet}) olarak değiştirilecek. Eski davranış için --triplet x86-windows ekleyin. Bu mesajı kaldırmak için --triplet {triplet} ekleyin.", "DeleteVcpkgConfigFromManifest": "-- Veya \"vcpkg-configuration\" öğesini {path} bildirim dosyasından kaldırın.", + "DependencyFeatureCore": "\"core\" özelliği bir bağımlılığın özellik listesinde olamaz. Varsayılan özellikleri kapatmak için bunun yerine \"default-features\": false ekleyin.", + "DependencyFeatureDefault": "\"default\" özelliği bir bağımlılığın özellik listesinde olamaz. Varsayılan özellikleri açmak için bunun yerine \"default-features\": true ekleyin.", + "DependencyGraphCalculation": "Bağımlılık grafiği gönderme etkinleştirildi.", + "DependencyGraphFailure": "Bağımlılık grafiği gönderme başarısız oldu.", + "DependencyGraphSuccess": "Bağımlılık grafiği başarıyla gönderildi.", "DeprecatedPrefabDebugOption": "--prefab-debug artık kullanımdan kaldırıldı.", "DetectCompilerHash": "Üçlü {triplet} için derleyici karması algılanamadı...", "DocumentedFieldsSuggestUpdate": "Bunlar, tanınması gereken belgelenmiş alanlarsa, vcpkg aracını güncellemeyi deneyin.", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "Dosya beklenen karmayı içermiyor:\nURL: {url}\nDosya: {path}\nBeklenen karma: {expected}\nGerçek karma: {actual}", "DownloadFailedRetrying": "İndirme başarısız - {value} ms sonra yeniden denenecek", "DownloadFailedStatusCode": "{url} URL’si {value} durum koduyla başarısız oldu", - "DownloadRootsDir": "İndirmeler kök dizinini belirtin.\n(varsayılan: {env_var})", + "DownloadRootsDir": "Dizini indirir (default: {env_var})", "DownloadWinHttpError": "{system_api} {url} URL’si {exit_code} çıkış koduyla başarısız oldu", "DownloadedSources": "{spec} için indirilen kaynaklar", "DownloadingPortableToolVersionX": "Uygun bir {tool_name} sürümü bulunamadı (gerekli v{version}) Taşınabilir {tool_name} {version} indiriliyor...", "DownloadingTool": "{tool_name} indiriliyor...\n{url}->{path}", "DownloadingUrl": "{url} URL’si indiriliyor", - "DownloadingVcpkgCeBundle": "vcpkg-artifacts paketi {version} indiriliyor...", - "DownloadingVcpkgCeBundleLatest": "En son vcpkg-artifacts paketi indiriliyor...", "DownloadingVcpkgStandaloneBundle": "Tek başına paket {version} indiriliyor.", "DownloadingVcpkgStandaloneBundleLatest": "En son tek başına paket indiriliyor.", "DuplicatePackagePattern": "Paket \"{package_name}\" yineleniyor.", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "derleyici bilgileri algılanırken:\n \"{path}\" konumundaki günlük dosyası içeriği şu şekildedir:", "ErrorIndividualPackagesUnsupported": "Bildirim modunda `vcpkg install`, paket bağımsız değişkenlerini tek tek desteklemez.\nEk paketleri yüklemek için vcpkg.json dosyasını düzenleyin ve paket bağımsız değişkenleri olmadan `vcpkg install` komutunu çalıştırın.", "ErrorInvalidClassicModeOption": "--{option} seçeneği klasik modda desteklenmiyor ve bildirim bulunamadı.", + "ErrorInvalidExtractOption": "--{option} negatif olmayan bir tamsayıya veya 'AUTO' değerine ayarlanmalıdır.", "ErrorInvalidManifestModeOption": "--{option} seçeneği bildirim modunda desteklenmiyor.", "ErrorMessage": "hata: ", "ErrorMessageMustUsePrintError": "{value} adlı ileti error: ile başlıyor, bunun yerine kodun başına ErrorMessage eklenecek şekilde değiştirilmesi gerekiyor.", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "{path} ayrıştırılırken hatalar oluştu.", "ErrorWhileWriting": "{path} yazılırken hata oluştu.", "ErrorsFound": "Aşağıdaki hataları bulundu:", - "Example": "örnek:", + "ExamplesHeader": "Örnekler:", "ExceededRecursionDepth": "Özyineleme derinliği aşıldı.", "ExcludedPackage": "Dışlanan {spec}", "ExcludedPackages": "Aşağıdaki paketler hariç tutuldu:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "Bakım aracı dışa aktarılıyor...", "ExportingPackage": "{package_name} dışa aktarılıyor...", "ExtendedDocumentationAtUrl": "Genişletilmiş belgelere şuradan ulaşılabilir: '{url}'.", + "ExtractHelp": "Arşivi ayıklar.", "ExtractingTool": "{tool_name} ayıklanıyor...", "FailedPostBuildChecks": "Derleme sonrası {count} denetim sorunu bulundu. Bu bağlantı noktalarını seçki olarak sunulan kataloglara göndermek için lütfen önce portfile’ı düzeltin: {path}", "FailedToAcquireMutant": "değişken {path} alınamadı", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "Geçerli commit belirlenemedi:", "FailedToDownloadFromMirrorSet": "Ayna setinden indirilemedi", "FailedToExtract": "\"{path}\" ayıklanamadı:", - "FailedToFetchError": "{error_msg}\n {package_name} getirilemedi:", - "FailedToFindBaseline": "Baseline.json bulunamadı", + "FailedToFetchRepo": "{url} getirilemedi.", "FailedToFindPortFeature": "{package_name} paketinin {feature} adlı bir özelliği yok.", "FailedToFormatMissingFile": "Biçimlendirilecek dosya yok. \nLütfen biçimlendirmek veya dönüştürmek için --all veya açık dosyaları iletin.", "FailedToLoadInstalledManifest": "Aşağıdaki hata nedeniyle {package_name} için denetim veya bildirim dosyası yüklenemedi. Lütfen {package_name} belirtimini kaldırıp yeniden deneyin.", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "{path} dizininde dosya sistemi kilidi alınamadı", "FailedToWriteManifest": "{path} manifest dosyası yazılamadı", "FailedVendorAuthentication": "Bir veya daha fazla {vendor} kimlik bilgisi sağlayıcısı kimlik doğrulaması yapamadı. Kimlik bilgilerini sağlama hakkında daha fazla ayrıntı için bkz. '{url}'.", - "FeedbackAppreciated": "Geri bildiriminiz için teşekkür ederiz!", "FetchingBaselineInfo": "Temel bilgiler {package_name}...", "FetchingRegistryInfo": "{url}'dan ({value}) kayıt defteri bilgileri alınıyor...", "FieldKindDidNotHaveExpectedValue": "\"tip\" beklenen değer değildi: (beklenen değer: {expected}; gerçek değer: {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "Aşağıdaki dosyalarda mutlak yollar bulundu:", "FilesExported": "{path} konumunda dışa aktarılan dosyalar", "FindHelp": "Belirtilen yapıtı veya bağlantı noktasını arar. 'artifact' veya 'port' sonrasında parametre yoksa, her şeyi görüntüler.", + "FindVersionArtifactsOnly": "--version, vcpkg arama veya vcpkg bulma bağlantı noktası ile kullanılamaz", "FishCompletion": "vcpkg balık tamamlama zaten \"{path}\" konumuna eklendi.", "FloatingPointConstTooBig": "Kayan nokta sabiti çok büyük: {count}", "FollowingPackagesMissingControl": "Aşağıdaki paketlerin geçerli bir CONTROL veya vcpkg.json değeri yok:", "FollowingPackagesNotInstalled": "Aşağıdaki paketler yüklü değil:", "FollowingPackagesUpgraded": "Aşağıdaki paketler günceldir:", + "ForMoreHelp": "Daha Fazla Yardım Alın", "ForceSystemBinariesOnWeirdPlatforms": "VCPKG_FORCE_SYSTEM_BINARIES ortam değişkeni arm, s390x, ppc64le ve riscv platformlarında ayarlanmalıdır.", "FormattedParseMessageExpression": "{value} ifadesinde", "GHAParametersMissing": "GHA ikili kaynağı, ACTIONS_RUNTIME_TOKEN ve ACTIONS_CACHE_URL ortam değişkenlerinin ayarlanmasını gerektiriyor. Ayrıntılar için {url} adresine gidin.", @@ -470,7 +590,7 @@ "GitCommandFailed": "Şu komut yürütülemedi: {command_line}", "GitFailedToFetch": "{url} deposundan ref {value} getirilemedi", "GitFailedToInitializeLocalRepository": "yerel depo {path} başlatılamadı", - "GitRegistryMustHaveBaseline": "\"{package_name}\" için git kayıt defteri girdisi, geçerli bir git commit SHA (40 onaltılık karakter) olan bir \"temel\" alana sahip olmalıdır.\nBu deponun mevcut HEAD'i \"{value}\".", + "GitRegistryMustHaveBaseline": "Git kayıt defteri \"{url}\", geçerli bir git taahhüt SHA'sı (40 onaltılık karakter) olan bir \"temel\" alana sahip olmalıdır.\nGeçerli en son sürümleri kullanmak için tabanı bu deponun HEAD'i olan \"{commit_sha}\" olarak ayarlayın.", "GitStatusOutputExpectedFileName": "bir dosya adı bekleniyor", "GitStatusOutputExpectedNewLine": "beklenen yeni satır", "GitStatusOutputExpectedRenameOrNewline": "beklenen yeniden adlandırılmış dosya veya yeni satırlar", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "git, {command_line} çalıştırırken beklenmeyen çıktı üretti", "GraphCycleDetected": "{package_name} paketindeki grafik içinde döngü algılandı:", "HashFileFailureToRead": "karma için \"{path}\" dosyası okunamadı: ", + "HashPortManyFiles": "{package_name}, {count} dosya içeriyor. İkili önbelleğe alma için ABI karmasını belirlerken bu içeriklerin karma hale getirilmesi uzun zaman alabilir. Dosya sayısını azaltmayı düşünün. Bunun yaygın nedenleri, yanlışlıkla kaynak veya derleme dosyalarını bir bağlantı noktasının dizinine teslim etmektir.", "HeaderOnlyUsage": "{package_name} yalnızca üst bilgidir ve CMake'ten şu şekilde kullanılabilir:", "HelpAssetCaching": "**Deneysel özellik: bu herhangi bir zamanda değişebilir veya kaldırılabilir**\n\nvcpkg, indirilen varlıkları önbelleğe almak için aynaları kullanabilir ve orijinal kaynak değişse veya kaybolsa bile çalışmaya devam etmesini sağlar.\n\nVarlık önbelleğe alma, X_VCPKG_ASSET_SOURCES ortam değişkenini noktalı virgülle ayrılmış bir kaynak listesine ayarlayarak veya bir dizi --x-asset-sources= komut satırı seçeneği geçirerek yapılandırılabilir. Komut satırı kaynakları, ortam kaynaklarından sonra yorumlanır. Virgüller, noktalı virgüller ve ters tikler, ters tik (`) kullanılarak kaçılabilir.\n\nBelirli dizeler için isteğe bağlı parametresi, bunlara nasıl erişileceğini denetler. \"Read\", \"write\" veya \"readwrite\" olarak belirtilebilir ve varsayılan olarak \"read\" şeklindedir.\n\nGeçerli kaynaklar:", "HelpAssetCachingAzUrl": "İsteğe bağlı olarak Paylaşılan Erişim İmzası doğrulamasını kullanarak bir Azure Blob Depolama kaynağı ekler. URL, kapsayıcı yolunu içermeli ve sonunda bir \"/\" ile sonlandırılmalıdır. , tanımlanmışsa, önüne \"?\" eklenmelidir. Azure dışı sunucular, \"\" biçimindeki GET ve PUT isteklerine yanıt verirlerse de çalışır.", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "NuGet ağ işlemleri için bir NuGet zaman aşımı belirtir; NuGet CLI'nin \"-Timeout\" parametresine eşdeğerdir.", "HelpBuiltinBase": "Temel, grafikteki her bağımlılık için minimum bir sürüm oluşturan vcpkg deposundaki bir taahhüdü referans alır. Örneğin, başka bir kısıtlama belirtilmemişse (doğrudan veya geçişli olarak), sürüm en üst düzey bildirimin taban çizgisine çözülecektir. Geçişli bağımlılıkların temelleri yok sayılır.", "HelpCachingClear": "Varsayılanlar dahil olmak üzere önceki tüm kaynakları kaldırır.", - "HelpContactCommand": "Geri bildirim göndermek için iletişim bilgilerini görüntüleyin.", - "HelpCreateCommand": "Yeni bir bağlantı noktası oluşturun.", - "HelpDependInfoCommand": "Bağlantı noktaları için bağımlılıkların bir listesini görüntüleyin.", - "HelpEditCommand": "Düzenleme için bir bağlantı noktası açın (bir düzenleyici prograı ayarlamak için '{env_var}' ortam değişkenini kullanın, varsayılan olarak 'code' ayarlıdır).", - "HelpEnvCommand": "Geliştirme veya derleme için temiz bir kabuk ortamı oluşturur.", - "HelpExampleCommand": "Daha fazla yardım için (örnekler dahil) beraberindeki README.md ve belgeler klasörüne bakın.", + "HelpContactCommand": "Geri bildirim göndermek için iletişim bilgilerini görüntüler", + "HelpCreateCommand": "Yeni bir bağlantı noktası oluşturur", + "HelpDependInfoCommand": "Bağlantı noktaları için bağımlılıkların bir listesini görüntüler", + "HelpEditCommand": "Bağlantı noktasını isteğe bağlı olarak {env_var} ortam değişkeni ile düzenler ve varsayılan olarak \"code\" olarak ayarlar", + "HelpEnvCommand": "Geliştirme veya derleme için temiz bir kabuk ortamı oluşturur", + "HelpExampleCommand": "Daha fazla yardım (örnekler dahil) için bkz. https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "Örnek bildirim:", "HelpExportCommand": "Paketi dışarı aktarır.", - "HelpFormatManifestCommand": "Tüm vcpkg.json dosyalarını biçimlendirir. vcpkg yürütmesinden önce bunu çalıştırın.", "HelpHashCommand": "Bir dosyayı belirli bir algoritmaya göre karma, varsayılan SHA512.", - "HelpInitializeRegistryCommand": " dizininde bir kayıt defteri başlatır.", - "HelpInstallCommand": "Paket yükleyin.", - "HelpListCommand": "Yüklü paketleri listele.", + "HelpInstallCommand": "Paketi yükler", + "HelpListCommand": "Yüklü paketleri listeler", "HelpManifestConstraints": "Bildirimler, kullanılan versiyonlara üç çeşit kısıtlama getirebilir", "HelpMinVersion": "Vcpkg, grafikteki herhangi bir \"sürüm>=\" kısıtlamasının yanı sıra üst düzeyde belirtilen taban çizgisinden gelen sürüm de dahil olmak üzere tüm geçerli kısıtlamalarla eşleşen bulunan minimum sürümü seçecektir.", "HelpOverrides": "Üst düzey bildirim olarak kullanıldığında (örneğin, dizinde \"vcpkg yükleme\" çalıştırılırken), geçersiz kılmalar bir bildirimin bağımlılık çözümlemesini kısa devre yapmasına ve tam olarak kullanılacak sürümü belirtmesine izin verir. Bunlar, \"versiyon-dize\" bağımlılıkları gibi sürüm çakışmalarını işlemek için kullanılabilir. Geçişli olarak bağlı olduklarında dikkate alınmayacaktır.", - "HelpOwnsCommand": "Yüklü paketlerde dosyaları ara.", + "HelpOwnsCommand": "Yüklü paketlerde bir dosyanın sahibini arar", "HelpPackagePublisher": "Ek olarak, paket yayıncıları, tüketicilerin belirli bir bağımlılığın en azından belirli bir minimum sürümünü kullanmasını sağlamak için \"version>=\" kısıtlamalarını kullanabilir. Örneğin, bir kitaplığın 1.70'te boost-asio'ya eklenen bir API'ye ihtiyacı varsa, bir \"sürüm>=\" kısıtlaması, geçişli kullanıcıların bireysel sürüm geçersiz kılmaları veya kayıtlar arası referanslar karşısında bile yeterli bir sürüm kullanmasını sağlayacaktır.", "HelpPortVersionScheme": "Her sürümde ayrıca negatif olmayan bir tamsayı olan bir \"bağlantı noktası sürümü\" vardır. Metin olarak işlendiğinde, bağlantı noktası sürümü (sıfır değilse), bir kare (#) ile ayrılmış birincil sürüm metnine bir son ek olarak eklenir. Bağlantı noktası sürümleri, birincil sürüm metninden sonra sözlüksel olarak sıralanır, örneğin: \n 1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "Bir paketi kaldırın.", - "HelpRemoveOutdatedCommand": "Güncel olmayan tüm paketleri kaldırın.", - "HelpResponseFileCommand": "Ek parametreler sağlamak için bir yanıt dosyası belirtin.", - "HelpSearchCommand": "Derlemek için uygun olan paketleri ara.", - "HelpTextOptFullDesc": "Uzun metni kesme.", - "HelpTopicCommand": "Belirli bir konu için yardım görüntüleyin.", - "HelpTopicsCommand": "Yardım konularının listesini görüntüleyin.", - "HelpTxtOptAllowUnsupportedPort": "Desteklenmeyen bir bağlantı noktasında hata vermek yerine uyarıyla devam et.", - "HelpTxtOptCleanAfterBuild": "Her paketi oluşturduktan sonra derleme ağaçlarını, paketleri ve indirmeleri temizle.", - "HelpTxtOptCleanBuildTreesAfterBuild": "Her paketi oluşturduktan sonra derleme ağaçlarını temizle.", - "HelpTxtOptCleanDownloadsAfterBuild": "Her paketi oluşturduktan sonra indirmeleri temizle.", - "HelpTxtOptCleanPkgAfterBuild": "Her paketi oluşturduktan sonra paketleri temizle.", - "HelpTxtOptDryRun": "Gerçekten oluşturma veya yükleme.", - "HelpTxtOptEditable": "Komut satırında kitaplıklar için kaynak yeniden ayıklamayı ve ikili önbelleğe almayı devre dışı bırak (klasik mod)", - "HelpTxtOptEnforcePortChecks": "Bağlantı noktası sorun algılamışsa veya kullanım dışı bırakılmış bir özelliği kullanma girişiminde bulunursa yükleme başarısız olsun", - "HelpTxtOptKeepGoing": "Hata durumunda paketleri yüklemeye devam et.", - "HelpTxtOptManifestFeature": "Üst düzey bildirimden yüklenecek ek özellik (bildirim modu).", - "HelpTxtOptManifestNoDefault": "Varsayılan özellikleri en üst düzey bildirimden yükleme (bildirim modu).", - "HelpTxtOptNoDownloads": "Yeni kaynakları indirme.", - "HelpTxtOptNoUsage": "Yüklemeden sonra CMake kullanım bilgilerini yazdırma.", - "HelpTxtOptOnlyBinCache": "Önbelleğe alınan ikili dosyalar kullanılamıyorsa işlem başarısız olsun.", - "HelpTxtOptOnlyDownloads": "Kaynakları derlemeden indirmek için en yüksek eforlu denemeyi gerçekleştir.", - "HelpTxtOptRecurse": "Yüklemenin parçası olarak paketlerin kaldırılmasına izin ver.", - "HelpTxtOptUseAria2": "İndirme görevlerini gerçekleştirmek için aria2 kullan.", - "HelpTxtOptUseHeadVersion": "Komut satırındaki kitaplıkları en son yukarı akış kaynaklarını kullanarak yükle (klasik mod).", - "HelpTxtOptWritePkgConfig": "Dış ikili önbelleğe alma ile kullanılmak üzere NuGet packages.config ile biçimlendirilmiş bir dosya yazar.\nDaha fazla bilgi için bkz. 'vcpkg help binarycaching'.", - "HelpUpdateBaseline": "Kitaplıklarınızı güncel tutmak için en iyi yaklaşım, temel referansınızı güncellemektir. Bu, geçişli olanlar da dahil olmak üzere tüm paketlerin güncellenmesini sağlayacaktır. Ancak bir paketi bağımsız olarak güncellemeniz gerekiyorsa, bir \"version>=\" kısıtlaması kullanabilirsiniz.", - "HelpUpdateCommand": "Güncelleştirilebilir paketleri listele.", - "HelpUpgradeCommand": "Tüm eski paketleri yeniden oluşturun.", - "HelpVersionCommand": "Sürüm bilgilerini görüntüleyin.", + "HelpRemoveCommand": "Paketi kaldırır", + "HelpResponseFileCommand": "Bu konumda genişletilen satır başına bir bağımsız değişken içerir", + "HelpSearchCommand": "Derlemek için uygun olan paketleri arar", + "HelpTextOptFullDesc": "Uzun metni kesmez", + "HelpTopicCommand": "Belirli bir yardım konusunu görüntüler", + "HelpTopicsCommand": "Yardım konularının tam listesini görüntüler", + "HelpTxtOptAllowUnsupportedPort": "Başarısız olmak yerine desteklenmeyen bağlantı noktalarında uyarıyla devam eder", + "HelpTxtOptCleanAfterBuild": "Her paketi oluşturduktan sonra derleme ağaçlarını, paketleri ve indirmeleri temizler", + "HelpTxtOptCleanBuildTreesAfterBuild": "Her paketi oluşturduktan sonra derleme ağaçlarını temizler", + "HelpTxtOptCleanDownloadsAfterBuild": "Her paketi oluşturduktan sonra indirmeleri temizler", + "HelpTxtOptCleanPkgAfterBuild": "Her paketi oluşturduktan sonra paketleri temizler", + "HelpTxtOptDryRun": "Gerçekten oluşturmaz veya yüklemez", + "HelpTxtOptEditable": "Komut satırında kitaplıklar için kaynak yeniden ayıklamayı ve ikili önbelleğe almayı devre dışı bırakır (klasik mod)", + "HelpTxtOptEnforcePortChecks": "Bağlantı noktası sorun algılamışsa veya kullanım dışı bırakılmış bir özelliği kullanma girişiminde bulunursa yükleme başarısız olur", + "HelpTxtOptKeepGoing": "Hata durumunda paketleri yüklemeye devam eder", + "HelpTxtOptManifestFeature": "Üst düzey bildirimden yüklenecek ek özellikler (bildirim modu)", + "HelpTxtOptManifestNoDefault": "Varsayılan özellikleri en üst düzey bildirimden yüklemez (bildirim modu)", + "HelpTxtOptNoDownloads": "Yeni kaynakları indirmez", + "HelpTxtOptNoUsage": "Yüklemeden sonra CMake kullanım bilgilerini yazdırmaz", + "HelpTxtOptOnlyBinCache": "Önbelleğe alınan ikili dosyalar kullanılamıyorsa işlem başarısız olur", + "HelpTxtOptOnlyDownloads": "Kaynakları derlemeden indirmek için en yüksek eforlu denemeyi gerçekleştirir", + "HelpTxtOptRecurse": "Yüklemenin parçası olarak paketlerin kaldırılmasına izin verir", + "HelpTxtOptUseAria2": "İndirme görevlerini gerçekleştirmek için aria2 kullanır", + "HelpTxtOptUseHeadVersion": "Komut satırındaki kitaplıkları en son yukarı akış kaynaklarını kullanarak yükler (klasik mod)", + "HelpTxtOptWritePkgConfig": "Dış ikili önbelleğe alma ile kullanılmak üzere NuGet packages.config ile biçimlendirilmiş bir dosya yazar. Daha fazla bilgi için bkz. `vcpkg help binarycaching`.", + "HelpUpdateBaseline": "Kitaplıklarınızı güncel tutmak için en iyi yaklaşım, temel başvuru kaynağınızı güncellemektir. Bu, geçişli olanlar da dahil olmak üzere tüm paketlerin güncellenmesini sağlayacaktır. Ancak bir paketi bağımsız olarak güncellemeniz gerekiyorsa, bir \"version>=\" kısıtlaması kullanabilirsiniz.", + "HelpUpdateCommand": "Yükseltilebilen paketleri listeler", + "HelpUpgradeCommand": "Tüm eski paketleri yeniden derler", + "HelpVersionCommand": "Sürüm bilgilerini görüntüler", "HelpVersionDateScheme": "Tarih (2021-01-01.5)", "HelpVersionGreater": "\"Bağımlılıklar\" alanında, her bağımlılığın listelenen minimum bir kısıtlaması olabilir. Bu minimum kısıtlamalar, bu kütüphaneye bağlı olarak geçişli olarak kullanılacaktır. Minimum bağlantı noktası sürümü ayrıca bir '#' soneki ile belirtilebilir.", "HelpVersionScheme": "Noktayla ayrılmış bir sayı dizisi (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "Yanlış arşiv dosyası imzası", "IncorrectPESignature": "Yanlış PE imzası", "IncrementedUtf8Decoder": "Dize sonunda artan Utf8Decoder", - "InfoSetEnvVar": "Ayrıca '{env_var}' ortam değişkenini istediğiniz düzenleyiciye ayarlayabilirsiniz.", + "InfoSetEnvVar": "Ayrıca {env_var} ortam değişkenini istediğiniz düzenleyiciye ayarlayabilirsiniz.", "InitRegistryFailedNoRepo": "Bu bir git deposu kökü olmadığından {path} yolunda kayıt defteri oluşturulamadı.\nBu klasörde bir git deposu oluşturmak için 'git init {command_line}' kullanın.", "InstallCopiedFile": "{path_source} -> {path_destination} bitti", "InstallFailed": "başarısız oldu: {path}: {error_msg}", "InstallPackageInstruction": "Bir proje açıkken Araçlar->NuGet Paket Yöneticisi->Paket Yöneticisi Konsolu’na gidin ve yapıştırın:\n Install-Package \"{value}\" -Source \"{path}\"", - "InstallRootDir": "(Deneysel) Yükleme kök dizinini belirtin.", + "InstallRootDir": "Yüklü dizin (deneysel)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} atlandı, güncel", "InstallWithSystemManager": "Bu aracı sistem paket yöneticiniz aracılığıyla yükleyebilirsiniz.", "InstallWithSystemManagerMono": "Ubuntu 18.04 kullanıcıları daha yeni bir Mono sürümüne gerek duyabilir, şuradan edinebilirsiniz: {url}.", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- Bağlantı noktası şu konumdan yükleniyor: {path}", "InstallingMavenFile": "{path} Maven dosyasını yüklüyor", "InstallingPackage": "{action_index}/{count} {spec} yükleniyor...", - "IntegrateBashHelp": "Bash sekmesi tamamlamayı etkinleştirin.", - "IntegrateFishHelp": "Balık sekmesi tamamlamayı etkinleştirin.", - "IntegrateInstallHelpLinux": "Yüklü paketleri kullanıcı genelinde kullanılabilir hale getirin.", - "IntegrateInstallHelpWindows": "Yüklü paketleri kullanıcı genelinde kullanılabilir hale getirin. İlk kullanımda yönetici ayrıcalıkları gerektirir.", - "IntegratePowerShellHelp": "PowerShell sekme tamamlamayı etkinleştirin.", - "IntegrateProjectHelp": "Bireysel VS proje kullanımı için bir referanslama NuGet paketi oluşturun.", - "IntegrateRemoveHelp": "Kullanıcı genelinde tümleştirmeyi kaldırın.", - "IntegrateZshHelp": "Zsh sekmesi tamamlamayı etkinleştirin.", - "IntegrationFailed": "Integral alma uygulanmadı.", + "IntegrateBashHelp": "bash sekme tamamlamayı etkinleştirir. Yalnızca Windows olmayanlarda yapılabilir.", + "IntegrateFishHelp": "fish sekme tamamlamayı etkinleştirir. Yalnızca Windows olmayanlarda yapılabilir.", + "IntegrateInstallHelpLinux": "Yüklü paketleri kullanıcı genelinde kullanılabilir hale getirir", + "IntegrateInstallHelpWindows": "Yüklü paketleri kullanıcı genelinde kullanılabilir hale getirir. İlk kullanımda yönetici ayrıcalıkları gerektirir.", + "IntegrateNonWindowsOnly": "{command_line} yalnızca Windows'a özgü değildir ve bu sistemde desteklenmez.", + "IntegratePowerShellHelp": "PowerShell sekme tamamlamayı etkinleştirir. Yalnızca Windows olanlarda yapılabilir.", + "IntegrateProjectHelp": "Bireysel Visual Studio projesi kullanımı için referans veren bir NuGet paketi oluşturur. Yalnızca Windows olanlarda yapılabilir.", + "IntegrateRemoveHelp": "Kullanıcı genelinde tümleştirmeyi kaldırır", + "IntegrateWindowsOnly": "{command_line} yalnızca Windows'a yöneliktir ve bu sistemde desteklenmez.", + "IntegrateZshHelp": "zsh sekme tamamlamayı etkinleştirir. Yalnızca Windows olmayanlarda yapılabilir.", + "IntegrationFailedVS2015": "Visual Studio 2015 için tümleştirme uygulanmadı.", "InternalCICommand": "vcpkg ci, uyumsuz bir şekilde değişebilecek veya herhangi bir zamanda kaldırılabilecek bir iç komuttur.", "InternalErrorMessage": "iç hata: ", "InternalErrorMessageContact": "Sorunu yeniden oluşturmak için https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug sayfasındaki ayrıntılı adımları izleyerek bir sorun açın.", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg c tarzı yorumları desteklemez, ancak çoğu nesne $-prefixed alanlarının yorum olarak kullanılmasına izin verir.", "InvalidCommitId": "Geçersiz taahhüt kimliği: {commit_sha}", "InvalidDefaultFeatureName": "'default' ayrılmış bir özellik adıdır", - "InvalidDependency": "bağımlılıklar küçük alfasayısal karakterlerden ve kısa çizgiden oluşmalıdır ve ayrılmış adlardan biriyle oluşturulamaz", "InvalidFeature": "özellikler küçük alfasayısal karakterlerden ve kısa çizgiden oluşmalıdır ve ayrılmış adlardan biriyle oluşturulamaz", "InvalidFileType": "başarısız oldu: {path} dosya türünü işleyemiyor", "InvalidFilename": "Dosya adı geçersiz karakterler {value} içeremez, ancak {path} geçersizdi", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "Kitaplık geçersizdi: bağlayıcı üyesi bulunamadı.", "InvalidLinkage": "Geçersiz {system_name} bağlantı türü: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "geçersiz mantıksal ifade, beklenmeyen karakter", - "InvalidLogicExpressionUsePipe": "geçersiz mantıksal ifade, 'ya da' yerine '|' kullanın", + "InvalidLogicExpressionUsePipe": "geçersiz mantıksal ifade, 'or' yerine '|' kullanılmalı", "InvalidNoVersions": "Dosyada sürüm yok.", "InvalidOptionForRemove": "'remove' kitaplıkları veya '--outdated' seçeneğini kabul ediyor", "InvalidPortVersonName": "Geçersiz bağlantı noktası sürümü dosya adı bulundu: `{path}`.", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "[\"{json_field}\"] değeri bir nesne olmalıdır", "JsonFieldNotString": "[\"{json_field}\"] değeri bir dize olmalıdır", "JsonFileMissingExtension": "JSON dosyası {path} bir .json (tümü küçük harf) uzantısına sahip olmalıdır", - "JsonSwitch": "(Deneysel) JSON çıktısı isteyin.", + "JsonSwitch": "Düz metin yerine JSON yazdırır", "JsonValueNotArray": "json değeri bir dizi değil", "JsonValueNotObject": "json değeri bir nesne değil", "JsonValueNotString": "json value is not a string", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "Dinamik Sürüm (/MD)", "LinkageStaticDebug": "Statik Hata Ayıklama (/MTd)", "LinkageStaticRelease": "Statik Yayın (/MT)", - "ListHelp": "Bağımsız değişken aranılacak bir alt dize olmalıdır ya da yüklü tüm kitaplıkları görüntülemek için bağımsız değişken olmamalıdır.", + "ListHelp": "Yüklü kitaplıkları listeler", "ListOfValidFieldsForControlFiles": "Bu, CONTROL dosyaları (büyük/küçük harfe duyarlı) için geçerli alanların listesidir:", "LoadingCommunityTriplet": "-- [COMMUNITY] Üçlü yapılandırma şuradan yükleniyor: {path}", "LoadingDependencyInformation": "{count} paket için bağımlılık bilgileri yükleniyor...", @@ -708,7 +827,6 @@ "MultiArch": "Çoklu Mimari 'aynı' olması gerekirken {option} oldu", "MultipleFeatures": "{package_name}, {feature} ögesini birden çok tanımlıyor; lütfen özelliklerin farklı adlara sahip olduğundan emin olun", "MutuallyExclusiveOption": "--{value}, --{option} ile kullanılamaz.", - "NavigateToNPS": "Lütfen tercih ettiğiniz tarayıcıda {url} adresine gidin.", "NewConfigurationAlreadyExists": "Bir bildirim oluşturmak, {path} konumunda bir vcpkg-configuration.json dosyasının üzerine yazar.", "NewManifestAlreadyExists": "{path} yolunda bir bildirim zaten mevcut.", "NewNameCannotBeEmpty": "--name boş olamaz.", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "C++ kitaplıklarına yönelik bir bildirim oluşturmak için --name ve --version belirtin ya da bildirimin bağlantı noktası olarak kullanılmaya yönelik olmadığını belirtmek için --application belirtin.", "NewVersionCannotBeEmpty": "--version boş olamaz.", "NoArgumentsForOption": "--{option} seçeneği bir bağımsız değişken kabul etmez.", - "NoCachedPackages": "Önbelleğe alınan paket yok.", "NoError": "hata yok", "NoInstalledPackages": "Yüklü paket yok. \"Ara\" mı demek istiyorsunuz?", "NoLocalizationForMessages": "Şunlar için yerelleştirilmiş ileti yok: ", @@ -739,11 +856,13 @@ "OptionRequiresAValue": "'{option}' seçeneği bir değer gerektirir", "OptionRequiresOption": "--{value} şunu gerektirir: --{option}", "OptionUsedMultipleTimes": "'{option}' seçeneği birden çok kez belirtildi", - "OptionalCommand": "isteğe bağlı komut", "Options": "Seçenekler", "OriginalBinParagraphHeader": "\nÖzgün İkili Paragraf", + "OtherCommandsHeader": "Diğer", "OverlayPatchDir": "Katman yolu \"{path}\" mevcut ve bir dizin olmalıdır.", - "OverlayTriplets": "{path} yolundan üçlüleri katmanla:", + "OverlayPortsDirectoriesHelp": "Katman bağlantı noktaları dizinleri (ayrıca: {env_var})", + "OverlayTripletDirectoriesHelp": "Katman üçlüleri dizinleri (ayrıca: {env_var})", + "OverlayTriplets": "\"{path}\" yolundaki Katman Üçlüleri:", "OverwritingFile": "Dosya {path} zaten var ve üzerine yazılacak", "PECoffHeaderTooShort": "Taşınabilir Yürütülebilir {path} ayrıştırılırken, COFF üst bilgisinin boyutu geçerli bir PE üst bilgisi içeremeyecek kadar küçük.", "PEConfigCrossesSectionBoundary": "Taşınabilir Yürütülebilir {path} ayrıştırılırken, görüntü yapılandırma dizini bir bölüm sınırını geçiyor.", @@ -752,9 +871,12 @@ "PERvaNotFound": "Taşınabilir Yürütülebilir {path} ayrıştırılırken, RVA {değer:#X} bulunamadı.", "PESignatureMismatch": "Taşınabilir Yürütülebilir {path} ayrıştırılırken, imza uyuşmazlığı.", "PackageAlreadyRemoved": "{spec} kaldırılamıyor: zaten kaldırıldı", + "PackageDiscoveryHeader": "Paket Bulma", "PackageFailedtWhileExtracting": "{path} ayıklanırken '{value}' başarısız oldu.", - "PackageInfoHelp": "Paketler hakkında ayrıntılı bilgi görüntüleyin.", - "PackageRootDir": "(Deneysel) Paketler kök dizinini belirtin.", + "PackageInfoHelp": "Paketlere ait ayrıntılı bilgileri görüntüler", + "PackageInstallationHeader": "Paket Yüklemesi", + "PackageManipulationHeader": "Paket İşleme", + "PackageRootDir": "Paketler dizini (deneysel)", "PackagesToInstall": "Aşağıdaki paketler oluşturulacak ve kurulacaktır:", "PackagesToInstallDirectly": "Aşağıdaki paketler doğrudan yüklenecektir:", "PackagesToModify": "Bu işlemi tamamlamak için ek paketler (*) değiştirilecektir.", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "{value} {expected} olması bekleniyordu", "ParseControlErrorInfoWhileLoading": "{path} yüklenirken:", "ParseControlErrorInfoWrongTypeFields": "Aşağıdaki alanlar yanlış türlere sahipti:", - "ParseIdentifierError": "\"{value}\" geçerli bir tanımlayıcı değil. Tanımlayıcılar sadece küçük alfasayısal+kısa çizgi şeklinde ve ayrılmamış olmalıdır (daha fazla bilgi için {url} adresine gidin)", - "ParsePackageNameError": "\"{package_name}\" geçerli bir paket adı değil. Paket adları küçük alfasayısal+kısa çizgi şeklinde ve ayrılmamış olmalıdır (daha fazla bilgi için {url} adresine gidin)", - "ParsePackagePatternError": "\"{package_name}\" geçerli bir paket deseni değil. Paket desenlerinin yalnızca bir joker karakter (*) kullanması ve bunun desendeki son karakter olması gerekir (daha fazla bilgi için {url} adresine gidin)", + "ParseFeatureNameError": "\"{package_name}\" geçerli bir özellik adı değil. Özellik adları küçük alfasayısal+kısa çizgi şeklinde ve ayrılmamış olmalıdır (daha fazla bilgi için {url} adresine gidin)", + "ParseIdentifierError": "\"{value}\" geçerli bir tanımlayıcı değil. Tanımlayıcılar sadece küçük alfasayısal+kısa çizgi şeklinde ve ayrılmamış olmalıdır (daha fazla bilgi için {url} adresine gidin).", + "ParsePackageNameError": "\"{package_name}\" geçerli bir paket adı değil. Paket adları küçük alfasayısal+kısa çizgi şeklinde ve ayrılmamış olmalıdır (daha fazla bilgi için {url} adresine gidin).", + "ParsePackagePatternError": "\"{package_name}\" geçerli bir paket deseni değil. Paket desenlerinin yalnızca bir joker karakter (*) kullanması ve bunun desendeki son karakter olması gerekir (daha fazla bilgi için {url} adresine gidin).", "PathMustBeAbsolute": "X_VCPKG_REGISTRIES_CACHE ortam değişkeninin değeri mutlak değil: {path}", "PerformingPostBuildValidation": "-- Derleme sonrası doğrulama gerçekleştiriyor", "PortBugAllowRestrictedHeaders": "Bu ilke, olağanüstü durumlarda {env_var} yoluyla devre dışı bırakılabilir", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "{extension} dosyalarını incelemek için şu komutu kullanın:", "PortBugInvalidCrtLinkage": "Aşağıdaki ikili dosyalar {expected} CRT'yi kullanmalıdır.", "PortBugInvalidCrtLinkageEntry": "Şunları barındıran {path} bağlantıları:", + "PortBugKernel32FromXbox": "Seçilen üçlü Xbox'ı hedefler, ancak aşağıdaki DLL'ler kernel32 ile bağlantılıdır. Bu DLL'ler, kernel32'nin bulunmadığı Xbox'a yüklenemez. Bu genellikle onecore_apiset.lib veya xgameplatform.lib gibi uygun bir şemsiye kitaplık yerine kernel32.lib ile bağlantı kurulmasından kaynaklanır.", "PortBugMergeLibCMakeDir": "/lib/cmake klasörü /debug/lib/cmake ile birleştirilmeli ve /share/{package_name}/cmake konumuna taşınmalıdır. Lütfen vcpkg-cmake-config bağlantı noktasından 'vcpkg_cmake_config_fixup()' yardımcı işlevini kullanın.", "PortBugMismatchedNumberOfBinaries": "Hata ayıklama ve yayın ikili dosyalarının sayısı eşleşmiyor.", "PortBugMisplacedCMakeFiles": "Aşağıdaki CMake dosyaları /share/{spec} dışında bulundu. Lütfen CMake dosyalarını /share/{spec} dosyasına yerleştirin.", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "bin\\ ve/veya debug\\bin\\ oluşturma devre dışı bırakılamıyorsa, bunları kaldırmak için bunu portfile’da kullanın", "PortBugRemoveEmptyDirectories": "Doldurulması gereken bir dizin doldurulmamışsa bu, portfile’da bir hata olabileceğini gösterir.\nDizinlere gerek yoksa ve oluşturmaları devre dışı bırakılamıyorsa bunları kaldırmak için portfile’da buna benzer bir özellik kullanın:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE yukarıdaki yeniden adlandırmalardan kalan dizinleri boşalt)", - "PortBugRestrictedHeaderPaths": "Aşağıdaki kısıtlanmış üst bilgiler çekirdek C++ çalışma zamanının ve diğer paketlerin düzgün bir şekilde derlenmesini önleyebilir. Bu ilke, olağanüstü durumlarda {env_var} yoluyla devre dışı bırakılabilir.", + "PortBugRestrictedHeaderPaths": "Aşağıdaki kısıtlanmış üst bilgiler çekirdek C++ çalışma zamanının ve diğer paketlerin düzgün bir şekilde derlenmesini önleyebilir. Bu ilke, olağanüstü durumlarda CMake değişkenini portfile.cmake üzerinde VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS olarak ayarlayarak devre dışı bırakılabilir.", "PortBugSetDllsWithoutExports": "Dışarı aktarma içermeyen DLL'ler büyük olasılıkla derleme betiğinde bir hatadır. Bu amaçlandıysa, portfile’da şu satırı ekleyin:\nset(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS etkin)\nAşağıdaki DLL'lerde dışarı aktarma yok:", "PortDependencyConflict": "{package_name} bağlantı noktası aşağıdaki desteklenmeyen bağımlılıklara sahip:", "PortDoesNotExist": "{package_name} yok", @@ -827,21 +951,26 @@ "PortsDiffHelp": "Bağımsız değişken, sonuçlandırma için bir dal/etiket/karma olmalıdır.", "PortsNoDiff": "İki işleme arasındaki bağlantı noktalarında herhangi bir değişiklik olmadı.", "PortsRemoved": "Aşağıdaki {count} bağlantı noktası kaldırıldı:", - "PortsUpdated": "\nAşağıdaki {count} bağlantı noktası güncelleştirildi:", + "PortsUpdated": "Aşağıdaki {count} bağlantı noktası güncelleştirildi:", "PrebuiltPackages": "Oluşturulmamış paketler var. Bunları oluşturmak için çalıştırın:", "PreviousIntegrationFileRemains": "Önceki integral alma dosyası kaldırılamadı.", "ProgramReturnedNonzeroExitCode": "{tool_name}, şu çıkış koduyla başarısız oldu: ({exit_code}).", "ProvideExportType": "Aşağıdaki seçeneklerden en az biri gereklidir: --raw --nuget --ifw --zip --7zip --chocolatey --prefab.", "PushingVendorFailed": "\"{path}\" yoluna {vendor} gönderimi yapılamadı. Daha fazla bilgi için --debug kullanın.", - "RegeneratesArtifactRegistry": "Bir yapıt kayıt defterini yeniden üretir.", + "RegeneratesArtifactRegistry": "Bir yapıt kayıt defterini yeniden üretir", "RegistryCreated": "Kayıt defteri {path} yolunda başarıyla oluşturuldu", "RegistryValueWrongType": "{path} kayıt defteri değeri beklenmeyen bir türdü.", "RemoveDependencies": "Bildirim modunda bağımlılıkları kaldırmak için bildiriminizi (vcpkg.json) düzenleyip 'install' komutunu çalıştırın.", "RemovePackageConflict": "{spec} yüklü değil, ancak {package_name}, {triplet} için yüklendi. Şunu mu demek istediniz: {package_name}:{triplet}?", "RemovingPackage": "{action_index}/{count} {spec} kaldırılıyor", "ResponseFileCode": "@response_file", - "RestoredPackage": "Paket \"{path}\" kaynağından geri yüklendi", - "RestoredPackagesFromVendor": "{elapsed} içinde süresi dolan {value} kaynağından {count} paket geri yüklendi. Daha fazla ayrıntı için --debug kullanın.", + "RestoredPackagesFromAWS": "{elapsed} içinde AWS kaynağından {count} paket geri yüklendi. Daha fazla ayrıntı için --debug kullanın.", + "RestoredPackagesFromCOS": "{elapsed} içinde COS kaynağından {count} paket geri yüklendi. Daha fazla ayrıntı için --debug kullanın.", + "RestoredPackagesFromFiles": "{elapsed} içinde {path} kaynağından {count} paket geri yüklendi. Daha fazla ayrıntı için --debug kullanın.", + "RestoredPackagesFromGCS": "{elapsed} içinde GCS kaynağından {count} paket geri yüklendi. Daha fazla ayrıntı için --debug kullanın.", + "RestoredPackagesFromGHA": "{elapsed} içinde GitHub Actions Önbelleğinden {count} paket geri yüklendi. Daha fazla ayrıntı için --debug kullanın.", + "RestoredPackagesFromHTTP": "{elapsed} içinde HTTP sunucularından {count} paket geri yüklendi. Daha fazla ayrıntı için --debug kullanın.", + "RestoredPackagesFromNuGet": "{elapsed} içinde NuGet kaynağından {count} paket geri yüklendi. Daha fazla ayrıntı için --debug kullanın.", "ResultsHeader": "SONUÇLAR", "ScriptAssetCacheRequiresScript": "beklenen bağımsız değişkenler: varlık yapılandırması 'x-script', bağımsız değişken olarak tam olarak exec şablonunu gerektirir", "SearchHelp": "Bağımsız değişken aranılacak bir alt dize olmalıdır ya da tüm kitaplıkları görüntülemek için bağımsız değişken olmamalıdır.", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "{path} bir dizin olmadığından, {path} içeriğinin temizlenmesi atlanıyor.", "SourceFieldPortNameMismatch": "CONTROL dosyasının içindeki 'Source' alanı veya vcpkg.json dosyasındaki \"name\" alanı {package_name} adına sahip ve “{path}” bağlantı noktası diziniyle eşleşmiyor.", "SpecifiedFeatureTurnedOff": "'{command_name}' özelliği özellikle kapatıldı, ancak --{option} belirtildi.", - "SpecifyDirectoriesContaining": "Üçlü dosyalar içeren dizinleri belirtin.\n(ayrıca: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "Bağlantı noktaları aranırken kullanılacak dizinleri belirtin.\n(ayrıca: '{env_var}')", - "SpecifyHostArch": "Konak mimari üçlüsünü belirtin. Bkz. 'vcpkg help triplet'.\n(default: '{env_var}')", - "SpecifyTargetArch": "Hedef mimari üçlüsünü belirtin. Bkz. 'vcpkg help triplet'.\n(varsayılan: '{env_var}')", + "SpecifyHostArch": "Konak üçlüsü. Bkz. 'vcpkg help triplet' (varsayılan: {env_var})", + "SpecifyTargetArch": "Hedef üçlüsü. Bkz. 'vcpkg help triplet' (varsayılan: {env_var})", "StartCodeUnitInContinue": "devam konumunda başlangıç kodu birimi bulundu", "StoreOptionMissingSha": "--store seçeneği sha512 olmadan geçersiz", - "StoredBinariesToDestinations": "İkili dosyalar {count} hedefte depolandı.", + "StoredBinariesToDestinations": "İkili dosyalar {elapsed} içinde {count} hedefte depolandı.", "StoredBinaryCache": "İkili önbellek depolandı: \"{path}\"", "SuccessfulyExported": "{package_name}, {path} paketine aktarıldı", "SuggestGitPull": "Sonuç eski olabilir. En son sonuçları almak için `git pull` komutunu çalıştırın.", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "vcpkg ikili dosyasını güncelleştirmeniz gerekiyor olabilir; güncelleştirmek için {command_line} çalıştırmayı deneyin.", "SupportedPort": "{package_name} bağlantı noktası destekleniyor.", "SwitchUsedMultipleTimes": "'{option}' geçişi birden çok kez belirtildi", + "SynopsisHeader": "Özet:", "SystemApiErrorMessage": "{system_api} çağrısı {exit_code} ile başarısız oldu ({error_msg})", "SystemRootMustAlwaysBePresent": "SystemRoot ortam değişkeninin her zaman Windows'ta ayarlanması bekleniyor.", "SystemTargetsInstallFailed": "{path} öğesine sistem hedefleri dosyası yüklenemedi", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "Dizide sondaki virgül", "TrailingCommaInObj": "Bir nesnede sondaki virgül", "TripletFileNotFound": "{triplet}.cmake üçlü dosyası bulunamadı", + "TripletLabel": "Üçlü:", "TwoFeatureFlagsSpecified": "Hem '{value}' hem de -'{value}' özellik bayrakları olarak belirtildi.", "UnableToClearPath": "{path} silinemiyor", "UnableToReadAppDatas": "hem %LOCALAPPDATA% hem de %APPDATA% okunamadı", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "'{url}' kayıt defteri güncellenmedi: '{value}'", "UpdateBaselineRemoteGitError": "git, şu uzak depoyu getiremedi: '{url}'", "UpdateBaselineUpdatedBaseline": "'{url}' kayıt defteri güncellendi: taban çizgisi '{old_value}' -> '{new_value}'", - "UpgradeInManifest": "Yükseltme komutu şu anda bildirim modunu desteklemiyor. Bunun yerine vcpkg.json dosyanızı değiştirin ve kurulumu çalıştırın.", + "UpgradeInManifest": "Yükseltme, klasik mod yüklemesini yükseltir ve bu nedenle bildirim modunu desteklemez. Vcpkg x-update-baseline ile temel değerinizi geçerli bir değere güncelleştirerek ve vcpkg yüklemesini çalıştırarak bağımlılıklarınızı güncelleştirmeyi deneyin.", "UpgradeRunWithNoDryRun": "Yukarıdaki paketleri yeniden derlemek istediğinizden eminseniz bu komutu --no-dry-run seçeneğiyle çalıştırın.", "UploadedBinaries": "İkili dosyalar şuraya yüklendi: {count} {vendor}.", "UploadedPackagesToVendor": "{count} paket {vendor} tarafına {elapsed} içinde yüklendi", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "geçersiz komut: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "X_VCPKG_REGISTRIES_CACHE ortam değişkeninin değeri dizin değil: {path}", "VcpkgRootRequired": "Tek başına ön yükleme için VCPKG_ROOT ayarı gereklidir.", - "VcpkgRootsDir": "vcpkg kök dizinini belirtin.\n(varsayılan: '{env_var}')", + "VcpkgRootsDir": "vcpkg kök dizini (varsayılan: {env_var})", "VcpkgSendMetricsButDisabled": "--sendmetrics geçirildi, ancak ölçümler devre dışı bırakıldı.", + "VcpkgUsage": "kullanım: vcpkg [--switches] [--options=values] [bağımsız değişkenler] @response_file", "VcvarsRunFailed": "Visual Studio ortamı elde etmek için vcvarsall.bat çalıştırılamadı", "VcvarsRunFailedExitCode": "bir Visual Studio ortamı edinmeye çalışırken vcvarsall.bat, {exit_code} döndürdü", "VersionBaselineMismatch": "En son sürüm {expected}, ancak temel dosya {actual} içeriyor.\nÇalıştır:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\nyazarak temel sürümü güncelleştirin.", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "{path} öğesinde {package_name} sürüm veritabanı dosyası eksik\nÇalıştır:\nvcpkg x-add-version {package_name}\nyazarak sürümler dosyasını oluşturun.", "VersionGitEntryMissing": "{version} sürümünde {package_name} için bir sürüm veritabanı girişi yok.\nKullanılabilir sürümler:", "VersionInDeclarationDoesNotMatch": "Dosyada tanımlanan sürüm kullanıma alınan sürümle eşleşmiyor: {version}", - "VersionIncomparable1": "{spec}: {package_name} öğesinde sürüm çakışması, {expected} gerekli ancak vcpkg bunu {actual} ile karşılaştıramadı.\nKarşılaştırılamaz düzenleri kullanan iki sürüm:", - "VersionIncomparable2": "\"{version}\" was of scheme {new_scheme}", - "VersionIncomparable3": "Bu, tercih edilen sürüme açık bir geçersiz kılma ekleyerek çözülebilir, örneğin:", - "VersionIncomparable4": "Daha fazla bilgi için 'vcpkg yardım sürümü oluşturma' bölümüne bakın.", + "VersionIncomparable1": "{spec} üzerinde sürüm çakışması: {constraint_origin} için {expected} gerekli ve sürüm {actual} temel sürümüyle karşılaştırılamıyor.", + "VersionIncomparable2": "{version_spec}, {new_scheme} düzenine sahip", + "VersionIncomparable3": "Bu, tercih edilen sürüme açık bir geçersiz kılma ekleyerek çözülebilir. Örneğin:", + "VersionIncomparable4": "Daha fazla bilgi için 'vcpkg yardım sürümü oluşturma' bölümüne veya {url} adresine bakın.", + "VersionIncomparableSchemeString": "Her iki sürümde de düzen dizesi var ancak birincil metin farklı.", + "VersionIncomparableSchemes": "Sürümler uyumlu olmayan düzenlere sahip:", "VersionInvalidDate": "'{version}' geçerli bir tarih sürümü değil. Tarihler YYYY-AA-GG biçiminde olmalıdır ve belirsizlik gidericiler, başında sıfırlar olmadan noktayla ayrılmış pozitif tamsayı değerleri olmalıdır.", "VersionInvalidRelaxed": "'{version}' geçerli bir esnek sürüm değil (rasgele sayısal öğe sayısına sahip semver).", "VersionInvalidSemver": "'{version}' geçerli bir anlamsal sürüm değil, adresine başvurun.", "VersionMissing": "sürüm oluşturma alanı bekleniyordu (version, version-date, version-semver veya version-string kodlarından biri)", - "VersionMissingRequiredFeature": "{spec}@{version} gerekli {feature} özelliğine sahip değil", + "VersionMissingRequiredFeature": "{version_spec}, {constraint_origin} için gerekli olan {feature} gerekli özelliğine sahip değil", "VersionNotFound": "{expected} kullanılamıyor, yalnızca {actual} kullanılabilir", - "VersionNotFoundDuringDiscovery": "keşif sırasında sürüm bulunamadı: {spec}@{version}\nBu bir iç vcpkg hatasıdır. Lütfen sorunu yeniden oluşturmak için https://github.com/Microsoft/vcpkg adresinde ayrıntılı aşamalardan geçerek bir konu açın.", - "VersionNotFoundInVersionsFile": "{version} sürümü sürüm dosyasında bulunamadı.\nÇalıştır:\nvcpkg x-add-version {package_name}\nyazarak yeni bağlantı noktası sürümünü ekleyin.", + "VersionNotFoundInVersionsFile": "{version} sürümü, {package_name} adlı paketin sürüm dosyasında bulunamadı.\nÇalıştır:\nvcpkg x-add-version {package_name}\nyazarak yeni bağlantı noktası sürümünü ekleyin.", "VersionRejectedDueToBaselineMissing": "{path}, \"{json_field}\" kullandığı ve \"builtin-baseline\" olmadığı için reddedildi. Bu, \"{json_field}\" kullanımları kaldırılarak veya bir \"builtin-baseline\" eklenerek düzeltilebilir.\nDaha fazla bilgi için `vcpkg yardım sürümü oluşturma` konusuna bakın.", "VersionRejectedDueToFeatureFlagOff": "{path}, \"{json_field}\" kullandığı ve `versions` özellik işareti devre dışı bırakıldığı için reddedildi. Bu, \"{json_field}\" kaldırılarak veya `versions` özellik bayrağı etkinleştirilerek düzeltilebilir.\nDaha fazla bilgi için `vcpkg yardım sürümü oluşturma` konusuna bakın.", "VersionSchemeMismatch": "Sürüm veritabanı, {version} öğesini {expected} olarak tanımlıyor, ancak {path} bunu bir {actual} olarak tanımlıyor. Farklı düzenlerle tanımlanmış olsalar bile sürümler benzersiz olmalıdır.\nÇalıştır:\nvcpkg x-add-version {package_name} --overwrite-version\nyazarak sürüm veritabanında tanımlanan düzeni bağlantı noktasında tanımlanan düzenin üzerine yazın.", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "Sürüm metnindeki '#' karakterinden sonra bir bağlantı noktası sürümü (negatif olmayan bir tamsayı) gelmelidir", "VersionSpecMismatch": "Sürümler tutarsız olduğundan bağlantı noktası yüklenemedi. Dosya \"{path}\" {actual_version} sürümünü içeriyor, ancak sürüm veritabanı onun {expected_version} olması gerektiğini belirtiyor.", "VersionTableHeader": "Sürüm", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "OK: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "Alt işlemlerin çıkışı bekleniyor...", "WaitingToTakeFilesystemLock": "{path} yolunda dosya sistemi kilidi almak için bekleniyor...", "WarnOnParseConfig": "{path} yapılandırmasında aşağıdaki uyarılar bulundu:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "sürüm doğrulanırken: {version}", "WindowsOnlyCommand": "Bu komut yalnızca Windows'u destekler.", "WroteNuGetPkgConfInfo": "NuGet paketi yapılandırma bilgilerini {path} öğesine yazdı", - "UnrecognizedCommand$": "Tanınmayan komut: '${p0}'", - "Use$ToGetHelp": "Yardım almak için ${p0} kullanın", - "FatalTheRootFolder$CanNotBeCreated": "Önemli: '${p0}' kök klasörü oluşturulamıyor", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Önemli: '${p0}' genel yapılandırma dosyası oluşturulamıyor", + "FatalTheRootFolder$CannotBeCreated": "Önemli: '${p0}' kök klasörü oluşturulamıyor", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Önemli: '${p0}' genel yapılandırma dosyası oluşturulamıyor", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND ayarlanmadı", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "Vcpkg’yi dahili olarak çalıştırmak sıfır olmayan bir çıkış kodu döndürdü: ${p0}", "failedToDownloadFrom$": "${p0} konumundan indirilemedi", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "açıklama 'string' türünde olmalıdır, '${p0}' bulundu", "optionsShouldBeASequenceFound$": "seçenekler bir dizi olmalıdır, '${p0}' bulundu", "DuplicateKeysDetectedInManifest$": "Bildirimde yinelenen anahtarlar algılandı: '${p0}'", - "in$Skipping$BecauseItIsA$": "${p0} içinde ${p1} ${p2} olduğundan atlanıyor", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "postscript dosyası yok: yürütülebilir dosya yerine vcpkg kabuk işleviyle yeniden çalıştırın", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Etkinleştirme sırasında yinelenen ${p0} tanımı. Yeni değer eskinin yerini alacak.", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "Etkinleştirme sırasında yinelenen araç ${p0} bildirildi. Yeni değer eskinin yerini alacak.", @@ -1080,20 +1208,15 @@ "progressUnknown": "(ilerleme bilinmiyor)", "verifying": "doğrulanıyor", "downloading$$": "indiriliyor ${p0} -> ${p1}", - "unpacking": "paket açılıyor", "unpacking$": "${p0} paketi açılıyor", "Installing$": "${p0} yükleniyor...", "$AlreadyInstalled": "${p0} zaten yüklü.", "Downloading$": "${p0} indiriliyor...", "Unpacking$": "${p0} paketi açılıyor...", "ErrorInstalling$$": "${p0} - ${p1} yükleme hatası", - "ExpectedASingleValueFor$FoundMultiple": "${p0} için tek bir değer bekleniyordu - birden çok değer bulundu", - "Synopsis": "Özet", - "Description": "Açıklama", - "Switches": "Anahtarlar", - "SeeAlso": "Ayrıca Bkz", "error": "hata:", "warning": "uyarı:", + "ExpectedASingleValueFor$FoundMultiple": "${p0} için tek bir değer bekleniyordu - birden çok değer bulundu", "ExpectedASingleValueFor$": "'--${p0}' için tek bir değer bekleniyordu.", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "'${p0}' doğru varsayılıyor; bu iletiyi gizlemek için yapıt meta verilerinde bir karma belirtin.", "DownloadedFile$DidNotHaveTheCorrectHash$$": "İndirilen '${p0}' dosyası doğru karmaya sahip değildi (${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "'${p1}' içinde eşleşmeyen ${p0} bulundu. ${p2} sabit değeri için ${p3}${p4} kullanın.", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "'${p1}' içinde {${p0}} için bir değer bulunamadı. Sabit değeri yazmak için bunun yerine '{{${p2}}}' kullanın.", "MatchedMoreThanOneInstallBlock$": "Birden fazla yükleme bloğuyla eşlendi [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Etkinleştirmeden bir proje tarafından başvurulan her şeyi alır", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "Bu, tüketicinin bir proje için gereken araçları önceden indirmesine olanak sağlar.", "UnableToFindProjectInFolderorParentFoldersFor$": "${p0} için klasörde (veya üst klasörlerde) proje bulunamıyor", "UnableToAcquireProject": "Proje alınamıyor", - "AcquireArtifactsInTheRegistry": "Kayıt defterindeki yapıtları alın", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "Bu, tüketicinin yapıtları almasına (indirme ve paketini açma) olanak sağlar. Yapıtların kullanılması için etkinleştirilmesi gerekir", "NoArtifactsSpecified": "Yapıt belirtilmedi", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Birden çok paket belirtildi, ancak eşit sayıda ${p0} anahtarı belirtilmedi", "NoArtifactsAreAcquired": "Hiçbir yapıt alınmadı", "AllArtifactsAreAlreadyInstalled": "Tüm yapıtlar zaten yüklü", "$ArtifactsInstalledSuccessfully": "${p0} yapıt başarıyla yüklendi", "InstallationFailedStopping": "Yükleme başarısız oldu -- durduruluyor", - "ActivatesTheToolsRequiredForAProject": "Bir proje için gereken araçları etkinleştirir", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "Bu, tüketicinin bir proje için gereken araçları etkinleştirmesine olanak sağlar. Araçlar henüz yüklenmemişse bu işlem, etkinleştirmeden önce araçları indirmeyi ve yüklemeyi zorlar.", - "AddsAnArtifactToTheProject": "Projeye bir yapıt ekler", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "Bu, tüketicinin projeye yapıt eklemesine olanak sağlar. Bu işlem, projeyi de etkinleştirir.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Birden çok yapıt belirtildi, ancak eşit sayıda ${p0} anahtarı belirtilmedi", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "[${p0}]:${p1} yapıtı eklenmeye çalışıldı ancak kullanılacak kayıt defteri belirlenemedi.", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "${p0} kayıt defteri ${p1} olarak eklenmeye çalışıldı ancak zaten ${p2}. Lütfen bu projeye el ile ${p3} ekleyin ve yeniden deneyin.", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Geçerli terminale uygulamak için \\`vcpkg activate\\` komutunu çalıştırın", - "ManagesTheDownloadCache": "İndirme önbelleğini yönetir", "DownloadsFolderCleared$": "İndirmeler klasörü temizlendi (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "her şeyi temizler (önbellek, yüklü yapıtlar)", - "cleansOutTheDownloadsCache": "indirme önbelleğini temizler", - "removesAllTheArtifactsThatAreInstalled": "yüklü tüm yapıtları kaldırır", - "cleansUp": "temizler", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Kullanıcının önbelleği, yüklü yapıtları vb. temizlemesine olanak sağlar.", "InstalledArtifactFolderCleared$": "Yüklü Yapıt klasörü temizlendi (${p0}) ", "CacheFolderCleared$": "Önbellek klasörü temizlendi (${p0}) ", - "DeactivatesTheCurrentSession": "Geçerli oturumu devre dışı bırakır", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "Bu, tüketicinin şu anda etkin olan oturumun ortam ayarlarını kaldırmasına olanak sağlar.", - "DeletesAnArtifactFromTheArtifactFolder": "Yapıt klasöründen bir yapıtı siler", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "Bu, tüketicinin bir yapıtı diskten kaldırmasına olanak sağlar.", "DeletingArtifact$From$": "${p1} konumundaki ${p0} yapıtı siliniyor", - "FindArtifactsInTheRegistry": "Kayıt defterindeki yapıtları bulun", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "Bu, kullanıcının yapıtları bazı ölçütlere göre bulmasına olanak sağlar.", "NoArtifactsFoundMatchingCriteria$": "Ölçütlere uyan yapıt bulunamadı: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Bir proje için hiçbir şey indirmeden etkinleştirme için MSBuild özellikleri oluşturur", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props için --msbuild-props gerekir", "UnableToActivateProject": "Proje etkinleştirilemiyor", - "theNameOfTheCommandForWhichYouWantHelp": "yardım istediğiniz komutun adı", - "getHelpOn$OrOneOfTheCommands": "${p0} veya komutlardan biri hakkında yardım alın", - "GetsDetailedHelpOn$OrOneOfTheCommands": "${p0} veya komutlardan biri hakkında ayrıntılı yardım alır", - "Arguments": "Bağımsız değişkenler:", - "Use$ToGetTheListOfAvailableCommands": "Kullanılabilir komutların listesini almak için ${p0} kullanın", - "Usage": "Kullanım", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "Kullanılabilir ${p0} komutları:", - "ListsTheArtifacts": "Yapıtları listeler", - "ThisAllowsTheConsumerToListArtifacts": "Bu, tüketicinin yapıtları listelemesine olanak sağlar.", - "regenerateTheIndexForARegistry": "kayıt defteri için dizini yeniden oluştur", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "Bu, kullanıcının bir ${p1} kayıt defteri için ${p0} dosyalarını yeniden oluşturmasına olanak sağlar.", "RegeneratingIndexFor$": "${p0} için dizin yeniden oluşturuluyor", "RegenerationCompleteIndexContains$MetadataFiles": "Yeniden oluşturma tamamlandı. Dizin ${p0} meta veri dosyası içeriyor", "Registry$ContainsNoArtifacts": "Kayıt defteri '${p0}' yapıt içermiyor.", "error$": "${p0} hatası: ", - "RemovesAnArtifactFromAProject": "Bir projeden yapıtı kaldırır", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "Bu, tüketicinin bir yapıtı projeden kaldırmasına olanak sağlar. Bu pencerede yeniden etkinleştirmeyi zorlar.", "Removing$FromProjectManifest": "${p0}, proje bildiriminden kaldırılıyor", "unableToFindArtifact$InTheProjectManifest": "${p0} yapıtı proje bildiriminde bulunamıyor", - "updateTheRegistryFromTheRemote": "kayıt defterini uzak depodan güncelleştir", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "Bu, kayıt defterinin en son içeriğini uzak hizmetten indirir.", - "DownloadingRegistryData": "Kayıt defteri verileri indiriliyor", - "Updated$RegistryContains$MetadataFiles": "${p0} güncelleştirildi. kayıt defteri ${p1} meta veri dosyaları içeriyor", - "UnableToDownloadRegistrySnapshot": "Kayıt defteri anlık görüntüsü indirilemiyor", - "UnableToFindRegistry$": "${p0} kayıt defteri bulunamıyor", - "ArtifactRegistryDataIsNotLoaded": "Yapıt kayıt defteri verileri yüklenmedi", - "AttemptingToUpdateArtifactRegistry": "Yapıt kayıt defteri güncelleştirilmeye çalışılıyor", - "UnableToLoadRegistryIndex": "Kayıt defteri dizini yüklenemiyor", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Bir yapıtı proje dışında anında etkinleştirir", - "ThisWillInstantlyActivateAnArtifact": "Bu işlem, bir yapıtı anında etkinleştirir.", + "Updated$ItContains$MetadataFiles": "${p0} güncelleştirildi. ${p1} meta veri dosyaları içeriyor.", + "UnableToDownload$": "${p0} indirilemiyor.", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} güncelleştirilemedi, hatalı biçimlendirilmiş olabilir.", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "“x-update-registry” komutu yeni kayıt defteri bilgileri indirir ve bu nedenle yerel kayıt defterleriyle kullanılamaz. Şunu mu demek istediniz: “x-regenerate ${p0}”?", + "UnableToFindRegistry$": "${p0} kayıt defteri bulunamıyor.", "NoArtifactsAreBeingAcquired": "Hiçbir yapıt alınmıyor", - "removesAllFilesInTheLocalCache": "yerel önbellekteki tüm dosyaları kaldırır", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "hata ayıklama modunu etkinleştirir, ${p0} öğesinin nasıl çalıştığıyla ilgili iç iletileri görüntüler", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "(tehlikeli olabilecek) eyleme onay olmadan devam eder", - "showsTheinstalledArtifacts": "_yüklü_ yapıtları gösterir", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Kullanıcı tarafından sağlanan yola sahip bir json dosyasına ortam değişkenlerinin ve diğer özelliklerin dökümünü oluşturun.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "MSBuild özelliklerinin yazılacağı dosyanın tam yolu.", - "ApplyAnyDeprecationFixups": "Kullanımdan kaldırma düzeltmelerini uygulayın.", - "overrideThePathToTheProjectFolder": "proje klasörünün yolunu geçersiz kıl", - "UnableToFindProjectEnvironment$": "${p0} proje ortamı bulunamıyor", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "ayrıntılı modu etkinleştirir, işlemle ilgili ayrıntılı iletileri görüntüler", - "aVersionOrVersionRangeToMatch": "eşleştirilecek sürüm veya sürüm aralığı" + "UnableToFindProjectEnvironment$": "${p0} proje ortamı bulunamıyor" } diff --git a/locales/messages.zh-Hans.json b/locales/messages.zh-Hans.json index 4c8dd3747c..d71c1132bf 100644 --- a/locales/messages.zh-Hans.json +++ b/locales/messages.zh-Hans.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "内置注册表", "AConfigurationObject": "配置对象", "ADateVersionString": "日期版本字符串", + "ADefaultFeature": "默认功能", "ADemandObject": "请求对象", "ADependency": "依赖项", + "ADependencyFeature": "依赖项的功能", "ADictionaryOfContacts": "联系人字典", "AFeature": "功能", + "AFeatureName": "功能名称", "AFilesystemRegistry": "文件系统注册表", "AGitObjectSha": "git 对象 SHA", "AGitReference": "git 引用(例如分支)", @@ -44,12 +47,12 @@ "AddArtifactOnlyOne": "“{command_line}” 一次只能添加一个项目。", "AddCommandFirstArg": "要添加的第一个参数必须是 “artifact” 或 “port”。", "AddFirstArgument": "“{command_line}”的第一个参数必须是 “artifact” 或 “port”。", - "AddHelp": "将指示的端口或项目添加到与当前目录关联的清单。", "AddPortRequiresManifest": "“{command_line}”需要活动清单文件。", "AddPortSucceeded": "已成功将端口添加到 vcpkg.json 文件。", "AddRecurseOption": "如果确定要移除它们,请使用 --recurse 选项运行命令。", "AddTripletExpressionNotAllowed": "此处不允许使用三元表达式。你可能想要将 `{package_name}:{triplet}` 更改为 `{package_name}`。", "AddVersionAddedVersionToFile": "已将版本 {version} 添加到 {path}", + "AddVersionArtifactsOnly": "--version 仅适用于项目,不能与 vcpkg 添加端口一起使用", "AddVersionCommitChangesReminder": "是否记得提交更改?", "AddVersionCommitResultReminder": "别忘了提交结果!", "AddVersionDetectLocalChangesError": "由于 git 状态输出出现意外格式而跳过对本地更改的检测", @@ -83,8 +86,10 @@ "AlreadyInstalled": "已安装 {spec}", "AlreadyInstalledNotHead": "已安装 {spec} - 未从 HEAD 生成", "AmbiguousConfigDeleteConfigFile": "清单和配置文件提供的 vcpkg 配置不明确。\n-- 请删除配置文件 {path}", + "AnArrayOfDefaultFeatures": "默认功能的数组", "AnArrayOfDependencies": "依赖项数组", "AnArrayOfDependencyOverrides": "依赖项重写的数组", + "AnArrayOfFeatures": "一个功能数组", "AnArrayOfIdentifers": "标识符数组", "AnArrayOfOverlayPaths": "覆盖路径数组", "AnArrayOfOverlayTripletsPaths": "覆盖三元组路径的数组", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "计算机上正在进行另一个安装,重试前休眠 6 秒。", "AppliedUserIntegration": "已为此 vcpkg 根应用用户范围的集成。", "ApplocalProcessing": "vcpkg applocal 处理: {path}", + "ArtifactsBootstrapFailed": "vcpkg-artifacts 未安装,无法启动。", + "ArtifactsNotInstalledReadonlyRoot": "未安装 vcpkg-artifacts,也无法安装,因为假定 VCPKG_ROOT 是只读的。使用“一行代码”重新安装 vcpkg 可能会解决此问题。", + "ArtifactsNotOfficialWarning": "与非官方用户一起使用 vcpkg-artifacts", "ArtifactsOptionIncompatibility": "--{option} 对查找项目没有影响。", + "ArtifactsOptionJson": "记录环境变量和其他属性的 JSON 文件的完整路径", + "ArtifactsOptionMSBuildProps": "将写入 MSBuild 属性的文件的完整路径", + "ArtifactsOptionVersion": "要匹配的版本或版本范围; 仅对项目有效", + "ArtifactsOptionVersionMismatch": "--version 开关的数目必须与命名项目数匹配", + "ArtifactsSwitchARM": "获取项目时强制对 ARM 进行主机检测", + "ArtifactsSwitchARM64": "获取项目时强制对 ARM64 进行主机检测", + "ArtifactsSwitchAll": "更新所有已知项目注册表", + "ArtifactsSwitchAllLanguages": "获取项目时获取所有语言文件", + "ArtifactsSwitchForce": "如果已获取项目,则强制重新查询", + "ArtifactsSwitchFreebsd": "获取项目时强制对 FreeBSD 进行主机检测", + "ArtifactsSwitchLinux": "获取项目时强制对 Linux 进行主机检测", + "ArtifactsSwitchNormalize": "应用任何弃用修补程序", + "ArtifactsSwitchOnlyOneHostPlatform": "只能设置一个主机平台 (--x64, --x86, --arm, --arm64)。", + "ArtifactsSwitchOnlyOneOperatingSystem": "只能设置一个操作系统 (--windows, --osx, --linux, --freebsd)。", + "ArtifactsSwitchOnlyOneTargetPlatform": "只能设置一个目标平台 (--target:x64, --target:x86, --target:arm, --target:arm64)。", + "ArtifactsSwitchOsx": "获取项目时强制对 MacOS 进行主机检测", + "ArtifactsSwitchTargetARM": "获取项目时将目标检测设置为 ARM", + "ArtifactsSwitchTargetARM64": "获取项目时将目标检测设置为 ARM64", + "ArtifactsSwitchTargetX64": "获取项目时将目标检测设置为 x64", + "ArtifactsSwitchTargetX86": "获取项目时将目标设置为 x86", + "ArtifactsSwitchWindows": "获取项目时强制对 Windows 进行主机检测", + "ArtifactsSwitchX64": "获取项目时强制对 x64 进行主机检测", + "ArtifactsSwitchX86": "获取项目时强制对 x86 进行主机检测", "AssetCacheProviderAcceptsNoArguments": "意外参数:“{value}”不接受参数", - "AssetSourcesArg": "为资产缓存添加源。请参阅“vcpkg 帮助 assetcaching”。", + "AssetSourcesArg": "缓存添加源。请参阅“vcpkg 帮助 assetcaching”。", "AttemptingToFetchPackagesFromVendor": "正在尝试从 {vendor} 提取 {count} 个包", "AttemptingToSetBuiltInBaseline": "尝试在 vcpkg.json 中设置内置基线,同时重写 vcpkg-configuration.json 中的 default-registry。\n系统将使用 vcpkg-configuration.json 中的 default-registry。", "AuthenticationMayRequireManualAction": "一个或多个 {vendor} 凭据提供程序请求手动操作。添加二进制源 “interactive” 以允许交互。", "AutoSettingEnvVar": "-- 正在将 {env_var} 环境变量自动设置为“{url}”。", "AutomaticLinkingForMSBuildProjects": "所有 MSBuild C++ 项目现在可以包含(#include)任何已安装的库。系统将自动处理链接。安装新库将使它们立即可用。", - "AvailableArchitectureTriplets": "可用的体系结构三元组:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 及更高版本现在可包含(#include)任何已安装的库。系统将自动处理链接。安装新库将使它们立即可用。", "AvailableHelpTopics": "可用的帮助主题:", "AzUrlAssetCacheRequiresBaseUrl": "意外参数: 资产配置“azurl”需要基 URL", "AzUrlAssetCacheRequiresLessThanFour": "意外参数: 资产配置 \"azurl\" 需要的参数少于 4 个", "BaselineConflict": "在清单文件中指定 vcpkg-configuration.default-registry 的操作与内置基线冲突。\n请删除其中一个冲突设置。", "BaselineFileNoDefaultField": "提交 {commit_sha} 处的基线文件无效(无“默认”字段)。", - "BaselineFileNoDefaultFieldPath": "{path} 处的基线文件无效(无 \"default\" 字段)", "BaselineGitShowFailed": "提交 '{commit_sha}' 签出基线时,无法“git show”版本/基线.json。可以通过使用“git fetch”提取提交来修复此问题。", "BaselineMissing": "找不到基线版本。运行:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\n以将 {version} 设置为基线版本。", - "BaselineMissingDefault": "提交存储库 {url} 中的 `\"{commit_sha}\"` 中的 baseline.json 无效(不包含“default”字段)。", - "BinarySourcesArg": "添加用于二进制缓存的源。请参阅“vcpkg 帮助 binarycaching”。", + "BinaryCacheVendorHTTP": "HTTP 服务器", + "BinarySourcesArg": "二进制缓存源。请参阅“vcpkg 帮助 binarycaching”。", "BinaryWithInvalidArchitecture": "{path}\n 应为: {expected},但为 {actual}", "BuildAlreadyInstalled": "已安装{spec};请在尝试生成之前先删除{spec}。", "BuildDependenciesMissing": "内部版本命令要求已安装所有依赖项。\n缺少以下依赖项:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "成功", "BuildResultSummaryHeader": "{triplet} 的摘要", "BuildResultSummaryLine": "{build_result}: {count} 个", - "BuildTreesRootDir": "(实验性)指定 buildtrees 根目录。", + "BuildTreesRootDir": "Buildtrees 目录(实验性)", "BuildTroubleshootingMessage1": "请确保使用具有“git pull” 和 “vcpkg update”的最新端口文件。\n然后,在以下位置查看已知问题:", "BuildTroubleshootingMessage2": "可在以下位置提交新问题:", "BuildTroubleshootingMessage3": "在 Bug 报告标题中包含“[{package_name}] 内部版本错误”,bug 描述中的以下版本信息,并从上面附加任何相关的失败日志。", "BuildTroubleshootingMessage4": "报告问题时,请使用 {path} 中的预填充模板。", - "BuildTroubleshootingMessageGH": "还可以通过运行来对问题求和(必须安装 GitHub cli):", + "BuildTroubleshootingMessageGH": "还可通过运行来提交问题(必须安装 GitHub CLI):", "BuildingFromHead": "正在从 HEAD 生成 {spec}...", "BuildingPackage": "正在生成 {spec}...", "BuildingPackageFailed": "生成 {spec} 失败,结果为: {build_result}", "BuildingPackageFailedDueToMissingDeps": "由于缺少以下依赖项:", - "BuiltInTriplets": "vcpkg 内置三元组:", + "BuiltInTriplets": "内置三元组:", "BuiltWithIncorrectArchitecture": "为不正确的体系结构生成了以下文件:", "CISettingsExclude": "要跳过的端口的列表(端口间以逗号分隔)", "CISettingsOptCIBase": "ci.baseline.txt 文件的路径。用于跳过端口和检测回归。", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "用于输出所有已确定的包哈希的文件", "CISettingsOptParentHashes": "用于读取父 CI 状态的包哈希的文件,可减少已更改的包集", "CISettingsOptSkippedCascadeCount": "断言跳过的 --exclude 和支持的数量正好等于此数字", - "CISettingsOptXUnit": "用于以 XUnit 格式输出结果的文件(内部)", + "CISettingsOptXUnit": "用于以 XUnit 格式输出结果的文件", "CISettingsVerifyGitTree": "验证每个 git 树对象是否与其声明的版本匹配(速度非常慢)", - "CISettingsVerifyVersion": "打印每个端口的结果,而不仅仅是错误。", - "CISwitchOptAllowUnexpectedPassing": "指示不应发出“正在传递,请从失败列表中移除”结果。", + "CISettingsVerifyVersion": "打印每个端口的结果,而不是仅打印错误", + "CISkipInstallation": "以下包已安装,将不再生成:", + "CISwitchOptAllowUnexpectedPassing": "取消显示“传递,从失败列表中删除”结果", "CISwitchOptDryRun": "打印出计划而不执行", "CISwitchOptRandomize": "实现安装顺序的随机化", - "CISwitchOptSkipFailures": "指示应跳过 ci.baseline.txt 中标记为 `=fail` 的端口。", - "CISwitchOptXUnitAll": "另请在 XUnit 输出中报告未更改的端口(内部)", + "CISwitchOptSkipFailures": "跳过 ci.baseline.txt 中标记为“=fail”的端口", + "CISwitchOptXUnitAll": "报告 XUnit 输出中未更改的端口", "CMakeTargetsUsage": "{package_name} 提供 CMake 目标:", "CMakeTargetsUsageHeuristicMessage": "# 这是启发式生成的,并且可能不正确", "CMakeToolChainFile": "CMake 项目应使用:“-DCMAKE_TOOLCHAIN_FILE={path}”", "CMakeUsingExportedLibs": "要在 CMake 项目中使用导出的库,请将 {value} 添加到 CMake 命令行。", - "CacheHelp": "参数应为要搜索的子字符串,或没有用于显示所有已缓存库的参数。", "CheckedOutGitSha": "签出的 Git SHA: {commit_sha}", "CheckedOutObjectMissingManifest": "签出对象不包含 CONTROL 文件或 vcpkg.json 文件。", "ChecksFailedCheck": "vcpkg 已崩溃;没有其他详细信息可用。", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "通过重新运行 bootstrap-vcpkg 更新 vcpkg 可能会解决此故障。", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "只有当通过 --ci-baseline 提供基线时才能使用 --allow-unexpected-passing。", "CiBaselineDisallowedCascade": "回归: {spec} 已级联,但需要它才能通过。({path})。", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "REGRESSION: 独立 {spec} 失败,出现 {build_result}。", "CiBaselineRegression": "REGRESSION: {spec} 失败,结果为 {build_result}。如果在预期之内,则添加 {spec}=fail to {path}。", "CiBaselineRegressionHeader": "回归测试:", + "CiBaselineUnexpectedFail": "REGRESSION: {spec} 被标记为失败,但 {triplet} 不支持。", + "CiBaselineUnexpectedFailCascade": "REGRESSION: {spec} 被标记为失败,但 {triplet} 不支持一个依赖项。", "CiBaselineUnexpectedPass": "正在通过,从失败列表中删除: {spec} ({path})。", "ClearingContents": "正在清除 {path} 的内容", "CmakeTargetsExcluded": "注意: 未显示其他 {count} 个目标。", - "CmdAddVersionOptAll": "处理所有端口的版本。", - "CmdAddVersionOptOverwriteVersion": "覆盖现有版本的 `git-tree`。", - "CmdAddVersionOptSkipFormatChk": "跳过 vcpkg.json 文件的格式检查。", - "CmdAddVersionOptSkipVersionFormatChk": "跳过版本格式检查。", - "CmdAddVersionOptVerbose": "打印成功消息,而不仅仅是错误。", + "CmdAcquireExample1": "vcpkg 获取 ", + "CmdAcquireProjectSynopsis": "获取清单引用的所有项目", + "CmdAcquireSynopsis": "获取命名的项目", + "CmdActivateSynopsis": "从清单激活项目", + "CmdAddExample1": "vcpkg 添加端口 ", + "CmdAddExample2": "vcpkg 添加项目 ", + "CmdAddSynopsis": "将依赖项添加到清单", + "CmdAddVersionExample1": "vcpkg x-add-version ", + "CmdAddVersionOptAll": "处理所有端口的版本", + "CmdAddVersionOptOverwriteVersion": "覆盖现有版本的 git 树", + "CmdAddVersionOptSkipFormatChk": "跳过 vcpkg.json 文件的格式检查", + "CmdAddVersionOptSkipVersionFormatChk": "跳过版本格式检查", + "CmdAddVersionOptVerbose": "打印成功消息,而不是仅打印错误", + "CmdAddVersionSynopsis": "将版本添加到版本数据库", + "CmdBootstrapStandaloneSynopsis": "仅从 vcpkg 二进制文件启动 vcpkg 根", + "CmdBuildExample1": "vcpkg 生成 ", + "CmdBuildExternalExample1": "vcpkg build-external ", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "从路径生成端口", + "CmdBuildSynopsis": "生成端口", + "CmdCacheExample1": "vcpkg 缓存 ", + "CmdCacheSynopsis": "列出包的规格", + "CmdCheckSupportExample1": "vcpkg x-check-support ", + "CmdCheckSupportSynopsis": "测试在不生成端口的情况下是否支持端口", + "CmdCiCleanSynopsis": "清除所有文件以准备 CI 运行", + "CmdCiSynopsis": "尝试生成用于 CI 测试的所有端口", + "CmdCiVerifyVersionsSynopsis": "检查版本数据库的完整性", "CmdContactOptSurvey": "启动当前 vcpkg 调查的默认浏览器", - "CmdDependInfoOptDGML": "基于 dgml 创建图形", - "CmdDependInfoOptDepth": "在输出中显示递归深度", - "CmdDependInfoOptDot": "基于点创建图形", - "CmdDependInfoOptMaxRecurse": "设置最大递归深度,值 -1 表示无限制", - "CmdDependInfoOptSort": "设置依赖项列表的排序顺序,可接受的值为: 字典、拓扑(默认)、x 树、反向", + "CmdCreateExample1": "vcpkg 创建 ", + "CmdCreateExample2": "vcpkg 创建 my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg 创建 ", + "CmdDeactivateSynopsis": "从当前 shell 中删除所有项目激活", + "CmdDependInfoExample1": "vcpkg depend-info ", + "CmdDependInfoFormatConflict": "指定的格式冲突。只接受 --format、--dgml 或 --dot 中的一个。", + "CmdDependInfoFormatHelp": "选择输出格式,从 `list`、`tree`、 `mermaid`、`dot` 或 `dgml` 中选择一个", + "CmdDependInfoFormatInvalid": "--format={value} 不是可识别的格式。--format 必须是 `list`、`tree`、 `mermaid`、`dot` 或 `dgml` 中的一个。", + "CmdDependInfoOptDepth": "在 `list` 输出中显示递归深度", + "CmdDependInfoOptMaxRecurse": "设置最大递归深度。默认值没有限制", + "CmdDependInfoOptSort": "选择 `list` 格式的排序顺序,从 `lexicographical`、`topological` (默认) 和 `reverse` 中选择一个", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth 只能与 `list` 和 `tree` 格式一起使用。", + "CmdDependInfoXtreeTree": "--sort=x-tree 不能与 tree 以外的格式一起使用", + "CmdDownloadExample1": "vcpkg x-download --url=https://...", + "CmdDownloadExample2": "vcpkg x-download --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "下载文件", + "CmdEditExample1": "vcpkg 编辑", "CmdEditOptAll": "打开编辑器以进入端口以及特定于端口的生成树子文件夹", "CmdEditOptBuildTrees": "打开编辑器以进入特定于端口的生成树子文件夹", - "CmdEnvOptions": "将已安装的 {path} 添加到 {env_var}", + "CmdEnvOptions": "将安装的 {path} 添加到 {env_var}", + "CmdExportEmptyPlan": "拒绝创建零包导出。在导出之前安装包。", + "CmdExportExample1": "vcpkg 导出 [--nuget] [--directory=out_dir]", "CmdExportOpt7Zip": "导出为 7zip (.7z)文件", - "CmdExportOptChocolatey": "导出 Chocolatey 包(实验性功能)", - "CmdExportOptDebug": "启用 prefab 调试", - "CmdExportOptDryRun": "请勿实际导出。", + "CmdExportOptChocolatey": "导出 Chocolatey 包(实验性)", + "CmdExportOptDebug": "启用预制调试", + "CmdExportOptDryRun": "不实际导出", "CmdExportOptIFW": "导出到基于 IFW 的安装程序", - "CmdExportOptInstalled": "导出所有已安装的包", + "CmdExportOptInstalled": "导出所有安装的包", "CmdExportOptMaven": "启用 Maven", "CmdExportOptNuget": "导出 NuGet 包", "CmdExportOptPrefab": "导出为 Prefab 格式", "CmdExportOptRaw": "导出到未压缩的目录", "CmdExportOptZip": "导出为 zip 文件", - "CmdExportSettingChocolateyMaint": "指定导出的 Chocolatey 包的维护程序(实验性功能)", - "CmdExportSettingChocolateyVersion": "指定要为导出的 Chocolatey 包添加的版本后缀(实验性功能)", - "CmdExportSettingConfigFile": "指定安装程序配置的临时文件路径", - "CmdExportSettingInstallerPath": "指定导出的安装程序的文件路径", - "CmdExportSettingNugetDesc": "指定导出的 NuGet 包的说明", - "CmdExportSettingNugetID": "指定导出的 NuGet 包的 ID (替代 --output)", - "CmdExportSettingNugetVersion": "指定导出的 NuGet 包的版本", - "CmdExportSettingOutput": "指定输出名称(用于构造文件名)", - "CmdExportSettingOutputDir": "为生成的项目指定输出目录", - "CmdExportSettingPkgDir": "指定重新打包的包的临时目录路径", + "CmdExportSettingChocolateyMaint": "导出的 Chocolatey 包的维护程序(实验性)", + "CmdExportSettingChocolateyVersion": "要为导出的 Chocolatey 包添加的版本后缀(实验性)", + "CmdExportSettingConfigFile": "安装程序配置的临时文件路径", + "CmdExportSettingInstallerPath": "导出的安装程序的文件路径", + "CmdExportSettingNugetDesc": "导出的 NuGet 包的说明", + "CmdExportSettingNugetID": "导出的 NuGet 包的 ID (替代 --output)", + "CmdExportSettingNugetVersion": "导出的 NuGet 包的版本", + "CmdExportSettingOutput": "输出名称(用于构造文件名)", + "CmdExportSettingOutputDir": "生成项目的输出目录", + "CmdExportSettingPkgDir": "重新打包的包的临时目录路径", "CmdExportSettingPrefabArtifactID": "项目 ID 是符合 Maven 规范的项目名称", "CmdExportSettingPrefabGroupID": "GroupId 会根据 Maven 规范唯一标识项目", "CmdExportSettingPrefabVersion": "版本是符合 Maven 规范的项目名称", - "CmdExportSettingRepoDir": "指定导出的存储库的目录路径", - "CmdExportSettingRepoURL": "指定联机安装程序的远程存储库 URL", + "CmdExportSettingRepoDir": "导出的存储库的目录路径", + "CmdExportSettingRepoURL": "联机安装程序的远程存储库 URL", "CmdExportSettingSDKMinVersion": "Android 支持的最低 SDK 版本", "CmdExportSettingSDKTargetVersion": "Android 目标 sdk 版本", - "CmdFetchOptXStderrStatus": "将状态/下载消息定向到 stderr 而不是 stdout。(错误/失败仍会转到 stdout)", - "CmdFormatManifestOptAll": "设置所有端口的清单文件的格式。", - "CmdFormatManifestOptConvertControl": "将 CONTROL 文件转换为清单文件。", + "CmdExportSynopsis": "创建已安装端口的独立部署", + "CmdFetchOptXStderrStatus": "将状态/下载消息打印到 stderr 而不是 stdout。(错误/失败仍会转到 stdout)", + "CmdFetchSynopsis": "从系统或 Internet 提取内容", + "CmdFindExample1": "vcpkg 查找端口 ", + "CmdFindExample2": "vcpkg 查找项目 ", + "CmdFindSynopsis": "查找可能已安装或激活的端口或项目", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "设置所有端口的清单文件的格式", + "CmdFormatManifestOptConvertControl": "将 CONTROL 文件转换为清单文件", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props ", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "生成 msbuild .props 文件(就像激活清单的项目依赖项一样),而不获取它们", "CmdGenerateMessageMapOptNoOutputComments": "生成消息映射时,排除注释(可用于生成英语本地化文件)", - "CmdInfoOptInstalled": "(实验性)报告已安装的包,而不是可获得的包", + "CmdHashExample1": "vcpkg 哈希 ", + "CmdHashExample2": "vcpkg 哈希 SHA256", + "CmdHashSynopsis": "获取文件的 SHA256 或 SHA512", + "CmdHelpCommandSynopsis": "显示 的帮助详细信息", + "CmdHelpCommands": "帮助 ", + "CmdHelpCommandsSynopsis": "显示命令的完整列表,包括此处未列出的罕见命令", + "CmdHelpTopic": "帮助 ", + "CmdInfoOptInstalled": "(实验性)报告安装的包,而不是可用的包", "CmdInfoOptTransitive": "(实验性)另请报告已安装包的依赖项", - "CmdNewOptApplication": "创建应用程序清单(不需要名称或版本)。", - "CmdNewOptSingleFile": "将 vcpkg-configuration.json 嵌入 vcpkg.json。", + "CmdInitRegistryExample1": "vcpkg x-init-registry ", + "CmdInitRegistrySynopsis": "创建空白 GIT 注册表", + "CmdInstallExample1": "vcpkg 安装 ...", + "CmdIntegrateSynopsis": "将 vcpkg 与计算机、项目或 shell 集成", + "CmdListExample2": "vcpkg 列表 ", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "创建应用程序清单(不需要名称或版本)", + "CmdNewOptSingleFile": "将 vcpkg-configuration.json 嵌入 vcpkg.json", "CmdNewOptVersionDate": "将 --version 解释为 ISO 8601 日期。(YYYY-MM-DD)", - "CmdNewOptVersionRelaxed": "将 --version 解释为宽松的数字版本。(非负数且以点分隔)", - "CmdNewOptVersionString": "将 --version 解释为没有排序行为的字符串。", - "CmdNewSettingName": "新清单的名称。", - "CmdNewSettingVersion": "新清单的版本。", + "CmdNewOptVersionRelaxed": "将 --version 解释为宽松的数字版本(非负数且以点分隔)", + "CmdNewOptVersionString": "将 --version 解释为没有排序行为的字符串", + "CmdNewSettingName": "新清单的名称", + "CmdNewSettingVersion": "新清单的版本", + "CmdNewSynposis": "新建清单", + "CmdOwnsExample1": "vcpkg 拥有 ", + "CmdPackageInfoExample1": "vcpkg x-package-info ...", + "CmdPortsdiffExample1": "vcpkg portsdiff ", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "区分提交之间端口版本中的更改", "CmdRegenerateOptDryRun": "不实际执行操作,仅显示将要执行的操作", "CmdRegenerateOptForce": "继续执行(可能具有危险的)操作而不进行确认", "CmdRegenerateOptNormalize": "应用任何弃用修补程序", - "CmdRemoveOptDryRun": "打印要移除的包,但请勿移除它们", - "CmdRemoveOptOutdated": "选择版本与端口文件不匹配的的所有包", - "CmdRemoveOptRecurse": "允许删除命令行中未明确指定的包", - "CmdSetInstalledOptDryRun": "请勿实际生成或安装", - "CmdSetInstalledOptNoUsage": "请勿在安装后打印 CMake 使用情况信息。", - "CmdSetInstalledOptWritePkgConfig": "写出 NuGet packages.config 格式的文件以用于外部二进制缓存。\n有关详细信息,请参阅 `vcpkg help binarycaching`。", + "CmdRemoveExample1": "vcpkg 删除 ...", + "CmdRemoveOptDryRun": "打印要移除的包,但不要移除它们", + "CmdRemoveOptOutdated": "删除版本与内置注册表不匹配的的所有包", + "CmdRemoveOptRecurse": "允许删除未显式指定的从属包", + "CmdSearchExample1": "vcpkg 搜索 ", + "CmdSetInstalledExample1": "vcpkg x-set-installed ...", + "CmdSetInstalledOptDryRun": "不实际生成或安装", + "CmdSetInstalledOptNoUsage": "不要在安装后打印 CMake 使用情况信息", + "CmdSetInstalledOptWritePkgConfig": "写入 NuGet packages.config 格式的文件以用于外部二进制缓存。有关详细信息,请参阅 `vcpkg help binarycaching`。", + "CmdSetInstalledSynopsis": "安装、升级或删除包,以便包与提供的包完全匹配", "CmdSettingCopiedFilesLog": "要创建的复制文件日志的路径", "CmdSettingInstalledDir": "要使用的已安装树的路径", "CmdSettingTLogFile": "要创建的 tlog 文件的路径", "CmdSettingTargetBin": "要分析的二进制文件的路径", "CmdUpdateBaselineOptDryRun": "打印出计划而不执行", - "CmdUpdateBaselineOptInitial": "将 `builtin-baseline` 添加到尚没有该命令的 vcpkg.json", - "CmdUpgradeOptAllowUnsupported": "请继续显示警告,而不是在不受支持的端口上报错。", + "CmdUpdateBaselineOptInitial": "将 `builtin-baseline` 添加到尚无该命令的 vcpkg.json", + "CmdUpdateBaselineSynopsis": "将清单中 git 注册表的基线更新为这些注册表的 HEAD提交", + "CmdUpdateRegistryAll": "更新所有已知项目注册表", + "CmdUpdateRegistryAllExcludesTargets": "更新注册表 --不能与项目注册表列表一起使用全部", + "CmdUpdateRegistryAllOrTargets": "更新注册表需要项目注册表名称列表或要更新的 URiI 或 --全部。", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry ", + "CmdUpdateRegistrySynopsis": "重新下载项目注册表", "CmdUpgradeOptNoDryRun": "实际升级", "CmdUpgradeOptNoKeepGoing": "失败时停止安装包", + "CmdUseExample1": "vcpkg 使用 ", + "CmdUseSynopsis": "激活此 shell 中的单个项目", + "CmdVSInstancesSynopsis": "列出检测到的 Visual Studio 实例", "CmdXDownloadOptHeader": "从 URL 提取时要使用的其他标头", "CmdXDownloadOptSha": "要下载的文件的哈希", - "CmdXDownloadOptSkipSha": "请勿检查所下载文件的 SHA512", - "CmdXDownloadOptStore": "指示应存储文件而不是提取文件", + "CmdXDownloadOptSkipSha": "跳过对已下载文件的 SHA512 的检查", + "CmdXDownloadOptStore": "存储文件应比提取文件更重要", "CmdXDownloadOptUrl": "要下载和存储的 URL (如果缓存中缺失)", + "CmdZApplocalSynopsis": "将二进制文件的依赖项从安装的树复制到该二进制文件的位置以进行应用本地部署", + "CmdZExtractExample1": "vcpkg z-extract ", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "要从所有路径中去除的前导目录数", + "CommandEnvExample2": "vcpkg env \"ninja -C \" --triplet x64-windows", "CommandFailed": "命令:\n{command_line}\n失败,结果如下:", - "Commands": "命令:", - "CommunityTriplets": "VCPKG 社区三元组:", + "CommunityTriplets": "社区三元组:", "ComparingUtf8Decoders": "比较具有不同来源的 Utf8Decoder;这始终是一个错误", "CompressFolderFailed": "无法压缩文件夹“{path}”:", "ComputingInstallPlan": "正在计算安装计划...", "ConfigurationErrorRegistriesWithoutBaseline": "{path} 中定义的配置无效。\n\n使用注册表需要为默认注册表设置基线,或者默认注册表为 null。\n\n有关更多详细信息,请参阅 {url}。", "ConfigurationNestedDemands": "[\"{json_field}\"] 包含嵌套的'需求'对象(嵌套的'需求'不起作用)", "ConflictingFiles": "以下文件已安装在 {path} 中,并与 {spec} 发生冲突", + "ConsideredVersions": "考虑了以下可执行文件,但由于 {version} 的版本要求而被放弃:", "ConstraintViolation": "发现约束冲突:", "ContinueCodeUnitInStart": "在“开始”位置找到了继续码位", "ControlAndManifestFilesPresent": "端口目录中同时存在清单文件和 CONTROL 文件: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "数据库已损坏。", "CorruptedInstallTree": "你的 vcpkg “installed” 树已损坏。", "CouldNotDeduceNugetIdAndVersion": "无法从文件名推导出 nuget ID 和版本: {path}", - "CouldNotFindBaseline": "找不到基线文件 {path} 中显式指定的基线 `\"{commit_sha}\"`", - "CouldNotFindBaselineForRepo": "找不到存储库 {package_name} 的基线 `\"{commit_sha}\"`", - "CouldNotFindBaselineInCommit": "在存储库 {package_name} 的提交 `\"{commit_sha}\"` 中找不到基线:", + "CouldNotFindBaselineInCommit": "在 {url} 的 {commit_sha} 中找不到 {package_name} 的基线。", "CouldNotFindGitTreeAtCommit": "在提交 {commit_sha} 的存储库 {package_name} 中找不到 `versions` 的 git 树", "CouldNotFindToolVersion": "在 {path} 中找不到 版", "CouldNotFindVersionDatabaseFile": "找不到版本数据库文件: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "环境变量 VCPKG_DEFAULT_BINARY_CACHE 必须是目录(曾为: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "环境变量 VCPKG_DEFAULT_BINARY_CACHE 必须是绝对(曾为: {path})", "DefaultBinaryCacheRequiresDirectory": "环境变量 VCPKG_DEFAULT_BINARY_CACHE 必须是目录(曾为: {path})", - "DefaultBrowserLaunched": "已启动默认浏览器到 {url}。", + "DefaultFeatureCore": "功能“核心”关闭默认功能,因此不能位于默认功能列表中", + "DefaultFeatureDefault": "功能“default”引用默认功能集,因此不能位于默认功能列表中", + "DefaultFeatureIdentifier": "默认功能的名称必须是标识符", "DefaultFlag": "默认为 --{option} 处于打开状态。", "DefaultRegistryIsArtifact": "默认注册表不能是项目注册表。", - "DefaultTriplet": "从 2023 年 9 月版本开始,vcpkg 库的默认三元组将从 x86-windows 更改为检测到的主机三元组({triplet})。若要解决此消息,请添加 --triplet x86-windows 以保留相同的行为。", + "DefaultTripletChanged": "在 2023 年 9 月版本中,vcpkg 库的默认三元组从 x86-windows 更改为检测到的主机三元组({triplet})。对于旧行为,请添加 --triplet x86-windows。要取消显示此消息,请添加 --triplet {triplet}。", "DeleteVcpkgConfigFromManifest": "-- 或从清单文件 {path} 中删除 \"vcpkg-configuration\"。", + "DependencyFeatureCore": "功能“核心”不能位于依赖项的功能列表中。要关闭默认功能,请改为添加 \"default-features\": false。", + "DependencyFeatureDefault": "功能“默认”不能位于依赖项的功能列表中。要打开默认功能,请改为添加“default-features”: true。", + "DependencyGraphCalculation": "已启用依赖项关系图提交。", + "DependencyGraphFailure": "依赖项关系图提交失败。", + "DependencyGraphSuccess": "依赖项关系图提交成功。", "DeprecatedPrefabDebugOption": "--prefab-debug 现已弃用。", "DetectCompilerHash": "正在检测三元组 {triplet} 的编译器哈希...", "DocumentedFieldsSuggestUpdate": "如果这些是应识别的文档字段,请尝试更新 vcpkg 工具。", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "文件没有预期的哈希: \nurl: {url}\n文件: {path}\n预期哈希: {expected}\n实际哈希: {actual}", "DownloadFailedRetrying": "下载失败 -- 将在 {value}ms 后重试", "DownloadFailedStatusCode": "{url}: 失败: 状态代码为 {value}", - "DownloadRootsDir": "指定下载根目录.\n(默认值: {env_var})", + "DownloadRootsDir": "下载目录(默认值: {env_var})", "DownloadWinHttpError": "{url}: {system_api} 失败,退出代码为 {exit_code}", "DownloadedSources": "已下载的 {spec} 源", "DownloadingPortableToolVersionX": "找不到合适的{tool_name}版本(所需版本为 {version})。正在下载可移植版本 {tool_name} {version}...", "DownloadingTool": "正在下载{tool_name}...\n{url}->{path}", "DownloadingUrl": "正在下载 {url}", - "DownloadingVcpkgCeBundle": "正在下载 vcpkg-artifacts 捆绑包 {version}...", - "DownloadingVcpkgCeBundleLatest": "正在下载最新的 vcpkg-artifacts 捆绑包...", "DownloadingVcpkgStandaloneBundle": "正在下载独立捆绑包 {version}。", "DownloadingVcpkgStandaloneBundleLatest": "正在下载最新的独立捆绑包。", "DuplicatePackagePattern": "包“{package_name}”重复。", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "检测编译器信息时: \n“{path}”下的日志文件内容为:", "ErrorIndividualPackagesUnsupported": "在清单模式下,`vcpkg install` 不支持单个包参数。\n要安装其他包,请编辑 vcpkg.json,然后在没有任何包参数的情况下运行 `vcpkg install`。", "ErrorInvalidClassicModeOption": "在经典模式下不支持选项 --{option},并且未找到任何清单。", + "ErrorInvalidExtractOption": "--{option} 必须设置为非负整数或 \"AUTO\"。", "ErrorInvalidManifestModeOption": "清单模式下不支持选项 --{option}。", "ErrorMessage": "错误:", "ErrorMessageMustUsePrintError": "名为 {value} 的消息以错误开头:,必须在代码中将其更改为在前面追加 ErrorMessage。", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "分析 {path} 时出错。", "ErrorWhileWriting": "写入 {path} 时出错。", "ErrorsFound": "发现以下错误:", - "Example": "例如:", + "ExamplesHeader": "示例:", "ExceededRecursionDepth": "已超过递归深度。", "ExcludedPackage": "已排除 {spec}", "ExcludedPackages": "已排除以下包:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "正在导出维护工具...", "ExportingPackage": "正在导出 {package_name}...", "ExtendedDocumentationAtUrl": "可在“{url}”上找到扩展文档。", + "ExtractHelp": "提取存档。", "ExtractingTool": "正在提取{tool_name}...", "FailedPostBuildChecks": "发现 {count} 个生成后检查问题。要将这些端口提交到特选目录,请首先更正端口文件: {path}", "FailedToAcquireMutant": "无法获取变体 {path}", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "无法确定当前提交:", "FailedToDownloadFromMirrorSet": "未能从镜像集下载", "FailedToExtract": "无法提取“{path}”:", - "FailedToFetchError": "{error_msg}\n无法提取 {package_name}:", - "FailedToFindBaseline": "未能找到 baseline.json", + "FailedToFetchRepo": "无法提取 {url}。", "FailedToFindPortFeature": "{package_name} 没有名为 {feature} 的功能。", "FailedToFormatMissingFile": "没有要设置格式的文件。\n请传递 --all 或要设置格式或转换的显式文件。", "FailedToLoadInstalledManifest": "由于以下错误,无法加载 {package_name} 的控制或清单文件。请删除 {package_name},然后重试。", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "未能在 {path} 上锁定文件系统", "FailedToWriteManifest": "未能写入清单文件 {path}", "FailedVendorAuthentication": "一个或多个 {vendor} 凭据提供程序无法进行身份验证。有关如何提供凭据的更多详细信息,请参阅“{url}”。", - "FeedbackAppreciated": "非常感谢你提供反馈!", "FetchingBaselineInfo": "正在从 {package_name} 提取基线信息...", "FetchingRegistryInfo": "正在从 {url} ({value}) 提取注册表信息...", "FieldKindDidNotHaveExpectedValue": "\"kind\" 没有预期值: (应为以下值之一: {expected}; 找到的是 {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "在以下文件中找到了绝对路径:", "FilesExported": "文件导出位置: {path}", "FindHelp": "搜索指示的项目或端口。在 \"artifact\" 或 \"port\" 后无参数时,显示所有内容。", + "FindVersionArtifactsOnly": "--version 不能与 vcpkg 搜索或 vcpkg 查找端口一起使用", "FishCompletion": "已在“{path}”下添加 vcpkg fish 完成。", "FloatingPointConstTooBig": "浮点常量太大: {count}", "FollowingPackagesMissingControl": "以下包没有有效的 CONTROL 或 vcpkg.json:", "FollowingPackagesNotInstalled": "未安装以下包:", "FollowingPackagesUpgraded": "以下包是最新的:", + "ForMoreHelp": "有关更多帮助", "ForceSystemBinariesOnWeirdPlatforms": "必须在 arm、s390x、ppc64le、riscv 平台上设置环境变量 VCPKG_FORCE_SYSTEM_BINARIES。", "FormattedParseMessageExpression": "在表达式上: {value}", "GHAParametersMissing": "GHA 二进制源要求设置 ACTIONS_RUNTIME_TOKEN 和 ACTIONS_CACHE_URL 环境变量。有关详细信息,请参阅 {url}。", @@ -470,7 +590,7 @@ "GitCommandFailed": "执行 {command_line} 失败", "GitFailedToFetch": "无法从存储库 {url} 中提取引用 {value}", "GitFailedToInitializeLocalRepository": "初始化本地存储库 {path} 失败", - "GitRegistryMustHaveBaseline": "\"{package_name}\"的 GIT 注册表项必须具有“baseline”字段,该字段是有效的 git 提交 SHA (40 个十六进制字符)。\n该存储库的当前头为 \"{value}\"。", + "GitRegistryMustHaveBaseline": "git 注册表 \"{url}\" 必须具有“baseline”字段,该字段是有效的 git 提交 SHA (40 个十六进制字符)。\n若要使用当前最新版本,请将基线设置为该存储库的 HEAD,\"{commit_sha}\"。", "GitStatusOutputExpectedFileName": "应输入文件名", "GitStatusOutputExpectedNewLine": "预期的新行", "GitStatusOutputExpectedRenameOrNewline": "应重命名的文件或新行", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "git 在运行 {command_line} 时生成了意外输出", "GraphCycleDetected": "在 {package_name} 的图形中检测到循环:", "HashFileFailureToRead": "无法读取用于哈希的文件“{path}”: ", + "HashPortManyFiles": "{package_name} 包含 {count} 个文件。确定二进制缓存的 ABI 哈希时,对这些内容进行哈希处理可能需要较长时间。请考虑减少文件数。出现此问题的常见原因是,将源或生成文件意外签出到端口的目录。", "HeaderOnlyUsage": "{package_name} 是仅限标头的,可通过以下方式从 CMake 使用:", "HelpAssetCaching": "**试验性功能: 此功能可能会随时更改或删除**\n\nvcpkg 可以使用镜像来缓存下载的资产,确保即使原始源更改或消失,也能继续操作。\n\n可以通过将环境变量 X_VCPKG_ASSET_SOURCES 设置为以分号分隔的源列表或传递 --x-asset-sources= 命令行选项序列来配置资产缓存。命令行源在环境源之后进行解释。可以使用反引号(`)转义逗号、分号和反引号。\n\n某些字符串的 可选参数控制如何访问它们。可将其指定为 \"read、\"write\" 或 \"readwrite\",默认为 \"read\"。\n\n有效源:", "HelpAssetCachingAzUrl": "添加 Azure Blob 存储源,可选择使用共享访问签名验证来添加。URL 应包含容器路径,并以尾随的 \"/\" 结束。如果已定义,应以 \"\" 作为前缀。如果非 Azure 服务器响应格式为 \"\" 的 GET 和 PUT 请求,则它们也将起作用。", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "指定 NuGet 网络操作的 NuGet 超时; 等效于 NuGet CLI 的 \"-Timeout\" 参数。", "HelpBuiltinBase": "基线引用 vcpkg 存储库中针对图中每个依赖项建立最低版本的提交。例如,如果未指定其他约束(直接或以可传递方式),则版本将解析为顶级清单的基线。将忽略可传递依赖项的基线。", "HelpCachingClear": "删除所有以前的源,包括默认值。", - "HelpContactCommand": "显示联系人信息以发送反馈。", - "HelpCreateCommand": "创建新端口。", - "HelpDependInfoCommand": "显示端口的依赖项列表。", - "HelpEditCommand": "打开用于编辑的端口(使用环境变量“{env_var}”设置编辑器程序,默认为 “code”)。", - "HelpEnvCommand": "创建用于开发或编译的干净 shell 环境。", - "HelpExampleCommand": "有关更多帮助(包括示例),请参阅随附的 README.md 和文档文件夹。", + "HelpContactCommand": "显示联系人信息以发送反馈", + "HelpCreateCommand": "新建端口", + "HelpDependInfoCommand": "显示端口的依赖项列表", + "HelpEditCommand": "编辑端口,可以选择使用 {env_var},默认为“代码”", + "HelpEnvCommand": "创建用于开发或编译的干净 shell 环境", + "HelpExampleCommand": "有关更多帮助(包括示例),请参阅 https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "示例清单:", "HelpExportCommand": "导出包。", - "HelpFormatManifestCommand": "设置所有 vcpkg.json 文件的格式。在提交到 vcpkg 之前运行此命令。", "HelpHashCommand": "按特定算法哈希文件,默认为 SHA512。", - "HelpInitializeRegistryCommand": "初始化目录 中的注册表。", - "HelpInstallCommand": "安装包。", - "HelpListCommand": "列出已安装的包。", + "HelpInstallCommand": "安装包", + "HelpListCommand": "列出安装的包", "HelpManifestConstraints": "清单可以对所使用的版本施加三种约束", "HelpMinVersion": "Vcpkg 将选择找到的与所有适用约束匹配的最低版本,包括在顶级指定的基线中的版本以及图中的任何 “version>=” 约束。", "HelpOverrides": "当用作顶级清单(例如在目录中运行 `vcpkg install` 时),替代允许清单短路依赖项解析,并精确指定要使用的版本。可将这些用于处理版本冲突,例如使用 `version-string` 依赖项。如果以可传递方式以来它们,则将不会考虑它们。", - "HelpOwnsCommand": "搜索已安装包中的文件。", + "HelpOwnsCommand": "在安装的包中搜索文件的所有者", "HelpPackagePublisher": "此外,包发布者可以使用 “version>=” 约束,以确保使用者至少使用某个特定最低版本的给定依赖项。例如,如果库需要在 1.70 中将 API 添加到 boost-asio,则 “version>=” 约束将确保可传递用户使用足够的版本,即使在单独的版本替代或跨注册表引用的情况下也是如此。", "HelpPortVersionScheme": "此外,每个版本还有一个非负整数的“端口版本”。在呈现为文本时,端口版本(如果非零)将作为后缀添加到由哈希(#)分隔的主版本文本中。端口版本在主版本文本后按字母顺序排序,例如:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "卸载包。", - "HelpRemoveOutdatedCommand": "卸载所有过期包。", - "HelpResponseFileCommand": "指定响应文件以提供其他参数。", - "HelpSearchCommand": "搜索可生成的包。", - "HelpTextOptFullDesc": "请勿截断长文本。", - "HelpTopicCommand": "显示特定主题的帮助。", - "HelpTopicsCommand": "显示帮助主题列表。", - "HelpTxtOptAllowUnsupportedPort": "请继续显示警告,而不是在不受支持的端口上报错。", - "HelpTxtOptCleanAfterBuild": "生成每个包后清理生成树、包和下载内容。", - "HelpTxtOptCleanBuildTreesAfterBuild": "生成每个包后清理生成树。", - "HelpTxtOptCleanDownloadsAfterBuild": "生成每个包后清理下载内容。", - "HelpTxtOptCleanPkgAfterBuild": "生成每个包后清理包。", - "HelpTxtOptDryRun": "请勿实际生成或安装。", + "HelpRemoveCommand": "卸载包", + "HelpResponseFileCommand": "在该位置展开的每行包含一个参数", + "HelpSearchCommand": "搜索可生成的包", + "HelpTextOptFullDesc": "不要截断长文本。", + "HelpTopicCommand": "显示特定帮助主题", + "HelpTopicsCommand": "显示帮助主题的完整列表", + "HelpTxtOptAllowUnsupportedPort": "继续对不受支持的端口发出警告,而不是失败", + "HelpTxtOptCleanAfterBuild": "生成每个包后清理生成树、包和下载内容", + "HelpTxtOptCleanBuildTreesAfterBuild": "生成每个包后清理生成树", + "HelpTxtOptCleanDownloadsAfterBuild": "生成每个包后清理下载内容", + "HelpTxtOptCleanPkgAfterBuild": "生成每个包后清理包", + "HelpTxtOptDryRun": "不实际生成或安装", "HelpTxtOptEditable": "对命令行上的库禁用源重新提取和二进制缓存(经典模式)", "HelpTxtOptEnforcePortChecks": "如果端口检测到问题或尝试使用已弃用的功能,则安装失败", - "HelpTxtOptKeepGoing": "失败时继续安装包。", - "HelpTxtOptManifestFeature": "要安装的顶级清单中的其他功能(清单模式)。", - "HelpTxtOptManifestNoDefault": "不要从顶级清单(清单模式)安装默认功能。", - "HelpTxtOptNoDownloads": "不下载新源。", - "HelpTxtOptNoUsage": "安装后不要打印 CMake 使用情况信息。", - "HelpTxtOptOnlyBinCache": "如果缓存的二进制文件不可用,则失败。", - "HelpTxtOptOnlyDownloads": "尽量尝试在不生成的情况下下载源。", - "HelpTxtOptRecurse": "允许在安装过程中移除包。", - "HelpTxtOptUseAria2": "使用 aria2 执行下载任务。", - "HelpTxtOptUseHeadVersion": "使用最新的上游源在命令行上安装库(经典模式)。", - "HelpTxtOptWritePkgConfig": "写出 NuGet packages.config 格式的文件以用于外部二进制缓存。\n有关详细信息,请参阅 `vcpkg help binarycaching`。", - "HelpUpdateBaseline": "使库保持最新的最佳方法是更新基线引用。这将确保更新所有包(包括可传递包)。但如果需要单独更新包,则可以使用 “version>=” 约束。", - "HelpUpdateCommand": "列出可以更新的包。", - "HelpUpgradeCommand": "重新生成所有过时的包。", - "HelpVersionCommand": "显示版本信息。", + "HelpTxtOptKeepGoing": "失败时继续安装包", + "HelpTxtOptManifestFeature": "要安装的顶级清单中的其他功能(清单模式)", + "HelpTxtOptManifestNoDefault": "不要从顶级清单(清单模式)安装默认功能", + "HelpTxtOptNoDownloads": "不下载新源", + "HelpTxtOptNoUsage": "不要在安装后打印 CMake 使用情况信息", + "HelpTxtOptOnlyBinCache": "如果缓存的二进制文件不可用,则失败", + "HelpTxtOptOnlyDownloads": "尽量尝试在不生成的情况下下载源", + "HelpTxtOptRecurse": "允许在安装过程中移除包", + "HelpTxtOptUseAria2": "使用 aria2 执行下载任务", + "HelpTxtOptUseHeadVersion": "使用最新的上游源在命令行上安装库(经典模式)", + "HelpTxtOptWritePkgConfig": "写入 NuGet packages.config 格式的文件以用于外部二进制缓存。有关详细信息,请参阅 `vcpkg help binarycaching`。", + "HelpUpdateBaseline": "使库保持最新的最佳方法是更新基线引用。这将确保更新所有包 (包括可传递包)。但是,如果需要单独更新包,则可以使用“version>=”约束。", + "HelpUpdateCommand": "列出可升级的包", + "HelpUpgradeCommand": "重新生成所有过时的包", + "HelpVersionCommand": "显示版本信息", "HelpVersionDateScheme": "日期(2021-01-01.5)", "HelpVersionGreater": "在“依赖项”字段中,每个依赖项可以列出最小约束。如果这些最小约束以可传递方式依赖于此库,则将使用这些最小约束。此外,还可以使用 “#” 后缀指定最低端口版本。", "HelpVersionScheme": "以点分隔的数字序列(1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "存档文件签名不正确", "IncorrectPESignature": "PE 签名不正确", "IncrementedUtf8Decoder": "字符串末尾的增量 Utf8Decoder", - "InfoSetEnvVar": "还可以将环境变量“{env_var}”设置为所选编辑器。", + "InfoSetEnvVar": "还可以将 {env_var} 设置为所选编辑器。", "InitRegistryFailedNoRepo": "无法在 {path} 下创建注册表,因为这不是 git 存储库根路径。\n请使用“git init {command_line}”在此文件夹中创建 git 存储库。", "InstallCopiedFile": "{path_source} -> {path_destination} 已完成", "InstallFailed": "失败: {path}: {error_msg}", "InstallPackageInstruction": "打开项目后,转到“工具”>“NuGet 包管理器”>“包管理器控制台”并粘贴:\n 安装包“{value}”- 源“{path}”", - "InstallRootDir": "(实验性)指定安装根目录。", + "InstallRootDir": "安装的目录(实验性)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} 已跳过,为最新", "InstallWithSystemManager": "可以通过系统包管理器安装此工具。", "InstallWithSystemManagerMono": "Ubuntu 18.04 用户可能需要较新版本的 mono,可通过 {url} 获得。", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- 正从以下位置安装端口: {path}", "InstallingMavenFile": "{path} 安装 maven 文件", "InstallingPackage": "正在安装 {action_index}/{count} 个 {spec}...", - "IntegrateBashHelp": "启用 bash 选项卡补全。", - "IntegrateFishHelp": "启用 fish 选项卡补全。", - "IntegrateInstallHelpLinux": "使已安装的包在用户范围内可用。", - "IntegrateInstallHelpWindows": "使已安装的包在用户范围内可用。首次使用时需要管理员权限。", - "IntegratePowerShellHelp": "启用 PowerShell 选项卡补全。", - "IntegrateProjectHelp": "为单个 VS 项目使用生成引用 NuGet 包。", - "IntegrateRemoveHelp": "删除用户范围内的集成。", - "IntegrateZshHelp": "启用 zsh 选项卡补全。", - "IntegrationFailed": "未应用集成。", + "IntegrateBashHelp": "启用 bash Tab-completion。仅限非 Windows", + "IntegrateFishHelp": "启用 fish 选项卡补全。仅限非 Windows", + "IntegrateInstallHelpLinux": "使已安装的包在用户范围内可用", + "IntegrateInstallHelpWindows": "使已安装的包在用户范围内可用。首次使用时需要管理员权限", + "IntegrateNonWindowsOnly": "{command_line} 仅限非 Windows,在此系统上不受支持。", + "IntegratePowerShellHelp": "启用 PowerShell 选项卡补全。仅限 Windows", + "IntegrateProjectHelp": "为单个 Visual Studio 项目使用生成引用 NuGet 包。仅限 Windows", + "IntegrateRemoveHelp": "删除用户范围内的集成", + "IntegrateWindowsOnly": "{command_line} 仅限 Windows,在此系统上不受支持。", + "IntegrateZshHelp": "启用 zsh Tab-completion。仅限非 Windows", + "IntegrationFailedVS2015": "集成未应用于 Visual Studio 2015。", "InternalCICommand": "vcpkg ci 是一个内部命令,它将发生不兼容更改或随时被删除。", "InternalErrorMessage": "内部错误: ", "InternalErrorMessageContact": "请在 https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug 打开一个包含重现问题的详细步骤的问题。", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg 不支持 c 样式注释,但大多数对象允许将 $ 前缀字段用作注释。", "InvalidCommitId": "提交 ID 无效: {commit_sha}", "InvalidDefaultFeatureName": "\"default\" 是保留的功能名称", - "InvalidDependency": "依赖项必须是小写字母数字+连字符,而不是保留名称之一", "InvalidFeature": "特征必须是小写字母数字+连字符,而不是保留名称之一", "InvalidFileType": "失败: {path} 无法处理文件类型", "InvalidFilename": "文件名不能包含无效字符 {value},但为 {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "库无效: 找不到链接器成员。", "InvalidLinkage": "{system_name} 链接类型无效: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "逻辑表达式无效,意外字符", - "InvalidLogicExpressionUsePipe": "逻辑表达式无效,请使用 \"|\" 而非 \"or\"", + "InvalidLogicExpressionUsePipe": "逻辑表达式无效,请使用 \"|\" 而不是 \"or\"", "InvalidNoVersions": "文件不包含任何版本。", "InvalidOptionForRemove": "“remove” 接受库或 “--outdated”", "InvalidPortVersonName": "找到无效的端口版本文件名: `{path}`。", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "[\"{json_field}\"] 的值必须是对象", "JsonFieldNotString": "[\"{json_field}\"] 的值必须是字符串", "JsonFileMissingExtension": "JSON 文件 {path} 必须具有 .json (全小写)扩展名", - "JsonSwitch": "(实验性)请求 JSON 输出。", + "JsonSwitch": "打印 JSON 而不是纯文本", "JsonValueNotArray": "json 值不是数组", "JsonValueNotObject": "json 值不是对象", "JsonValueNotString": "json 值不是字符串", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "动态发布(/MD)", "LinkageStaticDebug": "静态调试(/MTd)", "LinkageStaticRelease": "静态发布(/MT)", - "ListHelp": "参数应为要搜索的子字符串,或没有用于显示所有已安装库的参数。", + "ListHelp": "列出安装的库", "ListOfValidFieldsForControlFiles": "这是 CONTROL 文件的有效字段列表(区分大小写):", "LoadingCommunityTriplet": "-- [COMMUNITY] 正在从以下位置加载三联配置: {path}", "LoadingDependencyInformation": "正在加载 {count} 个包的依赖项信息...", @@ -708,7 +827,6 @@ "MultiArch": "多体系结构必须“相同”,但此前为 {option}", "MultipleFeatures": "{package_name} 多次声明 {feature};请确保功能具有不同的名称", "MutuallyExclusiveOption": "--{value} 不能与 --{option} 一起使用。", - "NavigateToNPS": "请在首选浏览器中导航到 {url}。", "NewConfigurationAlreadyExists": "创建清单将覆盖位于 {path} 下的 vcpkg-configuration.json。", "NewManifestAlreadyExists": "{path} 下已存在清单。", "NewNameCannotBeEmpty": "--name 不能为空。", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "指定 --name 和 --version 以生成用于 C++ 库的清单,或指定 --application 以指示不将清单用作端口。", "NewVersionCannotBeEmpty": "--version 不能为空。", "NoArgumentsForOption": "选项 --{option} 不接受参数。", - "NoCachedPackages": "未缓存任何包。", "NoError": "无错误", "NoInstalledPackages": "未安装任何包。你指的是“search”吗?", "NoLocalizationForMessages": "没有针对以下内容的本地化消息: ", @@ -739,11 +856,13 @@ "OptionRequiresAValue": "选项“{option}”需要一个值", "OptionRequiresOption": "--{value} 需要 --{option}", "OptionUsedMultipleTimes": "已多次指定选项“{option}”", - "OptionalCommand": "可选命令", "Options": "选项", "OriginalBinParagraphHeader": "\n原始二进制段落", + "OtherCommandsHeader": "其他", "OverlayPatchDir": "覆盖路径“{path}”必须存在并且必须为目录。", - "OverlayTriplets": "覆盖 {path} 中的三元组:", + "OverlayPortsDirectoriesHelp": "覆盖端口的目录(也是: {env_var})", + "OverlayTripletDirectoriesHelp": "覆盖三元组的目录(也是: {env_var})", + "OverlayTriplets": "覆盖“{path}”中的三元组:", "OverwritingFile": "文件 {path} 已存在,并将被覆盖", "PECoffHeaderTooShort": "分析可移植可执行文件 {path} 时,COFF 标头的大小太小,无法包含有效的 PE 标头。", "PEConfigCrossesSectionBoundary": "分析可移植可执行文件 {path} 时,映像配置目录跨越了一个分区边界。", @@ -752,9 +871,12 @@ "PERvaNotFound": "分析可移植可执行文件 {path} 时,找不到 RVA {value:#X}。", "PESignatureMismatch": "分析可移植可执行文件 {path} 时,签名不匹配。", "PackageAlreadyRemoved": "无法删除 {spec}: 已删除", + "PackageDiscoveryHeader": "包发现", "PackageFailedtWhileExtracting": "提取 {path} 时“{value}”失败。", - "PackageInfoHelp": "显示有关包的详细信息。", - "PackageRootDir": "(实验性)指定包根目录。", + "PackageInfoHelp": "显示有关包的详细信息", + "PackageInstallationHeader": "包安装", + "PackageManipulationHeader": "包操作", + "PackageRootDir": "包目录(实验性)", "PackagesToInstall": "将生成并安装以下包:", "PackagesToInstallDirectly": "将直接安装以下包:", "PackagesToModify": "将修改其他包(*)以完成此操作。", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "{value} 应为 {expected}", "ParseControlErrorInfoWhileLoading": "加载 {path} 时:", "ParseControlErrorInfoWrongTypeFields": "以下字段具有错误的类型:", - "ParseIdentifierError": "\"{value}\" 不是有效的标识符。标识符必须由小写字母数字字符和连字符组成,且不得为预留值(有关详细信息,请参阅 {url})", - "ParsePackageNameError": "“{package_name}”不是有效的包名称。包名称必须由小写字母数字字符和连字符组成,且不得为预留值(有关详细信息,请参阅 {url})", - "ParsePackagePatternError": "“{package_name}”不是有效的包模式。包模式只能使用一个通配符(*),并且它必须是模式中的最后一个字符(有关详细信息,请参阅 {url})", + "ParseFeatureNameError": "“{package_name}”不是有效的功能名称。功能名称必须由小写字母数字字符和连字符组成,且不得为预留值(有关详细信息,请参阅 {url})。", + "ParseIdentifierError": "\"{value}\" 不是有效的标识符。标识符必须由小写字母数字字符和连字符组成,且不得为预留值(有关详细信息,请参阅 {url})。", + "ParsePackageNameError": "“{package_name}”不是有效的包名称。包名称必须由小写字母数字字符和连字符组成,且不得为预留值(有关详细信息,请参阅 {url})。", + "ParsePackagePatternError": "“{package_name}”不是有效的包模式。包模式只能使用一个通配符(*),并且它必须是模式中的最后一个字符(有关详细信息,请参阅 {url})。", "PathMustBeAbsolute": "环境变量 X_VCPKG_REGISTRIES_CACHE 的值不是绝对值: {path}", "PerformingPostBuildValidation": "-- 执行生成后验证", "PortBugAllowRestrictedHeaders": "在特殊情况下,可以通过 {env_var} 禁用此策略", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "要检查 {extension} 文件,请使用:", "PortBugInvalidCrtLinkage": "以下二进制文件应使用 {expected} CRT。", "PortBugInvalidCrtLinkageEntry": "{path} 链接,带有:", + "PortBugKernel32FromXbox": "所选三元组面向的是 Xbox,但下面的 DLL 与 kernel32 链接。无法在没有 kernel32 的 Xbox 上加载这些 DLL。出现此问题通常是因为与 kernel32.lib 链接,而不是与 onecore_apiset.lib 或 xgameplatform.lib 等适当的伞库(umbrella library)。", "PortBugMergeLibCMakeDir": "应将 /lib/cmake 文件夹与 /debug/lib/cmake 合并,然后将其移动到 /share/{package_name}/cmake。请使用端口 `vcpkg-cmake-config` 中的帮助程序函数 `vcpkg_cmake_config_fixup()`。", "PortBugMismatchedNumberOfBinaries": "调试和发布二进制文件的数量不匹配。", "PortBugMisplacedCMakeFiles": "在 /share/{spec} 外部找到以下 cmake 文件。请将 cmake 文件放在 /share/{spec} 中。", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "如果无法禁用 bin\\ 和/或 debug\\bin\\ 的创建,请在端口文件中使用此项移除它们", "PortBugRemoveEmptyDirectories": "如果应填充但未填充目录,这可能表示端口文件中存在错误。\n如果不需要目录并且无法禁用其创建,请在端口文件中使用如下所示的内容来移除它们:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE 上述重命名留下的空目录)", - "PortBugRestrictedHeaderPaths": "以下受限标头可以阻止核心 C++ 运行时和其他包正确编译。在特殊情况下,可以通过 {env_var} 禁用此策略。", + "PortBugRestrictedHeaderPaths": "以下受限标头可以阻止核心 C++ 运行时和其他包正确编译。在特殊情况下,可以设置 CMake 变量 VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS in portfile.cmake 以禁用此策略。", "PortBugSetDllsWithoutExports": "不带任何导出的 DLL 可能是生成脚本中的 bug。如果希望这样,请在端口文件:\nset(已启用 VCPKG_POLICY_DLLS_WITHOUT_EXPORTS)\n中添加以下行: 以下 DLL 没有导出:", "PortDependencyConflict": "端口 {package_name} 具有以下不受支持的依赖项:", "PortDoesNotExist": "{package_name} 不存在", @@ -827,21 +951,26 @@ "PortsDiffHelp": "参数应为要签出的分支/标记/哈希。", "PortsNoDiff": "两次提交之间的端口没有变化。", "PortsRemoved": "删除了以下 {count} 个端口:", - "PortsUpdated": "\n以下 {count} 个端口已更新:", + "PortsUpdated": "以下 {count} 个端口已更新:", "PrebuiltPackages": "存在尚未生成的包。如果要生成它们,请运行:", "PreviousIntegrationFileRemains": "未删除以前的集成文件。", "ProgramReturnedNonzeroExitCode": "{tool_name} 失败,退出代码: {exit_code}。", "ProvideExportType": "至少需要以下选项之一: --raw --nuget --ifw --zip --7zip --chocolatey --prefab。", "PushingVendorFailed": "将 {vendor} 推送到“{path}”失败。请使用 --debug 获取详细信息。", - "RegeneratesArtifactRegistry": "重新生成项目注册表。", + "RegeneratesArtifactRegistry": "重新生成项目注册表", "RegistryCreated": "已在 {path} 下成功创建注册表", "RegistryValueWrongType": "注册表值 {path} 为意外类型。", "RemoveDependencies": "要在清单模式下移除依赖项,请编辑清单(vcpkg.json)并运行 “install”。", "RemovePackageConflict": "{spec} 未安装,但为 {triplet} 安装了 {package_name}。你是否指的是 {package_name}: {triplet}?", "RemovingPackage": "正在删除 {action_index}/{count} 个 {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "从“{path}”还原的包", - "RestoredPackagesFromVendor": "已从 {elapsed} 中的 {value} 还原 {count} 个包。使用 --debug 查看更多详细信息。", + "RestoredPackagesFromAWS": "{elapsed} 后从 AWS 还原了 {count} 个包。使用 --debug 了解更多详细信息。", + "RestoredPackagesFromCOS": "{elapsed} 后从 COS 还原了 {count} 个包。使用 --debug 了解更多详细信息。", + "RestoredPackagesFromFiles": "{elapsed} 后从 {path} 还原了 {count} 个包。使用 --debug 了解更多详细信息。", + "RestoredPackagesFromGCS": "{elapsed} 后从 GCS 还原了 {count} 个包。使用 --debug 了解更多详细信息。", + "RestoredPackagesFromGHA": "{elapsed} 后从 GitHub Actions Cache 还原了 {count} 个包。使用 --debug 了解更多详细信息。", + "RestoredPackagesFromHTTP": "{elapsed} 后从 HTTP 服务器还原了 {count} 个包。使用 --debug 了解更多详细信息。", + "RestoredPackagesFromNuGet": "{elapsed} 后从 NuGet 还原了 {count} 个包。使用 --debug 了解更多详细信息。", "ResultsHeader": "结果", "ScriptAssetCacheRequiresScript": "应为参数: 资产配置 \"x-script\" 要求将 exec 模板精确用作参数", "SearchHelp": "参数应为要搜索的子字符串,或没有用于显示所有库的参数。", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "正在跳过清除 {path} 的内容,因为它不是目录。", "SourceFieldPortNameMismatch": "CONTROL 文件中的“Source”字段或 vcpkg.json 文件中的“name”字段具有名称 {package_name},并且与端口目录“{path}”不匹配。", "SpecifiedFeatureTurnedOff": "已专门禁用“{command_name}”功能,但已指定 --{option}。", - "SpecifyDirectoriesContaining": "指定包含三元组文件的目录。\n(以及:“{env_var}”)", - "SpecifyDirectoriesWhenSearching": "指定搜索端口时要使用的目录。\n(以及:“{env_var}”)", - "SpecifyHostArch": "指定主机体系结构三联。请参阅“vcpkg 帮助三联”。\n(默认值:“{env_var}”)", - "SpecifyTargetArch": "指定目标体系结构三联。请参阅“vcpkg 帮助三联”。\n(默认值:“{env_var}”)", + "SpecifyHostArch": "主机三元组。请参阅“vcpkg 帮助三元组”(默认值:“{env_var}”)", + "SpecifyTargetArch": "目标三元组。请参阅“vcpkg 帮助三元组”(默认值:“{env_var}”)", "StartCodeUnitInContinue": "在“继续”位置找到了起始代码单元", "StoreOptionMissingSha": "--store 选项无效,没有 sha512", - "StoredBinariesToDestinations": "存储在 {count} 个目标中的二进制文件。", + "StoredBinariesToDestinations": "{elapsed} 后在 {count} 个目标中存储了二进制文件。", "StoredBinaryCache": "存储的二进制缓存:“{path}”", "SuccessfulyExported": "已将 {package_name} 导出到 {path}", "SuggestGitPull": "结果可能已过时。运行 `git pull` 以获取最新结果。", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "可能需要更新 vcpkg 二进制文件。请尝试运行 {command_line} 进行更新。", "SupportedPort": "支持端口 {package_name}。", "SwitchUsedMultipleTimes": "已多次指定开关“{option}”", + "SynopsisHeader": "摘要:", "SystemApiErrorMessage": "调用 {system_api} 失败,{exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "应始终在 Windows 上设置 SystemRoot 环境变量。", "SystemTargetsInstallFailed": "无法将系统目标文件安装到 {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "数组中的尾随逗号", "TrailingCommaInObj": "对象中的尾随逗号", "TripletFileNotFound": "找不到三重文件 {triplet}.cmake", + "TripletLabel": "三元组:", "TwoFeatureFlagsSpecified": "“{value}”和-“{value}”均已指定为功能标志。", "UnableToClearPath": "无法删除 {path}", "UnableToReadAppDatas": "%LOCALAPPDATA% 和 %APPDATA% 均不可读", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "注册表“{url}”未更新:“{value}”", "UpdateBaselineRemoteGitError": "git 无法提取远程存储库“{url}”", "UpdateBaselineUpdatedBaseline": "已更新注册表“{url}”: 基线“{old_value}”->“{new_value}”", - "UpgradeInManifest": "升级命令当前不支持清单模式。请改为修改 vcpkg.json 并运行安装。", + "UpgradeInManifest": "升级 升级经典模式安装,因此不支持清单模式。请考虑通过使用 vcpkg x-update-baseline 将基线更新为当前值,并运行 vcpkg 安装来更新依赖项。", "UpgradeRunWithNoDryRun": "如果确实要重新生成上述包,请使用 --no-dry-run 选项运行此命令。", "UploadedBinaries": "已将二进制文件上传到 {count} 个 {vendor}。", "UploadedPackagesToVendor": "已在 {elapsed} 内将 {count} 个包上传到 {vendor}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "无效命令: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "环境变量 X_VCPKG_REGISTRIES_CACHE 的值不是目录: {path}", "VcpkgRootRequired": "独立启动需要设置 VCPKG_ROOT。", - "VcpkgRootsDir": "指定 vcpkg 根目录。\n(默认值:“{env_var}”)", + "VcpkgRootsDir": "vcpkg 根目录(默认值:“{env_var}”)", "VcpkgSendMetricsButDisabled": "已传递 --sendmetrics,但指标已禁用。", + "VcpkgUsage": "用法: vcpkg [--switches] [--options=values] [arguments] @response_file", "VcvarsRunFailed": "无法运行 vcvarsall.bat 以获取 Visual Studio 环境", "VcvarsRunFailedExitCode": "尝试获取 Visual Studio 环境时,vcvarsall.bat 返回了 {exit_code}", "VersionBaselineMismatch": "最新版本为 {expected},但基线文件包含 {actual}。\n运行:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\n以更新基线版本。", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "{package_name} 在 {path} 处缺少版本数据库文件\n运行:\nvcpkg x-add-version {package_name}\n以创建版本文件。", "VersionGitEntryMissing": "{version} 处没有 {package_name} 的版本数据库条目。\n可用版本:", "VersionInDeclarationDoesNotMatch": "文件中声明的版本与签出版本不匹配: {version}", - "VersionIncomparable1": "{spec} {package_name} 上的版本冲突需为 {expected},但 vcpkg 无法将其与 {actual} 进行比较。\n使用不兼容方案的两个版本:", - "VersionIncomparable2": "\"{version}\" 属于方案 {new_scheme}", + "VersionIncomparable1": "{spec} 上的版本冲突:需要 {constraint_origin} {expected},这无法与基线版本 {actual} 进行比较。", + "VersionIncomparable2": "“{version_spec}”具有方案“{new_scheme}”", "VersionIncomparable3": "可以将显式替代添加到首选版本以解决此问题,例如:", - "VersionIncomparable4": "有关详细信息,请参阅“vcpkg 帮助版本控制”。", + "VersionIncomparable4": "有关详细信息,请参阅“vcpkg 帮助版本控制”或 {url}。", + "VersionIncomparableSchemeString": "两个版本都有方案字符串,但主文本不同。", + "VersionIncomparableSchemes": "这些版本具有不兼容的方案:", "VersionInvalidDate": "“{version}”不是有效的日期版本。日期必须采用 YYYY-MM-DD 格式,并且消歧因子必须是不带前导零的点分隔正整数值。", "VersionInvalidRelaxed": "“{version}”不是有效的宽松版本(具有任意数值元素计数的 semver)。", "VersionInvalidSemver": "“{version}”不是有效的语义版本,请参阅 。", "VersionMissing": "需要版本控制字段(版本、版本日期、版本-semver 或版本字符串)之一", - "VersionMissingRequiredFeature": "{spec}@{version} 没有所需的功能 {feature}", + "VersionMissingRequiredFeature": "“{version_spec}”没有“{constraint_origin}”所需的功能“{feature}”", "VersionNotFound": "{expected} 不可用,只有 {actual} 可用", - "VersionNotFoundDuringDiscovery": "发现期间找不到版本: {spec}@{version}\n这是内部 vcpkg 错误。请在 https://github.com/Microsoft/vcpkg 上打开问题,其中包含重现该问题的详细步骤。", - "VersionNotFoundInVersionsFile": "版本文件中找不到版本 {version}。\n运行:\nvcpkg x-add-version {package_name}\n以新增端口版本。", + "VersionNotFoundInVersionsFile": "“{package_name}”版本文件中找不到版本“{version}”。\n运行:\nvcpkg x-add-version {package_name}\n以新增端口版本。", "VersionRejectedDueToBaselineMissing": "{path} 被拒绝,因为它使用了 \"{json_field}\",并且没有“内置基线”。可以通过停止使用 \"{json_field}\" 或添加“内置基线”来修复此问题。\n有关详细信息,请参阅 `vcpkg help versioning`。", "VersionRejectedDueToFeatureFlagOff": "{path} 被拒绝,因为它使用了 \"{json_field}\",并且禁用了 `versions` 功能标志。可以通过停止使用 \"{json_field}\" 或启用 `versions` 功能标志来修复此问题。\n有关详细信息,请参阅 `vcpkg help versioning`。", "VersionSchemeMismatch": "版本数据库将 {version} 声明为 {expected},但 {path} 将其声明为 {actual}。版本必须具有唯一性,即使它们使用不同的方案声明。\n运行:\nvcpkg x-add-version {package_name} --overwrite-version\n以使用端口中声明的方案覆盖版本数据库中声明的方案。", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "版本文本中的 \"#\" 后面必须跟端口版本(非负整数)", "VersionSpecMismatch": "无法加载端口,因为版本不一致。文件“{path}”包含版本 {actual_version},但版本数据库指示它应为 {expected_version}。", "VersionTableHeader": "版本", - "VersionVerifiedOK": "确定: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "确定:{version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "正在等待子进程退出...", "WaitingToTakeFilesystemLock": "正在等待锁定 {path} 上的文件系统...", "WarnOnParseConfig": "在配置 {path} 中发现以下警告:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "验证版本: {version} 时", "WindowsOnlyCommand": "此命令仅支持 Windows。", "WroteNuGetPkgConfInfo": "已将 NuGet 包配置信息写入 {path}", - "UnrecognizedCommand$": "无法识别的命令“${p0}”", - "Use$ToGetHelp": "使用 ${p0} 获取帮助", - "FatalTheRootFolder$CanNotBeCreated": "严重: 无法创建根文件夹“${p0}”", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "严重: 无法创建全局配置文件“${p0}”", + "FatalTheRootFolder$CannotBeCreated": "严重: 无法创建根文件夹“${p0}”", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "严重: 无法创建全局配置文件“${p0}”", "VCPKGCOMMANDWasNotSet": "未设置 VCPKG_COMMAND", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "在内部运行 vcpkg 返回了非零退出代码: ${p0}", "failedToDownloadFrom$": "未能从 ${p0} 下载", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "描述的类型应为“string”,但找到的是“${p0}”", "optionsShouldBeASequenceFound$": "选项应为序列,找到的是“${p0}”", "DuplicateKeysDetectedInManifest$": "在清单中检测到重复的密钥:“${p0}”", - "in$Skipping$BecauseItIsA$": "在 ${p0} 跳过 ${p1},因为它是 ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "无 postscript 文件: 使用 vcpkg shell 函数(而不是可执行文件)重新运行", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "激活过程中重复定义 ${p0}。新值将替换旧值。", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "激活过程中声明了重复的工具 ${p0}。新值将替换旧值。", @@ -1080,20 +1208,15 @@ "progressUnknown": "(进度未知)", "verifying": "正在验证", "downloading$$": "正在下载 ${p0} -> ${p1}", - "unpacking": "正在解压缩", "unpacking$": "正在解压缩 ${p0}", "Installing$": "正在安装 ${p0}...", "$AlreadyInstalled": "已安装 ${p0}。", "Downloading$": "正在下载 ${p0}...", "Unpacking$": "正在解压缩 ${p0}...", "ErrorInstalling$$": "安装时出错 ${p0} - ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "${p0} 只需要一个值 - 找到多个值", - "Synopsis": "摘要", - "Description": "描述", - "Switches": "开关", - "SeeAlso": "请参见", "error": "错误:", "warning": "警告:", + "ExpectedASingleValueFor$FoundMultiple": "${p0} 只需要一个值 - 找到多个值", "ExpectedASingleValueFor$": "“--${p0}”只需要一个值。", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "假定“${p0}”正确; 在项目元数据中提供哈希以禁止显示此消息。", "DownloadedFile$DidNotHaveTheCorrectHash$$": "下载的文件“${p0}”没有正确的哈希(${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "在“${p1}”中发现不匹配的 ${p0}。对于文本 ${p2},请改用 ${p3}${p4}。", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "在“${p1}”中找不到 {${p0}} 的值。若要写入文本值,请改用“{{${p2}}}”。", "MatchedMoreThanOneInstallBlock$": "匹配了多个安装块 [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "获取项目引用的所有内容,但不激活", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "这允许使用者预下载项目所需的工具。", "UnableToFindProjectInFolderorParentFoldersFor$": "无法在 ${p0} 的文件夹(或父文件夹)中找到项目", "UnableToAcquireProject": "无法获取项目", - "AcquireArtifactsInTheRegistry": "获取注册表中的项目", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "这允许使用者获取(下载并解压缩)项目。必须激活项目才能使用", "NoArtifactsSpecified": "未指定项目", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "指定了多个包,但 ${p0} 个切换的数量不相等", "NoArtifactsAreAcquired": "未获取任何项目", "AllArtifactsAreAlreadyInstalled": "已安装所有项目", "$ArtifactsInstalledSuccessfully": "已成功安装 ${p0} 个项目", "InstallationFailedStopping": "安装失败 - 正在停止", - "ActivatesTheToolsRequiredForAProject": "激活项目所需的工具", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "这允许使用者激活项目所需的工具。如果尚未安装这些工具,这将强制在激活前下载并安装这些工具。", - "AddsAnArtifactToTheProject": "将项目添加到项目", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "这允许使用者向项目添加项目。也将激活该项目。", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "指定了多个项目,但 ${p0} 个切换的数量不相等", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "尝试添加项目 [${p0}]:${p1} 但无法确定要使用的注册表。", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "尝试将注册表 ${p0} 添加为 ${p1},但它已经是 ${p2}。请手动将 ${p3} 添加到此项目并重新尝试。", "RunvcpkgActivateToApplyToTheCurrentTerminal": "运行\\`vcpkg activate\\`以应用于当前终端", - "ManagesTheDownloadCache": "管理下载缓存", "DownloadsFolderCleared$": "下载文件夹已清除(${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "清理一切(缓存、已安装、项目)", - "cleansOutTheDownloadsCache": "清除下载缓存", - "removesAllTheArtifactsThatAreInstalled": "删除已安装的所有项目", - "cleansUp": "清理", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "允许用户清除缓存、已安装项目等", "InstalledArtifactFolderCleared$": "已安装的项目文件夹已清除(${p0}) ", "CacheFolderCleared$": "缓存文件夹已清除(${p0}) ", - "DeactivatesTheCurrentSession": "停用当前会话", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "这允许使用者删除当前活动会话的环境设置。", - "DeletesAnArtifactFromTheArtifactFolder": "从项目文件夹中删除项目", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "这允许使用者从磁盘中删除项目。", "DeletingArtifact$From$": "正在从 ${p1} 中删除项目 ${p0}", - "FindArtifactsInTheRegistry": "在注册表中查找项目", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "这允许用户根据某些条件查找项目。", "NoArtifactsFoundMatchingCriteria$": "找不到符合条件的项目: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "为激活生成 MSBuild 属性,而不下载项目的任何内容", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props 需要 --msbuild-props", "UnableToActivateProject": "无法激活项目", - "theNameOfTheCommandForWhichYouWantHelp": "需要帮助的命令的名称", - "getHelpOn$OrOneOfTheCommands": "获取有关 ${p0} 或其中一个命令的帮助", - "GetsDetailedHelpOn$OrOneOfTheCommands": "获取有关 ${p0} 或其中一个命令的详细帮助", - "Arguments": "参数:", - "Use$ToGetTheListOfAvailableCommands": "使用 ${p0} 获取可用命令列表", - "Usage": "使用情况", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "可用的 ${p0} 命令:", - "ListsTheArtifacts": "列出项目", - "ThisAllowsTheConsumerToListArtifacts": "这允许使用者列出项目。", - "regenerateTheIndexForARegistry": "重新生成注册表的索引", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "这允许用户为 ${p1} 注册表重新生成 ${p0} 文件。", "RegeneratingIndexFor$": "正在重新生成 ${p0} 的索引", "RegenerationCompleteIndexContains$MetadataFiles": "重新生成完成。索引包含 ${p0} 个元数据文件", "Registry$ContainsNoArtifacts": "注册表:“${p0}”不包含项目。", "error$": "错误 ${p0}: ", - "RemovesAnArtifactFromAProject": "从项目中删除项目", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "这允许使用者从项目中删除项目。强制在此窗口中重新激活。", "Removing$FromProjectManifest": "正在从项目清单中删除 ${p0}", "unableToFindArtifact$InTheProjectManifest": "无法在项目清单中找到项目 ${p0}", - "updateTheRegistryFromTheRemote": "从远程更新注册表", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "这将从远程服务下载注册表的最新内容。", - "DownloadingRegistryData": "正在下载注册表数据", - "Updated$RegistryContains$MetadataFiles": "已更新 ${p0}。注册表包含 ${p1} 元数据文件", - "UnableToDownloadRegistrySnapshot": "无法下载注册表快照", - "UnableToFindRegistry$": "无法找到注册表 ${p0}", - "ArtifactRegistryDataIsNotLoaded": "未加载项目注册表数据", - "AttemptingToUpdateArtifactRegistry": "正在尝试更新项目注册表", - "UnableToLoadRegistryIndex": "无法加载注册表索引", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "立即激活项目之外的项目", - "ThisWillInstantlyActivateAnArtifact": "这会立即激活一个项目。", + "Updated$ItContains$MetadataFiles": "已更新 ${p0}。它包含 ${p1} 元数据文件。", + "UnableToDownload$": "无法下载 ${p0}。", + "$CouldNotBeUpdatedItCouldBeMalformed": "无法更新 ${p0}; 可能格式不正确。", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "x-update-registry 命令下载新的注册表信息,因此不能与本地注册表一起使用。是否是说 x-regenerate ${p0}?", + "UnableToFindRegistry$": "无法找到注册表 ${p0}。", "NoArtifactsAreBeingAcquired": "未获取到任何项目", - "removesAllFilesInTheLocalCache": "删除本地缓存中的所有文件", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "启用调试模式,显示有关 ${p0} 如何工作的内部消息", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "继续执行(可能具有危险的)操作而不进行确认", - "showsTheinstalledArtifacts": "显示 _installed_ 个项目", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "使用用户提供的路径将环境变量和其他属性转储到 json 文件。", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "将写入 MSBuild 属性的文件的完整路径。", - "ApplyAnyDeprecationFixups": "应用任何弃用修补程序。", - "overrideThePathToTheProjectFolder": "替代项目文件夹的路径", - "UnableToFindProjectEnvironment$": "无法找到项目环境 ${p0}", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "启用详细模式,显示有关进程的详细消息", - "aVersionOrVersionRangeToMatch": "要匹配的版本或版本范围" + "UnableToFindProjectEnvironment$": "无法找到项目环境 ${p0}" } diff --git a/locales/messages.zh-Hant.json b/locales/messages.zh-Hant.json index 050ee9d1f9..0f1c517dfd 100644 --- a/locales/messages.zh-Hant.json +++ b/locales/messages.zh-Hant.json @@ -5,10 +5,13 @@ "ABuiltinRegistry": "內建登錄", "AConfigurationObject": "設定物件", "ADateVersionString": "日期版本字串", + "ADefaultFeature": "預設功能", "ADemandObject": "需求物件", "ADependency": "相依性", + "ADependencyFeature": "相依性的功能", "ADictionaryOfContacts": "連絡人的字典", "AFeature": "功能", + "AFeatureName": "功能名稱", "AFilesystemRegistry": "檔案系統登錄", "AGitObjectSha": "Git 物件 SHA", "AGitReference": "Git 參照 (例如,分支)", @@ -37,19 +40,19 @@ "AStringStringDictionary": "\"string\": \"string\" 字典", "AUrl": "URL", "AVcpkgRepositoryCommit": "vcpkg 存放庫認可", - "AVersionConstraint": "版本限制", + "AVersionConstraint": "版本條件約束", "AVersionDatabaseEntry": "版本資料庫項目", "AVersionObject": "版本物件", "AVersionOfAnyType": "任何類型的版本", "AddArtifactOnlyOne": "'{command_line}'一次只能新增一個成品。", "AddCommandFirstArg": "要新增的第一個參數必須是 'artifact' 或 'port'。", "AddFirstArgument": "'{command_line}'的第一個引數必須是 'artifact' 或 'port'。", - "AddHelp": "將指定的連接埠或成品新增到與目前目錄相關的資訊清單中。", "AddPortRequiresManifest": "'{command_line}' 需要使用中的資訊清單檔案。", "AddPortSucceeded": "已成功將連接埠新增到 vcpkg.json 檔案。", "AddRecurseOption": "如果您確定要移除它們,請以 --recurse 選項執行命令。", "AddTripletExpressionNotAllowed": "此處不允許三個二進制元素位元組運算式。您可以改為將 '{package_name}:{triplet}' 變更為 '{package_name}'。", "AddVersionAddedVersionToFile": "已將版本 {version} 新增到 {path}", + "AddVersionArtifactsOnly": "--version 只是成品,無法與 vcpkg add port 一起使用", "AddVersionCommitChangesReminder": "您是否記得要提交變更?", "AddVersionCommitResultReminder": "別忘了要提交結果!", "AddVersionDetectLocalChangesError": "因為 Git 狀態輸出中有未預期的格式,所以略過偵測本機變更", @@ -83,8 +86,10 @@ "AlreadyInstalled": "{spec} 已安裝", "AlreadyInstalledNotHead": "{spec} 已安裝 -- 未從 HEAD 建立", "AmbiguousConfigDeleteConfigFile": "資訊清單和設定檔案提供的不明確 vcpkg 設定。\n-- 刪除設定檔 {path}", + "AnArrayOfDefaultFeatures": "預設功能的陣列", "AnArrayOfDependencies": "相依性的陣列", "AnArrayOfDependencyOverrides": "相依性覆寫的陣列", + "AnArrayOfFeatures": "功能陣列", "AnArrayOfIdentifers": "識別碼陣列", "AnArrayOfOverlayPaths": "重疊路徑的陣列", "AnArrayOfOverlayTripletsPaths": "重疊三重路徑的陣列", @@ -103,25 +108,50 @@ "AnotherInstallationInProgress": "另一個安裝正在機器上進行中,睡眠 6 秒後再試一次。", "AppliedUserIntegration": "已為此 vcpkg 根目錄套用整個使用者整合。", "ApplocalProcessing": "vcpkg applocal 處理: {path}", + "ArtifactsBootstrapFailed": "未安裝 vcpkg-artifacts,因此無法啟動載入。", + "ArtifactsNotInstalledReadonlyRoot": "未安裝 vcpkg-artifacts,而且無法安裝,因為 VCPKG_ROOT 假設為唯讀。使用 'one liner' 重新安裝 vcpkg 可能可以修正此問題。", + "ArtifactsNotOfficialWarning": "使用 vcpkg-artifacts 搭配非官方", "ArtifactsOptionIncompatibility": "--{option} 對尋找成品不會影響。", + "ArtifactsOptionJson": "記錄環境變數和其他屬性之 JSON 檔案的完整路徑", + "ArtifactsOptionMSBuildProps": "將寫入 MSBuild 屬性之檔案的完整路徑", + "ArtifactsOptionVersion": "要比對的版本或版本範圍; 只對成品有效", + "ArtifactsOptionVersionMismatch": "--version 切換數目必須與具名成品數目相符", + "ArtifactsSwitchARM": "取得成品時強制主機偵測為 ARM", + "ArtifactsSwitchARM64": "取得成品時強制主機偵測為 ARM64", + "ArtifactsSwitchAll": "更新所有已知的成品登錄", + "ArtifactsSwitchAllLanguages": "取得成品時取得所有語言檔案", + "ArtifactsSwitchForce": "如果已取得成品,則強制重新取得", + "ArtifactsSwitchFreebsd": "取得成品時強制主機偵測為 FreeBSD", + "ArtifactsSwitchLinux": "取得成品時強制主機偵測為 Linux", + "ArtifactsSwitchNormalize": "套用任何取代修復", + "ArtifactsSwitchOnlyOneHostPlatform": "只能設定一個主機平台 (--x64、--x86、--arm、--arm64)。", + "ArtifactsSwitchOnlyOneOperatingSystem": "只能設定一個作業系統 (--windows、--osx、--linux、--freebsd)。", + "ArtifactsSwitchOnlyOneTargetPlatform": "只能設定一個目標平台 (--target:x64、--target:x86、--target:arm、--target:arm64)。", + "ArtifactsSwitchOsx": "取得成品時強制主機偵測為 MacOS", + "ArtifactsSwitchTargetARM": "取得成品時設定目標偵測為 ARM", + "ArtifactsSwitchTargetARM64": "取得成品時設定目標偵測為 ARM64", + "ArtifactsSwitchTargetX64": "取得成品時設定目標偵測為 x64", + "ArtifactsSwitchTargetX86": "取得成品時設定目標為 x86", + "ArtifactsSwitchWindows": "取得成品時強制主機偵測為 Windows", + "ArtifactsSwitchX64": "取得成品時強制主機偵測為 x64", + "ArtifactsSwitchX86": "取得成品時強制主機偵測為 x86", "AssetCacheProviderAcceptsNoArguments": "非預期的引數: '{value}' 不接受引數", - "AssetSourcesArg": "新增資產快取的來源。請參閱 'vcpkg help assetcaching'。", + "AssetSourcesArg": "資產快取來源。請參閱 'vcpkg help assetcaching'", "AttemptingToFetchPackagesFromVendor": "正在嘗試從 {vendor} 擷取 {count} 個套件", "AttemptingToSetBuiltInBaseline": "嘗試在 vcpkg.json 中設定 builtin-baseline,同時會使用 vcpkg-configuration.json.\n使用 vcpkg-configuration.json 中的 default-registry。", "AuthenticationMayRequireManualAction": "一或多個 {vendor} 認證提供者要求手動動作。新增二進位來源 'interactive' 以允許互動。", "AutoSettingEnvVar": "-- 正在自動將 {env_var} 環境變數設為 \"{url}\"。", "AutomaticLinkingForMSBuildProjects": "所有 MSBuild C++ 專案現在都可將任何已安裝的程式庫透過 #include 納入。系統會自動處理連結。安裝新的程式庫會讓它們立即可供使用。", - "AvailableArchitectureTriplets": "可用的架構三元組:", + "AutomaticLinkingForVS2017AndLater": "Visual Studio 2017 和更新版本現在可以將任何已安裝的程式庫透過 #include 納入。系統會自動處理連結。安裝新的程式庫會讓它們立即可供使用。", "AvailableHelpTopics": "可用的說明主題:", "AzUrlAssetCacheRequiresBaseUrl": "未預期的引數: 資產設定 'azurl' 需要基底 URL", "AzUrlAssetCacheRequiresLessThanFour": "未預期的引數: 資產設定 'azurl' 需要少於 4 個引數", "BaselineConflict": "在資訊清單檔案中指定 vcpkg-configuration.default-registry 與內建基準衝突。\n請移除其中一個衝突設定。", "BaselineFileNoDefaultField": "位於認可 {commit_sha} 的基準檔案無效 (沒有 \"default\" 欄位)。", - "BaselineFileNoDefaultFieldPath": "於 {path} 的基準檔案無效 (沒有 \"default\" 欄位)", "BaselineGitShowFailed": "從認可 '{commit_sha}' 中簽出基準時,無法 `git show` versions/baseline.json。使用 `git fetch` 擷取認可以修正這個問題。", "BaselineMissing": "找不到基準版本。執行:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\n以將 {version} 設為基準版本。", - "BaselineMissingDefault": "來自存放庫 {url} 中認可 `\"{commit_sha}\"` 的 baseline.json 無效 (未包含 \"default\" 欄位)。", - "BinarySourcesArg": "新增二進位快取的來源。請參閱 'vcpkg help binarycaching'。", + "BinaryCacheVendorHTTP": "HTTP 伺服器", + "BinarySourcesArg": "二進位快取來源。請參閱 'vcpkg help binarycaching'", "BinaryWithInvalidArchitecture": "{path}\n 預期: {expected},但已{actual}", "BuildAlreadyInstalled": "{spec} 已安裝; 請先移除 {spec},再嘗試建置。", "BuildDependenciesMissing": "建置命令需要已安裝所有相依性。\n遺失下列相依性:", @@ -136,17 +166,17 @@ "BuildResultSucceeded": "成功", "BuildResultSummaryHeader": "{triplet} 的摘要", "BuildResultSummaryLine": "{build_result}: {count}", - "BuildTreesRootDir": "(實驗性) 指定 buildtrees 根目錄。", + "BuildTreesRootDir": "Buildtrees 目錄 (實驗性)", "BuildTroubleshootingMessage1": "請確定您使用最新的連接埠檔案與 'git pull' 和 'vcpkg update'。\n然後在下列位置查看已知問題:", "BuildTroubleshootingMessage2": "您可以在下列位置提交新問題:", "BuildTroubleshootingMessage3": "在錯誤報表標題中包含 '[{package_name}] 組建錯誤'、在錯誤描述中包含下列版本資訊,以及附加上述任何相關的失敗記錄。", "BuildTroubleshootingMessage4": "回報問題時,請使用 {path} 的預先填入範本。", - "BuildTroubleshootingMessageGH": "您也可以執行下列來提交問題 (必須安裝 GitHub cli ):", + "BuildTroubleshootingMessageGH": "您也可以執行下列來提交問題 (必須安裝 GitHub CLI):", "BuildingFromHead": "從 HEAD 建立 {spec}...", "BuildingPackage": "正在建立 {spec}...", "BuildingPackageFailed": "建置 {spec} 失敗,原因: {build_result}", "BuildingPackageFailedDueToMissingDeps": "因為下列缺少相依性:", - "BuiltInTriplets": "vcpkg 內建三元組:", + "BuiltInTriplets": "內建三元組:", "BuiltWithIncorrectArchitecture": "下列檔案是針對不正確的架構所建置:", "CISettingsExclude": "要跳過的連接埠的逗號分隔清單", "CISettingsOptCIBase": "ci.baseline.txt 檔案的路徑。用來跳過連接埠及偵測迴歸。", @@ -156,19 +186,19 @@ "CISettingsOptOutputHashes": "要輸出所有已判斷套件雜湊的檔案", "CISettingsOptParentHashes": "用於讀取父代 CI 狀態套件雜湊的檔案,以減少已變更套件的集合", "CISettingsOptSkippedCascadeCount": "判斷提示 --exclude 和支援跳過的數值會完全等於這個數字", - "CISettingsOptXUnit": "以 XUnit 格式輸出結果的檔案 (內部)", - "CISettingsVerifyGitTree": "請確認每個 GIT 樹狀目錄物件是否符合其宣告的版本 (這會非常緩慢)", - "CISettingsVerifyVersion": "列印每個連接埠的結果,而非只列印錯誤。", - "CISwitchOptAllowUnexpectedPassing": "表示不應該發出「從失敗清單中傳遞、移除」結果。", - "CISwitchOptDryRun": "列印出計畫而不執行", + "CISettingsOptXUnit": "以 XUnit 格式輸出結果的檔案", + "CISettingsVerifyGitTree": "驗證每個 Git 樹狀目錄物件是否符合其宣告的版本 (這會非常緩慢)", + "CISettingsVerifyVersion": "列印每個連接埠的結果,而不只是錯誤", + "CISkipInstallation": "下列套件已安裝因此不會再次組建:", + "CISwitchOptAllowUnexpectedPassing": "隱藏「通過,從失敗清單移除」結果", + "CISwitchOptDryRun": "列印出計劃而不執行", "CISwitchOptRandomize": "隨機化安裝順序", - "CISwitchOptSkipFailures": "指示應跳過 ci.baseline.txt 中標示為 '=fail' 的連接埠。", - "CISwitchOptXUnitAll": "也將未變更的連接埠報告給 XUnit 輸出 (內部)", + "CISwitchOptSkipFailures": "跳過 ci.baseline.txt 中標示為 `=fail` 的連接埠", + "CISwitchOptXUnitAll": "在 XUnit 輸出中報告未變更的連接埠", "CMakeTargetsUsage": "{package_name} 提供 CMake 目標:", "CMakeTargetsUsageHeuristicMessage": "#這是啟發式產生的,可能不正確", "CMakeToolChainFile": "CMake 專案應使用: \"-DCMAKE_TOOLCHAIN_FILE={path}\"", "CMakeUsingExportedLibs": "若要在 CMake 專案中使用匯出的程式庫,請將 {value} 新增至 CMake 命令列。", - "CacheHelp": "引數應為可搜尋的 substring,或沒有參數以顯示所有快取程式庫。", "CheckedOutGitSha": "已簽出 Git SHA: {commit_sha}", "CheckedOutObjectMissingManifest": "簽出的物件不包含 CONTROL 檔案或 vcpkg.json 檔案。", "ChecksFailedCheck": "vcpkg 已損毀; 沒有其他詳細資料。", @@ -176,99 +206,184 @@ "ChecksUpdateVcpkg": "重新執行 bootstrap-vcpkg 來更新 vcpkg 或許可以解決此失敗問題。", "CiBaselineAllowUnexpectedPassingRequiresBaseline": "--allow-unexpected-passing 只有在透過 --ci-baseline 提供基準時才能使用。", "CiBaselineDisallowedCascade": "迴歸: {spec} 串聯,但需要通過。({path})。", - "CiBaselineIndependentRegression": "REGRESSION: Independent {spec} failed with {build_result}.", + "CiBaselineIndependentRegression": "迴歸: 獨立 {spec} 失敗,發生 {build_result}。", "CiBaselineRegression": "迴歸: {spec} 失敗,{build_result}。如果預期,將 {spec}=fail 新增到 {path}。", "CiBaselineRegressionHeader": "迴歸:", + "CiBaselineUnexpectedFail": "迴歸: {spec} 標示為失敗,但 {triplet} 不支援。", + "CiBaselineUnexpectedFailCascade": "迴歸: {spec} 標示為失敗,但 {triplet} 不支援一個相依性。", "CiBaselineUnexpectedPass": "通過,從失敗清單移除: {spec} ({path})。", "ClearingContents": "正在清除 {path} 的內容", "CmakeTargetsExcluded": "注意: 不會顯示 {count} 個其他目標。", - "CmdAddVersionOptAll": "所有連接埠的處理序版本。", - "CmdAddVersionOptOverwriteVersion": "覆寫現有版本的 'git-tree'。", - "CmdAddVersionOptSkipFormatChk": "跳過 vcpkg.json 檔案的格式化檢查。", - "CmdAddVersionOptSkipVersionFormatChk": "跳過版本格式檢查。", - "CmdAddVersionOptVerbose": "列印成功訊息,而不是只列印錯誤。", + "CmdAcquireExample1": "vcpkg acquire <成品>", + "CmdAcquireProjectSynopsis": "取得由資訊清單參考的所有成品", + "CmdAcquireSynopsis": "取得具名的成品", + "CmdActivateSynopsis": "從資訊清單啟用成品", + "CmdAddExample1": "vcpkg add port <連接埠名稱>", + "CmdAddExample2": "vcpkg add artifact <成品名稱>", + "CmdAddSynopsis": "將相依性新增至資訊清單", + "CmdAddVersionExample1": "vcpkg x-add-version <連接埠名稱>", + "CmdAddVersionOptAll": "處理所有連接埠的版本", + "CmdAddVersionOptOverwriteVersion": "覆寫現有版本的 git-tree", + "CmdAddVersionOptSkipFormatChk": "跳過 vcpkg.json 檔案的格式化檢查", + "CmdAddVersionOptSkipVersionFormatChk": "跳過版本格式檢查", + "CmdAddVersionOptVerbose": "列印成功訊息,而不只是錯誤", + "CmdAddVersionSynopsis": "將版本新增至版本資料庫", + "CmdBootstrapStandaloneSynopsis": "只從 vcpkg 二進位檔啟動 vcpkg 根目錄程序", + "CmdBuildExample1": "vcpkg build <連接埠規格>", + "CmdBuildExternalExample1": "vcpkg build-external <連接埠名稱> <來源路徑>", + "CmdBuildExternalExample2": "vcpkg build-external zlib2 C:\\path\\to\\dir\\with\\vcpkg.json", + "CmdBuildExternalSynopsis": "從路徑建置連接埠", + "CmdBuildSynopsis": "組建連接埠", + "CmdCacheExample1": "vcpkg cache <搜尋子字串>", + "CmdCacheSynopsis": "列出封裝的規格", + "CmdCheckSupportExample1": "vcpkg x-check-support <連接埠名稱>", + "CmdCheckSupportSynopsis": "測試是否支援連接埠而不組建連接埠", + "CmdCiCleanSynopsis": "清除所有檔案以準備 CI 執行", + "CmdCiSynopsis": "嘗試組建所有連接埠以進行 CI 測試", + "CmdCiVerifyVersionsSynopsis": "檢查版本資料庫的完整性", "CmdContactOptSurvey": "啟動預設瀏覽器至目前的 vcpkg 問卷", - "CmdDependInfoOptDGML": "根據 dgml 建立圖表", - "CmdDependInfoOptDepth": "在輸出中顯示遞迴深度", - "CmdDependInfoOptDot": "根據點建立圖表", - "CmdDependInfoOptMaxRecurse": "設定遞迴深度上限,值 -1 表示無限制", - "CmdDependInfoOptSort": "設定相依性清單的排序次序,已接受的值為: 語彙、拓撲 (預設)、x 型樹狀、反向", - "CmdEditOptAll": "將編輯器開啟至連接埠以及連接埠特定的 buildtree 子資料夾", - "CmdEditOptBuildTrees": "將編輯器開啟到連接埠特定的 buildtree 子資料夾", + "CmdCreateExample1": "vcpkg create <連接埠名稱> ", + "CmdCreateExample2": "vcpkg create my-fancy-port https://example.com/sources.zip", + "CmdCreateExample3": "vcpkg create <連接埠名稱> <下載的檔案名稱>", + "CmdDeactivateSynopsis": "從目前的殼層移除所有成品啟用", + "CmdDependInfoExample1": "vcpkg depend-info <連接埠名稱>", + "CmdDependInfoFormatConflict": "指定的格式發生衝突。僅接受 --format、--dgml 或 --dot 其中之一。", + "CmdDependInfoFormatHelp": "選擇輸出格式: `list`、`tree`、`mermaid`、`dot` 或 `dgml` 之一", + "CmdDependInfoFormatInvalid": "--format={value} 不是可辨識的格式。--format 必須 是 `list`、`tree`、`mermaid`、`dot` 或 `dgml` 其中之一。", + "CmdDependInfoOptDepth": "在 `list` 輸出中顯示遞迴深度", + "CmdDependInfoOptMaxRecurse": "設定遞迴深度上限。預設值為無限制", + "CmdDependInfoOptSort": "選擇 `list` 格式的排序順序,`lexicographical`、`topological` (預設)、`reverse` 之一", + "CmdDependInfoShowDepthFormatMismatch": "--show-depth 只能與 `list` 和 `tree` 格式搭配使用。", + "CmdDependInfoXtreeTree": "--sort=x-tree 只能搭配樹狀目錄格式使用", + "CmdDownloadExample1": "vcpkg x-download <檔案路徑> --url=https://...", + "CmdDownloadExample2": "vcpkg x-download <檔案路徑> --sha512= --url=https://...", + "CmdDownloadExample3": "vcpkg x-download <檔案路徑> --skip-sha512 --url=https://...", + "CmdDownloadSynopsis": "下載檔案", + "CmdEditExample1": "vcpkg edit <連接埠名稱>", + "CmdEditOptAll": "開啟編輯器進入該連接埠以及連接埠特定的 buildtree 子資料夾", + "CmdEditOptBuildTrees": "開啟編輯器進入連接埠特定的 buildtree 子資料夾", "CmdEnvOptions": "將已安裝的 {path} 新增至 {env_var}", + "CmdExportEmptyPlan": "拒絕建立零套件的匯出。匯出之前請先安裝套件。", + "CmdExportExample1": "vcpkg export <連接埠名稱> [--nuget] [--directory=out_dir]", "CmdExportOpt7Zip": "匯出至 7zip (.7z) 檔案", - "CmdExportOptChocolatey": "匯出 Chocolatey 套件 (實驗性功能)", + "CmdExportOptChocolatey": "匯出 Chocolatey 套件 (實驗性)", "CmdExportOptDebug": "啟用 Prefab 偵錯", - "CmdExportOptDryRun": "實際上不要匯出。", + "CmdExportOptDryRun": "實際上不匯出", "CmdExportOptIFW": "匯出至 IFW 型安裝程式", "CmdExportOptInstalled": "匯出所有已安裝的套件", "CmdExportOptMaven": "啟用 Maven", "CmdExportOptNuget": "匯出 NuGet 套件", "CmdExportOptPrefab": "匯出為 Prefab 格式", "CmdExportOptRaw": "匯出至未壓縮的目錄", - "CmdExportOptZip": "匯出至 zip 檔案", - "CmdExportSettingChocolateyMaint": "為已匯出的 Chocolatey 套件指定維護程式 (實驗性功能)", - "CmdExportSettingChocolateyVersion": "指定要為已匯出的 Chocolatey 套件新增的版本尾碼 (實驗性功能)", - "CmdExportSettingConfigFile": "指定安裝程式設定的暫存檔案路徑", - "CmdExportSettingInstallerPath": "指定匯出安裝程式的檔案路徑", - "CmdExportSettingNugetDesc": "指定已匯出之 NuGet 套件的說明", - "CmdExportSettingNugetID": "為已匯出的 NuGet 套件指定識別碼 (覆寫 --output)", - "CmdExportSettingNugetVersion": "為已匯出的 NuGet 套件指定版本", - "CmdExportSettingOutput": "指定輸出名稱 (用來建構檔案名稱)", - "CmdExportSettingOutputDir": "指定所產生成品的輸出目錄", - "CmdExportSettingPkgDir": "為重新封裝的套件指定臨時目錄路徑", + "CmdExportOptZip": "匯出至 ZIP 檔案", + "CmdExportSettingChocolateyMaint": "已匯出的 Chocolatey 套件的維護程式 (實驗性)", + "CmdExportSettingChocolateyVersion": "要為已匯出的 Chocolatey 套件新增的版本尾碼 (實驗性)", + "CmdExportSettingConfigFile": "安裝程式設定的暫存檔案路徑", + "CmdExportSettingInstallerPath": "匯出的安裝程式的檔案路徑", + "CmdExportSettingNugetDesc": "已匯出的 NuGet 套件的描述", + "CmdExportSettingNugetID": "匯出的 NuGet 套件的識別碼 (覆寫 --output)", + "CmdExportSettingNugetVersion": "匯出的 NuGet 套件的版本", + "CmdExportSettingOutput": "輸出名稱 (用來建構檔案名稱)", + "CmdExportSettingOutputDir": "所產生成品的輸出目錄", + "CmdExportSettingPkgDir": "重新封裝的套件的暫存目錄路徑", "CmdExportSettingPrefabArtifactID": "成品識別碼是依據 Maven 規格的專案名稱", "CmdExportSettingPrefabGroupID": "GroupId 可根據 Maven 規格唯一識別您的專案", "CmdExportSettingPrefabVersion": "版本是依據 Maven 規格的專案名稱", - "CmdExportSettingRepoDir": "指定已匯出存放庫的目錄路徑", - "CmdExportSettingRepoURL": "指定線上安裝程式的遠端存放庫 URL", - "CmdExportSettingSDKMinVersion": "Android 受支援的最低 SDK 版本", - "CmdExportSettingSDKTargetVersion": "Android 目標 sdk 版本", - "CmdFetchOptXStderrStatus": "將狀態/下載訊息直接傳送到 stderr 而非 stdout。(錯誤/失敗仍會移至 stdout)", - "CmdFormatManifestOptAll": "格式化所有連接埠的資訊清單檔案。", - "CmdFormatManifestOptConvertControl": "將 CONTROL 檔案轉換為資訊清單檔案。", - "CmdGenerateMessageMapOptNoOutputComments": "產生訊息對應時,排除註解 (對於產生英文當地語系化檔案很實用)", - "CmdInfoOptInstalled": "(實驗性) 有關已安裝套件而非可用套件的報告", + "CmdExportSettingRepoDir": "匯出的存放庫的目錄路徑", + "CmdExportSettingRepoURL": "線上安裝程式的遠端存放庫 URL", + "CmdExportSettingSDKMinVersion": "Android 支援的最低 SDK 版本", + "CmdExportSettingSDKTargetVersion": "Android 目標 SDK 版本", + "CmdExportSynopsis": "建立已安裝連接埠的獨立部署", + "CmdFetchOptXStderrStatus": "列印狀態/下載訊息到 stderr 而非 stdout。(錯誤/失敗仍會移至 stdout)", + "CmdFetchSynopsis": "從系統或網際網路擷取內容", + "CmdFindExample1": "vcpkg find port <連接埠名稱>", + "CmdFindExample2": "vcpkg find artifact <成品名稱>", + "CmdFindSynopsis": "尋找可能已安裝或啟用的連接埠或成品", + "CmdFormatManifestExample1": "vcpkg format-manifest ", + "CmdFormatManifestOptAll": "格式化所有連接埠的資訊清單檔案", + "CmdFormatManifestOptConvertControl": "將 CONTROL 檔案轉換為資訊清單檔案", + "CmdFormatManifestSynopsis": "Prettyfies vcpkg.json", + "CmdGenerateMSBuildPropsExample1": "vcpkg generate-msbuild-props --msbuild-props <路徑>", + "CmdGenerateMSBuildPropsExample2": "vcpkg generate-msbuild-props --msbuild-props out.props", + "CmdGenerateMSBuildPropsSynopsis": "產生 msbuild .props 檔案,就像啟用資訊清單的成品相依性一樣,而不取得它們", + "CmdGenerateMessageMapOptNoOutputComments": "產生訊息對應時排除註解 (對於產生英文當地語系化檔案很實用)", + "CmdHashExample1": "vcpkg hash <路徑>", + "CmdHashExample2": "vcpkg hash <路徑> SHA256", + "CmdHashSynopsis": "取得檔案的 SHA256 或 SHA512", + "CmdHelpCommandSynopsis": "顯示 <命令> 的說明詳細資料", + "CmdHelpCommands": "help <命令>", + "CmdHelpCommandsSynopsis": "顯示完整的命令清單,包括此處未列出的少見命令", + "CmdHelpTopic": "help <主題>", + "CmdInfoOptInstalled": "(實驗性) 報告已安裝的套件,而非可用的套件", "CmdInfoOptTransitive": "(實驗性) 也報告已安裝套件的相依性", - "CmdNewOptApplication": "建立應用程式資訊清單 (不需要名稱或版本)。", - "CmdNewOptSingleFile": "將 vcpkg-configuration.json 內嵌到 vcpkg.json。", + "CmdInitRegistryExample1": "vcpkg x-init-registry <路徑>", + "CmdInitRegistrySynopsis": "建立空白 Git 登錄", + "CmdInstallExample1": "vcpkg install <連接埠名稱> <連接埠名稱>...", + "CmdIntegrateSynopsis": "將 vcpkg 與機器、專案或殼層整合", + "CmdListExample2": "vcpkg list <篩選>", + "CmdNewExample1": "vcpkg new --name=example --version=1.0", + "CmdNewOptApplication": "建立應用程式資訊清單 (不需要名稱或版本)", + "CmdNewOptSingleFile": "將 vcpkg-configuration.json 內嵌至 vcpkg.json", "CmdNewOptVersionDate": "將 --version 解譯為 ISO 8601 日期。(YYYY-MM-DD)", - "CmdNewOptVersionRelaxed": "將 --version 解譯為寬鬆數值版本。(以點分隔的非負數)", - "CmdNewOptVersionString": "將 --version 解譯為沒有排序行為的字串。", - "CmdNewSettingName": "新資訊清單的名稱。", - "CmdNewSettingVersion": "新資訊清單的版本。", - "CmdRegenerateOptDryRun": "不會實際執行動作,只會顯示要完成的動作", - "CmdRegenerateOptForce": "繼續進行 (具潛在危險的) 動作,但不進行確認", - "CmdRegenerateOptNormalize": "套用任何取代修正", - "CmdRemoveOptDryRun": "列印要移除的套件,但不要將它們移除", - "CmdRemoveOptOutdated": "選取版本和連接埠檔案不相符的所有套件", - "CmdRemoveOptRecurse": "允許移除命令列上未明確指定的套件", - "CmdSetInstalledOptDryRun": "實際上不要組建或安裝", - "CmdSetInstalledOptNoUsage": "安裝後不要列印 CMake 使用方式資訊。", - "CmdSetInstalledOptWritePkgConfig": "寫出 NuGet packages.config-formatted 檔案,以搭配外部二進位快取使用。\n如需詳細資訊,請參閱 'vcpkg help binarycaching'。", + "CmdNewOptVersionRelaxed": "將 --version 解譯為寬鬆數值版本 (非負數以句點分隔)", + "CmdNewOptVersionString": "將 --version 解譯為沒有排序行為的字串", + "CmdNewSettingName": "新資訊清單的名稱", + "CmdNewSettingVersion": "新資訊清單的版本", + "CmdNewSynposis": "建立新的資訊清單", + "CmdOwnsExample1": "vcpkg owns <模式>", + "CmdPackageInfoExample1": "vcpkg x-package-info <封裝名稱>...", + "CmdPortsdiffExample1": "vcpkg portsdiff <分支名稱>", + "CmdPortsdiffExample2": "vcpkg portsdiff ", + "CmdPortsdiffSynopsis": "在認可之間差異連接埠版本的變更", + "CmdRegenerateOptDryRun": "實際上不執行動作,只顯示要完成的動作", + "CmdRegenerateOptForce": "繼續進行 (具潛在危險) 動作,但不進行確認", + "CmdRegenerateOptNormalize": "套用任何取代修復", + "CmdRemoveExample1": "vcpkg remove <套件名稱>...", + "CmdRemoveOptDryRun": "列印要移除的套件,但不將它們移除", + "CmdRemoveOptOutdated": "移除具有的版本與內建登錄不符的所有套件", + "CmdRemoveOptRecurse": "允許移除未明確指定的依存套件", + "CmdSearchExample1": "vcpkg search <模式>", + "CmdSetInstalledExample1": "vcpkg x-set-installed <封裝名稱> <封裝名稱>...", + "CmdSetInstalledOptDryRun": "實際上組建或安裝", + "CmdSetInstalledOptNoUsage": "安裝後不要列印 CMake 使用方式資訊", + "CmdSetInstalledOptWritePkgConfig": "寫入 NuGet packages.config-formatted 檔案,以搭配外部二進位快取使用。如需詳細資訊,請參閱 `vcpkg help binarycaching`。", + "CmdSetInstalledSynopsis": "安裝、升級或移除與所提供封裝完全相符的套件", "CmdSettingCopiedFilesLog": "要建立之複製檔案記錄的路徑", "CmdSettingInstalledDir": "要使用之已安裝樹狀結構的路徑", "CmdSettingTLogFile": "要建立之 tlog 檔案的路徑", "CmdSettingTargetBin": "要分析的二進位路徑", - "CmdUpdateBaselineOptDryRun": "列印出計畫而不執行", - "CmdUpdateBaselineOptInitial": "將 'builtin-baseline' 新增至尚未擁有它的 vcpkg.json", - "CmdUpgradeOptAllowUnsupported": "持續警告,而不是在不受支援的連接埠上產生錯誤。", + "CmdUpdateBaselineOptDryRun": "列印出計劃而不執行", + "CmdUpdateBaselineOptInitial": "將 `builtin-baseline` 新增至尚未擁有它的 vcpkg.json", + "CmdUpdateBaselineSynopsis": "將資訊清單中 Git 登錄的基準更新為那些登錄的 HEAD 認可", + "CmdUpdateRegistryAll": "更新所有已知的成品登錄", + "CmdUpdateRegistryAllExcludesTargets": "更新登錄 --all 不能與成品登錄清單一起使用", + "CmdUpdateRegistryAllOrTargets": "更新登錄需要成品登錄名稱清單或 URiIs 才能更新,不然就是 --all。", + "CmdUpdateRegistryExample3": "vcpkg x-update-registry <成品登錄名稱>", + "CmdUpdateRegistrySynopsis": "重新下載成品登錄", "CmdUpgradeOptNoDryRun": "實際升級", "CmdUpgradeOptNoKeepGoing": "失敗時停止安裝套件", + "CmdUseExample1": "vcpkg use <成品名稱>", + "CmdUseSynopsis": "啟用此殼層中的單一成品", + "CmdVSInstancesSynopsis": "列出偵測到的 Visual Studio 執行個體", "CmdXDownloadOptHeader": "從 URL 擷取時要使用的其他標頭", "CmdXDownloadOptSha": "要下載之檔案的雜湊", - "CmdXDownloadOptSkipSha": "不要檢查已下載檔案的 SHA512", - "CmdXDownloadOptStore": "表示應該儲存檔案而非擷取", + "CmdXDownloadOptSkipSha": "跳過已下載檔案的 SHA512 檢查", + "CmdXDownloadOptStore": "儲存檔案而非擷取檔案", "CmdXDownloadOptUrl": "如果快取中遺失,要下載和儲存的 URL", + "CmdZApplocalSynopsis": "將二進位的相依性從已安裝的樹狀目錄複製到該二進位檔的應用程式本機部署位置", + "CmdZExtractExample1": "vcpkg z-extract <檔案路徑> <輸出目錄>", + "CmdZExtractExample2": "vcpkg z-extract source.zip source_dir --strip 2", + "CmdZExtractOptStrip": "從所有路徑中移除前置目錄的數目。", + "CommandEnvExample2": "vcpkg env \"ninja -C <路徑>\" --triplet x64-windows", "CommandFailed": "命令: \n{command_line}\n 失敗,結果如下:", - "Commands": "命令:", - "CommunityTriplets": "VCPKG 社群三元組:", + "CommunityTriplets": "社群三元組:", "ComparingUtf8Decoders": "將 Utf8Decoders 與不同起源比較; 這一律會是錯誤", "CompressFolderFailed": "無法壓縮資料夾 \"{path}\":", "ComputingInstallPlan": "正在計算安裝計畫...", "ConfigurationErrorRegistriesWithoutBaseline": "{path} 中定義的設定無效。\n\n使用登錄需要為預設登錄設定基準,或預設登錄為 Null。\n\n如需詳細資料,請參閱 {url}。", "ConfigurationNestedDemands": "[\"{json_field}\"] 包含巢狀 `demands` 物件 (巢狀 `demands` 沒有作用)", "ConflictingFiles": "下列檔案已安裝在 {path} 中,且與 {spec} 衝突", + "ConsideredVersions": "由於 {version} 的版本需求,已考慮下列可執行檔,但已捨棄:", "ConstraintViolation": "發現強制違規:", "ContinueCodeUnitInStart": "在開始位置找到繼續字碼單位", "ControlAndManifestFilesPresent": "資訊清單檔案和 CONTROL 檔案同時存在於連接埠目錄中: {path}", @@ -277,9 +392,7 @@ "CorruptedDatabase": "資料庫已損壞。", "CorruptedInstallTree": "您的 vcpkg 'installed' 樹狀目錄已損毀。", "CouldNotDeduceNugetIdAndVersion": "無法從檔案名推斷 nuget 識別碼和版本: {path}", - "CouldNotFindBaseline": "在基準檔案 {path} 中找不到明確指定的基準 `\"{commit_sha}\"`", - "CouldNotFindBaselineForRepo": "找不到存放庫 {package_name} 的基準 `\"{commit_sha}\"`", - "CouldNotFindBaselineInCommit": "在來自存放庫 {package_name} 的認可 `\"{commit_sha}\"` 中找不到基準:", + "CouldNotFindBaselineInCommit": "無法為 {package_name} 在 {commit_sha} 的 {url} 中找到基準。", "CouldNotFindGitTreeAtCommit": "在位於認可 {commit_sha} 的存放庫 {package_name} 中找不到 `versions` 的 git 樹狀結構", "CouldNotFindToolVersion": "在 {path} 中找不到 ", "CouldNotFindVersionDatabaseFile": "找不到版本資料庫檔案: {path}", @@ -300,11 +413,18 @@ "DefaultBinaryCachePlatformCacheRequiresAbsolutePath": "環境變數 VCPKG_DEFAULT_BINARY_CACHE 必須是目錄 (是: {path})", "DefaultBinaryCacheRequiresAbsolutePath": "環境變數 VCPKG_DEFAULT_BINARY_CACHE 必須是絕對 (是: {path})", "DefaultBinaryCacheRequiresDirectory": "環境變數 VCPKG_DEFAULT_BINARY_CACHE 必須是目錄 (是: {path})", - "DefaultBrowserLaunched": "預設瀏覽器已啟動至 {url}。", + "DefaultFeatureCore": "「核心」功能會關閉預設功能,因此無法列於預設功能清單中", + "DefaultFeatureDefault": "「預設」功能是指預設功能集,因此無法列於預設功能清單中", + "DefaultFeatureIdentifier": "預設功能的名稱必須是識別碼", "DefaultFlag": "預設為 --{option} 開啟。", "DefaultRegistryIsArtifact": "預設登錄不可以是成品登錄。", - "DefaultTriplet": "從 2023 年 9 月發行開始,vcpkg 程式庫的預設 triplet 將從 x86-windows 變更為偵測到的主機三色 ({triplet})。若要解決此訊息,請新增 --triplet x86-windows 以保持相同的行為。", + "DefaultTripletChanged": "在 2023 年 9 月的發行版本中,vcpkg 程式庫的預設 triplet 已從 x86-windows 變更為偵測到的主機三色元組 ({triplet})。針對舊行為,請新增 --triplet x86-windows。若要解決此訊息,請新增 --triplet {triplet}。", "DeleteVcpkgConfigFromManifest": "-- 或從資訊清單檔案 {path} 移除 \"vcpkg-configuration\"。", + "DependencyFeatureCore": "「核心」功能不能位在相依性的功能清單中。若要關閉預設功能,請改為新增「預設功能」:false。", + "DependencyFeatureDefault": "功能「預設」不能位在相依性的功能清單中。若要開啟預設功能,請改為新增「預設功能」:true。", + "DependencyGraphCalculation": "相依性圖形提交已啟用。", + "DependencyGraphFailure": "相依性圖形提交失敗。", + "DependencyGraphSuccess": "相依性圖形提交成功。", "DeprecatedPrefabDebugOption": "--prefab-debug 現已取代。", "DetectCompilerHash": "正在偵測三重 {triplet} 的編譯器雜湊...", "DocumentedFieldsSuggestUpdate": "如果這些是應被辨識的已記錄欄位,請嘗試更新 vcpkg 工具。", @@ -313,14 +433,12 @@ "DownloadFailedHashMismatch": "檔案沒有預期的雜湊:\nURL: {url}\n檔案: {path}\n預期的雜湊: {expected}\n實際雜湊: {actual}", "DownloadFailedRetrying": "下載失敗 -- {value} 毫秒後重試", "DownloadFailedStatusCode": "{url}: 失敗: 狀態代碼 {value}", - "DownloadRootsDir": "指定下載根目錄。\n(預設值: {env_var})", + "DownloadRootsDir": "下載目錄 (預設值: {env_var})", "DownloadWinHttpError": "{url}: {system_api} 失敗,結束代碼為 {exit_code}", "DownloadedSources": "已下載 {spec} 的來源", "DownloadingPortableToolVersionX": "找不到適合的 {tool_name} 版本 (需要 v{version})。正在下載可攜式 {tool_name} {version}...", "DownloadingTool": "正在下載 {tool_name}...\n{url}->{path}", "DownloadingUrl": "正在下載 {url}", - "DownloadingVcpkgCeBundle": "正在下載 vcpkg-artifacts 搭售方案 {version}...", - "DownloadingVcpkgCeBundleLatest": "正在下載最新的 vcpkg-artifacts 搭售方案...", "DownloadingVcpkgStandaloneBundle": "正在下載獨立搭售方案 {version}。", "DownloadingVcpkgStandaloneBundleLatest": "正在下載最新的獨立搭售方案。", "DuplicatePackagePattern": "套件 \"{package_name}\" 已複製。", @@ -343,6 +461,7 @@ "ErrorDetectingCompilerInfo": "偵測編譯器資訊時: \n位於 \"{path}\" 的記錄檔內容為:", "ErrorIndividualPackagesUnsupported": "在資訊清單模式中,'vcpkg install' 不支援個別套件引數。\n若要安裝其他套件,請編輯 vcpkg.json,然後執行不含任何套件引數的 'vcpkg install'。", "ErrorInvalidClassicModeOption": "傳統模式不支援選項 --{option},且找不到任何資訊清單。", + "ErrorInvalidExtractOption": "--{option} 必須設定為非負整數或 'AUTO'。", "ErrorInvalidManifestModeOption": "資訊清單模式不支援選項 --{option}。", "ErrorMessage": "錯誤: ", "ErrorMessageMustUsePrintError": "名為 {value} 的訊息開頭為錯誤:,必須變更為在程式碼的 ErrorMessage 前置。", @@ -362,7 +481,7 @@ "ErrorWhileParsing": "剖析 {path} 時發生錯誤。", "ErrorWhileWriting": "寫入 {path} 時發生錯誤。", "ErrorsFound": "找到下列錯誤:", - "Example": "範例:", + "ExamplesHeader": "範例:", "ExceededRecursionDepth": "超過遞迴深度。", "ExcludedPackage": "已排除 {spec}", "ExcludedPackages": "已排除下列套件:", @@ -394,6 +513,7 @@ "ExportingMaintenanceTool": "正在匯出維護工具...", "ExportingPackage": "正在匯出 {package_name}...", "ExtendedDocumentationAtUrl": "可在 '{url}' 上找到擴充文件。", + "ExtractHelp": "擷取封存。", "ExtractingTool": "正在擷取 {tool_name}...", "FailedPostBuildChecks": "()發現{count}建置後檢查問題。若要將這些埠提交給策劃的目錄,請先更正 portfile: {path}", "FailedToAcquireMutant": "無法取得 mutant {path}", @@ -404,8 +524,7 @@ "FailedToDetermineCurrentCommit": "無法判斷目前的認可:", "FailedToDownloadFromMirrorSet": "無法從鏡像集下載", "FailedToExtract": "無法擷取 \"{path}\":", - "FailedToFetchError": "{error_msg}\n無法擷取 {package_name}:", - "FailedToFindBaseline": "找不到 baseline.json", + "FailedToFetchRepo": "無法擷取 {url}。", "FailedToFindPortFeature": "{package_name} 沒有名為 {feature} 的功能。", "FailedToFormatMissingFile": "沒有要格式化的檔案。\n請傳遞 --all 或要格式化或轉換的明確檔案。", "FailedToLoadInstalledManifest": "因為發生下列錯誤,無法載入 {package_name} 的控制項或資訊清單檔案。請移除 {package_name} 並重試。", @@ -437,7 +556,6 @@ "FailedToTakeFileSystemLock": "無法對 {path} 進行檔案系統鎖定", "FailedToWriteManifest": "無法寫入資訊清單檔案 {path}", "FailedVendorAuthentication": "無法驗證一或多個 {vendor} 認證提供者。如需如何提供認證的詳細資料,請參閱 '{url}'。", - "FeedbackAppreciated": "謝謝您的寶貴意見!", "FetchingBaselineInfo": "正在從 {package_name} 擷取基準資訊...", "FetchingRegistryInfo": "正在從 {url} ({value}) 擷取註冊資訊...", "FieldKindDidNotHaveExpectedValue": "\"kind\" 沒有預期的值: (預期為下列其中之一: {expected}; 但找到 {actual})", @@ -449,11 +567,13 @@ "FilesContainAbsolutePath2": "在下列檔案中發現絕對路徑:", "FilesExported": "檔案匯出於: {path}", "FindHelp": "搜尋指定的成品或連接埠。在 'artifact' 或 'port' 後若沒有參數,則會顯示所有項目。", + "FindVersionArtifactsOnly": "--version 無法與 vcpkg search 或 vcpkg find port 一起使用", "FishCompletion": "vcpkg fish 完成已新增於 \"{path}\"。", "FloatingPointConstTooBig": "浮點常數太大: {count}", "FollowingPackagesMissingControl": "下列套件都沒有有效的 CONTROL 或 vcpkg.json:", "FollowingPackagesNotInstalled": "未安装下列套件:", "FollowingPackagesUpgraded": "下列套件是最新的:", + "ForMoreHelp": "更多協助", "ForceSystemBinariesOnWeirdPlatforms": "環境變數 VCPKG_FORCE_SYSTEM_BINARIES 必須在 s390x、ppc64le 和 riscv 平台上設定。", "FormattedParseMessageExpression": "在運算式上: {value}", "GHAParametersMissing": "GHA 二進位來源需要設定 ACTIONS_RUNTIME_TOKEN 和 ACTIONS_CACHE_URL 環境變數。如需詳細資料,請參閱 {url}。", @@ -470,7 +590,7 @@ "GitCommandFailed": "無法執行: {command_line}", "GitFailedToFetch": "無法從存放庫 {url} 擷取 ref {value}", "GitFailedToInitializeLocalRepository": "無法初始化本機存放庫 {path}", - "GitRegistryMustHaveBaseline": "\"{package_name}\" 的 git 登錄項目必須有 \"baseline\" 欄位,其為有效的 git 認可 SHA (40 個十六進位字元)。\n該存放庫目前的 HEAD 為 \"{value}\"。", + "GitRegistryMustHaveBaseline": "git 登錄 \"{url}\" 必須有 [基準] 欄位,且該欄位是有效的 git 認可 SHA (40 個十六進位字元)。\n若要使用目前的最新版本,請將基準設為該存放庫的 [標題] \"{commit_sha}\"。", "GitStatusOutputExpectedFileName": "必須是檔案名稱", "GitStatusOutputExpectedNewLine": "需要有新行", "GitStatusOutputExpectedRenameOrNewline": "需要重新命名的檔案或新行", @@ -478,6 +598,7 @@ "GitUnexpectedCommandOutputCmd": "Git 執行 {command_line} 時產生未預期的輸出", "GraphCycleDetected": "在圖形中偵測到循環,於 {package_name}:", "HashFileFailureToRead": "無法讀取檔案 \"{path}\" 進行雜湊: ", + "HashPortManyFiles": "{package_name} 包含 {count} 個檔案。判斷二進位快取的 ABI 雜湊時,雜湊這些內容可能需要很長的時間。請考慮減少檔案數目。此問題的常見原因是意外簽出來源,或將檔案建置到連接埠的目錄。", "HeaderOnlyUsage": "{package_name} 為僅標頭,可透過下列方式從 CMake 使用:", "HelpAssetCaching": "**實驗性功能: 這可能會隨時變更或移除**\n\nvcpkg 可以使用鏡像來快取已下載的資產,以確保即使原始來源變更或消失,仍可繼續作業。\n\n資產快取可透過將環境變數 X_VCPKG_ASSET_SOURCES 設為以分號分隔的來源清單,或傳遞一連串 --x-asset-sources= 命令列選項來設定。命令列來源會在環境來源之後解譯。可以使用 backtick (') 逸出逗號、分號和反引號。\n\n特定字串的選擇性參數可控制其存取方式。可以指定為「read」、「write」或「readwrite」,並預設為「read」。\n\n有效來源:", "HelpAssetCachingAzUrl": "新增 Azure Blob 儲存體來源,選擇性地使用共用存取簽章驗證。URL 應包含容器路徑,並以尾端「/」結尾。若已定義,則首碼應為「?」。如果非 Azure 伺服器回應以下格式的 GET 和 PUT 要求,則也會運作: 「」。", @@ -502,55 +623,52 @@ "HelpBinaryCachingNuGetTimeout": "指定 NuGet 網路操作的 NuGet 逾時; 等於 NuGet CLI 的「-Timeout」參數。", "HelpBuiltinBase": "基準會參考 vcpkg 存放庫內的一個認可,其會建立圖表中每個相依性的最低版本。例如,如果未指定其他限制式 (直接或可轉移),則版本會解析為最上層資訊清單的基準。會忽略可轉移相依性的基準。", "HelpCachingClear": "移除所有先前的來源,包括預設值。", - "HelpContactCommand": "顯示連絡資訊以傳送意見反應。", - "HelpCreateCommand": "建立新連接埠。", - "HelpDependInfoCommand": "顯示連接埠的相依性清單。", - "HelpEditCommand": "開啟連接埠以編輯 (使用環境變數 '{env_var}' 設定編輯器程式,預設為 'code')。", - "HelpEnvCommand": "建立用於開發或編譯的全新殼層環境。", - "HelpExampleCommand": "如需更多說明 (包含範例),請參閱隨附的 README.md 與文件資料夾。", + "HelpContactCommand": "顯示連絡人資訊以傳送意見反", + "HelpCreateCommand": "建立新連接埠", + "HelpDependInfoCommand": "顯示連接埠的相依性清單", + "HelpEditCommand": "編輯連接埠,選擇性地使用 {env_var},預設為 \"code\"", + "HelpEnvCommand": "建立用於開發或編譯的全新殼層環境", + "HelpExampleCommand": "如需更多說明 (包括範例),請參閱 https://learn.microsoft.com/vcpkg", "HelpExampleManifest": "範例資訊清單:", "HelpExportCommand": "匯出套件。", - "HelpFormatManifestCommand": "格式化所有 vcpkg.json 檔案。在認可 vcpkg 之前,請先執行此動作。", "HelpHashCommand": "依特定演算法雜湊檔案,預設 SHA512。", - "HelpInitializeRegistryCommand": "初始化目錄 中的登錄。", - "HelpInstallCommand": "安裝套件。", - "HelpListCommand": "列出已安裝的套件。", + "HelpInstallCommand": "安裝套件", + "HelpListCommand": "列出已安裝的套件", "HelpManifestConstraints": "資訊清單可以在使用的版本上實施三種限制式", "HelpMinVersion": "Vcpkg 將會選取所找到符合所有適用限制式的最低版本,包括在最上層指定的基準版本,以及圖表中的任何 \"version>=\" 限制式。", "HelpOverrides": "做為最上層資訊清單時 (例如,在目錄中執行 `vcpkg install` 時),覆寫會允許資訊清單讓相依性解決方案中斷,並指定要使用的確切版本。這些可用來處理版本衝突,例如使用 `version-string` 相依性。可轉移依據它們的時候不會加以考慮。", - "HelpOwnsCommand": "搜尋已安裝套件中的檔案。", + "HelpOwnsCommand": "在已安裝的套件中搜尋檔案的擁有者", "HelpPackagePublisher": "此外,套件發行者可以使用 \"version>=\" 限制式,以確保取用者至少使用指定相依性的特定最低版本。例如,如果程式庫需要將 API 新增至 1.70 的 boost-asio,則 \"version>=\" 限制式可確保可轉移使用者會使用足夠的版本,即使是在面臨個別版本覆寫或跨登錄參考時亦然。", "HelpPortVersionScheme": "此外,每個版本都有一個 \"port-version\",其為非負整數。當呈現為文字時,連接埠版本 (如果非零) 會新增為主要版本文字的尾碼 (以井字號 (#) 分隔)。Port-version 會在主要版本文字之後以字典方式排序,例如:\n1.0.0 < 1.0.0#1 < 1.0.1 < 1.0.1#5 < 2.0.0", - "HelpRemoveCommand": "解除安裝套件。", - "HelpRemoveOutdatedCommand": "解除安裝所有過期套件。", - "HelpResponseFileCommand": "指定回應檔以提供其他參數。", - "HelpSearchCommand": "搜尋可用來建置的套件。", - "HelpTextOptFullDesc": "不要截斷長的文字簡訊。", - "HelpTopicCommand": "顯示特定主題的說明。", - "HelpTopicsCommand": "顯示說明主題清單。", - "HelpTxtOptAllowUnsupportedPort": "持續警告,而不是在不受支援的連接埠上產生錯誤。", - "HelpTxtOptCleanAfterBuild": "組建每個套件後清除 buildtrees、套件和下載。", - "HelpTxtOptCleanBuildTreesAfterBuild": "組建每個套件後清除 buildtrees。", - "HelpTxtOptCleanDownloadsAfterBuild": "組建每個套件後清除下載。", - "HelpTxtOptCleanPkgAfterBuild": "組建每個套件後清除套件。", - "HelpTxtOptDryRun": "實際上不要組建或安裝。", + "HelpRemoveCommand": "解除安裝套件", + "HelpResponseFileCommand": "每行包含一個引數,於該位置展開", + "HelpSearchCommand": "搜尋可用來組建的套件", + "HelpTextOptFullDesc": "不截斷長段文字", + "HelpTopicCommand": "顯示特定說明主題", + "HelpTopicsCommand": "顯示說明主題的完整清單", + "HelpTxtOptAllowUnsupportedPort": "在不支援的連接埠上顯示警告並繼續,而不是失敗", + "HelpTxtOptCleanAfterBuild": "組建每個套件後清除 buildtrees、套件和下載", + "HelpTxtOptCleanBuildTreesAfterBuild": "組建每個套件後清除 buildtrees", + "HelpTxtOptCleanDownloadsAfterBuild": "組建每個套件後清除下載", + "HelpTxtOptCleanPkgAfterBuild": "組建每個套件後清除套件", + "HelpTxtOptDryRun": "實際上組建或安裝", "HelpTxtOptEditable": "停用命令列中程式庫的來源重新擷取和二進位快取 (傳統模式)", - "HelpTxtOptEnforcePortChecks": "如果連接埠已偵測到問題或嘗試使用已被取代的功能,則安裝會失敗", - "HelpTxtOptKeepGoing": "失敗時繼續安裝套件。", - "HelpTxtOptManifestFeature": "從最上層資訊清單安裝的其他功能 (資訊清單模式)。", - "HelpTxtOptManifestNoDefault": "請勿從最上層資訊清單安裝預設功能 (資訊清單模式)。", - "HelpTxtOptNoDownloads": "不要下載新來源。", - "HelpTxtOptNoUsage": "安裝後不要列印 CMake 使用方式資訊。", - "HelpTxtOptOnlyBinCache": "如果無法使用快取的二進位檔,就會失敗。", - "HelpTxtOptOnlyDownloads": "在不建置的情況下,盡可能嘗試下載來源。", - "HelpTxtOptRecurse": "允許在安裝時移除套件。", - "HelpTxtOptUseAria2": "使用 Aria2 執行下載工作。", - "HelpTxtOptUseHeadVersion": "使用最新的上游來源在命令列上安裝程式庫檔 (傳統模式)。", - "HelpTxtOptWritePkgConfig": "寫出 NuGet packages.config-formatted 檔案,以搭配外部二進位快取使用。\n如需詳細資訊,請參閱 'vcpkg help binarycaching'。", + "HelpTxtOptEnforcePortChecks": "如果連接埠偵測到問題或嘗試使用已被取代的功能,則讓安裝失敗", + "HelpTxtOptKeepGoing": "失敗時繼續安裝套件", + "HelpTxtOptManifestFeature": "要從最上層資訊清單安裝的其他功能 (資訊清單模式)", + "HelpTxtOptManifestNoDefault": "不要從最上層資訊清單安裝預設功能 (資訊清單模式)", + "HelpTxtOptNoDownloads": "不下載新來源", + "HelpTxtOptNoUsage": "安裝後不要列印 CMake 使用方式資訊", + "HelpTxtOptOnlyBinCache": "如果快取的二進位檔無法使用則失敗", + "HelpTxtOptOnlyDownloads": "在不組建的情況下,盡可能嘗試下載來源", + "HelpTxtOptRecurse": "允許在安裝時移除套件", + "HelpTxtOptUseAria2": "使用 aria2 執行下載工作", + "HelpTxtOptUseHeadVersion": "使用最新的上游來源在命令列上安裝程式庫 (傳統模式)", + "HelpTxtOptWritePkgConfig": "寫入 NuGet packages.config-formatted 檔案,以搭配外部二進位快取使用。如需詳細資訊,請參閱 `vcpkg help binarycaching`。", "HelpUpdateBaseline": "將程式庫保持在最新的最佳做法是更新您的基準參考。這可確保所有套件 (包括可轉移套件) 都會更新。不過,如果您需要單獨更新套件,您可以使用 \"version>=\" 限制式。", - "HelpUpdateCommand": "列出可更新的套件。", - "HelpUpgradeCommand": "重建所有過期的套件。", - "HelpVersionCommand": "顯示版本資訊。", + "HelpUpdateCommand": "列出可升級的套件", + "HelpUpgradeCommand": "重建所有過時的套件", + "HelpVersionCommand": "顯示版本資訊", "HelpVersionDateScheme": "日期 (2021-01-01.5)", "HelpVersionGreater": "在 [相依性] 欄位內,每個相依性可以列出一個最低限制式。這些最低限制式會在可轉移依據此程式庫時使用。也可以額外使用 '#' 尾碼指定最低 port-version。", "HelpVersionScheme": "以句點分隔的數字序列 (1.2.3.4)", @@ -565,12 +683,12 @@ "IncorrectArchiveFileSignature": "不正確的封存檔案簽章", "IncorrectPESignature": "不正確的 PE 簽章", "IncrementedUtf8Decoder": "在字串結尾遞增 Utf8Decoder", - "InfoSetEnvVar": "您也可以將環境變數 '{env_var}' 設為您選擇的編輯器。", + "InfoSetEnvVar": "您也可以將 {env_var} 設為您所選擇的編輯器。", "InitRegistryFailedNoRepo": "無法在 {path} 建立登錄,因為這不是 GIT 儲存機制根路徑。\n使用 `git init {command_line}` 在此資料夾中建立 Git 存放庫。", "InstallCopiedFile": "{path_source} -> {path_destination} 完成", "InstallFailed": "失敗: {path}: {error_msg}", "InstallPackageInstruction": "開啟專案後,請移至 [工具]->[NuGet 套件管理員]->[套件管理員主控台],然後貼上:\n Install-Package \"{value}\" -Source \"{path}\"", - "InstallRootDir": "(實驗性) 指定安裝根目錄。", + "InstallRootDir": "安裝的目錄 (實驗性)", "InstallSkippedUpToDateFile": "{path_source} -> {path_destination} 已跳過,為最新狀態", "InstallWithSystemManager": "您或許可以透過系統套件管理員安裝此工具。", "InstallWithSystemManagerMono": "Ubuntu 18.04 使用者可能需要較新版的 MONO,可在 {url} 取得。", @@ -581,15 +699,17 @@ "InstallingFromLocation": "-- 正在從位置安裝連接埠: {path}", "InstallingMavenFile": "{path} 安裝 Maven 檔案", "InstallingPackage": "正在安裝 {action_index}/{count} {spec}...", - "IntegrateBashHelp": "啟用 Bash TAB 鍵自動完成。", - "IntegrateFishHelp": "啟用 fish TAB 鍵自動完成。", - "IntegrateInstallHelpLinux": "讓安裝的封裝可供所有使用者使用。", - "IntegrateInstallHelpWindows": "讓安裝的封裝可供所有使用者使用。第一次使用時需要管理員權限。", - "IntegratePowerShellHelp": "啟用 PowerShell TAB 鍵自動完成。", - "IntegrateProjectHelp": "為個別 VS 專案使用產生參考的 NuGet 封裝。", - "IntegrateRemoveHelp": "移除全使用者整合。", - "IntegrateZshHelp": "啟用 zsh TAB 鍵自動完成。", - "IntegrationFailed": "未套用整合。", + "IntegrateBashHelp": "啟用 bash Tab 鍵自動完成。僅限非 Windows", + "IntegrateFishHelp": "啟用 fish Tab 鍵自動完成。僅限非 Windows", + "IntegrateInstallHelpLinux": "讓安裝的套件可供全使用者使用", + "IntegrateInstallHelpWindows": "讓安裝的套件可供全使用者使用。第一次使用時需要管理員權限", + "IntegrateNonWindowsOnly": "{command_line} 非僅限 Windows,而且不支援此系統。", + "IntegratePowerShellHelp": "啟用 PowerShell Tab 鍵自動完成。僅限 Windows", + "IntegrateProjectHelp": "產生個別 Visual Studio 專案使用的參考 NuGet 套件。僅限 Windows", + "IntegrateRemoveHelp": "移除全使用者整合", + "IntegrateWindowsOnly": "{command_line} 僅限 Windows,而且不支援此系統。", + "IntegrateZshHelp": "啟用 zsh Tab 鍵自動完成。僅限非 Windows", + "IntegrationFailedVS2015": "整合並不適用 Visual Studio 2015。", "InternalCICommand": "vcpkg ci 是內部命令,會隨時以不相容的方式變更或遭移除。", "InternalErrorMessage": "內部錯誤:", "InternalErrorMessageContact": "請在 https://github.com/microsoft/vcpkg/issues/new?template=other-type-of-bug-report.md&labels=category:vcpkg-bug 開啟問題,並提供詳細步驟以重現問題。", @@ -621,7 +741,6 @@ "InvalidCommentStyle": "vcpkg 不支援 c 樣式註解,但大部分物件允許使用以 $ 開頭的欄位做為註解。", "InvalidCommitId": "無效的認可識別碼: {commit_sha}", "InvalidDefaultFeatureName": "'default' 是保留的功能名稱", - "InvalidDependency": "相依項必須是小寫英數字元+連字號,而且不能是其中一個保留名稱", "InvalidFeature": "功能必須是小寫英數字元+連字號,而且不能是其中一個保留名稱", "InvalidFileType": "失敗: {path} 無法處理檔案類型", "InvalidFilename": "檔案名不能包含無效字元 {value},但為 {path}", @@ -632,7 +751,7 @@ "InvalidLibraryMissingLinkerMembers": "程式庫無效: 找不到連結器成員。", "InvalidLinkage": "不正確 {system_name} 連結類型: [{value}]", "InvalidLogicExpressionUnexpectedCharacter": "邏輯運算式無效,非預期的字元", - "InvalidLogicExpressionUsePipe": "邏輯運算式無效,請使用 '|' ,而非 'or'", + "InvalidLogicExpressionUsePipe": "邏輯運算式無效,請使用 '|' 而非 'or'", "InvalidNoVersions": "檔案未包含任何版本。", "InvalidOptionForRemove": "'remove' 接受程式庫或 '--outdated'", "InvalidPortVersonName": "發現無效的連接埠版本檔案名稱: `{path}`。", @@ -646,7 +765,7 @@ "JsonFieldNotObject": "[\"{json_field}\"] 的值必須是物件", "JsonFieldNotString": "[\"{json_field}\"] 的值必須是字串", "JsonFileMissingExtension": "JSON 檔案 {path} 必須有 .json (全部小寫) 副檔名", - "JsonSwitch": "(實驗性) 要求 JSON 輸出。", + "JsonSwitch": "列印 JSON 而非純文字", "JsonValueNotArray": "JSON 值不是陣列", "JsonValueNotObject": "JSON 值不是物件", "JsonValueNotString": "JSON 值不是字串", @@ -675,7 +794,7 @@ "LinkageDynamicRelease": "動態發行 (/MD)", "LinkageStaticDebug": "靜態偵錯 (/MTd)", "LinkageStaticRelease": "靜態發行 (/MT)", - "ListHelp": "引數應為可搜尋的 substring,或沒有參數以顯示所有安裝的程式庫。", + "ListHelp": "列出已安裝的程式庫", "ListOfValidFieldsForControlFiles": "這是 CONTROL 檔案的有效欄位清單 (區分大小寫):", "LoadingCommunityTriplet": "-- [COMMUNITY] 正在從下列位置載入三重設定: {path}", "LoadingDependencyInformation": "正在載入 {count} 個套件的相依性資訊...", @@ -707,8 +826,7 @@ "MsiexecFailedToExtract": "使用啟動或結束代碼 {exit_code} 和訊息解壓縮\"{path}\" 時 msiexec 失敗:", "MultiArch": "Multi-Arch 必須是 'same',但 {option}", "MultipleFeatures": "{package_name} 多次宣告 {feature}; 請確定功能具有相異名稱", - "MutuallyExclusiveOption": "--{value} 不能與 --{option} 一起使用。", - "NavigateToNPS": "請在慣用瀏覽器中瀏覽至 {url}。", + "MutuallyExclusiveOption": "--{value} 不能搭配 --{option} 使用。", "NewConfigurationAlreadyExists": "建立資訊清單會覆寫位於 {path} 的 vcpkg-configuration.json。", "NewManifestAlreadyExists": "資訊清單已存在於 {path}。", "NewNameCannotBeEmpty": "--name 不得為空白。", @@ -716,7 +834,6 @@ "NewSpecifyNameVersionOrApplication": "請指定 --name 或 --version 以產生適合 C++ 程式庫的資訊清單,或指定 --application 以表示資訊清單不是用來作為連接埠。", "NewVersionCannotBeEmpty": "--version 不得為空白。", "NoArgumentsForOption": "選項 --{option} 不接受引數。", - "NoCachedPackages": "未快取任何封裝。", "NoError": "沒有錯誤", "NoInstalledPackages": "未安裝任何套件。您是要「搜尋」的意思?", "NoLocalizationForMessages": "下列項目沒有當地語系化的訊息: ", @@ -739,11 +856,13 @@ "OptionRequiresAValue": "選項 '{option}' 必須是值", "OptionRequiresOption": "--{value} 需要 --{option}", "OptionUsedMultipleTimes": "已多次指定選項 '{option}'", - "OptionalCommand": "選擇性命令", "Options": "選項", "OriginalBinParagraphHeader": "\n原始二進位段落", + "OtherCommandsHeader": "其他", "OverlayPatchDir": "重疊路徑「{path}」必須存在且必須是目錄。", - "OverlayTriplets": "來自 {path} 的重疊三元組:", + "OverlayPortsDirectoriesHelp": "重疊連接埠的目錄 (也是: {env_var})", + "OverlayTripletDirectoriesHelp": "重疊三元組的目錄 (也是: {env_var})", + "OverlayTriplets": "來自 \"{path}\" 的重疊三元組:", "OverwritingFile": "檔案 {path} 已存在且將被覆寫", "PECoffHeaderTooShort": "剖析可攜式可執行檔 {path} 時,COFF 標頭的大小太小,無法包含有效的 PE 標頭。", "PEConfigCrossesSectionBoundary": "剖析可攜式可執行檔 {path} 時,影像設定目錄會跨越節邊界。", @@ -752,9 +871,12 @@ "PERvaNotFound": "剖析可攜式可執行檔 {path} 時,找不到 RVA {value:#X}。", "PESignatureMismatch": "剖析可攜式可執行檔 {path} 時,簽章不符。", "PackageAlreadyRemoved": "無法移除 {spec}: 已移除", + "PackageDiscoveryHeader": "套件探索", "PackageFailedtWhileExtracting": "擷取 {path} 時 '{value}' 失敗。", - "PackageInfoHelp": "顯示封裝的詳細資訊。", - "PackageRootDir": "(實驗性) 指定套件根目錄。", + "PackageInfoHelp": "顯示套件的詳細資訊", + "PackageInstallationHeader": "封裝安裝", + "PackageManipulationHeader": "套件操作", + "PackageRootDir": "套件目錄 (實驗性)", "PackagesToInstall": "下列套件將重建並安裝:", "PackagesToInstallDirectly": "下列套件將直接安裝:", "PackagesToModify": "將修改其他套件 (*) 以完成此作業。", @@ -774,9 +896,10 @@ "ParseControlErrorInfoTypesEntry": "{value} 預期為 {expected}", "ParseControlErrorInfoWhileLoading": "載入 {path} 時:", "ParseControlErrorInfoWrongTypeFields": "下列欄位的類型錯誤:", - "ParseIdentifierError": "\"{value}\" 並非有效的識別碼。識別碼必須是小寫英數字元+連字號,且未保留 (如需詳細資訊,請參閱 {url})", - "ParsePackageNameError": "\"{package_name}\" 並非有效的套件名稱。套件名稱必須是小寫英數字元+連字號,且未保留 (如需詳細資訊,請參閱 {url})", - "ParsePackagePatternError": "\"{package_name}\" 並非有效的套件模式。套件模式僅可使用一個萬用字元 (*),且其必須是模式中的最後一個字元 (如需詳細資訊,請參閱 {url})", + "ParseFeatureNameError": "\"{package_name}\" 並非有效的功能名稱。功能名稱必須是小寫英數字元+連字號,且未保留 (如需詳細資訊,請參閱 {url})", + "ParseIdentifierError": "\"{value}\" 並非有效的識別碼。識別碼必須是小寫英數字元+連字號,且未保留 (如需詳細資訊,請參閱 {url})。", + "ParsePackageNameError": "\"{package_name}\" 並非有效的套件名稱。套件名稱必須是小寫英數字元+連字號,且未保留 (如需詳細資訊,請參閱 {url})。", + "ParsePackagePatternError": "\"{package_name}\" 並非有效的套件模式。套件模式僅可使用一個萬用字元 (*),且其必須是模式中的最後一個字元 (如需詳細資訊,請參閱 {url})。", "PathMustBeAbsolute": "環境變數 X_VCPKG_REGISTRIES_CACHE 的值不是絕對: {path}", "PerformingPostBuildValidation": "-- 正在執行組建後驗證", "PortBugAllowRestrictedHeaders": "在例外狀況下,可透過 {env_var} 停用此原則", @@ -796,6 +919,7 @@ "PortBugInspectFiles": "若要檢查{extension}檔案,請使用:", "PortBugInvalidCrtLinkage": "下列二進位檔案應該使用 {expected} CRT。", "PortBugInvalidCrtLinkageEntry": "{path} 連結包含:", + "PortBugKernel32FromXbox": "選取的三元組設定目標為 Xbox,並非下列具有 kernel32 的 DLL 連結。這些 DLL 無法在 kernel32 不存在的 Xbox 上載入。這通常是由於連結了 kernel32.lib 而非適當的傘程式庫 (例如 onecore_apiset.lib 或 xgameplatform.lib) 所造成。", "PortBugMergeLibCMakeDir": "應將 /lib/cmake 資料夾與 /debug/lib/cmake 合併,並移至 /share/{package_name}/cmake。請使用連接埠 vcpkg-cmake-config 的協助程式函式 `vcpkg_cmake_config_fixup()`。", "PortBugMismatchedNumberOfBinaries": "偵錯和版本二進位檔的數目不相符。", "PortBugMisplacedCMakeFiles": "在 /share/{spec} 之外找到下列 cmake 檔案。請在 /share/{spec} 中放置 cmake 檔案。", @@ -814,7 +938,7 @@ "PortBugRemoveBinDir": "如果無法停用 bin\\ 和/或 debug\\bin\\ 的建立,請在設定檔中使用此選項來移除它們", "PortBugRemoveEmptyDirectories": "如果應該填入目錄但未填入,這可能表示設定檔中出現錯誤。\n如果不需要目錄且無法停用其建立,請使用設定檔中的類似內容來移除它們:", "PortBugRemoveEmptyDirs": "file(REMOVE_RECURSE 以上重新命名留下的空白目錄)", - "PortBugRestrictedHeaderPaths": "下列受限標頭可能會防止核心 C++ 執行時間及其他封裝正確編譯。在例外狀況下,可透過 {env_var} 停用此原則。", + "PortBugRestrictedHeaderPaths": "下列受限制的標頭可能會防止核心 C++ 執行時間和其他套件正確編譯。在特殊情況下,您可以在 portfile.cmake 中設定 CMake 變數 VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS 來停用此原則。", "PortBugSetDllsWithoutExports": "沒有匯出的 DLL 可能是組建指令碼中的錯誤。如果這是想要的,請在設定檔中新增下列行:\n已啟用 set(VCPKG_POLICY_DLLS_WITHOUT_EXPORTS)\n下列 DLL 沒有匯出:", "PortDependencyConflict": "連接埠 {package_name} 具有下列不支援的相依性:", "PortDoesNotExist": "{package_name} 不存在", @@ -827,21 +951,26 @@ "PortsDiffHelp": "引數應為要簽出的分支/標籤/雜湊。", "PortsNoDiff": "兩個認可之間的連接埠中沒有變更。", "PortsRemoved": "已移除下列 {count} 個連接埠:", - "PortsUpdated": "\n已更新下列 {count} 個連接埠:", + "PortsUpdated": "已更新下列 {count} 個連接埠:", "PrebuiltPackages": "有些套件尚未建置。若要建置,請執行:", "PreviousIntegrationFileRemains": "未移除先前的整合檔案。", "ProgramReturnedNonzeroExitCode": "{tool_name} 失敗,結束代碼: ({exit_code})。", "ProvideExportType": "至少需要下列其中一個選項: --raw --nuget --ifw --zip --7zip --chocolatey --prefab。", "PushingVendorFailed": "將 {vendor} 推送到 \"{path}\" 失敗。如需詳細資訊,請使用 --debug。", - "RegeneratesArtifactRegistry": "重新產生成品登錄。", + "RegeneratesArtifactRegistry": "重新產生成品登錄", "RegistryCreated": "已成功在 {path} 建立登錄", "RegistryValueWrongType": "登錄值 {path} 並非預期的類型。", "RemoveDependencies": "若要在資訊清單模式中移除相依性,請編輯您的資訊清單 (vcpkg.json) 並執行 'install'。", "RemovePackageConflict": "未安裝 {spec},但已為 {triplet} 安裝 {package_name}。您是指 {package_name}:{triplet}?", "RemovingPackage": "正在移除 {action_index}/{count} {spec}", "ResponseFileCode": "@response_file", - "RestoredPackage": "已從 \"{path}\" 還原封裝", - "RestoredPackagesFromVendor": "已從 {elapsed} 中的 {value} 還原 ({count}) 個封裝。使用 --debug 以查看更多詳細資料。", + "RestoredPackagesFromAWS": "已從 {elapsed} 中的 AWS 還原 ({count}) 個封裝。使用 --debug 以查看更多詳細資料。", + "RestoredPackagesFromCOS": "已從 {elapsed} 中的 COS 還原 ({count}) 個封裝。使用 --debug 以查看更多詳細資料。", + "RestoredPackagesFromFiles": "已從 {elapsed} 中的 {path} 還原 ({count}) 個封裝。使用 --debug 以查看更多詳細資料。", + "RestoredPackagesFromGCS": "已從 {elapsed} 中的 GCS 還原 ({count}) 個封裝。使用 --debug 以查看更多詳細資料。", + "RestoredPackagesFromGHA": "已從 {elapsed} 中的 GitHub Actions 快取還原 ({count}) 個封裝。使用 --debug 以查看更多詳細資料。", + "RestoredPackagesFromHTTP": "已從 {elapsed} 中的 HTTP 伺服器還原 ({count}) 個封裝。使用 --debug 以查看更多詳細資料。", + "RestoredPackagesFromNuGet": "已從 {elapsed} 中的 NuGet 還原 ({count}) 個封裝。使用 --debug 以查看更多詳細資料。", "ResultsHeader": "結果", "ScriptAssetCacheRequiresScript": "預期的引數: 資產設定 'x-script' 需要完全符合 exec 範本做為引數", "SearchHelp": "引數應為可搜尋的 substring,或沒有參數以顯示所有程式庫。", @@ -855,13 +984,11 @@ "SkipClearingInvalidDir": "正在跳過清除 {path} 的內容,因為它不是目錄。", "SourceFieldPortNameMismatch": "CONTROL 檔案內的 'Source' 欄位或 vcpkg.json 檔案內的 \"name\" 欄位名稱為 {package_name},與連接埠目錄 \"{path}\" 不相符。", "SpecifiedFeatureTurnedOff": "'{command_name}' 功能已特別關閉,但已指定 --{option}。", - "SpecifyDirectoriesContaining": "指定包含三元組檔案的目錄。\n(also: '{env_var}')", - "SpecifyDirectoriesWhenSearching": "指定搜尋連接埠時要使用的目錄。\n(also: '{env_var}')", - "SpecifyHostArch": "指定主機架構三元組。請參閱 'vcpkg help triplet'。\n(預設值: '{env_var}')", - "SpecifyTargetArch": "指定目標架構三元組。請參閱 'vcpkg help triplet'。\n(預設值: '{env_var}')", + "SpecifyHostArch": "主機三元組。請參閱 'vcpkg help triplet' (預設值: {env_var})", + "SpecifyTargetArch": "目標三元組。請參閱 'vcpkg help triplet' (預設值: {env_var})", "StartCodeUnitInContinue": "在繼續位置找到開始字碼單位", "StoreOptionMissingSha": "--store 選項無效,沒有 sha512", - "StoredBinariesToDestinations": "儲存在 {count} 個目的地的二進位檔。", + "StoredBinariesToDestinations": "已將二進位檔儲存在 {elapsed} 中的 {count} 個目的地。", "StoredBinaryCache": "儲存的二進位快取: \"{path}\"", "SuccessfulyExported": "已將 {package_name} 匯出至 {path}", "SuggestGitPull": "結果可能已過期。執行 `git pull` 以取得最新結果。", @@ -870,6 +997,7 @@ "SuggestUpdateVcpkg": "您可能需要更新 vcpkg 二進位檔案; 請嘗試執行 {command_line} 以更新。", "SupportedPort": "支援連接埠 {package_name}。", "SwitchUsedMultipleTimes": "已多次指定切換 '{option}'", + "SynopsisHeader": "概要:", "SystemApiErrorMessage": "呼叫 {system_api} 失敗,{exit_code} ({error_msg})", "SystemRootMustAlwaysBePresent": "預期永遠在 Windows 上設定 SystemRoot 環境變數。", "SystemTargetsInstallFailed": "無法將系統目標檔案安裝到 {path}", @@ -882,6 +1010,7 @@ "TrailingCommaInArray": "陣列中的後置逗號", "TrailingCommaInObj": "物件中的後置逗號", "TripletFileNotFound": "找不到三元檔案 {triplet}.cmake", + "TripletLabel": "三元組:", "TwoFeatureFlagsSpecified": "已同時將 '{value}' 和 -'{value}' 指定為功能旗標。", "UnableToClearPath": "無法刪除 {path}", "UnableToReadAppDatas": "%LOCALAPPDATA% 和 %APPDATA% 都無法讀取", @@ -953,7 +1082,7 @@ "UpdateBaselineNoUpdate": "登錄 '{url}' 未更新: '{value}'", "UpdateBaselineRemoteGitError": "git 無法擷取遠端存放庫 '{url}'", "UpdateBaselineUpdatedBaseline": "已更新登錄 '{url}': 比較基準 '{old_value}' -> '{new_value}'", - "UpgradeInManifest": "升級命令目前不支援資訊清單模式。請改為修改 vcpkg.json 並執行安裝。", + "UpgradeInManifest": "升級會升級傳統模式安裝,因此不支援資訊清單模式。請考慮使用 vcpkg x-update-baseline 將基準更新為目前的值,並執行 vcpkg 安裝,以更新您的相依性。", "UpgradeRunWithNoDryRun": "如果您確定要重建上述套件,請以 --no-dry-run 選項執行此命令。", "UploadedBinaries": "已將二進位檔上傳至 {count} 位 {vendor}。", "UploadedPackagesToVendor": "已在 {elapsed} 中上傳 {count} 個套件至 {vendor}", @@ -977,8 +1106,9 @@ "VcpkgInvalidCommand": "無效命令: {command_name}", "VcpkgRegistriesCacheIsNotDirectory": "環境變數 X_VCPKG_REGISTRIES_CACHE 的值不是目錄: {path}", "VcpkgRootRequired": "獨立啟動程序需要設定 VCPKG_ROOT。", - "VcpkgRootsDir": "指定 vcpkg 根目錄。\n(預設值: '{env_var}')", + "VcpkgRootsDir": "vcpkg 根目錄 (預設值: {env_var})", "VcpkgSendMetricsButDisabled": "通過 --sendmetrics,但已停用計量。", + "VcpkgUsage": "使用方式: vcpkg [--switches] [--options=values] [arguments] @response_file", "VcvarsRunFailed": "無法執行 vcvarsall.bat 以取得 Visual Studio 環境", "VcvarsRunFailedExitCode": "嘗試取得 Visual Studio 環境時,vcvarsall.ba 已傳回 {exit_code}", "VersionBaselineMismatch": "最新版本為 {expected},但基準檔案包含 {actual}.\n執行:\nvcpkg x-add-version {package_name}\ngit add versions\ngit commit -m \"Update version database\"\n以更新基準版本。", @@ -992,18 +1122,19 @@ "VersionDatabaseFileMissing": "{package_name} 在 {path} 遺漏版本資料庫檔案\n執行:\nvcpkg x-add-version {package_name}\n以建立版本檔案。", "VersionGitEntryMissing": "{version} 沒有 {package_name} 的版本資料庫項目。\n可用的版本:", "VersionInDeclarationDoesNotMatch": "檔案中宣告的版本與簽出的版本不符: {version}", - "VersionIncomparable1": "版本的 {spec} 衝突: {package_name} 需要 {expected},但 vcpkg 無法將其與 {actual} 比較。\n這兩個版本使用的配置不相容:", - "VersionIncomparable2": "\"{version}\" 是配置 {new_scheme}", - "VersionIncomparable3": "若要解決此問題,請將明確覆寫新增至慣用版本,例如:", - "VersionIncomparable4": "如需詳細資訊,請參閱「vcpkg 說明版本設定」。", + "VersionIncomparable1": "{spec} 的版本衝突: {constraint_origin} 需要 {expected},無法與基準版本 {actual} 進行比較。", + "VersionIncomparable2": "{version_spec} 有配置 {new_scheme}", + "VersionIncomparable3": "若要解決此問題,請將明確覆寫新增至慣用版本。例如:", + "VersionIncomparable4": "如需詳細資訊,請參閱「vcpkg 說明版本設定」或 {url}。", + "VersionIncomparableSchemeString": "兩個版本都有配置字串,但主要文字不同。", + "VersionIncomparableSchemes": "版本的配置不相容:", "VersionInvalidDate": "'{version}' 不是有效的日期版本。日期必須採用 YYYY-MM-DD 格式,而消歧異器必須是點分隔的正整數值,且不含前置字元零。", "VersionInvalidRelaxed": "'{version}' 不是有效的寬鬆版本 (具有任一數字元素計數的 Semver)。", "VersionInvalidSemver": "'{version}' 不是有效的語意版本,請參閱 。", "VersionMissing": "必須是版本設定欄位 (version、version-date、version-semver 或 version-string 其中一個)", - "VersionMissingRequiredFeature": "{spec}@{version} 沒有所需的功能 {feature}", + "VersionMissingRequiredFeature": "{version_spec} 沒有 {constraint_origin} 所需的必要功能 {feature}", "VersionNotFound": "{expected} 無法使用,只可使用 {actual}", - "VersionNotFoundDuringDiscovery": "在探索期間找不到版: {spec}@{version}\n這是內部 vcpkg 錯誤。請在 https://github.com/Microsoft/vcpkg 上提出問題,並提供詳細步驟以重現問題。", - "VersionNotFoundInVersionsFile": "在版本檔案中找不到版本 {version}。\n執行:\nvcpkg x-add-version {package_name}\n以新增新連接埠版本。", + "VersionNotFoundInVersionsFile": "在 {package_name} 版本檔案中找不到版本 {version}。\n執行:\nvcpkg x-add-version {package_name}\n以新增新連接埠版本。", "VersionRejectedDueToBaselineMissing": "已拒絕 {path},因為它使用 \"{json_field}\" ,而且沒有 \"builtin-baseline\"。若要修正此問題,請移除 \"{json_field}\" 或新增 \"builtin-baseline\"。\n如需詳細資訊,請參閱 'vcpkg help versioning'。", "VersionRejectedDueToFeatureFlagOff": "已拒絕 {path},因為它使用 \"{json_field}\" 且 'versions' 功能旗標已停用。若要修正此問題,請移除 \"{json_field}\" 或啟用 `versions` 功能旗標。\n如需詳細資訊,請參閱 'vcpkg help versioning'。", "VersionSchemeMismatch": "版本資料庫宣告 {version} 為 {expected},但 {path} 將其宣告為 {actual}。版本必須是唯一的,即使宣告為不同的配置也一樣。\n執行:\nvcpkg x-add-version {package_name} --overwrite-version\n以使用連接埠中宣告的配置覆寫版本資料庫中宣告的配置。", @@ -1013,7 +1144,7 @@ "VersionSharpMustBeFollowedByPortVersionNonNegativeInteger": "版本文字中的 '#' 後面必須接連接埠版本 (非負整數)", "VersionSpecMismatch": "無法載入連接埠,因為版本不一致。檔案 \"{path}\" 包含版本{actual_version},但版本資料庫指出應該為版本 {expected_version}。", "VersionTableHeader": "版本", - "VersionVerifiedOK": "OK: {package_name}@{version} -> {commit_sha}", + "VersionVerifiedOK": "確定: {version_spec} -> {commit_sha}", "WaitingForChildrenToExit": "正在等待子行程離開...", "WaitingToTakeFilesystemLock": "正在等候 {path} 上的檔案系統鎖定...", "WarnOnParseConfig": "在設定 {path} 中發現下列警告:", @@ -1030,10 +1161,8 @@ "WhileValidatingVersion": "驗證版本時: {version}", "WindowsOnlyCommand": "這個命令只支援 Windows。", "WroteNuGetPkgConfInfo": "已將 NuGet 套件設定資訊寫入 {path}。", - "UnrecognizedCommand$": "無法辨識的命令 '${p0}'", - "Use$ToGetHelp": "使用 ${p0} 來取得說明", - "FatalTheRootFolder$CanNotBeCreated": "嚴重: 無法建立根資料夾 '${p0}'", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "嚴重: 無法建立全域設定檔 '${p0}'", + "FatalTheRootFolder$CannotBeCreated": "嚴重: 無法建立根資料夾 '${p0}'", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "嚴重: 無法建立全域組態檔 '${p0}'", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND 未設定", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "在內部執行 vcpkg 傳回非零的結束代碼: ${p0}", "failedToDownloadFrom$": "無法從 ${p0} 下載", @@ -1053,7 +1182,6 @@ "descriptionShouldBeOfTypestringFound$": "description 的類型應為 'string',找到 '${p0}'", "optionsShouldBeASequenceFound$": "options 應為序列,找到 '${p0}'", "DuplicateKeysDetectedInManifest$": "在資訊清單中偵測到重複的金鑰: '${p0}'", - "in$Skipping$BecauseItIsA$": "在 ${p0} 中略過 ${p1},因為它是 ${p2}", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "沒有 postscript 檔案: 使用 vcpkg 殼層函數重新執行,而不使用可執行檔", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "啟用期間定義了重複項 ${p0}。新值將取代舊值。", "DuplicateToolDeclared$DuringActivationNewValueWillReplaceOld": "啟用期間宣告了重複的工具 ${p0}。新值將取代舊值。", @@ -1080,20 +1208,15 @@ "progressUnknown": "(進度未知)", "verifying": "驗證", "downloading$$": "下載 ${p0} -> ${p1}", - "unpacking": "解壓縮", "unpacking$": "解壓縮 ${p0}", "Installing$": "正在安裝 ${p0}...", "$AlreadyInstalled": "${p0} 已安裝。", "Downloading$": "正在下載 ${p0}...", "Unpacking$": "正在解壓縮 ${p0}...", "ErrorInstalling$$": "安裝 ${p0} 時發生錯誤 - ${p1}", - "ExpectedASingleValueFor$FoundMultiple": "預期是 ${p0} 的單一值 - 但找到多個", - "Synopsis": "概要", - "Description": "描述", - "Switches": "參數", - "SeeAlso": "另請參閱", "error": "錯誤:", "warning": "警告:", + "ExpectedASingleValueFor$FoundMultiple": "預期是 ${p0} 的單一值 - 但找到多個", "ExpectedASingleValueFor$": "預期是 '--${p0}' 的單一值。", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "假設 '${p0}' 正確; 請在成品中繼資料中提供雜湊以隱藏此訊息。", "DownloadedFile$DidNotHaveTheCorrectHash$$": "下載的檔案 '${p0}' 沒有正確的雜湊 (${p1}: ${p2}) ", @@ -1141,87 +1264,34 @@ "FoundAMismatched$In$ForALiteral$Use$$Instead": "在 '${p1}' 中發現不相符的 ${p0}。若為常值 ${p2},請改用 ${p3}${p4}。", "CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead": "在 '${p1}' 中找不到 {${p0}} 的值。若要寫入常值,請改用 '{{${p2}}}'。", "MatchedMoreThanOneInstallBlock$": "符合多個安裝區塊 [${p0}]", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "取得專案參考的所有內容,而不啟用", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "這可讓取用者預先下載專案所需的工具。", "UnableToFindProjectInFolderorParentFoldersFor$": "在 ${p0} 的資料夾 (或父資料夾) 中找不到專案", "UnableToAcquireProject": "無法取得專案", - "AcquireArtifactsInTheRegistry": "取得登錄中的成品", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "這可讓取用者取得 (下載和解壓縮) 成品。必須啟動成品才能使用", "NoArtifactsSpecified": "未指定成品", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "已指定多個套件,但不等於 ${p0} 參數的數目", "NoArtifactsAreAcquired": "未取得任何成品", "AllArtifactsAreAlreadyInstalled": "已安裝所有成品", "$ArtifactsInstalledSuccessfully": "已成功安裝 ${p0} 個成品", "InstallationFailedStopping": "安裝失敗 -- 正在停止", - "ActivatesTheToolsRequiredForAProject": "啟用專案所需的工具", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "這可讓消費者啟用專案所需的工具。如果尚未安裝工具,這會強制使用者在啟用前先下載並安裝工具。", - "AddsAnArtifactToTheProject": "將成品新增至專案", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "這可讓取用者將成品新增至專案。這也會啟動專案。", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "已指定多個成品,但不等於 ${p0} 參數的數目", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "已嘗試新增成品 [${p0}]:${p1},但無法判斷要使用的登錄。", "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "已嘗試將登錄 ${p0} 新增為 ${p1},但它已為 ${p2}。請手動將 ${p3} 新增至此專案,然後重新嘗試。", "RunvcpkgActivateToApplyToTheCurrentTerminal": "執行 \\'vcpkg activate\\' 以套用至目前的終端", - "ManagesTheDownloadCache": "管理下載快取", "DownloadsFolderCleared$": "已清除下載資料夾 (${p0}) ", - "cleansOutEverythingcacheInstalledArtifacts": "清除所有項目 (快取、已安裝的成品)", - "cleansOutTheDownloadsCache": "清除下載快取", - "removesAllTheArtifactsThatAreInstalled": "移除安裝的所有成品", - "cleansUp": "清除", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "允許使用者清除快取、已安裝的成品等。", "InstalledArtifactFolderCleared$": "已清除已安裝的成品資料夾 (${p0}) ", "CacheFolderCleared$": "已清除快取資料夾 (${p0}) ", - "DeactivatesTheCurrentSession": "停用目前的工作階段", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "這可讓取用者移除目前使用中工作階段的環境設定。", - "DeletesAnArtifactFromTheArtifactFolder": "從成品資料夾刪除成品", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "這可讓取用者從磁碟移除成品。", "DeletingArtifact$From$": "正在從 ${p1} 刪除成品 ${p0}", - "FindArtifactsInTheRegistry": "取得登錄中的成品", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "這可讓使用者根據某些準則尋找成品。", "NoArtifactsFoundMatchingCriteria$": "找不到符合條件的成品: ${p0}", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "為啟用產生 MSBuild 屬性,而不下載專案的任何內容", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props 需要 --msbuild-props", "UnableToActivateProject": "無法啟動專案", - "theNameOfTheCommandForWhichYouWantHelp": "您要取得說明的命令名稱", - "getHelpOn$OrOneOfTheCommands": "取得 ${p0} 或其中一個命令的說明", - "GetsDetailedHelpOn$OrOneOfTheCommands": "取得 ${p0} 或其中一個命令的詳說明", - "Arguments": "引數:", - "Use$ToGetTheListOfAvailableCommands": "使用 ${p0} 來取得可用命令的清單", - "Usage": "使用方式", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "Available$Commands": "可用的 ${p0} 命令:", - "ListsTheArtifacts": "列出成品", - "ThisAllowsTheConsumerToListArtifacts": "這可讓取用者列出成品。", - "regenerateTheIndexForARegistry": "重新產生登錄的索引", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "這可讓使用者重新產生 ${p1} 登錄的 ${p0} 檔案。", "RegeneratingIndexFor$": "正在重新產生 ${p0} 的索引", "RegenerationCompleteIndexContains$MetadataFiles": "重新產生完成。索引包含 ${p0} 個中繼資料檔案", "Registry$ContainsNoArtifacts": "登錄: '${p0}' 未包含任何成品。", "error$": "錯誤 ${p0}: ", - "RemovesAnArtifactFromAProject": "從專案移除成品", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "這可讓取用者從專案移除成品。在此視窗中強制重新啟動。", "Removing$FromProjectManifest": "正在從專案資訊清單移除 ${p0}", "unableToFindArtifact$InTheProjectManifest": "在專案資訊清單中找不到成品 ${p0}", - "updateTheRegistryFromTheRemote": "從遠端更新登錄", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "這會從遠端服務下載登錄的最新內容。", - "DownloadingRegistryData": "正在下載登錄資料", - "Updated$RegistryContains$MetadataFiles": "已更新 ${p0}。登錄包含 ${p1} 中繼資料檔案", - "UnableToDownloadRegistrySnapshot": "無法下載登錄快照集", - "UnableToFindRegistry$": "找不到登錄 ${p0}", - "ArtifactRegistryDataIsNotLoaded": "未載入成品登錄資料", - "AttemptingToUpdateArtifactRegistry": "正在嘗試更新成品登錄", - "UnableToLoadRegistryIndex": "無法載入登錄索引", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "立即啟用專案外的成品", - "ThisWillInstantlyActivateAnArtifact": "這會快速啟動成品。", + "Updated$ItContains$MetadataFiles": "已更新 ${p0}。它包含 ${p1} 個中繼資料檔案。", + "UnableToDownload$": "無法下載 ${p0}。", + "$CouldNotBeUpdatedItCouldBeMalformed": "無法更新 ${p0}; 可能格式不正確。", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "x-update-registry 命令會下載新的登錄資訊,因此無法與本機登錄一起使用。您指的是 x-regenerate ${p0} 嗎?", + "UnableToFindRegistry$": "找不到登錄 ${p0}。", "NoArtifactsAreBeingAcquired": "未取得任何成品", - "removesAllFilesInTheLocalCache": "移除本機快取中的所有檔案", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "啟用偵錯模式,顯示關於 ${p0} 運作方式的內部訊息", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "繼續進行 (具潛在危險的) 動作,但不進行確認", - "showsTheinstalledArtifacts": "顯示 _installed_ 成品", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "使用使用者提供的路徑,將環境變數及其他屬性傾印至 JSON 檔案。", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "將寫入 MSBuild 屬性之檔案的完整路徑。", - "ApplyAnyDeprecationFixups": "套用任何取代修正。", - "overrideThePathToTheProjectFolder": "覆寫專案資料夾的路徑", - "UnableToFindProjectEnvironment$": "找不到專案環境 ${p0}", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "啟用詳細資訊模式,顯示關於該程序的詳細資訊訊息", - "aVersionOrVersionRangeToMatch": "要比對的版本或版本範圍" + "UnableToFindProjectEnvironment$": "找不到專案環境 ${p0}" } diff --git a/src/closes-stdin.c b/src/closes-stdin.c new file mode 100644 index 0000000000..9cddee048c --- /dev/null +++ b/src/closes-stdin.c @@ -0,0 +1,7 @@ +#if defined(_WIN32) +#include +int main() { CloseHandle(GetStdHandle(STD_INPUT_HANDLE)); } +#else +#include +int main(void) { close(STDIN_FILENO); } +#endif diff --git a/src/closes-stdout.c b/src/closes-stdout.c new file mode 100644 index 0000000000..6a32d09cee --- /dev/null +++ b/src/closes-stdout.c @@ -0,0 +1,18 @@ +#include +#if defined(_WIN32) +#include +#else // ^^^ _WIN32 // !_WIN32 +#include +#endif // ^^^ !_WIN32 + +int main(void) +{ + const char content[] = "hello world"; + fwrite(content, 1, sizeof(content) - 1, stdout); + fflush(stdout); +#if defined(_WIN32) + CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE)); +#else // ^^^ _WIN32 // !_WIN32 + close(STDOUT_FILENO); +#endif // ^^^ !_WIN32 +} diff --git a/src/localization/cs/messages.json.lcl b/src/localization/cs/messages.json.lcl index c93ece94a5..898082203b 100644 --- a/src/localization/cs/messages.json.lcl +++ b/src/localization/cs/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,25 +2185,43 @@ - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> + + --sha512= --url=https://...]]> + + + + + + + --skip-sha512 --url=https://...]]> + + --skip-sha512 --url=https://...]]> + + + + + + + - + - + - + ]]> - + ]]> - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [--nuget]5D; [--directory=out_dir]5D;]]> + + [--nuget]5D; [--directory=out_dir]5D;]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + - + - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,29 +5878,20 @@ - + - + - - - - - - - - - - + - + - + @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - .]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - =.]]> + =.]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7330,30 +8665,15 @@ - - - - - - - - - - - - - - - - - - - + - + - + + + + @@ -7456,15 +8776,6 @@ - - - - - - - - - @@ -7666,15 +8977,6 @@ - - - - - - - - - @@ -7693,6 +8995,15 @@ + + + + + + + + + @@ -7702,12 +9013,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7731,19 +9063,25 @@ - + + + + - + + + + @@ -7786,6 +9124,15 @@ + + + + + + + + + @@ -7797,19 +9144,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8014,30 +9385,48 @@ + + + + + + + + + - + + + + - + + + + - + + + + @@ -8215,6 +9604,15 @@ + + + + + + + + + @@ -8388,10 +9786,13 @@ - + - + + + + @@ -8508,10 +9909,13 @@ - + - + + + + @@ -8565,10 +9969,13 @@ - + - + + + + @@ -8638,15 +10045,6 @@ - - - - - - - - - @@ -8677,27 +10075,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8755,15 +10192,6 @@ - - - - - - - - - @@ -8848,311 +10276,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9265,6 +10576,15 @@ + + + + + + + + + @@ -9310,11 +10630,11 @@ - + - + - + @@ -9348,19 +10668,13 @@ - + - - - - - - - - - + + + @@ -9883,15 +11197,6 @@ - - - - - - - - - @@ -10090,9 +11395,9 @@ - + - + @@ -10117,12 +11422,15 @@ - + - + - + + + + @@ -10189,33 +11497,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10407,10 +11688,13 @@ - + - + + + + @@ -10426,6 +11710,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + + + @@ -10557,36 +11850,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -10629,10 +11952,13 @@ - + - + + + + @@ -10645,21 +11971,15 @@ - - - - - - - - - - + - + + + + @@ -10749,10 +12069,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10921,42 +12244,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10975,24 +12262,6 @@ - - - - - - - - - - - - - - - - - - @@ -11029,24 +12298,6 @@ - - - - - - - - - - - - - - - - - - @@ -11056,15 +12307,6 @@ - - - - - - - - - @@ -11146,15 +12388,6 @@ - - - - - - - - - @@ -11164,15 +12397,6 @@ - - - - - - - - - @@ -11182,33 +12406,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11227,15 +12424,6 @@ - - - - - - - - - @@ -11254,15 +12442,6 @@ - - - - - - - - - @@ -11272,15 +12451,6 @@ - - - - - - - - - @@ -11290,15 +12460,6 @@ - - - - - - - - - diff --git a/src/localization/de/messages.json.lcl b/src/localization/de/messages.json.lcl index 97c4199875..e372c40a7b 100644 --- a/src/localization/de/messages.json.lcl +++ b/src/localization/de/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + [--nuget]5D; [--directory=out_dir]5D;]]> + + [--nuget]5D; [--directory=out_dir]5D;]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + + + + + + + + + + ]]> - + an]]> - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + “ --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + + + + - + - + + + + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - .]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - ="-Einschränkung verwenden.]]> + =“-Einschränkung verwenden.]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7327,30 +8662,15 @@ - - - - - - - - - - - - - - - - - - - + - + - + + + + @@ -7453,15 +8773,6 @@ - - - - - - - - - @@ -7663,15 +8974,6 @@ - - - - - - - - - @@ -7690,6 +8992,15 @@ + + + + + + + + + @@ -7699,12 +9010,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7728,19 +9060,25 @@ - + - + + + + - + - + + + + @@ -7783,6 +9121,15 @@ + + + + + + + + + @@ -7794,19 +9141,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8011,30 +9382,48 @@ + + + + + + + + + - + + + + - + + + + - + + + + @@ -8212,6 +9601,15 @@ + + + + + + + + + @@ -8385,10 +9783,13 @@ - + - + + + + @@ -8505,10 +9906,13 @@ - + - + + + + @@ -8562,10 +9966,13 @@ - + + + + @@ -8635,15 +10042,6 @@ - - - - - - - - - @@ -8674,27 +10072,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8752,15 +10189,6 @@ - - - - - - - - - @@ -8845,311 +10273,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9262,6 +10573,15 @@ + + + + + + + + + @@ -9307,11 +10627,11 @@ - + - + - + @@ -9345,19 +10665,13 @@ - + - - - - - - - - - - + + + + @@ -9880,15 +11194,6 @@ - - - - - - - - - @@ -10087,11 +11392,11 @@ - + - + - + @@ -10114,12 +11419,15 @@ - + - + - + + + + @@ -10186,33 +11494,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10404,10 +11685,13 @@ - + - + + + + @@ -10423,6 +11707,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [Argumente]5D; @response_file]]> + + + + @@ -10554,36 +11847,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -10626,10 +11949,13 @@ - + - + + + + @@ -10642,21 +11968,15 @@ - - - - - - - - - - + - + + + + @@ -10746,10 +12066,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10918,42 +12241,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10972,24 +12259,6 @@ - - - - - - - - - - - - - - - - - - @@ -11026,24 +12295,6 @@ - - - - - - - - - - - - - - - - - - @@ -11053,15 +12304,6 @@ - - - - - - - - - @@ -11143,15 +12385,6 @@ - - - - - - - - - @@ -11161,15 +12394,6 @@ - - - - - - - - - @@ -11179,33 +12403,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11224,15 +12421,6 @@ - - - - - - - - - @@ -11251,15 +12439,6 @@ - - - - - - - - - @@ -11269,15 +12448,6 @@ - - - - - - - - - @@ -11287,15 +12457,6 @@ - - - - - - - - - diff --git a/src/localization/es/messages.json.lcl b/src/localization/es/messages.json.lcl index 2266ef8629..6a9e671909 100644 --- a/src/localization/es/messages.json.lcl +++ b/src/localization/es/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [--nuget]5D; [--directory=out_dir]5D;]]> + + [--nuget]5D; [--directory=out_dir]5D;]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + - + - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,29 +5878,20 @@ - - - - - - - - - - + - + - + - + - + - + @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - .]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - =".]]> + =".]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7322,35 +8657,20 @@ - - - - - - - - - - - - - - - - - - - + - + - + - + + + + @@ -7453,15 +8773,6 @@ - - - - - - - - - @@ -7663,15 +8974,6 @@ - - - - - - - - - @@ -7690,6 +8992,15 @@ + + + + + + + + + @@ -7699,12 +9010,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7728,19 +9060,25 @@ - + - + + + + - + - + + + + @@ -7783,6 +9121,15 @@ + + + + + + + + + @@ -7794,19 +9141,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8011,30 +9382,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8212,6 +9601,15 @@ + + + + + + + + + @@ -8385,10 +9783,13 @@ - + - + + + + @@ -8505,10 +9906,13 @@ - + - + + + + @@ -8562,10 +9966,13 @@ - + - + + + + @@ -8635,15 +10042,6 @@ - - - - - - - - - @@ -8674,27 +10072,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8752,15 +10189,6 @@ - - - - - - - - - @@ -8845,311 +10273,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9262,6 +10573,15 @@ + + + + + + + + + @@ -9307,11 +10627,11 @@ - + - + - + @@ -9345,19 +10665,13 @@ - - - - - - - - - - + - + + + + @@ -9880,15 +11194,6 @@ - - - - - - - - - @@ -10087,11 +11392,11 @@ - + - + - + @@ -10114,12 +11419,15 @@ - + - + - + + + + @@ -10186,33 +11494,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10404,10 +11685,13 @@ - + - + + + + @@ -10423,6 +11707,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @archivo_respuesta]]> + + + + @@ -10554,36 +11847,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + + + + + + + + + + + + + - + - + - + @@ -10626,10 +11949,13 @@ - + - + + + + @@ -10642,21 +11968,15 @@ - - - - - - - - - - + - + + + + @@ -10746,10 +12066,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10918,42 +12241,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10972,24 +12259,6 @@ - - - - - - - - - - - - - - - - - - @@ -11026,24 +12295,6 @@ - - - - - - - - - - - - - - - - - - @@ -11053,15 +12304,6 @@ - - - - - - - - - @@ -11143,15 +12385,6 @@ - - - - - - - - - @@ -11161,15 +12394,6 @@ - - - - - - - - - @@ -11179,33 +12403,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11224,15 +12421,6 @@ - - - - - - - - - @@ -11251,15 +12439,6 @@ - - - - - - - - - @@ -11269,15 +12448,6 @@ - - - - - - - - - @@ -11287,15 +12457,6 @@ - - - - - - - - - diff --git a/src/localization/fr/messages.json.lcl b/src/localization/fr/messages.json.lcl index 95b8859d34..0c9720f3df 100644 --- a/src/localization/fr/messages.json.lcl +++ b/src/localization/fr/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + + + --skip-sha512 --url=https://...]]> + + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [--nuget]5D; [--directory=out_dir]5D;]]> + + [--nuget]5D; [--directory=out_dir]5D;]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + ]]> - + ]]> - + - + SHA256]]> - + SHA256]]> - + - + - + - + - + ]]> - + ]]> - + - + ]]> - + aide]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - .]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - = ».]]> + =".]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7327,30 +8662,15 @@ - - - - - - - - - - - - - - - - - - - + - + - + + + + @@ -7453,15 +8773,6 @@ - - - - - - - - - @@ -7663,15 +8974,6 @@ - - - - - - - - - @@ -7690,6 +8992,15 @@ + + + + + + + + + @@ -7699,12 +9010,33 @@ + + + + + + + + + + + + + + + + + + - + + + + @@ -7728,19 +9060,25 @@ - + - + + + + - + - + + + + @@ -7783,6 +9121,15 @@ + + + + + + + + + @@ -7794,19 +9141,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8011,30 +9382,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8212,6 +9601,15 @@ + + + + + + + + + @@ -8385,10 +9783,13 @@ - + - + + + + @@ -8505,10 +9906,13 @@ - + - + + + + @@ -8562,10 +9966,13 @@ - + - + + + + @@ -8635,15 +10042,6 @@ - - - - - - - - - @@ -8674,27 +10072,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8752,15 +10189,6 @@ - - - - - - - - - @@ -8845,311 +10273,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9262,6 +10573,15 @@ + + + + + + + + + @@ -9307,11 +10627,11 @@ - + - + - + @@ -9345,19 +10665,13 @@ - - - - - - - - - - + - + + + + @@ -9880,15 +11194,6 @@ - - - - - - - - - @@ -10087,11 +11392,11 @@ - + - + - + @@ -10114,12 +11419,15 @@ - + - + - + + + + @@ -10186,33 +11494,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10404,10 +11685,13 @@ - + - + + + + @@ -10423,6 +11707,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + + + @@ -10554,36 +11847,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + + + + + + + + + + + + + - + - + - + @@ -10626,10 +11949,13 @@ - + - + + + + @@ -10642,21 +11968,15 @@ - - - - - - - - - - + - + + + + @@ -10746,10 +12066,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10918,42 +12241,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10972,24 +12259,6 @@ - - - - - - - - - - - - - - - - - - @@ -11026,24 +12295,6 @@ - - - - - - - - - - - - - - - - - - @@ -11053,15 +12304,6 @@ - - - - - - - - - @@ -11143,15 +12385,6 @@ - - - - - - - - - @@ -11161,15 +12394,6 @@ - - - - - - - - - @@ -11179,33 +12403,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11224,15 +12421,6 @@ - - - - - - - - - @@ -11251,15 +12439,6 @@ - - - - - - - - - @@ -11269,15 +12448,6 @@ - - - - - - - - - @@ -11287,15 +12457,6 @@ - - - - - - - - - diff --git a/src/localization/it/messages.json.lcl b/src/localization/it/messages.json.lcl index f1cd0541b3..1e6bd4907f 100644 --- a/src/localization/it/messages.json.lcl +++ b/src/localization/it/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + + + + - + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + < percorso origine>]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + [--nuget]5D; [--directory=out_dir]5D;]]> - + [--nuget]5D; [--directory=out_dir]5D;]]> - + - + - + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - .]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> =".]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7330,30 +8665,15 @@ - - - - - - - - - - - - - - - - - - - + - + + + + @@ -7456,15 +8776,6 @@ - - - - - - - - - @@ -7666,15 +8977,6 @@ - - - - - - - - - @@ -7693,6 +8995,15 @@ + + + + + + + + + @@ -7702,12 +9013,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7731,19 +9063,25 @@ - + + + + - + + + + @@ -7786,6 +9124,15 @@ + + + + + + + + + @@ -7797,19 +9144,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8014,30 +9385,48 @@ + + + + + + + + + - + + + + - + + + + - + + + + @@ -8215,6 +9604,15 @@ + + + + + + + + + @@ -8388,10 +9786,13 @@ - + - + + + + @@ -8508,10 +9909,13 @@ - + - + + + + @@ -8565,10 +9969,13 @@ - + - + + + + @@ -8638,15 +10045,6 @@ - - - - - - - - - @@ -8677,27 +10075,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8755,15 +10192,6 @@ - - - - - - - - - @@ -8848,311 +10276,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9265,6 +10576,15 @@ + + + + + + + + + @@ -9310,11 +10630,11 @@ - + - + - + @@ -9348,19 +10668,13 @@ - + - - - - - - - - - - + + + + @@ -9883,15 +11197,6 @@ - - - - - - - - - @@ -10090,11 +11395,11 @@ - + - + - + @@ -10117,12 +11422,15 @@ - + - + - + + + + @@ -10189,33 +11497,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10407,10 +11688,13 @@ - + - + + + + @@ -10426,6 +11710,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + + + @@ -10557,36 +11850,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -10629,10 +11952,13 @@ - + - + + + + @@ -10645,21 +11971,15 @@ - - - - - - - - - - + - + + + + @@ -10749,10 +12069,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10921,42 +12244,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10975,24 +12262,6 @@ - - - - - - - - - - - - - - - - - - @@ -11029,24 +12298,6 @@ - - - - - - - - - - - - - - - - - - @@ -11056,15 +12307,6 @@ - - - - - - - - - @@ -11146,15 +12388,6 @@ - - - - - - - - - @@ -11164,15 +12397,6 @@ - - - - - - - - - @@ -11182,33 +12406,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11227,15 +12424,6 @@ - - - - - - - - - @@ -11254,15 +12442,6 @@ - - - - - - - - - @@ -11272,15 +12451,6 @@ - - - - - - - - - @@ -11290,15 +12460,6 @@ - - - - - - - - - diff --git a/src/localization/ja/messages.json.lcl b/src/localization/ja/messages.json.lcl index c57b1d6052..91c6c0f4de 100644 --- a/src/localization/ja/messages.json.lcl +++ b/src/localization/ja/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> - + - + + + + - + - + + + + - + + + + - + - + - + - + - + [--nuget]5D; [--directory=out_dir]5D;]]> - + [--nuget]5D; [--directory=out_dir]5D;]]> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + + + + + + + + + + ]]> + + のヘルプの詳細を表示します]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,9 +5074,9 @@ - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,29 +5878,20 @@ - - - - - - - - - - + - + - + - + - + - + @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - 内のレジストリを初期化します。]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - =" 制約を使用できます。]]> + =" 制約を使用できます。]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7330,30 +8665,15 @@ - - - - - - - - - - - - - - - - - - - + - + - + + + + @@ -7456,15 +8776,6 @@ - - - - - - - - - @@ -7666,15 +8977,6 @@ - - - - - - - - - @@ -7693,6 +8995,15 @@ + + + + + + + + + @@ -7702,12 +9013,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7731,19 +9063,25 @@ - + - + + + + - + - + + + + @@ -7786,6 +9124,15 @@ + + + + + + + + + @@ -7797,19 +9144,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8014,30 +9385,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8215,6 +9604,15 @@ + + + + + + + + + @@ -8388,10 +9786,13 @@ - + - + + + + @@ -8508,10 +9909,13 @@ - + - + + + + @@ -8565,10 +9969,13 @@ - + - + + + + @@ -8638,15 +10045,6 @@ - - - - - - - - - @@ -8677,27 +10075,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8755,15 +10192,6 @@ - - - - - - - - - @@ -8848,311 +10276,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9265,6 +10576,15 @@ + + + + + + + + + @@ -9310,11 +10630,11 @@ - + - + - + @@ -9348,19 +10668,13 @@ - + - - - - - - - - - - + + + + @@ -9883,15 +11197,6 @@ - - - - - - - - - @@ -10090,11 +11395,11 @@ - + - + - + @@ -10117,12 +11422,15 @@ - + - + - + + + + @@ -10189,33 +11497,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10407,10 +11688,13 @@ - + - + + + + @@ -10426,6 +11710,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + + + @@ -10557,36 +11850,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -10629,10 +11952,13 @@ - + - + + + + @@ -10645,21 +11971,15 @@ - - - - - - - - - - + - + + + + @@ -10749,10 +12069,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10921,42 +12244,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10975,24 +12262,6 @@ - - - - - - - - - - - - - - - - - - @@ -11029,24 +12298,6 @@ - - - - - - - - - - - - - - - - - - @@ -11056,15 +12307,6 @@ - - - - - - - - - @@ -11146,15 +12388,6 @@ - - - - - - - - - @@ -11164,15 +12397,6 @@ - - - - - - - - - @@ -11182,33 +12406,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11227,15 +12424,6 @@ - - - - - - - - - @@ -11254,15 +12442,6 @@ - - - - - - - - - @@ -11272,15 +12451,6 @@ - - - - - - - - - @@ -11290,15 +12460,6 @@ - - - - - - - - - diff --git a/src/localization/ko/messages.json.lcl b/src/localization/ko/messages.json.lcl index a91650f30b..618a66b71c 100644 --- a/src/localization/ko/messages.json.lcl +++ b/src/localization/ko/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1509,1122 +1773,2124 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + <원본 경로>]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + <다운로드된 파일이름>]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + --url=https://...]]> - + --url=https://...]]> - + - + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + [--nuget]5D; [--directory=out_dir]5D;]]> - + [--nuget]5D; [--directory=out_dir]5D;]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - - - - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + + + + - + - + ]]> - + ]]> - + - + SHA256]]> - + SHA256]]> - + - + - + - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + <포트 이름>...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + <대상>]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + <패키지 이름>...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + <출력 디렉터리>]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,11 +4306,29 @@ - + + + + + + + + + + + + + + + + + + + - + - + @@ -3065,79 +4337,106 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,9 +5074,9 @@ - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + + + + - + + + + - + + + + - + - + + + + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - 의 레지스트리를 초기화합니다.]]> - - - - - + + + + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + + + + - + + + + - - - - - - - - - - + - + - + + + + - + + + + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + + + + - + + + + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - =" 제약 조건을 사용할 수 있습니다.]]> + =" 제약 조건을 사용할 수 있습니다.]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7322,35 +8657,20 @@ - - - - - - - - - - - - - - - - - - - + - + - + - + + + + @@ -7453,15 +8773,6 @@ - - - - - - - - - @@ -7663,15 +8974,6 @@ - - - - - - - - - @@ -7690,6 +8992,15 @@ + + + + + + + + + @@ -7699,12 +9010,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7728,19 +9060,25 @@ - + - + + + + - + - + + + + @@ -7783,6 +9121,15 @@ + + + + + + + + + @@ -7794,19 +9141,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8011,30 +9382,48 @@ + + + + + + + + + - + + + + - + + + + - + + + + @@ -8212,6 +9601,15 @@ + + + + + + + + + @@ -8385,10 +9783,13 @@ - + - + + + + @@ -8505,10 +9906,13 @@ - + - + + + + @@ -8562,10 +9966,13 @@ - + - + + + + @@ -8635,15 +10042,6 @@ - - - - - - - - - @@ -8674,27 +10072,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8752,15 +10189,6 @@ - - - - - - - - - @@ -8845,311 +10273,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9262,6 +10573,15 @@ + + + + + + + + + @@ -9307,11 +10627,11 @@ - + - + - + @@ -9345,19 +10665,13 @@ - + - - - - - - - - - - + + + + @@ -9880,15 +11194,6 @@ - - - - - - - - - @@ -10087,11 +11392,11 @@ - + - + - + @@ -10114,12 +11419,15 @@ - + - + - + + + + @@ -10186,33 +11494,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10404,10 +11685,13 @@ - + - + + + + @@ -10423,6 +11707,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + + + @@ -10554,36 +11847,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -10626,10 +11949,13 @@ - + - + + + + @@ -10642,21 +11968,15 @@ - - - - - - - - - - + - + + + + @@ -10746,10 +12066,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10918,42 +12241,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10972,24 +12259,6 @@ - - - - - - - - - - - - - - - - - - @@ -11026,24 +12295,6 @@ - - - - - - - - - - - - - - - - - - @@ -11053,15 +12304,6 @@ - - - - - - - - - @@ -11143,15 +12385,6 @@ - - - - - - - - - @@ -11161,15 +12394,6 @@ - - - - - - - - - @@ -11179,33 +12403,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11224,15 +12421,6 @@ - - - - - - - - - @@ -11251,15 +12439,6 @@ - - - - - - - - - @@ -11269,15 +12448,6 @@ - - - - - - - - - @@ -11287,15 +12457,6 @@ - - - - - - - - - diff --git a/src/localization/pl/messages.json.lcl b/src/localization/pl/messages.json.lcl index 8422d486a1..75084a82f1 100644 --- a/src/localization/pl/messages.json.lcl +++ b/src/localization/pl/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + + + + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + [--nuget]5D; [--directory=out_dir]5D;]]> - + [--nuget]5D; [--directory=out_dir]5D;]]> - + - + - + + + + - + - + - + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + ” --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - .]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - =”.]]> + =”.]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7322,35 +8657,20 @@ - - - - - - - - - - - - - - - - - - - + - + - + - + + + + @@ -7453,15 +8773,6 @@ - - - - - - - - - @@ -7663,15 +8974,6 @@ - - - - - - - - - @@ -7690,6 +8992,15 @@ + + + + + + + + + @@ -7699,12 +9010,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7728,19 +9060,25 @@ - + - + + + + - + - + + + + @@ -7783,6 +9121,15 @@ + + + + + + + + + @@ -7794,19 +9141,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8011,30 +9382,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8212,6 +9601,15 @@ + + + + + + + + + @@ -8385,10 +9783,13 @@ - + - + + + + @@ -8505,10 +9906,13 @@ - + - + + + + @@ -8562,10 +9966,13 @@ - + - + + + + @@ -8635,15 +10042,6 @@ - - - - - - - - - @@ -8674,27 +10072,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8752,15 +10189,6 @@ - - - - - - - - - @@ -8845,311 +10273,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9262,6 +10573,15 @@ + + + + + + + + + @@ -9307,11 +10627,11 @@ - + - + - + @@ -9345,19 +10665,13 @@ - + - - - - - - - - - + + + @@ -9880,15 +11194,6 @@ - - - - - - - - - @@ -10087,11 +11392,11 @@ - + - + - + @@ -10114,12 +11419,15 @@ - + - + - + + + + @@ -10186,33 +11494,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10404,10 +11685,13 @@ - + - + + + + @@ -10423,6 +11707,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + + + @@ -10554,36 +11847,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -10626,10 +11949,13 @@ - + - + + + + @@ -10642,21 +11968,15 @@ - - - - - - - - - - + - + + + + @@ -10746,10 +12066,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10918,42 +12241,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10972,24 +12259,6 @@ - - - - - - - - - - - - - - - - - - @@ -11026,24 +12295,6 @@ - - - - - - - - - - - - - - - - - - @@ -11053,15 +12304,6 @@ - - - - - - - - - @@ -11143,15 +12385,6 @@ - - - - - - - - - @@ -11161,15 +12394,6 @@ - - - - - - - - - @@ -11179,33 +12403,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11224,15 +12421,6 @@ - - - - - - - - - @@ -11251,15 +12439,6 @@ - - - - - - - - - @@ -11269,15 +12448,6 @@ - - - - - - - - - @@ -11287,15 +12457,6 @@ - - - - - - - - - diff --git a/src/localization/pt-BR/messages.json.lcl b/src/localization/pt-BR/messages.json.lcl index 09d8757355..2f9dabf4f2 100644 --- a/src/localization/pt-BR/messages.json.lcl +++ b/src/localization/pt-BR/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,1481 +1159,2738 @@ - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + - + - + + + + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + --url=https://...]]> - + --url=https://...]]> - + - + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + [--nuget]5D; [--directory=out_dir]5D;]]> - + [--nuget]5D; [--directory=out_dir]5D;]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - - - - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + + + + - + - + ]]> - + ]]> - + - + SHA256]]> - + SHA256]]> - + - + - + - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,29 +5878,20 @@ - - - - - - - - - - + - + - + - + - + - + @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - .]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - =".]]> + =".]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7327,30 +8662,15 @@ - - - - - - - - - - + - - - - - - - - - + + + @@ -7453,15 +8773,6 @@ - - - - - - - - - @@ -7663,15 +8974,6 @@ - - - - - - - - - @@ -7690,6 +8992,15 @@ + + + + + + + + + @@ -7699,12 +9010,33 @@ + + + + + + + + + + + + + + + + + + - + + + + @@ -7728,19 +9060,25 @@ - + - + + + + - + - + + + + @@ -7783,6 +9121,15 @@ + + + + + + + + + @@ -7794,19 +9141,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8011,30 +9382,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8212,6 +9601,15 @@ + + + + + + + + + @@ -8385,10 +9783,13 @@ - + - + + + + @@ -8505,10 +9906,13 @@ - + - + + + + @@ -8562,10 +9966,13 @@ - + - + + + + @@ -8635,15 +10042,6 @@ - - - - - - - - - @@ -8674,27 +10072,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8752,15 +10189,6 @@ - - - - - - - - - @@ -8845,311 +10273,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9262,6 +10573,15 @@ + + + + + + + + + @@ -9307,11 +10627,11 @@ - + - + - + @@ -9345,19 +10665,13 @@ - - - - - - - - - - + - + + + + @@ -9880,15 +11194,6 @@ - - - - - - - - - @@ -10087,11 +11392,11 @@ - + - + - + @@ -10114,12 +11419,15 @@ - + - + - + + + + @@ -10186,33 +11494,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10404,10 +11685,13 @@ - + - + + + + @@ -10423,6 +11707,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [argumentos]5D; @response_file]]> + + + + @@ -10554,36 +11847,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -10626,10 +11949,13 @@ - + - + + + + @@ -10642,21 +11968,15 @@ - - - - - - - - - - + - + + + + @@ -10746,10 +12066,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10918,42 +12241,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10972,24 +12259,6 @@ - - - - - - - - - - - - - - - - - - @@ -11026,24 +12295,6 @@ - - - - - - - - - - - - - - - - - - @@ -11053,15 +12304,6 @@ - - - - - - - - - @@ -11143,15 +12385,6 @@ - - - - - - - - - @@ -11161,15 +12394,6 @@ - - - - - - - - - @@ -11179,33 +12403,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11224,15 +12421,6 @@ - - - - - - - - - @@ -11251,15 +12439,6 @@ - - - - - - - - - @@ -11269,15 +12448,6 @@ - - - - - - - - - @@ -11287,15 +12457,6 @@ - - - - - - - - - diff --git a/src/localization/ru/messages.json.lcl b/src/localization/ru/messages.json.lcl index 6b7166d264..3d3c8c3d70 100644 --- a/src/localization/ru/messages.json.lcl +++ b/src/localization/ru/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + + + --skip-sha512 --url=https://...]]> + + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [--nuget]5D; [--directory=out_dir]5D;]]> + + [--nuget]5D; [--directory=out_dir]5D;]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + ]]> - + ]]> - + - + SHA256]]> - + SHA256]]> - + - + - + - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + <в>]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + <имя пакета>...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + <выходной каталог>]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - .]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> =".]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + + + + + + + + + + + + + - + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7330,30 +8665,15 @@ - - - - - - - - - - - - - - - - - - - + - + - + + + + @@ -7456,15 +8776,6 @@ - - - - - - - - - @@ -7666,15 +8977,6 @@ - - - - - - - - - @@ -7693,6 +8995,15 @@ + + + + + + + + + @@ -7702,12 +9013,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7731,19 +9063,25 @@ - + - + + + + - + - + + + + @@ -7786,6 +9124,15 @@ + + + + + + + + + @@ -7797,19 +9144,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8014,30 +9385,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8215,6 +9604,15 @@ + + + + + + + + + @@ -8388,10 +9786,13 @@ - + - + + + + @@ -8508,10 +9909,13 @@ - + - + + + + @@ -8565,10 +9969,13 @@ - + - + + + + @@ -8638,15 +10045,6 @@ - - - - - - - - - @@ -8677,27 +10075,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8755,15 +10192,6 @@ - - - - - - - - - @@ -8848,311 +10276,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9265,6 +10576,15 @@ + + + + + + + + + @@ -9310,11 +10630,11 @@ - + - + - + @@ -9348,19 +10668,13 @@ - + - - - - - - - - - - + + + + @@ -9883,15 +11197,6 @@ - - - - - - - - - @@ -10090,11 +11395,11 @@ - + - + - + @@ -10117,12 +11422,15 @@ - + - + - + + + + @@ -10189,33 +11497,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10407,10 +11688,13 @@ - + - + + + + @@ -10426,6 +11710,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--переключатели]5D; [--параметры=значения]5D; [аргументы]5D; @файл_ответа]]> + + + + @@ -10557,36 +11850,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -10629,10 +11952,13 @@ - + - + + + + @@ -10645,21 +11971,15 @@ - - - - - - - - - - + - + + + + @@ -10749,10 +12069,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10921,42 +12244,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10975,24 +12262,6 @@ - - - - - - - - - - - - - - - - - - @@ -11029,24 +12298,6 @@ - - - - - - - - - - - - - - - - - - @@ -11056,15 +12307,6 @@ - - - - - - - - - @@ -11146,15 +12388,6 @@ - - - - - - - - - @@ -11164,15 +12397,6 @@ - - - - - - - - - @@ -11182,33 +12406,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11227,15 +12424,6 @@ - - - - - - - - - @@ -11254,15 +12442,6 @@ - - - - - - - - - @@ -11272,15 +12451,6 @@ - - - - - - - - - @@ -11290,15 +12460,6 @@ - - - - - - - - - diff --git a/src/localization/tr/messages.json.lcl b/src/localization/tr/messages.json.lcl index 893bfa713e..42bcbeb2a3 100644 --- a/src/localization/tr/messages.json.lcl +++ b/src/localization/tr/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + [--nuget]5D; [--directory=out_dir]5D;]]> + + [--nuget]5D; [--directory=out_dir]5D;]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + + + + + + + + + + ]]> - + komutuyla ilgili yardım ayrıntısını görüntüler]]> - + - + ]]> - + ]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + <çıkış dizini>]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - dizininde bir kayıt defteri başlatır.]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - =" kısıtlaması kullanabilirsiniz.]]> + =" kısıtlaması kullanabilirsiniz.]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7330,30 +8665,15 @@ - - - - - - - - - - - - - - - - - - - + - + - + + + + @@ -7456,15 +8776,6 @@ - - - - - - - - - @@ -7666,15 +8977,6 @@ - - - - - - - - - @@ -7693,6 +8995,15 @@ + + + + + + + + + @@ -7702,12 +9013,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7731,19 +9063,25 @@ - + + + + - + + + + @@ -7786,6 +9124,15 @@ + + + + + + + + + @@ -7797,19 +9144,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8014,30 +9385,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8215,6 +9604,15 @@ + + + + + + + + + @@ -8388,10 +9786,13 @@ - + - + + + + @@ -8508,10 +9909,13 @@ - + - + + + + @@ -8565,10 +9969,13 @@ - + - + + + + @@ -8638,15 +10045,6 @@ - - - - - - - - - @@ -8677,27 +10075,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8755,15 +10192,6 @@ - - - - - - - - - @@ -8848,39 +10276,27 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - + - + + + + @@ -8895,264 +10311,159 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9265,6 +10576,15 @@ + + + + + + + + + @@ -9310,11 +10630,11 @@ - + - + - + @@ -9348,19 +10668,13 @@ - - - - - - - - - - + - + + + + @@ -9883,15 +11197,6 @@ - - - - - - - - - @@ -10090,11 +11395,11 @@ - + - + - + @@ -10117,12 +11422,15 @@ - + - + - + + + + @@ -10189,33 +11497,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10407,10 +11688,13 @@ - + - + + + + @@ -10426,6 +11710,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [bağımsız değişkenler]5D; @response_file]]> + + + + @@ -10557,36 +11850,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -10629,10 +11952,13 @@ - + - + + + + @@ -10645,21 +11971,15 @@ - - - - - - - - - - + - + + + + @@ -10749,10 +12069,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10921,42 +12244,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10975,24 +12262,6 @@ - - - - - - - - - - - - - - - - - - @@ -11029,24 +12298,6 @@ - - - - - - - - - - - - - - - - - - @@ -11056,15 +12307,6 @@ - - - - - - - - - @@ -11146,15 +12388,6 @@ - - - - - - - - - @@ -11164,15 +12397,6 @@ - - - - - - - - - @@ -11182,33 +12406,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11227,15 +12424,6 @@ - - - - - - - - - @@ -11254,15 +12442,6 @@ - - - - - - - - - @@ -11272,15 +12451,6 @@ - - - - - - - - - @@ -11290,15 +12460,6 @@ - - - - - - - - - diff --git a/src/localization/zh-Hans/messages.json.lcl b/src/localization/zh-Hans/messages.json.lcl index 2d369d8333..8d8b660e46 100644 --- a/src/localization/zh-Hans/messages.json.lcl +++ b/src/localization/zh-Hans/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + + + + - + + + + + + + + + + + + + - + + + + - + - + + + + - + + + + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,25 +2185,43 @@ - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + - + - + - + + + + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + --url=https://...]]> - + --url=https://...]]> - + - + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + + + + + + + + + + + + + + + + - + - + - + + + + - + - + - + - + + + [--nuget]5D; [--directory=out_dir]5D;]]> + + [--nuget]5D; [--directory=out_dir]5D;]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + + + + + + + + + + ]]> + + 的帮助详细信息]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + - + ...]]> - + ...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,11 +5074,11 @@ - + - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - 中的注册表。]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + + + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> - =” 约束。]]> + =”约束。]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7330,30 +8665,15 @@ - - - - - - - - - - - - - - - - - - - + - + - + + + + @@ -7456,15 +8776,6 @@ - - - - - - - - - @@ -7666,15 +8977,6 @@ - - - - - - - - - @@ -7693,6 +8995,15 @@ + + + + + + + + + @@ -7702,12 +9013,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7731,19 +9063,25 @@ - + + + + - + + + + @@ -7786,6 +9124,15 @@ + + + + + + + + + @@ -7797,19 +9144,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8014,30 +9385,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8215,6 +9604,15 @@ + + + + + + + + + @@ -8388,10 +9786,13 @@ - + - + + + + @@ -8508,10 +9909,13 @@ - + - + + + + @@ -8565,10 +9969,13 @@ - + - + + + + @@ -8638,15 +10045,6 @@ - - - - - - - - - @@ -8677,27 +10075,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8755,15 +10192,6 @@ - - - - - - - - - @@ -8848,311 +10276,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9265,6 +10576,15 @@ + + + + + + + + + @@ -9310,11 +10630,11 @@ - + - + - + @@ -9348,19 +10668,13 @@ - - - - - - - - - - + - + + + + @@ -9883,15 +11197,6 @@ - - - - - - - - - @@ -10090,11 +11395,11 @@ - + - + - + @@ -10117,12 +11422,15 @@ - + - + - + + + + @@ -10189,33 +11497,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10407,10 +11688,13 @@ - + - + + + + @@ -10426,6 +11710,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + + + @@ -10557,36 +11850,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -10629,10 +11952,13 @@ - + - + + + + @@ -10645,21 +11971,15 @@ - - - - - - - - - - + - + + + + @@ -10749,10 +12069,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10921,42 +12244,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10975,24 +12262,6 @@ - - - - - - - - - - - - - - - - - - @@ -11029,24 +12298,6 @@ - - - - - - - - - - - - - - - - - - @@ -11056,15 +12307,6 @@ - - - - - - - - - @@ -11146,15 +12388,6 @@ - - - - - - - - - @@ -11164,15 +12397,6 @@ - - - - - - - - - @@ -11182,33 +12406,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11227,15 +12424,6 @@ - - - - - - - - - @@ -11254,15 +12442,6 @@ - - - - - - - - - @@ -11272,15 +12451,6 @@ - - - - - - - - - @@ -11290,15 +12460,6 @@ - - - - - - - - - diff --git a/src/localization/zh-Hant/messages.json.lcl b/src/localization/zh-Hant/messages.json.lcl index 2e8b853a7b..4497765faf 100644 --- a/src/localization/zh-Hant/messages.json.lcl +++ b/src/localization/zh-Hant/messages.json.lcl @@ -28,11 +28,11 @@ - + - [--switches]5D;]]> + - [--switches]5D;]]> + @@ -73,13 +73,13 @@ - + - + - + - + @@ -139,6 +139,15 @@ + + + + + + + + + @@ -157,6 +166,18 @@ + + + + + + + + + + + + @@ -175,6 +196,15 @@ + + + + + + + + + @@ -429,10 +459,13 @@ - + - + + + + @@ -463,33 +496,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -529,15 +535,6 @@ - - - - - - - - - @@ -586,6 +583,15 @@ + + + + + + + + + @@ -747,10 +753,13 @@ - + + + + @@ -844,15 +853,6 @@ - - - - - - - - - @@ -889,15 +889,6 @@ - - - - - - - - - @@ -925,6 +916,15 @@ + + + + + + + + + @@ -943,6 +943,15 @@ + + + + + + + + + @@ -1105,38 +1114,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -1150,341 +1159,596 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - - - - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1521,10 +1785,13 @@ - + - + + + + @@ -1566,10 +1833,13 @@ - + - + + + + @@ -1656,73 +1926,109 @@ - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + + + + - + - + + + + - + - + + + + - + + + + - + - + - + + + + - + - + + + + @@ -1771,15 +2077,6 @@ - - - - - - - - - @@ -1861,6 +2158,15 @@ + + + + + + + + + @@ -1879,6 +2185,24 @@ + + + + + + + + + + + + + + + + + + @@ -1927,47 +2251,260 @@ - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + <來源路徑>]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1981,650 +2518,1379 @@ - + - + ]]> - + ]]> - + + + + + + + + + + + + ]]> + + <下載的檔案名稱>]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --url=https://...]]> + + --url=https://...]]> + + + + + + + --sha512= --url=https://...]]> - + --sha512= --url=https://...]]> - + - + --skip-sha512 --url=https://...]]> - + --skip-sha512 --url=https://...]]> + + + + + + + + + + + + + + + + ]]> + + ]]> - + - + + + + - + - + + + + - + + + + - + - + - + - + - + [--nuget]5D; [--directory=out_dir]5D;]]> - + [--nuget]5D; [--directory=out_dir]5D;]]> - + - + - + + + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + SHA256]]> + + SHA256]]> + + + + + + + + + + + + + + + + ]]> + + 的說明詳細資料]]> + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + + + + ]]> + + ]]> + + + + + + + + + + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + - + - + - + ...]]> - + <連接埠名稱>...]]> - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + ]]> - + ]]> - + - + ...]]> - + ...]]> - + - + ]]> - + ]]> - + - + ]]> - + ]]> - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ...]]> - + ...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + ]]> - + ]]> - + - + ...]]> - + <封裝名稱>...]]> - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + ]]> - + ]]> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + ]]> - + <輸出目錄>]]> - + - + - + - + - + - + - + - + " --triplet x64-windows]]> - + " --triplet x64-windows]]> @@ -2641,21 +3907,15 @@ - - - - - - - - - - + - + + + + @@ -2716,6 +3976,15 @@ + + + + + + + + + @@ -2824,21 +4093,15 @@ - - - - - - - - - - + - + + + + @@ -3007,15 +4270,6 @@ - - - - - - - - - @@ -3052,74 +4306,128 @@ - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -3133,15 +4441,6 @@ - - - - - - - - - @@ -3213,10 +4512,13 @@ - + - + + + + @@ -3265,15 +4567,6 @@ - - - - - - - - - {path}]]> @@ -3292,30 +4585,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3343,15 +4612,6 @@ - - - - - - - - - @@ -3592,6 +4852,15 @@ + + + + + + + + + @@ -3805,9 +5074,9 @@ - + - + @@ -4165,6 +5434,15 @@ + + + + + + + + + @@ -4264,11 +5542,11 @@ - + - + - + @@ -4600,33 +5878,24 @@ - + - + - + - + - + - - - - - - - - - @@ -4726,20 +5995,20 @@ - + - + - + - + - + - + @@ -4789,6 +6058,15 @@ + + + + + + + + + @@ -4822,15 +6100,6 @@ - - - - - - - - - @@ -4903,15 +6172,6 @@ - - - - - - - - - @@ -4948,15 +6208,6 @@ - - - - - - - - - @@ -4995,10 +6246,13 @@ - + - + + + + @@ -5068,6 +6322,15 @@ + + + + + + + + + @@ -5286,55 +6549,73 @@ - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + - + - + + + + @@ -5356,15 +6637,6 @@ - - - - - - - - - @@ -5374,30 +6646,27 @@ - - - .]]> - - 中的登錄。]]> - - - - - + - + + + + - + - + + + + @@ -5430,10 +6699,13 @@ - + - + + + + @@ -5448,316 +6720,361 @@ - + + + + - - - - - - - - - - + - + + + + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - =" constraint.]]> + =" constraint.]]> =" 限制式。]]> + + =" constraint.]]> + - + - + + + + - + - + + + + - + - + + + + @@ -5898,12 +7215,12 @@ - + - + - + @@ -5955,10 +7272,13 @@ - + - + + + + @@ -6085,92 +7405,125 @@ - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + + + + - + - + - + - + - + + + + - + - + + + + - + - + + + + + + + + + + + + + - + - + + + + - + - + - + @@ -6475,15 +7828,6 @@ - - - - - - - - - @@ -6585,10 +7929,13 @@ - + - + + + + @@ -6723,10 +8070,13 @@ - + - + + + + @@ -6984,10 +8334,13 @@ - + - + + + + @@ -7000,15 +8353,6 @@ - - - - - - - - - @@ -7063,15 +8407,6 @@ - - - - - - - - - @@ -7325,35 +8660,20 @@ - - - - - - - - - - - - - - - - - - - + - + - + - + + + + @@ -7456,15 +8776,6 @@ - - - - - - - - - @@ -7666,15 +8977,6 @@ - - - - - - - - - @@ -7693,6 +8995,15 @@ + + + + + + + + + @@ -7702,12 +9013,33 @@ + + + + + + + + + + + + + + + + + + - + - + + + + @@ -7731,19 +9063,25 @@ - + + + + - + + + + @@ -7786,6 +9124,15 @@ + + + + + + + + + @@ -7797,19 +9144,43 @@ - + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + @@ -8014,30 +9385,48 @@ + + + + + + + + + - + - + + + + - + - + + + + - + - + + + + @@ -8215,6 +9604,15 @@ + + + + + + + + + @@ -8388,10 +9786,13 @@ - + - + + + + @@ -8508,10 +9909,13 @@ - + - + + + + @@ -8565,10 +9969,13 @@ - + - + + + + @@ -8638,15 +10045,6 @@ - - - - - - - - - @@ -8677,27 +10075,66 @@ - + - + - + - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -8755,15 +10192,6 @@ - - - - - - - - - @@ -8848,311 +10276,194 @@ - - - - - - - - - - - - - - - - - - - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -9265,6 +10576,15 @@ + + + + + + + + + @@ -9310,11 +10630,11 @@ - + - + - + @@ -9348,19 +10668,13 @@ - + - - - - - - - - - - + + + + @@ -9883,15 +11197,6 @@ - - - - - - - - - @@ -10090,11 +11395,11 @@ - + - + - + @@ -10117,12 +11422,15 @@ - + - + - + + + + @@ -10189,33 +11497,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10407,10 +11688,13 @@ - + - + + + + @@ -10426,6 +11710,15 @@ + + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + [--switches]5D; [--options=values]5D; [arguments]5D; @response_file]]> + + + + @@ -10557,36 +11850,66 @@ - + - + + + + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -10629,10 +11952,13 @@ - + - + + + + @@ -10645,21 +11971,15 @@ - - - - - - - - - - + - + + + + @@ -10749,10 +12069,13 @@ - {commit_sha}]]> + {commit_sha}]]> - {commit_sha}]]> + {commit_sha}]]> + + {commit_sha}]]> + @@ -10921,42 +12244,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10975,24 +12262,6 @@ - - - - - - - - - - - - - - - - - - @@ -11029,24 +12298,6 @@ - - - - - - - - - - - - - - - - - - @@ -11056,15 +12307,6 @@ - - - - - - - - - @@ -11146,15 +12388,6 @@ - - - - - - - - - @@ -11164,15 +12397,6 @@ - - - - - - - - - @@ -11182,33 +12406,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11227,15 +12424,6 @@ - - - - - - - - - @@ -11254,15 +12442,6 @@ - - - - - - - - - @@ -11272,15 +12451,6 @@ - - - - - - - - - @@ -11290,15 +12460,6 @@ - - - - - - - - - diff --git a/src/reads-stdin.c b/src/reads-stdin.c new file mode 100644 index 0000000000..698f4d8845 --- /dev/null +++ b/src/reads-stdin.c @@ -0,0 +1,38 @@ +#include +#include + +// This program reads stdin and asserts that it is the expected value repeated +// until stdin ends + +int main(int argc, char** argv) +{ + char buffer[20]; + // The repeated string 'example' is intentionally a prime length to make hitting buffering edge + // cases more likely + const char expected[] = "exampleexampleexampleexamp"; + size_t offset = 0; // always between 0 and 6 + for (;;) + { + size_t read_amount = fread(buffer, 1, sizeof(buffer), stdin); + if (argc > 1) + { + puts(argv[1]); + fflush(stdout); + } + if (read_amount == 0) + { + if (feof(stdin)) + { + puts("success"); + return 0; + } + return 1; + } + + if (memcmp(buffer, expected + offset, read_amount) != 0) + { + return 2; + } + offset = (offset + read_amount) % 7; + } +} diff --git a/src/test-editor.c b/src/test-editor.c new file mode 100644 index 0000000000..81d1de4215 --- /dev/null +++ b/src/test-editor.c @@ -0,0 +1,38 @@ +#define _CRT_SECURE_NO_WARNINGS +#include +#include + +int main(int argc, const char* argv[]) +{ + const char* path; + FILE* f; + + path = getenv("VCPKG_TEST_OUTPUT"); + if (!path) + { + puts("bad env var"); + return 1; + } + + f = fopen(path, "wb"); + if (!f) + { + puts("bad open"); + return 1; + } + + for (int idx = 1; idx < argc; ++idx) + { + if (fputs(argv[idx], f) < 0) + { + puts("bad write"); + } + + if (fputs("\n", f) < 0) + { + puts("bad write newline"); + } + } + + fclose(f); +} diff --git a/src/vcpkg-test/archives.cpp b/src/vcpkg-test/archives.cpp new file mode 100644 index 0000000000..8ef4c443c0 --- /dev/null +++ b/src/vcpkg-test/archives.cpp @@ -0,0 +1,18 @@ +#include + +#include + +TEST_CASE ("Testing guess_extraction_type", "[z-extract]") +{ + using namespace vcpkg; + REQUIRE(guess_extraction_type(Path("path/to/archive.nupkg")) == ExtractionType::Nupkg); + REQUIRE(guess_extraction_type(Path("/path/to/archive.msi")) == ExtractionType::Msi); + REQUIRE(guess_extraction_type(Path("/path/to/archive.zip")) == ExtractionType::Zip); + REQUIRE(guess_extraction_type(Path("/path/to/archive.7z")) == ExtractionType::Zip); + REQUIRE(guess_extraction_type(Path("/path/to/archive.gz")) == ExtractionType::Tar); + REQUIRE(guess_extraction_type(Path("/path/to/archive.bz2")) == ExtractionType::Tar); + REQUIRE(guess_extraction_type(Path("/path/to/archive.tgz")) == ExtractionType::Tar); + REQUIRE(guess_extraction_type(Path("/path/to/archive.xz")) == ExtractionType::Tar); + REQUIRE(guess_extraction_type(Path("/path/to/archive.exe")) == ExtractionType::Exe); + REQUIRE(guess_extraction_type(Path("/path/to/archive.unknown")) == ExtractionType::Unknown); +} diff --git a/src/vcpkg-test/arguments.cpp b/src/vcpkg-test/arguments.cpp index e827489377..e53688a327 100644 --- a/src/vcpkg-test/arguments.cpp +++ b/src/vcpkg-test/arguments.cpp @@ -7,10 +7,7 @@ #include #include -using vcpkg::CommandSetting; -using vcpkg::CommandStructure; -using vcpkg::CommandSwitch; -using vcpkg::VcpkgCmdArguments; +using namespace vcpkg; TEST_CASE ("VcpkgCmdArguments from lowercase argument sequence", "[arguments]") { @@ -90,8 +87,18 @@ TEST_CASE ("VcpkgCmdArguments from argument sequence with valued options", "[arg { SECTION ("case 1") { - std::array settings = {{{"a", nullptr}}}; - CommandStructure cmdstruct = {nullptr, 0, SIZE_MAX, {{}, settings}, nullptr}; + CommandSetting settings[] = {{"a", {}}}; + CommandMetadata cmdstruct = { + "command", + {}, + {}, + Undocumented, + AutocompletePriority::Public, + 0, + SIZE_MAX, + {{}, settings}, + nullptr, + }; std::vector t = {"--a=b", "command", "argument"}; auto v = VcpkgCmdArguments::create_from_arg_sequence(t.data(), t.data() + t.size()); @@ -105,9 +112,19 @@ TEST_CASE ("VcpkgCmdArguments from argument sequence with valued options", "[arg SECTION ("case 2") { - std::array switches = {{{"a", nullptr}, {"c", nullptr}}}; - std::array settings = {{{"b", nullptr}, {"d", nullptr}}}; - CommandStructure cmdstruct = {nullptr, 0, SIZE_MAX, {switches, settings}, nullptr}; + CommandSwitch switches[] = {{"a", {}}, {"c", {}}}; + CommandSetting settings[] = {{"b", {}}, {"d", {}}}; + CommandMetadata cmdstruct = { + "command", + {}, + {}, + Undocumented, + AutocompletePriority::Public, + 0, + SIZE_MAX, + {switches, settings}, + nullptr, + }; std::vector t = {"--a", "--b=c"}; auto v = VcpkgCmdArguments::create_from_arg_sequence(t.data(), t.data() + t.size()); @@ -160,3 +177,24 @@ TEST_CASE ("Feature flag off", "[arguments]") auto v = VcpkgCmdArguments::create_from_arg_sequence(t.data(), t.data() + t.size()); CHECK(!v.versions_enabled()); } + +TEST_CASE ("CMake debugger flags", "[arguments]") +{ + std::vector t = {"--x-cmake-debug", + "\\\\.\\pipe\\tespipe;zlib;bar;baz", + "--x-cmake-configure-debug", + "\\\\.\\pipe\\configure-pipe"}; + auto v = VcpkgCmdArguments::create_from_arg_sequence(t.data(), t.data() + t.size()); + auto& cmake_debug = v.cmake_debug.value_or_exit(VCPKG_LINE_INFO); + REQUIRE(cmake_debug.value == "\\\\.\\pipe\\tespipe"); + REQUIRE(!cmake_debug.is_port_affected("7zip")); + REQUIRE(cmake_debug.is_port_affected("zlib")); + REQUIRE(cmake_debug.is_port_affected("bar")); + REQUIRE(cmake_debug.is_port_affected("baz")); + REQUIRE(!cmake_debug.is_port_affected("bazz")); + + auto& cmake_configure_debug = v.cmake_configure_debug.value_or_exit(VCPKG_LINE_INFO); + REQUIRE(cmake_configure_debug.value == "\\\\.\\pipe\\configure-pipe"); + REQUIRE(cmake_configure_debug.is_port_affected("7zip")); + REQUIRE(cmake_configure_debug.is_port_affected("zlib")); +} diff --git a/src/vcpkg-test/binarycaching.cpp b/src/vcpkg-test/binarycaching.cpp index 21d93e30e7..e49924d4a2 100644 --- a/src/vcpkg-test/binarycaching.cpp +++ b/src/vcpkg-test/binarycaching.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -16,37 +17,30 @@ using namespace vcpkg; -struct KnowNothingBinaryProvider : IBinaryProvider +struct KnowNothingBinaryProvider : IReadBinaryProvider { - RestoreResult try_restore(const InstallPlanAction& action) const override + void fetch(View actions, Span out_status) const override { - CHECK(action.has_package_abi()); - return RestoreResult::unavailable; - } - - size_t push_success(const BinaryProviderPushRequest& request, MessageSink&) override - { - CHECK_FALSE(request.info.package_abi.empty()); - return 0; - } - - void prefetch(View actions, View cache_status) const override - { - REQUIRE(actions.size() == cache_status.size()); - for (size_t idx = 0; idx < cache_status.size(); ++idx) + REQUIRE(actions.size() == out_status.size()); + for (size_t idx = 0; idx < out_status.size(); ++idx) { - CHECK(actions[idx].has_package_abi() == (cache_status[idx] != nullptr)); + CHECK(actions[idx]->has_package_abi()); + CHECK(out_status[idx] == RestoreResult::unavailable); } } - void precheck(View actions, View cache_status) const override + void precheck(View actions, Span out_status) const override { - REQUIRE(actions.size() == cache_status.size()); - for (const auto c : cache_status) + REQUIRE(actions.size() == out_status.size()); + for (const auto c : out_status) { - CHECK(c); - c->mark_unavailable(this); + REQUIRE(c == CacheAvailability::unknown); } } + + LocalizedString restored_message(size_t, std::chrono::high_resolution_clock::duration) const override + { + return LocalizedString::from_raw("Nothing"); + } }; TEST_CASE ("CacheStatus operations", "[BinaryCache]") @@ -57,8 +51,7 @@ TEST_CASE ("CacheStatus operations", "[BinaryCache]") CacheStatus default_constructed; REQUIRE(default_constructed.should_attempt_precheck(&know_nothing)); REQUIRE(default_constructed.should_attempt_restore(&know_nothing)); - REQUIRE(default_constructed.is_unavailable(0)); - REQUIRE(default_constructed.is_unavailable(1)); + REQUIRE(!default_constructed.is_unavailable(&know_nothing)); REQUIRE(default_constructed.get_available_provider() == nullptr); REQUIRE(!default_constructed.is_restored()); @@ -66,8 +59,7 @@ TEST_CASE ("CacheStatus operations", "[BinaryCache]") unavailable.mark_unavailable(&know_nothing); REQUIRE(!unavailable.should_attempt_precheck(&know_nothing)); REQUIRE(!unavailable.should_attempt_restore(&know_nothing)); - REQUIRE(!unavailable.is_unavailable(0)); - REQUIRE(unavailable.is_unavailable(1)); + REQUIRE(unavailable.is_unavailable(&know_nothing)); REQUIRE(unavailable.get_available_provider() == nullptr); REQUIRE(!unavailable.is_restored()); @@ -75,8 +67,7 @@ TEST_CASE ("CacheStatus operations", "[BinaryCache]") available.mark_available(&know_nothing); REQUIRE(!available.should_attempt_precheck(&know_nothing)); REQUIRE(available.should_attempt_restore(&know_nothing)); - REQUIRE(!available.is_unavailable(0)); - REQUIRE(!available.is_unavailable(1)); + REQUIRE(!available.is_unavailable(&know_nothing)); REQUIRE(available.get_available_provider() == &know_nothing); REQUIRE(!available.is_restored()); @@ -84,64 +75,57 @@ TEST_CASE ("CacheStatus operations", "[BinaryCache]") restored.mark_restored(); REQUIRE(!restored.should_attempt_precheck(&know_nothing)); REQUIRE(!restored.should_attempt_restore(&know_nothing)); - REQUIRE(!restored.is_unavailable(0)); - REQUIRE(!restored.is_unavailable(1)); + REQUIRE(!restored.is_unavailable(&know_nothing)); REQUIRE(restored.get_available_provider() == nullptr); REQUIRE(restored.is_restored()); // CacheStatus(const CacheStatus&); CacheStatus default_copy{default_constructed}; - REQUIRE(default_copy.is_unavailable(0)); + REQUIRE(!default_copy.is_unavailable(&know_nothing)); CacheStatus unavailable_copy{unavailable}; REQUIRE(!unavailable_copy.should_attempt_precheck(&know_nothing)); REQUIRE(!unavailable_copy.should_attempt_restore(&know_nothing)); - REQUIRE(!unavailable_copy.is_unavailable(0)); - REQUIRE(unavailable_copy.is_unavailable(1)); + REQUIRE(unavailable_copy.is_unavailable(&know_nothing)); REQUIRE(unavailable_copy.get_available_provider() == nullptr); REQUIRE(!unavailable_copy.is_restored()); CacheStatus available_copy{available}; REQUIRE(!available_copy.should_attempt_precheck(&know_nothing)); REQUIRE(available_copy.should_attempt_restore(&know_nothing)); - REQUIRE(!available_copy.is_unavailable(0)); - REQUIRE(!available_copy.is_unavailable(1)); + REQUIRE(!available_copy.is_unavailable(&know_nothing)); REQUIRE(available_copy.get_available_provider() == &know_nothing); REQUIRE(!available_copy.is_restored()); CacheStatus restored_copy{restored}; REQUIRE(!restored_copy.should_attempt_precheck(&know_nothing)); REQUIRE(!restored_copy.should_attempt_restore(&know_nothing)); - REQUIRE(!restored_copy.is_unavailable(0)); - REQUIRE(!restored_copy.is_unavailable(1)); + REQUIRE(!restored_copy.is_unavailable(&know_nothing)); REQUIRE(restored_copy.get_available_provider() == nullptr); REQUIRE(restored_copy.is_restored()); // CacheStatus(CacheStatus&&) noexcept; CacheStatus default_move{std::move(default_copy)}; - REQUIRE(default_move.is_unavailable(0)); + REQUIRE(!default_move.is_unavailable(&know_nothing)); CacheStatus unavailable_move{std::move(unavailable_copy)}; REQUIRE(!unavailable_move.should_attempt_precheck(&know_nothing)); REQUIRE(!unavailable_move.should_attempt_restore(&know_nothing)); - REQUIRE(!unavailable_move.is_unavailable(0)); - REQUIRE(unavailable_move.is_unavailable(1)); + REQUIRE(unavailable_move.is_unavailable(&know_nothing)); REQUIRE(unavailable_move.get_available_provider() == nullptr); REQUIRE(!unavailable_move.is_restored()); CacheStatus available_move{std::move(available_copy)}; REQUIRE(!available_move.should_attempt_precheck(&know_nothing)); REQUIRE(available_move.should_attempt_restore(&know_nothing)); - REQUIRE(!available_move.is_unavailable(0)); - REQUIRE(!available_move.is_unavailable(1)); + REQUIRE(!available_move.is_unavailable(&know_nothing)); REQUIRE(available_move.get_available_provider() == &know_nothing); REQUIRE(!available_move.is_restored()); CacheStatus restored_move{std::move(restored_copy)}; REQUIRE(!restored_move.should_attempt_precheck(&know_nothing)); REQUIRE(!restored_move.should_attempt_restore(&know_nothing)); - REQUIRE(!restored_move.is_unavailable(0)); - REQUIRE(!restored_move.is_unavailable(1)); + REQUIRE(!restored_move.is_unavailable(&know_nothing)); REQUIRE(restored_move.get_available_provider() == nullptr); REQUIRE(restored_move.is_restored()); @@ -150,22 +134,19 @@ TEST_CASE ("CacheStatus operations", "[BinaryCache]") assignee = unavailable; REQUIRE(!assignee.should_attempt_precheck(&know_nothing)); REQUIRE(!assignee.should_attempt_restore(&know_nothing)); - REQUIRE(!assignee.is_unavailable(0)); - REQUIRE(assignee.is_unavailable(1)); + REQUIRE(assignee.is_unavailable(&know_nothing)); REQUIRE(assignee.get_available_provider() == nullptr); REQUIRE(!assignee.is_restored()); assignee = available; REQUIRE(!assignee.should_attempt_precheck(&know_nothing)); REQUIRE(assignee.should_attempt_restore(&know_nothing)); - REQUIRE(!assignee.is_unavailable(0)); - REQUIRE(!assignee.is_unavailable(1)); + REQUIRE(!assignee.is_unavailable(&know_nothing)); REQUIRE(assignee.get_available_provider() == &know_nothing); REQUIRE(!assignee.is_restored()); assignee = restored; REQUIRE(!assignee.should_attempt_precheck(&know_nothing)); REQUIRE(!assignee.should_attempt_restore(&know_nothing)); - REQUIRE(!assignee.is_unavailable(0)); - REQUIRE(!assignee.is_unavailable(1)); + REQUIRE(!assignee.is_unavailable(&know_nothing)); REQUIRE(assignee.get_available_provider() == nullptr); REQUIRE(assignee.is_restored()); @@ -173,38 +154,23 @@ TEST_CASE ("CacheStatus operations", "[BinaryCache]") assignee = std::move(unavailable); REQUIRE(!assignee.should_attempt_precheck(&know_nothing)); REQUIRE(!assignee.should_attempt_restore(&know_nothing)); - REQUIRE(!assignee.is_unavailable(0)); - REQUIRE(assignee.is_unavailable(1)); + REQUIRE(assignee.is_unavailable(&know_nothing)); REQUIRE(assignee.get_available_provider() == nullptr); REQUIRE(!assignee.is_restored()); assignee = std::move(available); REQUIRE(!assignee.should_attempt_precheck(&know_nothing)); REQUIRE(assignee.should_attempt_restore(&know_nothing)); - REQUIRE(!assignee.is_unavailable(0)); - REQUIRE(!assignee.is_unavailable(1)); + REQUIRE(!assignee.is_unavailable(&know_nothing)); REQUIRE(assignee.get_available_provider() == &know_nothing); REQUIRE(!assignee.is_restored()); assignee = std::move(restored); REQUIRE(!assignee.should_attempt_precheck(&know_nothing)); REQUIRE(!assignee.should_attempt_restore(&know_nothing)); - REQUIRE(!assignee.is_unavailable(0)); - REQUIRE(!assignee.is_unavailable(1)); + REQUIRE(!assignee.is_unavailable(&know_nothing)); REQUIRE(assignee.get_available_provider() == nullptr); REQUIRE(assignee.is_restored()); } -#define REQUIRE_EQUAL_TEXT(lhs, rhs) \ - { \ - auto lhs_lines = Strings::split((lhs), '\n'); \ - auto rhs_lines = Strings::split((rhs), '\n'); \ - for (size_t i = 0; i < lhs_lines.size() && i < rhs_lines.size(); ++i) \ - { \ - INFO("on line: " << i); \ - REQUIRE(lhs_lines[i] == rhs_lines[i]); \ - } \ - REQUIRE(lhs_lines.size() == rhs_lines.size()); \ - } - TEST_CASE ("format_version_for_nugetref semver-ish", "[format_version_for_nugetref]") { REQUIRE(format_version_for_nugetref("0.0.0", "abitag") == "0.0.0-vcpkgabitag"); @@ -257,9 +223,11 @@ Build-Depends: bzip InstallPlanAction ipa(PackageSpec{"zlib2", Test::X64_WINDOWS}, scfl, + "test_packages_root", RequestType::USER_REQUESTED, Test::ARM_UWP, {{"a", {}}, {"b", {}}}, + {}, {}); ipa.abi_info = AbiInfo{}; @@ -280,9 +248,8 @@ Build-Depends: bzip REQUIRE(ref.nupkg_filename() == "zlib2_x64-windows.1.5.0-vcpkgpackageabi.nupkg"); - { - auto nuspec = generate_nuspec(pkgPath, ipa, ref, {}); - std::string expected = R"( + REQUIRE_LINES(generate_nuspec(pkgPath, ipa, "", {}), + R"( zlib2_x64-windows 1.5.0-vcpkgpackageabi @@ -301,16 +268,14 @@ Features: a, b - + -)"; - REQUIRE_EQUAL_TEXT(nuspec, expected); - } +)"); - { - auto nuspec = generate_nuspec(pkgPath, ipa, ref, {"urlvalue"}); - std::string expected = R"( + REQUIRE_LINES(generate_nuspec(pkgPath, ipa, "", {"urlvalue"}), + R"( zlib2_x64-windows 1.5.0-vcpkgpackageabi @@ -330,15 +295,13 @@ Features: a, b - + -)"; - REQUIRE_EQUAL_TEXT(nuspec, expected); - } - { - auto nuspec = generate_nuspec(pkgPath, ipa, ref, {"urlvalue", "branchvalue", "commitvalue"}); - std::string expected = R"( +)"); + REQUIRE_LINES(generate_nuspec(pkgPath, ipa, "", {"urlvalue", "branchvalue", "commitvalue"}), + R"( zlib2_x64-windows 1.5.0-vcpkgpackageabi @@ -358,21 +321,19 @@ Features: a, b - + -)"; - REQUIRE_EQUAL_TEXT(nuspec, expected); - } +)"); } TEST_CASE ("Provider nullptr checks", "[BinaryCache]") { // create a binary cache to test - BinaryCache uut(get_real_filesystem()); - std::vector> providers; - providers.emplace_back(std::make_unique()); - uut.install_providers(std::move(providers)); + BinaryProviders providers; + providers.read.emplace_back(std::make_unique()); + ReadOnlyBinaryCache uut(std::move(providers)); // create an action plan with an action without a package ABI set auto pghs = Paragraphs::parse_paragraphs(R"( @@ -388,16 +349,17 @@ Version: 1.5 std::vector install_plan; install_plan.emplace_back(PackageSpec{"someheadpackage", Test::X64_WINDOWS}, scfl, + "test_packages_root", RequestType::USER_REQUESTED, Test::ARM_UWP, std::map>{}, - std::vector{}); + std::vector{}, + std::vector{}); InstallPlanAction& ipa_without_abi = install_plan.back(); + ipa_without_abi.package_dir = "pkgs/someheadpackage"; // test that the binary cache does the right thing. See also CHECKs etc. in KnowNothingBinaryProvider - uut.push_success(ipa_without_abi, {}); // should have no effects - CHECK(uut.try_restore(ipa_without_abi) == RestoreResult::unavailable); - uut.prefetch(install_plan); // should have no effects + uut.fetch(install_plan); // should have no effects } TEST_CASE ("XmlSerializer", "[XmlSerializer]") @@ -446,7 +408,7 @@ TEST_CASE ("XmlSerializer", "[XmlSerializer]") TEST_CASE ("generate_nuget_packages_config", "[generate_nuget_packages_config]") { ActionPlan plan; - auto packageconfig = generate_nuget_packages_config(plan); + auto packageconfig = generate_nuget_packages_config(plan, ""); REQUIRE(packageconfig == R"( @@ -462,13 +424,18 @@ Description: a spiffy compression library wrapper auto maybe_scf = SourceControlFile::parse_control_file("", std::move(*pghs.get())); REQUIRE(maybe_scf.has_value()); SourceControlFileAndLocation scfl{std::move(*maybe_scf.get()), Path()}; - plan.install_actions.emplace_back(); - plan.install_actions[0].spec = PackageSpec("zlib", Test::X64_ANDROID); - plan.install_actions[0].source_control_file_and_location = scfl; + plan.install_actions.emplace_back(PackageSpec("zlib", Test::X64_ANDROID), + scfl, + "test_packages_root", + RequestType::USER_REQUESTED, + Test::ARM64_WINDOWS, + std::map>{}, + std::vector{}, + std::vector{}); plan.install_actions[0].abi_info = AbiInfo{}; plan.install_actions[0].abi_info.get()->package_abi = "packageabi"; - packageconfig = generate_nuget_packages_config(plan); + packageconfig = generate_nuget_packages_config(plan, ""); REQUIRE(packageconfig == R"( @@ -485,14 +452,19 @@ Description: a spiffy compression library wrapper auto maybe_scf2 = SourceControlFile::parse_control_file("", std::move(*pghs2.get())); REQUIRE(maybe_scf2.has_value()); SourceControlFileAndLocation scfl2{std::move(*maybe_scf2.get()), Path()}; - plan.install_actions.emplace_back(); - plan.install_actions[1].spec = PackageSpec("zlib2", Test::X64_ANDROID); - plan.install_actions[1].source_control_file_and_location = scfl2; + plan.install_actions.emplace_back(PackageSpec("zlib2", Test::X64_ANDROID), + scfl2, + "test_packages_root", + RequestType::USER_REQUESTED, + Test::ARM64_WINDOWS, + std::map>{}, + std::vector{}, + std::vector{}); plan.install_actions[1].abi_info = AbiInfo{}; plan.install_actions[1].abi_info.get()->package_abi = "packageabi2"; - packageconfig = generate_nuget_packages_config(plan); - REQUIRE(packageconfig == R"( + packageconfig = generate_nuget_packages_config(plan, ""); + REQUIRE_LINES(packageconfig, R"( diff --git a/src/vcpkg-test/cgroup-parser.cpp b/src/vcpkg-test/cgroup-parser.cpp index 331a60d9e6..466b38d995 100644 --- a/src/vcpkg-test/cgroup-parser.cpp +++ b/src/vcpkg-test/cgroup-parser.cpp @@ -1,6 +1,9 @@ #include +#include +#include #include +#include #include @@ -63,4 +66,76 @@ TEST_CASE ("detect docker", "[cgroup-parser]") CHECK(detect_docker_in_cgroup_file(with_docker, "with_docker")); CHECK(!detect_docker_in_cgroup_file(without_docker, "without_docker")); -} \ No newline at end of file +} + +TEST_CASE ("parse proc/pid/stat file", "[cgroup-parser]") +{ + SECTION ("simple case") + { + std::string contents = + R"(4281 (cpptools-srv) S 4099 1676 1676 0 -1 1077936384 51165 303 472 0 81 25 0 0 20 0 10 0 829158 4924583936 39830 18446744073709551615 4194304 14147733 140725993620736 0 0 0 0 16781312 16386 0 0 0 17 1 0 0 5 0 0 16247120 16519160 29999104 140725993622792 140725993622920 140725993622920 140725993627556 0)"; + + auto maybe_stat = try_parse_process_stat_file({contents, "test"}); + REQUIRE(maybe_stat.has_value()); + auto stat = maybe_stat.value_or_exit(VCPKG_LINE_INFO); + CHECK(stat.ppid == 4099); + CHECK(stat.executable_name == "cpptools-srv"); + } + + SECTION ("empty case") + { + std::string contents = + R"(4281 () S 4099 1676 1676 0 -1 1077936384 51165 303 472 0 81 25 0 0 20 0 10 0 829158 4924583936 39830 18446744073709551615 4194304 14147733 140725993620736 0 0 0 0 16781312 16386 0 0 0 17 1 0 0 5 0 0 16247120 16519160 29999104 140725993622792 140725993622920 140725993622920 140725993627556 0)"; + + auto maybe_stat = try_parse_process_stat_file({contents, "test"}); + REQUIRE(maybe_stat.has_value()); + auto stat = maybe_stat.value_or_exit(VCPKG_LINE_INFO); + CHECK(stat.ppid == 4099); + CHECK(stat.executable_name == ""); + } + + SECTION ("comm with parens") + { + std::string contents = + R"(4281 (<(' '<)(> ' ')>) S 4099 1676 1676 0 -1 1077936384 51165 303 472 0 81 25 0 0 20 0 10 0 829158 4924583936 39830 18446744073709551615 4194304 14147733 140725993620736 0 0 0 0 16781312 16386 0 0 0 17 1 0 0 5 0 0 16247120 16519160 29999104 140725993622792 140725993622920 140725993622920 140725993627556 0)"; + + auto maybe_stat = try_parse_process_stat_file({contents, "test"}); + REQUIRE(maybe_stat.has_value()); + auto stat = maybe_stat.value_or_exit(VCPKG_LINE_INFO); + CHECK(stat.ppid == 4099); + CHECK(stat.executable_name == "<(' '<)(> ' ')>"); + } + + SECTION ("comm max length") + { + std::string contents = + R"(4281 (0123456789abcdef) S 4099 1676 1676 0 -1 1077936384 51165 303 472 0 81 25 0 0 20 0 10 0 829158 4924583936 39830 18446744073709551615 4194304 14147733 140725993620736 0 0 0 0 16781312 16386 0 0 0 17 1 0 0 5 0 0 16247120 16519160 29999104 140725993622792 140725993622920 140725993622920 140725993627556 0)"; + + auto maybe_stat = try_parse_process_stat_file({contents, "test"}); + REQUIRE(maybe_stat.has_value()); + auto stat = maybe_stat.value_or_exit(VCPKG_LINE_INFO); + CHECK(stat.ppid == 4099); + CHECK(stat.executable_name == "0123456789abcdef"); + } + + SECTION ("only parens") + { + std::string contents = + R"(4281 (()()()()()()()()) S 4099 1676 1676 0 -1 1077936384 51165 303 472 0 81 25 0 0 20 0 10 0 829158 4924583936 39830 18446744073709551615 4194304 14147733 140725993620736 0 0 0 0 16781312 16386 0 0 0 17 1 0 0 5 0 0 16247120 16519160 29999104 140725993622792 140725993622920 140725993622920 140725993627556 0)"; + + auto maybe_stat = try_parse_process_stat_file({contents, "test"}); + REQUIRE(maybe_stat.has_value()); + auto stat = maybe_stat.value_or_exit(VCPKG_LINE_INFO); + CHECK(stat.ppid == 4099); + CHECK(stat.executable_name == "()()()()()()()()"); + } + + SECTION ("comm too long") + { + std::string contents = + R"(4281 (0123456789abcdefg) S 4099 1676 1676 0 -1 1077936384 51165 303 472 0 81 25 0 0 20 0 10 0 829158 4924583936 39830 18446744073709551615 4194304 14147733 140725993620736 0 0 0 0 16781312 16386 0 0 0 17 1 0 0 5 0 0 16247120 16519160 29999104 140725993622792 140725993622920 140725993622920 140725993627556 0)"; + + auto maybe_stat = try_parse_process_stat_file({contents, "test"}); + REQUIRE(!maybe_stat.has_value()); + } +} diff --git a/src/vcpkg-test/ci-baseline.cpp b/src/vcpkg-test/ci-baseline.cpp index cc9f3d7dac..07cd62de3c 100644 --- a/src/vcpkg-test/ci-baseline.cpp +++ b/src/vcpkg-test/ci-baseline.cpp @@ -3,8 +3,8 @@ #include #include -#include #include +#include #include #include @@ -261,65 +261,65 @@ static void check_error(const std::string& input, const std::string& expected_er TEST_CASE ("Parse Errors", "[ci-baseline]") { check_error("hello", R"(test:1:6: error: expected ':' here - on expression: hello - ^)"); + on expression: hello + ^)"); check_error("hello\n:", R"(test:1:6: error: expected ':' here - on expression: hello - ^)"); + on expression: hello + ^)"); check_error("?example:x64-windows=fail", R"(test:1:1: error: expected a port name here (must be lowercase, digits, '-') - on expression: ?example:x64-windows=fail - ^)"); + on expression: ?example:x64-windows=fail + ^)"); check_error("x64-windows:", R"(test:1:13: error: expected a triplet name here (must be lowercase, digits, '-') - on expression: x64-windows: - ^)"); + on expression: x64-windows: + ^)"); check_error("x64-windows:\nport:x64-windows=skip", R"(test:1:13: error: expected a triplet name here (must be lowercase, digits, '-') - on expression: x64-windows: - ^)"); + on expression: x64-windows: + ^)"); check_error("x64-windows:#", R"(test:1:13: error: expected a triplet name here (must be lowercase, digits, '-') - on expression: x64-windows:# - ^)"); + on expression: x64-windows:# + ^)"); // clang-format off check_error(" \tx64-windows:", R"(test:1:21: error: expected a triplet name here (must be lowercase, digits, '-') - on expression: )" "\t" R"(x64-windows: - )" "\t" R"( ^)"); + on expression: )" "\t" R"(x64-windows: + )" "\t" R"( ^)"); // clang-format on check_error("port:x64-windows\n=fail", R"(test:1:17: error: expected '=' here - on expression: port:x64-windows - ^)"); + on expression: port:x64-windows + ^)"); check_error("example:x64-windows = \n fail", R"(test:1:26: error: expected 'fail', 'skip', or 'pass' here - on expression: example:x64-windows = - ^)"); + on expression: example:x64-windows = + ^)"); // note that there is 'fail' but doesn't end on a word boundary: check_error("example:x64-windows = fails", R"(test:1:28: error: expected 'fail', 'skip', or 'pass' here - on expression: example:x64-windows = fails - ^)"); + on expression: example:x64-windows = fails + ^)"); check_error("example:x64-windows = fail extra stuff", R"(test:1:33: error: unrecognizable baseline entry; expected 'port:triplet=(fail|skip|pass)' - on expression: example:x64-windows = fail extra stuff - ^)"); + on expression: example:x64-windows = fail extra stuff + ^)"); check_error("example:x64-windows = fail example:x64-windows = fail", R"(test:1:33: error: unrecognizable baseline entry; expected 'port:triplet=(fail|skip|pass)' - on expression: example:x64-windows = fail example:x64-windows = fail - ^)"); + on expression: example:x64-windows = fail example:x64-windows = fail + ^)"); check_error("example:x64-windows = fail # extra stuff\n" "example:x64-uwp=skip extra stuff\n", R"(test:2:22: error: unrecognizable baseline entry; expected 'port:triplet=(fail|skip|pass)' - on expression: example:x64-uwp=skip extra stuff - ^)"); + on expression: example:x64-uwp=skip extra stuff + ^)"); } TEST_CASE ("format_ci_result 1", "[ci-baseline]") diff --git a/src/vcpkg-test/cmd-parser.cpp b/src/vcpkg-test/cmd-parser.cpp index 400ecc5802..c1ff1cf9cc 100644 --- a/src/vcpkg-test/cmd-parser.cpp +++ b/src/vcpkg-test/cmd-parser.cpp @@ -25,7 +25,7 @@ TEST_CASE ("Smoke test help table formatter", "[cmd_parser]") uut.format("a-really-long-arg-that-does-not-fit-in-the-first-column-and-keeps-going", "shorty"); uut.format("short-arg", "some really long help text that does not fit on the same line because we have a 100 character line " - "limit and oh god it keeps going and going"); + "limit and oh no it keeps going and going"); uut.format("a-really-long-arg-combined-with-some-really-long-help-text", "another instance of that really long help text goes here to demonstrate that the worst case combo can " "be accommodated"); @@ -35,15 +35,14 @@ TEST_CASE ("Smoke test help table formatter", "[cmd_parser]") uut.text("this is some text"); const char* const expected = R"(This is a header: - short-arg short help text + short-arg short help text a-really-long-arg-that-does-not-fit-in-the-first-column-and-keeps-going - shorty - short-arg some really long help text that does not fit on the same line - because we have a 100 character line limit and oh god it keeps - going and going + shorty + short-arg some really long help text that does not fit on the same line because we + have a 100 character line limit and oh no it keeps going and going a-really-long-arg-combined-with-some-really-long-help-text - another instance of that really long help text goes here to - demonstrate that the worst case combo can be accommodated + another instance of that really long help text goes here to demonstrate + that the worst case combo can be accommodated some example command this is some text)"; @@ -175,6 +174,13 @@ TEST_CASE ("Response file parameters can be processed", "[cmd_parser]") replace_response_file_parameters(multi_insert_last, FakeReadLines{xy}).value_or_exit(VCPKG_LINE_INFO); CHECK(multi_insert_last == std::vector{"a", "b", "x", "y"}); } + + const std::vector blanks{"x", "", " ", "\r", "y"}; + { + std::vector insert_middle_blanks{"a", "@filename", "b"}; + replace_response_file_parameters(insert_middle_blanks, FakeReadLines{blanks}).value_or_exit(VCPKG_LINE_INFO); + CHECK(insert_middle_blanks == std::vector{"a", "x", "y", "b"}); + } } TEST_CASE ("Arguments can be parsed as switches", "[cmd_parser]") @@ -599,22 +605,22 @@ TEST_CASE ("Help table is generated", "[cmd_parser]") const auto expected = LocalizedString::from_raw( R"(Options: - --x-b b help - --x-d d help - --x-f f help - --g=... g help - --i=... i help - --x-j=... j help - --k=... k help - --x-l=... l help - --m=... m help - --x-n=... n help - --o=... m help - --x-p=... n help - --x-w=... w help - --x x help - --y y help - --z z help + --x-b b help + --x-d d help + --x-f f help + --g=... g help + --i=... i help + --x-j=... j help + --k=... k help + --x-l=... l help + --m=... m help + --x-n=... n help + --o=... m help + --x-p=... n help + --x-w=... w help + --x x help + --y y help + --z z help )"); LocalizedString actual; uut.append_options_table(actual); @@ -1081,6 +1087,31 @@ TEST_CASE ("real world commands", "[cmd_parser]") "error: unexpected switch: --zlib"})); CHECK(uut.get_remaining_args().empty()); } + + { + CmdParser uut{std::vector{"version"}}; + CHECK(uut.extract_first_command_like_arg_lowercase().value_or_exit(VCPKG_LINE_INFO) == "version"); + } + + { + CmdParser uut{std::vector{"--version"}}; + CHECK(uut.extract_first_command_like_arg_lowercase().value_or_exit(VCPKG_LINE_INFO) == "version"); + } + + { + CmdParser uut{std::vector{"/?"}}; + CHECK(uut.extract_first_command_like_arg_lowercase().value_or_exit(VCPKG_LINE_INFO) == "help"); + } + + { + CmdParser uut{std::vector{"-?"}}; + CHECK(uut.extract_first_command_like_arg_lowercase().value_or_exit(VCPKG_LINE_INFO) == "help"); + } + + { + CmdParser uut{std::vector{"--help"}}; + CHECK(uut.extract_first_command_like_arg_lowercase().value_or_exit(VCPKG_LINE_INFO) == "help"); + } } TEST_CASE ("inverted switches", "[cmd_parser]") diff --git a/src/vcpkg-test/commands.dependinfo.cpp b/src/vcpkg-test/commands.dependinfo.cpp new file mode 100644 index 0000000000..70d0b305d7 --- /dev/null +++ b/src/vcpkg-test/commands.dependinfo.cpp @@ -0,0 +1,267 @@ +#include + +#include +#include + +#include + +using namespace vcpkg; + +TEST_CASE ("determine_depend_info_mode no args", "[depend-info]") +{ + ParsedArguments pa; + auto result = determine_depend_info_mode(pa).value_or_exit(VCPKG_LINE_INFO); + REQUIRE(result.sort_mode == DependInfoSortMode::Topological); + REQUIRE(result.format == DependInfoFormat::List); + REQUIRE(result.max_depth == INT_MAX); + REQUIRE(!result.show_depth); +} + +TEST_CASE ("determine_depend_info_mode formats", "[depend-info]") +{ + ParsedArguments pa; + DependInfoFormat expected = DependInfoFormat::List; + SECTION ("list") + { + pa.settings.emplace("format", "list"); + } + + SECTION ("tree") + { + pa.settings.emplace("format", "tree"); + expected = DependInfoFormat::Tree; + } + + SECTION ("tree sort") + { + pa.settings.emplace("sort", "x-tree"); + expected = DependInfoFormat::Tree; + } + + SECTION ("tree tree sort") + { + pa.settings.emplace("format", "tree"); + pa.settings.emplace("sort", "x-tree"); + expected = DependInfoFormat::Tree; + } + + SECTION ("dot") + { + pa.switches.insert("dot"); + expected = DependInfoFormat::Dot; + } + + SECTION ("dot format") + { + pa.settings.emplace("format", "dot"); + expected = DependInfoFormat::Dot; + } + + SECTION ("dot and format") + { + pa.switches.insert("dot"); + pa.settings.emplace("format", "dot"); + expected = DependInfoFormat::Dot; + } + + SECTION ("dgml") + { + pa.switches.insert("dgml"); + expected = DependInfoFormat::Dgml; + } + + SECTION ("dgml format") + { + pa.settings.emplace("format", "dgml"); + expected = DependInfoFormat::Dgml; + } + + SECTION ("dgml and format") + { + pa.switches.insert("dgml"); + pa.settings.emplace("format", "dgml"); + expected = DependInfoFormat::Dgml; + } + + SECTION ("mermaid") + { + pa.settings.emplace("format", "mermaid"); + expected = DependInfoFormat::Mermaid; + } + + auto result = determine_depend_info_mode(pa).value_or_exit(VCPKG_LINE_INFO); + REQUIRE(result.sort_mode == DependInfoSortMode::Topological); + REQUIRE(result.format == expected); + REQUIRE(result.max_depth == INT_MAX); + REQUIRE(!result.show_depth); +} + +TEST_CASE ("determine_depend_info_mode sorts", "[depend-info]") +{ + ParsedArguments pa; + DependInfoSortMode expected = DependInfoSortMode::Topological; + + SECTION ("topological default") + { + // intentionally empty + } + + SECTION ("topological") + { + pa.settings.emplace("sort", "topological"); + } + + SECTION ("reverse topological") + { + pa.settings.emplace("sort", "reverse"); + expected = DependInfoSortMode::ReverseTopological; + } + + SECTION ("lexicographical") + { + pa.settings.emplace("sort", "lexicographical"); + expected = DependInfoSortMode::Lexicographical; + } + + auto result = determine_depend_info_mode(pa).value_or_exit(VCPKG_LINE_INFO); + REQUIRE(result.sort_mode == expected); + REQUIRE(result.format == DependInfoFormat::List); + REQUIRE(result.max_depth == INT_MAX); + REQUIRE(!result.show_depth); +} + +TEST_CASE ("determine_depend_info_mode max_depth", "[depend-info]") +{ + ParsedArguments pa; + int expected = INT_MAX; + SECTION ("default") + { + // intentionally empty + } + + SECTION ("zero") + { + expected = 0; + pa.settings.emplace("max-recurse", "0"); + } + + SECTION ("negative one") + { + expected = INT_MAX; + pa.settings.emplace("max-recurse", "-1"); + } + + SECTION ("negative") + { + expected = INT_MAX; + pa.settings.emplace("max-recurse", "-10"); + } + + SECTION ("positive") + { + expected = 2; + pa.settings.emplace("max-recurse", "2"); + } + + auto result = determine_depend_info_mode(pa).value_or_exit(VCPKG_LINE_INFO); + REQUIRE(result.sort_mode == DependInfoSortMode::Topological); + REQUIRE(result.format == DependInfoFormat::List); + REQUIRE(result.max_depth == expected); + REQUIRE(!result.show_depth); +} + +TEST_CASE ("determine_depend_info_mode show_depth", "[depend-info]") +{ + ParsedArguments pa; + pa.switches.emplace("show-depth"); + auto result = determine_depend_info_mode(pa).value_or_exit(VCPKG_LINE_INFO); + REQUIRE(result.sort_mode == DependInfoSortMode::Topological); + REQUIRE(result.format == DependInfoFormat::List); + REQUIRE(result.max_depth == INT_MAX); + REQUIRE(result.show_depth); +} + +TEST_CASE ("determine_depend_info_mode errors", "[depend-info]") +{ + ParsedArguments pa; + auto expected = LocalizedString::from_raw("error: "); + + SECTION ("bad format") + { + pa.settings.emplace("format", "frobinate"); + expected.append_raw("--format=frobinate is not a recognized format. --format must be one of `list`, `tree`, " + "`mermaid`, `dot`, or `dgml`."); + } + + SECTION ("bad sort") + { + pa.settings.emplace("sort", "frobinate"); + expected.append_raw("Value of --sort must be one of 'lexicographical', 'topological', 'reverse'."); + } + + SECTION ("bad legacy switches") + { + pa.settings.emplace("format", "list"); + expected.append_raw("Conflicting formats specified. Only one of --format, --dgml, or --dot are accepted."); + + SECTION ("dot") + { + pa.switches.emplace("dot"); + } + + SECTION ("dgml") + { + pa.switches.emplace("dot"); + } + } + + SECTION ("bad format sort tree") + { + pa.settings.emplace("format", "list"); + pa.settings.emplace("sort", "x-tree"); + expected.append_raw("--sort=x-tree cannot be used with formats other than tree"); + } + + SECTION ("show depth with graphs") + { + pa.switches.emplace("show-depth"); + expected.append_raw("--show-depth can only be used with `list` and `tree` formats."); + + SECTION ("dot") + { + pa.settings.emplace("format", "dot"); + } + + SECTION ("dgml") + { + pa.settings.emplace("format", "dgml"); + } + + SECTION ("mermaid") + { + pa.settings.emplace("format", "mermaid"); + } + } + + SECTION ("bad max depth non numeric") + { + pa.settings.emplace("max-recurse", "frobinate"); + expected.append_raw("Value of --max-recurse must be an integer."); + } + + SECTION ("bad max depth too low") + { + static_assert(-2147483648 == INT_MIN, "integer range assumption"); + pa.settings.emplace("max-recurse", "-2147483649"); + expected.append_raw("Value of --max-recurse must be an integer."); + } + + SECTION ("bad max depth too high") + { + static_assert(2147483647 == INT_MAX, "integer range assumption"); + pa.settings.emplace("max-recurse", "2147483648"); + expected.append_raw("Value of --max-recurse must be an integer."); + } + + REQUIRE(determine_depend_info_mode(pa).error() == expected); +} diff --git a/src/vcpkg-test/export.cpp b/src/vcpkg-test/commands.export.cpp similarity index 98% rename from src/vcpkg-test/export.cpp rename to src/vcpkg-test/commands.export.cpp index 7c171a434c..e713caddce 100644 --- a/src/vcpkg-test/export.cpp +++ b/src/vcpkg-test/commands.export.cpp @@ -5,9 +5,6 @@ using namespace vcpkg; -namespace IFW = Export::IFW; -namespace Prefab = Export::Prefab; - TEST_CASE ("safe_rich_from_plain_text", "[export]") { CHECK(IFW::safe_rich_from_plain_text("&") == "&"); diff --git a/src/vcpkg-test/commands.extract.cpp b/src/vcpkg-test/commands.extract.cpp new file mode 100644 index 0000000000..eb1e2abb76 --- /dev/null +++ b/src/vcpkg-test/commands.extract.cpp @@ -0,0 +1,183 @@ +#include + +#include + +#include +#include +#include + +#include + +#include + +using namespace vcpkg; + +#if defined(_WIN32) +#define BASE_TEMP_PATH "C:\\to\\path\\temp\\" +#define BASE_PATH "C:\\to\\path\\" +#else // ^^^ _WIN32 // !_WIN32 vvv +#define BASE_TEMP_PATH "/to/path/temp/" +#define BASE_PATH "/to/path/" +#endif // ^^^ !_WIN32 + +// C: +// |__to +// |__ path +// |__ folder0 +#define ARCHIVE_PATH BASE_TEMP_PATH "folder0" +// | |__ folder1 +#define FOLDER_1 ARCHIVE_PATH VCPKG_PREFERRED_SEPARATOR "folder1" +// | | |__ file1.txt +#define FILE_1 FOLDER_1 VCPKG_PREFERRED_SEPARATOR "file1.txt" +// | | |__ file2.txt +#define FILE_2 FOLDER_1 VCPKG_PREFERRED_SEPARATOR "file2.txt" +// | | |__ file3.txt +#define FILE_3 FOLDER_1 VCPKG_PREFERRED_SEPARATOR "file3.txt" +// | |___folder2 +#define FOLDER_2 ARCHIVE_PATH VCPKG_PREFERRED_SEPARATOR "folder2" +// | |__ file4.txt +#define FILE_4 FOLDER_2 VCPKG_PREFERRED_SEPARATOR "file4.txt" +// | |__ file5.txt +#define FILE_5 FOLDER_2 VCPKG_PREFERRED_SEPARATOR "file5.txt" +// | |__ folder3 +#define FOLDER_3 FOLDER_2 VCPKG_PREFERRED_SEPARATOR "folder3" +// | |__ file6.txt +#define FILE_6 FOLDER_3 VCPKG_PREFERRED_SEPARATOR "file6.txt" +// | |__ file7.txt +#define FILE_7 FOLDER_3 VCPKG_PREFERRED_SEPARATOR "file7.txt" +// |__ . . . + +ExtractedArchive archive = {BASE_TEMP_PATH, + BASE_PATH, + { + "folder0" VCPKG_PREFERRED_SEPARATOR "folder1" VCPKG_PREFERRED_SEPARATOR "file1.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder1" VCPKG_PREFERRED_SEPARATOR "file2.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder1" VCPKG_PREFERRED_SEPARATOR "file3.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder2" VCPKG_PREFERRED_SEPARATOR "file4.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder2" VCPKG_PREFERRED_SEPARATOR "file5.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder2" VCPKG_PREFERRED_SEPARATOR + "folder3" VCPKG_PREFERRED_SEPARATOR "file6.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder2" VCPKG_PREFERRED_SEPARATOR + "folder3" VCPKG_PREFERRED_SEPARATOR "file7.txt", + }}; + +TEST_CASE ("Testing strip_map, strip = 1", "[z-extract]") +{ + REQUIRE( + get_archive_deploy_operations(archive, {StripMode::Manual, 1}) == + std::vector>{ + {FILE_1, BASE_PATH "folder1" VCPKG_PREFERRED_SEPARATOR "file1.txt"}, + {FILE_2, BASE_PATH "folder1" VCPKG_PREFERRED_SEPARATOR "file2.txt"}, + {FILE_3, BASE_PATH "folder1" VCPKG_PREFERRED_SEPARATOR "file3.txt"}, + {FILE_4, BASE_PATH "folder2" VCPKG_PREFERRED_SEPARATOR "file4.txt"}, + {FILE_5, BASE_PATH "folder2" VCPKG_PREFERRED_SEPARATOR "file5.txt"}, + {FILE_6, BASE_PATH "folder2" VCPKG_PREFERRED_SEPARATOR "folder3" VCPKG_PREFERRED_SEPARATOR "file6.txt"}, + {FILE_7, BASE_PATH "folder2" VCPKG_PREFERRED_SEPARATOR "folder3" VCPKG_PREFERRED_SEPARATOR "file7.txt"}}); +} + +TEST_CASE ("Testing strip_map, strip = 2", "[z-extract]") +{ + REQUIRE(get_archive_deploy_operations(archive, {StripMode::Manual, 2}) == + std::vector>{{FILE_1, BASE_PATH "file1.txt"}, + {FILE_2, BASE_PATH "file2.txt"}, + {FILE_3, BASE_PATH "file3.txt"}, + {FILE_4, BASE_PATH "file4.txt"}, + {FILE_5, BASE_PATH "file5.txt"}, + {FILE_6, BASE_PATH "folder3" VCPKG_PREFERRED_SEPARATOR "file6.txt"}, + {FILE_7, BASE_PATH "folder3" VCPKG_PREFERRED_SEPARATOR "file7.txt"}}); +} + +TEST_CASE ("Testing strip_map, strip = 3 (Max archive depth)", "[z-extract]") +{ + REQUIRE(get_archive_deploy_operations(archive, {StripMode::Manual, 3}) == + std::vector>{{FILE_6, BASE_PATH "file6.txt"}, {FILE_7, BASE_PATH "file7.txt"}}); +} + +TEST_CASE ("Testing strip_map, strip = AUTO => remove all common prefixes from path", "z-extract") +{ + REQUIRE( + get_archive_deploy_operations(archive, {StripMode::Automatic, -1}) == + std::vector>{ + {FILE_1, BASE_PATH "folder1" VCPKG_PREFERRED_SEPARATOR "file1.txt"}, + {FILE_2, BASE_PATH "folder1" VCPKG_PREFERRED_SEPARATOR "file2.txt"}, + {FILE_3, BASE_PATH "folder1" VCPKG_PREFERRED_SEPARATOR "file3.txt"}, + {FILE_4, BASE_PATH "folder2" VCPKG_PREFERRED_SEPARATOR "file4.txt"}, + {FILE_5, BASE_PATH "folder2" VCPKG_PREFERRED_SEPARATOR "file5.txt"}, + {FILE_6, BASE_PATH "folder2" VCPKG_PREFERRED_SEPARATOR "folder3" VCPKG_PREFERRED_SEPARATOR "file6.txt"}, + {FILE_7, BASE_PATH "folder2" VCPKG_PREFERRED_SEPARATOR "folder3" VCPKG_PREFERRED_SEPARATOR "file7.txt"}}); +} + +TEST_CASE ("Testing strip auto's get_common_prefix_count", "z-extract") +{ + REQUIRE(1 == get_common_directories_count( + {"folder0" VCPKG_PREFERRED_SEPARATOR "folder1" VCPKG_PREFERRED_SEPARATOR "file1.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder1" VCPKG_PREFERRED_SEPARATOR "file2.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder1" VCPKG_PREFERRED_SEPARATOR "file3.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder2" VCPKG_PREFERRED_SEPARATOR "file4.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder2" VCPKG_PREFERRED_SEPARATOR "file5.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder2" VCPKG_PREFERRED_SEPARATOR + "folder3" VCPKG_PREFERRED_SEPARATOR "file6.txt", + "folder0" VCPKG_PREFERRED_SEPARATOR "folder2" VCPKG_PREFERRED_SEPARATOR + "folder3" VCPKG_PREFERRED_SEPARATOR "file7.txt"})); + + REQUIRE(0 == get_common_directories_count( + {"folder1" VCPKG_PREFERRED_SEPARATOR "file1.txt", + "folder1" VCPKG_PREFERRED_SEPARATOR "file2.txt", + "folder1" VCPKG_PREFERRED_SEPARATOR "file3.txt", + "folder2" VCPKG_PREFERRED_SEPARATOR "file4.txt", + "folder2" VCPKG_PREFERRED_SEPARATOR "file5.txt", + "folder2" VCPKG_PREFERRED_SEPARATOR "folder3" VCPKG_PREFERRED_SEPARATOR "file6.txt", + "folder2" VCPKG_PREFERRED_SEPARATOR "folder3" VCPKG_PREFERRED_SEPARATOR "file7.txt"})); + + REQUIRE(0 == get_common_directories_count({})); + REQUIRE(0 == get_common_directories_count({"file1.txt", "file2.txt"})); + REQUIRE(0 == get_common_directories_count({"file1.txt"})); + REQUIRE(1 == get_common_directories_count({"folder1" VCPKG_PREFERRED_SEPARATOR "file1.txt"})); +} + +TEST_CASE ("Testing get_strip_setting", "z-extract") +{ + std::map> settings; + + SECTION ("Test no strip") + { + REQUIRE(StripSetting{StripMode::Manual, 0} == get_strip_setting(settings).value_or_exit(VCPKG_LINE_INFO)); + } + + SECTION ("Test Manual strip with count of 1") + { + settings["strip"] = "1"; + REQUIRE(StripSetting{StripMode::Manual, 1} == get_strip_setting(settings).value_or_exit(VCPKG_LINE_INFO)); + settings.clear(); + } + + SECTION ("Test Manual strip with count greater than 1") + { + settings["strip"] = "5000"; + REQUIRE(StripSetting{StripMode::Manual, 5000} == get_strip_setting(settings).value_or_exit(VCPKG_LINE_INFO)); + settings.clear(); + } + + SECTION ("Test Automatic strip") + { + settings["strip"] = "auto"; + REQUIRE(StripSetting{StripMode::Automatic, -1} == get_strip_setting(settings).value_or_exit(VCPKG_LINE_INFO)); + settings.clear(); + settings["strip"] = "AUTO"; + REQUIRE(StripSetting{StripMode::Automatic, -1} == get_strip_setting(settings).value_or_exit(VCPKG_LINE_INFO)); + settings.clear(); + settings["strip"] = "AuTo"; + REQUIRE(StripSetting{StripMode::Automatic, -1} == get_strip_setting(settings).value_or_exit(VCPKG_LINE_INFO)); + settings.clear(); + } + + SECTION ("Bad strip values rejected") + { + settings["strip"] = "-42"; + auto answer = get_strip_setting(settings); + REQUIRE(!answer); + REQUIRE(answer.error() == + LocalizedString::from_raw("error: --strip must be set to a nonnegative integer or 'AUTO'.")); + settings.clear(); + } +} diff --git a/src/vcpkg-test/install.cpp b/src/vcpkg-test/commands.install.cpp similarity index 99% rename from src/vcpkg-test/install.cpp rename to src/vcpkg-test/commands.install.cpp index 24e752379a..5a39c8a793 100644 --- a/src/vcpkg-test/install.cpp +++ b/src/vcpkg-test/commands.install.cpp @@ -1,6 +1,6 @@ #include -#include +#include using namespace vcpkg; diff --git a/src/vcpkg-test/configparser.cpp b/src/vcpkg-test/configparser.cpp index f8dc49a72e..9ea3c75da4 100644 --- a/src/vcpkg-test/configparser.cpp +++ b/src/vcpkg-test/configparser.cpp @@ -34,42 +34,42 @@ namespace TEST_CASE ("BinaryConfigParser empty", "[binaryconfigparser]") { - auto parsed = create_binary_providers_from_configs_pure("", {}); + auto parsed = parse_binary_provider_configs("", {}); REQUIRE(parsed.has_value()); } TEST_CASE ("BinaryConfigParser unacceptable provider", "[binaryconfigparser]") { - auto parsed = create_binary_providers_from_configs_pure("unacceptable", {}); + auto parsed = parse_binary_provider_configs("unacceptable", {}); REQUIRE(!parsed.has_value()); } TEST_CASE ("BinaryConfigParser files provider", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("files", {}); + auto parsed = parse_binary_provider_configs("files", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files,relative-path", {}); + auto parsed = parse_binary_provider_configs("files,relative-path", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files,C:foo", {}); + auto parsed = parse_binary_provider_configs("files,C:foo", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH, {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH, {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"files"}}); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH ",nonsense", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH ",nonsense", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH ",read", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH ",read", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"files"}}); @@ -77,14 +77,14 @@ TEST_CASE ("BinaryConfigParser files provider", "[binaryconfigparser]") REQUIRE(!Util::Vectors::contains(state.archives_to_write, ABSOLUTE_PATH)); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH ",write", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH ",write", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"files"}}); REQUIRE(!state.archives_to_write.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH ",readwrite", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH ",readwrite", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"files"}}); @@ -92,11 +92,11 @@ TEST_CASE ("BinaryConfigParser files provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_read.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH ",readwrite,extra", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH ",readwrite,extra", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files,,upload", {}); + auto parsed = parse_binary_provider_configs("files,,upload", {}); REQUIRE(!parsed.has_value()); } } @@ -104,36 +104,36 @@ TEST_CASE ("BinaryConfigParser files provider", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser nuget source provider", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("nuget", {}); + auto parsed = parse_binary_provider_configs("nuget", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nuget,relative-path", {}); + auto parsed = parse_binary_provider_configs("nuget,relative-path", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"nuget"}}); validate_readonly_sources(state, "relative-path"); } { - auto parsed = create_binary_providers_from_configs_pure("nuget,http://example.org/", {}); + auto parsed = parse_binary_provider_configs("nuget,http://example.org/", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"nuget"}}); validate_readonly_sources(state, "http://example.org/"); } { - auto parsed = create_binary_providers_from_configs_pure("nuget," ABSOLUTE_PATH, {}); + auto parsed = parse_binary_provider_configs("nuget," ABSOLUTE_PATH, {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); validate_readonly_sources(state, ABSOLUTE_PATH); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"nuget"}}); } { - auto parsed = create_binary_providers_from_configs_pure("nuget," ABSOLUTE_PATH ",nonsense", {}); + auto parsed = parse_binary_provider_configs("nuget," ABSOLUTE_PATH ",nonsense", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nuget," ABSOLUTE_PATH ",readwrite", {}); + auto parsed = parse_binary_provider_configs("nuget," ABSOLUTE_PATH ",readwrite", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); CHECK(state.sources_to_read.size() == 1); @@ -145,11 +145,11 @@ TEST_CASE ("BinaryConfigParser nuget source provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_read.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("nuget," ABSOLUTE_PATH ",readwrite,extra", {}); + auto parsed = parse_binary_provider_configs("nuget," ABSOLUTE_PATH ",readwrite,extra", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nuget,,readwrite", {}); + auto parsed = parse_binary_provider_configs("nuget,,readwrite", {}); REQUIRE(!parsed.has_value()); } } @@ -157,38 +157,38 @@ TEST_CASE ("BinaryConfigParser nuget source provider", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser nuget timeout", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("nugettimeout,3601", {}); + auto parsed = parse_binary_provider_configs("nugettimeout,3601", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"nuget"}}); REQUIRE(state.nugettimeout == std::string{"3601"}); } { - auto parsed = create_binary_providers_from_configs_pure("nugettimeout", {}); + auto parsed = parse_binary_provider_configs("nugettimeout", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugettimeout,", {}); + auto parsed = parse_binary_provider_configs("nugettimeout,", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugettimeout,nonsense", {}); + auto parsed = parse_binary_provider_configs("nugettimeout,nonsense", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugettimeout,0", {}); + auto parsed = parse_binary_provider_configs("nugettimeout,0", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugettimeout,12x", {}); + auto parsed = parse_binary_provider_configs("nugettimeout,12x", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugettimeout,-321", {}); + auto parsed = parse_binary_provider_configs("nugettimeout,-321", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugettimeout,321,123", {}); + auto parsed = parse_binary_provider_configs("nugettimeout,321,123", {}); REQUIRE(!parsed.has_value()); } } @@ -196,27 +196,27 @@ TEST_CASE ("BinaryConfigParser nuget timeout", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser nuget config provider", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig", {}); + auto parsed = parse_binary_provider_configs("nugetconfig", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig,relative-path", {}); + auto parsed = parse_binary_provider_configs("nugetconfig,relative-path", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig,http://example.org/", {}); + auto parsed = parse_binary_provider_configs("nugetconfig,http://example.org/", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig," ABSOLUTE_PATH, {}); + auto parsed = parse_binary_provider_configs("nugetconfig," ABSOLUTE_PATH, {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig," ABSOLUTE_PATH ",nonsense", {}); + auto parsed = parse_binary_provider_configs("nugetconfig," ABSOLUTE_PATH ",nonsense", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig," ABSOLUTE_PATH ",read", {}); + auto parsed = parse_binary_provider_configs("nugetconfig," ABSOLUTE_PATH ",read", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); CHECK(state.configs_to_write.empty()); @@ -226,7 +226,7 @@ TEST_CASE ("BinaryConfigParser nuget config provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_read.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig," ABSOLUTE_PATH ",write", {}); + auto parsed = parse_binary_provider_configs("nugetconfig," ABSOLUTE_PATH ",write", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); CHECK(state.configs_to_read.empty()); @@ -236,7 +236,7 @@ TEST_CASE ("BinaryConfigParser nuget config provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_write.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig," ABSOLUTE_PATH ",readwrite", {}); + auto parsed = parse_binary_provider_configs("nugetconfig," ABSOLUTE_PATH ",readwrite", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); CHECK(state.configs_to_read.size() == 1); @@ -248,11 +248,11 @@ TEST_CASE ("BinaryConfigParser nuget config provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_read.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig," ABSOLUTE_PATH ",readwrite,extra", {}); + auto parsed = parse_binary_provider_configs("nugetconfig," ABSOLUTE_PATH ",readwrite,extra", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("nugetconfig,,readwrite", {}); + auto parsed = parse_binary_provider_configs("nugetconfig,,readwrite", {}); REQUIRE(!parsed.has_value()); } } @@ -260,31 +260,31 @@ TEST_CASE ("BinaryConfigParser nuget config provider", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser default provider", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("default", {}); + auto parsed = parse_binary_provider_configs("default", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); } { - auto parsed = create_binary_providers_from_configs_pure("default,nonsense", {}); + auto parsed = parse_binary_provider_configs("default,nonsense", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("default,read", {}); + auto parsed = parse_binary_provider_configs("default,read", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(!state.archives_to_read.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("default,readwrite", {}); + auto parsed = parse_binary_provider_configs("default,readwrite", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(!state.archives_to_read.empty()); REQUIRE(!state.archives_to_write.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("default,write", {}); + auto parsed = parse_binary_provider_configs("default,write", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(!state.archives_to_write.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("default,read,extra", {}); + auto parsed = parse_binary_provider_configs("default,read,extra", {}); REQUIRE(!parsed.has_value()); } } @@ -292,11 +292,11 @@ TEST_CASE ("BinaryConfigParser default provider", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser clear provider", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("clear", {}); + auto parsed = parse_binary_provider_configs("clear", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("clear,upload", {}); + auto parsed = parse_binary_provider_configs("clear,upload", {}); REQUIRE(!parsed.has_value()); } } @@ -304,11 +304,11 @@ TEST_CASE ("BinaryConfigParser clear provider", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser interactive provider", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("interactive", {}); + auto parsed = parse_binary_provider_configs("interactive", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("interactive,read", {}); + auto parsed = parse_binary_provider_configs("interactive,read", {}); REQUIRE(!parsed.has_value()); } } @@ -316,35 +316,35 @@ TEST_CASE ("BinaryConfigParser interactive provider", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser multiple providers", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("clear;default", {}); + auto parsed = parse_binary_provider_configs("clear;default", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("clear;default,read", {}); + auto parsed = parse_binary_provider_configs("clear;default,read", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("clear;default,write", {}); + auto parsed = parse_binary_provider_configs("clear;default,write", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("clear;default,readwrite", {}); + auto parsed = parse_binary_provider_configs("clear;default,readwrite", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("clear;default,readwrite;clear;clear", {}); + auto parsed = parse_binary_provider_configs("clear;default,readwrite;clear;clear", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("clear;files,relative;default", {}); + auto parsed = parse_binary_provider_configs("clear;files,relative;default", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure(";;;clear;;;;", {}); + auto parsed = parse_binary_provider_configs(";;;clear;;;;", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure(";;;,;;;;", {}); + auto parsed = parse_binary_provider_configs(";;;,;;;;", {}); REQUIRE(!parsed.has_value()); } } @@ -352,38 +352,38 @@ TEST_CASE ("BinaryConfigParser multiple providers", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser escaping", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure(";;;;;;;`", {}); + auto parsed = parse_binary_provider_configs(";;;;;;;`", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure(";;;;;;;`defaul`t", {}); + auto parsed = parse_binary_provider_configs(";;;;;;;`defaul`t", {}); REQUIRE(parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH "`", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH "`", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH "`,", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH "`,", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"files"}}); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH "``", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH "``", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"files"}}); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH "```", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH "```", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH "````", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH "````", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"files"}}); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH ",", {}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH ",", {}); REQUIRE(!parsed.has_value()); } } @@ -391,32 +391,28 @@ TEST_CASE ("BinaryConfigParser escaping", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser args", "[binaryconfigparser]") { { - auto parsed = - create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH, std::vector{"clear"}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH, std::vector{"clear"}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{"clear"}); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH, - std::vector{"clear;default"}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH, std::vector{"clear;default"}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"clear"}, {"default"}}); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH, - std::vector{"clear;default,"}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH, std::vector{"clear;default,"}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH, - std::vector{"clear", "clear;default,"}); + auto parsed = + parse_binary_provider_configs("files," ABSOLUTE_PATH, std::vector{"clear", "clear;default,"}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("files," ABSOLUTE_PATH, - std::vector{"clear", "clear"}); + auto parsed = parse_binary_provider_configs("files," ABSOLUTE_PATH, std::vector{"clear", "clear"}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{"clear"}); @@ -427,7 +423,7 @@ TEST_CASE ("BinaryConfigParser azblob provider", "[binaryconfigparser]") { UrlTemplate url_temp; { - auto parsed = create_binary_providers_from_configs_pure("x-azblob,https://azure/container,sas", {}); + auto parsed = parse_binary_provider_configs("x-azblob,https://azure/container,sas", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"azblob"}, {"default"}}); @@ -435,23 +431,23 @@ TEST_CASE ("BinaryConfigParser azblob provider", "[binaryconfigparser]") REQUIRE(state.secrets == std::vector{"sas"}); } { - auto parsed = create_binary_providers_from_configs_pure("x-azblob,https://azure/container,?sas", {}); + auto parsed = parse_binary_provider_configs("x-azblob,https://azure/container,?sas", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("x-azblob,,sas", {}); + auto parsed = parse_binary_provider_configs("x-azblob,,sas", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("x-azblob,https://azure/container", {}); + auto parsed = parse_binary_provider_configs("x-azblob,https://azure/container", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("x-azblob,https://azure/container,sas,invalid", {}); + auto parsed = parse_binary_provider_configs("x-azblob,https://azure/container,sas,invalid", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("x-azblob,https://azure/container,sas,read", {}); + auto parsed = parse_binary_provider_configs("x-azblob,https://azure/container,sas,read", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"azblob"}, {"default"}}); @@ -460,7 +456,7 @@ TEST_CASE ("BinaryConfigParser azblob provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_read.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("x-azblob,https://azure/container,sas,write", {}); + auto parsed = parse_binary_provider_configs("x-azblob,https://azure/container,sas,write", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"azblob"}, {"default"}}); @@ -471,7 +467,7 @@ TEST_CASE ("BinaryConfigParser azblob provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_write.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("x-azblob,https://azure/container,sas,readwrite", {}); + auto parsed = parse_binary_provider_configs("x-azblob,https://azure/container,sas,readwrite", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"azblob"}, {"default"}}); @@ -488,29 +484,29 @@ TEST_CASE ("BinaryConfigParser azblob provider", "[binaryconfigparser]") TEST_CASE ("BinaryConfigParser GCS provider", "[binaryconfigparser]") { { - auto parsed = create_binary_providers_from_configs_pure("x-gcs,gs://my-bucket/", {}); + auto parsed = parse_binary_provider_configs("x-gcs,gs://my-bucket/", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.gcs_read_prefixes == std::vector{"gs://my-bucket/"}); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"gcs"}}); } { - auto parsed = create_binary_providers_from_configs_pure("x-gcs,gs://my-bucket/my-folder", {}); + auto parsed = parse_binary_provider_configs("x-gcs,gs://my-bucket/my-folder", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.gcs_read_prefixes == std::vector{"gs://my-bucket/my-folder/"}); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"gcs"}}); } { - auto parsed = create_binary_providers_from_configs_pure("x-gcs,", {}); + auto parsed = parse_binary_provider_configs("x-gcs,", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("x-gcs,gs://my-bucket/my-folder,invalid", {}); + auto parsed = parse_binary_provider_configs("x-gcs,gs://my-bucket/my-folder,invalid", {}); REQUIRE(!parsed.has_value()); } { - auto parsed = create_binary_providers_from_configs_pure("x-gcs,gs://my-bucket/my-folder,read", {}); + auto parsed = parse_binary_provider_configs("x-gcs,gs://my-bucket/my-folder,read", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"gcs"}}); @@ -518,7 +514,7 @@ TEST_CASE ("BinaryConfigParser GCS provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_read.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("x-gcs,gs://my-bucket/my-folder,write", {}); + auto parsed = parse_binary_provider_configs("x-gcs,gs://my-bucket/my-folder,write", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"gcs"}}); @@ -526,7 +522,7 @@ TEST_CASE ("BinaryConfigParser GCS provider", "[binaryconfigparser]") REQUIRE(!state.archives_to_write.empty()); } { - auto parsed = create_binary_providers_from_configs_pure("x-gcs,gs://my-bucket/my-folder,readwrite", {}); + auto parsed = parse_binary_provider_configs("x-gcs,gs://my-bucket/my-folder,readwrite", {}); auto state = parsed.value_or_exit(VCPKG_LINE_INFO); REQUIRE(state.binary_cache_providers == std::set{{"default"}, {"gcs"}}); diff --git a/src/vcpkg-test/dependencies.cpp b/src/vcpkg-test/dependencies.cpp index ed1180039c..359e4233ae 100644 --- a/src/vcpkg-test/dependencies.cpp +++ b/src/vcpkg-test/dependencies.cpp @@ -1,13 +1,18 @@ #include +#include + +#include #include +#include #include #include #include #include #include +#include #include #include @@ -29,7 +34,8 @@ struct MockBaselineProvider : IBaselineProvider ExpectedL get_baseline_version(StringView name) const override { auto it = v.find(name); - if (it == v.end()) return LocalizedString::from_raw("error"); + if (it == v.end()) + return LocalizedString::from_raw("MockBaselineProvider::get_baseline_version(" + name.to_string() + ")"); return it->second; } }; @@ -60,18 +66,9 @@ struct MockVersionedPortfileProvider : IVersionedPortfileProvider Version&& version, VersionScheme scheme = VersionScheme::String) { -#if defined(__cpp_lib_map_try_emplace) && __cpp_lib_map_try_emplace >= 201411 - auto it = v.try_emplace(name).first; -#else // ^^^ has try_emplace / no try_emplace vvv - auto it = v.find(name); - if (it == v.end()) - { - it = v.emplace(std::piecewise_construct, std::forward_as_tuple(name), std::forward_as_tuple()).first; - } -#endif - - auto it2 = it->second.find(version); - if (it2 == it->second.end()) + auto&& version_map = v[name]; + auto it2 = version_map.find(version); + if (it2 == version_map.end()) { auto scf = std::make_unique(); auto core = std::make_unique(); @@ -80,15 +77,21 @@ struct MockVersionedPortfileProvider : IVersionedPortfileProvider core->port_version = version.port_version(); core->version_scheme = scheme; scf->core_paragraph = std::move(core); - it2 = it->second.emplace(version, SourceControlFileAndLocation{std::move(scf), name}).first; + it2 = version_map.emplace(version, SourceControlFileAndLocation{std::move(scf), name}).first; } return it2->second; } +}; - virtual void load_all_control_files(std::map&) const override +struct CoreDependency : Dependency +{ + CoreDependency(std::string name, + std::vector features = {}, + PlatformExpression::Expr platform = {}) + : Dependency{std::move(name), std::move(features), std::move(platform)} { - Checks::unreachable(VCPKG_LINE_INFO); + default_features = false; } }; @@ -204,17 +207,17 @@ struct MockOverlayProvider : IOverlayProvider SourceControlFileAndLocation& emplace(const std::string& name) { return emplace(name, {"1", 0}); } - virtual void load_all_control_files(std::map&) const override - { - Checks::unreachable(VCPKG_LINE_INFO); - } - private: std::map> mappings; }; static const MockOverlayProvider s_empty_mock_overlay; +#define WITH_EXPECTED(id, expr) \ + auto id##_storage = (expr); \ + REQUIRE(id##_storage.has_value()); \ + auto& id = *id##_storage.get() + static ExpectedL create_versioned_install_plan(const IVersionedPortfileProvider& provider, const IBaselineProvider& bprovider, const CMakeVars::CMakeVarProvider& var_provider, @@ -229,8 +232,7 @@ static ExpectedL create_versioned_install_plan(const IVersionedPortf deps, overrides, toplevel, - Test::ARM_UWP, - UnsupportedPortAction::Error); + {Test::ARM_UWP, "pkgs", UnsupportedPortAction::Error}); } static ExpectedL create_versioned_install_plan(const IVersionedPortfileProvider& provider, @@ -248,8 +250,7 @@ static ExpectedL create_versioned_install_plan(const IVersionedPortf deps, overrides, toplevel, - Test::ARM_UWP, - UnsupportedPortAction::Error); + {Test::ARM_UWP, "pkgs", UnsupportedPortAction::Error}); } TEST_CASE ("basic version install single", "[versionplan]") @@ -262,8 +263,7 @@ TEST_CASE ("basic version install single", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {{"a"}}, {}, toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, create_versioned_install_plan(vp, bp, var_provider, {{"a"}}, {}, toplevel_spec())); REQUIRE(install_plan.size() == 1); REQUIRE(install_plan.install_actions.at(0).spec.name() == "a"); @@ -288,6 +288,7 @@ TEST_CASE ("basic version install detect cycle", "[versionplan]") auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {{"a"}}, {}, toplevel_spec()); REQUIRE(!install_plan.has_value()); + REQUIRE(install_plan.error() == "error: cycle detected during a:x86-windows:\na:x86-windows@1\nb:x86-windows@1"); } TEST_CASE ("basic version install scheme", "[versionplan]") @@ -304,16 +305,19 @@ TEST_CASE ("basic version install scheme", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {{"a"}}, {}, toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, create_versioned_install_plan(vp, bp, var_provider, {{"a"}}, {}, toplevel_spec())); - CHECK(install_plan.size() == 2); + REQUIRE(install_plan.size() == 2); + CHECK(install_plan.install_actions[0].spec.name() == "b"); + CHECK(install_plan.install_actions[1].spec.name() == "a"); - StringLiteral names[] = {"b", "a"}; - for (size_t i = 0; i < install_plan.install_actions.size() && i < 2; ++i) - { - CHECK(install_plan.install_actions[i].spec.name() == names[i]); - } + REQUIRE(install_plan.install_actions[1].package_dependencies.size() == 1); + CHECK(install_plan.install_actions[1].package_dependencies[0].name() == "b"); + + auto it = install_plan.install_actions[1].feature_dependencies.find("core"); + REQUIRE(it != install_plan.install_actions[1].feature_dependencies.end()); + REQUIRE(it->second.size() == 1); + REQUIRE(it->second[0].port() == "b"); } TEST_CASE ("basic version install scheme diamond", "[versionplan]") @@ -340,16 +344,24 @@ TEST_CASE ("basic version install scheme diamond", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {{"a"}}, {}, toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, create_versioned_install_plan(vp, bp, var_provider, {{"a"}}, {}, toplevel_spec())); - CHECK(install_plan.size() == 4); + REQUIRE(install_plan.size() == 4); + CHECK(install_plan.install_actions[0].spec.name() == "d"); + CHECK(install_plan.install_actions[1].spec.name() == "c"); + CHECK(install_plan.install_actions[2].spec.name() == "b"); + CHECK(install_plan.install_actions[3].spec.name() == "a"); - StringLiteral names[] = {"d", "c", "b", "a"}; - for (size_t i = 0; i < install_plan.install_actions.size() && i < 4; ++i) - { - CHECK(install_plan.install_actions[i].spec.name() == names[i]); - } + REQUIRE(install_plan.install_actions[1].package_dependencies.size() == 1); + CHECK(install_plan.install_actions[1].package_dependencies[0].name() == "d"); + + REQUIRE(install_plan.install_actions[2].package_dependencies.size() == 2); + CHECK(install_plan.install_actions[2].package_dependencies[0].name() == "c"); + CHECK(install_plan.install_actions[2].package_dependencies[1].name() == "d"); + + REQUIRE(install_plan.install_actions[3].package_dependencies.size() == 2); + CHECK(install_plan.install_actions[3].package_dependencies[0].name() == "b"); + CHECK(install_plan.install_actions[3].package_dependencies[1].name() == "c"); } TEST_CASE ("basic version install scheme baseline missing", "[versionplan]") @@ -364,9 +376,10 @@ TEST_CASE ("basic version install scheme baseline missing", "[versionplan]") auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {{"a"}}, {}, toplevel_spec()); REQUIRE(!install_plan.has_value()); + REQUIRE(install_plan.error() == "MockBaselineProvider::get_baseline_version(a)"); } -TEST_CASE ("basic version install scheme baseline missing success", "[versionplan]") +TEST_CASE ("basic version install scheme baseline missing 2", "[versionplan]") { MockBaselineProvider bp; @@ -385,11 +398,10 @@ TEST_CASE ("basic version install scheme baseline missing success", "[versionpla Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "2"}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + toplevel_spec()); - REQUIRE(install_plan.size() == 1); - check_name_and_version(install_plan.install_actions[0], "a", {"2", 0}); + REQUIRE(!install_plan.has_value()); + REQUIRE(install_plan.error() == "MockBaselineProvider::get_baseline_version(a)"); } TEST_CASE ("basic version install scheme baseline", "[versionplan]") @@ -452,6 +464,19 @@ TEST_CASE ("version install scheme baseline conflict", "[versionplan]") toplevel_spec()); REQUIRE(!install_plan.has_value()); + REQUIRE_LINES( + install_plan.error(), + R"(error: version conflict on a:x86-windows: toplevel-spec required 3, which cannot be compared with the baseline version 2. + +Both versions have scheme string but different primary text. + +This can be resolved by adding an explicit override to the preferred version. For example: + + "overrides": [ + { "name": "a", "version": "2" } + ] + +See `vcpkg help versioning` or https://learn.microsoft.com/vcpkg/users/versioning for more information.)"); } TEST_CASE ("version install string port version", "[versionplan]") @@ -513,6 +538,7 @@ TEST_CASE ("version install transitive string", "[versionplan]") { MockBaselineProvider bp; bp.v["a"] = {"2", 0}; + bp.v["b"] = {"2", 0}; MockVersionedPortfileProvider vp; vp.emplace("a", {"2", 0}).source_control_file->core_paragraph->dependencies = { @@ -526,7 +552,7 @@ TEST_CASE ("version install transitive string", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = + auto install_plan1 = create_versioned_install_plan(vp, bp, var_provider, @@ -534,9 +560,9 @@ TEST_CASE ("version install transitive string", "[versionplan]") Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "2", 1}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); - + toplevel_spec()); + REQUIRE(install_plan1.has_value()); + auto& install_plan = *install_plan1.get(); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "b", {"2", 0}); CHECK(install_plan.install_actions[0].request_type == RequestType::AUTO_SELECTED); @@ -607,6 +633,7 @@ TEST_CASE ("version install diamond relaxed", "[versionplan]") MockBaselineProvider bp; bp.v["a"] = {"2", 0}; bp.v["b"] = {"3", 0}; + bp.v["c"] = {"5", 1}; MockVersionedPortfileProvider vp; vp.emplace("a", {"2", 0}, VersionScheme::Relaxed); @@ -623,17 +650,16 @@ TEST_CASE ("version install diamond relaxed", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = - create_versioned_install_plan(vp, - bp, - var_provider, - { - Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "3", 0}}, - Dependency{"b", {}, {}, {VersionConstraintKind::Minimum, "2", 1}}, - }, - {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + { + Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "3", 0}}, + Dependency{"b", {}, {}, {VersionConstraintKind::Minimum, "2", 1}}, + }, + {}, + toplevel_spec())); REQUIRE(install_plan.size() == 3); check_name_and_version(install_plan.install_actions[0], "c", {"9", 2}); @@ -917,6 +943,7 @@ TEST_CASE ("version install diamond semver", "[versionplan]") MockBaselineProvider bp; bp.v["a"] = {"2.0.0", 0}; bp.v["b"] = {"3.0.0", 0}; + bp.v["c"] = {"5.0.0", 1}; MockVersionedPortfileProvider vp; vp.emplace("a", {"2.0.0", 0}, VersionScheme::Semver); @@ -933,7 +960,8 @@ TEST_CASE ("version install diamond semver", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = + WITH_EXPECTED( + install_plan, create_versioned_install_plan(vp, bp, var_provider, @@ -942,8 +970,7 @@ TEST_CASE ("version install diamond semver", "[versionplan]") Dependency{"b", {}, {}, {VersionConstraintKind::Minimum, "2.0.0", 1}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + toplevel_spec())); REQUIRE(install_plan.size() == 3); check_name_and_version(install_plan.install_actions[0], "c", {"9.0.0", 2}); @@ -962,7 +989,8 @@ TEST_CASE ("version install simple date", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = + WITH_EXPECTED( + install_plan, create_versioned_install_plan(vp, bp, var_provider, @@ -970,8 +998,7 @@ TEST_CASE ("version install simple date", "[versionplan]") Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "2020-03-01", 0}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + toplevel_spec())); REQUIRE(install_plan.size() == 1); check_name_and_version(install_plan.install_actions[0], "a", {"2020-03-01", 0}); @@ -993,7 +1020,8 @@ TEST_CASE ("version install transitive date", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = + WITH_EXPECTED( + install_plan, create_versioned_install_plan(vp, bp, var_provider, @@ -1001,8 +1029,7 @@ TEST_CASE ("version install transitive date", "[versionplan]") Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "2020-01-01.3", 0}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + toplevel_spec())); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "b", {"2020-01-01.3", 0}); @@ -1014,6 +1041,7 @@ TEST_CASE ("version install diamond date", "[versionplan]") MockBaselineProvider bp; bp.v["a"] = {"2020-01-02", 0}; bp.v["b"] = {"2020-01-03", 0}; + bp.v["c"] = {"2020-01-05", 1}; MockVersionedPortfileProvider vp; vp.emplace("a", {"2020-01-02", 0}, VersionScheme::Date); @@ -1030,7 +1058,8 @@ TEST_CASE ("version install diamond date", "[versionplan]") MockCMakeVarProvider var_provider; - auto install_plan = + WITH_EXPECTED( + install_plan, create_versioned_install_plan(vp, bp, var_provider, @@ -1039,8 +1068,7 @@ TEST_CASE ("version install diamond date", "[versionplan]") Dependency{"b", {}, {}, {VersionConstraintKind::Minimum, "2020-01-02", 1}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + toplevel_spec())); REQUIRE(install_plan.size() == 3); check_name_and_version(install_plan.install_actions[0], "c", {"2020-01-09", 2}); @@ -1048,18 +1076,6 @@ TEST_CASE ("version install diamond date", "[versionplan]") check_name_and_version(install_plan.install_actions[2], "a", {"2020-01-03", 0}); } -static void CHECK_LINES(const LocalizedString& a, const std::string& b) -{ - auto as = Strings::split(a.data(), '\n'); - auto bs = Strings::split(b, '\n'); - for (size_t i = 0; i < as.size() && i < bs.size(); ++i) - { - INFO(i); - CHECK(as[i] == bs[i]); - } - CHECK(as.size() == bs.size()); -} - TEST_CASE ("version install scheme failure", "[versionplan]") { MockVersionedPortfileProvider vp; @@ -1083,21 +1099,21 @@ TEST_CASE ("version install scheme failure", "[versionplan]") toplevel_spec()); REQUIRE(!install_plan.error().empty()); - CHECK_LINES( + REQUIRE_LINES( install_plan.error(), - R"(error: version conflict on a:x86-windows: baseline required 1.0.0 but vcpkg could not compare it to 1.0.1. + R"(error: version conflict on a:x86-windows: toplevel-spec required 1.0.1, which cannot be compared with the baseline version 1.0.0. -The two versions used incomparable schemes: - "1.0.1" was of scheme string - "1.0.0" was of scheme semver +The versions have incomparable schemes: + a@1.0.0 has scheme semver + a@1.0.1 has scheme string -This can be resolved by adding an explicit override to the preferred version, for example: +This can be resolved by adding an explicit override to the preferred version. For example: - "overrides": [ - { "name": "a", "version": "1.0.1" } - ] + "overrides": [ + { "name": "a", "version": "1.0.0" } + ] -See `vcpkg help versioning` for more information.)"); +See `vcpkg help versioning` or https://learn.microsoft.com/vcpkg/users/versioning for more information.)"); } SECTION ("higher baseline") { @@ -1113,21 +1129,21 @@ See `vcpkg help versioning` for more information.)"); toplevel_spec()); REQUIRE(!install_plan.error().empty()); - CHECK_LINES( + REQUIRE_LINES( install_plan.error(), - R"(error: version conflict on a:x86-windows: baseline required 1.0.2 but vcpkg could not compare it to 1.0.1. + R"(error: version conflict on a:x86-windows: toplevel-spec required 1.0.1, which cannot be compared with the baseline version 1.0.2. -The two versions used incomparable schemes: - "1.0.1" was of scheme string - "1.0.2" was of scheme semver +The versions have incomparable schemes: + a@1.0.2 has scheme semver + a@1.0.1 has scheme string -This can be resolved by adding an explicit override to the preferred version, for example: +This can be resolved by adding an explicit override to the preferred version. For example: - "overrides": [ - { "name": "a", "version": "1.0.1" } - ] + "overrides": [ + { "name": "a", "version": "1.0.2" } + ] -See `vcpkg help versioning` for more information.)"); +See `vcpkg help versioning` or https://learn.microsoft.com/vcpkg/users/versioning for more information.)"); } } @@ -1188,10 +1204,11 @@ TEST_CASE ("version install scheme change in port version", "[versionplan]") MockCMakeVarProvider var_provider; - SECTION ("lower baseline") + SECTION ("lower baseline b") { MockBaselineProvider bp; bp.v["a"] = {"2", 0}; + bp.v["b"] = {"1", 0}; auto install_plan = create_versioned_install_plan(vp, @@ -1201,8 +1218,41 @@ TEST_CASE ("version install scheme change in port version", "[versionplan]") Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "2", 1}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + toplevel_spec()); + + REQUIRE(!install_plan.has_value()); + REQUIRE_LINES( + install_plan.error(), + R"(error: version conflict on b:x86-windows: a:x86-windows@2#1 required 1#1, which cannot be compared with the baseline version 1. + +The versions have incomparable schemes: + b@1 has scheme string + b@1#1 has scheme relaxed + +This can be resolved by adding an explicit override to the preferred version. For example: + + "overrides": [ + { "name": "b", "version": "1" } + ] + +See `vcpkg help versioning` or https://learn.microsoft.com/vcpkg/users/versioning for more information.)"); + } + SECTION ("lower baseline") + { + MockBaselineProvider bp; + bp.v["a"] = {"2", 0}; + bp.v["b"] = {"1", 1}; + + WITH_EXPECTED( + install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + { + Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "2", 1}}, + }, + {}, + toplevel_spec())); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "b", {"1", 1}); @@ -1212,8 +1262,10 @@ TEST_CASE ("version install scheme change in port version", "[versionplan]") { MockBaselineProvider bp; bp.v["a"] = {"2", 1}; + bp.v["b"] = {"1", 1}; - auto install_plan = + WITH_EXPECTED( + install_plan, create_versioned_install_plan(vp, bp, var_provider, @@ -1221,8 +1273,7 @@ TEST_CASE ("version install scheme change in port version", "[versionplan]") Dependency{"a", {}, {}, {VersionConstraintKind::Minimum, "2", 0}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + toplevel_spec())); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "b", {"1", 1}); @@ -1263,48 +1314,48 @@ TEST_CASE ("version install simple feature", "[versionplan]") SECTION ("relaxed") { - auto install_plan = create_versioned_install_plan(vp, - bp, - var_provider, - { - Dependency{"a", {"x"}}, - }, - {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + { + Dependency{"a", {{"x"}}}, + }, + {}, + toplevel_spec())); REQUIRE(install_plan.size() == 1); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}, {"x"}); } SECTION ("semver") { - auto install_plan = create_versioned_install_plan(vp, - bp, - var_provider, - { - Dependency{"semver", {"x"}}, - }, - {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + { + Dependency{"semver", {{"x"}}}, + }, + {}, + toplevel_spec())); REQUIRE(install_plan.size() == 1); - check_name_and_version(install_plan.install_actions[0], "semver", {"1.0.0", 0}, {"x"}); + check_name_and_version(install_plan.install_actions[0], "semver", {"1.0.0", 0}, {{"x"}}); } SECTION ("date") { - auto install_plan = create_versioned_install_plan(vp, - bp, - var_provider, - { - Dependency{"date", {"x"}}, - }, - {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + { + Dependency{"date", {{"x"}}}, + }, + {}, + toplevel_spec())); REQUIRE(install_plan.size() == 1); - check_name_and_version(install_plan.install_actions[0], "date", {"2020-01-01", 0}, {"x"}); + check_name_and_version(install_plan.install_actions[0], "date", {"2020-01-01", 0}, {{"x"}}); } } @@ -1317,14 +1368,13 @@ TEST_CASE ("version install simple feature", "[versionplan]") bp, var_provider, { - Dependency{"a", {"x"}, {}, {VersionConstraintKind::Minimum, "1", 0}}, + Dependency{"a", {{"x"}}, {}, {VersionConstraintKind::Minimum, "1", 0}}, }, {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + toplevel_spec()); - REQUIRE(install_plan.size() == 1); - check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}, {"x"}); + REQUIRE_FALSE(install_plan.has_value()); + REQUIRE(install_plan.error() == "MockBaselineProvider::get_baseline_version(a)"); } } @@ -1340,7 +1390,7 @@ TEST_CASE ("version install transitive features", "[versionplan]") MockVersionedPortfileProvider vp; auto a_x = make_fpgh("x"); - a_x->dependencies.push_back(Dependency{"b", {"y"}}); + a_x->dependencies.push_back(Dependency{"b", {{"y"}}}); vp.emplace("a", {"1", 0}, VersionScheme::Relaxed).source_control_file->feature_paragraphs.push_back(std::move(a_x)); auto b_y = make_fpgh("y"); @@ -1352,15 +1402,15 @@ TEST_CASE ("version install transitive features", "[versionplan]") bp.v["a"] = {"1", 0}; bp.v["b"] = {"1", 0}; - auto install_plan = create_versioned_install_plan(vp, - bp, - var_provider, - { - Dependency{"a", {"x"}}, - }, - {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + { + Dependency{"a", {{"x"}}}, + }, + {}, + toplevel_spec())); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "b", {"1", 0}, {"y"}); @@ -1372,7 +1422,7 @@ TEST_CASE ("version install transitive feature versioned", "[versionplan]") MockVersionedPortfileProvider vp; auto a_x = make_fpgh("x"); - a_x->dependencies.push_back(Dependency{"b", {"y"}, {}, {VersionConstraintKind::Minimum, "2", 0}}); + a_x->dependencies.push_back(Dependency{"b", {{"y"}}, {}, {VersionConstraintKind::Minimum, "2", 0}}); vp.emplace("a", {"1", 0}, VersionScheme::Relaxed).source_control_file->feature_paragraphs.push_back(std::move(a_x)); { @@ -1393,17 +1443,18 @@ TEST_CASE ("version install transitive feature versioned", "[versionplan]") MockBaselineProvider bp; bp.v["a"] = {"1", 0}; + bp.v["b"] = {"1", 0}; bp.v["c"] = {"1", 0}; - auto install_plan = create_versioned_install_plan(vp, - bp, - var_provider, - { - Dependency{"a", {"x"}}, - }, - {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + { + Dependency{"a", {{"x"}}}, + }, + {}, + toplevel_spec())); REQUIRE(install_plan.size() == 3); check_name_and_version(install_plan.install_actions[0], "c", {"1", 0}); @@ -1472,19 +1523,18 @@ TEST_CASE ("version install constraint-reduction", "[versionplan]") bp.v["b"] = {"1", 0}; bp.v["c"] = {"1", 0}; - auto install_plan = - create_versioned_install_plan(vp, - bp, - var_provider, - { - Dependency{"b", {}, {}, {VersionConstraintKind::Minimum, "2"}}, - }, - {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + { + Dependency{"b", {}, {}, {VersionConstraintKind::Minimum, "2"}}, + }, + {}, + toplevel_spec())); REQUIRE(install_plan.size() == 2); - check_name_and_version(install_plan.install_actions[0], "c", {"1", 0}); + check_name_and_version(install_plan.install_actions[0], "c", {"2", 0}); check_name_and_version(install_plan.install_actions[1], "b", {"2", 0}); } } @@ -1550,13 +1600,13 @@ TEST_CASE ("version install transitive overrides", "[versionplan]") bp.v["b"] = {"2", 0}; bp.v["c"] = {"2", 1}; - auto install_plan = create_versioned_install_plan(vp, - bp, - var_provider, - {Dependency{"b"}}, - {DependencyOverride{"b", "1"}, DependencyOverride{"c", "1"}}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, + bp, + var_provider, + {Dependency{"b"}}, + {DependencyOverride{"b", "1"}, DependencyOverride{"c", "1"}}, + toplevel_spec())); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "c", {"1", 0}); @@ -1569,7 +1619,7 @@ TEST_CASE ("version install default features", "[versionplan]") auto a_x = make_fpgh("x"); auto& a_scf = vp.emplace("a", {"1", 0}, VersionScheme::Relaxed).source_control_file; - a_scf->core_paragraph->default_features.emplace_back("x"); + a_scf->core_paragraph->default_features.push_back({"x"}); a_scf->feature_paragraphs.push_back(std::move(a_x)); MockCMakeVarProvider var_provider; @@ -1577,8 +1627,8 @@ TEST_CASE ("version install default features", "[versionplan]") MockBaselineProvider bp; bp.v["a"] = {"1", 0}; - auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {Dependency{"a"}}, {}, toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, + create_versioned_install_plan(vp, bp, var_provider, {Dependency{"a"}}, {}, toplevel_spec())); REQUIRE(install_plan.size() == 1); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}, {"x"}); @@ -1590,7 +1640,7 @@ TEST_CASE ("version dont install default features", "[versionplan]") auto a_x = make_fpgh("x"); auto& a_scf = vp.emplace("a", {"1", 0}, VersionScheme::Relaxed).source_control_file; - a_scf->core_paragraph->default_features.emplace_back("x"); + a_scf->core_paragraph->default_features.push_back({"x"}); a_scf->feature_paragraphs.push_back(std::move(a_x)); MockCMakeVarProvider var_provider; @@ -1598,9 +1648,8 @@ TEST_CASE ("version dont install default features", "[versionplan]") MockBaselineProvider bp; bp.v["a"] = {"1", 0}; - auto install_plan = - create_versioned_install_plan(vp, bp, var_provider, {Dependency{"a", {"core"}}}, {}, toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {CoreDependency{"a"}}, {}, toplevel_spec()) + .value_or_exit(VCPKG_LINE_INFO); REQUIRE(install_plan.size() == 1); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}); @@ -1612,11 +1661,11 @@ TEST_CASE ("version install transitive default features", "[versionplan]") auto a_x = make_fpgh("x"); auto& a_scf = vp.emplace("a", {"1", 0}, VersionScheme::Relaxed).source_control_file; - a_scf->core_paragraph->default_features.emplace_back("x"); + a_scf->core_paragraph->default_features.push_back({"x"}); a_scf->feature_paragraphs.push_back(std::move(a_x)); auto& b_scf = vp.emplace("b", {"1", 0}, VersionScheme::Relaxed).source_control_file; - b_scf->core_paragraph->dependencies.push_back({"a", {"core"}}); + b_scf->core_paragraph->dependencies.push_back(CoreDependency{"a"}); auto& c_scf = vp.emplace("c", {"1", 0}, VersionScheme::Relaxed).source_control_file; c_scf->core_paragraph->dependencies.push_back({"a"}); @@ -1635,9 +1684,9 @@ TEST_CASE ("version install transitive default features", "[versionplan]") check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}, {"x"}); check_name_and_version(install_plan.install_actions[1], "b", {"1", 0}); - install_plan = create_versioned_install_plan( - vp, bp, var_provider, {Dependency{"a", {"core"}}, Dependency{"c"}}, {}, toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + install_plan = + create_versioned_install_plan(vp, bp, var_provider, {CoreDependency{"a"}, Dependency{"c"}}, {}, toplevel_spec()) + .value_or_exit(VCPKG_LINE_INFO); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}, {"x"}); @@ -1703,11 +1752,11 @@ TEST_CASE ("version install qualified default suppression", "[versionplan]") MockVersionedPortfileProvider vp; auto& a_scf = vp.emplace("a", {"1", 0}, VersionScheme::Relaxed).source_control_file; - a_scf->core_paragraph->default_features.emplace_back("x"); + a_scf->core_paragraph->default_features.push_back({"x"}); a_scf->feature_paragraphs.push_back(make_fpgh("x")); vp.emplace("b", {"1", 0}, VersionScheme::Relaxed) - .source_control_file->core_paragraph->dependencies.push_back({"a", {"core"}}); + .source_control_file->core_paragraph->dependencies.push_back(CoreDependency{"a"}); MockCMakeVarProvider var_provider; @@ -1715,14 +1764,14 @@ TEST_CASE ("version install qualified default suppression", "[versionplan]") bp.v["a"] = {"1", 0}; bp.v["b"] = {"1", 0}; - auto install_plan = - create_versioned_install_plan(vp, - bp, - var_provider, - {{"b", {}, parse_platform("!linux")}, {"a", {"core"}, parse_platform("linux")}}, - {}, - toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + auto install_plan = create_versioned_install_plan( + vp, + bp, + var_provider, + {{"b", {}, parse_platform("!linux")}, CoreDependency{"a", {}, parse_platform("linux")}}, + {}, + toplevel_spec()) + .value_or_exit(VCPKG_LINE_INFO); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}, {"x"}); @@ -1747,8 +1796,7 @@ TEST_CASE ("version install qualified transitive", "[versionplan]") bp.v["b"] = {"1", 0}; bp.v["c"] = {"1", 0}; - auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {{"b"}}, {}, toplevel_spec()) - .value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, create_versioned_install_plan(vp, bp, var_provider, {{"b"}}, {}, toplevel_spec())); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}); @@ -1789,17 +1837,17 @@ TEST_CASE ("version install qualified features", "[versionplan]") MockVersionedPortfileProvider vp; auto& b_scf = vp.emplace("b", {"1", 0}, VersionScheme::Relaxed).source_control_file; - b_scf->core_paragraph->default_features.emplace_back("x"); + b_scf->core_paragraph->default_features.push_back({"x"}); b_scf->feature_paragraphs.push_back(make_fpgh("x")); b_scf->feature_paragraphs.back()->dependencies.push_back({"a", {}, parse_platform("!linux")}); auto& a_scf = vp.emplace("a", {"1", 0}, VersionScheme::Relaxed).source_control_file; - a_scf->core_paragraph->default_features.emplace_back("y"); + a_scf->core_paragraph->default_features.push_back({"y"}); a_scf->feature_paragraphs.push_back(make_fpgh("y")); a_scf->feature_paragraphs.back()->dependencies.push_back({"c", {}, parse_platform("linux")}); auto& c_scf = vp.emplace("c", {"1", 0}, VersionScheme::Relaxed).source_control_file; - c_scf->core_paragraph->default_features.emplace_back("z"); + c_scf->core_paragraph->default_features.push_back({"z"}); c_scf->feature_paragraphs.push_back(make_fpgh("z")); c_scf->feature_paragraphs.back()->dependencies.push_back({"d", {}, parse_platform("linux")}); @@ -1831,13 +1879,13 @@ TEST_CASE ("version install self features", "[versionplan]") MockVersionedPortfileProvider vp; auto& a_scf = vp.emplace("a", {"1", 0}).source_control_file; a_scf->feature_paragraphs.push_back(make_fpgh("x")); - a_scf->feature_paragraphs.back()->dependencies.push_back({"a", {"core", "y"}}); + a_scf->feature_paragraphs.back()->dependencies.push_back(CoreDependency{"a", {{"y"}}}); a_scf->feature_paragraphs.push_back(make_fpgh("y")); a_scf->feature_paragraphs.push_back(make_fpgh("z")); MockCMakeVarProvider var_provider; - auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {{"a", {"x"}}}, {}, toplevel_spec()) + auto install_plan = create_versioned_install_plan(vp, bp, var_provider, {{"a", {{"x"}}}}, {}, toplevel_spec()) .value_or_exit(VCPKG_LINE_INFO); REQUIRE(install_plan.size() == 1); @@ -1869,9 +1917,10 @@ TEST_CASE ("version install nonexisting features", "[versionplan]") auto& a_scf = vp.emplace("a", {"1", 0}).source_control_file; a_scf->feature_paragraphs.push_back(make_fpgh("x")); - auto install_plan = create_versioned_install_plan(vp, bp, {{"a", {"y"}}}); + auto install_plan = create_versioned_install_plan(vp, bp, {{"a", {{"y"}}}}); REQUIRE_FALSE(install_plan.has_value()); + REQUIRE(install_plan.error() == "error: a@1 does not have required feature y needed by toplevel-spec"); } TEST_CASE ("version install transitive missing features", "[versionplan]") @@ -1882,12 +1931,13 @@ TEST_CASE ("version install transitive missing features", "[versionplan]") MockVersionedPortfileProvider vp; auto& a_scf = vp.emplace("a", {"1", 0}).source_control_file; - a_scf->core_paragraph->dependencies.push_back({"b", {"y"}}); + a_scf->core_paragraph->dependencies.push_back({"b", {{"y"}}}); vp.emplace("b", {"1", 0}); auto install_plan = create_versioned_install_plan(vp, bp, {{"a", {}}}); REQUIRE_FALSE(install_plan.has_value()); + REQUIRE(install_plan.error() == "error: b@1 does not have required feature y needed by a:x86-windows@1"); } TEST_CASE ("version remove features during upgrade", "[versionplan]") @@ -1903,7 +1953,7 @@ TEST_CASE ("version remove features during upgrade", "[versionplan]") MockVersionedPortfileProvider vp; // a@0 -> b[x], c>=1 auto& a_scf = vp.emplace("a", {"1", 0}).source_control_file; - a_scf->core_paragraph->dependencies.push_back({"b", {"x"}}); + a_scf->core_paragraph->dependencies.push_back({"b", {{"x"}}}); a_scf->core_paragraph->dependencies.push_back({"c", {}, {}, {VersionConstraintKind::Minimum, "1", 1}}); // a@1 -> b auto& a1_scf = vp.emplace("a", {"1", 1}).source_control_file; @@ -1968,7 +2018,7 @@ TEST_CASE ("version install host tool", "[versionplan]") Dependency dep_a{"a"}; dep_a.host = true; - auto install_plan = create_versioned_install_plan(vp, bp, {dep_a}).value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, create_versioned_install_plan(vp, bp, {dep_a})); REQUIRE(install_plan.size() == 1); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}); @@ -1976,7 +2026,7 @@ TEST_CASE ("version install host tool", "[versionplan]") } SECTION ("transitive 1") { - auto install_plan = create_versioned_install_plan(vp, bp, {{"b"}}).value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, create_versioned_install_plan(vp, bp, {{"b"}})); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}); @@ -1991,7 +2041,7 @@ TEST_CASE ("version install host tool", "[versionplan]") Dependency dep_c{"c"}; dep_c.host = true; - auto install_plan = create_versioned_install_plan(vp, bp, {dep_c}).value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, create_versioned_install_plan(vp, bp, {dep_c})); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "a", {"1", 0}); @@ -2003,7 +2053,7 @@ TEST_CASE ("version install host tool", "[versionplan]") } SECTION ("self-reference") { - auto install_plan = create_versioned_install_plan(vp, bp, {{"d"}}).value_or_exit(VCPKG_LINE_INFO); + WITH_EXPECTED(install_plan, create_versioned_install_plan(vp, bp, {{"d"}})); REQUIRE(install_plan.size() == 2); check_name_and_version(install_plan.install_actions[0], "d", {"1", 0}); @@ -2182,10 +2232,10 @@ TEST_CASE ("respect supports expressions of features", "[versionplan]") MockCMakeVarProvider var_provider; var_provider.dep_info_vars[{"a", toplevel_spec().triplet()}]["VCPKG_CMAKE_SYSTEM_NAME"] = ""; - auto install_plan = create_versioned_install_plan(vp, bp, {{"a", {"x"}}}, var_provider); + auto install_plan = create_versioned_install_plan(vp, bp, {{"a", {{"x"}}}}, var_provider); CHECK(install_plan.has_value()); var_provider.dep_info_vars[{"a", toplevel_spec().triplet()}]["VCPKG_CMAKE_SYSTEM_NAME"] = "Linux"; - install_plan = create_versioned_install_plan(vp, bp, {{"a", {"x"}}}, var_provider); + install_plan = create_versioned_install_plan(vp, bp, {{"a", {{"x"}}}}, var_provider); CHECK_FALSE(install_plan.has_value()); SECTION ("override") { @@ -2195,7 +2245,7 @@ TEST_CASE ("respect supports expressions of features", "[versionplan]") bp, oprovider, var_provider, - {Dependency{"a", {"x"}}}, + {Dependency{"a", {{"x"}}}}, {DependencyOverride{"a", "1", 1}}, toplevel_spec()); CHECK(install_plan.has_value()); @@ -2205,9 +2255,266 @@ TEST_CASE ("respect supports expressions of features", "[versionplan]") bp, oprovider, var_provider, - {Dependency{"a", {"x"}}}, + {Dependency{"a", {{"x"}}}}, {DependencyOverride{"a", "1", 0}}, toplevel_spec()); CHECK_FALSE(install_plan.has_value()); } } + +TEST_CASE ("respect platform expressions in DependencyRequestedFeature", "[versionplan]") +{ + using namespace PlatformExpression; + MockBaselineProvider bp; + bp.v["a"] = {"1", 0}; + + MockVersionedPortfileProvider vp; + { + auto a_x = std::make_unique(); + a_x->name = "x"; + vp.emplace("a", {"1", 0}).source_control_file->feature_paragraphs.push_back(std::move(a_x)); + } + + MockCMakeVarProvider var_provider; + Dependency dep{ + "a", {{"x", parse_platform_expression("linux", MultipleBinaryOperators::Deny).value_or_exit(VCPKG_LINE_INFO)}}}; + + SECTION ("on windows") + { + var_provider.dep_info_vars[toplevel_spec()]["VCPKG_CMAKE_SYSTEM_NAME"] = ""; + auto maybe_install_plan = create_versioned_install_plan(vp, bp, {dep}, var_provider); + CHECK(maybe_install_plan.has_value()); + auto& install_plan = maybe_install_plan.value_or_exit(VCPKG_LINE_INFO); + CHECK(install_plan.install_actions.size() == 1); + CHECK(install_plan.install_actions[0].feature_list.size() == 1); + } + + SECTION ("on linux") + { + var_provider.dep_info_vars[toplevel_spec()]["VCPKG_CMAKE_SYSTEM_NAME"] = "Linux"; + auto maybe_install_plan = create_versioned_install_plan(vp, bp, {dep}, var_provider); + CHECK(maybe_install_plan.has_value()); + auto& install_plan = maybe_install_plan.value_or_exit(VCPKG_LINE_INFO); + CHECK(install_plan.install_actions.size() == 1); + CHECK(install_plan.install_actions[0].feature_list.size() == 2); + } +} + +TEST_CASE ("respect platform expressions in default features", "[versionplan]") +{ + using namespace PlatformExpression; + MockBaselineProvider bp; + bp.v["a"] = {"1", 0}; + + MockVersionedPortfileProvider vp; + { + // port with a feature x that is default on "linux" + auto a_x = std::make_unique(); + a_x->name = "x"; + auto& scf = vp.emplace("a", {"1", 0}).source_control_file; + scf->feature_paragraphs.push_back(std::move(a_x)); + scf->core_paragraph->default_features.push_back( + {"x", parse_platform_expression("linux", MultipleBinaryOperators::Deny).value_or_exit(VCPKG_LINE_INFO)}); + } + + MockCMakeVarProvider var_provider; + Dependency dep{"a"}; + PackageSpec spec{"a", toplevel_spec().triplet()}; + SECTION ("on windows") + { + var_provider.dep_info_vars[spec]["VCPKG_CMAKE_SYSTEM_NAME"] = ""; + auto maybe_install_plan = create_versioned_install_plan(vp, bp, {dep}, var_provider); + CHECK(maybe_install_plan.has_value()); + auto& install_plan = maybe_install_plan.value_or_exit(VCPKG_LINE_INFO); + CHECK(install_plan.install_actions.size() == 1); + CHECK(install_plan.install_actions[0].feature_list.size() == 1); + } + + SECTION ("on linux") + { + var_provider.dep_info_vars[spec]["VCPKG_CMAKE_SYSTEM_NAME"] = "Linux"; + auto maybe_install_plan = create_versioned_install_plan(vp, bp, {dep}, var_provider); + CHECK(maybe_install_plan.has_value()); + auto& install_plan = maybe_install_plan.value_or_exit(VCPKG_LINE_INFO); + CHECK(install_plan.install_actions.size() == 1); + CHECK(install_plan.install_actions[0].feature_list.size() == 2); + } +} + +TEST_CASE ("formatting plan 1", "[dependencies]") +{ + std::vector> status_paragraphs; + status_paragraphs.push_back(vcpkg::Test::make_status_pgh("d")); + status_paragraphs.push_back(vcpkg::Test::make_status_pgh("e")); + StatusParagraphs status_db(std::move(status_paragraphs)); + + MockVersionedPortfileProvider vp; + auto& scfl_a = vp.emplace("a", {"1", 0}); + auto& scfl_b = vp.emplace("b", {"1", 0}); + auto& scfl_c = vp.emplace("c", {"1", 0}); + auto& scfl_f = vp.emplace("f", {"1", 0}); + + const RemovePlanAction remove_b({"b", Test::X64_OSX}, RequestType::USER_REQUESTED); + const RemovePlanAction remove_a({"a", Test::X64_OSX}, RequestType::USER_REQUESTED); + const RemovePlanAction remove_c({"c", Test::X64_OSX}, RequestType::AUTO_SELECTED); + + const Path pr = "packages_root"; + InstallPlanAction install_a( + {"a", Test::X64_OSX}, scfl_a, pr, RequestType::AUTO_SELECTED, Test::X64_ANDROID, {}, {}, {}); + InstallPlanAction install_b( + {"b", Test::X64_OSX}, scfl_b, pr, RequestType::AUTO_SELECTED, Test::X64_ANDROID, {{"1", {}}}, {}, {}); + InstallPlanAction install_c( + {"c", Test::X64_OSX}, scfl_c, pr, RequestType::USER_REQUESTED, Test::X64_ANDROID, {}, {}, {}); + InstallPlanAction install_f( + {"f", Test::X64_OSX}, scfl_f, pr, RequestType::USER_REQUESTED, Test::X64_ANDROID, {}, {}, {}); + install_f.plan_type = InstallPlanType::EXCLUDED; + + InstallPlanAction already_installed_d( + status_db.get_installed_package_view({"d", Test::X86_WINDOWS}).value_or_exit(VCPKG_LINE_INFO), + RequestType::AUTO_SELECTED); + InstallPlanAction already_installed_e( + status_db.get_installed_package_view({"e", Test::X86_WINDOWS}).value_or_exit(VCPKG_LINE_INFO), + RequestType::USER_REQUESTED); + + ActionPlan plan; + { + auto formatted = format_plan(plan, "/builtin"); + CHECK_FALSE(formatted.has_removals); + CHECK(formatted.text == "All requested packages are currently installed.\n"); + } + + plan.remove_actions.push_back(remove_b); + { + auto formatted = format_plan(plan, "/builtin"); + CHECK(formatted.has_removals); + CHECK(formatted.text == "The following packages will be removed:\n" + " b:x64-osx\n"); + } + + plan.remove_actions.push_back(remove_a); + REQUIRE_LINES(format_plan(plan, "/builtin").text, + "The following packages will be removed:\n" + " a:x64-osx\n" + " b:x64-osx\n"); + + plan.install_actions.push_back(std::move(install_c)); + REQUIRE_LINES(format_plan(plan, "/builtin").text, + "The following packages will be removed:\n" + " a:x64-osx\n" + " b:x64-osx\n" + "The following packages will be built and installed:\n" + " c:x64-osx -> 1 -- c\n"); + + plan.remove_actions.push_back(remove_c); + REQUIRE_LINES(format_plan(plan, "c").text, + "The following packages will be removed:\n" + " a:x64-osx\n" + " b:x64-osx\n" + "The following packages will be rebuilt:\n" + " c:x64-osx -> 1\n"); + + plan.install_actions.push_back(std::move(install_b)); + REQUIRE_LINES(format_plan(plan, "c").text, + "The following packages will be removed:\n" + " a:x64-osx\n" + "The following packages will be rebuilt:\n" + " * b[1]:x64-osx -> 1 -- b\n" + " c:x64-osx -> 1\n" + "Additional packages (*) will be modified to complete this operation.\n"); + + plan.install_actions.push_back(std::move(install_a)); + plan.already_installed.push_back(std::move(already_installed_d)); + plan.already_installed.push_back(std::move(already_installed_e)); + { + auto formatted = format_plan(plan, "b"); + CHECK(formatted.has_removals); + REQUIRE_LINES(formatted.text, + "The following packages are already installed:\n" + " * d:x86-windows -> 1\n" + " e:x86-windows -> 1\n" + "The following packages will be rebuilt:\n" + " * a:x64-osx -> 1 -- a\n" + " * b[1]:x64-osx -> 1\n" + " c:x64-osx -> 1 -- c\n" + "Additional packages (*) will be modified to complete this operation.\n"); + } + + plan.install_actions.push_back(std::move(install_f)); + REQUIRE_LINES(format_plan(plan, "b").text, + "The following packages are excluded:\n" + " f:x64-osx -> 1 -- f\n" + "The following packages are already installed:\n" + " * d:x86-windows -> 1\n" + " e:x86-windows -> 1\n" + "The following packages will be rebuilt:\n" + " * a:x64-osx -> 1 -- a\n" + " * b[1]:x64-osx -> 1\n" + " c:x64-osx -> 1 -- c\n" + "Additional packages (*) will be modified to complete this operation.\n"); +} + +TEST_CASE ("dependency graph API snapshot: host and target") +{ + MockVersionedPortfileProvider vp; + auto& scfl_a = vp.emplace("a", {"1", 0}); + InstallPlanAction install_a( + {"a", Test::X86_WINDOWS}, scfl_a, "packages_root", RequestType::AUTO_SELECTED, Test::X64_WINDOWS, {}, {}, {}); + InstallPlanAction install_a_host( + {"a", Test::X64_WINDOWS}, scfl_a, "packages_root", RequestType::AUTO_SELECTED, Test::X64_WINDOWS, {}, {}, {}); + ActionPlan plan; + plan.install_actions.push_back(std::move(install_a)); + plan.install_actions.push_back(std::move(install_a_host)); + std::map> envmap = { + {VcpkgCmdArguments::GITHUB_JOB_ENV.to_string(), "123"}, + {VcpkgCmdArguments::GITHUB_RUN_ID_ENV.to_string(), "123"}, + {VcpkgCmdArguments::GITHUB_REF_ENV.to_string(), "refs/heads/main"}, + {VcpkgCmdArguments::GITHUB_REPOSITORY_ENV.to_string(), "owner/repo"}, + {VcpkgCmdArguments::GITHUB_SHA_ENV.to_string(), "abc123"}, + {VcpkgCmdArguments::GITHUB_TOKEN_ENV.to_string(), "abc"}, + {VcpkgCmdArguments::GITHUB_WORKFLOW_ENV.to_string(), "test"}, + }; + auto v = VcpkgCmdArguments::create_from_arg_sequence(nullptr, nullptr); + v.imbue_from_fake_environment(envmap); + auto s = create_dependency_graph_snapshot(v, plan); + + CHECK(s.has_value()); + auto obj = *s.get(); + auto version = obj.get("version")->integer(VCPKG_LINE_INFO); + auto job = obj.get("job")->object(VCPKG_LINE_INFO); + auto id = job.get("id")->string(VCPKG_LINE_INFO); + auto correlator = job.get("correlator")->string(VCPKG_LINE_INFO); + auto sha = obj.get("sha")->string(VCPKG_LINE_INFO); + auto ref = obj.get("ref")->string(VCPKG_LINE_INFO); + auto detector = obj.get("detector")->object(VCPKG_LINE_INFO); + auto name = detector.get("name")->string(VCPKG_LINE_INFO); + auto detector_version = detector.get("version")->string(VCPKG_LINE_INFO); + auto url = detector.get("url")->string(VCPKG_LINE_INFO); + auto manifests = obj.get("manifests")->object(VCPKG_LINE_INFO); + auto manifest1 = manifests.get("vcpkg.json")->object(VCPKG_LINE_INFO); + auto name1 = manifest1.get("name")->string(VCPKG_LINE_INFO); + auto resolved1 = manifest1.get("resolved")->object(VCPKG_LINE_INFO); + auto dependency_a_host = resolved1.get("pkg:github/vcpkg/a:x64-windows@1")->object(VCPKG_LINE_INFO); + auto package_url_a_host = dependency_a_host.get("package_url")->string(VCPKG_LINE_INFO); + auto relationship_a_host = dependency_a_host.get("relationship")->string(VCPKG_LINE_INFO); + auto dependencies_a_host = dependency_a_host.get("dependencies")->array(VCPKG_LINE_INFO); + auto dependency_a = resolved1.get("pkg:github/vcpkg/a:x86-windows@1")->object(VCPKG_LINE_INFO); + auto package_url_a = dependency_a.get("package_url")->string(VCPKG_LINE_INFO); + auto relationship_a = dependency_a.get("relationship")->string(VCPKG_LINE_INFO); + auto dependencies_a = dependency_a.get("dependencies")->array(VCPKG_LINE_INFO); + + CHECK(static_cast(version) == 0); + CHECK(id == "123"); + CHECK(correlator == "test-123"); + CHECK(sha == "abc123"); + CHECK(ref == "refs/heads/main"); + CHECK(name == "vcpkg"); + CHECK(detector_version == "1.0.0"); + CHECK(url == "https://github.com/microsoft/vcpkg"); + CHECK(name1 == "vcpkg.json"); + CHECK(package_url_a_host == "pkg:github/vcpkg/a:x64-windows@1"); + CHECK(relationship_a_host == "direct"); + CHECK(dependencies_a_host.size() == 0); + CHECK(package_url_a == "pkg:github/vcpkg/a:x86-windows@1"); + CHECK(relationship_a == "direct"); + CHECK(dependencies_a.size() == 0); +} diff --git a/src/vcpkg-test/dependinfo-graphs.cpp b/src/vcpkg-test/dependinfo-graphs.cpp new file mode 100644 index 0000000000..0be38783f5 --- /dev/null +++ b/src/vcpkg-test/dependinfo-graphs.cpp @@ -0,0 +1,85 @@ +#include + +#include + +using namespace vcpkg; + +namespace +{ + const auto DOT_TEMPLATE = + "digraph G{{ rankdir=LR; edge [minlen=3]; overlap=false;{}empty [label=\"{} singletons...\"]; }}"; + + const auto DGML_TEMPLATE = + "{}{}"; + + const auto MERMAID_TEMPLATE = "flowchart TD;{}"; + + std::vector single_node_dependencies() { return {{"a", 0, {}, {"a"}}}; } + + std::vector four_nodes_dependencies() + { + return {{"a", 0, {}, {"b", "c", "d"}}, {"b", 0, {}, {"c"}}, {"c", 0, {}, {"d"}}, {"d", 0, {}, {}}}; + } +} + +TEST_CASE ("depend-info DOT graph output", "[depend-info]") +{ + SECTION ("empty") + { + CHECK(create_dot_as_string({}) == fmt::format(DOT_TEMPLATE, "", 0)); + } + + SECTION ("single node") + { + CHECK(create_dot_as_string(single_node_dependencies()) == fmt::format(DOT_TEMPLATE, "a;a -> a;", 0)); + } + + SECTION ("4 nodes") + { + CHECK(create_dot_as_string(four_nodes_dependencies()) == + fmt::format(DOT_TEMPLATE, "a;a -> b;a -> c;a -> d;b;b -> c;c;c -> d;", 1)); + } +} + +TEST_CASE ("depend-info DGML graph output", "[depend-info]") +{ + SECTION ("empty") + { + CHECK(create_dgml_as_string({}) == fmt::format(DGML_TEMPLATE, "", "")); + } + + SECTION ("single node") + { + CHECK(create_dgml_as_string(single_node_dependencies()) == + fmt::format(DGML_TEMPLATE, "", "")); + } + + SECTION ("4 nodes") + { + CHECK(create_dgml_as_string(four_nodes_dependencies()) == + fmt::format(DGML_TEMPLATE, + "", + "")); + } +} + +TEST_CASE ("depend-info mermaid graph output", "[depend-info]") +{ + SECTION ("empty") + { + CHECK(create_mermaid_as_string({}) == fmt::format(MERMAID_TEMPLATE, "")); + } + + SECTION ("single node") + { + CHECK(create_mermaid_as_string(single_node_dependencies()) == fmt::format(MERMAID_TEMPLATE, " a --> a;")); + } + + SECTION ("4 nodes") + { + CHECK(create_mermaid_as_string(four_nodes_dependencies()) == + fmt::format(MERMAID_TEMPLATE, " a --> b; a --> c; a --> d; b --> c; c --> d;")); + } +} diff --git a/src/vcpkg-test/files.cpp b/src/vcpkg-test/files.cpp index 5e362d0333..1e6fe160b1 100644 --- a/src/vcpkg-test/files.cpp +++ b/src/vcpkg-test/files.cpp @@ -47,7 +47,7 @@ namespace #endif // ^^^ !_WIN32 } - void create_directory_tree(urbg_t& urbg, Filesystem& fs, const Path& base, std::uint32_t remaining_depth = 5) + void create_directory_tree(urbg_t& urbg, const Filesystem& fs, const Path& base, std::uint32_t remaining_depth = 5) { using uid_t = std::uniform_int_distribution; // we want ~70% of our "files" to be directories, and then a third @@ -162,15 +162,13 @@ namespace CHECK_EC_ON_FILE(base, ec); } - Filesystem& setup() + const Filesystem& setup() { - auto& fs = get_real_filesystem(); - std::error_code ec; - fs.create_directory(base_temporary_directory(), ec); + real_filesystem.create_directory(base_temporary_directory(), ec); CHECK_EC_ON_FILE(base_temporary_directory(), ec); - return fs; + return real_filesystem; } template @@ -738,7 +736,7 @@ TEST_CASE ("remove all symlinks", "[files]") TEST_CASE ("get_files_recursive_symlinks", "[files]") { do_filesystem_enumeration_test( - [](Filesystem& fs, const Path& root) { return fs.get_files_recursive(root, VCPKG_LINE_INFO); }, + [](const Filesystem& fs, const Path& root) { return fs.get_files_recursive(root, VCPKG_LINE_INFO); }, [](const Path& root) { return std::vector{ root / "file.txt", @@ -756,7 +754,7 @@ TEST_CASE ("get_files_recursive_symlinks", "[files]") TEST_CASE ("get_regular_files_recursive_proximate_symlinks", "[files]") { do_filesystem_enumeration_test( - [](Filesystem& fs, const Path& root) { + [](const Filesystem& fs, const Path& root) { return fs.get_regular_files_recursive_lexically_proximate(root, VCPKG_LINE_INFO); }, [](const Path&) { @@ -773,7 +771,7 @@ TEST_CASE ("get_regular_files_recursive_proximate_symlinks", "[files]") TEST_CASE ("get_files_non_recursive_symlinks", "[files]") { do_filesystem_enumeration_test( - [](Filesystem& fs, const Path& root) { return fs.get_files_non_recursive(root, VCPKG_LINE_INFO); }, + [](const Filesystem& fs, const Path& root) { return fs.get_files_non_recursive(root, VCPKG_LINE_INFO); }, [](const Path& root) { return std::vector{ root / "file.txt", @@ -787,7 +785,7 @@ TEST_CASE ("get_files_non_recursive_symlinks", "[files]") TEST_CASE ("get_directories_recursive_symlinks", "[files]") { do_filesystem_enumeration_test( - [](Filesystem& fs, const Path& root) { return fs.get_directories_recursive(root, VCPKG_LINE_INFO); }, + [](const Filesystem& fs, const Path& root) { return fs.get_directories_recursive(root, VCPKG_LINE_INFO); }, [](const Path& root) { return std::vector{ root / "some-directory", @@ -801,7 +799,7 @@ TEST_CASE ("get_directories_recursive_symlinks", "[files]") TEST_CASE ("get_directories_non_recursive_symlinks", "[files]") { do_filesystem_enumeration_test( - [](Filesystem& fs, const Path& root) { return fs.get_directories_non_recursive(root, VCPKG_LINE_INFO); }, + [](const Filesystem& fs, const Path& root) { return fs.get_directories_non_recursive(root, VCPKG_LINE_INFO); }, [](const Path& root) { return std::vector{ root / "some-directory", @@ -813,7 +811,7 @@ TEST_CASE ("get_directories_non_recursive_symlinks", "[files]") TEST_CASE ("get_regular_files_recursive_symlinks", "[files]") { do_filesystem_enumeration_test( - [](Filesystem& fs, const Path& root) { return fs.get_regular_files_recursive(root, VCPKG_LINE_INFO); }, + [](const Filesystem& fs, const Path& root) { return fs.get_regular_files_recursive(root, VCPKG_LINE_INFO); }, [](const Path& root) { return std::vector{ root / "file.txt", @@ -827,7 +825,9 @@ TEST_CASE ("get_regular_files_recursive_symlinks", "[files]") TEST_CASE ("get_regular_files_non_recursive_symlinks", "[files]") { do_filesystem_enumeration_test( - [](Filesystem& fs, const Path& root) { return fs.get_regular_files_non_recursive(root, VCPKG_LINE_INFO); }, + [](const Filesystem& fs, const Path& root) { + return fs.get_regular_files_non_recursive(root, VCPKG_LINE_INFO); + }, [](const Path& root) { return std::vector{ root / "file.txt", @@ -954,10 +954,10 @@ TEST_CASE ("LinesCollector", "[files]") { using Strings::LinesCollector; LinesCollector lc; - CHECK(lc.extract() == std::vector{""}); + CHECK(lc.extract() == std::vector{}); lc.on_data({"a\nb\r\nc\rd\r\r\n\ne\n\rx", 16}); CHECK(lc.extract() == std::vector{"a", "b", "c", "d", "", "", "e", "", "x"}); - CHECK(lc.extract() == std::vector{""}); + CHECK(lc.extract() == std::vector{}); lc.on_data({"hello ", 6}); lc.on_data({"there ", 6}); lc.on_data({"world", 5}); @@ -966,7 +966,7 @@ TEST_CASE ("LinesCollector", "[files]") lc.on_data({"\r\nworld", 7}); CHECK(lc.extract() == std::vector{"", "hello ", "", "world"}); lc.on_data({"\r\n\r\n\r\n", 6}); - CHECK(lc.extract() == std::vector{"", "", "", ""}); + CHECK(lc.extract() == std::vector{"", "", ""}); lc.on_data({"a", 1}); lc.on_data({"b\nc", 3}); lc.on_data({"d", 1}); @@ -975,11 +975,11 @@ TEST_CASE ("LinesCollector", "[files]") lc.on_data({"\nb", 2}); CHECK(lc.extract() == std::vector{"a", "b"}); lc.on_data({"a\r", 2}); - CHECK(lc.extract() == std::vector{"a", ""}); + CHECK(lc.extract() == std::vector{"a"}); lc.on_data({"\n", 1}); - CHECK(lc.extract() == std::vector{"", ""}); + CHECK(lc.extract() == std::vector{""}); lc.on_data({"\rabc\n", 5}); - CHECK(lc.extract() == std::vector{"", "abc", ""}); + CHECK(lc.extract() == std::vector{"", "abc"}); } TEST_CASE ("find_file_recursively_up", "[files]") @@ -1029,18 +1029,17 @@ TEST_CASE ("win32_fix_path_case", "[files]") CHECK(win32_fix_path_case("C://///////WiNdOws") == "C:\\Windows"); CHECK(win32_fix_path_case("c:\\/\\/WiNdOws\\/") == "C:\\Windows\\"); - auto& fs = get_real_filesystem(); - auto original_cwd = fs.current_path(VCPKG_LINE_INFO); - fs.current_path("C:\\", VCPKG_LINE_INFO); + auto original_cwd = real_filesystem.current_path(VCPKG_LINE_INFO); + real_filesystem.current_path("C:\\", VCPKG_LINE_INFO); CHECK(win32_fix_path_case("\\") == "\\"); CHECK(win32_fix_path_case("\\/\\WiNdOws") == "\\Windows"); CHECK(win32_fix_path_case("\\WiNdOws") == "\\Windows"); CHECK(win32_fix_path_case("\\WiNdOws") == "\\Windows"); CHECK(win32_fix_path_case("c:WiNdOws") == "C:Windows"); CHECK(win32_fix_path_case("c:WiNdOws/system32") == "C:Windows\\System32"); - fs.current_path(original_cwd, VCPKG_LINE_INFO); + real_filesystem.current_path(original_cwd, VCPKG_LINE_INFO); - fs.create_directories("SuB/Dir/Ectory", VCPKG_LINE_INFO); + real_filesystem.create_directories("SuB/Dir/Ectory", VCPKG_LINE_INFO); CHECK(win32_fix_path_case("sub") == "SuB"); CHECK(win32_fix_path_case("SUB") == "SuB"); CHECK(win32_fix_path_case("sub/") == "SuB\\"); @@ -1048,7 +1047,7 @@ TEST_CASE ("win32_fix_path_case", "[files]") CHECK(win32_fix_path_case("sub/dir/") == "SuB\\Dir\\"); CHECK(win32_fix_path_case("sub/dir/ectory") == "SuB\\Dir\\Ectory"); CHECK(win32_fix_path_case("sub/dir/ectory/") == "SuB\\Dir\\Ectory\\"); - fs.remove_all("SuB", VCPKG_LINE_INFO); + real_filesystem.remove_all("SuB", VCPKG_LINE_INFO); CHECK(win32_fix_path_case("//nonexistent_server\\nonexistent_share\\") == "\\\\nonexistent_server\\nonexistent_share\\"); @@ -1075,7 +1074,7 @@ TEST_CASE ("remove all -- benchmarks", "[files][!benchmark]") struct { urbg_t& urbg; - Filesystem& fs; + const Filesystem& fs; void operator()(Catch::Benchmark::Chronometer& meter, std::uint32_t max_depth) const { diff --git a/src/vcpkg-test/integrate.cpp b/src/vcpkg-test/integrate.cpp index f80c456882..d2d5e08252 100644 --- a/src/vcpkg-test/integrate.cpp +++ b/src/vcpkg-test/integrate.cpp @@ -1,9 +1,8 @@ #include -#include +#include using namespace vcpkg; -namespace Integrate = vcpkg::Commands::Integrate; TEST_CASE ("find_targets_file_version", "[integrate]") { @@ -18,44 +17,44 @@ TEST_CASE ("find_targets_file_version", "[integrate]") )xml"; - auto res = Integrate::find_targets_file_version(DEFAULT_TARGETS_FILE); + auto res = find_targets_file_version(DEFAULT_TARGETS_FILE); REQUIRE(res.has_value()); CHECK(*res.get() == 1); - res = Integrate::find_targets_file_version(""); + res = find_targets_file_version(""); REQUIRE(res.has_value()); CHECK(*res.get() == 12345); - res = Integrate::find_targets_file_version(""); + res = find_targets_file_version(""); REQUIRE(res.has_value()); CHECK(*res.get() == 1); - res = Integrate::find_targets_file_version(""); + res = find_targets_file_version(""); REQUIRE(res.has_value()); CHECK(*res.get() == 1); - res = Integrate::find_targets_file_version(" "); + res = find_targets_file_version(" "); REQUIRE(res.has_value()); CHECK(*res.get() == 32); - res = Integrate::find_targets_file_version(""); + res = find_targets_file_version(""); CHECK_FALSE(res.has_value()); - res = Integrate::find_targets_file_version(""); + res = find_targets_file_version(""); CHECK_FALSE(res.has_value()); - res = Integrate::find_targets_file_version(""); + res = find_targets_file_version(""); CHECK_FALSE(res.has_value()); - res = Integrate::find_targets_file_version(" "); + res = find_targets_file_version(" "); REQUIRE(res.has_value()); CHECK(*res.get() == 1); - res = Integrate::find_targets_file_version(" "); + res = find_targets_file_version(" "); REQUIRE(res.has_value()); CHECK(*res.get() == 1); - res = Integrate::find_targets_file_version(""); + res = find_targets_file_version(""); CHECK_FALSE(res.has_value()); } @@ -88,7 +87,7 @@ if [ -f "$HOME/.profile" ]; then fi )sh"; - CHECK(Integrate::get_bash_source_completion_lines(default_bashrc) == std::vector{}); + CHECK(get_bash_source_completion_lines(default_bashrc) == std::vector{}); const std::string source_line_1 = "source /blah/bloop/scripts/vcpkg_completion.bash"; const std::string source_line_2 = "source /floop/scripts/vcpkg_completion.bash"; @@ -97,29 +96,26 @@ fi with_bash_completion.append(source_line_1.begin(), source_line_1.end()); with_bash_completion.push_back('\n'); - CHECK(Integrate::get_bash_source_completion_lines(with_bash_completion) == std::vector{source_line_1}); + CHECK(get_bash_source_completion_lines(with_bash_completion) == std::vector{source_line_1}); with_bash_completion.append(source_line_2.begin(), source_line_2.end()); with_bash_completion.push_back('\n'); - CHECK(Integrate::get_bash_source_completion_lines(with_bash_completion) == + CHECK(get_bash_source_completion_lines(with_bash_completion) == std::vector{source_line_1, source_line_2}); with_bash_completion.append("unrelated line\n"); - CHECK(Integrate::get_bash_source_completion_lines(with_bash_completion) == + CHECK(get_bash_source_completion_lines(with_bash_completion) == std::vector{source_line_1, source_line_2}); - CHECK(Integrate::get_bash_source_completion_lines("source nonrelated/vcpkg_completion.bash") == - std::vector{}); - CHECK(Integrate::get_bash_source_completion_lines(" source /scripts/vcpkg_completion.bash") == + CHECK(get_bash_source_completion_lines("source nonrelated/vcpkg_completion.bash") == std::vector{}); + CHECK(get_bash_source_completion_lines(" source /scripts/vcpkg_completion.bash") == std::vector{"source /scripts/vcpkg_completion.bash"}); - CHECK(Integrate::get_bash_source_completion_lines("#source /scripts/vcpkg_completion.bash") == - std::vector{}); + CHECK(get_bash_source_completion_lines("#source /scripts/vcpkg_completion.bash") == std::vector{}); - CHECK(Integrate::get_bash_source_completion_lines("mysource /scripts/vcpkg_completion.bash") == - std::vector{}); + CHECK(get_bash_source_completion_lines("mysource /scripts/vcpkg_completion.bash") == std::vector{}); } TEST_CASE ("get_zsh_autocomplete_data", "[integrate]") @@ -136,7 +132,7 @@ alias -g kill-gpg='gpgconf --kill gpg-agent' . "$HOME/.cargo/env" )sh"; - auto res = Integrate::get_zsh_autocomplete_data(zshrc); + auto res = get_zsh_autocomplete_data(zshrc); CHECK(res.source_completion_lines == std::vector{}); CHECK(!res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); @@ -148,73 +144,73 @@ alias -g kill-gpg='gpgconf --kill gpg-agent' std::string my_zshrc = zshrc; my_zshrc.append(source_line_1.begin(), source_line_1.end()); my_zshrc.push_back('\n'); - res = Integrate::get_zsh_autocomplete_data(my_zshrc); + res = get_zsh_autocomplete_data(my_zshrc); CHECK(res.source_completion_lines == std::vector{source_line_1}); CHECK(!res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); my_zshrc.append(source_line_2.begin(), source_line_2.end()); my_zshrc.push_back('\n'); - res = Integrate::get_zsh_autocomplete_data(my_zshrc); + res = get_zsh_autocomplete_data(my_zshrc); CHECK(res.source_completion_lines == std::vector{source_line_1, source_line_2}); CHECK(!res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); my_zshrc.append(bash_source_line.begin(), bash_source_line.end()); my_zshrc.push_back('\n'); - res = Integrate::get_zsh_autocomplete_data(my_zshrc); + res = get_zsh_autocomplete_data(my_zshrc); CHECK(res.source_completion_lines == std::vector{source_line_1, source_line_2}); CHECK(!res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); my_zshrc.append("bashcompinit\n"); - res = Integrate::get_zsh_autocomplete_data(my_zshrc); + res = get_zsh_autocomplete_data(my_zshrc); CHECK(res.source_completion_lines == std::vector{source_line_1, source_line_2}); CHECK(res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); my_zshrc.append("autoload bashcompinit\n"); - res = Integrate::get_zsh_autocomplete_data(my_zshrc); + res = get_zsh_autocomplete_data(my_zshrc); CHECK(res.source_completion_lines == std::vector{source_line_1, source_line_2}); CHECK(res.has_bashcompinit); CHECK(res.has_autoload_bashcompinit); - res = Integrate::get_zsh_autocomplete_data("autoload bashcompinit"); + res = get_zsh_autocomplete_data("autoload bashcompinit"); CHECK(res.source_completion_lines == std::vector{}); CHECK(!res.has_bashcompinit); CHECK(res.has_autoload_bashcompinit); - res = Integrate::get_zsh_autocomplete_data("autoloadoasdoif--ha------oshgfiaqwenrlan hasdoifhaodfbashcompinit"); + res = get_zsh_autocomplete_data("autoloadoasdoif--ha------oshgfiaqwenrlan hasdoifhaodfbashcompinit"); CHECK(res.source_completion_lines == std::vector{}); CHECK(!res.has_bashcompinit); CHECK(res.has_autoload_bashcompinit); - res = Integrate::get_zsh_autocomplete_data("autoloadoasdoi hasdoifhaodfbashcompinitasdfjadofin"); + res = get_zsh_autocomplete_data("autoloadoasdoi hasdoifhaodfbashcompinitasdfjadofin"); CHECK(res.source_completion_lines == std::vector{}); CHECK(!res.has_bashcompinit); CHECK(res.has_autoload_bashcompinit); - res = Integrate::get_zsh_autocomplete_data("myautoload bashcompinit"); + res = get_zsh_autocomplete_data("myautoload bashcompinit"); CHECK(res.source_completion_lines == std::vector{}); CHECK(!res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); - res = Integrate::get_zsh_autocomplete_data("bashcompinit"); + res = get_zsh_autocomplete_data("bashcompinit"); CHECK(res.source_completion_lines == std::vector{}); CHECK(res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); - res = Integrate::get_zsh_autocomplete_data("asdf && blah && bashcompinit"); + res = get_zsh_autocomplete_data("asdf && blah && bashcompinit"); CHECK(res.source_completion_lines == std::vector{}); CHECK(res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); - res = Integrate::get_zsh_autocomplete_data("daslknfd bashcompinit"); + res = get_zsh_autocomplete_data("daslknfd bashcompinit"); CHECK(res.source_completion_lines == std::vector{}); CHECK(!res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); - res = Integrate::get_zsh_autocomplete_data("# && bashcompinit"); + res = get_zsh_autocomplete_data("# && bashcompinit"); CHECK(res.source_completion_lines == std::vector{}); CHECK(!res.has_bashcompinit); CHECK(!res.has_autoload_bashcompinit); diff --git a/src/vcpkg-test/json.cpp b/src/vcpkg-test/json.cpp index 1b084ef8d1..66b11105d2 100644 --- a/src/vcpkg-test/json.cpp +++ b/src/vcpkg-test/json.cpp @@ -234,8 +234,8 @@ TEST_CASE ("JSON track newlines", "[json]") REQUIRE(!res); REQUIRE(res.error()->to_string() == R"(filename:2:1: error: Unexpected character; expected property name - on expression: , - ^)"); + on expression: , + ^)"); } TEST_CASE ("JSON duplicated object keys", "[json]") @@ -244,8 +244,8 @@ TEST_CASE ("JSON duplicated object keys", "[json]") REQUIRE(!res); REQUIRE(res.error()->to_string() == R"(filename:1:13: error: Duplicated key "name" in an object - on expression: {"name": 1, "name": 2} - ^)"); + on expression: {"name": 1, "name": 2} + ^)"); } TEST_CASE ("JSON support unicode characters in errors", "[json]") @@ -255,8 +255,8 @@ TEST_CASE ("JSON support unicode characters in errors", "[json]") REQUIRE(!res); CHECK(res.error()->to_string() == R"(filename:1:9: error: Unexpected character; expected EOF - on expression: "Δx/Δt" "" - ^)"); + on expression: "Δx/Δt" "" + ^)"); // full width unicode characters // note that the A is full width @@ -264,8 +264,8 @@ TEST_CASE ("JSON support unicode characters in errors", "[json]") REQUIRE(!res); CHECK(res.error()->to_string() == R"(filename:1:8: error: Unexpected character; expected EOF - on expression: "姐姐aA" "" - ^)"); + on expression: "姐姐aA" "" + ^)"); // incorrect errors in the face of combining characters // (this test should be fixed once the underlying bug is fixed) @@ -273,6 +273,6 @@ TEST_CASE ("JSON support unicode characters in errors", "[json]") REQUIRE(!res); CHECK(res.error()->to_string() == R"(filename:1:6: error: Unexpected character; expected EOF - on expression: "é" "" - ^)"); + on expression: "é" "" + ^)"); } diff --git a/src/vcpkg-test/manifests.cpp b/src/vcpkg-test/manifests.cpp index deacdf2244..9411dfb071 100644 --- a/src/vcpkg-test/manifests.cpp +++ b/src/vcpkg-test/manifests.cpp @@ -838,7 +838,13 @@ TEST_CASE ("manifest construct maximum", "[manifests]") "description": "d", "builtin-baseline": "123", "dependencies": ["bd"], - "default-features": ["df"], + "default-features": [ + "df", + { + "name": "zuko", + "platform": "windows & arm" + } + ], "features": { "$feature-level-comment": "hi", "$feature-level-comment2": "123456", @@ -849,19 +855,30 @@ TEST_CASE ("manifest construct maximum", "[manifests]") "firebending", { "name": "order-white-lotus", - "features": [ "the-ancient-ways" ], + "features": [ + "the-ancient-ways", + { + "name": "windows-tests", + "platform": "windows" + } + ], "platform": "!(windows & arm)" - }, - { - "$extra": [], - "$my": [], - "name": "tea" + }, + { + "$extra": [], + "$my": [], + "name": "tea" + }, + { + "name": "z-no-defaults", + "default-features": false } ] }, "zuko": { "description": ["son of the fire lord", "firebending 師父"], - "supports": "!(windows & arm)" + "supports": "!(windows & arm)", + "license": "MIT" } } })json"; @@ -893,8 +910,11 @@ TEST_CASE ("manifest construct maximum", "[manifests]") REQUIRE(pgh.core_paragraph->description[0] == "d"); REQUIRE(pgh.core_paragraph->dependencies.size() == 1); REQUIRE(pgh.core_paragraph->dependencies[0].name == "bd"); - REQUIRE(pgh.core_paragraph->default_features.size() == 1); - REQUIRE(pgh.core_paragraph->default_features[0] == "df"); + REQUIRE(pgh.core_paragraph->default_features.size() == 2); + REQUIRE(pgh.core_paragraph->default_features[0].name == "df"); + REQUIRE(pgh.core_paragraph->default_features[0].platform.is_empty()); + REQUIRE(pgh.core_paragraph->default_features[1].name == "zuko"); + REQUIRE(to_string(pgh.core_paragraph->default_features[1].platform) == "windows & arm"); REQUIRE(pgh.core_paragraph->supports_expression.is_empty()); REQUIRE(pgh.core_paragraph->builtin_baseline == "123"); @@ -903,12 +923,21 @@ TEST_CASE ("manifest construct maximum", "[manifests]") REQUIRE(pgh.feature_paragraphs[0]->name == "iroh"); REQUIRE(pgh.feature_paragraphs[0]->description.size() == 1); REQUIRE(pgh.feature_paragraphs[0]->description[0] == "zuko's uncle"); - REQUIRE(pgh.feature_paragraphs[0]->dependencies.size() == 3); + REQUIRE(pgh.feature_paragraphs[0]->dependencies.size() == 4); REQUIRE(pgh.feature_paragraphs[0]->dependencies[0].name == "firebending"); REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].name == "order-white-lotus"); - REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].features.size() == 1); - REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].features[0] == "the-ancient-ways"); + REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].default_features == true); + REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].features.size() == 2); + REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].features[0].name == "the-ancient-ways"); + REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].features[0].platform.is_empty()); + REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].features[1].name == "windows-tests"); + REQUIRE_FALSE(pgh.feature_paragraphs[0]->dependencies[1].features[1].platform.is_empty()); + REQUIRE( + pgh.feature_paragraphs[0]->dependencies[1].features[1].platform.evaluate({{"VCPKG_CMAKE_SYSTEM_NAME", ""}})); + REQUIRE_FALSE(pgh.feature_paragraphs[0]->dependencies[1].features[1].platform.evaluate( + {{"VCPKG_CMAKE_SYSTEM_NAME", "Linux"}})); + REQUIRE_FALSE(pgh.feature_paragraphs[0]->dependencies[1].platform.evaluate( {{"VCPKG_CMAKE_SYSTEM_NAME", ""}, {"VCPKG_TARGET_ARCHITECTURE", "arm"}})); REQUIRE(pgh.feature_paragraphs[0]->dependencies[1].platform.evaluate( @@ -917,6 +946,8 @@ TEST_CASE ("manifest construct maximum", "[manifests]") {{"VCPKG_CMAKE_SYSTEM_NAME", "Linux"}, {"VCPKG_TARGET_ARCHITECTURE", "x86"}})); REQUIRE(pgh.feature_paragraphs[0]->dependencies[2].name == "tea"); + REQUIRE(pgh.feature_paragraphs[0]->dependencies[3].name == "z-no-defaults"); + REQUIRE(pgh.feature_paragraphs[0]->dependencies[3].default_features == false); REQUIRE(pgh.feature_paragraphs[1]->name == "zuko"); REQUIRE(pgh.feature_paragraphs[1]->description.size() == 2); @@ -927,6 +958,8 @@ TEST_CASE ("manifest construct maximum", "[manifests]") {{"VCPKG_CMAKE_SYSTEM_NAME", ""}, {"VCPKG_TARGET_ARCHITECTURE", "arm"}})); REQUIRE(pgh.feature_paragraphs[1]->supports_expression.evaluate( {{"VCPKG_CMAKE_SYSTEM_NAME", ""}, {"VCPKG_TARGET_ARCHITECTURE", "x86"}})); + REQUIRE(pgh.feature_paragraphs[1]->license.has_value()); + REQUIRE(*pgh.feature_paragraphs[1]->license.get() == "MIT"); check_json_eq_ordered(serialize_manifest(pgh), object); } @@ -1035,7 +1068,27 @@ TEST_CASE ("SourceParagraph manifest default features", "[manifests]") auto& pgh = **m_pgh.get(); REQUIRE(pgh.core_paragraph->default_features.size() == 1); - REQUIRE(pgh.core_paragraph->default_features[0] == "a1"); + REQUIRE(pgh.core_paragraph->default_features[0].name == "a1"); + REQUIRE(pgh.core_paragraph->default_features[0].platform.is_empty()); +} + +TEST_CASE ("SourceParagraph manifest default feature missing name", "[manifests]") +{ + auto m_pgh = test_parse_port_manifest(R"json({ + "name": "a", + "version-string": "1.0", + "default-features": [{"platform": "!windows"}] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + + m_pgh = test_parse_port_manifest(R"json({ + "name": "a", + "version-string": "1.0", + "default-features": [{"name": "", "platform": "!windows"}] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); } TEST_CASE ("SourceParagraph manifest description paragraph", "[manifests]") @@ -1176,30 +1229,30 @@ TEST_CASE ("license error messages", "[manifests][license]") parse_spdx_license_expression("", messages); REQUIRE(messages.error); CHECK(messages.error->to_string() == R"(:1:1: error: SPDX license expression was empty. - on expression: - ^)"); + on expression: + ^)"); parse_spdx_license_expression("MIT ()", messages); REQUIRE(messages.error); CHECK(messages.error->to_string() == R"(:1:5: error: Expected a compound or the end of the string, found a parenthesis. - on expression: MIT () - ^)"); + on expression: MIT () + ^)"); parse_spdx_license_expression("MIT +", messages); REQUIRE(messages.error); CHECK( messages.error->to_string() == R"(:1:5: error: SPDX license expression contains an extra '+'. These are only allowed directly after a license identifier. - on expression: MIT + - ^)"); + on expression: MIT + + ^)"); parse_spdx_license_expression("MIT AND", messages); REQUIRE(messages.error); CHECK(messages.error->to_string() == R"(:1:8: error: Expected a license name, found the end of the string. - on expression: MIT AND - ^)"); + on expression: MIT AND + ^)"); parse_spdx_license_expression("MIT AND unknownlicense", messages); CHECK(!messages.error); @@ -1207,6 +1260,219 @@ TEST_CASE ("license error messages", "[manifests][license]") CHECK( test_format_parse_warning(messages.warnings[0]) == R"(:1:9: warning: Unknown license identifier 'unknownlicense'. Known values are listed at https://spdx.org/licenses/ - on expression: MIT AND unknownlicense - ^)"); + on expression: MIT AND unknownlicense + ^)"); +} + +TEST_CASE ("default-feature-core errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "default-features": ["core"] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == "error: while loading :\n" + "$.default-features[0] (a default feature): the feature \"core\" turns off " + "default features and thus can't be in the default features list"); +} + +TEST_CASE ("default-feature-core-object errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "default-features": [ { "name": "core" } ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == "error: while loading :\n" + "$.default-features[0].name (a default feature): the feature \"core\" turns " + "off default features and thus can't be in the default features list"); +} + +TEST_CASE ("default-feature-default errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "default-features": ["default"] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == + "error: while loading :\n" + "$.default-features[0] (a default feature): the feature \"default\" refers to " + "the set of default features and thus can't be in the default features list"); +} + +TEST_CASE ("default-feature-default-object errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "default-features": [ { "name": "default" } ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == + "error: while loading :\n" + "$.default-features[0].name (a default feature): the feature \"default\" refers to the set of default " + "features and thus can't be in the default features list"); +} + +TEST_CASE ("default-feature-empty errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "default-features": [""] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == "error: while loading :\n" + "$.default-features[0] (a feature name): \"\" is not a valid feature name. " + "Feature names must be lowercase alphanumeric+hypens and not reserved (see " + "https://learn.microsoft.com/vcpkg/users/manifests for more information)."); +} + +TEST_CASE ("default-feature-empty-object errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "default-features": [ { "name": "" } ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == + "error: while loading :\n" + "$.default-features[0].name (a feature name): \"\" is not a valid feature name. " + "Feature names must be lowercase alphanumeric+hypens and not reserved (see " + "https://learn.microsoft.com/vcpkg/users/manifests for more information)."); +} + +TEST_CASE ("dependency-name-empty errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "dependencies": [ "" ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == "error: while loading :\n" + "$.dependencies[0] (a package name): \"\" is not a valid package name. " + "Package names must be lowercase alphanumeric+hypens and not reserved (see " + "https://learn.microsoft.com/vcpkg/users/manifests for more information)."); +} + +TEST_CASE ("dependency-name-empty-object errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "dependencies": [ { "name": "" } ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == "error: while loading :\n" + "$.dependencies[0].name (a package name): \"\" is not a valid package name. " + "Package names must be lowercase alphanumeric+hypens and not reserved (see " + "https://learn.microsoft.com/vcpkg/users/manifests for more information)."); +} + +TEST_CASE ("dependency-feature-name-core errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "dependencies": [ + { + "name": "icu", + "features": [ "core" ] + } + ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == + "error: while loading :\n" + "$.dependencies[0].features[0] (a feature name): the feature \"core\" cannot be in a dependency's feature " + "list. To turn off default features, add \"default-features\": false instead."); +} + +TEST_CASE ("dependency-feature-name-core-object errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "dependencies": [ + { + "name": "icu", + "features": [ { "name": "core" } ] + } + ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE( + m_pgh.error()->to_string() == + "error: while loading :\n" + "$.dependencies[0].features[0].name (a feature name): the feature \"core\" cannot be in a dependency's feature " + "list. To turn off default features, add \"default-features\": false instead."); +} + +TEST_CASE ("dependency-feature-name-default errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "dependencies": [ + { + "name": "icu", + "features": [ "default" ] + } + ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == + "error: while loading :\n" + "$.dependencies[0].features[0] (a feature name): the feature \"default\" cannot be in a dependency's " + "feature list. To turn on default features, add \"default-features\": true instead."); +} + +TEST_CASE ("dependency-feature-name-default-object errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "dependencies": [ + { + "name": "icu", + "features": [ { "name": "default" } ] + } + ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == + "error: while loading :\n" + "$.dependencies[0].features[0].name (a feature name): the feature \"default\" cannot be in a dependency's " + "feature list. To turn on default features, add \"default-features\": true instead."); +} +TEST_CASE ("dependency-feature-name-empty errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "dependencies": [ + { + "name": "icu", + "features": [ "" ] + } + ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == + "error: while loading :\n" + "$.dependencies[0].features[0] (a feature name): \"\" is not a valid feature name. Feature names must be " + "lowercase alphanumeric+hypens and not reserved (see https://learn.microsoft.com/vcpkg/users/manifests for " + "more information)."); +} + +TEST_CASE ("dependency-feature-name-empty-object errors", "[manifests]") +{ + auto m_pgh = test_parse_project_manifest(R"json({ + "dependencies": [ + { + "name": "icu", + "features": [ { "name": "" } ] + } + ] + })json", + PrintErrors::No); + REQUIRE(!m_pgh.has_value()); + REQUIRE(m_pgh.error()->to_string() == + "error: while loading :\n" + "$.dependencies[0].features[0].name (a feature name): \"\" is not a valid feature name. Feature names must " + "be lowercase alphanumeric+hypens and not reserved (see https://learn.microsoft.com/vcpkg/users/manifests " + "for more information)."); } diff --git a/src/vcpkg-test/messages.cpp b/src/vcpkg-test/messages.cpp index 2298e1e9ea..b774ce6e42 100644 --- a/src/vcpkg-test/messages.cpp +++ b/src/vcpkg-test/messages.cpp @@ -3,10 +3,9 @@ #include #include -#include +#include using namespace vcpkg; -using namespace vcpkg::Commands; TEST_CASE ("append floating list", "[LocalizedString]") { @@ -15,8 +14,8 @@ TEST_CASE ("append floating list", "[LocalizedString]") CHECK(LocalizedString().append_floating_list(2, std::vector{}) == LocalizedString()); CHECK(LocalizedString().append_floating_list(2, std::vector{a}) == LocalizedString::from_raw(" a")); - const auto expected = LocalizedString::from_raw(" heading\n a\n b"); - CHECK(LocalizedString::from_raw(" heading").append_floating_list(2, std::vector{a, b}) == + const auto expected = LocalizedString::from_raw(" heading\n a\n b"); + CHECK(LocalizedString::from_raw(" heading").append_floating_list(2, std::vector{a, b}) == expected); } diff --git a/src/vcpkg-test/metrics.cpp b/src/vcpkg-test/metrics.cpp index cd25e1a1b8..2011349302 100644 --- a/src/vcpkg-test/metrics.cpp +++ b/src/vcpkg-test/metrics.cpp @@ -225,7 +225,8 @@ TEST_CASE ("payload smoke test", "[metrics]") ], "buildtimes": [ 12.000000 - ] + ], + "process_tree": "" }, "measurements": { "elapsed_us": 12.000000 diff --git a/src/vcpkg-test/mockcmakevarsprovider.cpp b/src/vcpkg-test/mockcmakevarsprovider.cpp index 77a796fade..9edf1e576d 100644 --- a/src/vcpkg-test/mockcmakevarsprovider.cpp +++ b/src/vcpkg-test/mockcmakevarsprovider.cpp @@ -1,3 +1,5 @@ +#include + #include namespace vcpkg::Test @@ -5,24 +7,18 @@ namespace vcpkg::Test Optional&> MockCMakeVarProvider::get_generic_triplet_vars( Triplet triplet) const { - auto it = generic_triplet_vars.find(triplet); - if (it == generic_triplet_vars.end()) return nullopt; - return it->second; + return Util::lookup_value(generic_triplet_vars, triplet); } Optional&> MockCMakeVarProvider::get_dep_info_vars( const PackageSpec& spec) const { - auto it = dep_info_vars.find(spec); - if (it == dep_info_vars.end()) return nullopt; - return it->second; + return Util::lookup_value(dep_info_vars, spec); } Optional&> MockCMakeVarProvider::get_tag_vars( const PackageSpec& spec) const { - auto it = tag_vars.find(spec); - if (it == tag_vars.end()) return nullopt; - return it->second; + return Util::lookup_value(tag_vars, spec); } } diff --git a/src/vcpkg-test/new.cpp b/src/vcpkg-test/new.cpp index b10224708e..0254af66f8 100644 --- a/src/vcpkg-test/new.cpp +++ b/src/vcpkg-test/new.cpp @@ -11,7 +11,7 @@ static std::string example_version_date = "2022-07-05"; static std::string example_version_string = "vista"; using namespace vcpkg; -using namespace vcpkg::Commands; +using namespace vcpkg; TEST_CASE ("error cases", "[new]") { diff --git a/src/vcpkg-test/paragraph.cpp b/src/vcpkg-test/paragraph.cpp index 9e70579182..90084cc95f 100644 --- a/src/vcpkg-test/paragraph.cpp +++ b/src/vcpkg-test/paragraph.cpp @@ -117,7 +117,8 @@ TEST_CASE ("SourceParagraph construct maximum", "[paragraph]") REQUIRE(pgh.core_paragraph->dependencies.size() == 1); REQUIRE(pgh.core_paragraph->dependencies[0].name == "bd"); REQUIRE(pgh.core_paragraph->default_features.size() == 1); - REQUIRE(pgh.core_paragraph->default_features[0] == "df"); + REQUIRE(pgh.core_paragraph->default_features[0].name == "df"); + REQUIRE(pgh.core_paragraph->default_features[0].platform.is_empty()); } TEST_CASE ("SourceParagraph construct feature", "[paragraph]") @@ -203,7 +204,8 @@ TEST_CASE ("SourceParagraph default features", "[paragraph]") auto& pgh = **m_pgh.get(); REQUIRE(pgh.core_paragraph->default_features.size() == 1); - REQUIRE(pgh.core_paragraph->default_features[0] == "a1"); + REQUIRE(pgh.core_paragraph->default_features[0].name == "a1"); + REQUIRE(pgh.core_paragraph->default_features[0].platform.is_empty()); } TEST_CASE ("BinaryParagraph construct minimum", "[paragraph]") diff --git a/src/vcpkg-test/plan.cpp b/src/vcpkg-test/plan.cpp index 713b61bbd1..f5e9759d1f 100644 --- a/src/vcpkg-test/plan.cpp +++ b/src/vcpkg-test/plan.cpp @@ -58,6 +58,34 @@ static void remove_plan_check(RemovePlanAction& plan, std::string pkg_name, Trip REQUIRE(pkg_name == plan.spec.name()); } +static ActionPlan create_feature_install_plan(const PortFileProvider& port_provider, + const CMakeVars::CMakeVarProvider& var_provider, + View specs, + const StatusParagraphs& status_db) +{ + const CreateInstallPlanOptions create_options{Test::X64_ANDROID, "pkg"}; + return create_feature_install_plan(port_provider, var_provider, specs, status_db, create_options); +} + +static ActionPlan create_feature_install_plan(const PortFileProvider& port_provider, + const CMakeVars::CMakeVarProvider& var_provider, + View specs, + const StatusParagraphs& status_db, + Triplet host_triplet) +{ + const CreateInstallPlanOptions create_options{host_triplet, "pkg"}; + return create_feature_install_plan(port_provider, var_provider, specs, status_db, create_options); +} + +static ActionPlan create_upgrade_plan(const PortFileProvider& provider, + const CMakeVars::CMakeVarProvider& var_provider, + const std::vector& specs, + const StatusParagraphs& status_db) +{ + const CreateInstallPlanOptions create_options{Test::X64_ANDROID, "pkg"}; + return create_upgrade_plan(provider, var_provider, specs, status_db, create_options); +} + TEST_CASE ("basic install scheme", "[plan]") { std::vector> status_paragraphs; @@ -420,6 +448,45 @@ TEST_CASE ("install all features test", "[plan]") features_check(install_plan.install_actions.at(0), "a", {"0", "1", "core"}, Test::X64_WINDOWS); } +TEST_CASE ("install platform dependent default features", "[plan]") +{ + std::vector> status_paragraphs; + + // Add a port "a" with default features "1" and features "0" and "1". + PackageSpecMap spec_map(Test::X64_WINDOWS); + auto iter = spec_map.emplace("a", "", {{"0", ""}, {"1", ""}}); + // feature "1" is a default feature on "linux" + using MBO = PlatformExpression::MultipleBinaryOperators; + auto linux_expr = PlatformExpression::parse_platform_expression("linux", MBO::Deny).value_or_exit(VCPKG_LINE_INFO); + spec_map.map["a"].source_control_file->core_paragraph->default_features = { + DependencyRequestedFeature{"1", std::move(linux_expr)}}; + + MapPortFileProvider map_port{spec_map.map}; + MockCMakeVarProvider var_provider; + + SECTION ("on !linux") + { + // Install "a" (without explicit feature specification) + auto install_plan = create_feature_install_plan(map_port, + var_provider, + Test::parse_test_fspecs("a:x64-windows"), + StatusParagraphs(std::move(status_paragraphs))); + // Expect the default feature "1" to be installed, but not "0" + REQUIRE(install_plan.size() == 1); + features_check(install_plan.install_actions.at(0), "a", {"core"}, Test::X64_WINDOWS); + } + SECTION ("on linux") + { + var_provider.dep_info_vars[iter] = {{"VCPKG_CMAKE_SYSTEM_NAME", "Linux"}}; + auto install_plan = create_feature_install_plan(map_port, + var_provider, + Test::parse_test_fspecs("a:x64-windows"), + StatusParagraphs(std::move(status_paragraphs))); + REQUIRE(install_plan.size() == 1); + features_check(install_plan.install_actions.at(0), "a", {"core", "1"}, Test::X64_WINDOWS); + } +} + TEST_CASE ("install default features test 1", "[plan]") { std::vector> status_paragraphs; @@ -914,8 +981,8 @@ TEST_CASE ("basic remove scheme", "[plan]") pghs.push_back(make_status_pgh("a")); StatusParagraphs status_db(std::move(pghs)); - auto remove_plan = create_remove_plan({{"a", Test::X86_WINDOWS}}, status_db); - + auto plan = create_remove_plan({{"a", Test::X86_WINDOWS}}, status_db); + auto& remove_plan = plan.remove; REQUIRE(remove_plan.size() == 1); REQUIRE(remove_plan.at(0).spec.name() == "a"); } @@ -927,7 +994,8 @@ TEST_CASE ("recurse remove scheme", "[plan]") pghs.push_back(make_status_pgh("b", "a")); StatusParagraphs status_db(std::move(pghs)); - auto remove_plan = create_remove_plan({{"a", Test::X86_WINDOWS}}, status_db); + auto plan = create_remove_plan({{"a", Test::X86_WINDOWS}}, status_db); + auto& remove_plan = plan.remove; REQUIRE(remove_plan.size() == 2); REQUIRE(remove_plan.at(0).spec.name() == "b"); @@ -942,7 +1010,8 @@ TEST_CASE ("features depend remove scheme", "[plan]") pghs.push_back(make_status_feature_pgh("b", "0", "a")); StatusParagraphs status_db(std::move(pghs)); - auto remove_plan = create_remove_plan({{"a", Test::X86_WINDOWS}}, status_db); + auto plan = create_remove_plan({{"a", Test::X86_WINDOWS}}, status_db); + auto& remove_plan = plan.remove; REQUIRE(remove_plan.size() == 2); REQUIRE(remove_plan.at(0).spec.name() == "b"); @@ -958,7 +1027,8 @@ TEST_CASE ("features depend remove scheme once removed", "[plan]") pghs.push_back(make_status_feature_pgh("opencv", "vtk", "vtk")); StatusParagraphs status_db(std::move(pghs)); - auto remove_plan = create_remove_plan({{"expat", Test::X86_WINDOWS}}, status_db); + auto plan = create_remove_plan({{"expat", Test::X86_WINDOWS}}, status_db); + auto& remove_plan = plan.remove; REQUIRE(remove_plan.size() == 3); REQUIRE(remove_plan.at(0).spec.name() == "opencv"); @@ -975,7 +1045,8 @@ TEST_CASE ("features depend remove scheme once removed x64", "[plan]") pghs.push_back(make_status_feature_pgh("opencv", "vtk", "vtk", "x64")); StatusParagraphs status_db(std::move(pghs)); - auto remove_plan = create_remove_plan({{"expat", Triplet::from_canonical_name("x64")}}, status_db); + auto plan = create_remove_plan({{"expat", Triplet::from_canonical_name("x64")}}, status_db); + auto& remove_plan = plan.remove; REQUIRE(remove_plan.size() == 3); REQUIRE(remove_plan.at(0).spec.name() == "opencv"); @@ -990,7 +1061,8 @@ TEST_CASE ("features depend core remove scheme", "[plan]") pghs.push_back(make_status_pgh("cpr", "curl[core]", "", "x64")); StatusParagraphs status_db(std::move(pghs)); - auto remove_plan = create_remove_plan({{"curl", Triplet::from_canonical_name("x64")}}, status_db); + auto plan = create_remove_plan({{"curl", Triplet::from_canonical_name("x64")}}, status_db); + auto& remove_plan = plan.remove; REQUIRE(remove_plan.size() == 2); REQUIRE(remove_plan.at(0).spec.name() == "cpr"); @@ -1005,7 +1077,8 @@ TEST_CASE ("features depend core remove scheme 2", "[plan]") pghs.push_back(make_status_feature_pgh("curl", "b", "curl[a]", "x64")); StatusParagraphs status_db(std::move(pghs)); - auto remove_plan = create_remove_plan({{"curl", Triplet::from_canonical_name("x64")}}, status_db); + auto plan = create_remove_plan({{"curl", Triplet::from_canonical_name("x64")}}, status_db); + auto& remove_plan = plan.remove; REQUIRE(remove_plan.size() == 1); REQUIRE(remove_plan.at(0).spec.name() == "curl"); @@ -1022,16 +1095,16 @@ TEST_CASE ("self-referencing scheme", "[plan]") SECTION ("basic") { - auto install_plan = create_feature_install_plan( - map_port, var_provider, Test::parse_test_fspecs("a"), {}, {{}, Test::X64_WINDOWS}); + auto install_plan = + create_feature_install_plan(map_port, var_provider, Test::parse_test_fspecs("a"), {}, Test::X64_WINDOWS); REQUIRE(install_plan.size() == 1); REQUIRE(install_plan.install_actions.at(0).spec == spec_a); } SECTION ("qualified") { - auto install_plan = create_feature_install_plan( - map_port, var_provider, Test::parse_test_fspecs("b"), {}, {{}, Test::X64_WINDOWS}); + auto install_plan = + create_feature_install_plan(map_port, var_provider, Test::parse_test_fspecs("b"), {}, Test::X64_WINDOWS); REQUIRE(install_plan.size() == 1); REQUIRE(install_plan.install_actions.at(0).spec == spec_b); @@ -1056,7 +1129,7 @@ TEST_CASE ("basic tool port scheme", "[plan]") var_provider, Test::parse_test_fspecs("a"), StatusParagraphs(std::move(status_paragraphs)), - {{}, Test::X64_WINDOWS}); + Test::X64_WINDOWS); REQUIRE(install_plan.size() == 3); REQUIRE(install_plan.install_actions.at(0).spec.name() == "c"); @@ -1085,8 +1158,7 @@ TEST_CASE ("basic existing tool port scheme", "[plan]") MapPortFileProvider map_port(spec_map.map); - auto install_plan = - create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, {{}, Test::X64_WINDOWS}); + auto install_plan = create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, Test::X64_WINDOWS); REQUIRE(install_plan.size() == 1); REQUIRE(install_plan.install_actions.at(0).spec == spec_a); @@ -1101,16 +1173,14 @@ TEST_CASE ("basic existing tool port scheme", "[plan]") MapPortFileProvider map_port(spec_map.map); - auto install_plan = - create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, {{}, Test::X64_WINDOWS}); + auto install_plan = create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, Test::X64_WINDOWS); REQUIRE(install_plan.size() == 2); REQUIRE(install_plan.install_actions.at(0).spec.name() == "a"); REQUIRE(install_plan.install_actions.at(0).spec.triplet() == Test::X64_WINDOWS); REQUIRE(install_plan.install_actions.at(1).spec == spec_a); - install_plan = - create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, {{}, Test::X86_WINDOWS}); + install_plan = create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, Test::X86_WINDOWS); REQUIRE(install_plan.size() == 1); REQUIRE(install_plan.install_actions.at(0).spec == spec_a); @@ -1126,8 +1196,7 @@ TEST_CASE ("basic existing tool port scheme", "[plan]") MapPortFileProvider map_port(spec_map.map); - auto install_plan = - create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, {{}, Test::ARM_UWP}); + auto install_plan = create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, Test::ARM_UWP); REQUIRE(install_plan.size() == 2); REQUIRE(install_plan.install_actions.at(0).spec.name() == "b"); @@ -1146,8 +1215,7 @@ TEST_CASE ("basic existing tool port scheme", "[plan]") MapPortFileProvider map_port(spec_map.map); - auto install_plan = - create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, {{}, Test::X64_WINDOWS}); + auto install_plan = create_feature_install_plan(map_port, var_provider, fspecs_a, status_db, Test::X64_WINDOWS); REQUIRE(install_plan.size() == 1); REQUIRE(install_plan.install_actions.at(0).spec == spec_a); @@ -1160,7 +1228,8 @@ TEST_CASE ("remove tool port scheme", "[plan]") pghs.push_back(make_status_pgh("a")); StatusParagraphs status_db(std::move(pghs)); - auto remove_plan = create_remove_plan({{"a", Test::X86_WINDOWS}}, status_db); + auto plan = create_remove_plan({{"a", Test::X86_WINDOWS}}, status_db); + auto& remove_plan = plan.remove; REQUIRE(remove_plan.size() == 1); REQUIRE(remove_plan.at(0).spec.name() == "a"); diff --git a/src/vcpkg-test/registries.cpp b/src/vcpkg-test/registries.cpp index a54523f8a0..c4f9830503 100644 --- a/src/vcpkg-test/registries.cpp +++ b/src/vcpkg-test/registries.cpp @@ -14,23 +14,50 @@ namespace { StringLiteral kind() const override { return "test"; } - std::unique_ptr get_port_entry(StringView) const override { return nullptr; } + ExpectedL> get_port_entry(StringView) const override { return nullptr; } - void get_all_port_names(std::vector&) const override { } + ExpectedL append_all_port_names(std::vector& port_names) const override + { + port_names.insert(port_names.end(), all_port_names.begin(), all_port_names.end()); + return Unit{}; + } + + ExpectedL try_append_all_port_names_no_network(std::vector& port_names) const override + { + port_names.insert(port_names.end(), no_network_port_names.begin(), no_network_port_names.end()); + return !no_network_port_names.empty(); + } - ExpectedL get_baseline_version(StringView) const override + ExpectedL> get_baseline_version(StringView) const override { return LocalizedString::from_raw("error"); } int number; - - TestRegistryImplementation(int n) : number(n) { } + std::vector all_port_names; + std::vector no_network_port_names; + + TestRegistryImplementation(int n) : number(n), all_port_names(), no_network_port_names() { } + TestRegistryImplementation(int n, + std::vector&& all_port_names, + std::vector&& no_network_port_names) + : number(n), all_port_names(all_port_names), no_network_port_names(no_network_port_names) + { + } }; - Registry make_registry(int n, std::vector&& port_names) + Registry make_registry(int n, std::vector&& patterns) { - return {std::move(port_names), std::make_unique(n)}; + return {std::move(patterns), std::make_unique(n)}; + } + + Registry make_registry(int n, + std::vector&& patterns, + std::vector&& known_no_network, + std::vector&& known_network) + { + return {std::move(patterns), + std::make_unique(n, std::move(known_no_network), std::move(known_network))}; } int get_tri_num(const RegistryImplementation& r) @@ -87,7 +114,6 @@ TEST_CASE ("registry_set_selects_registry", "[registries]") TEST_CASE ("check valid package patterns", "[registries]") { using ID = Json::IdentifierDeserializer; - using PD = Json::PackagePatternDeserializer; // test identifiers CHECK(ID::is_ident("co")); @@ -123,34 +149,34 @@ TEST_CASE ("check valid package patterns", "[registries]") CHECK(!ID::is_ident("---")); // accept prefixes - CHECK(PD::is_package_pattern("*")); - CHECK(PD::is_package_pattern("b*")); - CHECK(PD::is_package_pattern("boost*")); - CHECK(PD::is_package_pattern("boost-*")); + CHECK(is_package_pattern("*")); + CHECK(is_package_pattern("b*")); + CHECK(is_package_pattern("boost*")); + CHECK(is_package_pattern("boost-*")); // reject invalid patterns - CHECK(!PD::is_package_pattern("*a")); - CHECK(!PD::is_package_pattern("a*a")); - CHECK(!PD::is_package_pattern("a**")); - CHECK(!PD::is_package_pattern("a+")); - CHECK(!PD::is_package_pattern("a?")); + CHECK(!is_package_pattern("*a")); + CHECK(!is_package_pattern("a*a")); + CHECK(!is_package_pattern("a**")); + CHECK(!is_package_pattern("a+")); + CHECK(!is_package_pattern("a?")); } TEST_CASE ("calculate prefix priority", "[registries]") { - CHECK(package_match_prefix("boost", "*") == 1); - CHECK(package_match_prefix("boost", "b*") == 2); - CHECK(package_match_prefix("boost", "boost*") == 6); - CHECK(package_match_prefix("boost", "boost") == SIZE_MAX); - - CHECK(package_match_prefix("", "") == SIZE_MAX); - CHECK(package_match_prefix("", "*") == 1); - CHECK(package_match_prefix("", "a") == 0); - CHECK(package_match_prefix("boost", "") == 0); - CHECK(package_match_prefix("boost", "c*") == 0); - CHECK(package_match_prefix("boost", "*c") == 0); - CHECK(package_match_prefix("boost", "c**") == 0); - CHECK(package_match_prefix("boost", "c*a") == 0); + CHECK(package_pattern_match("boost", "*") == 1); + CHECK(package_pattern_match("boost", "b*") == 2); + CHECK(package_pattern_match("boost", "boost*") == 6); + CHECK(package_pattern_match("boost", "boost") == SIZE_MAX); + + CHECK(package_pattern_match("", "") == SIZE_MAX); + CHECK(package_pattern_match("", "*") == 1); + CHECK(package_pattern_match("", "a") == 0); + CHECK(package_pattern_match("boost", "") == 0); + CHECK(package_pattern_match("boost", "c*") == 0); + CHECK(package_pattern_match("boost", "*c") == 0); + CHECK(package_pattern_match("boost", "c**") == 0); + CHECK(package_pattern_match("boost", "c*a") == 0); } TEST_CASE ("select highest priority registry", "[registries]") @@ -396,15 +422,15 @@ TEST_CASE ("registries report pattern errors", "[registries]") CHECK(errors[0] == "$.registries[0].packages[1] (a package pattern): \"\" is not a valid package pattern. Package patterns must " "use only one wildcard character (*) and it must be the last character in the pattern (see " - "https://learn.microsoft.com/vcpkg/users/registries for more information)"); + "https://learn.microsoft.com/vcpkg/users/registries for more information)."); CHECK(errors[1] == "$.registries[0].packages[2] (a package pattern): \"a*a\" is not a valid package pattern. Package patterns " "must use only one wildcard character (*) and it must be the last character in the pattern (see " - "https://learn.microsoft.com/vcpkg/users/registries for more information)"); + "https://learn.microsoft.com/vcpkg/users/registries for more information)."); CHECK(errors[2] == "$.registries[0].packages[3] (a package pattern): \"*a\" is not a valid package pattern. Package patterns " "must use only one wildcard character (*) and it must be the last character in the pattern (see " - "https://learn.microsoft.com/vcpkg/users/registries for more information)"); + "https://learn.microsoft.com/vcpkg/users/registries for more information)."); } TEST_CASE ("registries ignored patterns warning", "[registries]") @@ -476,40 +502,40 @@ TEST_CASE ("registries ignored patterns warning", "[registries]") const auto& warnings = r.warnings(); REQUIRE(warnings.size() == 3); CHECK(warnings[0] == R"($ (a configuration object): warning: Package "*" is duplicated. - First declared in: - location: $.registries[0].packages[0] - registry: https://github.com/Microsoft/vcpkg + First declared in: + location: $.registries[0].packages[0] + registry: https://github.com/Microsoft/vcpkg - The following redeclarations will be ignored: - location: $.registries[2].packages[0] - registry: https://github.com/another-remote/another-vcpkg-registry + The following redeclarations will be ignored: + location: $.registries[2].packages[0] + registry: https://github.com/another-remote/another-vcpkg-registry )"); CHECK(warnings[1] == R"($ (a configuration object): warning: Package "bei*" is duplicated. - First declared in: - location: $.registries[1].packages[0] - registry: https://github.com/northwindtraders/vcpkg-registry + First declared in: + location: $.registries[1].packages[0] + registry: https://github.com/northwindtraders/vcpkg-registry - The following redeclarations will be ignored: - location: $.registries[2].packages[1] - registry: https://github.com/another-remote/another-vcpkg-registry + The following redeclarations will be ignored: + location: $.registries[2].packages[1] + registry: https://github.com/another-remote/another-vcpkg-registry )"); CHECK(warnings[2] == R"($ (a configuration object): warning: Package "zlib" is duplicated. - First declared in: - location: $.registries[0].packages[2] - registry: https://github.com/Microsoft/vcpkg + First declared in: + location: $.registries[0].packages[2] + registry: https://github.com/Microsoft/vcpkg - The following redeclarations will be ignored: - location: $.registries[1].packages[1] - registry: https://github.com/northwindtraders/vcpkg-registry + The following redeclarations will be ignored: + location: $.registries[1].packages[1] + registry: https://github.com/northwindtraders/vcpkg-registry - location: $.registries[2].packages[2] - registry: https://github.com/another-remote/another-vcpkg-registry + location: $.registries[2].packages[2] + registry: https://github.com/another-remote/another-vcpkg-registry )"); } TEST_CASE ("git_version_db_parsing", "[registries]") { - VersionDbEntryArrayDeserializer filesystem_version_db{VersionDbType::Git, "a/b"}; + auto filesystem_version_db = make_git_version_db_deserializer(); Json::Reader r; auto test_json = parse_json(R"json( [ @@ -531,20 +557,20 @@ TEST_CASE ("git_version_db_parsing", "[registries]") ] )json"); - auto results_opt = r.visit(test_json, filesystem_version_db); + auto results_opt = r.visit(test_json, *filesystem_version_db); auto& results = results_opt.value_or_exit(VCPKG_LINE_INFO); - CHECK(results[0].version == Version{"2021-06-26", 0}); + CHECK(results[0].version == SchemedVersion{VersionScheme::Date, {"2021-06-26", 0}}); CHECK(results[0].git_tree == "9b07f8a38bbc4d13f8411921e6734753e15f8d50"); - CHECK(results[1].version == Version{"2021-01-14", 0}); + CHECK(results[1].version == SchemedVersion{VersionScheme::Date, Version{"2021-01-14", 0}}); CHECK(results[1].git_tree == "12b84a31469a78dd4b42dcf58a27d4600f6b2d48"); - CHECK(results[2].version == Version{"2020-04-12", 0}); + CHECK(results[2].version == SchemedVersion{VersionScheme::String, Version{"2020-04-12", 0}}); CHECK(results[2].git_tree == "bd4565e8ab55bc5e098a1750fa5ff0bc4406ca9b"); CHECK(r.errors().empty()); } TEST_CASE ("filesystem_version_db_parsing", "[registries]") { - VersionDbEntryArrayDeserializer filesystem_version_db{VersionDbType::Filesystem, "a/b"}; + auto filesystem_version_db = make_filesystem_version_db_deserializer("a/b"); { Json::Reader r; @@ -567,13 +593,13 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - auto results_opt = r.visit(test_json, filesystem_version_db); + auto results_opt = r.visit(test_json, *filesystem_version_db); auto& results = results_opt.value_or_exit(VCPKG_LINE_INFO); - CHECK(results[0].version == Version{"puppies", 0}); + CHECK(results[0].version == SchemedVersion{VersionScheme::String, {"puppies", 0}}); CHECK(results[0].p == "a/b" VCPKG_PREFERRED_SEPARATOR "c/d"); - CHECK(results[1].version == Version{"doggies", 0}); + CHECK(results[1].version == SchemedVersion{VersionScheme::String, {"doggies", 0}}); CHECK(results[1].p == "a/b" VCPKG_PREFERRED_SEPARATOR "e/d"); - CHECK(results[2].version == Version{"1.2.3", 0}); + CHECK(results[2].version == SchemedVersion{VersionScheme::Semver, {"1.2.3", 0}}); CHECK(results[2].p == "a/b" VCPKG_PREFERRED_SEPARATOR "semvers/here"); CHECK(r.errors().empty()); } @@ -589,7 +615,7 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } @@ -604,7 +630,7 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } @@ -619,7 +645,7 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } @@ -634,7 +660,7 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } @@ -649,7 +675,7 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } @@ -664,7 +690,7 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } @@ -679,7 +705,7 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } @@ -694,7 +720,7 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } @@ -709,7 +735,61 @@ TEST_CASE ("filesystem_version_db_parsing", "[registries]") } ] )json"); - CHECK(r.visit(test_json, filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); + CHECK(r.visit(test_json, *filesystem_version_db).value_or_exit(VCPKG_LINE_INFO).empty()); CHECK(!r.errors().empty()); } } + +TEST_CASE ("get_all_port_names", "[registries]") +{ + std::vector registries; + // no network 0 known ports, unrelated and example are not selected + registries.emplace_back(make_registry(1, + {"hello", "world", "abc*", "notpresent"}, + {"hello", "world", "unrelated", "example", "abcdefg", "abc", "abcde"}, + {})); + // no network has some known ports + registries.emplace_back( + make_registry(2, + {"two*"}, + {"hello", "world", "unrelated", "twoRegistry", "abcdefgXXX", "abcXXX", "abcdeXXX"}, + {"old", "ports", "abcdefgsuper", "twoOld"})); + + SECTION ("with default registry") + { + RegistrySet with_default_registry{std::make_unique( + 1, + std::vector{"aDefault", "bDefault", "cDefault"}, + std::vector{"aDefaultOld", "bDefaultOld", "cDefaultOld"}), + std::move(registries)}; + + // All the known ports from the default registry + // hello, world, abcdefg, abc, abcde from the first registry + // twoRegistry from the second registry + CHECK(with_default_registry.get_all_reachable_port_names().value_or_exit(VCPKG_LINE_INFO) == + std::vector{ + "aDefault", "abc", "abcde", "abcdefg", "bDefault", "cDefault", "hello", "twoRegistry", "world"}); + + // All the old ports from the default registry + // hello, world, notpresent from the first registry (since network was unknown) + // twoOld from the second registry + CHECK(with_default_registry.get_all_known_reachable_port_names_no_network().value_or_exit(VCPKG_LINE_INFO) == + std::vector{ + "aDefaultOld", "bDefaultOld", "cDefaultOld", "hello", "notpresent", "twoOld", "world"}); + } + + SECTION ("without default registry") + { + RegistrySet without_default_registry{nullptr, std::move(registries)}; + + // hello, world, abcdefg, abc, abcde from the first registry + // twoRegistry from the second registry + CHECK(without_default_registry.get_all_reachable_port_names().value_or_exit(VCPKG_LINE_INFO) == + std::vector{"abc", "abcde", "abcdefg", "hello", "twoRegistry", "world"}); + + // hello, world, notpresent from the first registry + // twoOld from the second registry + CHECK(without_default_registry.get_all_known_reachable_port_names_no_network().value_or_exit(VCPKG_LINE_INFO) == + std::vector{"hello", "notpresent", "twoOld", "world"}); + } +} diff --git a/src/vcpkg-test/spdx.cpp b/src/vcpkg-test/spdx.cpp index c23a466c4c..937dcda4a8 100644 --- a/src/vcpkg-test/spdx.cpp +++ b/src/vcpkg-test/spdx.cpp @@ -21,7 +21,7 @@ TEST_CASE ("spdx maximum serialization", "[spdx]") cpgh.raw_version = "1.0"; cpgh.version_scheme = VersionScheme::Relaxed; - InstallPlanAction ipa(spec, scfl, RequestType::USER_REQUESTED, Test::X86_WINDOWS, {}, {}); + InstallPlanAction ipa(spec, scfl, "test_packages_root", RequestType::USER_REQUESTED, Test::X86_WINDOWS, {}, {}, {}); auto& abi = *(ipa.abi_info = AbiInfo{}).get(); abi.package_abi = "ABIHASH"; @@ -175,7 +175,7 @@ TEST_CASE ("spdx minimum serialization", "[spdx]") cpgh.raw_version = "1.0"; cpgh.version_scheme = VersionScheme::String; - InstallPlanAction ipa(spec, scfl, RequestType::USER_REQUESTED, Test::X86_WINDOWS, {}, {}); + InstallPlanAction ipa(spec, scfl, "test_packages_root", RequestType::USER_REQUESTED, Test::X86_WINDOWS, {}, {}, {}); auto& abi = *(ipa.abi_info = AbiInfo{}).get(); abi.package_abi = "deadbeef"; @@ -303,7 +303,7 @@ TEST_CASE ("spdx concat resources", "[spdx]") cpgh.raw_version = "1.0"; cpgh.version_scheme = VersionScheme::String; - InstallPlanAction ipa(spec, scfl, RequestType::USER_REQUESTED, Test::X86_WINDOWS, {}, {}); + InstallPlanAction ipa(spec, scfl, "test_packages_root", RequestType::USER_REQUESTED, Test::X86_WINDOWS, {}, {}, {}); auto& abi = *(ipa.abi_info = AbiInfo{}).get(); abi.package_abi = "deadbeef"; diff --git a/src/vcpkg-test/specifier.cpp b/src/vcpkg-test/specifier.cpp index 8a86449856..06db33fbd9 100644 --- a/src/vcpkg-test/specifier.cpp +++ b/src/vcpkg-test/specifier.cpp @@ -38,23 +38,64 @@ TEST_CASE ("specifier parsing", "[specifier]") { SECTION ("parsed specifier from string") { - auto maybe_spec = vcpkg::parse_qualified_specifier("zlib"); - REQUIRE(maybe_spec.has_value()); - - auto& spec = *maybe_spec.get(); + auto spec = vcpkg::parse_qualified_specifier("zlib").value_or_exit(VCPKG_LINE_INFO); REQUIRE(spec.name == "zlib"); REQUIRE(!spec.features); REQUIRE(!spec.triplet); + REQUIRE(!spec.platform); + + bool default_triplet_used = false; + auto full_spec_implicit = spec.to_full_spec(Test::X86_WINDOWS, default_triplet_used, ImplicitDefault::YES) + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(default_triplet_used); + default_triplet_used = false; + REQUIRE(full_spec_implicit.package_spec.name() == "zlib"); + REQUIRE(full_spec_implicit.package_spec.triplet() == Test::X86_WINDOWS); + REQUIRE(full_spec_implicit.features == std::vector{"core", "default"}); + + auto full_spec_explicit = spec.to_full_spec(Test::X86_WINDOWS, default_triplet_used, ImplicitDefault::NO) + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(default_triplet_used); + default_triplet_used = false; + REQUIRE(full_spec_explicit.package_spec.name() == "zlib"); + REQUIRE(full_spec_explicit.package_spec.triplet() == Test::X86_WINDOWS); + REQUIRE(full_spec_explicit.features == std::vector{"core"}); + + auto package_spec = + spec.to_package_spec(Test::X86_WINDOWS, default_triplet_used).value_or_exit(VCPKG_LINE_INFO); + REQUIRE(default_triplet_used); + REQUIRE(package_spec.name() == "zlib"); + REQUIRE(package_spec.triplet() == Test::X86_WINDOWS); } SECTION ("parsed specifier from string with triplet") { - auto maybe_spec = vcpkg::parse_qualified_specifier("zlib:x64-uwp"); - REQUIRE(maybe_spec); - - auto& spec = *maybe_spec.get(); + auto spec = vcpkg::parse_qualified_specifier("zlib:x64-uwp").value_or_exit(VCPKG_LINE_INFO); REQUIRE(spec.name == "zlib"); - REQUIRE(spec.triplet.value_or("") == "x64-uwp"); + REQUIRE(!spec.features); + REQUIRE(spec.triplet.value_or_exit(VCPKG_LINE_INFO) == "x64-uwp"); + REQUIRE(!spec.platform); + + bool default_triplet_used = false; + auto full_spec_implicit = spec.to_full_spec(Test::X86_WINDOWS, default_triplet_used, ImplicitDefault::YES) + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(!default_triplet_used); + REQUIRE(full_spec_implicit.package_spec.name() == "zlib"); + REQUIRE(full_spec_implicit.package_spec.triplet() == Test::X64_UWP); + REQUIRE(full_spec_implicit.features == std::vector{"core", "default"}); + + auto full_spec_explicit = spec.to_full_spec(Test::X86_WINDOWS, default_triplet_used, ImplicitDefault::NO) + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(!default_triplet_used); + REQUIRE(full_spec_explicit.package_spec.name() == "zlib"); + REQUIRE(full_spec_explicit.package_spec.triplet() == Test::X64_UWP); + REQUIRE(full_spec_explicit.features == std::vector{"core"}); + + auto package_spec = + spec.to_package_spec(Test::X86_WINDOWS, default_triplet_used).value_or_exit(VCPKG_LINE_INFO); + REQUIRE(!default_triplet_used); + REQUIRE(package_spec.name() == "zlib"); + REQUIRE(package_spec.triplet() == Test::X64_UWP); } SECTION ("parsed specifier from string with colons") @@ -65,28 +106,50 @@ TEST_CASE ("specifier parsing", "[specifier]") SECTION ("parsed specifier from string with feature") { - auto maybe_spec = vcpkg::parse_qualified_specifier("zlib[feature]:x64-uwp"); - REQUIRE(maybe_spec); - - auto& spec = *maybe_spec.get(); + auto spec = vcpkg::parse_qualified_specifier("zlib[feature]:x64-uwp").value_or_exit(VCPKG_LINE_INFO); REQUIRE(spec.name == "zlib"); REQUIRE(spec.features.value_or(std::vector{}) == std::vector{"feature"}); REQUIRE(spec.triplet.value_or("") == "x64-uwp"); + REQUIRE(!spec.platform); + + bool default_triplet_used = false; + auto full_spec_implicit = spec.to_full_spec(Test::X86_WINDOWS, default_triplet_used, ImplicitDefault::YES) + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(!default_triplet_used); + REQUIRE(full_spec_implicit.package_spec.name() == "zlib"); + REQUIRE(full_spec_implicit.package_spec.triplet() == Test::X64_UWP); + REQUIRE(full_spec_implicit.features == std::vector{"feature", "core", "default"}); + + auto full_spec_explicit = spec.to_full_spec(Test::X86_WINDOWS, default_triplet_used, ImplicitDefault::NO) + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(!default_triplet_used); + REQUIRE(full_spec_explicit.package_spec.name() == "zlib"); + REQUIRE(full_spec_explicit.package_spec.triplet() == Test::X64_UWP); + REQUIRE(full_spec_explicit.features == std::vector{"feature", "core"}); + + auto maybe_package_spec = spec.to_package_spec(Test::X86_WINDOWS, default_triplet_used); + REQUIRE(!default_triplet_used); + REQUIRE(!maybe_package_spec.has_value()); + REQUIRE(maybe_package_spec.error() == + LocalizedString::from_raw("error: List of features is not allowed in this context")); } SECTION ("parsed specifier from string with many features") { - auto maybe_spec = vcpkg::parse_qualified_specifier("zlib[0, 1,2]"); - REQUIRE(maybe_spec); - - auto& spec = *maybe_spec.get(); - REQUIRE(spec.features.value_or(std::vector{}) == std::vector{"0", "1", "2"}); + auto spec = vcpkg::parse_qualified_specifier("zlib[0, 1,2]").value_or_exit(VCPKG_LINE_INFO); + REQUIRE(spec.name == "zlib"); + REQUIRE(spec.features.value_or_exit(VCPKG_LINE_INFO) == std::vector{"0", "1", "2"}); + REQUIRE(!spec.triplet); + REQUIRE(!spec.platform); } SECTION ("parsed specifier wildcard feature") { auto spec = vcpkg::parse_qualified_specifier("zlib[*]").value_or_exit(VCPKG_LINE_INFO); - REQUIRE(spec.features.value_or(std::vector{}) == std::vector{"*"}); + REQUIRE(spec.name == "zlib"); + REQUIRE(spec.features.value_or_exit(VCPKG_LINE_INFO) == std::vector{"*"}); + REQUIRE(!spec.triplet); + REQUIRE(!spec.platform); } SECTION ("dont expand wildcards") @@ -94,9 +157,11 @@ TEST_CASE ("specifier parsing", "[specifier]") std::vector specs; const auto fspecs = Test::parse_test_fspecs("zlib[core,0,1]:x86-uwp openssl[*]:x86-uwp"); for (auto&& fs : fspecs) + { fs.expand_fspecs_to(specs); - Util::sort(specs); + } + Util::sort(specs); std::vector spectargets{ {{"openssl", Test::X86_UWP}, "core"}, {{"openssl", Test::X86_UWP}, "default"}, @@ -105,24 +170,38 @@ TEST_CASE ("specifier parsing", "[specifier]") {{"zlib", Test::X86_UWP}, "0"}, {{"zlib", Test::X86_UWP}, "1"}, }; + Util::sort(spectargets); Test::check_ranges(specs, spectargets); } -} -#if defined(_WIN32) -TEST_CASE ("ascii to utf16", "[utf16]") -{ - SECTION ("ASCII to utf16") + SECTION ("parsed qualifier platform expression") { - auto str = vcpkg::Strings::to_utf16("abc"); - REQUIRE(str == L"abc"); - } - - SECTION ("ASCII to utf16 with whitespace") - { - auto str = vcpkg::Strings::to_utf16("abc -x86-windows"); - REQUIRE(str == L"abc -x86-windows"); + // this form was used in CONTROL files + auto spec = vcpkg::parse_qualified_specifier("zlib (windows)").value_or_exit(VCPKG_LINE_INFO); + REQUIRE(spec.name == "zlib"); + REQUIRE(!spec.features); + REQUIRE(!spec.triplet); + REQUIRE(to_string(spec.platform.value_or_exit(VCPKG_LINE_INFO)) == "windows"); + + bool default_triplet_used = false; + auto maybe_full_spec_implicit = + spec.to_full_spec(Test::X86_WINDOWS, default_triplet_used, ImplicitDefault::YES); + REQUIRE(!default_triplet_used); + REQUIRE(!maybe_full_spec_implicit.has_value()); + REQUIRE(maybe_full_spec_implicit.error() == + LocalizedString::from_raw("error: Platform qualifier is not allowed in this context")); + + auto maybe_full_spec_explicit = spec.to_full_spec(Test::X86_WINDOWS, default_triplet_used, ImplicitDefault::NO); + REQUIRE(!default_triplet_used); + REQUIRE(!maybe_full_spec_explicit.has_value()); + REQUIRE(maybe_full_spec_explicit.error() == + LocalizedString::from_raw("error: Platform qualifier is not allowed in this context")); + + auto maybe_package_spec = spec.to_package_spec(Test::X86_WINDOWS, default_triplet_used); + REQUIRE(!default_triplet_used); + REQUIRE(!maybe_package_spec.has_value()); + REQUIRE(maybe_package_spec.error() == + LocalizedString::from_raw("error: Platform qualifier is not allowed in this context")); } } -#endif diff --git a/src/vcpkg-test/strings.cpp b/src/vcpkg-test/strings.cpp index cebee1c511..37494191c0 100644 --- a/src/vcpkg-test/strings.cpp +++ b/src/vcpkg-test/strings.cpp @@ -155,7 +155,7 @@ TEST_CASE ("edit distance", "[strings]") TEST_CASE ("replace_all", "[strings]") { - REQUIRE(vcpkg::Strings::replace_all("literal", "ter", "x") == "lixal"); + REQUIRE(vcpkg::Strings::replace_all(vcpkg::StringView("literal"), "ter", "x") == "lixal"); } TEST_CASE ("inplace_replace_all", "[strings]") @@ -232,3 +232,20 @@ TEST_CASE ("api_stable_format(sv,append_f)", "[strings]") }); REQUIRE(*res.get() == "123hello456"); } + +#if defined(_WIN32) +TEST_CASE ("ascii to utf16", "[utf16]") +{ + SECTION ("ASCII to utf16") + { + auto str = vcpkg::Strings::to_utf16("abc"); + REQUIRE(str == L"abc"); + } + + SECTION ("ASCII to utf16 with whitespace") + { + auto str = vcpkg::Strings::to_utf16("abc -x86-windows"); + REQUIRE(str == L"abc -x86-windows"); + } +} +#endif diff --git a/src/vcpkg-test/system.cpp b/src/vcpkg-test/system.cpp index ad29d2e365..195253be3d 100644 --- a/src/vcpkg-test/system.cpp +++ b/src/vcpkg-test/system.cpp @@ -150,6 +150,7 @@ TEST_CASE ("cmd_execute_and_capture_output_parallel", "[system]") { #if defined(_WIN32) vcpkg::Command cmd("cmd.exe"); + cmd.string_arg("/d"); cmd.string_arg("/c"); cmd.string_arg(fmt::format("echo {}", i)); #else diff --git a/src/vcpkg-test/system.process.cpp b/src/vcpkg-test/system.process.cpp new file mode 100644 index 0000000000..997580b036 --- /dev/null +++ b/src/vcpkg-test/system.process.cpp @@ -0,0 +1,76 @@ +#include + +#include +#include + +using namespace vcpkg; + +TEST_CASE ("captures-output", "[system.process]") +{ + auto test_program = Path(get_exe_path_of_current_process().parent_path()) / "reads-stdin"; + Command cmd{test_program}; + cmd.string_arg("this is printed when something is read"); + static constexpr std::size_t minimum_size = 1'000'000; // to exceed OS pipe buffer size + constexpr StringLiteral example = "example"; + constexpr auto examples = (minimum_size / example.size()) + 1; + std::string input; + constexpr auto input_size = examples * example.size(); + for (std::size_t idx = 0; idx < examples; ++idx) + { + input.append(example.data(), example.size()); + } + + std::string expected; + constexpr StringLiteral repeat = "this is printed when something is read"; + constexpr auto repeats = (input_size / 20) + (input_size % 20 != 0) + 1; + for (std::size_t idx = 0; idx < repeats; ++idx) + { + expected.append(repeat.data(), repeat.size()); +#if defined(_WIN32) + expected.push_back('\r'); +#endif // ^^^ _WIN32 + expected.push_back('\n'); + } + + expected.append("success"); +#if defined(_WIN32) + expected.push_back('\r'); +#endif // ^^^ _WIN32 + expected.push_back('\n'); + + auto run = cmd_execute_and_capture_output( + cmd, default_working_directory, default_environment, Encoding::Utf8, EchoInDebug::Hide, input) + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(run.exit_code == 0); + REQUIRE(run.output == expected); +} + +TEST_CASE ("no closes-stdin crash", "[system.process]") +{ + auto test_program = Path(get_exe_path_of_current_process().parent_path()) / "closes-stdin"; + Command cmd{test_program}; + auto run = cmd_execute_and_capture_output(cmd, + default_working_directory, + default_environment, + Encoding::Utf8, + EchoInDebug::Hide, + "this is some input that will be intentionally not read") + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(run.exit_code == 0); + REQUIRE(run.output.empty()); +} + +TEST_CASE ("no closes-stdout crash", "[system.process]") +{ + auto test_program = Path(get_exe_path_of_current_process().parent_path()) / "closes-stdout"; + Command cmd{test_program}; + auto run = cmd_execute_and_capture_output(cmd, + default_working_directory, + default_environment, + Encoding::Utf8, + EchoInDebug::Hide, + "this is some input that will be read") + .value_or_exit(VCPKG_LINE_INFO); + REQUIRE(run.exit_code == 0); + REQUIRE(run.output == "hello world"); +} diff --git a/src/vcpkg-test/update.cpp b/src/vcpkg-test/update.cpp index 4d5e1b6ebe..3e7194b8d9 100644 --- a/src/vcpkg-test/update.cpp +++ b/src/vcpkg-test/update.cpp @@ -2,14 +2,13 @@ #include +#include #include #include -#include #include using namespace vcpkg; -using namespace vcpkg::Update; using namespace vcpkg::Test; using Pgh = std::vector>; @@ -28,7 +27,7 @@ TEST_CASE ("find outdated packages basic", "[update]") MapPortFileProvider provider(map); auto pkgs = SortedVector( - Update::find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); + find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); REQUIRE(pkgs.size() == 1); REQUIRE(pkgs[0].version_diff.left.to_string() == "2"); @@ -52,7 +51,7 @@ TEST_CASE ("find outdated packages features", "[update]") MapPortFileProvider provider(map); auto pkgs = SortedVector( - Update::find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); + find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); REQUIRE(pkgs.size() == 1); REQUIRE(pkgs[0].version_diff.left.to_string() == "2"); @@ -78,7 +77,7 @@ TEST_CASE ("find outdated packages features 2", "[update]") MapPortFileProvider provider(map); auto pkgs = SortedVector( - Update::find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); + find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); REQUIRE(pkgs.size() == 1); REQUIRE(pkgs[0].version_diff.left.to_string() == "2"); @@ -99,7 +98,7 @@ TEST_CASE ("find outdated packages none", "[update]") MapPortFileProvider provider(map); auto pkgs = SortedVector( - Update::find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); + find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); REQUIRE(pkgs.size() == 0); } diff --git a/src/vcpkg-test/util.cpp b/src/vcpkg-test/util.cpp index fb7975c035..5c6f56da7b 100644 --- a/src/vcpkg-test/util.cpp +++ b/src/vcpkg-test/util.cpp @@ -5,11 +5,13 @@ #include #include +#include #include #include #include +#include #include #include @@ -54,6 +56,21 @@ namespace vcpkg::Test return std::move(*m_pgh.get()); } + ParseExpected test_parse_control_file( + const std::vector>& v) + { + std::vector pghs; + for (auto&& p : v) + { + pghs.emplace_back(); + for (auto&& kv : p) + { + pghs.back().emplace(kv.first, std::make_pair(kv.second, vcpkg::TextRowCol{})); + } + } + return vcpkg::SourceControlFile::parse_control_file("", std::move(pghs)); + } + std::unique_ptr make_status_pgh(const char* name, const char* depends, const char* default_features, @@ -93,7 +110,7 @@ namespace vcpkg::Test PackageSpec PackageSpecMap::emplace(vcpkg::SourceControlFileAndLocation&& scfl) { const auto& name = scfl.source_control_file->core_paragraph->name; - REQUIRE(map.find(name) == map.end()); + REQUIRE(!Util::Maps::contains(map, name)); map.emplace(name, std::move(scfl)); return {name, triplet}; } @@ -107,6 +124,22 @@ namespace vcpkg::Test #endif } + std::vector parse_test_fspecs(StringView sv) + { + std::vector ret; + ParserBase parser(sv, "test"); + while (!parser.at_eof()) + { + auto opt = parse_qualified_specifier(parser); + REQUIRE(opt.has_value()); + bool unused = false; + ret.push_back( + opt.get()->to_full_spec(X86_WINDOWS, unused, ImplicitDefault::YES).value_or_exit(VCPKG_LINE_INFO)); + } + + return ret; + } + const Path& base_temporary_directory() noexcept { const static Path BASE_TEMPORARY_DIRECTORY = internal_base_temporary_directory(); @@ -235,4 +268,86 @@ namespace vcpkg::Test check_json_eq(l, r, path, true); } + Optional diff_lines(StringView a, StringView b) + { + auto lines_a = Strings::split_keep_empty(a, '\n'); + auto lines_b = Strings::split_keep_empty(b, '\n'); + + std::vector> edits; + auto& first_row = edits.emplace_back(); + first_row.resize(lines_b.size() + 1); + std::iota(first_row.begin(), first_row.end(), 0); + for (size_t i = 0; i < lines_a.size(); ++i) + { + edits.emplace_back().resize(lines_b.size() + 1); + edits[i + 1][0] = edits[i][0] + 1; + for (size_t j = 0; j < lines_b.size(); ++j) + { + size_t p = edits[i + 1][j] + 1; + size_t m = edits[i][j + 1] + 1; + if (m < p) p = m; + if (lines_a[i] == lines_b[j] && edits[i][j] < p) p = edits[i][j]; + edits[i + 1][j + 1] = p; + } + } + + size_t i = lines_a.size(); + size_t j = lines_b.size(); + if (edits[i][j] == 0) return nullopt; + + std::vector lines; + + while (i > 0 && j > 0) + { + if (edits[i][j] == edits[i - 1][j - 1] && lines_a[i - 1] == lines_b[j - 1]) + { + --j; + --i; + lines.emplace_back(" " + lines_a[i]); + } + else if (edits[i][j] == edits[i - 1][j] + 1) + { + --i; + lines.emplace_back("-" + lines_a[i]); + } + else + { + --j; + lines.emplace_back("+" + lines_b[j]); + } + } + for (; i > 0; --i) + { + lines.emplace_back("-" + lines_a[i - 1]); + } + for (; j > 0; --j) + { + lines.emplace_back("+" + lines_b[j - 1]); + } + std::string ret; + for (auto it = lines.rbegin(); it != lines.rend(); ++it) + { + ret.append(*it); + ret.push_back('\n'); + } + return ret; + } +} + +TEST_CASE ("diff algorithm", "[diff]") +{ + using namespace vcpkg::Test; + CHECK(!diff_lines("hello", "hello")); + CHECK(!diff_lines("hello\n", "hello\n")); + CHECK(!diff_lines("hello\n\nworld", "hello\n\nworld")); + { + auto a = diff_lines("hello\na\nworld", "hello\nworld"); + REQUIRE(a); + CHECK(*a.get() == " hello\n-a\n world\n"); + } + { + auto a = diff_lines("hello\nworld", "hello\na\nworld"); + REQUIRE(a); + CHECK(*a.get() == " hello\n+a\n world\n"); + } } diff --git a/src/vcpkg-test/versionplan.cpp b/src/vcpkg-test/versionplan.cpp index 747bcd3829..a7d2d5fcaf 100644 --- a/src/vcpkg-test/versionplan.cpp +++ b/src/vcpkg-test/versionplan.cpp @@ -25,21 +25,18 @@ TEST_CASE ("parse depends", "[dependencies]") TEST_CASE ("filter depends", "[dependencies]") { const std::vector defaults{"core", "default"}; - const std::vector core{"core"}; const std::unordered_map x64_win_cmake_vars{{"VCPKG_TARGET_ARCHITECTURE", "x64"}, {"VCPKG_CMAKE_SYSTEM_NAME", ""}}; const std::unordered_map arm_uwp_cmake_vars{{"VCPKG_TARGET_ARCHITECTURE", "arm"}, {"VCPKG_CMAKE_SYSTEM_NAME", "WindowsStore"}}; - auto deps_ = parse_dependencies_list("liba (!uwp), libb, libc (uwp)"); REQUIRE(deps_); auto& deps = *deps_.get(); SECTION ("x64-windows") { - auto v = - filter_dependencies(deps, Test::X64_WINDOWS, Test::X86_WINDOWS, x64_win_cmake_vars, ImplicitDefault::YES); + auto v = filter_dependencies(deps, Test::X64_WINDOWS, Test::X86_WINDOWS, x64_win_cmake_vars); REQUIRE(v.size() == 2); REQUIRE(v.at(0).package_spec.name() == "liba"); REQUIRE(v.at(0).features == defaults); @@ -49,12 +46,12 @@ TEST_CASE ("filter depends", "[dependencies]") SECTION ("arm-uwp") { - auto v2 = filter_dependencies(deps, Test::ARM_UWP, Test::X86_WINDOWS, arm_uwp_cmake_vars, ImplicitDefault::NO); + auto v2 = filter_dependencies(deps, Test::ARM_UWP, Test::X86_WINDOWS, arm_uwp_cmake_vars); REQUIRE(v2.size() == 2); REQUIRE(v2.at(0).package_spec.name() == "libb"); - REQUIRE(v2.at(0).features == core); + REQUIRE(v2.at(0).features == defaults); REQUIRE(v2.at(1).package_spec.name() == "libc"); - REQUIRE(v2.at(1).features == core); + REQUIRE(v2.at(1).features == defaults); } } @@ -88,14 +85,19 @@ TEST_CASE ("qualified dependency", "[dependencies]") MapPortFileProvider map_port{spec_map.map}; MockCMakeVarProvider var_provider; - var_provider.dep_info_vars[{"a", Triplet::from_canonical_name("x64-linux")}].emplace("VCPKG_CMAKE_SYSTEM_NAME", - "Linux"); + var_provider.dep_info_vars[{"a", Test::X64_LINUX}].emplace("VCPKG_CMAKE_SYSTEM_NAME", "Linux"); + + const CreateInstallPlanOptions create_options{Test::X64_ANDROID, "pkg"}; - auto plan = vcpkg::create_feature_install_plan(map_port, var_provider, Test::parse_test_fspecs("a"), {}); + auto plan = + vcpkg::create_feature_install_plan(map_port, var_provider, Test::parse_test_fspecs("a"), {}, create_options); REQUIRE(plan.install_actions.size() == 2); REQUIRE(plan.install_actions.at(0).feature_list == std::vector{"core"}); + REQUIRE(plan.install_actions[0].package_dir == "pkg" VCPKG_PREFERRED_SEPARATOR "b_x86-windows"); - auto plan2 = vcpkg::create_feature_install_plan(map_port, var_provider, Test::parse_test_fspecs("a:x64-linux"), {}); + auto plan2 = vcpkg::create_feature_install_plan( + map_port, var_provider, Test::parse_test_fspecs("a:x64-linux"), {}, create_options); REQUIRE(plan2.install_actions.size() == 2); - REQUIRE(plan2.install_actions.at(0).feature_list == std::vector{"b1", "core"}); + REQUIRE(plan2.install_actions[0].feature_list == std::vector{"b1", "core"}); + REQUIRE(plan2.install_actions[0].package_dir == "pkg" VCPKG_PREFERRED_SEPARATOR "b_x64-linux"); } diff --git a/src/vcpkg-test/xunitwriter.cpp b/src/vcpkg-test/xunitwriter.cpp index c80933188b..da3b97a4df 100644 --- a/src/vcpkg-test/xunitwriter.cpp +++ b/src/vcpkg-test/xunitwriter.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include diff --git a/src/vcpkg.cpp b/src/vcpkg.cpp index db5375202f..d0e298413c 100644 --- a/src/vcpkg.cpp +++ b/src/vcpkg.cpp @@ -16,9 +16,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -45,11 +45,11 @@ namespace void invalid_command(const VcpkgCmdArguments& args) { msg::println_error(msgVcpkgInvalidCommand, msg::command_name = args.get_command()); - print_command_list_usage(); + print_zero_args_usage(); Checks::exit_fail(VCPKG_LINE_INFO); } - bool detect_container(vcpkg::Filesystem& fs) + bool detect_container(const Filesystem& fs) { (void)fs; #if defined(_WIN32) @@ -90,20 +90,20 @@ namespace return false; } - void inner(vcpkg::Filesystem& fs, const VcpkgCmdArguments& args, const BundleSettings& bundle) + void inner(const Filesystem& fs, const VcpkgCmdArguments& args, const BundleSettings& bundle) { // track version on each invocation - get_global_metrics_collector().track_string(StringMetric::VcpkgVersion, Commands::Version::version.to_string()); + get_global_metrics_collector().track_string(StringMetric::VcpkgVersion, vcpkg_executable_version); if (args.get_command().empty()) { - print_command_list_usage(); + print_zero_args_usage(); Checks::exit_fail(VCPKG_LINE_INFO); } static const auto find_command = [&](auto&& commands) { auto it = Util::find_if(commands, [&](auto&& commandc) { - return Strings::case_insensitive_ascii_equals(commandc.name, args.get_command()); + return Strings::case_insensitive_ascii_equals(commandc.metadata.name, args.get_command()); }); using std::end; if (it != end(commands)) @@ -118,10 +118,10 @@ namespace get_global_metrics_collector().track_bool(BoolMetric::DetectedContainer, detect_container(fs)); - if (const auto command_function = find_command(Commands::get_available_basic_commands())) + if (const auto command_function = find_command(basic_commands)) { - get_global_metrics_collector().track_string(StringMetric::CommandName, command_function->name); - return command_function->function->perform_and_exit(args, fs); + get_global_metrics_collector().track_string(StringMetric::CommandName, command_function->metadata.name); + return command_function->function(args, fs); } const VcpkgPaths paths(fs, args, bundle); @@ -130,21 +130,18 @@ namespace fs.current_path(paths.root, VCPKG_LINE_INFO); - if (const auto command_function = find_command(Commands::get_available_paths_commands())) + if (const auto command_function = find_command(paths_commands)) { - get_global_metrics_collector().track_string(StringMetric::CommandName, command_function->name); - return command_function->function->perform_and_exit(args, paths); + get_global_metrics_collector().track_string(StringMetric::CommandName, command_function->metadata.name); + return command_function->function(args, paths); } - Triplet default_triplet = vcpkg::default_triplet(args); - check_triplet(default_triplet, paths); - Triplet host_triplet = vcpkg::default_host_triplet(args); - check_triplet(host_triplet, paths); - - if (const auto command_function = find_command(Commands::get_available_triplet_commands())) + Triplet default_triplet = vcpkg::default_triplet(args, paths.get_triplet_db()); + Triplet host_triplet = vcpkg::default_host_triplet(args, paths.get_triplet_db()); + if (const auto command_function = find_command(triplet_commands)) { - get_global_metrics_collector().track_string(StringMetric::CommandName, command_function->name); - return command_function->function->perform_and_exit(args, paths, default_triplet, host_triplet); + get_global_metrics_collector().track_string(StringMetric::CommandName, command_function->metadata.name); + return command_function->function(args, paths, default_triplet, host_triplet); } return invalid_command(args); @@ -163,7 +160,7 @@ namespace vcpkg::Checks get_global_metrics_collector().track_elapsed_us(elapsed_us_inner); Debug::g_debugging = false; - flush_global_metrics(get_real_filesystem()); + flush_global_metrics(real_filesystem); #if defined(_WIN32) if (g_init_console_initialized) @@ -215,7 +212,6 @@ int main(const int argc, const char* const* const argv) if (argc == 0) std::abort(); ElapsedTimer total_timer; - auto& fs = get_real_filesystem(); auto maybe_vslang = get_environment_variable("VSLANG"); if (const auto vslang = maybe_vslang.get()) { @@ -280,7 +276,7 @@ int main(const int argc, const char* const* const argv) } #endif - VcpkgCmdArguments args = VcpkgCmdArguments::create_from_command_line(fs, argc, argv); + VcpkgCmdArguments args = VcpkgCmdArguments::create_from_command_line(real_filesystem, argc, argv); if (const auto p = args.debug.get()) Debug::g_debugging = *p; args.imbue_from_environment(); VcpkgCmdArguments::imbue_or_apply_process_recursion(args); @@ -302,7 +298,7 @@ int main(const int argc, const char* const* const argv) auto disable_metrics_tag_file_path = current_exe_path; disable_metrics_tag_file_path.replace_filename("vcpkg.disable-metrics"); std::error_code ec; - if (fs.exists(disable_metrics_tag_file_path, ec) || ec) + if (real_filesystem.exists(disable_metrics_tag_file_path, ec) || ec) { Debug::println("Disabling metrics because vcpkg.disable-metrics exists"); to_enable_metrics = false; @@ -312,7 +308,8 @@ int main(const int argc, const char* const* const argv) auto bundle_path = current_exe_path; bundle_path.replace_filename("vcpkg-bundle.json"); Debug::println("Trying to load bundleconfig from ", bundle_path); - auto bundle = fs.try_read_contents(bundle_path).then(&try_parse_bundle_settings).value_or(BundleSettings{}); + auto bundle = + real_filesystem.try_read_contents(bundle_path).then(&try_parse_bundle_settings).value_or(BundleSettings{}); Debug::println("Bundle config: ", bundle.to_string()); if (to_enable_metrics) @@ -393,14 +390,14 @@ int main(const int argc, const char* const* const argv) if (Debug::g_debugging) { - inner(fs, args, bundle); + inner(real_filesystem, args, bundle); Checks::exit_fail(VCPKG_LINE_INFO); } std::string exc_msg; try { - inner(fs, args, bundle); + inner(real_filesystem, args, bundle); Checks::exit_fail(VCPKG_LINE_INFO); } catch (std::exception& e) @@ -418,7 +415,7 @@ int main(const int argc, const char* const* const argv) msg::println(); LocalizedString data_blob; data_blob.append_raw("Version=") - .append_raw(Commands::Version::version) + .append_raw(vcpkg_executable_version) .append_raw("\nEXCEPTION=") .append_raw(exc_msg) .append_raw("\nCMD=\n"); diff --git a/src/vcpkg/archives.cpp b/src/vcpkg/archives.cpp index 0a90a36e82..97037712fb 100644 --- a/src/vcpkg/archives.cpp +++ b/src/vcpkg/archives.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -15,7 +16,7 @@ namespace #if defined(_WIN32) void win32_extract_nupkg(const ToolCache& tools, MessageSink& status_sink, const Path& archive, const Path& to_path) { - const auto nuget_exe = tools.get_tool_path(Tools::NUGET, status_sink); + const auto& nuget_exe = tools.get_tool_path(Tools::NUGET, status_sink); const auto stem = archive.stem(); @@ -29,8 +30,8 @@ namespace Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgCouldNotDeduceNugetIdAndVersion, msg::path = archive); } - auto nugetid = StringView{stem.begin(), dot_after_name}; - auto version = StringView{dot_after_name + 1, stem.end()}; + StringView nugetid{stem.begin(), dot_after_name}; + StringView version{dot_after_name + 1, stem.end()}; Command nuget_command{nuget_exe}; nuget_command.string_arg("install") @@ -126,35 +127,77 @@ namespace } #endif // ^^^ _WIN32 - void extract_archive_to_empty( - Filesystem& fs, const ToolCache& tools, MessageSink& status_sink, const Path& archive, const Path& to_path) +} + +namespace vcpkg +{ + ExtractionType guess_extraction_type(const Path& archive) + { const auto ext = archive.extension(); -#if defined(_WIN32) if (Strings::case_insensitive_ascii_equals(ext, ".nupkg")) { - win32_extract_nupkg(tools, status_sink, archive, to_path); + return ExtractionType::Nupkg; } else if (Strings::case_insensitive_ascii_equals(ext, ".msi")) { - win32_extract_msi(archive, to_path); + return ExtractionType::Msi; } else if (Strings::case_insensitive_ascii_equals(ext, ".zip") || Strings::case_insensitive_ascii_equals(ext, ".7z")) { - extract_tar_cmake(tools.get_tool_path(Tools::CMAKE, status_sink), archive, to_path); + return ExtractionType::Zip; + } + else if (ext == ".gz" || ext == ".bz2" || ext == ".tgz" || ext == ".xz") + { + return ExtractionType::Tar; } else if (Strings::case_insensitive_ascii_equals(ext, ".exe")) { - const Path filename = archive.filename(); - const Path stem = filename.stem(); - const Path to_archive = Path(archive.parent_path()) / stem; - win32_extract_self_extracting_7z(fs, archive, to_archive); - extract_archive_to_empty(fs, tools, status_sink, to_archive, to_path); + return ExtractionType::Exe; + } + else + { + return ExtractionType::Unknown; + } + } + + void extract_archive(const Filesystem& fs, + const ToolCache& tools, + MessageSink& status_sink, + const Path& archive, + const Path& to_path) + { + const auto ext_type = guess_extraction_type(archive); + +#if defined(_WIN32) + switch (ext_type) + { + case ExtractionType::Unknown: break; + case ExtractionType::Nupkg: win32_extract_nupkg(tools, status_sink, archive, to_path); break; + case ExtractionType::Msi: win32_extract_msi(archive, to_path); break; + case ExtractionType::Zip: + extract_tar_cmake(tools.get_tool_path(Tools::CMAKE, status_sink), archive, to_path); + break; + case ExtractionType::Tar: + extract_tar(tools.get_tool_path(Tools::TAR, status_sink), archive, to_path); + break; + case ExtractionType::Exe: + const Path filename = archive.filename(); + const Path stem = filename.stem(); + const Path to_archive = Path(archive.parent_path()) / stem; + win32_extract_self_extracting_7z(fs, archive, to_archive); + extract_archive(fs, tools, status_sink, to_archive, to_path); + break; } #else (void)fs; - if (ext == ".zip") + if (ext_type == ExtractionType::Tar) + { + extract_tar(tools.get_tool_path(Tools::TAR, status_sink), archive, to_path); + } + + if (ext_type == ExtractionType::Zip) { const auto code = cmd_execute(Command{"unzip"}.string_arg("-qqo").string_arg(archive), WorkingDirectory{to_path}) @@ -165,19 +208,20 @@ namespace msg::value = "unzip", msg::path = archive); } + #endif - else if (ext == ".gz" || ext == ".bz2" || ext == ".tgz") - { - vcpkg::extract_tar(tools.get_tool_path(Tools::TAR, status_sink), archive, to_path); - } - else + // Try cmake for unkown extensions, i.e., vsix => zip + if (ext_type == ExtractionType::Unknown) { - Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, msgUnexpectedExtension, msg::extension = ext); + extract_tar_cmake(tools.get_tool_path(Tools::CMAKE, status_sink), archive, to_path); } } - Path extract_archive_to_temp_subdirectory( - Filesystem& fs, const ToolCache& tools, MessageSink& status_sink, const Path& archive, const Path& to_path) + Path extract_archive_to_temp_subdirectory(const Filesystem& fs, + const ToolCache& tools, + MessageSink& status_sink, + const Path& archive, + const Path& to_path) { Path to_path_partial = to_path + ".partial"; #if defined(_WIN32) @@ -186,15 +230,11 @@ namespace fs.remove_all(to_path_partial, VCPKG_LINE_INFO); fs.create_directories(to_path_partial, VCPKG_LINE_INFO); - extract_archive_to_empty(fs, tools, status_sink, archive, to_path_partial); + extract_archive(fs, tools, status_sink, archive, to_path_partial); return to_path_partial; } -} - -namespace vcpkg -{ #ifdef _WIN32 - void win32_extract_self_extracting_7z(Filesystem& fs, const Path& archive, const Path& to_path) + void win32_extract_self_extracting_7z(const Filesystem& fs, const Path& archive, const Path& to_path) { constexpr static const char header_7z[] = "7z\xBC\xAF\x27\x1C"; @@ -227,8 +267,11 @@ namespace vcpkg // (user) cmake.exe unpacks cmake.zip -> (vcpkg) cmake.exe unpacks 7z.7z // 3) As a last resource, install 7zip using a MSI installer // msiexec installs 7zip.msi -> 7zip unpacks cmake.zip -> cmake.exe unpacks 7z.7z - void win32_extract_bootstrap_zip( - Filesystem& fs, const ToolCache& tools, MessageSink& status_sink, const Path& archive, const Path& to_path) + void win32_extract_bootstrap_zip(const Filesystem& fs, + const ToolCache& tools, + MessageSink& status_sink, + const Path& archive, + const Path& to_path) { fs.remove_all(to_path, VCPKG_LINE_INFO); Path to_path_partial = to_path + ".partial." + std::to_string(GetCurrentProcessId()); @@ -284,29 +327,30 @@ namespace vcpkg msg::path = archive); } - void extract_archive( - Filesystem& fs, const ToolCache& tools, MessageSink& status_sink, const Path& archive, const Path& to_path) + void set_directory_to_archive_contents(const Filesystem& fs, + const ToolCache& tools, + MessageSink& status_sink, + const Path& archive, + const Path& to_path) + { fs.remove_all(to_path, VCPKG_LINE_INFO); Path to_path_partial = extract_archive_to_temp_subdirectory(fs, tools, status_sink, archive, to_path); fs.rename_with_retry(to_path_partial, to_path, VCPKG_LINE_INFO); } - ExpectedL compress_directory_to_zip( - Filesystem& fs, const ToolCache& tools, MessageSink& status_sink, const Path& source, const Path& destination) + ExpectedL ZipTool::compress_directory_to_zip(const Filesystem& fs, + const Path& source, + const Path& destination) const { fs.remove(destination, VCPKG_LINE_INFO); #if defined(_WIN32) - auto&& seven_zip_exe = tools.get_tool_path(Tools::SEVEN_ZIP, status_sink); - return flatten(cmd_execute_and_capture_output( - Command{seven_zip_exe}.string_arg("a").string_arg(destination).string_arg(source / "*"), + Command{seven_zip}.string_arg("a").string_arg(destination).string_arg(source / "*"), default_working_directory, get_clean_environment()), Tools::SEVEN_ZIP); #else - (void)tools; - (void)status_sink; return flatten(cmd_execute_and_capture_output(Command{"zip"} .string_arg("--quiet") .string_arg("-y") @@ -320,23 +364,33 @@ namespace vcpkg #endif } - Command decompress_zip_archive_cmd(const ToolCache& tools, - MessageSink& status_sink, - const Path& dst, - const Path& archive_path) + ExpectedL ZipTool::make(const ToolCache& cache, MessageSink& status_sink) + { + ZipTool ret; +#if defined(_WIN32) + ret.seven_zip = cache.get_tool_path(Tools::SEVEN_ZIP, status_sink); +#endif + // Unused on non-Windows + (void)cache; + (void)status_sink; + return std::move(ret); + } + + Command ZipTool::decompress_zip_archive_cmd(const Path& dst, const Path& archive_path) const { Command cmd; #if defined(_WIN32) - auto&& seven_zip_exe = tools.get_tool_path(Tools::SEVEN_ZIP, status_sink); - cmd.string_arg(seven_zip_exe) + cmd.string_arg(seven_zip) .string_arg("x") .string_arg(archive_path) .string_arg("-o" + dst.native()) .string_arg("-y"); #else - (void)tools; - (void)status_sink; - cmd.string_arg("unzip").string_arg("-qq").string_arg(archive_path).string_arg("-d" + dst.native()); + cmd.string_arg("unzip") + .string_arg("-DD") + .string_arg("-qq") + .string_arg(archive_path) + .string_arg("-d" + dst.native()); #endif return cmd; } diff --git a/src/vcpkg/base/checks.cpp b/src/vcpkg/base/checks.cpp index 020e45e1bb..6e7c5fc7b5 100644 --- a/src/vcpkg/base/checks.cpp +++ b/src/vcpkg/base/checks.cpp @@ -89,11 +89,11 @@ namespace vcpkg if (!expression) { msg::println(Color::error, - msg::format(msg::msgInternalErrorMessage) + msg::format(msgInternalErrorMessage) .append(locale_invariant_lineinfo(line_info)) .append(msgChecksFailedCheck) .append_raw('\n') - .append(msg::msgInternalErrorMessageContact)); + .append(msgInternalErrorMessageContact)); exit_fail(line_info); } } @@ -103,11 +103,11 @@ namespace vcpkg if (!expression) { msg::println(Color::error, - msg::format(msg::msgInternalErrorMessage) + msg::format(msgInternalErrorMessage) .append(locale_invariant_lineinfo(line_info)) .append_raw(error_message) .append_raw('\n') - .append(msg::msgInternalErrorMessageContact)); + .append(msgInternalErrorMessageContact)); exit_fail(line_info); } } @@ -122,7 +122,7 @@ namespace vcpkg static void display_upgrade_message() { - msg::println(Color::error, msg::format(msg::msgNoteMessage).append(msgChecksUpdateVcpkg)); + msg::println(Color::error, msg::format(msgNoteMessage).append(msgChecksUpdateVcpkg)); } [[noreturn]] void Checks::exit_maybe_upgrade(const LineInfo& line_info) diff --git a/src/vcpkg/base/chrono.cpp b/src/vcpkg/base/chrono.cpp index 63beab17f6..b24ebc1001 100644 --- a/src/vcpkg/base/chrono.cpp +++ b/src/vcpkg/base/chrono.cpp @@ -173,9 +173,9 @@ namespace vcpkg std::string CTime::to_string() const { return this->strftime("%Y-%m-%dT%H:%M:%SZ"); } std::string CTime::strftime(const char* format) const { - std::array date{}; - ::strftime(date.data(), date.size(), format, &m_tm); - return date.data(); + char date[80]{}; + ::strftime(date, sizeof(date), format, &m_tm); + return date; } std::chrono::system_clock::time_point CTime::to_time_point() const { diff --git a/src/vcpkg/base/cmd-parser.cpp b/src/vcpkg/base/cmd-parser.cpp index f2ace19b02..25c7b81c4e 100644 --- a/src/vcpkg/base/cmd-parser.cpp +++ b/src/vcpkg/base/cmd-parser.cpp @@ -13,7 +13,7 @@ namespace void help_table_newline_indent(std::string& target) { target.push_back('\n'); - target.append(34, ' '); + target.append(25, ' '); } static constexpr ptrdiff_t S_MAX_LINE_LENGTH = 100; @@ -265,7 +265,7 @@ namespace vcpkg void HelpTableFormatter::format(StringView col1, StringView col2) { static constexpr std::size_t initial_space = 2; - static constexpr std::size_t col1_capacity = 31; + static constexpr std::size_t col1_capacity = 22; static constexpr std::size_t seperating_space = 1; m_str.append(initial_space, ' '); @@ -360,6 +360,7 @@ namespace vcpkg auto maybe_response_file_lines = response_file_source.read_lines(file_name); if (auto response_file_lines = maybe_response_file_lines.get()) { + Strings::inplace_trim_all_and_remove_whitespace_strings(*response_file_lines); if (response_file_lines->empty()) { first = inputs.erase(first); @@ -693,6 +694,12 @@ namespace vcpkg return "version"; } + if (this_arg == "--help" || this_arg == "/?" || this_arg == "-?") + { + argument_parsed[idx] = true; + return "help"; + } + if (!Strings::starts_with(this_arg, "--")) { argument_parsed[idx] = true; diff --git a/src/vcpkg/base/downloads.cpp b/src/vcpkg/base/downloads.cpp index 2f8e6ca673..32be45258c 100644 --- a/src/vcpkg/base/downloads.cpp +++ b/src/vcpkg/base/downloads.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -12,6 +13,9 @@ #include #include +#include +#include + namespace vcpkg { static std::string replace_secrets(std::string input, View secrets) @@ -328,7 +332,7 @@ namespace vcpkg return SplitURIView{scheme, {}, {sep + 1, uri.end()}}; } - static ExpectedL try_verify_downloaded_file_hash(const Filesystem& fs, + static ExpectedL try_verify_downloaded_file_hash(const ReadOnlyFilesystem& fs, StringView sanitized_url, const Path& downloaded_path, StringView sha512) @@ -347,7 +351,7 @@ namespace vcpkg return Unit{}; } - void verify_downloaded_file_hash(const Filesystem& fs, + void verify_downloaded_file_hash(const ReadOnlyFilesystem& fs, StringView url, const Path& downloaded_path, StringView sha512) @@ -355,7 +359,7 @@ namespace vcpkg try_verify_downloaded_file_hash(fs, url, downloaded_path, sha512).value_or_exit(VCPKG_LINE_INFO); } - static ExpectedL check_downloaded_file_hash(Filesystem& fs, + static ExpectedL check_downloaded_file_hash(const ReadOnlyFilesystem& fs, const Optional& hash, StringView sanitized_url, const Path& download_part_path) @@ -435,10 +439,11 @@ namespace vcpkg url_heads_inner({urls.begin() + i, urls.end()}, headers, &ret, secrets); } + Checks::check_exit(VCPKG_LINE_INFO, ret.size() == urls.size()); return ret; } - static void download_files_inner(Filesystem&, + static void download_files_inner(const Filesystem&, View> url_pairs, View headers, std::vector* out) @@ -489,7 +494,7 @@ namespace vcpkg } } } - std::vector download_files(Filesystem& fs, + std::vector download_files(const Filesystem& fs, View> url_pairs, View headers) { @@ -516,12 +521,56 @@ namespace vcpkg return ret; } - ExpectedL put_file(const Filesystem&, + bool send_snapshot_to_api(const std::string& github_token, + const std::string& github_repository, + const Json::Object& snapshot) + { + static constexpr StringLiteral guid_marker = "fcfad8a3-bb68-4a54-ad00-dab1ff671ed2"; + + Command cmd; + cmd.string_arg("curl"); + cmd.string_arg("-w").string_arg("\\n" + guid_marker.to_string() + "%{http_code}"); + cmd.string_arg("-X").string_arg("POST"); + cmd.string_arg("-H").string_arg("Accept: application/vnd.github+json"); + + std::string res = "Authorization: Bearer " + github_token; + cmd.string_arg("-H").string_arg(res); + cmd.string_arg("-H").string_arg("X-GitHub-Api-Version: 2022-11-28"); + cmd.string_arg( + Strings::concat("https://api.github.com/repos/", github_repository, "/dependency-graph/snapshots")); + cmd.string_arg("-d").string_arg("@-"); + int code = 0; + auto result = cmd_execute_and_stream_lines( + cmd, + [&code](StringView line) { + if (Strings::starts_with(line, guid_marker)) + { + code = std::strtol(line.data() + guid_marker.size(), nullptr, 10); + } + else + { + Debug::println(line); + } + }, + default_working_directory, + default_environment, + Encoding::Utf8, + Json::stringify(snapshot)); + + auto r = result.get(); + if (r && *r == 0 && code >= 200 && code < 300) + { + return true; + } + return false; + } + + ExpectedL put_file(const ReadOnlyFilesystem&, StringView url, const std::vector& secrets, View headers, const Path& file, - StringView request) + StringView method) { static constexpr StringLiteral guid_marker = "9a1db05f-a65d-419b-aa72-037fb4d0672e"; @@ -550,7 +599,8 @@ namespace vcpkg } Command cmd; - cmd.string_arg("curl").string_arg("-X").string_arg(request); + cmd.string_arg("curl").string_arg("-X").string_arg(method); + for (auto&& header : headers) { cmd.string_arg("-H").string_arg(header); @@ -579,6 +629,46 @@ namespace vcpkg return res; } + std::string format_url_query(StringView base_url, View query_params) + { + auto url = base_url.to_string(); + if (query_params.empty()) + { + return url; + } + + std::string query = Strings::join("&", query_params); + + return url + "?" + query; + } + + ExpectedL invoke_http_request(StringView method, + View headers, + StringView url, + StringView data) + { + Command cmd; + cmd.string_arg("curl").string_arg("-s").string_arg("-L"); + cmd.string_arg("-H").string_arg( + fmt::format("User-Agent: vcpkg/{}-{} (curl)", VCPKG_BASE_VERSION_AS_STRING, VCPKG_VERSION_AS_STRING)); + + for (auto&& header : headers) + { + cmd.string_arg("-H").string_arg(header); + } + + cmd.string_arg("-X").string_arg(method); + + if (!data.empty()) + { + cmd.string_arg("--data-raw").string_arg(data); + } + + cmd.string_arg(url); + + return flatten_out(cmd_execute_and_capture_output(cmd), "curl"); + } + #if defined(_WIN32) enum class WinHttpTrialResult { @@ -587,7 +677,7 @@ namespace vcpkg retry }; - static WinHttpTrialResult download_winhttp_trial(Filesystem& fs, + static WinHttpTrialResult download_winhttp_trial(const Filesystem& fs, WinHttpSession& s, const Path& download_path_part_path, SplitURIView split_uri, @@ -644,7 +734,7 @@ namespace vcpkg /// /// Download a file using WinHTTP -- only supports HTTP and HTTPS /// - static bool download_winhttp(Filesystem& fs, + static bool download_winhttp(const Filesystem& fs, const Path& download_path_part_path, SplitURIView split_uri, const std::string& url, @@ -698,7 +788,7 @@ namespace vcpkg } #endif - static bool try_download_file(vcpkg::Filesystem& fs, + static bool try_download_file(const Filesystem& fs, const std::string& url, View headers, const Path& download_path, @@ -807,7 +897,7 @@ namespace vcpkg return false; } - static Optional try_download_file(vcpkg::Filesystem& fs, + static Optional try_download_file(const Filesystem& fs, View urls, View headers, const Path& download_path, @@ -833,7 +923,7 @@ namespace vcpkg return s_headers; } - void DownloadManager::download_file(Filesystem& fs, + void DownloadManager::download_file(const Filesystem& fs, const std::string& url, View headers, const Path& download_path, @@ -843,7 +933,7 @@ namespace vcpkg this->download_file(fs, View(&url, 1), headers, download_path, sha512, progress_sink); } - std::string DownloadManager::download_file(Filesystem& fs, + std::string DownloadManager::download_file(const Filesystem& fs, View urls, View headers, const Path& download_path, @@ -961,7 +1051,7 @@ namespace vcpkg Checks::exit_fail(VCPKG_LINE_INFO); } - ExpectedL DownloadManager::put_file_to_mirror(const Filesystem& fs, + ExpectedL DownloadManager::put_file_to_mirror(const ReadOnlyFilesystem& fs, const Path& file_to_put, StringView sha512) const { diff --git a/src/vcpkg/base/files.cpp b/src/vcpkg/base/files.cpp index 05ad484f5b..816a537d80 100644 --- a/src/vcpkg/base/files.cpp +++ b/src/vcpkg/base/files.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -46,18 +47,6 @@ namespace std::atomic g_us_filesystem_stats(0); - struct IsSlash - { - bool operator()(const char c) const noexcept - { - return c == '/' -#if defined(_WIN32) - || c == '\\' -#endif // _WIN32 - ; - } - }; - constexpr IsSlash is_slash; bool is_dot(StringView sv) { return sv.size() == 1 && sv[0] == '.'; } @@ -679,14 +668,7 @@ namespace int get() const noexcept { return fd; } - void close() noexcept - { - if (fd >= 0) - { - Checks::check_exit(VCPKG_LINE_INFO, ::close(fd) == 0); - fd = -1; - } - } + void close() noexcept { close_mark_invalid(fd); } ~PosixFd() { close(); } @@ -1433,6 +1415,7 @@ namespace vcpkg { ReadFilePointer fp{std::move(other)}; std::swap(m_fs, fp.m_fs); + std::swap(m_path, fp.m_path); return *this; } @@ -1469,6 +1452,33 @@ namespace vcpkg return try_seek_to(offset).then([&](Unit) { return try_read_all(buffer, size); }); } + std::string ReadFilePointer::read_to_end(std::error_code& ec) + { + std::string output; + constexpr std::size_t buffer_size = 1024 * 32; + char buffer[buffer_size]; + do + { + const auto this_read = this->read(buffer, 1, buffer_size); + if (this_read != 0) + { + output.append(buffer, this_read); + } + else if ((ec = this->error())) + { + return std::string(); + } + } while (!this->eof()); + + if (Strings::starts_with(output, "\xEF\xBB\xBF")) + { + // remove byte-order mark from the beginning of the string + output.erase(output.begin(), output.begin() + 3); + } + + return output; + } + WriteFilePointer::WriteFilePointer() noexcept = default; WriteFilePointer::WriteFilePointer(WriteFilePointer&&) noexcept = default; @@ -1497,6 +1507,7 @@ namespace vcpkg { WriteFilePointer fp{std::move(other)}; std::swap(m_fs, fp.m_fs); + std::swap(m_path, fp.m_path); return *this; } @@ -1507,9 +1518,19 @@ namespace vcpkg int WriteFilePointer::put(int c) const noexcept { return ::fputc(c, m_fs); } - ILineReader::~ILineReader() = default; + uint64_t ReadOnlyFilesystem::file_size(const Path& file_path, LineInfo li) const + { + std::error_code ec; + auto maybe_contents = this->file_size(file_path, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {file_path}); + } + + return maybe_contents; + } - std::string Filesystem::read_contents(const Path& file_path, LineInfo li) const + std::string ReadOnlyFilesystem::read_contents(const Path& file_path, LineInfo li) const { std::error_code ec; auto maybe_contents = this->read_contents(file_path, ec); @@ -1521,7 +1542,7 @@ namespace vcpkg return maybe_contents; } - ExpectedL Filesystem::try_read_contents(const Path& file_path) const + ExpectedL ReadOnlyFilesystem::try_read_contents(const Path& file_path) const { std::error_code ec; auto maybe_contents = this->read_contents(file_path, ec); @@ -1533,7 +1554,7 @@ namespace vcpkg return FileContents{std::move(maybe_contents), file_path.native()}; } - Path Filesystem::find_file_recursively_up(const Path& starting_dir, const Path& filename, LineInfo li) const + Path ReadOnlyFilesystem::find_file_recursively_up(const Path& starting_dir, const Path& filename, LineInfo li) const { std::error_code ec; auto result = this->find_file_recursively_up(starting_dir, filename, ec); @@ -1545,91 +1566,296 @@ namespace vcpkg return result; } - std::vector Filesystem::get_files_recursive(const Path& dir, LineInfo li) const + ExpectedL ReadOnlyFilesystem::try_find_file_recursively_up(const Path& starting_dir, + const Path& filename) const + { + std::error_code ec; + auto result = this->find_file_recursively_up(starting_dir, filename, ec); + if (ec) + { + return format_filesystem_call_error(ec, __func__, {starting_dir, filename}); + } + + return result; + } + + std::vector ReadOnlyFilesystem::get_files_recursive(const Path& dir, LineInfo li) const + { + return this->try_get_files_recursive(dir).value_or_exit(li); + } + + ExpectedL> ReadOnlyFilesystem::try_get_files_recursive(const Path& dir) const { std::error_code ec; auto maybe_files = this->get_files_recursive(dir, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {dir}); + return format_filesystem_call_error(ec, __func__, {dir}); } return maybe_files; } - std::vector Filesystem::get_files_non_recursive(const Path& dir, LineInfo li) const + std::vector ReadOnlyFilesystem::get_files_non_recursive(const Path& dir, LineInfo li) const + { + return this->try_get_files_non_recursive(dir).value_or_exit(li); + } + + ExpectedL> ReadOnlyFilesystem::try_get_files_non_recursive(const Path& dir) const { std::error_code ec; auto maybe_files = this->get_files_non_recursive(dir, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {dir}); + return format_filesystem_call_error(ec, __func__, {dir}); } return maybe_files; } - std::vector Filesystem::get_directories_recursive(const Path& dir, LineInfo li) const + std::vector ReadOnlyFilesystem::get_directories_recursive(const Path& dir, LineInfo li) const + { + return this->try_get_directories_recursive(dir).value_or_exit(li); + } + + ExpectedL> ReadOnlyFilesystem::try_get_directories_recursive(const Path& dir) const { std::error_code ec; auto maybe_directories = this->get_directories_recursive(dir, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {dir}); + return format_filesystem_call_error(ec, __func__, {dir}); } return maybe_directories; } - std::vector Filesystem::get_directories_non_recursive(const Path& dir, LineInfo li) const + std::vector ReadOnlyFilesystem::get_directories_non_recursive(const Path& dir, LineInfo li) const + { + return this->try_get_directories_non_recursive(dir).value_or_exit(li); + } + + ExpectedL> ReadOnlyFilesystem::try_get_directories_non_recursive(const Path& dir) const { std::error_code ec; auto maybe_directories = this->get_directories_non_recursive(dir, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {dir}); + return format_filesystem_call_error(ec, __func__, {dir}); } return maybe_directories; } - std::vector Filesystem::get_regular_files_recursive(const Path& dir, LineInfo li) const + std::vector ReadOnlyFilesystem::get_regular_files_recursive(const Path& dir, LineInfo li) const + { + return this->try_get_regular_files_recursive(dir).value_or_exit(li); + } + + ExpectedL> ReadOnlyFilesystem::try_get_regular_files_recursive(const Path& dir) const { std::error_code ec; auto maybe_directories = this->get_regular_files_recursive(dir, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {dir}); + return format_filesystem_call_error(ec, __func__, {dir}); } return maybe_directories; } - std::vector Filesystem::get_regular_files_recursive_lexically_proximate(const Path& dir, LineInfo li) const + std::vector ReadOnlyFilesystem::get_regular_files_recursive_lexically_proximate(const Path& dir, + LineInfo li) const + { + return this->try_get_regular_files_recursive_lexically_proximate(dir).value_or_exit(li); + } + + ExpectedL> ReadOnlyFilesystem::try_get_regular_files_recursive_lexically_proximate( + const Path& dir) const { std::error_code ec; auto maybe_directories = this->get_regular_files_recursive_lexically_proximate(dir, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {dir}); + return format_filesystem_call_error(ec, __func__, {dir}); } return maybe_directories; } - std::vector Filesystem::get_regular_files_non_recursive(const Path& dir, LineInfo li) const + std::vector ReadOnlyFilesystem::get_regular_files_non_recursive(const Path& dir, LineInfo li) const + { + return this->try_get_regular_files_non_recursive(dir).value_or_exit(li); + } + + ExpectedL> ReadOnlyFilesystem::try_get_regular_files_non_recursive(const Path& dir) const { std::error_code ec; auto maybe_directories = this->get_regular_files_non_recursive(dir, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {dir}); + return format_filesystem_call_error(ec, __func__, {dir}); } return maybe_directories; } - void Filesystem::write_contents(const Path& file_path, StringView data, LineInfo li) + bool ReadOnlyFilesystem::exists(const Path& target, std::error_code& ec) const + { + return vcpkg::exists(this->symlink_status(target, ec)); + } + + bool ReadOnlyFilesystem::exists(const Path& target, LineInfo li) const + { + std::error_code ec; + auto result = this->exists(target, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {target}); + } + + return result; + } + + bool ReadOnlyFilesystem::is_empty(const Path& target, LineInfo li) const + { + std::error_code ec; + auto result = this->is_empty(target, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {target}); + } + + return result; + } + + FileType ReadOnlyFilesystem::status(const Path& target, vcpkg::LineInfo li) const noexcept + { + std::error_code ec; + auto result = this->status(target, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {target}); + } + + return result; + } + + FileType ReadOnlyFilesystem::symlink_status(const Path& target, vcpkg::LineInfo li) const noexcept + { + std::error_code ec; + auto result = this->symlink_status(target, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {target}); + } + + return result; + } + + int64_t ReadOnlyFilesystem::last_write_time(const Path& target, LineInfo li) const noexcept + { + std::error_code ec; + auto result = this->last_write_time(target, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {target}); + } + + return result; + } + + Path ReadOnlyFilesystem::almost_canonical(const Path& target, LineInfo li) const + { + std::error_code ec; + const auto result = this->almost_canonical(target, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {target}); + } + + return result; + } + + Path ReadOnlyFilesystem::current_path(LineInfo li) const + { + std::error_code ec; + const auto result = this->current_path(ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {}); + } + + return result; + } + + Path ReadOnlyFilesystem::absolute(const Path& target, LineInfo li) const + { + std::error_code ec; + const auto result = this->absolute(target, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {target}); + } + + return result; + } + + std::vector ReadOnlyFilesystem::find_from_PATH(StringView stem) const + { + return this->find_from_PATH(View{&stem, 1}); + } + + ReadFilePointer ReadOnlyFilesystem::open_for_read(const Path& file_path, LineInfo li) const + { + std::error_code ec; + auto ret = this->open_for_read(file_path, ec); + if (ec) + { + exit_filesystem_call_error(li, ec, __func__, {file_path}); + } + + return ret; + } + + ExpectedL ReadOnlyFilesystem::try_open_for_read(const Path& file_path) const + { + std::error_code ec; + auto ret = this->open_for_read(file_path, ec); + if (ec) + { + return format_filesystem_call_error(ec, __func__, {file_path}); + } + + return ExpectedL{std::move(ret)}; + } + + ExpectedL ReadOnlyFilesystem::check_update_required(const Path& version_path, + StringView expected_version) const + { + std::error_code ec; + auto read_handle = open_for_read(version_path, ec); + if (ec) + { + translate_not_found_to_success(ec); + if (ec) + { + return format_filesystem_call_error(ec, __func__, {version_path, expected_version}); + } + + return true; + } + + auto actual_version = read_handle.read_to_end(ec); + if (ec) + { + return format_filesystem_call_error(ec, __func__, {version_path, expected_version}); + } + + return actual_version != expected_version; + } + + void Filesystem::write_contents(const Path& file_path, StringView data, LineInfo li) const { std::error_code ec; this->write_contents(file_path, data, ec); @@ -1638,14 +1864,17 @@ namespace vcpkg exit_filesystem_call_error(li, ec, __func__, {file_path}); } } - void Filesystem::write_rename_contents(const Path& file_path, const Path& temp_name, StringView data, LineInfo li) + void Filesystem::write_rename_contents(const Path& file_path, + const Path& temp_name, + StringView data, + LineInfo li) const { auto temp_path = file_path; temp_path.replace_filename(temp_name); this->write_contents(temp_path, data, li); this->rename(temp_path, file_path, li); } - void Filesystem::write_contents_and_dirs(const Path& file_path, StringView data, LineInfo li) + void Filesystem::write_contents_and_dirs(const Path& file_path, StringView data, LineInfo li) const { std::error_code ec; this->write_contents_and_dirs(file_path, data, ec); @@ -1654,7 +1883,7 @@ namespace vcpkg exit_filesystem_call_error(li, ec, __func__, {file_path}); } } - void Filesystem::rename(const Path& old_path, const Path& new_path, LineInfo li) + void Filesystem::rename(const Path& old_path, const Path& new_path, LineInfo li) const { std::error_code ec; this->rename(old_path, new_path, ec); @@ -1663,7 +1892,7 @@ namespace vcpkg exit_filesystem_call_error(li, ec, __func__, {old_path, new_path}); } } - void Filesystem::rename_with_retry(const Path& old_path, const Path& new_path, LineInfo li) + void Filesystem::rename_with_retry(const Path& old_path, const Path& new_path, LineInfo li) const { std::error_code ec; this->rename_with_retry(old_path, new_path, ec); @@ -1672,7 +1901,7 @@ namespace vcpkg exit_filesystem_call_error(li, ec, __func__, {old_path, new_path}); } } - void Filesystem::rename_with_retry(const Path& old_path, const Path& new_path, std::error_code& ec) + void Filesystem::rename_with_retry(const Path& old_path, const Path& new_path, std::error_code& ec) const { this->rename(old_path, new_path, ec); using namespace std::chrono_literals; @@ -1688,7 +1917,7 @@ namespace vcpkg } } - bool Filesystem::remove(const Path& target, LineInfo li) + bool Filesystem::remove(const Path& target, LineInfo li) const { std::error_code ec; auto r = this->remove(target, ec); @@ -1700,36 +1929,7 @@ namespace vcpkg return r; } - bool Filesystem::exists(const Path& target, std::error_code& ec) const - { - return vcpkg::exists(this->symlink_status(target, ec)); - } - - bool Filesystem::exists(const Path& target, LineInfo li) const - { - std::error_code ec; - auto result = this->exists(target, ec); - if (ec) - { - exit_filesystem_call_error(li, ec, __func__, {target}); - } - - return result; - } - - bool Filesystem::is_empty(const Path& target, LineInfo li) const - { - std::error_code ec; - auto result = this->is_empty(target, ec); - if (ec) - { - exit_filesystem_call_error(li, ec, __func__, {target}); - } - - return result; - } - - bool Filesystem::create_directory(const Path& new_directory, LineInfo li) + bool Filesystem::create_directory(const Path& new_directory, LineInfo li) const { std::error_code ec; bool result = this->create_directory(new_directory, ec); @@ -1741,7 +1941,7 @@ namespace vcpkg return result; } - bool Filesystem::create_directories(const Path& new_directory, LineInfo li) + bool Filesystem::create_directories(const Path& new_directory, LineInfo li) const { std::error_code ec; bool result = this->create_directories(new_directory, ec); @@ -1753,7 +1953,7 @@ namespace vcpkg return result; } - Path Filesystem::create_or_get_temp_directory(LineInfo li) + Path Filesystem::create_or_get_temp_directory(LineInfo li) const { std::error_code ec; Path result = this->create_or_get_temp_directory(ec); @@ -1765,7 +1965,7 @@ namespace vcpkg return result; } - void Filesystem::create_symlink(const Path& to, const Path& from, LineInfo li) + void Filesystem::create_symlink(const Path& to, const Path& from, LineInfo li) const { std::error_code ec; this->create_symlink(to, from, ec); @@ -1775,7 +1975,7 @@ namespace vcpkg } } - void Filesystem::create_directory_symlink(const Path& to, const Path& from, LineInfo li) + void Filesystem::create_directory_symlink(const Path& to, const Path& from, LineInfo li) const { std::error_code ec; this->create_directory_symlink(to, from, ec); @@ -1785,7 +1985,7 @@ namespace vcpkg } } - void Filesystem::create_hard_link(const Path& to, const Path& from, LineInfo li) + void Filesystem::create_hard_link(const Path& to, const Path& from, LineInfo li) const { std::error_code ec; this->create_hard_link(to, from, ec); @@ -1795,7 +1995,7 @@ namespace vcpkg } } - void Filesystem::create_best_link(const Path& to, const Path& from, std::error_code& ec) + void Filesystem::create_best_link(const Path& to, const Path& from, std::error_code& ec) const { this->create_hard_link(to, from, ec); if (!ec) return; @@ -1804,7 +2004,7 @@ namespace vcpkg this->copy_file(from, to, CopyOptions::none, ec); } - void Filesystem::create_best_link(const Path& to, const Path& from, LineInfo li) + void Filesystem::create_best_link(const Path& to, const Path& from, LineInfo li) const { std::error_code ec; this->create_best_link(to, from, ec); @@ -1814,7 +2014,7 @@ namespace vcpkg } } - void Filesystem::copy_regular_recursive(const Path& source, const Path& destination, LineInfo li) + void Filesystem::copy_regular_recursive(const Path& source, const Path& destination, LineInfo li) const { std::error_code ec; this->copy_regular_recursive(source, destination, ec); @@ -1824,7 +2024,7 @@ namespace vcpkg } } - bool Filesystem::copy_file(const Path& source, const Path& destination, CopyOptions options, LineInfo li) + bool Filesystem::copy_file(const Path& source, const Path& destination, CopyOptions options, LineInfo li) const { std::error_code ec; const bool result = this->copy_file(source, destination, options, ec); @@ -1836,7 +2036,7 @@ namespace vcpkg return result; } - void Filesystem::copy_symlink(const Path& source, const Path& destination, LineInfo li) + void Filesystem::copy_symlink(const Path& source, const Path& destination, LineInfo li) const { std::error_code ec; this->copy_symlink(source, destination, ec); @@ -1846,76 +2046,40 @@ namespace vcpkg } } - FileType Filesystem::status(const Path& target, vcpkg::LineInfo li) const noexcept + void Filesystem::write_lines(const Path& file_path, const std::vector& lines, LineInfo li) const { std::error_code ec; - auto result = this->status(target, ec); + this->write_lines(file_path, lines, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {target}); + exit_filesystem_call_error(li, ec, __func__, {file_path}); } - - return result; } - FileType Filesystem::symlink_status(const Path& target, vcpkg::LineInfo li) const noexcept + void Filesystem::remove_all(const Path& base, LineInfo li) const { std::error_code ec; - auto result = this->symlink_status(target, ec); - if (ec) - { - exit_filesystem_call_error(li, ec, __func__, {target}); - } + Path failure_point; - return result; - } + this->remove_all(base, ec, failure_point); - int64_t Filesystem::last_write_time(const Path& target, vcpkg::LineInfo li) const noexcept - { - std::error_code ec; - auto result = this->last_write_time(target, ec); if (ec) { - exit_filesystem_call_error(li, ec, __func__, {target}); + Checks::msg_exit_with_error( + li, + msg::format(msgFailedToDeleteDueToFile, msg::value = base, msg::path = failure_point) + .append_raw(' ') + .append_raw(ec.message())); } + } - return result; + void Filesystem::remove_all(const Path& base, std::error_code& ec) const + { + Path failure_point; + this->remove_all(base, ec, failure_point); } - void Filesystem::write_lines(const Path& file_path, const std::vector& lines, LineInfo li) - { - std::error_code ec; - this->write_lines(file_path, lines, ec); - if (ec) - { - exit_filesystem_call_error(li, ec, __func__, {file_path}); - } - } - - void Filesystem::remove_all(const Path& base, LineInfo li) - { - std::error_code ec; - Path failure_point; - - this->remove_all(base, ec, failure_point); - - if (ec) - { - Checks::msg_exit_with_error( - li, - msg::format(msgFailedToDeleteDueToFile, msg::value = base, msg::path = failure_point) - .append_raw(' ') - .append_raw(ec.message())); - } - } - - void Filesystem::remove_all(const Path& base, std::error_code& ec) - { - Path failure_point; - this->remove_all(base, ec, failure_point); - } - - void Filesystem::remove_all_inside(const Path& base, std::error_code& ec, Path& failure_point) + void Filesystem::remove_all_inside(const Path& base, std::error_code& ec, Path& failure_point) const { for (auto&& subdir : this->get_directories_non_recursive(base, ec)) { @@ -1943,7 +2107,7 @@ namespace vcpkg } } - void Filesystem::remove_all_inside(const Path& base, LineInfo li) + void Filesystem::remove_all_inside(const Path& base, LineInfo li) const { std::error_code ec; Path failure_point; @@ -1960,48 +2124,13 @@ namespace vcpkg } } - void Filesystem::remove_all_inside(const Path& base, std::error_code& ec) + void Filesystem::remove_all_inside(const Path& base, std::error_code& ec) const { Path failure_point; this->remove_all_inside(base, ec, failure_point); } - Path Filesystem::absolute(const Path& target, LineInfo li) const - { - std::error_code ec; - const auto result = this->absolute(target, ec); - if (ec) - { - exit_filesystem_call_error(li, ec, __func__, {target}); - } - - return result; - } - - Path Filesystem::almost_canonical(const Path& target, LineInfo li) const - { - std::error_code ec; - const auto result = this->almost_canonical(target, ec); - if (ec) - { - exit_filesystem_call_error(li, ec, __func__, {target}); - } - - return result; - } - - Path Filesystem::current_path(LineInfo li) const - { - std::error_code ec; - const auto result = this->current_path(ec); - if (ec) - { - exit_filesystem_call_error(li, ec, __func__, {}); - } - - return result; - } - void Filesystem::current_path(const Path& new_current_path, LineInfo li) + void Filesystem::current_path(const Path& new_current_path, LineInfo li) const { std::error_code ec; this->current_path(new_current_path, ec); @@ -2011,7 +2140,7 @@ namespace vcpkg } } - std::unique_ptr Filesystem::take_exclusive_file_lock(const Path& lockfile, LineInfo li) + std::unique_ptr Filesystem::take_exclusive_file_lock(const Path& lockfile, LineInfo li) const { std::error_code ec; auto sh = this->take_exclusive_file_lock(lockfile, ec); @@ -2023,7 +2152,8 @@ namespace vcpkg return sh; } - std::unique_ptr Filesystem::try_take_exclusive_file_lock(const Path& lockfile, LineInfo li) + std::unique_ptr Filesystem::try_take_exclusive_file_lock(const Path& lockfile, + LineInfo li) const { std::error_code ec; auto sh = this->try_take_exclusive_file_lock(lockfile, ec); @@ -2035,36 +2165,7 @@ namespace vcpkg return sh; } - std::vector Filesystem::find_from_PATH(StringView stem) const - { - return this->find_from_PATH(View{&stem, 1}); - } - - ReadFilePointer Filesystem::open_for_read(const Path& file_path, LineInfo li) const - { - std::error_code ec; - auto ret = this->open_for_read(file_path, ec); - if (ec) - { - exit_filesystem_call_error(li, ec, __func__, {file_path}); - } - - return ret; - } - - ExpectedL Filesystem::try_open_for_read(const Path& file_path) const - { - std::error_code ec; - auto ret = this->open_for_read(file_path, ec); - if (ec) - { - return format_filesystem_call_error(ec, __func__, {file_path}); - } - - return ExpectedL{std::move(ret)}; - } - - WriteFilePointer Filesystem::open_for_write(const Path& file_path, Append append, LineInfo li) + WriteFilePointer Filesystem::open_for_write(const Path& file_path, Append append, LineInfo li) const { std::error_code ec; auto ret = this->open_for_write(file_path, append, ec); @@ -2076,18 +2177,34 @@ namespace vcpkg return ret; } - WriteFilePointer Filesystem::open_for_write(const Path& file_path, std::error_code& ec) + WriteFilePointer Filesystem::open_for_write(const Path& file_path, std::error_code& ec) const { return open_for_write(file_path, Append::NO, ec); } - WriteFilePointer Filesystem::open_for_write(const Path& file_path, LineInfo li) + WriteFilePointer Filesystem::open_for_write(const Path& file_path, LineInfo li) const { return open_for_write(file_path, Append::NO, li); } struct RealFilesystem final : Filesystem { + virtual uint64_t file_size(const Path& file_path, std::error_code& ec) const override + { +#ifdef _WIN32 + return stdfs::file_size(to_stdfs_path(file_path), ec); +#else + struct stat st; + if (stat(file_path.c_str(), &st) != 0) + { + ec.assign(errno, std::generic_category()); + return 0; + } + + return st.st_size; +#endif // defined(_WIN32) + } + virtual std::string read_contents(const Path& file_path, std::error_code& ec) const override { StatsTimer t(g_us_filesystem_stats); @@ -2098,29 +2215,7 @@ namespace vcpkg return std::string(); } - std::string output; - constexpr std::size_t buffer_size = 1024 * 32; - char buffer[buffer_size]; - do - { - const auto this_read = file.read(buffer, 1, buffer_size); - if (this_read != 0) - { - output.append(buffer, this_read); - } - else if ((ec = file.error())) - { - return std::string(); - } - } while (!file.eof()); - - if (Strings::starts_with(output, "\xEF\xBB\xBF")) - { - // remove byte-order mark from the beginning of the string - output.erase(output.begin(), output.begin() + 3); - } - - return output; + return file.read_to_end(ec); } virtual ExpectedL> read_lines(const Path& file_path) const override { @@ -2642,13 +2737,254 @@ namespace vcpkg } }); - return result; + return result; + } +#endif // ^^^ !_WIN32 + + virtual bool is_directory(const Path& target) const override + { +#if defined(_WIN32) + return stdfs::is_directory(to_stdfs_path(target)); +#else // ^^^ _WIN32 // !_WIN32 vvv + struct stat s; + if (::stat(target.c_str(), &s) != 0) + { + return false; + } + + return S_ISDIR(s.st_mode); +#endif // ^^^ !_WIN32 + } + virtual bool is_regular_file(const Path& target) const override + { +#if defined(_WIN32) + return stdfs::is_regular_file(to_stdfs_path(target)); +#else // ^^^ _WIN32 // !_WIN32 vvv + struct stat s; + if (::stat(target.c_str(), &s) != 0) + { + return false; + } + + return S_ISREG(s.st_mode); +#endif // ^^^ !_WIN32 + } + + virtual bool is_empty(const Path& target, std::error_code& ec) const override + { +#if defined(_WIN32) + return stdfs::is_empty(to_stdfs_path(target), ec); +#else // ^^^ _WIN32 // !_WIN32 vvv + struct stat st; + if (::stat(target.c_str(), &st) != 0) + { + ec.assign(errno, std::generic_category()); + return false; + } + + if (S_ISDIR(st.st_mode)) + { + ReadDirOp rdo{target, ec}; + if (ec) return false; + const dirent* entry; + do + { + entry = rdo.read(ec); + if (ec) + { + return false; + } + if (entry == nullptr) + { + return true; + } + } while (is_dot_or_dot_dot(entry->d_name)); + return false; + } + + return st.st_size == 0; +#endif // ^^^ !_WIN32 + } + + virtual FileType status(const Path& target, std::error_code& ec) const override + { +#if defined(_WIN32) + auto result = stdfs::status(to_stdfs_path(target), ec); + translate_not_found_to_success(ec); + return convert_file_type(result.type()); +#else // ^^^ _WIN32 // !_WIN32 vvv + struct stat s; + if (::stat(target.c_str(), &s) == 0) + { + ec.clear(); + return posix_translate_stat_mode_to_file_type(s.st_mode); + } + + if (errno == ENOENT || errno == ENOTDIR) + { + ec.clear(); + return FileType::not_found; + } + + ec.assign(errno, std::generic_category()); + return FileType::unknown; +#endif // ^^^ !_WIN32 + } + + virtual FileType symlink_status(const Path& target, std::error_code& ec) const override + { +#if defined(_WIN32) + auto result = stdfs::symlink_status(to_stdfs_path(target), ec); + translate_not_found_to_success(ec); + return convert_file_type(result.type()); +#else // ^^^ _WIN32 // !_WIN32 vvv + struct stat s; + if (::lstat(target.c_str(), &s) == 0) + { + ec.clear(); + return posix_translate_stat_mode_to_file_type(s.st_mode); + } + + if (errno == ENOENT || errno == ENOTDIR) + { + ec.clear(); + return FileType::not_found; + } + + ec.assign(errno, std::generic_category()); + return FileType::unknown; +#endif // ^^^ !_WIN32 + } + + virtual int64_t last_write_time(const Path& target, std::error_code& ec) const override + { +#if defined(_WIN32) + auto result = stdfs::last_write_time(to_stdfs_path(target), ec); + return result.time_since_epoch().count(); +#else // ^^^ _WIN32 // !_WIN32 vvv + struct stat s; + if (::lstat(target.c_str(), &s) == 0) + { + ec.clear(); +#ifdef __APPLE__ + return s.st_mtimespec.tv_sec * 1'000'000'000 + s.st_mtimespec.tv_nsec; +#else + return s.st_mtim.tv_sec * 1'000'000'000 + s.st_mtim.tv_nsec; +#endif + } + + ec.assign(errno, std::generic_category()); + return {}; +#endif // ^^^ !_WIN32 + } + + virtual Path absolute(const Path& target, std::error_code& ec) const override + { +#if defined(_WIN32) + return from_stdfs_path(stdfs::absolute(to_stdfs_path(target), ec)); +#else // ^^^ _WIN32 / !_WIN32 vvv + if (target.is_absolute()) + { + return target; + } + else + { + auto current_path = this->current_path(ec); + if (ec) return Path(); + return std::move(current_path) / target; + } +#endif // ^^^ !_WIN32 + } + + virtual Path almost_canonical(const Path& target, std::error_code& ec) const override + { + auto result = this->absolute(target, ec); + if (ec) + { + return result; + } + + result = result.lexically_normal(); +#if defined(_WIN32) + result = vcpkg::win32_fix_path_case(result); +#endif // _WIN32 + return result; + } + + virtual Path current_path(std::error_code& ec) const override + { +#if defined(_WIN32) + return from_stdfs_path(stdfs::current_path(ec)); +#else // ^^^ _WIN32 // !_WIN32 + std::string buf; + buf.resize(PATH_MAX); + for (;;) + { + if (getcwd(&buf[0], buf.size() + 1) != nullptr) + { + buf.resize(strlen(buf.c_str())); + ec.clear(); + break; + } + + if (errno != ERANGE) + { + ec.assign(errno, std::generic_category()); + buf.clear(); + break; + } + + // the current working directory is too big for the size of the string; resize and try again. + buf.append(PATH_MAX, '\0'); + } + + return Path{std::move(buf)}; +#endif // ^^^ !_WIN32 + } + + virtual std::vector find_from_PATH(View stems) const override + { + std::vector ret; + + if (!stems.empty()) + { +#if defined(_WIN32) + static constexpr StringLiteral extensions[] = {".cmd", ".exe", ".bat"}; +#else // ^^^ _WIN32 // !_WIN32 vvv + static constexpr StringLiteral extensions[] = {""}; +#endif // ^^^!_WIN32 + + static const std::vector path_bases = calculate_path_bases(); + for (const Path& path_base : path_bases) + { + for (auto&& stem : stems) + { + auto base_name = path_base / stem; + for (auto&& extension : extensions) + { + auto with_extension = base_name + extension; + if (!Util::Vectors::contains(ret, with_extension) && + this->exists(with_extension, IgnoreErrors{})) + { + Debug::print("Found path: ", with_extension, '\n'); + ret.push_back(std::move(with_extension)); + } + } + } + } + } + + return ret; + } + + virtual ReadFilePointer open_for_read(const Path& file_path, std::error_code& ec) const override + { + return ReadFilePointer{file_path, ec}; } -#endif // ^^^ !_WIN32 virtual void write_lines(const Path& file_path, const std::vector& lines, - std::error_code& ec) override + std::error_code& ec) const override { vcpkg::WriteFilePointer output{file_path, Append::NO, ec}; if (!ec) @@ -2663,7 +2999,8 @@ namespace vcpkg } } } - virtual void rename(const Path& old_path, const Path& new_path, std::error_code& ec) override + + virtual void rename(const Path& old_path, const Path& new_path, std::error_code& ec) const override { #if defined(_WIN32) stdfs::rename(to_stdfs_path(old_path), to_stdfs_path(new_path), ec); @@ -2681,7 +3018,7 @@ namespace vcpkg virtual void rename_or_copy(const Path& old_path, const Path& new_path, StringLiteral temp_suffix, - std::error_code& ec) override + std::error_code& ec) const override { this->rename(old_path, new_path, ec); (void)temp_suffix; @@ -2706,7 +3043,7 @@ namespace vcpkg #endif // ^^^ !defined(_WIN32) } - virtual bool remove(const Path& target, std::error_code& ec) override + virtual bool remove(const Path& target, std::error_code& ec) const override { #if defined(_WIN32) auto as_stdfs = to_stdfs_path(target); @@ -2743,75 +3080,11 @@ namespace vcpkg return false; #endif // _WIN32 } - virtual void remove_all(const Path& base, std::error_code& ec, Path& failure_point) override + virtual void remove_all(const Path& base, std::error_code& ec, Path& failure_point) const override { vcpkg_remove_all(base, ec, failure_point); } - virtual bool is_directory(const Path& target) const override - { -#if defined(_WIN32) - return stdfs::is_directory(to_stdfs_path(target)); -#else // ^^^ _WIN32 // !_WIN32 vvv - struct stat s; - if (::stat(target.c_str(), &s) != 0) - { - return false; - } - - return S_ISDIR(s.st_mode); -#endif // ^^^ !_WIN32 - } - virtual bool is_regular_file(const Path& target) const override - { -#if defined(_WIN32) - return stdfs::is_regular_file(to_stdfs_path(target)); -#else // ^^^ _WIN32 // !_WIN32 vvv - struct stat s; - if (::stat(target.c_str(), &s) != 0) - { - return false; - } - - return S_ISREG(s.st_mode); -#endif // ^^^ !_WIN32 - } - virtual bool is_empty(const Path& target, std::error_code& ec) const override - { -#if defined(_WIN32) - return stdfs::is_empty(to_stdfs_path(target), ec); -#else // ^^^ _WIN32 // !_WIN32 vvv - struct stat st; - if (::stat(target.c_str(), &st) != 0) - { - ec.assign(errno, std::generic_category()); - return false; - } - - if (S_ISDIR(st.st_mode)) - { - ReadDirOp rdo{target, ec}; - if (ec) return false; - const dirent* entry; - do - { - entry = rdo.read(ec); - if (ec) - { - return false; - } - if (entry == nullptr) - { - return true; - } - } while (is_dot_or_dot_dot(entry->d_name)); - return false; - } - - return st.st_size == 0; -#endif // ^^^ !_WIN32 - } - #if !defined(_WIN32) static int posix_create_directory(const char* new_directory) { @@ -2841,7 +3114,7 @@ namespace vcpkg } #endif // ^^^ !_WIN32 - virtual bool create_directory(const Path& new_directory, std::error_code& ec) override + virtual bool create_directory(const Path& new_directory, std::error_code& ec) const override { #if defined(_WIN32) return stdfs::create_directory(to_stdfs_path(new_directory), ec); @@ -2857,7 +3130,7 @@ namespace vcpkg return false; #endif // ^^^ !_WIN32 } - virtual bool create_directories(const Path& new_directory, std::error_code& ec) override + virtual bool create_directories(const Path& new_directory, std::error_code& ec) const override { StatsTimer t(g_us_filesystem_stats); #if defined(_WIN32) @@ -2911,14 +3184,15 @@ namespace vcpkg #endif // _WIN32 } - virtual Path create_or_get_temp_directory(std::error_code& ec) override + virtual Path create_or_get_temp_directory(std::error_code& ec) const override { #if defined(_WIN32) wchar_t temp_folder[MAX_PATH + 1]; DWORD length_without_null = GetTempPathW(MAX_PATH + 1, temp_folder); Path temp_folder_path = Path(Strings::to_utf8(temp_folder, length_without_null)) / "vcpkg"; #else // ^^^ _WIN32 // !_WIN32 vvv - const Path temp_folder_path = "/tmp/vcpkg"; + const Path temp_folder_path = + Path(get_environment_variable("TMPDIR").value_or(std::string("/tmp"))) / "vcpkg"; #endif // ^^^ !_WIN32 this->create_directories(temp_folder_path, ec); @@ -2939,7 +3213,7 @@ namespace vcpkg } #endif // !_WIN32 - virtual void create_symlink(const Path& to, const Path& from, std::error_code& ec) override + virtual void create_symlink(const Path& to, const Path& from, std::error_code& ec) const override { #if defined(_WIN32) stdfs::create_symlink(to_stdfs_path(to), to_stdfs_path(from), ec); @@ -2947,7 +3221,7 @@ namespace vcpkg posix_create_symlink(to, from, ec); #endif // _WIN32 } - virtual void create_directory_symlink(const Path& to, const Path& from, std::error_code& ec) override + virtual void create_directory_symlink(const Path& to, const Path& from, std::error_code& ec) const override { #if defined(_WIN32) stdfs::create_directory_symlink(to_stdfs_path(to), to_stdfs_path(from), ec); @@ -2955,12 +3229,12 @@ namespace vcpkg posix_create_symlink(to, from, ec); #endif // _WIN32 } - virtual void create_hard_link(const Path& to, const Path& from, std::error_code& ec) override + virtual void create_hard_link(const Path& to, const Path& from, std::error_code& ec) const override { #if defined(_WIN32) stdfs::create_hard_link(to_stdfs_path(to), to_stdfs_path(from), ec); #else // ^^^ _WIN32 // !_WIN32 vvv - if (::link(from.c_str(), to.c_str()) == 0) + if (::link(to.c_str(), from.c_str()) == 0) { ec.clear(); } @@ -2971,12 +3245,14 @@ namespace vcpkg #endif // _WIN32 } - virtual void copy_regular_recursive(const Path& source, const Path& destination, std::error_code& ec) override + virtual void copy_regular_recursive(const Path& source, + const Path& destination, + std::error_code& ec) const override { StatsTimer t(g_us_filesystem_stats); copy_regular_recursive_impl(source, destination, ec); } - void copy_regular_recursive_impl(const Path& source, const Path& destination, std::error_code& ec) + void copy_regular_recursive_impl(const Path& source, const Path& destination, std::error_code& ec) const { #if defined(_WIN32) stdfs::copy(to_stdfs_path(source), to_stdfs_path(destination), stdfs::copy_options::recursive, ec); @@ -3017,7 +3293,7 @@ namespace vcpkg virtual bool copy_file(const Path& source, const Path& destination, CopyOptions options, - std::error_code& ec) override + std::error_code& ec) const override { #if defined(_WIN32) DWORD last_error; @@ -3244,7 +3520,7 @@ namespace vcpkg #endif // ^^^ !_WIN32 } - virtual void copy_symlink(const Path& source, const Path& destination, std::error_code& ec) override + virtual void copy_symlink(const Path& source, const Path& destination, std::error_code& ec) const override { #if defined(_WIN32) stdfs::copy_symlink(to_stdfs_path(source), to_stdfs_path(destination), ec); @@ -3285,78 +3561,7 @@ namespace vcpkg #endif // ^^^ !_WIN32 } - virtual FileType status(const Path& target, std::error_code& ec) const override - { -#if defined(_WIN32) - auto result = stdfs::status(to_stdfs_path(target), ec); - translate_not_found_to_success(ec); - return convert_file_type(result.type()); -#else // ^^^ _WIN32 // !_WIN32 vvv - struct stat s; - if (::stat(target.c_str(), &s) == 0) - { - ec.clear(); - return posix_translate_stat_mode_to_file_type(s.st_mode); - } - - if (errno == ENOENT || errno == ENOTDIR) - { - ec.clear(); - return FileType::not_found; - } - - ec.assign(errno, std::generic_category()); - return FileType::unknown; -#endif // ^^^ !_WIN32 - } - virtual FileType symlink_status(const Path& target, std::error_code& ec) const override - { -#if defined(_WIN32) - auto result = stdfs::symlink_status(to_stdfs_path(target), ec); - translate_not_found_to_success(ec); - return convert_file_type(result.type()); -#else // ^^^ _WIN32 // !_WIN32 vvv - struct stat s; - if (::lstat(target.c_str(), &s) == 0) - { - ec.clear(); - return posix_translate_stat_mode_to_file_type(s.st_mode); - } - - if (errno == ENOENT || errno == ENOTDIR) - { - ec.clear(); - return FileType::not_found; - } - - ec.assign(errno, std::generic_category()); - return FileType::unknown; -#endif // ^^^ !_WIN32 - } - - virtual int64_t last_write_time(const Path& target, std::error_code& ec) const override - { -#if defined(_WIN32) - auto result = stdfs::last_write_time(to_stdfs_path(target), ec); - return result.time_since_epoch().count(); -#else // ^^^ _WIN32 // !_WIN32 vvv - struct stat s; - if (::lstat(target.c_str(), &s) == 0) - { - ec.clear(); -#ifdef __APPLE__ - return s.st_mtimespec.tv_sec * 1'000'000'000 + s.st_mtimespec.tv_nsec; -#else - return s.st_mtim.tv_sec * 1'000'000'000 + s.st_mtim.tv_nsec; -#endif - } - - ec.assign(errno, std::generic_category()); - return {}; -#endif // ^^^ !_WIN32 - } - - virtual void write_contents(const Path& file_path, StringView data, std::error_code& ec) override + virtual void write_contents(const Path& file_path, StringView data, std::error_code& ec) const override { StatsTimer t(g_us_filesystem_stats); auto f = open_for_write(file_path, Append::NO, ec); @@ -3370,7 +3575,7 @@ namespace vcpkg } } - virtual void write_contents_and_dirs(const Path& file_path, StringView data, std::error_code& ec) override + virtual void write_contents_and_dirs(const Path& file_path, StringView data, std::error_code& ec) const override { write_contents(file_path, data, ec); if (ec) @@ -3384,70 +3589,7 @@ namespace vcpkg } } - virtual Path absolute(const Path& target, std::error_code& ec) const override - { -#if defined(_WIN32) - return from_stdfs_path(stdfs::absolute(to_stdfs_path(target), ec)); -#else // ^^^ _WIN32 / !_WIN32 vvv - if (target.is_absolute()) - { - return target; - } - else - { - auto current_path = this->current_path(ec); - if (ec) return Path(); - return std::move(current_path) / target; - } -#endif // ^^^ !_WIN32 - } - - virtual Path almost_canonical(const Path& target, std::error_code& ec) const override - { - auto result = this->absolute(target, ec); - if (ec) - { - return result; - } - - result = result.lexically_normal(); -#if defined(_WIN32) - result = vcpkg::win32_fix_path_case(result); -#endif // _WIN32 - return result; - } - - virtual Path current_path(std::error_code& ec) const override - { -#if defined(_WIN32) - return from_stdfs_path(stdfs::current_path(ec)); -#else // ^^^ _WIN32 // !_WIN32 - std::string buf; - buf.resize(PATH_MAX); - for (;;) - { - if (getcwd(&buf[0], buf.size() + 1) != nullptr) - { - buf.resize(strlen(buf.c_str())); - ec.clear(); - break; - } - - if (errno != ERANGE) - { - ec.assign(errno, std::generic_category()); - buf.clear(); - break; - } - - // the current working directory is too big for the size of the string; resize and try again. - buf.append(PATH_MAX, '\0'); - } - - return Path{std::move(buf)}; -#endif // ^^^ !_WIN32 - } - virtual void current_path(const Path& new_current_path, std::error_code& ec) override + virtual void current_path(const Path& new_current_path, std::error_code& ec) const override { #if defined(_WIN32) stdfs::current_path(to_stdfs_path(new_current_path), ec); @@ -3542,7 +3684,7 @@ namespace vcpkg }; virtual std::unique_ptr take_exclusive_file_lock(const Path& lockfile, - std::error_code& ec) override + std::error_code& ec) const override { auto result = std::make_unique(lockfile, ec); if (!ec && !result->lock_attempt(ec) && !ec) @@ -3558,7 +3700,7 @@ namespace vcpkg } virtual std::unique_ptr try_take_exclusive_file_lock(const Path& lockfile, - std::error_code& ec) override + std::error_code& ec) const override { auto result = std::make_unique(lockfile, ec); if (!ec && !result->lock_attempt(ec) && !ec) @@ -3585,57 +3727,16 @@ namespace vcpkg return std::move(result); } - virtual std::vector find_from_PATH(View stems) const override - { - std::vector ret; - - if (!stems.empty()) - { -#if defined(_WIN32) - static constexpr StringLiteral extensions[] = {".cmd", ".exe", ".bat"}; -#else // ^^^ _WIN32 // !_WIN32 vvv - static constexpr StringLiteral extensions[] = {""}; -#endif // ^^^!_WIN32 - - static const std::vector path_bases = calculate_path_bases(); - for (const Path& path_base : path_bases) - { - for (auto&& stem : stems) - { - auto base_name = path_base / stem; - for (auto&& extension : extensions) - { - auto with_extension = base_name + extension; - if (!Util::Vectors::contains(ret, with_extension) && - this->exists(with_extension, IgnoreErrors{})) - { - Debug::print("Found path: ", with_extension, '\n'); - ret.push_back(std::move(with_extension)); - } - } - } - } - } - - return ret; - } - - virtual ReadFilePointer open_for_read(const Path& file_path, std::error_code& ec) const override - { - return ReadFilePointer{file_path, ec}; - } - - virtual WriteFilePointer open_for_write(const Path& file_path, Append append, std::error_code& ec) override + virtual WriteFilePointer open_for_write(const Path& file_path, + Append append, + std::error_code& ec) const override { return WriteFilePointer{file_path, append, ec}; } }; - Filesystem& get_real_filesystem() - { - static RealFilesystem real_fs; - return real_fs; - } + static constexpr RealFilesystem real_filesystem_instance; + constexpr const Filesystem& real_filesystem = real_filesystem_instance; constexpr StringLiteral FILESYSTEM_INVALID_CHARACTERS = R"(\/:*?"<>|)"; @@ -3645,7 +3746,7 @@ namespace vcpkg std::string::npos; } - void print_paths(const std::vector& paths) + void print_paths(MessageSink& msg_sink, const std::vector& paths) { LocalizedString ls; ls.append_raw('\n'); @@ -3657,7 +3758,7 @@ namespace vcpkg } ls.append_raw('\n'); - msg::print(ls); + msg_sink.print(ls); } IExclusiveFileLock::~IExclusiveFileLock() = default; @@ -3778,4 +3879,15 @@ namespace vcpkg return Strings::case_insensitive_ascii_equals(extension, ext); }); } + +#if !defined(_WIN32) + void close_mark_invalid(int& fd) noexcept + { + if (fd >= 0) + { + Checks::check_exit(VCPKG_LINE_INFO, ::close(fd) == 0); + fd = -1; + } + } +#endif // ^^^ !_WIN32 } diff --git a/src/vcpkg/base/hash.cpp b/src/vcpkg/base/hash.cpp index b847963529..c0103db4ec 100644 --- a/src/vcpkg/base/hash.cpp +++ b/src/vcpkg/base/hash.cpp @@ -558,14 +558,14 @@ namespace vcpkg::Hash std::string get_string_sha256(StringView s) { return get_string_hash(s, Hash::Algorithm::Sha256); } - ExpectedL get_file_hash(const Filesystem& fs, const Path& path, Algorithm algo) + ExpectedL get_file_hash(const ReadOnlyFilesystem& fs, const Path& path, Algorithm algo) { Debug::println("Trying to hash ", path); std::error_code ec; auto file = fs.open_for_read(path, ec); if (ec) { - return msg::format(msg::msgErrorMessage) + return msg::format(msgErrorMessage) .append(msgHashFileFailureToRead, msg::path = path) .append_raw(ec.message()); } @@ -582,7 +582,7 @@ namespace vcpkg::Hash } else if ((ec = file.error())) { - return msg::format(msg::msgErrorMessage) + return msg::format(msgErrorMessage) .append(msgHashFileFailureToRead, msg::path = path) .append_raw(ec.message()); } diff --git a/src/vcpkg/base/json.cpp b/src/vcpkg/base/json.cpp index 81f16b1471..5951a22eaa 100644 --- a/src/vcpkg/base/json.cpp +++ b/src/vcpkg/base/json.cpp @@ -316,11 +316,7 @@ namespace vcpkg::Json // } struct Value // struct Array { Value& Array::push_back(std::string&& value) { return this->push_back(Json::Value::string(std::move(value))); } - Value& Array::push_back(Value&& value) - { - underlying_.push_back(std::move(value)); - return underlying_.back(); - } + Value& Array::push_back(Value&& value) { return underlying_.emplace_back(std::move(value)); } Object& Array::push_back(Object&& obj) { return push_back(Value::object(std::move(obj))).object(VCPKG_LINE_INFO); } Array& Array::push_back(Array&& arr) { return push_back(Value::array(std::move(arr))).array(VCPKG_LINE_INFO); } Value& Array::insert_before(iterator it, Value&& value) @@ -349,8 +345,7 @@ namespace vcpkg::Json fmt::format("attempted to insert duplicate key {} into JSON object", key)); } - underlying_.emplace_back(key.to_string(), std::move(value)); - return underlying_.back().second; + return underlying_.emplace_back(key.to_string(), std::move(value)).second; } Value& Object::insert(StringView key, const Value& value) { @@ -360,8 +355,7 @@ namespace vcpkg::Json fmt::format("attempted to insert duplicate key {} into JSON object", key)); } - underlying_.emplace_back(key.to_string(), value); - return underlying_.back().second; + return underlying_.emplace_back(key.to_string(), value).second; } Array& Object::insert(StringView key, Array&& value) { @@ -394,8 +388,7 @@ namespace vcpkg::Json } else { - underlying_.emplace_back(key, std::move(value)); - return underlying_.back().second; + return underlying_.emplace_back(key, std::move(value)).second; } } Value& Object::insert_or_replace(StringView key, const Value& value) @@ -408,8 +401,7 @@ namespace vcpkg::Json } else { - underlying_.emplace_back(key, value); - return underlying_.back().second; + return underlying_.emplace_back(key, value).second; } } Array& Object::insert_or_replace(StringView key, Array&& value) @@ -1067,11 +1059,6 @@ namespace vcpkg::Json const BooleanDeserializer BooleanDeserializer::instance; - static constexpr bool is_lower_digit(char ch) - { - return ParserBase::is_lower_alpha(ch) || ParserBase::is_ascii_digit(ch); - } - bool IdentifierDeserializer::is_ident(StringView sv) { // back-compat @@ -1085,9 +1072,9 @@ namespace vcpkg::Json const auto last = sv.end(); for (;;) { - if (cur == last || !is_lower_digit(*cur)) return false; + if (cur == last || !ParserBase::is_lower_digit(*cur)) return false; ++cur; - while (cur != last && is_lower_digit(*cur)) + while (cur != last && ParserBase::is_lower_digit(*cur)) ++cur; if (cur == last) break; @@ -1118,7 +1105,7 @@ namespace vcpkg::Json return true; } - ExpectedT> parse_file(const Filesystem& fs, + ExpectedT> parse_file(const ReadOnlyFilesystem& fs, const Path& json_file, std::error_code& ec) { @@ -1131,7 +1118,7 @@ namespace vcpkg::Json return parse(res, json_file); } - ParsedJson parse_file(vcpkg::LineInfo li, const Filesystem& fs, const Path& json_file) + ParsedJson parse_file(vcpkg::LineInfo li, const ReadOnlyFilesystem& fs, const Path& json_file) { std::error_code ec; auto ret = parse_file(fs, json_file, ec).map_error(parse_error_formatter); @@ -1172,7 +1159,7 @@ namespace vcpkg::Json JsonStyle style; std::string& buffer; - void append_indent(int indent) const + void append_indent(size_t indent) const { if (style.use_tabs()) { @@ -1186,23 +1173,27 @@ namespace vcpkg::Json void append_unicode_escape(char16_t code_unit) const { - buffer.append("\\u"); - // AFAIK, there's no standard way of doing this? constexpr const char hex_digit[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - buffer.push_back(hex_digit[(code_unit >> 12) & 0x0F]); - buffer.push_back(hex_digit[(code_unit >> 8) & 0x0F]); - buffer.push_back(hex_digit[(code_unit >> 4) & 0x0F]); - buffer.push_back(hex_digit[(code_unit >> 0) & 0x0F]); + const char seq[6] = { + '\\', + 'u', + hex_digit[(code_unit >> 12) & 0x0F], + hex_digit[(code_unit >> 8) & 0x0F], + hex_digit[(code_unit >> 4) & 0x0F], + hex_digit[(code_unit >> 0) & 0x0F], + }; + + buffer.append(seq, 6); } // taken from the ECMAScript 2020 standard, 24.5.2.2: Runtime Semantics: QuoteJSONString void append_quoted_json_string(StringView sv) { // Table 66: JSON Single Character Escape Sequences - constexpr static std::array, 7> escape_sequences = {{ + constexpr static std::pair escape_sequences[] = { {0x0008, R"(\b)"}, // BACKSPACE {0x0009, R"(\t)"}, // CHARACTER TABULATION {0x000A, R"(\n)"}, // LINE FEED (LF) @@ -1210,7 +1201,7 @@ namespace vcpkg::Json {0x000D, R"(\r)"}, // CARRIAGE RETURN (CR) {0x0022, R"(\")"}, // QUOTATION MARK {0x005C, R"(\\)"} // REVERSE SOLIDUS - }}; + }; // 1. Let product be the String value consisting solely of the code unit 0x0022 (QUOTATION MARK). buffer.push_back('"'); @@ -1252,7 +1243,7 @@ namespace vcpkg::Json buffer.push_back('"'); } - void stringify_object(const Object& obj, int current_indent) + void stringify_object(const Object& obj, size_t current_indent) { buffer.push_back('{'); if (obj.size() != 0) @@ -1280,7 +1271,7 @@ namespace vcpkg::Json buffer.push_back('}'); } - void stringify_array(const Array& arr, int current_indent) + void stringify_array(const Array& arr, size_t current_indent) { buffer.push_back('['); if (arr.size() == 0) @@ -1310,7 +1301,7 @@ namespace vcpkg::Json } } - void stringify(const Value& value, int current_indent) + void stringify(const Value& value, size_t current_indent) { switch (value.kind()) { @@ -1532,83 +1523,18 @@ namespace vcpkg::Json const PackageNameDeserializer PackageNameDeserializer::instance; - LocalizedString PackagePatternDeserializer::type_name() const { return msg::format(msgAPackagePattern); } + LocalizedString FeatureNameDeserializer::type_name() const { return msg::format(msgAFeatureName); } - Optional PackagePatternDeserializer::visit_string(Json::Reader& r, StringView sv) const + Optional FeatureNameDeserializer::visit_string(Json::Reader& r, StringView sv) const { - if (!is_package_pattern(sv)) + if (!IdentifierDeserializer::is_ident(sv)) { r.add_generic_error( type_name(), - msg::format(msgParsePackagePatternError, msg::package_name = sv, msg::url = docs::registries_url)); - } - - return PackagePatternDeclaration{ - sv.to_string(), - r.path(), - }; - } - - bool PackagePatternDeserializer::is_package_pattern(StringView sv) - { - if (IdentifierDeserializer::is_ident(sv)) - { - return true; - } - - /*if (sv == "*") - { - return true; - }*/ - - // ([a-z0-9]+(-[a-z0-9]+)*)(\*?) - auto cur = sv.begin(); - const auto last = sv.end(); - for (;;) - { - // [a-z0-9]+ - if (cur == last) - { - return false; - } - - if (!is_lower_digit(*cur)) - { - if (*cur != '*') - { - return false; - } - - return ++cur == last; - } - - do - { - ++cur; - if (cur == last) - { - return true; - } - } while (is_lower_digit(*cur)); - - switch (*cur) - { - case '-': - // repeat outer [a-z0-9]+ again to match -[a-z0-9]+ - ++cur; - continue; - case '*': - // match last optional * - ++cur; - return cur == last; - default: return false; - } + msg::format(msgParseFeatureNameError, msg::package_name = sv, msg::url = docs::manifests_url)); } + return sv.to_string(); } - const PackagePatternDeserializer PackagePatternDeserializer::instance; - - LocalizedString PackagePatternArrayDeserializer::type_name() const { return msg::format(msgAPackagePatternArray); } - - const PackagePatternArrayDeserializer PackagePatternArrayDeserializer::instance; + const FeatureNameDeserializer FeatureNameDeserializer::instance; } diff --git a/src/vcpkg/base/message_sinks.cpp b/src/vcpkg/base/message_sinks.cpp index 936081ce06..c1f92349d0 100644 --- a/src/vcpkg/base/message_sinks.cpp +++ b/src/vcpkg/base/message_sinks.cpp @@ -1,3 +1,4 @@ +#include #include namespace @@ -31,12 +32,12 @@ namespace vcpkg void MessageSink::println_warning(const LocalizedString& s) { - println(Color::warning, format(msg::msgWarningMessage).append(s)); + println(Color::warning, format(msgWarningMessage).append(s)); } void MessageSink::println_error(const LocalizedString& s) { - println(Color::error, format(msg::msgErrorMessage).append(s)); + println(Color::error, format(msgErrorMessage).append(s)); } MessageSink& null_sink = null_sink_instance; diff --git a/src/vcpkg/base/messages.cpp b/src/vcpkg/base/messages.cpp index c52046b536..374cae96da 100644 --- a/src/vcpkg/base/messages.cpp +++ b/src/vcpkg/base/messages.cpp @@ -28,31 +28,39 @@ namespace vcpkg template LocalizedString LocalizedString::from_raw(std::basic_string&& s) noexcept; LocalizedString LocalizedString::from_raw(StringView s) { return LocalizedString(s); } - LocalizedString& LocalizedString::append_raw(char c) + LocalizedString& LocalizedString::append_raw(char c) & { m_data.push_back(c); return *this; } - LocalizedString& LocalizedString::append_raw(StringView s) + LocalizedString&& LocalizedString::append_raw(char c) && { return std::move(append_raw(c)); } + + LocalizedString& LocalizedString::append_raw(StringView s) & { m_data.append(s.begin(), s.size()); return *this; } - LocalizedString& LocalizedString::append(const LocalizedString& s) + LocalizedString&& LocalizedString::append_raw(StringView s) && { return std::move(append_raw(s)); } + + LocalizedString& LocalizedString::append(const LocalizedString& s) & { m_data.append(s.m_data); return *this; } - LocalizedString& LocalizedString::append_indent(size_t indent) + LocalizedString&& LocalizedString::append(const LocalizedString& s) && { return std::move(append(s)); } + + LocalizedString& LocalizedString::append_indent(size_t indent) & { - m_data.append(indent * 4, ' '); + m_data.append(indent * 2, ' '); return *this; } - LocalizedString& LocalizedString::append_floating_list(int indent, View items) + LocalizedString&& LocalizedString::append_indent(size_t indent) && { return std::move(append_indent(indent)); } + + LocalizedString& LocalizedString::append_floating_list(int indent, View items) & { switch (items.size()) { @@ -70,6 +78,11 @@ namespace vcpkg return *this; } + LocalizedString&& LocalizedString::append_floating_list(int indent, View items) && + { + return std::move(append_floating_list(indent, items)); + } + bool operator==(const LocalizedString& lhs, const LocalizedString& rhs) noexcept { return lhs.data() == rhs.data(); @@ -100,6 +113,14 @@ namespace vcpkg LocalizedString::LocalizedString(StringView data) : m_data(data.data(), data.size()) { } LocalizedString::LocalizedString(std::string&& data) noexcept : m_data(std::move(data)) { } + LocalizedString format_environment_variable(StringView variable_name) + { +#if defined(_WIN32) + return LocalizedString::from_raw(fmt::format("%{}%", variable_name)); +#else // ^^^ _WIN32 / !_WIN32 vvv + return LocalizedString::from_raw(fmt::format("${}", variable_name)); +#endif // ^^^ !_WIN32 + } } namespace vcpkg::msg @@ -255,17 +276,6 @@ namespace vcpkg #include #undef DECLARE_MESSAGE - - namespace msg - { - const decltype(vcpkg::msgErrorMessage) msgErrorMessage = vcpkg::msgErrorMessage; - const decltype(vcpkg::msgWarningMessage) msgWarningMessage = vcpkg::msgWarningMessage; - const decltype(vcpkg::msgNoteMessage) msgNoteMessage = vcpkg::msgNoteMessage; - const decltype(vcpkg::msgSeeURL) msgSeeURL = vcpkg::msgSeeURL; - const decltype(vcpkg::msgInternalErrorMessage) msgInternalErrorMessage = vcpkg::msgInternalErrorMessage; - const decltype(vcpkg::msgInternalErrorMessageContact) msgInternalErrorMessageContact = - vcpkg::msgInternalErrorMessageContact; - } } namespace vcpkg::msg { @@ -451,7 +461,7 @@ namespace vcpkg::msg } // LCIDs supported by VS: - // https://learn.microsoft.com/en-us/visualstudio/ide/reference/lcid-devenv-exe?view=vs-2022 + // https://learn.microsoft.com/visualstudio/ide/reference/lcid-devenv-exe?view=vs-2022 Optional get_language_tag(int LCID) { static constexpr std::pair languages[] = { diff --git a/src/vcpkg/base/parse.cpp b/src/vcpkg/base/parse.cpp index 2b1bedc5d3..363ab554c7 100644 --- a/src/vcpkg/base/parse.cpp +++ b/src/vcpkg/base/parse.cpp @@ -38,11 +38,11 @@ namespace vcpkg res = LocalizedString::from_raw(fmt::format("{}:{}:{}: ", origin, location.row, location.column)); if (kind == MessageKind::Warning) { - res.append(msg::msgWarningMessage); + res.append(msgWarningMessage); } else { - res.append(msg::msgErrorMessage); + res.append(msgErrorMessage); } res.append(message); diff --git a/src/vcpkg/base/strings.cpp b/src/vcpkg/base/strings.cpp index 7c294e3461..cf7e2e2f9d 100644 --- a/src/vcpkg/base/strings.cpp +++ b/src/vcpkg/base/strings.cpp @@ -25,10 +25,6 @@ namespace vcpkg::Strings::details void append_internal(std::string& into, const char* v) { into.append(v); } void append_internal(std::string& into, const std::string& s) { into.append(s); } void append_internal(std::string& into, StringView s) { into.append(s.begin(), s.end()); } - void append_internal(std::string& into, LineInfo ln) - { - fmt::format_to(std::back_inserter(into), "{}:{}:", ln.file_name, ln.line_number); - } } vcpkg::ExpectedL vcpkg::details::api_stable_format_impl(StringView sv, @@ -88,13 +84,29 @@ vcpkg::ExpectedL vcpkg::details::api_stable_format_impl(StringView return {std::move(out), expected_left_tag}; } -namespace vcpkg::Strings::details +namespace { // To disambiguate between two overloads - static bool is_space(const char c) { return std::isspace(static_cast(c)) != 0; } + constexpr struct + { + bool operator()(char c) const noexcept { return std::isspace(static_cast(c)) != 0; } + } is_space_char; + + constexpr struct + { + char operator()(char c) const noexcept { return (c < 'a' || c > 'z') ? c : c - 'a' + 'A'; } + } to_upper_char; + + constexpr struct + { + char operator()(char c) const noexcept { return (c < 'A' || c > 'Z') ? c : c - 'A' + 'a'; } + } tolower_char; + + constexpr struct + { + bool operator()(char a, char b) const noexcept { return tolower_char(a) == tolower_char(b); } + } icase_eq; - // Avoids C4244 warnings because of char<->int conversion that occur when using std::tolower() - static char toupper_char(const char c) { return (c < 'a' || c > 'z') ? c : c - 'a' + 'A'; } } #if defined(_WIN32) @@ -149,15 +161,6 @@ void Strings::to_utf8(std::string& output, const wchar_t* w, size_t size_in_char std::string Strings::to_utf8(const std::wstring& ws) { return to_utf8(ws.data(), ws.size()); } #endif -std::string Strings::escape_string(std::string&& s, char char_to_escape, char escape_char) -{ - // Replace '\' with '\\' or '`' with '``' - auto ret = Strings::replace_all(std::move(s), {&escape_char, 1}, std::string{escape_char, escape_char}); - // Replace '"' with '\"' or '`"' - ret = Strings::replace_all(std::move(ret), {&char_to_escape, 1}, std::string{escape_char, char_to_escape}); - return ret; -} - const char* Strings::case_insensitive_ascii_search(StringView s, StringView pattern) { return std::search(s.begin(), s.end(), pattern.begin(), pattern.end(), icase_eq); @@ -173,24 +176,25 @@ bool Strings::case_insensitive_ascii_equals(StringView left, StringView right) return std::equal(left.begin(), left.end(), right.begin(), right.end(), icase_eq); } -void Strings::ascii_to_lowercase(char* first, char* last) { std::transform(first, last, first, tolower_char); } +void Strings::inplace_ascii_to_lowercase(char* first, char* last) { std::transform(first, last, first, tolower_char); } -std::string Strings::ascii_to_lowercase(const std::string& s) +void Strings::inplace_ascii_to_lowercase(std::string& s) { - auto result = s; - return ascii_to_lowercase(std::move(result)); + Strings::inplace_ascii_to_lowercase(s.data(), s.data() + s.size()); } -std::string Strings::ascii_to_lowercase(std::string&& s) +std::string Strings::ascii_to_lowercase(StringView s) { - Strings::ascii_to_lowercase(s.data(), s.data() + s.size()); - return std::move(s); + std::string result; + std::transform(s.begin(), s.end(), std::back_inserter(result), tolower_char); + return result; } -std::string Strings::ascii_to_uppercase(std::string&& s) +std::string Strings::ascii_to_uppercase(StringView s) { - std::transform(s.begin(), s.end(), s.begin(), &details::toupper_char); - return std::move(s); + std::string result; + std::transform(s.begin(), s.end(), std::back_inserter(result), to_upper_char); + return result; } bool Strings::case_insensitive_ascii_starts_with(StringView s, StringView pattern) @@ -216,14 +220,11 @@ bool Strings::starts_with(StringView s, StringView pattern) return std::equal(s.begin(), s.begin() + pattern.size(), pattern.begin(), pattern.end()); } -std::string Strings::replace_all(const char* s, StringView search, StringView rep) -{ - return Strings::replace_all(std::string(s), search, rep); -} - std::string Strings::replace_all(StringView s, StringView search, StringView rep) { - return Strings::replace_all(s.to_string(), search, rep); + std::string ret = s.to_string(); + Strings::inplace_replace_all(ret, search, rep); + return ret; } std::string Strings::replace_all(std::string&& s, StringView search, StringView rep) @@ -252,28 +253,27 @@ void Strings::inplace_replace_all(std::string& s, char search, char rep) noexcep std::replace(s.begin(), s.end(), search, rep); } -std::string Strings::trim(std::string&& s) +void Strings::inplace_trim(std::string& s) { - s.erase(std::find_if_not(s.rbegin(), s.rend(), details::is_space).base(), s.end()); - s.erase(s.begin(), std::find_if_not(s.begin(), s.end(), details::is_space)); - return std::move(s); + s.erase(std::find_if_not(s.rbegin(), s.rend(), is_space_char).base(), s.end()); + s.erase(s.begin(), std::find_if_not(s.begin(), s.end(), is_space_char)); } StringView Strings::trim(StringView sv) { - auto last = std::find_if_not(sv.rbegin(), sv.rend(), details::is_space).base(); - auto first = std::find_if_not(sv.begin(), sv.end(), details::is_space); + auto last = std::find_if_not(sv.rbegin(), sv.rend(), is_space_char).base(); + auto first = std::find_if_not(sv.begin(), sv.end(), is_space_char); return StringView(first, last); } -void Strings::trim_all_and_remove_whitespace_strings(std::vector* strings) +void Strings::inplace_trim_all_and_remove_whitespace_strings(std::vector& strings) { - for (std::string& s : *strings) + for (std::string& s : strings) { - s = trim(std::move(s)); + inplace_trim(s); } - Util::erase_remove_if(*strings, [](const std::string& s) { return s.empty(); }); + Util::erase_remove_if(strings, [](const std::string& s) { return s.empty(); }); } std::vector Strings::split(StringView s, const char delimiter) @@ -295,6 +295,20 @@ std::vector Strings::split(StringView s, const char delimiter) } } +std::vector Strings::split_keep_empty(StringView s, const char delimiter) +{ + std::vector output; + auto first = s.begin(); + const auto last = s.end(); + do + { + auto next = std::find_if(first, last, [=](const char c) { return c == delimiter; }); + output.emplace_back(first, next); + if (next == last) return output; + first = next + 1; + } while (1); +} + std::vector Strings::split_paths(StringView s) { #if defined(_WIN32) diff --git a/src/vcpkg/base/stringview.cpp b/src/vcpkg/base/stringview.cpp index ff3f9accdd..8476573143 100644 --- a/src/vcpkg/base/stringview.cpp +++ b/src/vcpkg/base/stringview.cpp @@ -12,21 +12,6 @@ namespace vcpkg std::string StringView::to_string() const { return std::string(m_ptr, m_size); } void StringView::to_string(std::string& s) const { s.append(m_ptr, m_size); } - StringView StringView::substr(size_t pos, size_t count) const noexcept - { - if (pos > m_size) - { - return StringView(); - } - - if (count > m_size - pos) - { - return StringView(m_ptr + pos, m_size - pos); - } - - return StringView(m_ptr + pos, count); - } - bool operator==(StringView lhs, StringView rhs) noexcept { if (lhs.empty() && rhs.empty()) @@ -52,14 +37,4 @@ namespace vcpkg l.append(r.m_ptr, r.m_size); return std::move(l); } - - ZStringView ZStringView::substr(size_t pos) const noexcept - { - if (pos < size()) - { - return ZStringView{data() + pos, size() - pos}; - } - - return ZStringView{}; - } } diff --git a/src/vcpkg/base/system.cpp b/src/vcpkg/base/system.cpp index 33837d4b13..385b7019ab 100644 --- a/src/vcpkg/base/system.cpp +++ b/src/vcpkg/base/system.cpp @@ -155,6 +155,8 @@ namespace vcpkg if (Strings::case_insensitive_ascii_equals(arch, "ppc64le")) return CPUArchitecture::PPC64LE; if (Strings::case_insensitive_ascii_equals(arch, "riscv32")) return CPUArchitecture::RISCV32; if (Strings::case_insensitive_ascii_equals(arch, "riscv64")) return CPUArchitecture::RISCV64; + if (Strings::case_insensitive_ascii_equals(arch, "loongarch32")) return CPUArchitecture::LOONGARCH32; + if (Strings::case_insensitive_ascii_equals(arch, "loongarch64")) return CPUArchitecture::LOONGARCH64; return nullopt; } @@ -172,6 +174,8 @@ namespace vcpkg case CPUArchitecture::PPC64LE: return "ppc64le"; case CPUArchitecture::RISCV32: return "riscv32"; case CPUArchitecture::RISCV64: return "riscv64"; + case CPUArchitecture::LOONGARCH32: return "loongarch32"; + case CPUArchitecture::LOONGARCH64: return "loongarch64"; default: Checks::exit_with_message(VCPKG_LINE_INFO, "unexpected vcpkg::CPUArchitecture"); } } @@ -183,7 +187,7 @@ namespace vcpkg if (hKernel32) { BOOL(__stdcall* const isWow64Process2) - (HANDLE /* hProcess */, USHORT* /* pProcessMachine */, USHORT * /*pNativeMachine*/) = + (HANDLE /* hProcess */, USHORT* /* pProcessMachine */, USHORT* /*pNativeMachine*/) = reinterpret_cast(::GetProcAddress(hKernel32, "IsWow64Process2")); if (isWow64Process2) { @@ -269,6 +273,10 @@ namespace vcpkg return CPUArchitecture::RISCV32; #elif defined(__riscv) && defined(__riscv_xlen) && (__riscv_xlen == 64) return CPUArchitecture::RISCV64; +#elif defined(__loongarch32) || defined(__loongarch__) && (__loongarch_grlen == 32) + return CPUArchitecture::LOONGARCH32; +#elif defined(__loongarch64) || defined(__loongarch__) && (__loongarch_grlen == 64) + return CPUArchitecture::LOONGARCH64; #else // choose architecture #error "Unknown host architecture" #endif // choose architecture @@ -381,23 +389,23 @@ namespace vcpkg { static ExpectedL s_home = []() -> ExpectedL { #ifdef _WIN32 - static constexpr StringLiteral HOMEVAR = "%USERPROFILE%"; - static constexpr StringLiteral HOMEVARNAME = "USERPROFILE"; + static constexpr StringLiteral HOMEVAR = "USERPROFILE"; #else // ^^^ _WIN32 // !_WIN32 vvv - static constexpr StringLiteral HOMEVAR = "$HOME"; - static constexpr StringLiteral HOMEVARNAME = "HOME"; + static constexpr StringLiteral HOMEVAR = "HOME"; #endif // ^^^ !_WIN32 - auto maybe_home = get_environment_variable(HOMEVARNAME); + auto maybe_home = get_environment_variable(HOMEVAR); if (!maybe_home.has_value() || maybe_home.get()->empty()) { - return msg::format(msgUnableToReadEnvironmentVariable, msg::env_var = HOMEVAR); + return msg::format(msgUnableToReadEnvironmentVariable, + msg::env_var = format_environment_variable(HOMEVAR)); } Path p = std::move(*maybe_home.get()); if (!p.is_absolute()) { - return msg::format(msgEnvVarMustBeAbsolutePath, msg::path = p, msg::env_var = HOMEVAR); + return msg::format( + msgEnvVarMustBeAbsolutePath, msg::path = p, msg::env_var = format_environment_variable(HOMEVAR)); } return p; @@ -696,6 +704,8 @@ namespace vcpkg return "freebsd"; #elif defined(__OpenBSD__) return "openbsd"; +#elif defined(__ANDROID__) + return "android"; #elif defined(__linux__) return "linux"; #else diff --git a/src/vcpkg/base/system.mac.cpp b/src/vcpkg/base/system.mac.cpp index ed07326522..438275ade0 100644 --- a/src/vcpkg/base/system.mac.cpp +++ b/src/vcpkg/base/system.mac.cpp @@ -109,7 +109,7 @@ namespace vcpkg // get "physical address" if (parser.require_character('"')) return false; - auto mac_address = parser.match_until(is_quote).to_string(); + out = parser.match_until(is_quote).to_string(); if (parser.require_character('"')) return false; if (parser.require_character(',')) return false; @@ -121,12 +121,13 @@ namespace vcpkg parser.skip_whitespace(); if (!parser.at_eof()) { + out.clear(); return false; } // output line was properly formatted - std::replace(mac_address.begin(), mac_address.end(), '-', ':'); - out = Strings::ascii_to_lowercase(std::move(mac_address)); + std::replace(out.begin(), out.end(), '-', ':'); + Strings::inplace_ascii_to_lowercase(out); return true; } diff --git a/src/vcpkg/base/system.process.cpp b/src/vcpkg/base/system.process.cpp index b82bfb711e..a97ec278d5 100644 --- a/src/vcpkg/base/system.process.cpp +++ b/src/vcpkg/base/system.process.cpp @@ -2,6 +2,9 @@ #include #include +#include +#include +#include #include #include #include @@ -10,6 +13,7 @@ #include #include +#include #if defined(__APPLE__) extern char** environ; @@ -23,9 +27,16 @@ extern char** environ; #endif #if defined(_WIN32) +#include +#include +#include #pragma comment(lib, "Advapi32") #else +#include +#include #include + +#include #endif namespace @@ -45,6 +56,117 @@ namespace msg::exit_code = error_value, msg::error_msg = std::system_category().message(static_cast(error_value))); } + + static std::atomic_int32_t debug_id_counter{1000}; +#if defined(_WIN32) + struct CtrlCStateMachine + { + CtrlCStateMachine() : m_number_of_external_processes(0), m_global_job(NULL), m_in_interactive(0) { } + + void transition_to_spawn_process() noexcept + { + int cur = 0; + while (!m_number_of_external_processes.compare_exchange_strong(cur, cur + 1)) + { + if (cur < 0) + { + // Ctrl-C was hit and is asynchronously executing on another thread. + // Some other processes are outstanding. + // Sleep forever -- the other process will complete and exit the program + while (true) + { + std::this_thread::sleep_for(std::chrono::seconds(10)); + msg::println(msgWaitingForChildrenToExit); + } + } + } + } + void transition_from_spawn_process() noexcept + { + auto previous = m_number_of_external_processes.fetch_add(-1); + if (previous == INT_MIN + 1) + { + // Ctrl-C was hit while blocked on the child process + // This is the last external process to complete + // Therefore, exit + Checks::final_cleanup_and_exit(1); + } + else if (previous < 0) + { + // Ctrl-C was hit while blocked on the child process + // Some other processes are outstanding. + // Sleep forever -- the other process will complete and exit the program + while (true) + { + std::this_thread::sleep_for(std::chrono::seconds(10)); + msg::println(msgWaitingForChildrenToExit); + } + } + } + void transition_handle_ctrl_c() noexcept + { + int old_value = 0; + while (!m_number_of_external_processes.compare_exchange_strong(old_value, old_value + INT_MIN)) + { + if (old_value < 0) + { + // Repeat calls to Ctrl-C -- a previous one succeeded. + return; + } + } + + if (old_value == 0) + { + // Not currently blocked on a child process + Checks::final_cleanup_and_exit(1); + } + else + { + // We are currently blocked on a child process. + // If none of the child processes are interactive, use the Job Object to terminate the tree. + if (m_in_interactive.load() == 0) + { + auto job = m_global_job.exchange(NULL); + if (job != NULL) + { + ::CloseHandle(job); + } + } + } + } + + void initialize_job() + { + m_global_job = CreateJobObjectW(NULL, NULL); + if (m_global_job != NULL) + { + JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = {}; + info.BasicLimitInformation.LimitFlags = + JOB_OBJECT_LIMIT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; + ::SetInformationJobObject(m_global_job, JobObjectExtendedLimitInformation, &info, sizeof(info)); + ::AssignProcessToJobObject(m_global_job, ::GetCurrentProcess()); + } + } + + void enter_interactive() { ++m_in_interactive; } + void exit_interactive() { --m_in_interactive; } + + private: + std::atomic m_number_of_external_processes; + std::atomic m_global_job; + std::atomic m_in_interactive; + }; + + static CtrlCStateMachine g_ctrl_c_state; + + struct SpawnProcessGuard + { + SpawnProcessGuard() { g_ctrl_c_state.transition_to_spawn_process(); } + SpawnProcessGuard(const SpawnProcessGuard&) = delete; + SpawnProcessGuard& operator=(const SpawnProcessGuard&) = delete; + ~SpawnProcessGuard() { g_ctrl_c_state.transition_from_spawn_process(); } + }; +#endif // ^^^ _WIN32 } // unnamed namespace namespace vcpkg @@ -99,109 +221,6 @@ namespace vcpkg static std::atomic g_subprocess_stats(0); #if defined(_WIN32) - namespace - { - struct CtrlCStateMachine - { - CtrlCStateMachine() : m_number_of_external_processes(0), m_global_job(NULL), m_in_interactive(0) { } - - void transition_to_spawn_process() noexcept - { - int cur = 0; - while (!m_number_of_external_processes.compare_exchange_strong(cur, cur + 1)) - { - if (cur < 0) - { - // Ctrl-C was hit and is asynchronously executing on another thread. - // Some other processes are outstanding. - // Sleep forever -- the other process will complete and exit the program - while (true) - { - std::this_thread::sleep_for(std::chrono::seconds(10)); - msg::println(msgWaitingForChildrenToExit); - } - } - } - } - void transition_from_spawn_process() noexcept - { - auto previous = m_number_of_external_processes.fetch_add(-1); - if (previous == INT_MIN + 1) - { - // Ctrl-C was hit while blocked on the child process - // This is the last external process to complete - // Therefore, exit - Checks::final_cleanup_and_exit(1); - } - else if (previous < 0) - { - // Ctrl-C was hit while blocked on the child process - // Some other processes are outstanding. - // Sleep forever -- the other process will complete and exit the program - while (true) - { - std::this_thread::sleep_for(std::chrono::seconds(10)); - msg::println(msgWaitingForChildrenToExit); - } - } - } - void transition_handle_ctrl_c() noexcept - { - int old_value = 0; - while (!m_number_of_external_processes.compare_exchange_strong(old_value, old_value + INT_MIN)) - { - if (old_value < 0) - { - // Repeat calls to Ctrl-C -- a previous one succeeded. - return; - } - } - - if (old_value == 0) - { - // Not currently blocked on a child process - Checks::final_cleanup_and_exit(1); - } - else - { - // We are currently blocked on a child process. - // If none of the child processes are interactive, use the Job Object to terminate the tree. - if (m_in_interactive.load() == 0) - { - auto job = m_global_job.exchange(NULL); - if (job != NULL) - { - ::CloseHandle(job); - } - } - } - } - - void initialize_job() - { - m_global_job = CreateJobObjectW(NULL, NULL); - if (m_global_job != NULL) - { - JOBOBJECT_EXTENDED_LIMIT_INFORMATION info = {}; - info.BasicLimitInformation.LimitFlags = - JOB_OBJECT_LIMIT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; - ::SetInformationJobObject(m_global_job, JobObjectExtendedLimitInformation, &info, sizeof(info)); - ::AssignProcessToJobObject(m_global_job, ::GetCurrentProcess()); - } - } - - void enter_interactive() { ++m_in_interactive; } - void exit_interactive() { --m_in_interactive; } - - private: - std::atomic m_number_of_external_processes; - std::atomic m_global_job; - std::atomic m_in_interactive; - }; - - static CtrlCStateMachine g_ctrl_c_state; - } - void initialize_global_job_object() { g_ctrl_c_state.initialize_job(); } void enter_interactive_subprocess() { g_ctrl_c_state.enter_interactive(); } void exit_interactive_subprocess() { g_ctrl_c_state.exit_interactive(); } @@ -238,10 +257,173 @@ namespace vcpkg Checks::check_exit(VCPKG_LINE_INFO, ret != nullptr, "Could not determine current executable path."); return resolved_path; #else /* LINUX */ - std::array buf{}; - auto written = readlink("/proc/self/exe", buf.data(), buf.size()); + char buf[1024 * 4] = {}; + auto written = readlink("/proc/self/exe", buf, sizeof(buf)); Checks::check_exit(VCPKG_LINE_INFO, written != -1, "Could not determine current executable path."); - return Path(buf.data(), written); + return Path(buf, written); +#endif + } + + Optional try_parse_process_stat_file(const FileContents& contents) + { + ParserBase p(contents.content, contents.origin); + + p.match_while(ParserBase::is_ascii_digit); // pid %d (ignored) + + p.skip_whitespace(); + p.require_character('('); + // From: https://man7.org/linux/man-pages/man5/procfs.5.html + // + // /proc/[pid]/stat + // + // (2) comm %s + // The filename of the executable, in parentheses. + // Strings longer than TASK_COMM_LEN (16) characters (including the terminating null byte) are silently + // truncated. This is visible whether or not the executable is swapped out. + const auto start = p.it().pointer_to_current(); + const auto end = p.it().end(); + size_t len = 0, last_seen = 0; + for (auto it = p.it(); len < 17 && it != end; ++len, ++it) + { + if (*it == ')') last_seen = len; + } + for (size_t i = 0; i < last_seen; ++i) + { + p.next(); + } + p.require_character(')'); + + p.skip_whitespace(); + p.next(); // state %c (ignored) + + p.skip_whitespace(); + auto ppid_str = p.match_while(ParserBase::is_ascii_digit); + auto maybe_ppid = Strings::strto(ppid_str); + if (auto ppid = maybe_ppid.get()) + { + return ProcessStat{ + *ppid, + std::string(start, last_seen), + }; + } + return nullopt; + } +} // namespace vcpkg + +namespace +{ +#if defined(_WIN32) + struct ToolHelpProcessSnapshot + { + ToolHelpProcessSnapshot() noexcept : snapshot(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) { } + ToolHelpProcessSnapshot(const ToolHelpProcessSnapshot&) = delete; + ToolHelpProcessSnapshot& operator=(const ToolHelpProcessSnapshot&) = delete; + ~ToolHelpProcessSnapshot() + { + if (snapshot != INVALID_HANDLE_VALUE) + { + CloseHandle(snapshot); + } + } + explicit operator bool() const noexcept { return snapshot != INVALID_HANDLE_VALUE; } + + BOOL Process32First(PPROCESSENTRY32W entry) const noexcept { return Process32FirstW(snapshot, entry); } + BOOL Process32Next(PPROCESSENTRY32W entry) const noexcept { return Process32NextW(snapshot, entry); } + + private: + HANDLE snapshot; + }; +#elif defined(__linux__) + Optional try_get_process_stat_by_pid(int pid) + { + auto filepath = fmt::format("/proc/{}/stat", pid); + auto maybe_contents = real_filesystem.try_read_contents(filepath); + if (auto contents = maybe_contents.get()) + { + return try_parse_process_stat_file(*contents); + } + + return nullopt; + } +#endif // ^^^ __linux__ +} // unnamed namespace + +namespace vcpkg +{ + void get_parent_process_list(std::vector& ret) + { + ret.clear(); +#if defined(_WIN32) + // Enumerate all processes in the system snapshot. + std::map pid_ppid_map; + std::map pid_exe_path_map; + std::set seen_pids; + + PROCESSENTRY32W entry{}; + entry.dwSize = sizeof(entry); + { + ToolHelpProcessSnapshot snapshot; + if (!snapshot) + { + return; + } + + if (snapshot.Process32First(&entry)) + { + do + { + pid_ppid_map.emplace(entry.th32ProcessID, entry.th32ParentProcessID); + pid_exe_path_map.emplace(entry.th32ProcessID, Strings::to_utf8(entry.szExeFile)); + } while (snapshot.Process32Next(&entry)); + } + } // destroy snapshot + + // Find hierarchy of current process + + for (DWORD next_parent = GetCurrentProcessId();;) + { + if (Util::Sets::contains(seen_pids, next_parent)) + { + // parent graph loops, for example if a parent terminates and the PID is reused by a child launch + break; + } + + seen_pids.insert(next_parent); + auto it = pid_ppid_map.find(next_parent); + if (it == pid_ppid_map.end()) + { + break; + } + + ret.push_back(pid_exe_path_map[it->first]); + next_parent = it->second; + } +#elif defined(__linux__) + std::set seen_pids; + auto maybe_vcpkg_stat = try_get_process_stat_by_pid(getpid()); + if (auto vcpkg_stat = maybe_vcpkg_stat.get()) + { + for (auto next_parent = vcpkg_stat->ppid; next_parent != 0;) + { + if (Util::Sets::contains(seen_pids, next_parent)) + { + // parent graph loops, for example if a parent terminates and the PID is reused by a child launch + break; + } + + seen_pids.insert(next_parent); + auto maybe_next_parent_stat = try_get_process_stat_by_pid(next_parent); + if (auto next_parent_stat = maybe_next_parent_stat.get()) + { + ret.push_back(next_parent_stat->executable_name); + next_parent = next_parent_stat->ppid; + } + else + { + break; + } + } + } #endif } @@ -385,6 +567,12 @@ namespace vcpkg // Environment variables used by wrapper scripts to allow us to set environment variables in parent shells "Z_VCPKG_POSTSCRIPT", "Z_VCPKG_UNDO", + // Ensures that the escape hatch persists to recursive vcpkg invocations like x-download + "VCPKG_KEEP_ENV_VARS", + // Enables Xbox SDKs + "GameDKLatest", + "GRDKLatest", + "GXDKLatest", }; const Optional keep_vars = get_environment_variable("VCPKG_KEEP_ENV_VARS"); @@ -404,7 +592,7 @@ namespace vcpkg } else { - env_strings.push_back(var); + env_strings.push_back(std::move(var)); } } } @@ -413,7 +601,7 @@ namespace vcpkg for (auto&& env_string : env_strings) { - const Optional value = get_environment_variable(env_string.c_str()); + const Optional value = get_environment_variable(env_string); const auto v = value.get(); if (!v || v->empty()) continue; @@ -487,44 +675,11 @@ namespace vcpkg const Environment& env) { std::vector> res(cmd_lines.size(), LocalizedString{}); - if (cmd_lines.empty()) - { - return res; - } - if (cmd_lines.size() == 1) - { - res[0] = cmd_execute_and_capture_output(cmd_lines[0], wd, env); - return res; - } - - std::atomic work_item{0}; - const auto num_threads = - std::max(static_cast(1), std::min(static_cast(get_concurrency()), cmd_lines.size())); - - auto work = [&]() { - std::size_t item; - while (item = work_item.fetch_add(1), item < cmd_lines.size()) - { - res[item] = cmd_execute_and_capture_output(cmd_lines[item], wd, env); - } - }; + parallel_transform(cmd_lines.begin(), cmd_lines.size(), res.begin(), [&](const Command& cmd_line) { + return cmd_execute_and_capture_output(cmd_line, wd, env); + }); - std::vector> workers; - workers.reserve(num_threads - 1); - for (size_t x = 0; x < num_threads - 1; ++x) - { - workers.emplace_back(std::async(std::launch::async | std::launch::deferred, work)); - if (work_item >= cmd_lines.size()) - { - break; - } - } - work(); - for (auto&& w : workers) - { - w.get(); - } return res; } @@ -532,64 +687,55 @@ namespace vcpkg { return cmd_execute(cmd_line, wd, get_clean_environment()); } +} // namespace vcpkg +namespace +{ #if defined(_WIN32) - struct ProcessInfo + void close_handle_mark_invalid(HANDLE& target) noexcept { - constexpr ProcessInfo() noexcept : proc_info{} { } - ProcessInfo(ProcessInfo&& other) noexcept : proc_info(other.proc_info) + auto to_close = std::exchange(target, INVALID_HANDLE_VALUE); + if (to_close != INVALID_HANDLE_VALUE && to_close) { - other.proc_info.hProcess = nullptr; - other.proc_info.hThread = nullptr; - } - ~ProcessInfo() - { - if (proc_info.hThread) - { - CloseHandle(proc_info.hThread); - } - if (proc_info.hProcess) - { - CloseHandle(proc_info.hProcess); - } - } - - ProcessInfo& operator=(ProcessInfo&& other) noexcept - { - ProcessInfo{std::move(other)}.swap(*this); - return *this; + CloseHandle(to_close); } + } - void swap(ProcessInfo& other) noexcept + struct ProcessInfo : PROCESS_INFORMATION + { + ProcessInfo() noexcept : PROCESS_INFORMATION{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, 0, 0} { } + ProcessInfo(const ProcessInfo&) = delete; + ProcessInfo& operator=(const ProcessInfo&) = delete; + ~ProcessInfo() { - std::swap(proc_info.hProcess, other.proc_info.hProcess); - std::swap(proc_info.hThread, other.proc_info.hThread); + close_handle_mark_invalid(hThread); + close_handle_mark_invalid(hProcess); } - friend void swap(ProcessInfo& lhs, ProcessInfo& rhs) noexcept { lhs.swap(rhs); } - unsigned int wait() { - const DWORD result = WaitForSingleObject(proc_info.hProcess, INFINITE); + close_handle_mark_invalid(hThread); + const DWORD result = WaitForSingleObject(hProcess, INFINITE); Checks::check_exit(VCPKG_LINE_INFO, result != WAIT_FAILED, "WaitForSingleObject failed"); DWORD exit_code = 0; - GetExitCodeProcess(proc_info.hProcess, &exit_code); + GetExitCodeProcess(hProcess, &exit_code); + close_handle_mark_invalid(hProcess); return exit_code; } - - PROCESS_INFORMATION proc_info; }; /// If non-null, an environment block to use for the new process. If null, the /// new process will inherit the current environment. - static ExpectedL windows_create_process(StringView cmd_line, - const WorkingDirectory& wd, - const Environment& env, - DWORD dwCreationFlags, - STARTUPINFOEXW& startup_info) noexcept + ExpectedL windows_create_process(std::int32_t debug_id, + ProcessInfo& process_info, + StringView cmd_line, + const WorkingDirectory& wd, + const Environment& env, + BOOL bInheritHandles, + DWORD dwCreationFlags, + STARTUPINFOEXW& startup_info) noexcept { - ProcessInfo process_info; - Debug::print("CreateProcessW(", cmd_line, ")\n"); + Debug::print(fmt::format("{}: CreateProcessW({})\n", debug_id, cmd_line)); // Flush stdout before launching external process fflush(nullptr); @@ -599,201 +745,507 @@ namespace vcpkg { // this only fails if we can't get the current working directory of vcpkg, and we assume that we have that, // so it's fine anyways - working_directory = - Strings::to_utf16(get_real_filesystem().absolute(wd.working_directory, VCPKG_LINE_INFO)); + working_directory = Strings::to_utf16(real_filesystem.absolute(wd.working_directory, VCPKG_LINE_INFO)); + } + + auto&& env_unpacked = env.get(); + std::wstring environment_block; + LPVOID call_environment = nullptr; + if (!env_unpacked.empty()) + { + environment_block = env_unpacked; + environment_block.push_back('\0'); + call_environment = environment_block.data(); } - auto environment_block = env.get(); - environment_block.push_back('\0'); // Leaking process information handle 'process_info.proc_info.hProcess' // /analyze can't tell that we transferred ownership here VCPKG_MSVC_WARNING(suppress : 6335) - if (CreateProcessW(nullptr, - Strings::to_utf16(cmd_line).data(), - nullptr, - nullptr, - TRUE, - IDLE_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | EXTENDED_STARTUPINFO_PRESENT | - dwCreationFlags, - env.get().empty() ? nullptr : environment_block.data(), - working_directory.empty() ? nullptr : working_directory.data(), - &startup_info.StartupInfo, - &process_info.proc_info)) - { - return process_info; - } - - return format_system_error_message("CreateProcessW", GetLastError()); - } - - static ExpectedL windows_create_windowless_process(StringView cmd_line, - const WorkingDirectory& wd, - const Environment& env, - DWORD dwCreationFlags) noexcept - { - STARTUPINFOEXW startup_info_ex; - memset(&startup_info_ex, 0, sizeof(STARTUPINFOEXW)); - startup_info_ex.StartupInfo.cb = sizeof(STARTUPINFOEXW); - startup_info_ex.StartupInfo.dwFlags = STARTF_USESHOWWINDOW; - startup_info_ex.StartupInfo.wShowWindow = SW_HIDE; + if (!CreateProcessW(nullptr, + Strings::to_utf16(cmd_line).data(), + nullptr, + nullptr, + bInheritHandles, + IDLE_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT | EXTENDED_STARTUPINFO_PRESENT | + dwCreationFlags, + call_environment, + working_directory.empty() ? nullptr : working_directory.data(), + &startup_info.StartupInfo, + &process_info)) + { + return format_system_error_message("CreateProcessW", GetLastError()); + } - return windows_create_process(cmd_line, wd, env, dwCreationFlags, startup_info_ex); + return Unit{}; } - struct ProcessInfoAndPipes + // Used to, among other things, control which handles are inherited by child processes. + // from https://devblogs.microsoft.com/oldnewthing/20111216-00/?p=8873 + struct ProcAttributeList { - ProcessInfo proc_info; - HANDLE child_stdin = 0; - HANDLE child_stdout = 0; - - template - int wait_and_stream_output(Function&& f, Encoding encoding) + ExpectedL create(DWORD dwAttributeCount) { - CloseHandle(child_stdin); - - DWORD bytes_read = 0; - static constexpr DWORD buffer_size = 1024 * 32; - char buf[buffer_size]; - if (encoding == Encoding::Utf8) + Checks::check_exit(VCPKG_LINE_INFO, buffer.empty()); + SIZE_T size = 0; + if (InitializeProcThreadAttributeList(nullptr, dwAttributeCount, 0, &size) || + GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - while (ReadFile(child_stdout, static_cast(buf), buffer_size, &bytes_read, nullptr)) - { - std::replace(buf, buf + bytes_read, '\0', '?'); - f(StringView{buf, static_cast(bytes_read)}); - } + return format_system_error_message("InitializeProcThreadAttributeList nullptr", GetLastError()); } - else if (encoding == Encoding::Utf16) + Checks::check_exit(VCPKG_LINE_INFO, size > 0); + ASSUME(size > 0); + buffer.resize(size); + if (!InitializeProcThreadAttributeList( + reinterpret_cast(buffer.data()), dwAttributeCount, 0, &size)) { - // Note: This doesn't handle unpaired surrogates or partial encoding units correctly in order - // to be able to reuse Strings::to_utf8 which we believe will be fine 99% of the time. - std::string encoded; - while (ReadFile(child_stdout, static_cast(buf), buffer_size, &bytes_read, nullptr)) - { - Strings::to_utf8(encoded, reinterpret_cast(buf), bytes_read); - f(StringView{encoded}); - } + return format_system_error_message("InitializeProcThreadAttributeList attribute_list", GetLastError()); } - else + + return Unit{}; + } + ExpectedL update_attribute(DWORD_PTR Attribute, PVOID lpValue, SIZE_T cbSize) + { + if (!UpdateProcThreadAttribute(get(), 0, Attribute, lpValue, cbSize, nullptr, nullptr)) { - vcpkg::Checks::unreachable(VCPKG_LINE_INFO); + return format_system_error_message("InitializeProcThreadAttributeList attribute_list", GetLastError()); } + return Unit{}; + } + LPPROC_THREAD_ATTRIBUTE_LIST get() noexcept + { + return reinterpret_cast(buffer.data()); + } - Debug::print(fmt::format("ReadFile() finished with GetLastError(): {}\n", GetLastError())); - CloseHandle(child_stdout); - return proc_info.wait(); + ProcAttributeList() = default; + ProcAttributeList(const ProcAttributeList&) = delete; + ProcAttributeList& operator=(const ProcAttributeList&) = delete; + ~ProcAttributeList() + { + if (!buffer.empty()) + { + DeleteProcThreadAttributeList(get()); + } } + + private: + std::vector buffer; }; - static ExpectedL windows_create_process_redirect(StringView cmd_line, - const WorkingDirectory& wd, - const Environment& env, - DWORD dwCreationFlags) noexcept + struct AnonymousPipe { - ProcessInfoAndPipes ret; - - STARTUPINFOEXW startup_info_ex; - memset(&startup_info_ex, 0, sizeof(STARTUPINFOEXW)); - startup_info_ex.StartupInfo.cb = sizeof(STARTUPINFOEXW); - startup_info_ex.StartupInfo.dwFlags |= STARTF_USESTDHANDLES; + HANDLE read_pipe = INVALID_HANDLE_VALUE; + HANDLE write_pipe = INVALID_HANDLE_VALUE; - SECURITY_ATTRIBUTES saAttr; - memset(&saAttr, 0, sizeof(SECURITY_ATTRIBUTES)); - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - // Create a pipe for the child process's STDOUT. - if (!CreatePipe(&ret.child_stdout, &startup_info_ex.StartupInfo.hStdOutput, &saAttr, 0)) + AnonymousPipe() = default; + AnonymousPipe(const AnonymousPipe&) = delete; + AnonymousPipe& operator=(const AnonymousPipe&) = delete; + ~AnonymousPipe() { - return format_system_error_message("CreatePipe stdout", GetLastError()); + close_handle_mark_invalid(read_pipe); + close_handle_mark_invalid(write_pipe); } - // Create a pipe for the child process's STDIN. - if (!CreatePipe(&startup_info_ex.StartupInfo.hStdInput, &ret.child_stdin, &saAttr, 0)) + ExpectedL create() { - return format_system_error_message("CreatePipe stdin", GetLastError()); + Checks::check_exit(VCPKG_LINE_INFO, read_pipe == INVALID_HANDLE_VALUE); + Checks::check_exit(VCPKG_LINE_INFO, write_pipe == INVALID_HANDLE_VALUE); + SECURITY_ATTRIBUTES anonymousSa{sizeof(SECURITY_ATTRIBUTES), nullptr, TRUE}; + if (!CreatePipe(&read_pipe, &write_pipe, &anonymousSa, 0)) + { + return format_system_error_message("CreatePipe", GetLastError()); + } + + return Unit{}; } + }; - startup_info_ex.StartupInfo.hStdError = startup_info_ex.StartupInfo.hStdOutput; + struct CreatorOnlySecurityDescriptor + { + PSECURITY_DESCRIPTOR sd; - // Ensure that only the write handle to STDOUT and the read handle to STDIN are inherited. - // from https://devblogs.microsoft.com/oldnewthing/20111216-00/?p=8873 - struct ProcAttributeList + CreatorOnlySecurityDescriptor() : sd{} { - static ExpectedL create(DWORD dwAttributeCount) - { - SIZE_T size = 0; - if (InitializeProcThreadAttributeList(nullptr, dwAttributeCount, 0, &size) || - GetLastError() != ERROR_INSUFFICIENT_BUFFER) + // DACL: + // ACE 0: Allow; FILE_READ;;;OWNER_RIGHTS + Checks::check_exit( + VCPKG_LINE_INFO, + ConvertStringSecurityDescriptorToSecurityDescriptorW(L"D:(A;;FR;;;OW)", SDDL_REVISION_1, &sd, 0)); + } + + ~CreatorOnlySecurityDescriptor() { LocalFree(sd); } + + CreatorOnlySecurityDescriptor(const CreatorOnlySecurityDescriptor&) = delete; + CreatorOnlySecurityDescriptor& operator=(const CreatorOnlySecurityDescriptor&) = delete; + }; + + // An output pipe to use as stdin for a child process + struct OverlappedOutputPipe + { + HANDLE read_pipe = INVALID_HANDLE_VALUE; + HANDLE write_pipe = INVALID_HANDLE_VALUE; + + OverlappedOutputPipe() = default; + OverlappedOutputPipe(const OverlappedOutputPipe&) = delete; + OverlappedOutputPipe& operator=(const OverlappedOutputPipe&) = delete; + ~OverlappedOutputPipe() + { + close_handle_mark_invalid(read_pipe); + close_handle_mark_invalid(write_pipe); + } + + ExpectedL create(std::int32_t debug_id) + { + Checks::check_exit(VCPKG_LINE_INFO, read_pipe == INVALID_HANDLE_VALUE); + Checks::check_exit(VCPKG_LINE_INFO, write_pipe == INVALID_HANDLE_VALUE); + + static CreatorOnlySecurityDescriptor creator_owner_sd; + SECURITY_ATTRIBUTES namedPipeSa{sizeof(SECURITY_ATTRIBUTES), creator_owner_sd.sd, FALSE}; + std::wstring pipe_name{Strings::to_utf16( + fmt::format(R"(\\.\pipe\local\vcpkg-to-stdin-A8B4F218-4DB1-4A3E-8E5B-C41F1633F627-{}-{})", + GetCurrentProcessId(), + debug_id))}; + write_pipe = CreateNamedPipeW(pipe_name.c_str(), + PIPE_ACCESS_OUTBOUND | FILE_FLAG_FIRST_PIPE_INSTANCE | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_REJECT_REMOTE_CLIENTS, + 1, // nMaxInstances + 65535, // nOutBufferSize + 0, // nInBufferSize (unused / PIPE_ACCESS_OUTBOUND) + 0, // nDefaultTimeout (only for WaitPipe; unused) + &namedPipeSa); + if (write_pipe == INVALID_HANDLE_VALUE) + { + return format_system_error_message("CreateNamedPipeW stdin", GetLastError()); + } + + SECURITY_ATTRIBUTES openSa{sizeof(SECURITY_ATTRIBUTES), nullptr, TRUE}; + read_pipe = CreateFileW(pipe_name.c_str(), FILE_GENERIC_READ, 0, &openSa, OPEN_EXISTING, 0, 0); + if (read_pipe == INVALID_HANDLE_VALUE) + { + return format_system_error_message("CreateFileW stdin", GetLastError()); + } + + return Unit{}; + } + }; + + // Ensure that all asynchronous procedure calls pending for this thread are called + void drain_apcs() + { + switch (SleepEx(0, TRUE)) + { + case 0: + // timeout expired, OK + break; + case WAIT_IO_COMPLETION: + // completion queue drained completed, OK + break; + default: vcpkg::Checks::unreachable(VCPKG_LINE_INFO); break; + } + } + + struct OverlappedStatus : OVERLAPPED + { + DWORD expected_write; + HANDLE* target; + int32_t debug_id; + }; + + struct RedirectedProcessInfo + { + AnonymousPipe stdout_pipe; + OverlappedOutputPipe stdin_pipe; + ProcessInfo proc_info; + + RedirectedProcessInfo() = default; + RedirectedProcessInfo(const RedirectedProcessInfo&) = delete; + RedirectedProcessInfo& operator=(const RedirectedProcessInfo&) = delete; + ~RedirectedProcessInfo() = default; + + int wait_and_stream_output(int32_t debug_id, + const char* input, + DWORD input_size, + const std::function& raw_cb) + { + static const auto stdin_completion_routine = + [](DWORD dwErrorCode, DWORD dwNumberOfBytesTransferred, LPOVERLAPPED pOverlapped) { + const auto status = static_cast(pOverlapped); + switch (dwErrorCode) + { + case 0: + // OK, done + Checks::check_exit(VCPKG_LINE_INFO, dwNumberOfBytesTransferred == status->expected_write); + break; + case ERROR_BROKEN_PIPE: + case ERROR_OPERATION_ABORTED: + // OK, child didn't want all the data + break; + default: + Debug::print(fmt::format("{}: Unexpected error writing to stdin of a child process: {:X}\n", + status->debug_id, + dwErrorCode)); + break; + } + + close_handle_mark_invalid(*status->target); + }; + + OverlappedStatus stdin_write{}; + stdin_write.expected_write = input_size; + stdin_write.target = &stdin_pipe.write_pipe; + stdin_write.debug_id = debug_id; + if (input_size == 0) + { + close_handle_mark_invalid(stdin_pipe.write_pipe); + } + else + { + stdin_write.expected_write = input_size; + if (WriteFileEx(stdin_pipe.write_pipe, input, input_size, &stdin_write, stdin_completion_routine)) { - return format_system_error_message("InitializeProcThreadAttributeList nullptr", GetLastError()); + DWORD last_error = GetLastError(); + if (last_error) + { + Debug::print( + fmt::format("{}: Unexpected WriteFileEx partial success: {:X}\n", debug_id, last_error)); + } } - Checks::check_exit(VCPKG_LINE_INFO, size > 0); - ASSUME(size > 0); - std::vector buffer(size, 0); - if (!InitializeProcThreadAttributeList( - reinterpret_cast(buffer.data()), dwAttributeCount, 0, &size)) + else { - return format_system_error_message("InitializeProcThreadAttributeList attribute_list", - GetLastError()); + Debug::print(fmt::format("{}: stdin WriteFileEx failure: {:x}\n", debug_id, GetLastError())); + close_handle_mark_invalid(stdin_pipe.write_pipe); } - return ProcAttributeList(std::move(buffer)); } - ExpectedL update_attribute(DWORD_PTR Attribute, PVOID lpValue, SIZE_T cbSize) + + DWORD bytes_read = 0; + static constexpr DWORD buffer_size = 1024 * 32; + char buf[buffer_size]; + while (stdout_pipe.read_pipe != INVALID_HANDLE_VALUE) { - if (!UpdateProcThreadAttribute(get(), 0, Attribute, lpValue, cbSize, nullptr, nullptr)) + switch (WaitForSingleObjectEx(stdout_pipe.read_pipe, INFINITE, TRUE)) { - return format_system_error_message("InitializeProcThreadAttributeList attribute_list", - GetLastError()); + case WAIT_OBJECT_0: + if (ReadFile(stdout_pipe.read_pipe, static_cast(buf), buffer_size, &bytes_read, nullptr)) + { + raw_cb(buf, bytes_read); + } + else + { + DWORD last_error = GetLastError(); + if (last_error != ERROR_BROKEN_PIPE) + { + Debug::print(fmt::format("{}: Writing to stdout failed: {:x}\n", debug_id, last_error)); + } + + close_handle_mark_invalid(stdout_pipe.read_pipe); + } + + break; + case WAIT_IO_COMPLETION: + // stdin might have completed, that's OK + break; + case WAIT_FAILED: + vcpkg::Checks::unreachable( + VCPKG_LINE_INFO, + fmt::format("{}: Waiting for stdout failed: {:x}", debug_id, GetLastError())); + break; + default: vcpkg::Checks::unreachable(VCPKG_LINE_INFO); break; } - return Unit{}; } - ~ProcAttributeList() { DeleteProcThreadAttributeList(get()); } - LPPROC_THREAD_ATTRIBUTE_LIST get() noexcept + + auto child_exit_code = proc_info.wait(); + drain_apcs(); + if (stdin_pipe.write_pipe != INVALID_HANDLE_VALUE) { - return reinterpret_cast(buffer.data()); + // this block probably never runs + Debug::print(fmt::format("{}: stdin write outlived the child process?\n", debug_id)); + if (CancelIo(stdin_pipe.write_pipe)) + { + drain_apcs(); + } + else + { + Debug::print(fmt::format("{}: Cancelling stdin write failed: {:x}\n", debug_id, GetLastError())); + } } - ProcAttributeList(const ProcAttributeList&) = delete; - ProcAttributeList& operator=(const ProcAttributeList&) = delete; - ProcAttributeList(ProcAttributeList&&) = default; - ProcAttributeList& operator=(ProcAttributeList&&) = default; + return child_exit_code; + } + }; - private: - explicit ProcAttributeList(std::vector&& buffer) : buffer(std::move(buffer)) { } - std::vector buffer; - }; + ExpectedL windows_create_process_redirect(std::int32_t debug_id, + RedirectedProcessInfo& ret, + StringView cmd_line, + const WorkingDirectory& wd, + const Environment& env, + DWORD dwCreationFlags) noexcept + { + STARTUPINFOEXW startup_info_ex{}; + startup_info_ex.StartupInfo.cb = sizeof(STARTUPINFOEXW); + startup_info_ex.StartupInfo.dwFlags |= STARTF_USESTDHANDLES; - ExpectedL proc_attribute_list = ProcAttributeList::create(1); - if (!proc_attribute_list.has_value()) + // Create a pipe for the child process's STDIN. + auto stdin_create = ret.stdin_pipe.create(debug_id); + if (!stdin_create) { - return proc_attribute_list.error(); + return std::move(stdin_create).error(); } - std::vector handles_to_inherit = { - {startup_info_ex.StartupInfo.hStdOutput, startup_info_ex.StartupInfo.hStdInput}}; - auto maybe_error = proc_attribute_list.get()->update_attribute( - PROC_THREAD_ATTRIBUTE_HANDLE_LIST, handles_to_inherit.data(), handles_to_inherit.size() * sizeof(HANDLE)); + + startup_info_ex.StartupInfo.hStdInput = ret.stdin_pipe.read_pipe; + + // Create a pipe for the child process's STDOUT/STDERR. + auto stdout_create = ret.stdout_pipe.create(); + if (!stdout_create) + { + return std::move(stdout_create).error(); + } + + startup_info_ex.StartupInfo.hStdOutput = ret.stdout_pipe.write_pipe; + startup_info_ex.StartupInfo.hStdError = ret.stdout_pipe.write_pipe; + + ProcAttributeList proc_attribute_list; + auto proc_attribute_list_create = proc_attribute_list.create(1); + if (!proc_attribute_list_create) + { + return std::move(proc_attribute_list_create).error(); + } + + HANDLE handles_to_inherit[2] = {startup_info_ex.StartupInfo.hStdOutput, startup_info_ex.StartupInfo.hStdInput}; + auto maybe_error = proc_attribute_list.update_attribute( + PROC_THREAD_ATTRIBUTE_HANDLE_LIST, handles_to_inherit, 2 * sizeof(HANDLE)); if (!maybe_error.has_value()) { return maybe_error.error(); } - startup_info_ex.lpAttributeList = proc_attribute_list.get()->get(); + startup_info_ex.lpAttributeList = proc_attribute_list.get(); - auto maybe_proc_info = windows_create_process(cmd_line, wd, env, dwCreationFlags, startup_info_ex); + auto process_create = + windows_create_process(debug_id, ret.proc_info, cmd_line, wd, env, TRUE, dwCreationFlags, startup_info_ex); - CloseHandle(startup_info_ex.StartupInfo.hStdInput); - CloseHandle(startup_info_ex.StartupInfo.hStdOutput); - - if (auto proc_info = maybe_proc_info.get()) + if (!process_create) { - ret.proc_info = std::move(*proc_info); - return ret; + return std::move(process_create).error(); } - return maybe_proc_info.error(); + close_handle_mark_invalid(ret.stdin_pipe.read_pipe); + close_handle_mark_invalid(ret.stdout_pipe.write_pipe); + return Unit{}; } -#endif +#else // ^^^ _WIN32 // !_WIN32 vvv + struct AnonymousPipe + { + // pipefd[0] is the read end of the pipe, pipefd[1] is the write end + int pipefd[2]; + + AnonymousPipe() : pipefd{-1, -1} { } + AnonymousPipe(const AnonymousPipe&) = delete; + AnonymousPipe& operator=(const AnonymousPipe&) = delete; + ~AnonymousPipe() + { + for (size_t idx = 0; idx < 2; ++idx) + { + close_mark_invalid(pipefd[idx]); + } + } + + ExpectedL create() + { +#if defined(__APPLE__) + static std::mutex pipe_creation_lock; + std::lock_guard lck{pipe_creation_lock}; + if (pipe(pipefd)) + { + return format_system_error_message("pipe", errno); + } + for (size_t idx = 0; idx < 2; ++idx) + { + if (fcntl(pipefd[idx], F_SETFD, FD_CLOEXEC)) + { + return format_system_error_message("fcntl", errno); + } + } +#else // ^^^ Apple // !Apple vvv + if (pipe2(pipefd, O_CLOEXEC)) + { + return format_system_error_message("pipe2", errno); + } +#endif // ^^^ !Apple + + return Unit{}; + } + }; + + struct PosixSpawnFileActions + { + posix_spawn_file_actions_t actions; + + PosixSpawnFileActions() { Checks::check_exit(VCPKG_LINE_INFO, posix_spawn_file_actions_init(&actions) == 0); } + + ~PosixSpawnFileActions() + { + Checks::check_exit(VCPKG_LINE_INFO, posix_spawn_file_actions_destroy(&actions) == 0); + } + + PosixSpawnFileActions(const PosixSpawnFileActions&) = delete; + PosixSpawnFileActions& operator=(const PosixSpawnFileActions&) = delete; + + ExpectedL adddup2(int fd, int newfd) + { + const int error = posix_spawn_file_actions_adddup2(&actions, fd, newfd); + if (error) + { + return format_system_error_message("posix_spawn_file_actions_adddup2", error); + } + + return Unit{}; + } + }; + + struct PosixPid + { + pid_t pid; + + PosixPid() : pid{-1} { } + + ExpectedL wait_for_termination() + { + int exit_code = -1; + if (pid != -1) + { + int status; + const auto child = waitpid(pid, &status, 0); + if (child != pid) + { + return format_system_error_message("waitpid", errno); + } + + if (WIFEXITED(status)) + { + exit_code = WEXITSTATUS(status); + } + else if (WIFSIGNALED(status)) + { + exit_code = WTERMSIG(status); + } + else if (WIFSTOPPED(status)) + { + exit_code = WSTOPSIG(status); + } + + pid = -1; + } + + return exit_code; + } + + PosixPid(const PosixPid&) = delete; + PosixPid& operator=(const PosixPid&) = delete; + }; +#endif // ^^^ !_WIN32 +} // unnamed namespace + +namespace vcpkg +{ #if defined(_WIN32) Environment cmd_execute_and_capture_environment(const Command& cmd_line, const Environment& env) { @@ -806,18 +1258,18 @@ namespace vcpkg auto maybe_rc_output = cmd_execute_and_capture_output(actual_cmd_line, default_working_directory, env); if (!maybe_rc_output) { - Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgVcvarsRunFailed); + Checks::msg_exit_with_error( + VCPKG_LINE_INFO, msg::format(msgVcvarsRunFailed).append_raw("\n").append(maybe_rc_output.error())); } auto& rc_output = maybe_rc_output.value_or_exit(VCPKG_LINE_INFO); + Debug::print(rc_output.output, "\n"); if (rc_output.exit_code != 0) { Checks::msg_exit_with_error( VCPKG_LINE_INFO, msgVcvarsRunFailedExitCode, msg::exit_code = rc_output.exit_code); } - Debug::print(rc_output.output, "\n"); - auto it = Strings::search(rc_output.output, magic_string); const char* const last = rc_output.output.data() + rc_output.output.size(); @@ -846,19 +1298,40 @@ namespace vcpkg return new_env; } #endif +} // namespace vcpkg +namespace +{ + void debug_print_cmd_execute_background_failure(int32_t debug_id, const LocalizedString& error) + { + Debug::print(fmt::format("{}: cmd_execute_background() failed: {}\n", debug_id, error)); + } +} + +namespace vcpkg +{ void cmd_execute_background(const Command& cmd_line) { - Debug::println("cmd_execute_background: ", cmd_line.command_line()); + const auto debug_id = debug_id_counter.fetch_add(1, std::memory_order_relaxed); + Debug::print(fmt::format("{}: cmd_execute_background: {}\n", debug_id, cmd_line.command_line())); #if defined(_WIN32) - auto process_info = - windows_create_windowless_process(cmd_line.command_line(), - default_working_directory, - default_environment, - CREATE_NEW_CONSOLE | CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB); - if (!process_info) + ProcessInfo process_info; + STARTUPINFOEXW startup_info_ex; + memset(&startup_info_ex, 0, sizeof(STARTUPINFOEXW)); + startup_info_ex.StartupInfo.cb = sizeof(STARTUPINFOEXW); + startup_info_ex.StartupInfo.dwFlags = STARTF_USESHOWWINDOW; + startup_info_ex.StartupInfo.wShowWindow = SW_HIDE; + auto process_create = windows_create_process(debug_id, + process_info, + cmd_line.command_line(), + default_working_directory, + default_environment, + FALSE, + CREATE_NEW_CONSOLE | CREATE_NO_WINDOW | CREATE_BREAKAWAY_FROM_JOB, + startup_info_ex); + if (!process_create) { - Debug::println("cmd_execute_background() failed: ", process_info.error()); + debug_print_cmd_execute_background_failure(debug_id, process_create.error()); } #else // ^^^ _WIN32 // !_WIN32 pid_t pid; @@ -882,24 +1355,53 @@ namespace vcpkg int error = posix_spawn(&pid, "/bin/sh", nullptr /*file_actions*/, nullptr /*attrp*/, argv.data(), environ); if (error) { - Debug::println(fmt::format("cmd_execute_background() failed: {}", error)); + debug_print_cmd_execute_background_failure(debug_id, format_system_error_message("posix_spawn", errno)); + return; } #endif // ^^^ !_WIN32 } - static ExpectedL cmd_execute_impl(const Command& cmd_line, const WorkingDirectory& wd, const Environment& env) + static ExpectedL cmd_execute_impl(const int32_t debug_id, + const Command& cmd_line, + const WorkingDirectory& wd, + const Environment& env) { #if defined(_WIN32) - using vcpkg::g_ctrl_c_state; - g_ctrl_c_state.transition_to_spawn_process(); - auto result = - windows_create_windowless_process(cmd_line.command_line(), wd, env, 0).map([](ProcessInfo&& proc_info) { - auto long_exit_code = proc_info.wait(); - if (long_exit_code > INT_MAX) long_exit_code = INT_MAX; - return static_cast(long_exit_code); - }); - g_ctrl_c_state.transition_from_spawn_process(); - return result; + STARTUPINFOEXW startup_info_ex; + memset(&startup_info_ex, 0, sizeof(STARTUPINFOEXW)); + startup_info_ex.StartupInfo.cb = sizeof(STARTUPINFOEXW); + startup_info_ex.StartupInfo.dwFlags = STARTF_USESHOWWINDOW; + startup_info_ex.StartupInfo.wShowWindow = SW_HIDE; + + ProcAttributeList proc_attribute_list; + auto proc_attribute_list_create = proc_attribute_list.create(1); + if (!proc_attribute_list_create) + { + return std::move(proc_attribute_list_create).error(); + } + + HANDLE handles_to_inherit[] = { + GetStdHandle(STD_INPUT_HANDLE), GetStdHandle(STD_OUTPUT_HANDLE), GetStdHandle(STD_ERROR_HANDLE)}; + auto maybe_error = proc_attribute_list.update_attribute( + PROC_THREAD_ATTRIBUTE_HANDLE_LIST, handles_to_inherit, 3 * sizeof(HANDLE)); + if (!maybe_error.has_value()) + { + return maybe_error.error(); + } + startup_info_ex.lpAttributeList = proc_attribute_list.get(); + + SpawnProcessGuard spawn_process_guard; + ProcessInfo process_info; + auto process_create = + windows_create_process(debug_id, process_info, cmd_line.command_line(), wd, env, TRUE, 0, startup_info_ex); + if (!process_create) + { + return std::move(process_create).error(); + } + + auto long_exit_code = process_info.wait(); + if (long_exit_code > INT_MAX) long_exit_code = INT_MAX; + return static_cast(long_exit_code); #else (void)env; Command real_command_line_builder; @@ -918,7 +1420,7 @@ namespace vcpkg real_command_line_builder.raw_arg(cmd_line.command_line()); std::string real_command_line = std::move(real_command_line_builder).extract(); - Debug::print("system(", real_command_line, ")\n"); + Debug::print(fmt::format("{}: system({})\n", debug_id, real_command_line)); fflush(nullptr); return system(real_command_line.c_str()); @@ -928,153 +1430,346 @@ namespace vcpkg ExpectedL cmd_execute(const Command& cmd_line, const WorkingDirectory& wd, const Environment& env) { const ElapsedTimer timer; - auto maybe_result = cmd_execute_impl(cmd_line, wd, env); + const auto debug_id = debug_id_counter.fetch_add(1, std::memory_order_relaxed); + auto maybe_result = cmd_execute_impl(debug_id, cmd_line, wd, env); const auto elapsed = timer.us_64(); g_subprocess_stats += elapsed; if (auto result = maybe_result.get()) { - Debug::print(fmt::format("cmd_execute() returned {} after {} us\n", *result, elapsed)); + Debug::print(fmt::format("{}: cmd_execute() returned {} after {} us\n", debug_id, *result, elapsed)); } else { - Debug::print(fmt::format("cmd_execute() returned ({}) after {} us\n", maybe_result.error(), elapsed)); + Debug::print( + fmt::format("{}: cmd_execute() returned ({}) after {} us\n", debug_id, maybe_result.error(), elapsed)); } return maybe_result; } ExpectedL cmd_execute_and_stream_lines(const Command& cmd_line, - std::function per_line_cb, + const std::function& per_line_cb, const WorkingDirectory& wd, const Environment& env, - Encoding encoding) + Encoding encoding, + StringView stdin_content) { Strings::LinesStream lines; - auto rc = cmd_execute_and_stream_data( - cmd_line, [&](const StringView sv) { lines.on_data(sv, per_line_cb); }, wd, env, encoding); + cmd_line, [&](const StringView sv) { lines.on_data(sv, per_line_cb); }, wd, env, encoding, stdin_content); lines.on_end(per_line_cb); return rc; } - ExpectedL cmd_execute_and_stream_data(const Command& cmd_line, - std::function data_cb, - const WorkingDirectory& wd, - const Environment& env, - Encoding encoding) +} // namespace vcpkg + +namespace +{ +#if !defined(_WIN32) + struct ChildStdinTracker { - const ElapsedTimer timer; - static std::atomic_int32_t id_counter{1000}; - const auto id = fmt::format("{:4}", id_counter.fetch_add(1, std::memory_order_relaxed)); -#if defined(_WIN32) - using vcpkg::g_ctrl_c_state; + StringView input; + std::size_t offset; - g_ctrl_c_state.transition_to_spawn_process(); - ExpectedL exit_code = - windows_create_process_redirect(cmd_line.command_line(), wd, env, 0).map([&](ProcessInfoAndPipes&& output) { - return output.wait_and_stream_output(data_cb, encoding); - }); - g_ctrl_c_state.transition_from_spawn_process(); -#else // ^^^ _WIN32 // !_WIN32 vvv - Checks::check_exit(VCPKG_LINE_INFO, encoding == Encoding::Utf8); + // Write a hunk of data to `target`. If there is no more input to write, returns `true`. + ExpectedL do_write(int target) + { + const auto this_write = input.size() - offset; + // Big enough to be big, small enough to avoid implementation limits + static constexpr std::size_t max_write = 1 << 28; + if (this_write != 0) + { + const auto this_write_clamped = this_write > max_write ? max_write : this_write; + const auto actually_written = + write(target, static_cast(input.data() + offset), this_write_clamped); + if (actually_written < 0) + { + return format_system_error_message("write", errno); + } - std::string actual_cmd_line; - if (wd.working_directory.empty()) + offset += actually_written; + } + + return offset == input.size(); + } + }; +#endif // ^^^ !_WIN32 + + ExpectedL cmd_execute_and_stream_data_impl(const Command& cmd_line, + uint32_t debug_id, + const std::function& data_cb, + const WorkingDirectory& wd, + const Environment& env, + Encoding encoding, + StringView stdin_content) + { +#if defined(_WIN32) + std::wstring as_utf16; + if (encoding == Encoding::Utf16) { - actual_cmd_line = fmt::format(R"({} {} 2>&1)", env.get(), cmd_line.command_line()); + as_utf16 = Strings::to_utf16(stdin_content); + stdin_content = + StringView{reinterpret_cast(as_utf16.data()), as_utf16.size() * sizeof(wchar_t)}; } - else + + auto stdin_content_size_raw = stdin_content.size(); + if (stdin_content_size_raw > MAXDWORD) { - actual_cmd_line = Command("cd") - .string_arg(wd.working_directory) - .raw_arg("&&") - .raw_arg(env.get()) - .raw_arg(cmd_line.command_line()) - .raw_arg("2>&1") - .extract(); + return format_system_error_message("WriteFileEx", ERROR_INSUFFICIENT_BUFFER); } - Debug::print(id, ": popen(", actual_cmd_line, ")\n"); - // Flush stdout before launching external process - fflush(stdout); + auto stdin_content_size = static_cast(stdin_content_size_raw); - FILE* pipe = nullptr; -#if defined(__APPLE__) - static std::mutex mtx; -#endif + SpawnProcessGuard spawn_process_guard; + RedirectedProcessInfo process_info; + auto process_create = + windows_create_process_redirect(debug_id, process_info, cmd_line.command_line(), wd, env, 0); + if (!process_create) + { + return std::move(process_create).error(); + } - // Scope for lock guard + std::function raw_cb; + switch (encoding) { -#if defined(__APPLE__) - // `popen` sometimes returns 127 on OSX when executed in parallel. - // Related: https://github.com/microsoft/vcpkg-tool/pull/695#discussion_r973364608 + case Encoding::Utf8: + raw_cb = [&](char* buf, size_t bytes_read) { + std::replace(buf, buf + bytes_read, '\0', '?'); + data_cb(StringView{buf, bytes_read}); + }; + break; + case Encoding::Utf16: + raw_cb = [&](char* buf, size_t bytes_read) { + // Note: This doesn't handle unpaired surrogates or partial encoding units correctly in + // order to be able to reuse Strings::to_utf8 which we believe will be fine 99% of the time. + std::string encoded; + Strings::to_utf8(encoded, reinterpret_cast(buf), bytes_read / 2); + std::replace(encoded.begin(), encoded.end(), '\0', '?'); + data_cb(StringView{encoded}); + }; + break; + default: vcpkg::Checks::unreachable(VCPKG_LINE_INFO); + } - std::lock_guard guard(mtx); -#endif + return process_info.wait_and_stream_output(debug_id, stdin_content.data(), stdin_content_size, raw_cb); +#else // ^^^ _WIN32 // !_WIN32 vvv - pipe = popen(actual_cmd_line.c_str(), "r"); + Checks::check_exit(VCPKG_LINE_INFO, encoding == Encoding::Utf8); + std::string actual_cmd_line; + if (!wd.working_directory.empty()) + { + actual_cmd_line.append("cd "); + append_shell_escaped(actual_cmd_line, wd.working_directory); + actual_cmd_line.append(" && "); } - if (pipe == nullptr) + const auto& env_text = env.get(); + if (!env_text.empty()) { - return format_system_error_message("popen", errno); + actual_cmd_line.append(env_text); + actual_cmd_line.push_back(' '); } - char buf[1024]; - // Use fgets because fread will block until the entire buffer is filled. - while (fgets(buf, 1024, pipe)) + const auto unwrapped_to_execute = cmd_line.command_line(); + actual_cmd_line.append(unwrapped_to_execute.data(), unwrapped_to_execute.size()); + + Debug::print(fmt::format("{}: execute_process({})\n", debug_id, actual_cmd_line)); + // Flush stdout before launching external process + fflush(stdout); + + AnonymousPipe child_input; { - data_cb(StringView{buf, strlen(buf)}); + auto err = child_input.create(); + if (!err) + { + return std::move(err).error(); + } } - if (!feof(pipe)) + AnonymousPipe child_output; { - return format_system_error_message("feof", errno); + auto err = child_output.create(); + if (!err) + { + return std::move(err).error(); + } } - int ec; - // Scope for lock guard + PosixSpawnFileActions actions; + actions.adddup2(child_input.pipefd[0], 0); + actions.adddup2(child_output.pipefd[1], 1); + actions.adddup2(child_output.pipefd[1], 2); + + std::vector argv_builder; + argv_builder.reserve(3); + argv_builder.emplace_back("sh"); // as if by system() + argv_builder.emplace_back("-c"); + argv_builder.emplace_back(actual_cmd_line.data(), actual_cmd_line.size()); + + std::vector argv; + argv.reserve(argv_builder.size() + 1); + for (std::string& arg : argv_builder) { -#if defined(__APPLE__) - // See the comment above at the call to `popen`. - std::lock_guard guard(mtx); -#endif - ec = pclose(pipe); + argv.emplace_back(arg.data()); } - if (WIFEXITED(ec)) + + argv.emplace_back(nullptr); + + PosixPid pid; + int error = posix_spawn(&pid.pid, "/bin/sh", &actions.actions, nullptr, argv.data(), environ); + if (error) { - ec = WEXITSTATUS(ec); + return format_system_error_message("posix_spawn", error); } - else if (WIFSIGNALED(ec)) + + close_mark_invalid(child_input.pipefd[0]); + close_mark_invalid(child_output.pipefd[1]); + + char buf[1024]; + ChildStdinTracker stdin_tracker{stdin_content, 0}; + if (stdin_content.empty()) { - ec = WTERMSIG(ec); + close_mark_invalid(child_input.pipefd[1]); } - else if (WIFSTOPPED(ec)) + else { - ec = WSTOPSIG(ec); + if (fcntl(child_input.pipefd[1], F_SETFL, O_NONBLOCK)) + { + return format_system_error_message("fcntl", errno); + } + + auto maybe_done = stdin_tracker.do_write(child_input.pipefd[1]); + bool done = false; + if (const auto done_first = maybe_done.get()) + { + if (*done_first) + { + close_mark_invalid(child_input.pipefd[1]); + done = true; + } + } + else + { + return std::move(maybe_done).error(); + } + + if (!done) + { + for (;;) + { + pollfd polls[2]{}; + polls[0].fd = child_input.pipefd[1]; + polls[0].events = POLLOUT; + polls[1].fd = child_output.pipefd[0]; + polls[1].events = POLLIN; + if (poll(polls, 2, -1) < 0) + { + return format_system_error_message("poll", errno); + } + + if (polls[0].revents & POLLERR) + { + close_mark_invalid(child_input.pipefd[1]); + break; + } + else if (polls[0].revents & POLLOUT) + { + auto maybe_next_done = stdin_tracker.do_write(child_input.pipefd[1]); + if (const auto next_done = maybe_next_done.get()) + { + if (*next_done) + { + close_mark_invalid(child_input.pipefd[1]); + break; + } + } + else + { + return std::move(maybe_next_done).error(); + } + } + + if (polls[1].revents & POLLIN) + { + auto read_amount = read(child_output.pipefd[0], buf, sizeof(buf)); + if (read_amount < 0) + { + return format_system_error_message("read", errno); + } + + // can't be 0 because poll told us otherwise + if (read_amount == 0) + { + Checks::unreachable(VCPKG_LINE_INFO); + } + + data_cb(StringView{buf, static_cast(read_amount)}); + } + } + } + } + + for (;;) + { + auto read_amount = read(child_output.pipefd[0], buf, sizeof(buf)); + if (read_amount < 0) + { + auto error = errno; + if (error == EPIPE) + { + close_mark_invalid(child_output.pipefd[0]); + break; + } + + return format_system_error_message("read", error); + } + + if (read_amount == 0) + { + close_mark_invalid(child_output.pipefd[0]); + break; + } + + data_cb(StringView{buf, static_cast(read_amount)}); } - ExpectedL exit_code = ec; + return pid.wait_for_termination(); #endif /// ^^^ !_WIN32 + } +} // unnamed namespace +namespace vcpkg +{ + ExpectedL cmd_execute_and_stream_data(const Command& cmd_line, + const std::function& data_cb, + const WorkingDirectory& wd, + const Environment& env, + Encoding encoding, + StringView stdin_content) + { + const ElapsedTimer timer; + const auto debug_id = debug_id_counter.fetch_add(1, std::memory_order_relaxed); + auto maybe_exit_code = + cmd_execute_and_stream_data_impl(cmd_line, debug_id, data_cb, wd, env, encoding, stdin_content); const auto elapsed = timer.us_64(); g_subprocess_stats += elapsed; - if (const auto pec = exit_code.get()) + if (const auto exit_code = maybe_exit_code.get()) { Debug::print(fmt::format("{}: cmd_execute_and_stream_data() returned {} after {:8} us\n", - id, - *pec, + debug_id, + *exit_code, static_cast(elapsed))); } - return exit_code; + return maybe_exit_code; } ExpectedL cmd_execute_and_capture_output(const Command& cmd_line, const WorkingDirectory& wd, const Environment& env, Encoding encoding, - EchoInDebug echo_in_debug) + EchoInDebug echo_in_debug, + StringView stdin_content) { std::string output; return cmd_execute_and_stream_data( @@ -1088,7 +1783,8 @@ namespace vcpkg }, wd, env, - encoding) + encoding, + stdin_content) .map([&](int exit_code) { return ExitCodeAndOutput{exit_code, std::move(output)}; }); @@ -1166,4 +1862,4 @@ namespace vcpkg expected_right_tag}; } -} +} // namespace vcpkg diff --git a/src/vcpkg/base/unicode.cpp b/src/vcpkg/base/unicode.cpp index f16280b570..5613be895b 100644 --- a/src/vcpkg/base/unicode.cpp +++ b/src/vcpkg/base/unicode.cpp @@ -186,31 +186,19 @@ namespace vcpkg::Unicode return res; } - struct Utf8Category : std::error_category + static LocalizedString message(utf8_errc condition) { - const char* name() const noexcept override { return "utf8"; } - - std::string message(int condition) const override + switch (condition) { - switch (static_cast(condition)) - { - case utf8_errc::NoError: return msg::format(msgNoError).extract_data(); - case utf8_errc::InvalidCodeUnit: return msg::format(msgInvalidCodeUnit).extract_data(); - case utf8_errc::InvalidCodePoint: - return msg::format(msgInvalidCodePoint).append_raw(" (>0x10FFFF)").extract_data(); - case utf8_errc::PairedSurrogates: return msg::format(msgPairedSurrogatesAreInvalid).extract_data(); - case utf8_errc::UnexpectedContinue: return msg::format(msgContinueCodeUnitInStart).extract_data(); - case utf8_errc::UnexpectedStart: return msg::format(msgStartCodeUnitInContinue).extract_data(); - case utf8_errc::UnexpectedEof: return msg::format(msgEndOfStringInCodeUnit).extract_data(); - default: Checks::unreachable(VCPKG_LINE_INFO); - } + case utf8_errc::NoError: return msg::format(msgNoError); + case utf8_errc::InvalidCodeUnit: return msg::format(msgInvalidCodeUnit); + case utf8_errc::InvalidCodePoint: return msg::format(msgInvalidCodePoint).append_raw(" (>0x10FFFF)"); + case utf8_errc::PairedSurrogates: return msg::format(msgPairedSurrogatesAreInvalid); + case utf8_errc::UnexpectedContinue: return msg::format(msgContinueCodeUnitInStart); + case utf8_errc::UnexpectedStart: return msg::format(msgStartCodeUnitInContinue); + case utf8_errc::UnexpectedEof: return msg::format(msgEndOfStringInCodeUnit); + default: Checks::unreachable(VCPKG_LINE_INFO); } - }; - - const std::error_category& utf8_category() noexcept - { - static const Utf8Category t; - return t; } char const* Utf8Decoder::pointer_to_current() const noexcept @@ -261,8 +249,8 @@ namespace vcpkg::Unicode const auto err = next(); if (err != utf8_errc::NoError) { - Checks::msg_exit_with_error( - VCPKG_LINE_INFO, msg::format(msgUtf8ConversionFailed).append_raw(std::error_code(err).message())); + Checks::msg_exit_with_error(VCPKG_LINE_INFO, + msg::format(msgUtf8ConversionFailed).append_raw(": ").append(message(err))); } return *this; diff --git a/src/vcpkg/base/xmlserializer.cpp b/src/vcpkg/base/xmlserializer.cpp index 9234edf5af..676f3827e6 100644 --- a/src/vcpkg/base/xmlserializer.cpp +++ b/src/vcpkg/base/xmlserializer.cpp @@ -62,6 +62,7 @@ namespace vcpkg XmlSerializer& XmlSerializer::text(StringView sv) { emit_pending_indent(); + buf.reserve(sv.size()); for (auto ch : sv) { if (ch == '&') diff --git a/src/vcpkg/binarycaching.cpp b/src/vcpkg/binarycaching.cpp index 4d07e091f5..ad78d9c761 100644 --- a/src/vcpkg/binarycaching.cpp +++ b/src/vcpkg/binarycaching.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -17,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -25,6 +26,7 @@ #include #include +#include using namespace vcpkg; @@ -184,20 +186,16 @@ namespace return ret; } - static const std::string& get_nuget_prefix() + NugetReference make_nugetref(const PackageSpec& spec, StringView raw_version, StringView abi_tag, StringView prefix) { - static std::string nuget_prefix = []() { - auto x = get_environment_variable("X_VCPKG_NUGET_ID_PREFIX").value_or(""); - if (!x.empty()) - { - x.push_back('_'); - } - return x; - }(); - return nuget_prefix; + return {Strings::concat(prefix, spec.dir()), format_version_for_nugetref(raw_version, abi_tag)}; + } + NugetReference make_nugetref(const BinaryPackageReadInfo& info, StringView prefix) + { + return make_nugetref(info.spec, info.raw_version, info.package_abi, prefix); } - static void clean_prepare_dir(Filesystem& fs, const Path& dir) + void clean_prepare_dir(const Filesystem& fs, const Path& dir) { fs.remove_all(dir, VCPKG_LINE_INFO); if (!fs.create_directories(dir, VCPKG_LINE_INFO)) @@ -206,89 +204,90 @@ namespace } } - static Path make_temp_archive_path(const Path& buildtrees, const PackageSpec& spec) + Path make_temp_archive_path(const Path& buildtrees, const PackageSpec& spec) { return buildtrees / spec.name() / (spec.triplet().to_string() + ".zip"); } - struct ArchivesBinaryProvider : IBinaryProvider - { - ArchivesBinaryProvider(const VcpkgPaths& paths, - std::vector&& read_dirs, - std::vector&& write_dirs, - std::vector&& put_url_templates, - const std::vector& secrets) - : paths(paths) - , m_read_dirs(std::move(read_dirs)) - , m_write_dirs(std::move(write_dirs)) - , m_put_url_templates(std::move(put_url_templates)) - , m_secrets(secrets) - { - } + Path files_archive_subpath(const std::string& abi) { return Path(abi.substr(0, 2)) / (abi + ".zip"); } - static Path make_archive_subpath(const std::string& abi) { return Path(abi.substr(0, 2)) / (abi + ".zip"); } + struct FilesWriteBinaryProvider : IWriteBinaryProvider + { + FilesWriteBinaryProvider(const Filesystem& fs, std::vector&& dirs) : m_fs(fs), m_dirs(std::move(dirs)) { } - void prefetch(View actions, View cache_status) const override + size_t push_success(const BinaryPackageWriteInfo& request, MessageSink& msg_sink) override { - std::vector to_try_restore_idxs; - std::vector to_try_restore; + const auto& zip_path = request.zip_path.value_or_exit(VCPKG_LINE_INFO); + const auto archive_subpath = files_archive_subpath(request.package_abi); - for (const auto& archives_root_dir : m_read_dirs) + size_t count_stored = 0; + for (const auto& archives_root_dir : m_dirs) { - const ElapsedTimer timer; - to_try_restore_idxs.clear(); - to_try_restore.clear(); - for (size_t idx = 0; idx < cache_status.size(); ++idx) + const auto archive_path = archives_root_dir / archive_subpath; + std::error_code ec; + m_fs.create_directories(archive_path.parent_path(), IgnoreErrors{}); + m_fs.copy_file(zip_path, archive_path, CopyOptions::overwrite_existing, ec); + if (ec) { - auto idx_cache_status = cache_status[idx]; - if (idx_cache_status && idx_cache_status->should_attempt_restore(this)) - { - to_try_restore_idxs.push_back(idx); - to_try_restore.push_back(&actions[idx]); - } + msg_sink.println(Color::warning, + msg::format(msgFailedToStoreBinaryCache, msg::path = archive_path) + .append_raw('\n') + .append_raw(ec.message())); } - - auto results = try_restore_n(to_try_restore, archives_root_dir); - int num_restored = 0; - for (size_t n = 0; n < to_try_restore.size(); ++n) + else { - if (results[n] == RestoreResult::restored) - { - cache_status[to_try_restore_idxs[n]]->mark_restored(); - ++num_restored; - } + count_stored++; } - msg::println(msgRestoredPackagesFromVendor, - msg::count = num_restored, - msg::elapsed = timer.elapsed(), - msg::value = archives_root_dir.native()); } + return count_stored; } - std::vector try_restore_n(View actions, - const Path& archives_root_dir) const + bool needs_nuspec_data() const override { return false; } + bool needs_zip_file() const override { return true; } + + private: + const Filesystem& m_fs; + std::vector m_dirs; + }; + + enum class RemoveWhen + { + nothing, + always, + on_fail, + }; + + struct ZipResource + { + ZipResource(Path&& p, RemoveWhen t) : path(std::move(p)), to_remove(t) { } + + Path path; + RemoveWhen to_remove; + }; + + // This middleware class contains logic for BinaryProviders that operate on zip files. + // Derived classes must implement: + // - acquire_zips() + // - IReadBinaryProvider::precheck() + struct ZipReadBinaryProvider : IReadBinaryProvider + { + ZipReadBinaryProvider(ZipTool zip, const Filesystem& fs) : m_zip(std::move(zip)), m_fs(fs) { } + + void fetch(View actions, Span out_status) const override { - auto& fs = paths.get_filesystem(); - std::vector results(actions.size(), RestoreResult::unavailable); - std::vector action_idxs; + const ElapsedTimer timer; + std::vector> zip_paths(actions.size(), nullopt); + acquire_zips(actions, zip_paths); + std::vector jobs; - std::vector archive_paths; + std::vector action_idxs; for (size_t i = 0; i < actions.size(); ++i) { - const auto& action = *actions[i]; - const auto& spec = action.spec; - const auto& abi_tag = action.package_abi().value_or_exit(VCPKG_LINE_INFO); - const auto archive_subpath = make_archive_subpath(abi_tag); - auto archive_path = archives_root_dir / archive_subpath; - if (fs.exists(archive_path, IgnoreErrors{})) - { - auto pkg_path = paths.package_dir(spec); - clean_prepare_dir(fs, pkg_path); - jobs.push_back( - decompress_zip_archive_cmd(paths.get_tool_cache(), stdout_sink, pkg_path, archive_path)); - action_idxs.push_back(i); - archive_paths.push_back(std::move(archive_path)); - } + if (!zip_paths[i]) continue; + const auto& pkg_path = actions[i]->package_dir.value_or_exit(VCPKG_LINE_INFO); + clean_prepare_dir(m_fs, pkg_path); + jobs.push_back(m_zip.decompress_zip_archive_cmd(pkg_path, zip_paths[i].get()->path)); + action_idxs.push_back(i); } auto job_results = decompress_in_parallel(jobs); @@ -296,309 +295,270 @@ namespace for (size_t j = 0; j < jobs.size(); ++j) { const auto i = action_idxs[j]; - const auto& archive_result = job_results[j]; - if (archive_result) + const auto& zip_path = zip_paths[i].value_or_exit(VCPKG_LINE_INFO); + if (job_results[j]) { - results[i] = RestoreResult::restored; - Debug::print("Restored ", archive_paths[j].native(), '\n'); + Debug::print("Restored ", zip_path.path, '\n'); + out_status[i] = RestoreResult::restored; } else { - if (actions[i]->build_options.purge_decompress_failure == PurgeDecompressFailure::YES) - { - Debug::print( - "Failed to decompress archive package; purging: ", archive_paths[j].native(), '\n'); - fs.remove(archive_paths[j], IgnoreErrors{}); - } - else - { - Debug::print("Failed to decompress archive package: ", archive_paths[j].native(), '\n'); - } + Debug::print("Failed to decompress archive package: ", zip_path.path, '\n'); } + + post_decompress(zip_path, job_results[j].has_value()); } - return results; } - RestoreResult try_restore(const InstallPlanAction& action) const override + void post_decompress(const ZipResource& r, bool succeeded) const { - // Note: this method is almost never called -- it will only be called if another provider promised to - // restore a package but then failed at runtime - auto p_action = &action; - for (const auto& archives_root_dir : m_read_dirs) + if ((!succeeded && r.to_remove == RemoveWhen::on_fail) || r.to_remove == RemoveWhen::always) { - if (try_restore_n({&p_action, 1}, archives_root_dir)[0] == RestoreResult::restored) - { - msg::println(msgRestoredPackage, msg::path = archives_root_dir.native()); - return RestoreResult::restored; - } + m_fs.remove(r.path, IgnoreErrors{}); } - return RestoreResult::unavailable; } - size_t push_success(const BinaryProviderPushRequest& request, MessageSink& msg_sink) override - { - if (m_write_dirs.empty() && m_put_url_templates.empty()) - { - return 0; - } + // For every action denoted by actions, at corresponding indicies in out_zips, stores a ZipResource indicating + // the downloaded location. + // + // Leaving an Optional disengaged indicates that the cache does not contain the requested zip. + virtual void acquire_zips(View actions, + Span> out_zips) const = 0; - const auto& abi_tag = request.info.package_abi; - auto& spec = request.info.spec; - auto& fs = paths.get_filesystem(); - const auto archive_subpath = make_archive_subpath(abi_tag); - const auto tmp_archive_path = make_temp_archive_path(paths.buildtrees(), spec); - auto compress_result = - compress_directory_to_zip(fs, paths.get_tool_cache(), msg_sink, request.package_dir, tmp_archive_path); - if (!compress_result) - { - msg_sink.println(Color::warning, - msg::format_warning(msgCompressFolderFailed, msg::path = request.package_dir) - .append_raw(' ') - .append_raw(compress_result.error())); - return 0; - } - int count_stored = 0; - for (auto&& put_url_template : m_put_url_templates) - { - auto url = put_url_template.instantiate_variables(request.info); - auto maybe_success = put_file(fs, url, m_secrets, put_url_template.headers_for_put, tmp_archive_path); - if (maybe_success) - { - count_stored++; - continue; - } + protected: + ZipTool m_zip; + const Filesystem& m_fs; + }; - msg_sink.println(Color::warning, maybe_success.error()); - } + struct FilesReadBinaryProvider : ZipReadBinaryProvider + { + FilesReadBinaryProvider(ZipTool zip, const Filesystem& fs, Path&& dir) + : ZipReadBinaryProvider(std::move(zip), fs), m_dir(std::move(dir)) + { + } - for (const auto& archives_root_dir : m_write_dirs) + void acquire_zips(View actions, + Span> out_zip_paths) const override + { + for (size_t i = 0; i < actions.size(); ++i) { - const auto archive_path = archives_root_dir / archive_subpath; - fs.create_directories(archive_path.parent_path(), IgnoreErrors{}); - std::error_code ec; - if (m_write_dirs.size() > 1) - { - fs.copy_file(tmp_archive_path, archive_path, CopyOptions::overwrite_existing, ec); - } - else - { - fs.rename_or_copy(tmp_archive_path, archive_path, ".tmp", ec); - } - - if (ec) - { - msg_sink.println(Color::warning, - msg::format(msgFailedToStoreBinaryCache, msg::path = archive_path) - .append_raw('\n') - .append_raw(ec.message())); - } - else + const auto& abi_tag = actions[i]->package_abi().value_or_exit(VCPKG_LINE_INFO); + auto archive_path = m_dir / files_archive_subpath(abi_tag); + if (m_fs.exists(archive_path, IgnoreErrors{})) { - count_stored++; + auto to_remove = actions[i]->build_options.purge_decompress_failure == PurgeDecompressFailure::YES + ? RemoveWhen::on_fail + : RemoveWhen::nothing; + out_zip_paths[i].emplace(std::move(archive_path), to_remove); } } - // In the case of 1 write dir, the file will be moved instead of copied - if (m_write_dirs.size() != 1) - { - fs.remove(tmp_archive_path, IgnoreErrors{}); - } - return count_stored; } - void precheck(View actions, View cache_status) const override + void precheck(View actions, Span cache_status) const override { - auto& fs = paths.get_filesystem(); for (size_t idx = 0; idx < actions.size(); ++idx) { - const auto& action = actions[idx]; + const auto& action = *actions[idx]; const auto& abi_tag = action.package_abi().value_or_exit(VCPKG_LINE_INFO); - if (!cache_status[idx]->should_attempt_precheck(this)) - { - continue; - } - const auto archive_subpath = make_archive_subpath(abi_tag); bool any_available = false; - for (auto&& archives_root_dir : m_read_dirs) + if (m_fs.exists(m_dir / files_archive_subpath(abi_tag), IgnoreErrors{})) { - if (fs.exists(archives_root_dir / archive_subpath, IgnoreErrors{})) - { - any_available = true; - break; - } + any_available = true; } - if (any_available) - { - cache_status[idx]->mark_available(this); - } - else - { - cache_status[idx]->mark_unavailable(this); - } + cache_status[idx] = any_available ? CacheAvailability::available : CacheAvailability::unavailable; } } + LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const override + { + return msg::format(msgRestoredPackagesFromFiles, + msg::count = count, + msg::elapsed = ElapsedTime(elapsed), + msg::path = m_dir); + } private: - const VcpkgPaths& paths; - std::vector m_read_dirs; - std::vector m_write_dirs; - std::vector m_put_url_templates; - std::vector m_secrets; + Path m_dir; }; - struct HttpGetBinaryProvider : IBinaryProvider + + struct HTTPPutBinaryProvider : IWriteBinaryProvider { - HttpGetBinaryProvider(const VcpkgPaths& paths, - std::vector&& url_templates, + HTTPPutBinaryProvider(const Filesystem& fs, + std::vector&& urls, const std::vector& secrets) - : paths(paths), m_url_templates(std::move(url_templates)), m_secrets(secrets) + : m_fs(fs), m_urls(std::move(urls)), m_secrets(secrets) + { + } + + size_t push_success(const BinaryPackageWriteInfo& request, MessageSink& msg_sink) override { + if (!request.zip_path) return 0; + const auto& zip_path = *request.zip_path.get(); + size_t count_stored = 0; + for (auto&& templ : m_urls) + { + auto url = templ.instantiate_variables(request); + auto maybe_success = put_file(m_fs, url, m_secrets, templ.headers, zip_path); + if (maybe_success) + count_stored++; + else + msg_sink.println(Color::warning, maybe_success.error()); + } + return count_stored; } - RestoreResult try_restore(const InstallPlanAction&) const override { return RestoreResult::unavailable; } + bool needs_nuspec_data() const override { return false; } + bool needs_zip_file() const override { return true; } + + private: + const Filesystem& m_fs; + std::vector m_urls; + std::vector m_secrets; + }; - size_t push_success(const BinaryProviderPushRequest&, MessageSink&) override { return 0; } + struct HttpGetBinaryProvider : ZipReadBinaryProvider + { + HttpGetBinaryProvider(ZipTool zip, + const Filesystem& fs, + const Path& buildtrees, + UrlTemplate&& url_template, + const std::vector& secrets) + : ZipReadBinaryProvider(std::move(zip), fs) + , m_buildtrees(buildtrees) + , m_url_template(std::move(url_template)) + , m_secrets(secrets) + { + } - void prefetch(View actions, View cache_status) const override + void acquire_zips(View actions, + Span> out_zip_paths) const override { - const ElapsedTimer timer; - auto& fs = paths.get_filesystem(); - size_t this_restore_count = 0; std::vector> url_paths; - std::vector url_indices; - for (auto&& url_template : m_url_templates) + for (size_t idx = 0; idx < actions.size(); ++idx) { - url_paths.clear(); - url_indices.clear(); - for (size_t idx = 0; idx < cache_status.size(); ++idx) - { - auto this_cache_status = cache_status[idx]; - if (!this_cache_status || !this_cache_status->should_attempt_restore(this)) - { - continue; - } - - auto&& action = actions[idx]; - clean_prepare_dir(fs, paths.package_dir(action.spec)); - auto uri = url_template.instantiate_variables(BinaryPackageInformation{action, ""}); - url_paths.emplace_back(std::move(uri), make_temp_archive_path(paths.buildtrees(), action.spec)); - url_indices.push_back(idx); - } - - if (url_paths.empty()) break; + auto&& action = *actions[idx]; + url_paths.emplace_back(m_url_template.instantiate_variables(BinaryPackageReadInfo{action}), + make_temp_archive_path(m_buildtrees, action.spec)); + } - msg::println(msgAttemptingToFetchPackagesFromVendor, - msg::count = url_paths.size(), - msg::vendor = "HTTP servers"); + auto codes = download_files(m_fs, url_paths, m_url_template.headers); - auto codes = download_files(fs, url_paths, url_template.headers_for_get); - std::vector action_idxs; - std::vector jobs; - for (size_t i = 0; i < codes.size(); ++i) - { - if (codes[i] == 200) - { - action_idxs.push_back(i); - jobs.push_back(decompress_zip_archive_cmd(paths.get_tool_cache(), - stdout_sink, - paths.package_dir(actions[url_indices[i]].spec), - url_paths[i].second)); - } - } - auto job_results = decompress_in_parallel(jobs); - for (size_t j = 0; j < jobs.size(); ++j) + for (size_t i = 0; i < codes.size(); ++i) + { + if (codes[i] == 200) { - const auto i = action_idxs[j]; - if (job_results[j]) - { - ++this_restore_count; - fs.remove(url_paths[i].second, VCPKG_LINE_INFO); - cache_status[url_indices[i]]->mark_restored(); - } - else - { - Debug::print("Failed to decompress ", url_paths[i].second, '\n'); - } + out_zip_paths[i].emplace(std::move(url_paths[i].second), RemoveWhen::always); } } - - msg::println(msgRestoredPackagesFromVendor, - msg::count = this_restore_count, - msg::elapsed = timer.elapsed(), - msg::value = "HTTP servers"); } - void precheck(View actions, View cache_status) const override + void precheck(View actions, Span out_status) const override { - std::vector actions_present{actions.size()}; std::vector urls; - std::vector url_indices; - for (auto&& url_template : m_url_templates) + for (size_t idx = 0; idx < actions.size(); ++idx) { - urls.clear(); - url_indices.clear(); - for (size_t idx = 0; idx < actions.size(); ++idx) - { - if (!cache_status[idx]->should_attempt_precheck(this)) - { - continue; - } - - urls.push_back(url_template.instantiate_variables(BinaryPackageInformation{actions[idx], {}})); - url_indices.push_back(idx); - } - - if (urls.empty()) - { - return; - } - - auto codes = url_heads(urls, {}, m_secrets); - Checks::check_exit(VCPKG_LINE_INFO, codes.size() == urls.size()); - for (size_t i = 0; i < codes.size(); ++i) - { - if (codes[i] == 200) - { - cache_status[url_indices[i]]->mark_available(this); - actions_present[url_indices[i]] = CacheAvailability::available; - } - } + urls.push_back(m_url_template.instantiate_variables(BinaryPackageReadInfo{*actions[idx]})); } - for (size_t idx = 0; idx < actions.size(); ++idx) + auto codes = url_heads(urls, {}, m_secrets); + for (size_t i = 0; i < codes.size(); ++i) { - if (actions_present[idx] == CacheAvailability::unavailable) - { - cache_status[idx]->mark_unavailable(this); - } + out_status[i] = codes[i] == 200 ? CacheAvailability::available : CacheAvailability::unavailable; } } - const VcpkgPaths& paths; - std::vector m_url_templates; + LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const override + { + return msg::format(msgRestoredPackagesFromHTTP, msg::count = count, msg::elapsed = ElapsedTime(elapsed)); + } + + Path m_buildtrees; + UrlTemplate m_url_template; std::vector m_secrets; }; - struct NugetBinaryProvider : IBinaryProvider - { - NugetBinaryProvider(const VcpkgPaths& paths, - std::vector&& read_sources, - std::vector&& write_sources, - std::vector&& read_configs, - std::vector&& write_configs, - std::string&& timeout, - bool nuget_interactive) - : paths(paths) - , m_read_sources(std::move(read_sources)) - , m_write_sources(std::move(write_sources)) - , m_read_configs(std::move(read_configs)) - , m_write_configs(std::move(write_configs)) - , m_timeout(std::move(timeout)) - , m_interactive(nuget_interactive) - , m_use_nuget_cache(false) - { - const std::string use_nuget_cache = get_environment_variable("VCPKG_USE_NUGET_CACHE").value_or(""); - m_use_nuget_cache = - Strings::case_insensitive_ascii_equals(use_nuget_cache, "true") || use_nuget_cache == "1"; + + struct NuGetSource + { + StringLiteral option; + std::string value; + }; + + NuGetSource nuget_sources_arg(View sources) { return {"-Source", Strings::join(";", sources)}; } + NuGetSource nuget_configfile_arg(const Path& config_path) { return {"-ConfigFile", config_path.native()}; } + + struct NuGetTool + { + NuGetTool(const ToolCache& cache, MessageSink& sink, const BinaryConfigParserState& shared) + : m_timeout(shared.nugettimeout) + , m_interactive(shared.nuget_interactive) + , m_use_nuget_cache(shared.use_nuget_cache) + { +#ifndef _WIN32 + m_cmd.string_arg(cache.get_tool_path(Tools::MONO, sink)); +#endif + m_cmd.string_arg(cache.get_tool_path(Tools::NUGET, sink)); + } + + ExpectedL push(MessageSink& sink, const Path& nupkg_path, const NuGetSource& src) const + { + return run_nuget_commandline(push_cmd(nupkg_path, src), sink); + } + ExpectedL pack(MessageSink& sink, const Path& nuspec_path, const Path& out_dir) const + { + return run_nuget_commandline(pack_cmd(nuspec_path, out_dir), sink); + } + ExpectedL install(MessageSink& sink, + StringView packages_config, + const Path& out_dir, + const NuGetSource& src) const + { + return run_nuget_commandline(install_cmd(packages_config, out_dir, src), sink); + } + + private: + Command subcommand(StringLiteral sub) const + { + Command cmd = m_cmd; + cmd.string_arg(sub).string_arg("-ForceEnglishOutput").string_arg("-Verbosity").string_arg("detailed"); + if (!m_interactive) cmd.string_arg("-NonInteractive"); + return cmd; + } + + Command install_cmd(StringView packages_config, const Path& out_dir, const NuGetSource& src) const + { + Command cmd = subcommand("install"); + cmd.string_arg(packages_config) + .string_arg("-OutputDirectory") + .string_arg(out_dir) + .string_arg("-ExcludeVersion") + .string_arg("-PreRelease") + .string_arg("-PackageSaveMode") + .string_arg("nupkg"); + if (!m_use_nuget_cache) cmd.string_arg("-DirectDownload").string_arg("-NoCache"); + cmd.string_arg(src.option).string_arg(src.value); + return cmd; + } + + Command pack_cmd(const Path& nuspec_path, const Path& out_dir) const + { + return subcommand("pack") + .string_arg(nuspec_path) + .string_arg("-OutputDirectory") + .string_arg(out_dir) + .string_arg("-NoDefaultExcludes"); + } + + Command push_cmd(const Path& nupkg_path, const NuGetSource& src) const + { + return subcommand("push") + .string_arg(nupkg_path) + .string_arg("-Timeout") + .string_arg(m_timeout) + .string_arg(src.option) + .string_arg(src.value); } ExpectedL run_nuget_commandline(const Command& cmdline, MessageSink& msg_sink) const @@ -663,543 +623,359 @@ namespace }); } - struct NuGetPrefetchAttempt + Command m_cmd; + std::string m_timeout; + bool m_interactive; + bool m_use_nuget_cache; + }; + + struct NugetBaseBinaryProvider + { + NugetBaseBinaryProvider(const Filesystem& fs, + const NuGetTool& tool, + const Path& packages, + const Path& buildtrees, + StringView nuget_prefix) + : m_fs(fs) + , m_cmd(tool) + , m_packages(packages) + , m_buildtrees(buildtrees) + , m_nuget_prefix(nuget_prefix.to_string()) + { + } + + const Filesystem& m_fs; + NuGetTool m_cmd; + Path m_packages; + Path m_buildtrees; + std::string m_nuget_prefix; + }; + + struct NugetReadBinaryProvider : IReadBinaryProvider, private NugetBaseBinaryProvider + { + NugetReadBinaryProvider(const NugetBaseBinaryProvider& base, NuGetSource src) + : NugetBaseBinaryProvider(base), m_src(std::move(src)) { - PackageSpec spec; - NugetReference reference; - size_t result_index; - }; + } - static void generate_packages_config(Filesystem& fs, - const Path& packages_config, - const std::vector& attempts) + NuGetSource m_src; + + static std::string generate_packages_config(View refs) { XmlSerializer xml; xml.emit_declaration().line_break(); xml.open_tag("packages").line_break(); - for (auto&& attempt : attempts) + for (auto&& ref : refs) { xml.start_complex_open_tag("package") - .text_attr("id", attempt.reference.id) - .text_attr("version", attempt.reference.version) + .text_attr("id", ref.id) + .text_attr("version", ref.version) .finish_self_closing_complex_tag() .line_break(); } xml.close_tag("packages").line_break(); - fs.write_contents(packages_config, xml.buf, VCPKG_LINE_INFO); + return std::move(xml.buf); } - void prefetch(View actions, View cache_status) const override - { - if (m_read_sources.empty() && m_read_configs.empty()) - { - return; - } + // Prechecking is too expensive with NuGet, so it is not implemented + void precheck(View, Span) const override { } - const ElapsedTimer timer; - auto& fs = paths.get_filesystem(); + LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const override + { + return msg::format(msgRestoredPackagesFromNuGet, msg::count = count, msg::elapsed = ElapsedTime(elapsed)); + } - std::vector attempts; - for (size_t idx = 0; idx < cache_status.size(); ++idx) + void fetch(View actions, Span out_status) const override + { + auto packages_config = m_buildtrees / "packages.config"; + auto refs = + Util::fmap(actions, [this](const InstallPlanAction* p) { return make_nugetref(*p, m_nuget_prefix); }); + m_fs.write_contents(packages_config, generate_packages_config(refs), VCPKG_LINE_INFO); + m_cmd.install(stdout_sink, packages_config, m_packages, m_src); + for (size_t i = 0; i < actions.size(); ++i) { - auto this_cache_status = cache_status[idx]; - if (!this_cache_status || !this_cache_status->should_attempt_restore(this)) + // nuget.exe provides the nupkg file and the unpacked folder + const auto nupkg_path = m_packages / refs[i].id / refs[i].id + ".nupkg"; + if (m_fs.exists(nupkg_path, IgnoreErrors{})) { - continue; - } + m_fs.remove(nupkg_path, VCPKG_LINE_INFO); + const auto nuget_dir = actions[i]->spec.dir(); + if (nuget_dir != refs[i].id) + { + const auto path_from = m_packages / refs[i].id; + const auto path_to = m_packages / nuget_dir; + m_fs.rename(path_from, path_to, VCPKG_LINE_INFO); + } - const auto& action = actions[idx]; - const auto& spec = action.spec; - fs.remove_all(paths.package_dir(spec), VCPKG_LINE_INFO); - attempts.push_back({spec, make_nugetref(action, get_nuget_prefix()), idx}); + out_status[i] = RestoreResult::restored; + } } + } + }; + + struct NugetBinaryPushProvider : IWriteBinaryProvider, private NugetBaseBinaryProvider + { + NugetBinaryPushProvider(const NugetBaseBinaryProvider& base, + std::vector&& sources, + std::vector&& configs) + : NugetBaseBinaryProvider(base), m_sources(std::move(sources)), m_configs(std::move(configs)) + { + } + + std::vector m_sources; + std::vector m_configs; - if (attempts.empty()) + bool needs_nuspec_data() const override { return true; } + bool needs_zip_file() const override { return false; } + + size_t push_success(const BinaryPackageWriteInfo& request, MessageSink& msg_sink) override + { + auto& spec = request.spec; + + auto nuspec_path = m_buildtrees / spec.name() / spec.triplet().canonical_name() + ".nuspec"; + std::error_code ec; + m_fs.write_contents(nuspec_path, request.nuspec.value_or_exit(VCPKG_LINE_INFO), ec); + if (ec) { - return; + msg_sink.println(Color::error, msgPackingVendorFailed, msg::vendor = "NuGet"); + return 0; } - msg::println(msgAttemptingToFetchPackagesFromVendor, msg::count = attempts.size(), msg::vendor = "nuget"); - - auto packages_config = paths.buildtrees() / "packages.config"; - const auto& nuget_exe = paths.get_tool_exe("nuget", stdout_sink); - std::vector cmdlines; + auto packed_result = m_cmd.pack(msg_sink, nuspec_path, m_buildtrees); + m_fs.remove(nuspec_path, IgnoreErrors{}); + if (!packed_result) + { + msg_sink.println(Color::error, msgPackingVendorFailed, msg::vendor = "NuGet"); + return 0; + } - if (!m_read_sources.empty()) + size_t count_stored = 0; + auto nupkg_path = m_buildtrees / make_nugetref(request, m_nuget_prefix).nupkg_filename(); + for (auto&& write_src : m_sources) { - // First check using all sources - Command cmdline; -#ifndef _WIN32 - cmdline.string_arg(paths.get_tool_exe(Tools::MONO, stdout_sink)); -#endif - cmdline.string_arg(nuget_exe) - .string_arg("install") - .string_arg(packages_config) - .string_arg("-OutputDirectory") - .string_arg(paths.packages()) - .string_arg("-Source") - .string_arg(Strings::join(";", m_read_sources)) - .string_arg("-ExcludeVersion") - .string_arg("-PreRelease") - .string_arg("-PackageSaveMode") - .string_arg("nupkg") - .string_arg("-Verbosity") - .string_arg("detailed") - .string_arg("-ForceEnglishOutput"); - if (!m_interactive) + msg_sink.println( + msgUploadingBinariesToVendor, msg::spec = spec, msg::vendor = "NuGet", msg::path = write_src); + if (!m_cmd.push(msg_sink, nupkg_path, nuget_sources_arg({&write_src, 1}))) { - cmdline.string_arg("-NonInteractive"); + msg_sink.println( + Color::error, msgPushingVendorFailed, msg::vendor = "NuGet", msg::path = write_src); } - if (!m_use_nuget_cache) + else { - cmdline.string_arg("-DirectDownload").string_arg("-NoCache"); + count_stored++; } - - cmdlines.push_back(std::move(cmdline)); } - - for (auto&& cfg : m_read_configs) + for (auto&& write_cfg : m_configs) { - // Then check using each config - Command cmdline; -#ifndef _WIN32 - cmdline.string_arg(paths.get_tool_exe(Tools::MONO, stdout_sink)); -#endif - cmdline.string_arg(nuget_exe) - .string_arg("install") - .string_arg(packages_config) - .string_arg("-OutputDirectory") - .string_arg(paths.packages()) - .string_arg("-ConfigFile") - .string_arg(cfg) - .string_arg("-ExcludeVersion") - .string_arg("-PreRelease") - .string_arg("-PackageSaveMode") - .string_arg("nupkg") - .string_arg("-Verbosity") - .string_arg("detailed") - .string_arg("-ForceEnglishOutput"); - if (!m_interactive) + msg_sink.println(msgUploadingBinariesToVendor, + msg::spec = spec, + msg::vendor = "NuGet config", + msg::path = write_cfg); + if (!m_cmd.push(msg_sink, nupkg_path, nuget_configfile_arg(write_cfg))) { - cmdline.string_arg("-NonInteractive"); + msg_sink.println( + Color::error, msgPushingVendorFailed, msg::vendor = "NuGet config", msg::path = write_cfg); } - if (!m_use_nuget_cache) + else { - cmdline.string_arg("-DirectDownload").string_arg("-NoCache"); + count_stored++; } - - cmdlines.push_back(std::move(cmdline)); } - const size_t total_restore_attempts = attempts.size(); - for (const auto& cmdline : cmdlines) + m_fs.remove(nupkg_path, IgnoreErrors{}); + return count_stored; + } + }; + + struct GHABinaryProvider : ZipReadBinaryProvider + { + GHABinaryProvider( + ZipTool zip, const Filesystem& fs, const Path& buildtrees, const std::string& url, const std::string& token) + : ZipReadBinaryProvider(std::move(zip), fs) + , m_buildtrees(buildtrees) + , m_url(url + "_apis/artifactcache/cache") + , m_token_header("Authorization: Bearer " + token) + { + } + + std::string lookup_cache_entry(StringView name, const std::string& abi) const + { + auto url = format_url_query(m_url, std::vector{"keys=" + name + "-" + abi, "version=" + abi}); + auto res = + invoke_http_request("GET", + std::vector{ + m_content_type_header.to_string(), m_token_header, m_accept_header.to_string()}, + url); + if (auto p = res.get()) { - if (attempts.empty()) + auto maybe_json = Json::parse_object(*p); + if (auto json = maybe_json.get()) { - break; - } - - generate_packages_config(fs, packages_config, attempts); - run_nuget_commandline(cmdline, stdout_sink); - Util::erase_remove_if(attempts, [&](const NuGetPrefetchAttempt& nuget_ref) -> bool { - // note that we would like the nupkg downloaded to buildtrees, but nuget.exe downloads it to the - // output directory - const auto nupkg_path = - paths.packages() / nuget_ref.reference.id / nuget_ref.reference.id + ".nupkg"; - if (fs.exists(nupkg_path, IgnoreErrors{})) + auto archive_location = json->get("archiveLocation"); + if (archive_location && archive_location->is_string()) { - fs.remove(nupkg_path, VCPKG_LINE_INFO); - const auto nuget_dir = nuget_ref.spec.dir(); - if (nuget_dir != nuget_ref.reference.id) - { - const auto path_from = paths.packages() / nuget_ref.reference.id; - const auto path_to = paths.packages() / nuget_dir; - fs.rename(path_from, path_to, VCPKG_LINE_INFO); - } - - cache_status[nuget_ref.result_index]->mark_restored(); - return true; + return archive_location->string(VCPKG_LINE_INFO).to_string(); } - - return false; - }); + } } - msg::println(msgRestoredPackagesFromVendor, - msg::count = total_restore_attempts - attempts.size(), - msg::elapsed = timer.elapsed(), - msg::value = "NuGet"); + return {}; } - RestoreResult try_restore(const InstallPlanAction&) const override { return RestoreResult::unavailable; } - - bool needs_nuspec_data() const override { return !m_write_sources.empty() || !m_write_configs.empty(); } - - size_t push_success(const BinaryProviderPushRequest& request, MessageSink& msg_sink) override + void acquire_zips(View actions, + Span> out_zip_paths) const override { - if (m_write_sources.empty() && m_write_configs.empty()) - { - return 0; - } - if (!request.info.nuspec.has_value()) + std::vector> url_paths; + std::vector url_indices; + for (size_t idx = 0; idx < actions.size(); ++idx) { - Checks::unreachable( - VCPKG_LINE_INFO, - "request.info.nuspec must be non empty because needs_nuspec_data() should return true"); - } - - auto& spec = request.info.spec; - - NugetReference nuget_ref = make_nugetref(request.info, get_nuget_prefix()); - auto nuspec_path = paths.buildtrees() / spec.name() / (spec.triplet().to_string() + ".nuspec"); - auto& fs = paths.get_filesystem(); - fs.write_contents(nuspec_path, request.info.nuspec.value_or_exit(VCPKG_LINE_INFO), VCPKG_LINE_INFO); - - const auto& nuget_exe = paths.get_tool_exe("nuget", stdout_sink); - Command cmdline; -#ifndef _WIN32 - cmdline.string_arg(paths.get_tool_exe(Tools::MONO, stdout_sink)); -#endif - cmdline.string_arg(nuget_exe) - .string_arg("pack") - .string_arg(nuspec_path) - .string_arg("-OutputDirectory") - .string_arg(paths.buildtrees()) - .string_arg("-NoDefaultExcludes") - .string_arg("-ForceEnglishOutput"); + auto&& action = *actions[idx]; + const auto& package_name = action.spec.name(); + auto url = lookup_cache_entry(package_name, action.package_abi().value_or_exit(VCPKG_LINE_INFO)); + if (url.empty()) continue; - if (!m_interactive) - { - cmdline.string_arg("-NonInteractive"); + url_paths.emplace_back(std::move(url), make_temp_archive_path(m_buildtrees, action.spec)); + url_indices.push_back(idx); } - if (!run_nuget_commandline(cmdline, msg_sink)) - { - msg_sink.println(Color::error, msgPackingVendorFailed, msg::vendor = "NuGet"); - return 0; - } - int count_stored = 0; - auto nupkg_path = paths.buildtrees() / nuget_ref.nupkg_filename(); - for (auto&& write_src : m_write_sources) - { - Command cmd; -#ifndef _WIN32 - cmd.string_arg(paths.get_tool_exe(Tools::MONO, stdout_sink)); -#endif - cmd.string_arg(nuget_exe) - .string_arg("push") - .string_arg(nupkg_path) - .string_arg("-ForceEnglishOutput") - .string_arg("-Timeout") - .string_arg(m_timeout) - .string_arg("-Source") - .string_arg(write_src); + auto codes = download_files(m_fs, url_paths, {}); - if (!m_interactive) - { - cmd.string_arg("-NonInteractive"); - } - msg_sink.println( - msgUploadingBinariesToVendor, msg::spec = spec, msg::vendor = "NuGet", msg::path = write_src); - if (!run_nuget_commandline(cmd, msg_sink)) - { - msg_sink.println( - Color::error, msgPushingVendorFailed, msg::vendor = "NuGet", msg::path = write_src); - } - else - { - count_stored++; - } - } - for (auto&& write_cfg : m_write_configs) + for (size_t i = 0; i < codes.size(); ++i) { - Command cmd; -#ifndef _WIN32 - cmd.string_arg(paths.get_tool_exe(Tools::MONO, msg_sink)); -#endif - cmd.string_arg(nuget_exe) - .string_arg("push") - .string_arg(nupkg_path) - .string_arg("-ForceEnglishOutput") - .string_arg("-Timeout") - .string_arg(m_timeout) - .string_arg("-ConfigFile") - .string_arg(write_cfg); - if (!m_interactive) - { - cmd.string_arg("-NonInteractive"); - } - msg_sink.println(Color::error, - msgUploadingBinariesUsingVendor, - msg::spec = spec, - msg::vendor = "NuGet config", - msg::path = write_cfg); - if (!run_nuget_commandline(cmd, msg_sink)) - { - msg_sink.println( - Color::error, msgPushingVendorFailed, msg::vendor = "NuGet", msg::path = write_cfg); - } - else + if (codes[i] == 200) { - count_stored++; + out_zip_paths[url_indices[i]].emplace(std::move(url_paths[i].second), RemoveWhen::always); } } - - fs.remove(nupkg_path, IgnoreErrors{}); - return count_stored; } - void precheck(View, View) const override { } - - private: - const VcpkgPaths& paths; - - std::vector m_read_sources; - std::vector m_write_sources; + void precheck(View, Span) const override { } - std::vector m_read_configs; - std::vector m_write_configs; + LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const override + { + return msg::format(msgRestoredPackagesFromGHA, msg::count = count, msg::elapsed = ElapsedTime(elapsed)); + } - std::string m_timeout; - bool m_interactive; - bool m_use_nuget_cache; + Path m_buildtrees; + std::string m_url; + std::string m_token_header; + static constexpr StringLiteral m_accept_header = "Accept: application/json;api-version=6.0-preview.1"; + static constexpr StringLiteral m_content_type_header = "Content-Type: application/json"; }; - struct GHABinaryProvider : IBinaryProvider - { - GHABinaryProvider(const VcpkgPaths& paths, - bool read, - bool write, - const Optional& url, - const Optional& token) - : paths(paths) - { - if (read) m_read_url = url.value_or_exit(VCPKG_LINE_INFO) + "_apis/artifactcache/cache"; - if (write) m_write_url = url.value_or_exit(VCPKG_LINE_INFO) + "_apis/artifactcache/caches"; - m_token_header = "Authorization: Bearer " + token.value_or_exit(VCPKG_LINE_INFO); - } - - Command command() const - { - Command cmd; - cmd.string_arg("curl") - .string_arg("-s") - .string_arg("-H") - .string_arg("Content-Type: application/json") - .string_arg("-H") - .string_arg(m_token_header) - .string_arg("-H") - .string_arg(m_accept_header); - return cmd; - } - std::string lookup_cache_entry(const std::string& abi) const + struct GHABinaryPushProvider : IWriteBinaryProvider + { + GHABinaryPushProvider(const Filesystem& fs, const std::string& url, const std::string& token) + : m_fs(fs), m_url(url + "_apis/artifactcache/caches"), m_token_header("Authorization: Bearer " + token) { - auto cmd = command() - .string_arg(m_read_url) - .string_arg("-G") - .string_arg("-d") - .string_arg("keys=vcpkg") - .string_arg("-d") - .string_arg("version=" + abi); - - std::vector lines; - auto res = cmd_execute_and_capture_output(cmd); - if (!res.has_value() || res.get()->exit_code) return {}; - auto json = Json::parse_object(res.get()->output); - if (!json.has_value() || !json.get()->contains("archiveLocation")) return {}; - return json.get()->get("archiveLocation")->string(VCPKG_LINE_INFO).to_string(); } - Optional reserve_cache_entry(const std::string& abi, int64_t cacheSize) const + Optional reserve_cache_entry(const std::string& name, const std::string& abi, int64_t cacheSize) const { Json::Object payload; - payload.insert("key", "vcpkg"); + payload.insert("key", name + "-" + abi); payload.insert("version", abi); payload.insert("cacheSize", Json::Value::integer(cacheSize)); - auto cmd = command().string_arg(m_write_url).string_arg("-d").string_arg(stringify(payload)); - - auto res = cmd_execute_and_capture_output(cmd); - if (!res.has_value() || res.get()->exit_code) return {}; - auto json = Json::parse_object(res.get()->output); - if (!json.has_value() || !json.get()->contains("cacheId")) return {}; - return json.get()->get("cacheId")->integer(VCPKG_LINE_INFO); - } - - void prefetch(View actions, View cache_status) const override - { - auto& fs = paths.get_filesystem(); - - const ElapsedTimer timer; - size_t restored_count = 0; - std::vector> url_paths; - std::vector url_indices; - if (!m_read_url.empty()) - { - for (size_t idx = 0; idx < cache_status.size(); ++idx) - { - const auto this_cache_status = cache_status[idx]; - if (!this_cache_status || !this_cache_status->should_attempt_restore(this)) - { - continue; - } - auto&& action = actions[idx]; - auto url = lookup_cache_entry(action.package_abi().value_or_exit(VCPKG_LINE_INFO)); - if (url.empty()) continue; - - clean_prepare_dir(fs, paths.package_dir(action.spec)); - url_paths.emplace_back(std::move(url), make_temp_archive_path(paths.buildtrees(), action.spec)); - url_indices.push_back(idx); - } - } + std::vector headers; + headers.emplace_back(m_accept_header.data(), m_accept_header.size()); + headers.emplace_back(m_content_type_header.data(), m_content_type_header.size()); + headers.emplace_back(m_token_header); - if (!url_paths.empty()) + auto res = invoke_http_request("POST", headers, m_url, stringify(payload)); + if (auto p = res.get()) { - msg::println( - msgAttemptingToFetchPackagesFromVendor, msg::count = url_paths.size(), msg::vendor = "GHA"); - - auto codes = download_files(fs, url_paths, {}); - std::vector action_idxs; - std::vector jobs; - for (size_t i = 0; i < codes.size(); ++i) - { - if (codes[i] == 200) - { - action_idxs.push_back(i); - jobs.push_back(decompress_zip_archive_cmd(paths.get_tool_cache(), - stdout_sink, - paths.package_dir(actions[url_indices[i]].spec), - url_paths[i].second)); - } - } - auto job_results = decompress_in_parallel(jobs); - for (size_t j = 0; j < jobs.size(); ++j) + auto maybe_json = Json::parse_object(*p); + if (auto json = maybe_json.get()) { - const auto i = action_idxs[j]; - if (job_results[j]) - { - ++restored_count; - fs.remove(url_paths[i].second, VCPKG_LINE_INFO); - cache_status[url_indices[i]]->mark_restored(); - } - else + auto cache_id = json->get("cacheId"); + if (cache_id && cache_id->is_integer()) { - Debug::print("Failed to decompress ", url_paths[i].second, '\n'); + return cache_id->integer(VCPKG_LINE_INFO); } } } - - msg::println(msgRestoredPackagesFromVendor, - msg::count = restored_count, - msg::elapsed = timer.elapsed(), - msg::value = "GHA"); + return {}; } - RestoreResult try_restore(const InstallPlanAction&) const override { return RestoreResult::unavailable; } - - size_t push_success(const BinaryProviderPushRequest& request, MessageSink& msg_sink) override + size_t push_success(const BinaryPackageWriteInfo& request, MessageSink&) override { - if (m_write_url.empty()) return 0; - const ElapsedTimer timer; - auto& fs = paths.get_filesystem(); - const auto& abi = request.info.package_abi; - auto& spec = request.info.spec; - const auto tmp_archive_path = make_temp_archive_path(paths.buildtrees(), spec); - auto compression_result = compress_directory_to_zip( - paths.get_filesystem(), paths.get_tool_cache(), msg_sink, paths.package_dir(spec), tmp_archive_path); - if (!compression_result) - { - msg_sink.println(Color::warning, - msg::format_warning(msgCompressFolderFailed, msg::path = paths.package_dir(spec)) - .append_raw(' ') - .append_raw(compression_result.error())); - return 0; - } + if (!request.zip_path) return 0; - int64_t cache_size; - { - auto archive = fs.open_for_read(tmp_archive_path, VCPKG_LINE_INFO); - archive.try_seek_to(0, SEEK_END); - cache_size = archive.tell(); - } + const auto& zip_path = *request.zip_path.get(); + const ElapsedTimer timer; + const auto& abi = request.package_abi; size_t upload_count = 0; - if (!m_write_url.empty()) - { - if (auto cacheId = reserve_cache_entry(abi, cache_size)) - { - std::vector headers{ - m_token_header, - m_accept_header.to_string(), - "Content-Type: application/octet-stream", - "Content-Range: bytes 0-" + std::to_string(cache_size) + "/*", - }; - auto url = m_write_url + "/" + std::to_string(*cacheId.get()); - if (put_file(fs, url, {}, headers, tmp_archive_path, "PATCH")) - { - Json::Object commit; - commit.insert("size", std::to_string(cache_size)); - auto cmd = command().string_arg(url).string_arg("-d").string_arg(stringify(commit)); - - auto res = cmd_execute_and_capture_output(cmd); - if (res.has_value() && !res.get()->exit_code) - { - ++upload_count; - } - } - } - } - return upload_count; - } - - void precheck(View actions, View cache_status) const override - { - std::vector actions_availability{actions.size()}; - if (!m_read_url.empty()) - { - for (size_t idx = 0; idx < actions.size(); ++idx) - { - auto&& action = actions[idx]; - const auto& abi = action.package_abi().value_or_exit(VCPKG_LINE_INFO); - if (!cache_status[idx]->should_attempt_precheck(this)) + auto cache_size = m_fs.file_size(zip_path, VCPKG_LINE_INFO); + + if (auto cacheId = reserve_cache_entry(request.spec.name(), abi, cache_size)) + { + std::vector custom_headers{ + m_token_header, + m_accept_header.to_string(), + "Content-Type: application/octet-stream", + "Content-Range: bytes 0-" + std::to_string(cache_size) + "/*", + }; + auto url = m_url + "/" + std::to_string(*cacheId.get()); + + if (put_file(m_fs, url, {}, custom_headers, zip_path, "PATCH")) + { + Json::Object commit; + commit.insert("size", std::to_string(cache_size)); + std::vector headers; + headers.emplace_back(m_accept_header.data(), m_accept_header.size()); + headers.emplace_back(m_content_type_header.data(), m_content_type_header.size()); + headers.emplace_back(m_token_header); + auto res = invoke_http_request("POST", headers, url, stringify(commit)); + if (res) { - continue; + ++upload_count; } - - if (!lookup_cache_entry(abi).empty()) + else { - actions_availability[idx] = CacheAvailability::available; - cache_status[idx]->mark_available(this); + msg::println(res.error()); } } } - - for (size_t idx = 0; idx < actions.size(); ++idx) - { - const auto this_cache_status = cache_status[idx]; - if (this_cache_status && actions_availability[idx] == CacheAvailability::unavailable) - { - this_cache_status->mark_unavailable(this); - } - } + return upload_count; } - static constexpr StringLiteral m_accept_header = "Accept: application/json;api-version=6.0-preview.1"; + bool needs_nuspec_data() const override { return false; } + bool needs_zip_file() const override { return true; } + + const Filesystem& m_fs; + std::string m_url; std::string m_token_header; + static constexpr StringLiteral m_content_type_header = "Content-Type: application/json"; + static constexpr StringLiteral m_accept_header = "Accept: application/json;api-version=6.0-preview.1"; + }; - std::string m_read_url; - std::string m_write_url; + struct IObjectStorageTool + { + virtual ~IObjectStorageTool() = default; - const VcpkgPaths& paths; + virtual LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const = 0; + virtual ExpectedL stat(StringView url) const = 0; + virtual ExpectedL download_file(StringView object, const Path& archive) const = 0; + virtual ExpectedL upload_file(StringView object, const Path& archive) const = 0; }; - struct ObjectStorageProvider : IBinaryProvider + struct ObjectStorageProvider : ZipReadBinaryProvider { - ObjectStorageProvider(const VcpkgPaths& paths, - std::vector&& read_prefixes, - std::vector&& write_prefixes) - : paths(paths), m_read_prefixes(std::move(read_prefixes)), m_write_prefixes(std::move(write_prefixes)) + ObjectStorageProvider(ZipTool zip, + const Filesystem& fs, + const Path& buildtrees, + std::string&& prefix, + const std::shared_ptr& tool) + : ZipReadBinaryProvider(std::move(zip), fs) + , m_buildtrees(buildtrees) + , m_prefix(std::move(prefix)) + , m_tool(tool) { } @@ -1208,213 +984,141 @@ namespace return Strings::concat(prefix, abi, ".zip"); } - void prefetch(View actions, View cache_status) const override + void acquire_zips(View actions, + Span> out_zip_paths) const override { - auto& fs = paths.get_filesystem(); - - const ElapsedTimer timer; - size_t restored_count = 0; - for (const auto& prefix : m_read_prefixes) + for (size_t idx = 0; idx < actions.size(); ++idx) { - std::vector> url_paths; - std::vector url_indices; - - for (size_t idx = 0; idx < cache_status.size(); ++idx) + auto&& action = *actions[idx]; + const auto& abi = action.package_abi().value_or_exit(VCPKG_LINE_INFO); + auto tmp = make_temp_archive_path(m_buildtrees, action.spec); + auto res = m_tool->download_file(make_object_path(m_prefix, abi), tmp); + if (res) { - const auto this_cache_status = cache_status[idx]; - if (!this_cache_status || !this_cache_status->should_attempt_restore(this)) - { - continue; - } - - auto&& action = actions[idx]; - clean_prepare_dir(fs, paths.package_dir(action.spec)); - url_paths.emplace_back( - make_object_path(prefix, action.package_abi().value_or_exit(VCPKG_LINE_INFO)), - make_temp_archive_path(paths.buildtrees(), action.spec)); - url_indices.push_back(idx); + out_zip_paths[idx].emplace(std::move(tmp), RemoveWhen::always); } - - if (url_paths.empty()) break; - - msg::println( - msgAttemptingToFetchPackagesFromVendor, msg::count = url_paths.size(), msg::vendor = vendor()); - - std::vector jobs; - std::vector idxs; - for (size_t idx = 0; idx < url_paths.size(); ++idx) + else { - auto&& action = actions[url_indices[idx]]; - auto&& url_path = url_paths[idx]; - if (!download_file(url_path.first, url_path.second)) continue; - jobs.push_back(decompress_zip_archive_cmd( - paths.get_tool_cache(), stdout_sink, paths.package_dir(action.spec), url_path.second)); - idxs.push_back(idx); + stdout_sink.println_warning(res.error()); } + } + } - const auto job_results = - cmd_execute_and_capture_output_parallel(jobs, default_working_directory, get_clean_environment()); - - for (size_t j = 0; j < jobs.size(); ++j) + void precheck(View actions, Span cache_status) const override + { + for (size_t idx = 0; idx < actions.size(); ++idx) + { + auto&& action = *actions[idx]; + const auto& abi = action.package_abi().value_or_exit(VCPKG_LINE_INFO); + if (m_tool->stat(make_object_path(m_prefix, abi))) { - const auto idx = idxs[j]; - if (!job_results[j]) - { - Debug::print("Failed to decompress ", url_paths[idx].second, '\n'); - continue; - } - - // decompression success - ++restored_count; - fs.remove(url_paths[idx].second, VCPKG_LINE_INFO); - cache_status[url_indices[idx]]->mark_restored(); + cache_status[idx] = CacheAvailability::available; + } + else + { + cache_status[idx] = CacheAvailability::unavailable; } } - - msg::println(msgRestoredPackagesFromVendor, - msg::count = restored_count, - msg::elapsed = timer.elapsed(), - msg::value = vendor()); } - RestoreResult try_restore(const InstallPlanAction&) const override { return RestoreResult::unavailable; } + LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const override + { + return m_tool->restored_message(count, elapsed); + } - size_t push_success(const BinaryProviderPushRequest& request, MessageSink& msg_sink) override + Path m_buildtrees; + std::string m_prefix; + std::shared_ptr m_tool; + }; + struct ObjectStoragePushProvider : IWriteBinaryProvider + { + ObjectStoragePushProvider(std::vector&& prefixes, std::shared_ptr tool) + : m_prefixes(std::move(prefixes)), m_tool(std::move(tool)) { - if (m_write_prefixes.empty()) return 0; - const ElapsedTimer timer; - const auto& abi = request.info.package_abi; - auto& spec = request.info.spec; - const auto tmp_archive_path = make_temp_archive_path(paths.buildtrees(), spec); - auto compression_result = compress_directory_to_zip( - paths.get_filesystem(), paths.get_tool_cache(), msg_sink, request.package_dir, tmp_archive_path); - if (!compression_result) - { - msg_sink.println(Color::warning, - msg::format_warning(msgCompressFolderFailed, msg::path = request.package_dir) - .append_raw(' ') - .append_raw(compression_result.error())); - return 0; - } + } - size_t upload_count = 0; - for (const auto& prefix : m_write_prefixes) - { - if (upload_file(make_object_path(prefix, abi), tmp_archive_path)) - { - ++upload_count; - } - } - return upload_count; + static std::string make_object_path(const std::string& prefix, const std::string& abi) + { + return Strings::concat(prefix, abi, ".zip"); } - void precheck(View actions, View cache_status) const override + size_t push_success(const BinaryPackageWriteInfo& request, MessageSink& msg_sink) override { - std::vector actions_availability{actions.size()}; - for (const auto& prefix : m_read_prefixes) + if (!request.zip_path) return 0; + const auto& zip_path = *request.zip_path.get(); + size_t upload_count = 0; + for (const auto& prefix : m_prefixes) { - for (size_t idx = 0; idx < actions.size(); ++idx) + auto res = m_tool->upload_file(make_object_path(prefix, request.package_abi), zip_path); + if (res) { - auto&& action = actions[idx]; - const auto& abi = action.package_abi().value_or_exit(VCPKG_LINE_INFO); - if (!cache_status[idx]->should_attempt_precheck(this)) - { - continue; - } - - if (stat(make_object_path(prefix, abi))) - { - actions_availability[idx] = CacheAvailability::available; - cache_status[idx]->mark_available(this); - } + ++upload_count; } - } - - for (size_t idx = 0; idx < actions.size(); ++idx) - { - const auto this_cache_status = cache_status[idx]; - if (this_cache_status && actions_availability[idx] == CacheAvailability::unavailable) + else { - this_cache_status->mark_unavailable(this); + msg_sink.println_warning(res.error()); } } + return upload_count; } - protected: - virtual StringLiteral vendor() const = 0; - virtual bool stat(StringView url) const = 0; - virtual bool upload_file(StringView object, const Path& archive) const = 0; - virtual bool download_file(StringView object, const Path& archive) const = 0; - - const VcpkgPaths& paths; + bool needs_nuspec_data() const override { return false; } + bool needs_zip_file() const override { return true; } - private: - std::vector m_read_prefixes; - std::vector m_write_prefixes; + std::vector m_prefixes; + std::shared_ptr m_tool; }; - struct GcsBinaryProvider : ObjectStorageProvider + struct GcsStorageTool : IObjectStorageTool { - GcsBinaryProvider(const VcpkgPaths& paths, - std::vector&& read_prefixes, - std::vector&& write_prefixes) - : ObjectStorageProvider(paths, std::move(read_prefixes), std::move(write_prefixes)) + GcsStorageTool(const ToolCache& cache, MessageSink& sink) : m_tool(cache.get_tool_path(Tools::GSUTIL, sink)) { } + + LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const override { + return msg::format(msgRestoredPackagesFromGCS, msg::count = count, msg::elapsed = ElapsedTime(elapsed)); } - StringLiteral vendor() const override { return "GCS"; } + Command command() const { return m_tool; } - Command command() const { return Command{paths.get_tool_exe(Tools::GSUTIL, stdout_sink)}; } - - bool stat(StringView url) const override + ExpectedL stat(StringView url) const override { auto cmd = command().string_arg("-q").string_arg("stat").string_arg(url); - return succeeded(cmd_execute(cmd)); + return flatten(cmd_execute_and_capture_output(cmd), Tools::GSUTIL); } - bool upload_file(StringView object, const Path& archive) const override + ExpectedL download_file(StringView object, const Path& archive) const override { - auto cmd = command().string_arg("-q").string_arg("cp").string_arg(archive).string_arg(object); - const auto out = flatten(cmd_execute_and_capture_output(cmd), Tools::GSUTIL); - if (out) - { - return true; - } - - msg::write_unlocalized_text_to_stdout(Color::warning, out.error()); - return false; + auto cmd = command().string_arg("-q").string_arg("cp").string_arg(object).string_arg(archive); + return flatten(cmd_execute_and_capture_output(cmd), Tools::GSUTIL); } - bool download_file(StringView object, const Path& archive) const override + ExpectedL upload_file(StringView object, const Path& archive) const override { - auto cmd = command().string_arg("-q").string_arg("cp").string_arg(object).string_arg(archive); - const auto out = flatten(cmd_execute_and_capture_output(cmd), Tools::GSUTIL); - if (out) - { - return true; - } - - msg::write_unlocalized_text_to_stdout(Color::warning, out.error()); - return false; + auto cmd = command().string_arg("-q").string_arg("cp").string_arg(archive).string_arg(object); + return flatten(cmd_execute_and_capture_output(cmd), Tools::GSUTIL); } + + Command m_tool; }; - struct AwsBinaryProvider : ObjectStorageProvider + struct AwsStorageTool : IObjectStorageTool { - AwsBinaryProvider(const VcpkgPaths& paths, - std::vector&& read_prefixes, - std::vector&& write_prefixes, - const bool no_sign_request) - : ObjectStorageProvider(paths, std::move(read_prefixes), std::move(write_prefixes)) - , m_no_sign_request(no_sign_request) + AwsStorageTool(const ToolCache& cache, MessageSink& sink, bool no_sign_request) + : m_tool(cache.get_tool_path(Tools::AWSCLI, sink)), m_no_sign_request(no_sign_request) { } - StringLiteral vendor() const override { return "AWS"; } + LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const override + { + return msg::format(msgRestoredPackagesFromAWS, msg::count = count, msg::elapsed = ElapsedTime(elapsed)); + } - Command command() const { return Command{paths.get_tool_exe(Tools::AWSCLI, stdout_sink)}; } + Command command() const { return m_tool; } - bool stat(StringView url) const override + ExpectedL stat(StringView url) const override { auto cmd = command().string_arg("s3").string_arg("ls").string_arg(url); if (m_no_sign_request) @@ -1422,447 +1126,71 @@ namespace cmd.string_arg("--no-sign-request"); } - return succeeded(cmd_execute(cmd)); + return flatten(cmd_execute_and_capture_output(cmd), Tools::AWSCLI); } - bool upload_file(StringView object, const Path& archive) const override + ExpectedL download_file(StringView object, const Path& archive) const override { - auto cmd = command().string_arg("s3").string_arg("cp").string_arg(archive).string_arg(object); + auto r = stat(object); + if (!r) return r; + + auto cmd = command().string_arg("s3").string_arg("cp").string_arg(object).string_arg(archive); if (m_no_sign_request) { cmd.string_arg("--no-sign-request"); } - const auto out = flatten(cmd_execute_and_capture_output(cmd), Tools::AWSCLI); - if (out) - { - return true; - } - msg::write_unlocalized_text_to_stdout(Color::warning, out.error()); - return false; + return flatten(cmd_execute_and_capture_output(cmd), Tools::AWSCLI); } - bool download_file(StringView object, const Path& archive) const override + ExpectedL upload_file(StringView object, const Path& archive) const override { - if (!stat(object)) - { - return false; - } - - auto cmd = command().string_arg("s3").string_arg("cp").string_arg(object).string_arg(archive); + auto cmd = command().string_arg("s3").string_arg("cp").string_arg(archive).string_arg(object); if (m_no_sign_request) { cmd.string_arg("--no-sign-request"); } - - const auto out = flatten(cmd_execute_and_capture_output(cmd), Tools::AWSCLI); - if (out) - { - return true; - } - - msg::write_unlocalized_text_to_stdout(Color::warning, out.error()); - return false; + return flatten(cmd_execute_and_capture_output(cmd), Tools::AWSCLI); } - private: + Command m_tool; bool m_no_sign_request; }; - struct CosBinaryProvider : ObjectStorageProvider + struct CosStorageTool : IObjectStorageTool { - CosBinaryProvider(const VcpkgPaths& paths, - std::vector&& read_prefixes, - std::vector&& write_prefixes) - : ObjectStorageProvider(paths, std::move(read_prefixes), std::move(write_prefixes)) + CosStorageTool(const ToolCache& cache, MessageSink& sink) : m_tool(cache.get_tool_path(Tools::COSCLI, sink)) { } + + LocalizedString restored_message(size_t count, + std::chrono::high_resolution_clock::duration elapsed) const override { + return msg::format(msgRestoredPackagesFromCOS, msg::count = count, msg::elapsed = ElapsedTime(elapsed)); } - StringLiteral vendor() const override { return "COS"; } + Command command() const { return m_tool; } - Command command() const { return Command{paths.get_tool_exe(Tools::COSCLI, stdout_sink)}; } - - bool stat(StringView url) const override + ExpectedL stat(StringView url) const override { auto cmd = command().string_arg("ls").string_arg(url); - return succeeded(cmd_execute(cmd)); + return flatten(cmd_execute_and_capture_output(cmd), Tools::COSCLI); } - bool upload_file(StringView object, const Path& archive) const override + ExpectedL download_file(StringView object, const Path& archive) const override { - auto cmd = command().string_arg("cp").string_arg(archive).string_arg(object); - const auto out = flatten(cmd_execute_and_capture_output(cmd), Tools::COSCLI); - if (out) - { - return true; - } - - msg::write_unlocalized_text_to_stdout(Color::warning, out.error()); - return false; + auto cmd = command().string_arg("cp").string_arg(object).string_arg(archive); + return flatten(cmd_execute_and_capture_output(cmd), Tools::COSCLI); } - bool download_file(StringView object, const Path& archive) const override + ExpectedL upload_file(StringView object, const Path& archive) const override { - auto cmd = command().string_arg("cp").string_arg(object).string_arg(archive); - const auto out = flatten(cmd_execute_and_capture_output(cmd), Tools::COSCLI); - if (out) - { - return true; - } - - msg::write_unlocalized_text_to_stdout(Color::warning, out.error()); - return false; + auto cmd = command().string_arg("cp").string_arg(archive).string_arg(object); + return flatten(cmd_execute_and_capture_output(cmd), Tools::COSCLI); } + + Command m_tool; }; -} -namespace vcpkg -{ - LocalizedString UrlTemplate::valid() const - { - std::vector invalid_keys; - auto result = api_stable_format(url_template, [&](std::string&, StringView key) { - static constexpr std::array valid_keys = {"name", "version", "sha", "triplet"}; - if (!Util::Vectors::contains(valid_keys, key)) - { - invalid_keys.push_back(key.to_string()); - } - }); - if (!result) - { - return result.error(); - } - if (!invalid_keys.empty()) - { - return msg::format(msgUnknownVariablesInTemplate, - msg::value = url_template, - msg::list = Strings::join(", ", invalid_keys)); - } - return {}; - } - - std::string UrlTemplate::instantiate_variables(const BinaryPackageInformation& info) const - { - return api_stable_format(url_template, - [&](std::string& out, StringView key) { - if (key == "version") - { - out += info.raw_version; - } - else if (key == "name") - { - out += info.spec.name(); - } - else if (key == "triplet") - { - out += info.spec.triplet().canonical_name(); - } - else if (key == "sha") - { - out += info.package_abi; - } - else - { - Debug::println("Unknown key: ", key); - // We do a input validation while parsing the config - Checks::unreachable(VCPKG_LINE_INFO); - }; - }) - .value_or_exit(VCPKG_LINE_INFO); - } - - BinaryCache::BinaryCache(Filesystem& filesystem) : filesystem(filesystem) { } - - BinaryCache::BinaryCache(const VcpkgCmdArguments& args, const VcpkgPaths& paths) - : BinaryCache(paths.get_filesystem()) - { - install_providers_for(args, paths); - } - - void BinaryCache::install_providers(std::vector>&& providers) - { - Checks::check_exit( - VCPKG_LINE_INFO, m_status.empty(), "Attempted to install additional providers in active binary cache"); - if (m_providers.empty()) - { - m_providers = std::move(providers); - } - else - { - m_providers.insert(m_providers.end(), - std::make_move_iterator(providers.begin()), - std::make_move_iterator(providers.end())); - } - needs_nuspec_data = Util::any_of(m_providers, [](auto& provider) { return provider->needs_nuspec_data(); }); - } - - void BinaryCache::install_providers_for(const VcpkgCmdArguments& args, const VcpkgPaths& paths) - { - if (args.binary_caching_enabled()) - { - install_providers( - create_binary_providers_from_configs(paths, args.binary_sources).value_or_exit(VCPKG_LINE_INFO)); - } - } - - RestoreResult BinaryCache::try_restore(const InstallPlanAction& action) - { - const auto abi = action.package_abi().get(); - if (!abi) - { - // e.g. this is a `--head` package - return RestoreResult::unavailable; - } - - auto& cache_status = m_status[*abi]; - if (cache_status.is_restored()) - { - return RestoreResult::restored; - } - - const auto available = cache_status.get_available_provider(); - if (available) - { - switch (available->try_restore(action)) - { - case RestoreResult::unavailable: - // Even though that provider thought it had it, it didn't; perhaps - // due to intermittent network problems etc. - // Try other providers below - break; - case RestoreResult::restored: cache_status.mark_restored(); return RestoreResult::restored; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - - for (auto&& provider : m_providers) - { - if (provider.get() == available) - { - continue; // this one already tried :) - } - - if (cache_status.is_unavailable(m_providers.size())) - { - break; - } - - switch (provider->try_restore(action)) - { - case RestoreResult::restored: cache_status.mark_restored(); return RestoreResult::restored; - case RestoreResult::unavailable: cache_status.mark_unavailable(provider.get()); break; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - - return RestoreResult::unavailable; - } - - void BinaryCache::push_success(const InstallPlanAction& action, Path package_dir) - { - if (action.package_abi().has_value()) - { - std::string nuspec; - if (needs_nuspec_data) - { - NugetReference nuget_ref = make_nugetref(action, get_nuget_prefix()); - nuspec = generate_nuspec(package_dir, action, nuget_ref); - } - size_t num_destinations = 0; - BinaryProviderPushRequest request{BinaryPackageInformation{action, std::move(nuspec)}, package_dir}; - for (auto&& provider : m_providers) - { - num_destinations += provider->push_success(request, stdout_sink); - } - stdout_sink.println(msgStoredBinariesToDestinations, msg::count = num_destinations); - } - if (action.build_options.clean_packages == CleanPackages::YES) - { - filesystem.remove_all(package_dir, VCPKG_LINE_INFO); - } - } - - void BinaryCache::prefetch(View actions) - { - std::vector cache_status{actions.size()}; - for (size_t idx = 0; idx < actions.size(); ++idx) - { - const auto abi = actions[idx].package_abi().get(); - if (abi) - { - cache_status[idx] = &m_status[*abi]; - } - } - - for (auto&& provider : m_providers) - { - provider->prefetch(actions, cache_status); - for (auto status : cache_status) - { - if (status) - { - status->mark_unavailable(provider.get()); - } - } - } - } - - std::vector BinaryCache::precheck(View actions) - { - std::vector cache_status{actions.size()}; - for (size_t idx = 0; idx < actions.size(); ++idx) - { - auto& action = actions[idx]; - const auto abi = action.package_abi().get(); - if (!abi) - { - Checks::unreachable(VCPKG_LINE_INFO, fmt::format("{} did not have an ABI", action.spec)); - } - - cache_status[idx] = &m_status[*abi]; - } - - for (auto&& provider : m_providers) - { - provider->precheck(actions, cache_status); - } - - std::vector results{actions.size()}; - for (size_t idx = 0; idx < results.size(); ++idx) - { - results[idx] = cache_status[idx]->get_available_provider() ? CacheAvailability::available - : CacheAvailability::unavailable; - } - - return results; - } - - bool CacheStatus::should_attempt_precheck(const IBinaryProvider* sender) const noexcept - { - switch (m_status) - { - case CacheStatusState::unknown: return !Util::Vectors::contains(m_known_unavailable_providers, sender); - case CacheStatusState::available: return false; - case CacheStatusState::restored: return false; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - - bool CacheStatus::should_attempt_restore(const IBinaryProvider* sender) const noexcept - { - switch (m_status) - { - case CacheStatusState::unknown: return !Util::Vectors::contains(m_known_unavailable_providers, sender); - case CacheStatusState::available: return m_available_provider == sender; - case CacheStatusState::restored: return false; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - - bool CacheStatus::is_unavailable(size_t total_providers) const noexcept - { - switch (m_status) - { - case CacheStatusState::unknown: return m_known_unavailable_providers.size() <= total_providers; - case CacheStatusState::available: - case CacheStatusState::restored: return false; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - - bool CacheStatus::is_restored() const noexcept { return m_status == CacheStatusState::restored; } - - void CacheStatus::mark_unavailable(const IBinaryProvider* sender) - { - switch (m_status) - { - case CacheStatusState::unknown: - if (!Util::Vectors::contains(m_known_unavailable_providers, sender)) - { - m_known_unavailable_providers.push_back(sender); - } - break; - case CacheStatusState::available: - case CacheStatusState::restored: break; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - void CacheStatus::mark_available(const IBinaryProvider* sender) noexcept - { - switch (m_status) - { - case CacheStatusState::unknown: - m_known_unavailable_providers.~vector(); - m_status = CacheStatusState::available; - m_available_provider = sender; - break; - case CacheStatusState::available: - case CacheStatusState::restored: break; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - - void CacheStatus::mark_restored() noexcept - { - switch (m_status) - { - case CacheStatusState::unknown: m_known_unavailable_providers.~vector(); [[fallthrough]]; - case CacheStatusState::available: m_status = CacheStatusState::restored; break; - case CacheStatusState::restored: break; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - - const IBinaryProvider* CacheStatus::get_available_provider() const noexcept - { - switch (m_status) - { - case CacheStatusState::available: return m_available_provider; - case CacheStatusState::unknown: - case CacheStatusState::restored: return nullptr; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - } - - void BinaryConfigParserState::clear() - { - binary_cache_providers.clear(); - binary_cache_providers.insert("clear"); - nuget_interactive = false; - nugettimeout = "100"; - archives_to_read.clear(); - archives_to_write.clear(); - url_templates_to_get.clear(); - url_templates_to_put.clear(); - gcs_read_prefixes.clear(); - gcs_write_prefixes.clear(); - aws_read_prefixes.clear(); - aws_write_prefixes.clear(); - aws_no_sign_request = false; - cos_read_prefixes.clear(); - cos_write_prefixes.clear(); - gha_read = false; - gha_write = false; - sources_to_read.clear(); - sources_to_write.clear(); - configs_to_read.clear(); - configs_to_write.clear(); - secrets.clear(); - } - - BinaryPackageInformation::BinaryPackageInformation(const InstallPlanAction& action, Optional nuspec) - : package_abi(action.package_abi().value_or_exit(VCPKG_LINE_INFO)) - , spec(action.spec) - , raw_version(action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO) - .source_control_file->core_paragraph->raw_version) - , nuspec(std::move(nuspec)) - { - } -} - -namespace -{ - ExpectedL default_cache_path_impl() + ExpectedL default_cache_path_impl() { auto maybe_cachepath = get_environment_variable("VCPKG_DEFAULT_BINARY_CACHE"); if (auto p_str = maybe_cachepath.get()) @@ -1870,7 +1198,7 @@ namespace get_global_metrics_collector().track_define(DefineMetric::VcpkgDefaultBinaryCache); Path path = std::move(*p_str); path.make_preferred(); - if (!get_real_filesystem().is_directory(path)) + if (!real_filesystem.is_directory(path)) { return msg::format(msgDefaultBinaryCacheRequiresDirectory, msg::path = path); } @@ -2026,14 +1354,8 @@ namespace return add_error(msg::format(msgNugetTimeoutExpectsSinglePositiveInteger)); } - auto&& t = segments[1].second; - if (t.empty()) - { - return add_error(msg::format(msgNugetTimeoutExpectsSinglePositiveInteger)); - } - char* end; - long timeout = std::strtol(t.c_str(), &end, 0); - if (*end != '\0' || timeout <= 0) + long timeout = Strings::strto(segments[1].second).value_or(-1); + if (timeout <= 0) { return add_error(msg::format(msgNugetTimeoutExpectsSinglePositiveInteger)); } @@ -2106,10 +1428,12 @@ namespace p.append(segments[2].second); state->secrets.push_back(segments[2].second); UrlTemplate url_template = {p}; + bool read = false, write = false; + handle_readwrite(read, write, segments, 3); + if (read) state->url_templates_to_get.push_back(url_template); auto headers = azure_blob_headers(); - url_template.headers_for_put.assign(headers.begin(), headers.end()); - handle_readwrite( - state->url_templates_to_get, state->url_templates_to_put, std::move(url_template), segments, 3); + url_template.headers.assign(headers.begin(), headers.end()); + if (write) state->url_templates_to_put.push_back(url_template); state->binary_cache_providers.insert("azblob"); } @@ -2189,7 +1513,7 @@ namespace msg::binary_source = "x-aws-config")); } - auto no_sign_request = false; + bool no_sign_request = false; if (segments[1].second == "no-sign-request") { no_sign_request = true; @@ -2281,8 +1605,7 @@ namespace } if (segments.size() == 4) { - url_template.headers_for_get.push_back(segments[3].second); - url_template.headers_for_put.push_back(segments[3].second); + url_template.headers.push_back(segments[3].second); } handle_readwrite( @@ -2293,150 +1616,681 @@ namespace { return add_error(msg::format(msgUnknownBinaryProviderType), segments[0].first); } + } + }; - static const std::map metric_names{ - {"aws", DefineMetric::BinaryCachingAws}, - {"azblob", DefineMetric::BinaryCachingAzBlob}, - {"cos", DefineMetric::BinaryCachingCos}, - {"default", DefineMetric::BinaryCachingDefault}, - {"files", DefineMetric::BinaryCachingFiles}, - {"gcs", DefineMetric::BinaryCachingGcs}, - {"http", DefineMetric::BinaryCachingHttp}, - {"nuget", DefineMetric::BinaryCachingNuget}, - }; + struct AssetSourcesState + { + bool cleared = false; + bool block_origin = false; + std::vector url_templates_to_get; + std::vector azblob_templates_to_put; + std::vector secrets; + Optional script; - MetricsSubmission metrics; - for (const auto& cache_provider : state->binary_cache_providers) + void clear() + { + cleared = true; + block_origin = false; + url_templates_to_get.clear(); + azblob_templates_to_put.clear(); + secrets.clear(); + script = nullopt; + } + }; + + struct AssetSourcesParser : ConfigSegmentsParser + { + AssetSourcesParser(StringView text, StringView origin, AssetSourcesState* state) + : ConfigSegmentsParser(text, origin), state(state) + { + } + + AssetSourcesState* state; + + void parse() + { + auto all_segments = parse_all_segments(); + for (auto&& x : all_segments) + { + if (get_error()) return; + handle_segments(std::move(x)); + } + } + + void handle_segments(std::vector>&& segments) + { + Checks::check_exit(VCPKG_LINE_INFO, !segments.empty()); + + if (segments[0].second == "x-block-origin") + { + if (segments.size() >= 2) + { + return add_error( + msg::format(msgAssetCacheProviderAcceptsNoArguments, msg::value = "x-block-origin"), + segments[1].first); + } + + state->block_origin = true; + } + else if (segments[0].second == "clear") + { + if (segments.size() >= 2) + { + return add_error(msg::format(msgAssetCacheProviderAcceptsNoArguments, msg::value = "clear"), + segments[1].first); + } + + state->clear(); + } + else if (segments[0].second == "x-azurl") + { + // Scheme: x-azurl,[,[,]] + if (segments.size() < 2) + { + return add_error(msg::format(msgAzUrlAssetCacheRequiresBaseUrl), segments[0].first); + } + + if (segments.size() > 4) + { + return add_error(msg::format(msgAzUrlAssetCacheRequiresLessThanFour), segments[4].first); + } + + if (segments[1].second.empty()) + { + return add_error(msg::format(msgAzUrlAssetCacheRequiresBaseUrl), segments[1].first); + } + + auto p = segments[1].second; + if (p.back() != '/') + { + p.push_back('/'); + } + + p.append(""); + if (segments.size() > 2 && !segments[2].second.empty()) + { + if (!Strings::starts_with(segments[2].second, "?")) + { + p.push_back('?'); + } + p.append(segments[2].second); + // Note: the download manager does not currently respect secrets + state->secrets.push_back(segments[2].second); + } + handle_readwrite( + state->url_templates_to_get, state->azblob_templates_to_put, std::move(p), segments, 3); + } + else if (segments[0].second == "x-script") + { + // Scheme: x-script, + if (segments.size() != 2) + { + return add_error(msg::format(msgScriptAssetCacheRequiresScript), segments[0].first); + } + state->script = segments[1].second; + } + else + { + // Don't forget to update this message if new providers are added. + return add_error(msg::format(msgUnexpectedAssetCacheProvider), segments[0].first); + } + } + }; +} + +namespace vcpkg +{ + LocalizedString UrlTemplate::valid() const + { + std::vector invalid_keys; + auto result = api_stable_format(url_template, [&](std::string&, StringView key) { + static constexpr std::array valid_keys = {"name", "version", "sha", "triplet"}; + if (!Util::Vectors::contains(valid_keys, key)) + { + invalid_keys.push_back(key.to_string()); + } + }); + if (!result) + { + return result.error(); + } + if (!invalid_keys.empty()) + { + return msg::format(msgUnknownVariablesInTemplate, + msg::value = url_template, + msg::list = Strings::join(", ", invalid_keys)); + } + return {}; + } + + std::string UrlTemplate::instantiate_variables(const BinaryPackageReadInfo& info) const + { + return api_stable_format(url_template, + [&](std::string& out, StringView key) { + if (key == "version") + { + out += info.raw_version; + } + else if (key == "name") + { + out += info.spec.name(); + } + else if (key == "triplet") + { + out += info.spec.triplet().canonical_name(); + } + else if (key == "sha") + { + out += info.package_abi; + } + else + { + Debug::println("Unknown key: ", key); + // We do a input validation while parsing the config + Checks::unreachable(VCPKG_LINE_INFO); + }; + }) + .value_or_exit(VCPKG_LINE_INFO); + } + + static NuGetRepoInfo get_nuget_repo_info_from_env(const VcpkgCmdArguments& args) + { + if (auto p = args.vcpkg_nuget_repository.get()) + { + get_global_metrics_collector().track_define(DefineMetric::VcpkgNugetRepository); + return {*p}; + } + + auto gh_repo = get_environment_variable("GITHUB_REPOSITORY").value_or(""); + if (gh_repo.empty()) + { + return {}; + } + + auto gh_server = get_environment_variable("GITHUB_SERVER_URL").value_or(""); + if (gh_server.empty()) + { + return {}; + } + + get_global_metrics_collector().track_define(DefineMetric::GitHubRepository); + return {Strings::concat(gh_server, '/', gh_repo, ".git"), + get_environment_variable("GITHUB_REF").value_or(""), + get_environment_variable("GITHUB_SHA").value_or("")}; + } + + static ExpectedL make_binary_providers(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + { + BinaryProviders ret; + if (args.binary_caching_enabled()) + { + if (Debug::g_debugging) + { + const auto& maybe_cachepath = default_cache_path(); + if (const auto cachepath = maybe_cachepath.get()) + { + Debug::print("Default binary cache path is: ", *cachepath, '\n'); + } + else + { + Debug::print("No binary cache path. Reason: ", maybe_cachepath.error(), '\n'); + } + } + + if (args.env_binary_sources.has_value()) + { + get_global_metrics_collector().track_define(DefineMetric::VcpkgBinarySources); + } + + if (args.cli_binary_sources.size() != 0) + { + get_global_metrics_collector().track_define(DefineMetric::BinaryCachingSource); + } + + auto sRawHolder = + parse_binary_provider_configs(args.env_binary_sources.value_or(""), args.cli_binary_sources); + if (!sRawHolder) + { + return std::move(sRawHolder).error(); + } + auto& s = *sRawHolder.get(); + + static const std::map metric_names{ + {"aws", DefineMetric::BinaryCachingAws}, + {"azblob", DefineMetric::BinaryCachingAzBlob}, + {"cos", DefineMetric::BinaryCachingCos}, + {"default", DefineMetric::BinaryCachingDefault}, + {"files", DefineMetric::BinaryCachingFiles}, + {"gcs", DefineMetric::BinaryCachingGcs}, + {"http", DefineMetric::BinaryCachingHttp}, + {"nuget", DefineMetric::BinaryCachingNuget}, + }; + + MetricsSubmission metrics; + for (const auto& cache_provider : s.binary_cache_providers) + { + auto it = metric_names.find(cache_provider); + if (it != metric_names.end()) + { + metrics.track_define(it->second); + } + } + + get_global_metrics_collector().track_submission(std::move(metrics)); + + s.nuget_prefix = args.nuget_id_prefix.value_or(""); + if (!s.nuget_prefix.empty()) s.nuget_prefix.push_back('_'); + s.use_nuget_cache = args.use_nuget_cache.value_or(false); + s.nuget_repo_info = get_nuget_repo_info_from_env(args); + + auto& fs = paths.get_filesystem(); + auto& tools = paths.get_tool_cache(); + const auto& buildtrees = paths.buildtrees(); + + ret.nuget_prefix = s.nuget_prefix; + + std::shared_ptr gcs_tool; + if (!s.gcs_read_prefixes.empty() || !s.gcs_write_prefixes.empty()) + { + gcs_tool = std::make_shared(tools, stdout_sink); + } + std::shared_ptr aws_tool; + if (!s.aws_read_prefixes.empty() || !s.aws_write_prefixes.empty()) + { + aws_tool = std::make_shared(tools, stdout_sink, s.aws_no_sign_request); + } + std::shared_ptr cos_tool; + if (!s.cos_read_prefixes.empty() || !s.cos_write_prefixes.empty()) + { + cos_tool = std::make_shared(tools, stdout_sink); + } + + if (s.gha_read || s.gha_write) + { + if (!args.actions_cache_url.has_value() || !args.actions_runtime_token.has_value()) + return msg::format_error(msgGHAParametersMissing, + msg::url = "https://learn.microsoft.com/vcpkg/users/binarycaching#gha"); + } + + if (!s.archives_to_read.empty() || !s.url_templates_to_get.empty() || !s.gcs_read_prefixes.empty() || + !s.aws_read_prefixes.empty() || !s.cos_read_prefixes.empty() || s.gha_read) + { + auto maybe_zip_tool = ZipTool::make(tools, stdout_sink); + if (!maybe_zip_tool.has_value()) + { + return std::move(maybe_zip_tool).error(); + } + const auto& zip_tool = *maybe_zip_tool.get(); + + for (auto&& dir : s.archives_to_read) + { + ret.read.push_back(std::make_unique(zip_tool, fs, std::move(dir))); + } + + for (auto&& url : s.url_templates_to_get) + { + ret.read.push_back( + std::make_unique(zip_tool, fs, buildtrees, std::move(url), s.secrets)); + } + + for (auto&& prefix : s.gcs_read_prefixes) + { + ret.read.push_back( + std::make_unique(zip_tool, fs, buildtrees, std::move(prefix), gcs_tool)); + } + + for (auto&& prefix : s.aws_read_prefixes) + { + ret.read.push_back( + std::make_unique(zip_tool, fs, buildtrees, std::move(prefix), aws_tool)); + } + + for (auto&& prefix : s.cos_read_prefixes) + { + ret.read.push_back( + std::make_unique(zip_tool, fs, buildtrees, std::move(prefix), cos_tool)); + } + + if (s.gha_read) + { + const auto& url = *args.actions_cache_url.get(); + const auto& token = *args.actions_runtime_token.get(); + ret.read.push_back(std::make_unique(zip_tool, fs, buildtrees, url, token)); + } + } + if (!s.archives_to_write.empty()) + { + ret.write.push_back(std::make_unique(fs, std::move(s.archives_to_write))); + } + if (!s.url_templates_to_put.empty()) + { + ret.write.push_back( + std::make_unique(fs, std::move(s.url_templates_to_put), s.secrets)); + } + if (!s.gcs_write_prefixes.empty()) + { + ret.write.push_back( + std::make_unique(std::move(s.gcs_write_prefixes), gcs_tool)); + } + if (!s.aws_write_prefixes.empty()) + { + ret.write.push_back( + std::make_unique(std::move(s.aws_write_prefixes), aws_tool)); + } + if (!s.cos_write_prefixes.empty()) + { + ret.write.push_back( + std::make_unique(std::move(s.cos_write_prefixes), cos_tool)); + } + if (s.gha_write) + { + const auto& url = *args.actions_cache_url.get(); + const auto& token = *args.actions_runtime_token.get(); + ret.write.push_back(std::make_unique(fs, url, token)); + } + + if (!s.sources_to_read.empty() || !s.configs_to_read.empty() || !s.sources_to_write.empty() || + !s.configs_to_write.empty()) + { + NugetBaseBinaryProvider nuget_base( + fs, NuGetTool(tools, stdout_sink, s), paths.packages(), buildtrees, s.nuget_prefix); + if (!s.sources_to_read.empty()) + ret.read.push_back( + std::make_unique(nuget_base, nuget_sources_arg(s.sources_to_read))); + for (auto&& config : s.configs_to_read) + ret.read.push_back( + std::make_unique(nuget_base, nuget_configfile_arg(config))); + if (!s.sources_to_write.empty() || !s.configs_to_write.empty()) + { + ret.write.push_back(std::make_unique( + nuget_base, std::move(s.sources_to_write), std::move(s.configs_to_write))); + } + } + } + return std::move(ret); + } + + ReadOnlyBinaryCache::ReadOnlyBinaryCache(BinaryProviders&& providers) : m_config(std::move(providers)) { } + + void ReadOnlyBinaryCache::fetch(View actions) + { + std::vector action_ptrs; + std::vector restores; + std::vector statuses; + for (auto&& provider : m_config.read) + { + action_ptrs.clear(); + restores.clear(); + statuses.clear(); + for (size_t i = 0; i < actions.size(); ++i) + { + if (actions[i].package_abi()) + { + CacheStatus& status = m_status[*actions[i].package_abi().get()]; + if (status.should_attempt_restore(provider.get())) + { + action_ptrs.push_back(&actions[i]); + restores.push_back(RestoreResult::unavailable); + statuses.push_back(&status); + } + } + } + if (action_ptrs.empty()) continue; + + ElapsedTimer timer; + provider->fetch(action_ptrs, restores); + size_t num_restored = 0; + for (size_t i = 0; i < restores.size(); ++i) { - auto it = metric_names.find(cache_provider); - if (it != metric_names.end()) + if (restores[i] == RestoreResult::unavailable) { - metrics.track_define(it->second); + statuses[i]->mark_unavailable(provider.get()); + } + else + { + statuses[i]->mark_restored(); + ++num_restored; } } - - get_global_metrics_collector().track_submission(std::move(metrics)); + msg::println(provider->restored_message( + num_restored, timer.elapsed().as())); } - }; + } - struct AssetSourcesState + bool ReadOnlyBinaryCache::is_restored(const InstallPlanAction& action) const { - bool cleared = false; - bool block_origin = false; - std::vector url_templates_to_get; - std::vector azblob_templates_to_put; - std::vector secrets; - Optional script; - - void clear() + if (auto abi = action.package_abi().get()) { - cleared = true; - block_origin = false; - url_templates_to_get.clear(); - azblob_templates_to_put.clear(); - secrets.clear(); - script = nullopt; + auto it = m_status.find(*abi); + if (it != m_status.end()) return it->second.is_restored(); } - }; + return false; + } - struct AssetSourcesParser : ConfigSegmentsParser + std::vector ReadOnlyBinaryCache::precheck(View actions) { - AssetSourcesParser(StringView text, StringView origin, AssetSourcesState* state) - : ConfigSegmentsParser(text, origin), state(state) - { - } - - AssetSourcesState* state; + std::vector statuses = Util::fmap(actions, [this](const auto& action) { + if (!action.package_abi()) Checks::unreachable(VCPKG_LINE_INFO); + return &m_status[*action.package_abi().get()]; + }); - void parse() + std::vector action_ptrs; + std::vector cache_result; + std::vector indexes; + for (auto&& provider : m_config.read) { - auto all_segments = parse_all_segments(); - for (auto&& x : all_segments) + action_ptrs.clear(); + cache_result.clear(); + indexes.clear(); + for (size_t i = 0; i < actions.size(); ++i) { - if (get_error()) return; - handle_segments(std::move(x)); + if (statuses[i]->should_attempt_precheck(provider.get())) + { + action_ptrs.push_back(&actions[i]); + cache_result.push_back(CacheAvailability::unknown); + indexes.push_back(i); + } } - } + if (action_ptrs.empty()) continue; - void handle_segments(std::vector>&& segments) - { - Checks::check_exit(VCPKG_LINE_INFO, !segments.empty()); + provider->precheck(action_ptrs, cache_result); - if (segments[0].second == "x-block-origin") + for (size_t i = 0; i < action_ptrs.size(); ++i) { - if (segments.size() >= 2) + auto&& this_status = m_status[*action_ptrs[i]->package_abi().get()]; + if (cache_result[i] == CacheAvailability::available) { - return add_error( - msg::format(msgAssetCacheProviderAcceptsNoArguments, msg::value = "x-block-origin"), - segments[1].first); + this_status.mark_available(provider.get()); } - - state->block_origin = true; - } - else if (segments[0].second == "clear") - { - if (segments.size() >= 2) + else if (cache_result[i] == CacheAvailability::unavailable) { - return add_error(msg::format(msgAssetCacheProviderAcceptsNoArguments, msg::value = "clear"), - segments[1].first); + this_status.mark_unavailable(provider.get()); } - - state->clear(); } - else if (segments[0].second == "x-azurl") + } + + return Util::fmap(statuses, [](CacheStatus* s) { + return s->get_available_provider() ? CacheAvailability::available : CacheAvailability::unavailable; + }); + } + + BinaryCache::BinaryCache(const Filesystem& fs) : m_fs(fs) { } + + ExpectedL BinaryCache::make(const VcpkgCmdArguments& args, const VcpkgPaths& paths, MessageSink& sink) + { + return make_binary_providers(args, paths).then([&](BinaryProviders&& p) -> ExpectedL { + BinaryCache b(std::move(p), paths.get_filesystem()); + b.m_needs_nuspec_data = Util::any_of(b.m_config.write, [](auto&& p) { return p->needs_nuspec_data(); }); + b.m_needs_zip_file = Util::any_of(b.m_config.write, [](auto&& p) { return p->needs_zip_file(); }); + if (b.m_needs_zip_file) { - // Scheme: x-azurl,[,[,]] - if (segments.size() < 2) + auto maybe_zt = ZipTool::make(paths.get_tool_cache(), sink); + if (auto z = maybe_zt.get()) { - return add_error(msg::format(msgAzUrlAssetCacheRequiresBaseUrl), segments[0].first); + b.m_zip_tool.emplace(std::move(*z)); } - - if (segments.size() > 4) + else { - return add_error(msg::format(msgAzUrlAssetCacheRequiresLessThanFour), segments[4].first); + return std::move(maybe_zt).error(); } + } + return std::move(b); + }); + } - if (segments[1].second.empty()) + BinaryCache::BinaryCache(BinaryProviders&& providers, const Filesystem& fs) + : ReadOnlyBinaryCache(std::move(providers)), m_fs(fs) + { + } + BinaryCache::~BinaryCache() { } + + void BinaryCache::push_success(const InstallPlanAction& action) + { + if (auto abi = action.package_abi().get()) + { + bool restored = m_status[*abi].is_restored(); + // Purge all status information on push_success (cache invalidation) + // - push_success may delete packages/ (invalidate restore) + // - push_success may make the package available from providers (invalidate unavailable) + m_status.erase(*abi); + if (!restored && !m_config.write.empty()) + { + ElapsedTimer timer; + BinaryPackageWriteInfo request{action}; + + if (m_needs_nuspec_data) { - return add_error(msg::format(msgAzUrlAssetCacheRequiresBaseUrl), segments[1].first); + request.nuspec = + generate_nuspec(request.package_dir, action, m_config.nuget_prefix, m_config.nuget_repo); } - - auto p = segments[1].second; - if (p.back() != '/') + if (m_needs_zip_file) { - p.push_back('/'); + Path zip_path = request.package_dir + ".zip"; + auto compress_result = m_zip_tool.value_or_exit(VCPKG_LINE_INFO) + .compress_directory_to_zip(m_fs, request.package_dir, zip_path); + if (compress_result) + { + request.zip_path = std::move(zip_path); + } + else + { + stdout_sink.println( + Color::warning, + msg::format_warning(msgCompressFolderFailed, msg::path = request.package_dir) + .append_raw(' ') + .append_raw(compress_result.error())); + } } - p.append(""); - if (segments.size() > 2 && !segments[2].second.empty()) + size_t num_destinations = 0; + for (auto&& provider : m_config.write) { - if (!Strings::starts_with(segments[2].second, "?")) + if (!provider->needs_zip_file() || request.zip_path.has_value()) { - p.push_back('?'); + num_destinations += provider->push_success(request, stdout_sink); } - p.append(segments[2].second); - // Note: the download manager does not currently respect secrets - state->secrets.push_back(segments[2].second); } - handle_readwrite( - state->url_templates_to_get, state->azblob_templates_to_put, std::move(p), segments, 3); - } - else if (segments[0].second == "x-script") - { - // Scheme: x-script, - if (segments.size() != 2) + if (request.zip_path) { - return add_error(msg::format(msgScriptAssetCacheRequiresScript), segments[0].first); + m_fs.remove(*request.zip_path.get(), IgnoreErrors{}); } - state->script = segments[1].second; - } - else - { - // Don't forget to update this message if new providers are added. - return add_error(msg::format(msgUnexpectedAssetCacheProvider), segments[0].first); + stdout_sink.println( + msgStoredBinariesToDestinations, msg::count = num_destinations, msg::elapsed = timer.elapsed()); } } - }; + if (action.build_options.clean_packages == CleanPackages::YES) + { + m_fs.remove_all(action.package_dir.value_or_exit(VCPKG_LINE_INFO), VCPKG_LINE_INFO); + } + } + + bool CacheStatus::should_attempt_precheck(const IReadBinaryProvider* sender) const noexcept + { + switch (m_status) + { + case CacheStatusState::unknown: return !Util::Vectors::contains(m_known_unavailable_providers, sender); + case CacheStatusState::available: return false; + case CacheStatusState::restored: return false; + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + bool CacheStatus::should_attempt_restore(const IReadBinaryProvider* sender) const noexcept + { + switch (m_status) + { + case CacheStatusState::unknown: return !Util::Vectors::contains(m_known_unavailable_providers, sender); + case CacheStatusState::available: return m_available_provider == sender; + case CacheStatusState::restored: return false; + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + bool CacheStatus::is_unavailable(const IReadBinaryProvider* sender) const noexcept + { + return Util::Vectors::contains(m_known_unavailable_providers, sender); + } + + bool CacheStatus::is_restored() const noexcept { return m_status == CacheStatusState::restored; } + + void CacheStatus::mark_unavailable(const IReadBinaryProvider* sender) + { + if (!Util::Vectors::contains(m_known_unavailable_providers, sender)) + { + m_known_unavailable_providers.push_back(sender); + } + } + void CacheStatus::mark_available(const IReadBinaryProvider* sender) noexcept + { + switch (m_status) + { + case CacheStatusState::unknown: + m_status = CacheStatusState::available; + m_available_provider = sender; + break; + case CacheStatusState::available: + case CacheStatusState::restored: break; + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + void CacheStatus::mark_restored() noexcept + { + switch (m_status) + { + case CacheStatusState::unknown: m_known_unavailable_providers.clear(); [[fallthrough]]; + case CacheStatusState::available: m_status = CacheStatusState::restored; break; + case CacheStatusState::restored: break; + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + const IReadBinaryProvider* CacheStatus::get_available_provider() const noexcept + { + switch (m_status) + { + case CacheStatusState::available: return m_available_provider; + case CacheStatusState::unknown: + case CacheStatusState::restored: return nullptr; + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + void BinaryConfigParserState::clear() + { + *this = BinaryConfigParserState(); + binary_cache_providers.insert("clear"); + } + + BinaryPackageReadInfo::BinaryPackageReadInfo(const InstallPlanAction& action) + : package_abi(action.package_abi().value_or_exit(VCPKG_LINE_INFO)) + , spec(action.spec) + , raw_version(action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO) + .source_control_file->core_paragraph->raw_version) + , package_dir(action.package_dir.value_or_exit(VCPKG_LINE_INFO)) + { + } } ExpectedL vcpkg::parse_download_configuration(const Optional& arg) @@ -2453,23 +2307,23 @@ ExpectedL vcpkg::parse_download_configuration(const Optio { return LocalizedString::from_raw(err->to_string()) // note that this already contains error: .append_raw('\n') - .append(msg::msgNoteMessage) - .append(msg::msgSeeURL, msg::url = docs::assetcaching_url); + .append(msgNoteMessage) + .append(msgSeeURL, msg::url = docs::assetcaching_url); } if (s.azblob_templates_to_put.size() > 1) { return msg::format_error(msgAMaximumOfOneAssetWriteUrlCanBeSpecified) .append_raw('\n') - .append(msg::msgNoteMessage) - .append(msg::msgSeeURL, msg::url = docs::assetcaching_url); + .append(msgNoteMessage) + .append(msgSeeURL, msg::url = docs::assetcaching_url); } if (s.url_templates_to_get.size() > 1) { return msg::format_error(msgAMaximumOfOneAssetReadUrlCanBeSpecified) .append_raw('\n') - .append(msg::msgNoteMessage) - .append(msg::msgSeeURL, msg::url = docs::assetcaching_url); + .append(msgNoteMessage) + .append(msgSeeURL, msg::url = docs::assetcaching_url); } Optional get_url; @@ -2495,19 +2349,9 @@ ExpectedL vcpkg::parse_download_configuration(const Optio s.script}; } -ExpectedL vcpkg::create_binary_providers_from_configs_pure(const std::string& env_string, - View args) +ExpectedL vcpkg::parse_binary_provider_configs(const std::string& env_string, + View args) { - if (!env_string.empty()) - { - get_global_metrics_collector().track_define(DefineMetric::VcpkgBinarySources); - } - - if (args.size() != 0) - { - get_global_metrics_collector().track_define(DefineMetric::BinaryCachingSource); - } - BinaryConfigParserState s; BinaryConfigParser default_parser("default,readwrite", "", &s); @@ -2537,90 +2381,6 @@ ExpectedL vcpkg::create_binary_providers_from_configs_p return s; } -ExpectedL>> vcpkg::create_binary_providers_from_configs( - const VcpkgPaths& paths, View args) -{ - std::string env_string = get_environment_variable("VCPKG_BINARY_SOURCES").value_or(""); - if (Debug::g_debugging) - { - const auto& maybe_cachepath = default_cache_path(); - if (const auto cachepath = maybe_cachepath.get()) - { - Debug::print("Default binary cache path is: ", *cachepath, '\n'); - } - else - { - Debug::print("No binary cache path. Reason: ", maybe_cachepath.error(), '\n'); - } - } - - auto sRawHolder = create_binary_providers_from_configs_pure(env_string, args); - if (!sRawHolder) - { - return sRawHolder.error(); - } - - auto& s = sRawHolder.value_or_exit(VCPKG_LINE_INFO); - std::vector> providers; - if (!s.archives_to_read.empty() || !s.archives_to_write.empty() || !s.url_templates_to_put.empty()) - { - providers.push_back(std::make_unique(paths, - std::move(s.archives_to_read), - std::move(s.archives_to_write), - std::move(s.url_templates_to_put), - s.secrets)); - } - - if (!s.gcs_read_prefixes.empty() || !s.gcs_write_prefixes.empty()) - { - providers.push_back(std::make_unique( - paths, std::move(s.gcs_read_prefixes), std::move(s.gcs_write_prefixes))); - } - - if (!s.aws_read_prefixes.empty() || !s.aws_write_prefixes.empty()) - { - providers.push_back(std::make_unique( - paths, std::move(s.aws_read_prefixes), std::move(s.aws_write_prefixes), s.aws_no_sign_request)); - } - - if (!s.cos_read_prefixes.empty() || !s.cos_write_prefixes.empty()) - { - providers.push_back(std::make_unique( - paths, std::move(s.cos_read_prefixes), std::move(s.cos_write_prefixes))); - } - - if (s.gha_read || s.gha_write) - { - auto url = get_environment_variable("ACTIONS_CACHE_URL"); - auto token = get_environment_variable("ACTIONS_RUNTIME_TOKEN"); - Checks::msg_check_exit(VCPKG_LINE_INFO, - (url.has_value() && token.has_value()), - msgGHAParametersMissing, - msg::url = "https://learn.microsoft.com/en-us/vcpkg/users/binarycaching#gha"); - providers.push_back(std::make_unique(paths, s.gha_read, s.gha_write, url, token)); - } - - if (!s.url_templates_to_get.empty()) - { - providers.push_back( - std::make_unique(paths, std::move(s.url_templates_to_get), s.secrets)); - } - - if (!s.sources_to_read.empty() || !s.sources_to_write.empty() || !s.configs_to_read.empty() || - !s.configs_to_write.empty()) - { - providers.push_back(std::make_unique(paths, - std::move(s.sources_to_read), - std::move(s.sources_to_write), - std::move(s.configs_to_read), - std::move(s.configs_to_write), - std::move(s.nugettimeout), - s.nuget_interactive)); - } - - return providers; -} - std::string vcpkg::format_version_for_nugetref(StringView version, StringView abi_tag) { // this cannot use DotVersion::try_parse or DateVersion::try_parse, @@ -2649,43 +2409,17 @@ std::string vcpkg::format_version_for_nugetref(StringView version, StringView ab return Strings::concat("0.0.0-vcpkg", abi_tag); } -details::NuGetRepoInfo details::get_nuget_repo_info_from_env() -{ - auto vcpkg_nuget_repository = get_environment_variable("VCPKG_NUGET_REPOSITORY"); - if (auto p = vcpkg_nuget_repository.get()) - { - get_global_metrics_collector().track_define(DefineMetric::VcpkgNugetRepository); - return {std::move(*p)}; - } - - auto gh_repo = get_environment_variable("GITHUB_REPOSITORY").value_or(""); - if (gh_repo.empty()) - { - return {}; - } - - auto gh_server = get_environment_variable("GITHUB_SERVER_URL").value_or(""); - if (gh_server.empty()) - { - return {}; - } - - get_global_metrics_collector().track_define(DefineMetric::GitHubRepository); - return {Strings::concat(gh_server, '/', gh_repo, ".git"), - get_environment_variable("GITHUB_REF").value_or(""), - get_environment_variable("GITHUB_SHA").value_or("")}; -} - std::string vcpkg::generate_nuspec(const Path& package_dir, const InstallPlanAction& action, - const vcpkg::NugetReference& ref, - details::NuGetRepoInfo rinfo) + StringView id_prefix, + const NuGetRepoInfo& rinfo) { auto& spec = action.spec; auto& scf = *action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO).source_control_file; auto& version = scf.core_paragraph->raw_version; const auto& abi_info = action.abi_info.value_or_exit(VCPKG_LINE_INFO); const auto& compiler_info = abi_info.compiler_info.value_or_exit(VCPKG_LINE_INFO); + auto ref = make_nugetref(action, id_prefix); std::string description = Strings::concat("NOT FOR DIRECT USE. Automatically generated cache package.\n\n", Strings::join("\n ", scf.core_paragraph->description), @@ -2815,15 +2549,14 @@ LocalizedString vcpkg::format_help_topic_binary_caching() .append(msgExtendedDocumentationAtUrl, msg::url = docs::binarycaching_url); } -std::string vcpkg::generate_nuget_packages_config(const ActionPlan& action) +std::string vcpkg::generate_nuget_packages_config(const ActionPlan& plan, StringView prefix) { - auto refs = Util::fmap(action.install_actions, - [&](const InstallPlanAction& ipa) { return make_nugetref(ipa, get_nuget_prefix()); }); XmlSerializer xml; xml.emit_declaration().line_break(); xml.open_tag("packages").line_break(); - for (auto&& ref : refs) + for (auto&& action : plan.install_actions) { + auto ref = make_nugetref(action, prefix); xml.start_complex_open_tag("package") .text_attr("id", ref.id) .text_attr("version", ref.version) @@ -2834,3 +2567,12 @@ std::string vcpkg::generate_nuget_packages_config(const ActionPlan& action) xml.close_tag("packages").line_break(); return std::move(xml.buf); } + +NugetReference vcpkg::make_nugetref(const InstallPlanAction& action, StringView prefix) +{ + return ::make_nugetref(action.spec, + action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO) + .source_control_file->core_paragraph->raw_version, + action.abi_info.value_or_exit(VCPKG_LINE_INFO).package_abi, + prefix); +} diff --git a/src/vcpkg/binaryparagraph.cpp b/src/vcpkg/binaryparagraph.cpp index 1e448d965d..b412fa9154 100644 --- a/src/vcpkg/binaryparagraph.cpp +++ b/src/vcpkg/binaryparagraph.cpp @@ -29,7 +29,7 @@ namespace vcpkg BinaryParagraph::BinaryParagraph() = default; - BinaryParagraph::BinaryParagraph(Paragraph fields) + BinaryParagraph::BinaryParagraph(Paragraph&& fields) { ParagraphParser parser(std::move(fields)); @@ -101,38 +101,36 @@ namespace vcpkg } BinaryParagraph::BinaryParagraph(const SourceParagraph& spgh, + const std::vector& default_features, Triplet triplet, const std::string& abi_tag, - const std::vector& deps) + std::vector deps) : spec(spgh.name, triplet) , version(spgh.raw_version) , port_version(spgh.port_version) , description(spgh.description) , maintainers(spgh.maintainers) , feature() - , default_features(spgh.default_features) - , dependencies() + , default_features(default_features) + , dependencies(std::move(deps)) , abi(abi_tag) { - this->dependencies = Util::fmap(deps, [](const FeatureSpec& spec) { return spec.spec(); }); canonicalize(); } - BinaryParagraph::BinaryParagraph(const SourceParagraph& spgh, + BinaryParagraph::BinaryParagraph(const PackageSpec& spec, const FeatureParagraph& fpgh, - Triplet triplet, - const std ::vector& deps) - : spec(spgh.name, triplet) + std::vector deps) + : spec(spec) , version() , port_version() , description(fpgh.description) , maintainers() , feature(fpgh.name) , default_features() - , dependencies() + , dependencies(std::move(deps)) , abi() { - this->dependencies = Util::fmap(deps, [](const FeatureSpec& spec) { return spec.spec(); }); canonicalize(); } @@ -146,7 +144,7 @@ namespace vcpkg for (auto& maintainer : this->maintainers) { - maintainer = Strings::trim(std::move(maintainer)); + Strings::inplace_trim(maintainer); } if (all_empty(this->maintainers)) { @@ -155,7 +153,7 @@ namespace vcpkg for (auto& desc : this->description) { - desc = Strings::trim(std::move(desc)); + Strings::inplace_trim(desc); } if (all_empty(this->description)) { @@ -276,9 +274,9 @@ namespace vcpkg serialize_array(Fields::DEFAULT_FEATURES, pgh.default_features, out_str); // sanity check the serialized data - const auto my_paragraph = out_str.substr(initial_end); + auto my_paragraph = StringView{out_str}.substr(initial_end); auto parsed_paragraph = Paragraphs::parse_single_paragraph( - out_str.substr(initial_end), "vcpkg::serialize(const BinaryParagraph&, std::string&)"); + StringView{out_str}.substr(initial_end), "vcpkg::serialize(const BinaryParagraph&, std::string&)"); if (!parsed_paragraph) { Checks::msg_exit_maybe_upgrade( @@ -288,7 +286,7 @@ namespace vcpkg .append_raw(my_paragraph)); } - auto binary_paragraph = BinaryParagraph(*parsed_paragraph.get()); + auto binary_paragraph = BinaryParagraph(std::move(*parsed_paragraph.get())); if (binary_paragraph != pgh) { Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, @@ -300,9 +298,9 @@ namespace vcpkg } } - std::string format_binary_paragraph(BinaryParagraph paragraph) + std::string format_binary_paragraph(const BinaryParagraph& paragraph) { - constexpr StringLiteral join_str = R"(", ")"; + static constexpr StringLiteral join_str = R"(", ")"; return fmt::format( "\nspec: \"{}\"\nversion: \"{}\"\nport_version: {}\ndescription: [\"{}\"]\nmaintainers: [\"{}\"]\nfeature: " "\"{}\"\ndefault_features: [\"{}\"]\ndependencies: [\"{}\"]\nabi: \"{}\"", diff --git a/src/vcpkg/cgroup-parser.cpp b/src/vcpkg/cgroup-parser.cpp index 06939dd2f6..5ed6b85928 100644 --- a/src/vcpkg/cgroup-parser.cpp +++ b/src/vcpkg/cgroup-parser.cpp @@ -28,7 +28,7 @@ namespace vcpkg using P = ParserBase; constexpr auto is_separator_or_lineend = [](auto ch) { return ch == ':' || P::is_lineend(ch); }; - auto parser = ParserBase(text, origin); + ParserBase parser{text, origin}; parser.skip_whitespace(); std::vector ret; diff --git a/src/vcpkg/ci-baseline.cpp b/src/vcpkg/ci-baseline.cpp index 40fba32acc..3d1d1a6eaf 100644 --- a/src/vcpkg/ci-baseline.cpp +++ b/src/vcpkg/ci-baseline.cpp @@ -1,8 +1,8 @@ #include #include -#include #include +#include #include diff --git a/src/vcpkg/cmakevars.cpp b/src/vcpkg/cmakevars.cpp index 502091ac6f..5d1c199b5e 100644 --- a/src/vcpkg/cmakevars.cpp +++ b/src/vcpkg/cmakevars.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -14,20 +15,6 @@ using namespace vcpkg; namespace vcpkg::CMakeVars { - void CMakeVarProvider::load_tag_vars(const ActionPlan& action_plan, - const PortFileProvider& port_provider, - Triplet host_triplet) const - { - std::vector install_package_specs; - install_package_specs.reserve(action_plan.install_actions.size()); - for (auto&& action : action_plan.install_actions) - { - install_package_specs.emplace_back(action.spec, action.feature_list); - } - - load_tag_vars(install_package_specs, port_provider, host_triplet); - } - const std::unordered_map& CMakeVarProvider::get_or_load_dep_info_vars( const PackageSpec& spec, Triplet host_triplet) const { @@ -52,9 +39,7 @@ namespace vcpkg::CMakeVars void load_dep_info_vars(View specs, Triplet host_triplet) const override; - void load_tag_vars(View specs, - const PortFileProvider& port_provider, - Triplet host_triplet) const override; + void load_tag_vars(const ActionPlan& action_plan, Triplet host_triplet) const override; Optional&> get_generic_triplet_vars( Triplet triplet) const override; @@ -67,7 +52,7 @@ namespace vcpkg::CMakeVars public: Path create_tag_extraction_file( - const View> spec_abi_settings) const; + const View> spec_abi_settings) const; Path create_dep_info_extraction_file(const View specs) const; @@ -98,7 +83,7 @@ namespace vcpkg::CMakeVars for (auto&& p : emitted_triplets) { - auto path_to_triplet = paths.get_triplet_file_path(p.first); + auto path_to_triplet = paths.get_triplet_db().get_triplet_file_path(p.first); fmt::format_to(std::back_inserter(extraction_file), "if(VCPKG_TRIPLET_ID EQUAL {})\n" "set(CMAKE_CURRENT_LIST_FILE \"{}\")\n" @@ -120,19 +105,20 @@ endmacro() } Path TripletCMakeVarProvider::create_tag_extraction_file( - const View> spec_abi_settings) const + const View> spec_abi_settings) const { - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); static int tag_extract_id = 0; std::map emitted_triplets; int emitted_triplet_id = 0; for (const auto& spec_abi_setting : spec_abi_settings) { - emitted_triplets[spec_abi_setting.first->package_spec.triplet()] = emitted_triplet_id++; + emitted_triplets[spec_abi_setting.first.package_spec.triplet()] = emitted_triplet_id++; } std::string extraction_file = create_extraction_file_prelude(paths, emitted_triplets); + // The variables collected here are those necessary to perform builds. extraction_file.append(R"( function(vcpkg_get_tags PORT FEATURES VCPKG_TRIPLET_ID VCPKG_ABI_SETTINGS_FILE) @@ -166,6 +152,8 @@ VCPKG_ENV_PASSTHROUGH=${VCPKG_ENV_PASSTHROUGH} VCPKG_ENV_PASSTHROUGH_UNTRACKED=${VCPKG_ENV_PASSTHROUGH_UNTRACKED} VCPKG_LOAD_VCVARS_ENV=${VCPKG_LOAD_VCVARS_ENV} VCPKG_DISABLE_COMPILER_TRACKING=${VCPKG_DISABLE_COMPILER_TRACKING} +VCPKG_XBOX_CONSOLE_TARGET=${VCPKG_XBOX_CONSOLE_TARGET} +Z_VCPKG_GameDKLatest=$ENV{GameDKLatest} e1e74b5c-18cb-4474-a6bd-5c1c8bc81f3f 8c504940-be29-4cba-9f8f-6cd83e9d87b7") endfunction() @@ -173,7 +161,7 @@ endfunction() for (const auto& spec_abi_setting : spec_abi_settings) { - const FullPackageSpec& spec = *spec_abi_setting.first; + const FullPackageSpec& spec = spec_abi_setting.first; std::string featurelist; for (auto&& f : spec.features) @@ -199,7 +187,7 @@ endfunction() Path TripletCMakeVarProvider::create_dep_info_extraction_file(const View specs) const { static int dep_info_id = 0; - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); std::map emitted_triplets; int emitted_triplet_id = 0; @@ -210,6 +198,8 @@ endfunction() std::string extraction_file = create_extraction_file_prelude(paths, emitted_triplets); + // The variables collected here are those necessary to perform dependency resolution. + // If a value affects platform expressions, it must be here. extraction_file.append(R"( function(vcpkg_get_dep_info PORT VCPKG_TRIPLET_ID) @@ -228,6 +218,7 @@ CMAKE_HOST_SYSTEM_NAME=${CMAKE_HOST_SYSTEM_NAME} CMAKE_HOST_SYSTEM_PROCESSOR=${CMAKE_HOST_SYSTEM_PROCESSOR} CMAKE_HOST_SYSTEM_VERSION=${CMAKE_HOST_SYSTEM_VERSION} CMAKE_HOST_SYSTEM=${CMAKE_HOST_SYSTEM} +VCPKG_XBOX_CONSOLE_TARGET=${VCPKG_XBOX_CONSOLE_TARGET} e1e74b5c-18cb-4474-a6bd-5c1c8bc81f3f 8c504940-be29-4cba-9f8f-6cd83e9d87b7") endfunction() @@ -329,9 +320,8 @@ endfunction() { std::vector>> vars(1); // Hack: PackageSpecs should never have .name=="" - FullPackageSpec full_spec({"", triplet}, {}); - const auto file_path = create_tag_extraction_file(std::array, 1>{ - std::pair{&full_spec, ""}}); + const auto file_path = create_tag_extraction_file(std::array, 1>{ + std::pair{FullPackageSpec{{"", triplet}, {}}, ""}}); launch_and_split(file_path, vars); paths.get_filesystem().remove(file_path, VCPKG_LINE_INFO); @@ -339,9 +329,13 @@ endfunction() std::make_move_iterator(vars.front().end())); } - void TripletCMakeVarProvider::load_dep_info_vars(View specs, Triplet host_triplet) const + void TripletCMakeVarProvider::load_dep_info_vars(View original_specs, Triplet host_triplet) const { + std::vector specs = Util::filter(original_specs, [this](const PackageSpec& spec) { + return dep_resolution_vars.find(spec) == dep_resolution_vars.end(); + }); if (specs.size() == 0) return; + Debug::println("Loading dep info for: ", Strings::join(" ", specs)); std::vector>> vars(specs.size()); const auto file_path = create_dep_info_extraction_file(specs); if (specs.size() > 100) @@ -364,19 +358,18 @@ endfunction() } } - void TripletCMakeVarProvider::load_tag_vars(View specs, - const PortFileProvider& port_provider, - Triplet host_triplet) const + void TripletCMakeVarProvider::load_tag_vars(const ActionPlan& action_plan, Triplet host_triplet) const { - if (specs.size() == 0) return; - std::vector> spec_abi_settings; - spec_abi_settings.reserve(specs.size()); + if (action_plan.install_actions.empty()) return; + std::vector> spec_abi_settings; + spec_abi_settings.reserve(action_plan.install_actions.size()); - for (const FullPackageSpec& spec : specs) + for (const auto& install_action : action_plan.install_actions) { - auto& scfl = port_provider.get_control_file(spec.package_spec.name()).value_or_exit(VCPKG_LINE_INFO); + auto& scfl = install_action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO); const auto override_path = scfl.source_location / "vcpkg-abi-settings.cmake"; - spec_abi_settings.emplace_back(&spec, override_path.generic_u8string()); + spec_abi_settings.emplace_back(FullPackageSpec{install_action.spec, install_action.feature_list}, + override_path.generic_u8string()); } std::vector>> vars(spec_abi_settings.size()); @@ -387,7 +380,7 @@ endfunction() auto var_list_itr = vars.begin(); for (const auto& spec_abi_setting : spec_abi_settings) { - const FullPackageSpec& spec = *spec_abi_setting.first; + const FullPackageSpec& spec = spec_abi_setting.first; PlatformExpression::Context ctxt{std::make_move_iterator(var_list_itr->begin()), std::make_move_iterator(var_list_itr->end())}; ++var_list_itr; @@ -401,36 +394,18 @@ endfunction() Optional&> TripletCMakeVarProvider::get_generic_triplet_vars( Triplet triplet) const { - auto find_itr = generic_triplet_vars.find(triplet); - if (find_itr != generic_triplet_vars.end()) - { - return find_itr->second; - } - - return nullopt; + return Util::lookup_value(generic_triplet_vars, triplet); } Optional&> TripletCMakeVarProvider::get_dep_info_vars( const PackageSpec& spec) const { - auto find_itr = dep_resolution_vars.find(spec); - if (find_itr != dep_resolution_vars.end()) - { - return find_itr->second; - } - - return nullopt; + return Util::lookup_value(dep_resolution_vars, spec); } Optional&> TripletCMakeVarProvider::get_tag_vars( const PackageSpec& spec) const { - auto find_itr = tag_vars.find(spec); - if (find_itr != tag_vars.end()) - { - return find_itr->second; - } - - return nullopt; + return Util::lookup_value(tag_vars, spec); } } diff --git a/src/vcpkg/commands.acquire-project.cpp b/src/vcpkg/commands.acquire-project.cpp index e1309d2a31..098b5fb681 100644 --- a/src/vcpkg/commands.acquire-project.cpp +++ b/src/vcpkg/commands.acquire-project.cpp @@ -1,15 +1,30 @@ #include +#include #include #include #include -namespace vcpkg::Commands +namespace vcpkg { - void AcquireProjectCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + constexpr CommandMetadata CommandAcquireProjectMetadata{ + "acquire_project", + msgCmdAcquireProjectSynopsis, + {"vcpkg acquire-project"}, + Undocumented, + AutocompletePriority::Public, + 0, + 0, + {CommonAcquireArtifactSwitches}, + nullptr, + }; + + void command_acquire_project_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - Checks::exit_with_code( - VCPKG_LINE_INFO, - run_configure_environment_command(paths, "acquire-project", args.get_forwardable_arguments())); + auto parsed = args.parse_arguments(CommandAcquireProjectMetadata); + std::vector ecmascript_args; + ecmascript_args.emplace_back("acquire-project"); + forward_common_artifacts_arguments(ecmascript_args, parsed); + Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ecmascript_args)); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.acquire.cpp b/src/vcpkg/commands.acquire.cpp index 8c8196bec7..5443d0cbe5 100644 --- a/src/vcpkg/commands.acquire.cpp +++ b/src/vcpkg/commands.acquire.cpp @@ -1,14 +1,60 @@ #include +#include #include #include #include -namespace vcpkg::Commands +using namespace vcpkg; + +namespace +{ + constexpr StringLiteral OPTION_VERSION = "version"; + + constexpr CommandMultiSetting AcquireMultiOptions[] = { + {OPTION_VERSION, msgArtifactsOptionVersion}, + }; +} // unnamed namespace + +namespace vcpkg { - void AcquireCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + constexpr CommandMetadata CommandAcquireMetadata{ + "acquire", + msgCmdAcquireSynopsis, + {msgCmdAcquireExample1, "vcpkg acquire cmake"}, + Undocumented, + AutocompletePriority::Public, + 1, + SIZE_MAX, + {CommonAcquireArtifactSwitches, {}, AcquireMultiOptions}, + nullptr, + }; + + void command_acquire_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - Checks::exit_with_code(VCPKG_LINE_INFO, - run_configure_environment_command(paths, "acquire", args.get_forwardable_arguments())); + auto parsed = args.parse_arguments(CommandAcquireMetadata); + std::vector ecmascript_args; + ecmascript_args.emplace_back("acquire"); + forward_common_artifacts_arguments(ecmascript_args, parsed); + auto maybe_versions = Util::lookup_value(parsed.multisettings, OPTION_VERSION); + if (auto versions = maybe_versions.get()) + { + if (versions->size() != parsed.command_arguments.size()) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgArtifactsOptionVersionMismatch); + } + + for (auto&& version : *versions) + { + ecmascript_args.push_back("--version"); + ecmascript_args.push_back(version); + } + } + + ecmascript_args.insert(ecmascript_args.end(), + std::make_move_iterator(parsed.command_arguments.begin()), + std::make_move_iterator(parsed.command_arguments.end())); + + Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ecmascript_args)); } } diff --git a/src/vcpkg/commands.activate.cpp b/src/vcpkg/commands.activate.cpp index 1e3595788b..521bf98cc5 100644 --- a/src/vcpkg/commands.activate.cpp +++ b/src/vcpkg/commands.activate.cpp @@ -1,14 +1,43 @@ #include +#include #include #include #include -namespace vcpkg::Commands +using namespace vcpkg; + +namespace { - void ActivateCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + constexpr StringLiteral OPTION_MSBUILD_PROPS = "msbuild-props"; + constexpr StringLiteral OPTION_JSON = "json"; + + constexpr CommandSetting ActivateOptions[] = { + {OPTION_MSBUILD_PROPS, msgArtifactsOptionMSBuildProps}, + {OPTION_JSON, msgArtifactsOptionJson}, + }; +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandActivateMetadata{ + "activate", + msgCmdActivateSynopsis, + {"vcpkg activate"}, + Undocumented, + AutocompletePriority::Public, + 0, + 0, + {CommonAcquireArtifactSwitches, ActivateOptions}, + nullptr, + }; + + void command_activate_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - Checks::exit_with_code(VCPKG_LINE_INFO, - run_configure_environment_command(paths, "activate", args.get_forwardable_arguments())); + auto parsed = args.parse_arguments(CommandActivateMetadata); + std::vector ecmascript_args; + ecmascript_args.emplace_back("activate"); + forward_common_artifacts_arguments(ecmascript_args, parsed); + Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ecmascript_args)); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.add-version.cpp b/src/vcpkg/commands.add-version.cpp index 4a39cc8993..4e5af3c8db 100644 --- a/src/vcpkg/commands.add-version.cpp +++ b/src/vcpkg/commands.add-version.cpp @@ -25,18 +25,17 @@ namespace constexpr StringLiteral VERSION_DATE = "version-date"; constexpr StringLiteral VERSION_STRING = "version-string"; - static constexpr StringLiteral OPTION_ALL = "all"; - static constexpr StringLiteral OPTION_OVERWRITE_VERSION = "overwrite-version"; - static constexpr StringLiteral OPTION_SKIP_FORMATTING_CHECK = "skip-formatting-check"; - static constexpr StringLiteral OPTION_SKIP_VERSION_FORMAT_CHECK = "skip-version-format-check"; - static constexpr StringLiteral OPTION_VERBOSE = "verbose"; + constexpr StringLiteral OPTION_ALL = "all"; + constexpr StringLiteral OPTION_OVERWRITE_VERSION = "overwrite-version"; + constexpr StringLiteral OPTION_SKIP_FORMATTING_CHECK = "skip-formatting-check"; + constexpr StringLiteral OPTION_SKIP_VERSION_FORMAT_CHECK = "skip-version-format-check"; + constexpr StringLiteral OPTION_VERBOSE = "verbose"; enum class UpdateResult { Updated, NotUpdated }; - using VersionGitTree = std::pair; void insert_version_to_json_object(Json::Object& obj, const Version& version, StringLiteral version_field) { @@ -93,7 +92,7 @@ namespace } } - static Json::Object serialize_baseline(const std::map>& baseline) + Json::Object serialize_baseline(const std::map>& baseline) { Json::Object port_entries_obj; for (auto&& kv_pair : baseline) @@ -108,14 +107,14 @@ namespace return baseline_obj; } - static Json::Object serialize_versions(const std::vector& versions) + Json::Object serialize_versions(const std::vector& versions) { Json::Array versions_array; for (auto&& version : versions) { Json::Object version_obj; - version_obj.insert("git-tree", Json::Value::string(version.second)); - insert_schemed_version_to_json_object(version_obj, version.first); + version_obj.insert("git-tree", Json::Value::string(version.git_tree)); + insert_schemed_version_to_json_object(version_obj, version.version); versions_array.push_back(std::move(version_obj)); } @@ -124,9 +123,9 @@ namespace return output_object; } - static void write_baseline_file(Filesystem& fs, - const std::map>& baseline_map, - const Path& output_path) + void write_baseline_file(const Filesystem& fs, + const std::map>& baseline_map, + const Path& output_path) { auto new_path = output_path + ".tmp"; fs.create_directories(output_path.parent_path(), VCPKG_LINE_INFO); @@ -134,9 +133,9 @@ namespace fs.rename(new_path, output_path, VCPKG_LINE_INFO); } - static void write_versions_file(Filesystem& fs, - const std::vector& versions, - const Path& output_path) + void write_versions_file(const Filesystem& fs, + const std::vector& versions, + const Path& output_path) { auto new_path = output_path + ".tmp"; fs.create_directories(output_path.parent_path(), VCPKG_LINE_INFO); @@ -144,12 +143,12 @@ namespace fs.rename(new_path, output_path, VCPKG_LINE_INFO); } - static UpdateResult update_baseline_version(const VcpkgPaths& paths, - const std::string& port_name, - const Version& version, - const Path& baseline_path, - std::map>& baseline_map, - bool print_success) + UpdateResult update_baseline_version(const VcpkgPaths& paths, + const std::string& port_name, + const Version& version, + const Path& baseline_path, + std::map>& baseline_map, + bool print_success) { auto& fs = paths.get_filesystem(); @@ -184,15 +183,15 @@ namespace return UpdateResult::Updated; } - static UpdateResult update_version_db_file(const VcpkgPaths& paths, - const std::string& port_name, - const SchemedVersion& port_version, - const std::string& git_tree, - const Path& version_db_file_path, - bool overwrite_version, - bool print_success, - bool keep_going, - bool skip_version_format_check) + UpdateResult update_version_db_file(const VcpkgPaths& paths, + const std::string& port_name, + const SchemedVersion& port_version, + const std::string& git_tree, + const Path& version_db_file_path, + bool overwrite_version, + bool print_success, + bool keep_going, + bool skip_version_format_check) { auto& fs = paths.get_filesystem(); if (!fs.exists(version_db_file_path, IgnoreErrors{})) @@ -201,7 +200,7 @@ namespace { check_used_version_scheme(port_version, port_name); } - std::vector new_entry{{port_version, git_tree}}; + std::vector new_entry{{port_version, git_tree}}; write_versions_file(fs, new_entry, version_db_file_path); if (print_success) { @@ -215,120 +214,129 @@ namespace return UpdateResult::Updated; } - auto maybe_versions = get_builtin_versions(paths, port_name); - if (auto versions = maybe_versions.get()) + auto maybe_maybe_versions = get_builtin_versions(paths, port_name); + auto maybe_versions = maybe_maybe_versions.get(); + if (!maybe_versions) { - const auto& versions_end = versions->end(); + msg::println_error(msg::format(msgAddVersionUnableToParseVersionsFile, msg::path = version_db_file_path) + .append_raw('\n') + .append(maybe_maybe_versions.error())); + Checks::exit_fail(VCPKG_LINE_INFO); + } + + auto versions = maybe_versions->get(); + if (!versions) + { + Checks::unreachable(VCPKG_LINE_INFO, "Version file existed but was still unknown"); + } - auto found_same_sha = std::find_if( - versions->begin(), versions_end, [&](auto&& entry) -> bool { return entry.second == git_tree; }); - if (found_same_sha != versions_end) + const auto& versions_end = versions->end(); + auto found_same_sha = std::find_if( + versions->begin(), versions_end, [&](auto&& entry) -> bool { return entry.git_tree == git_tree; }); + if (found_same_sha != versions_end) + { + if (found_same_sha->version.version == port_version.version) { - if (found_same_sha->first.version == port_version.version) + if (print_success) { - if (print_success) - { - msg::println(Color::success, - msgAddVersionVersionAlreadyInFile, - msg::version = port_version.version, - msg::path = version_db_file_path); - } - return UpdateResult::NotUpdated; + msg::println(Color::success, + msgAddVersionVersionAlreadyInFile, + msg::version = port_version.version, + msg::path = version_db_file_path); } - msg::println_warning(msg::format(msgAddVersionPortFilesShaUnchanged, - msg::package_name = port_name, - msg::version = found_same_sha->first.version) - .append_raw("\n-- SHA: ") - .append_raw(git_tree) - .append_raw("\n-- ") - .append(msgAddVersionCommitChangesReminder) - .append_raw("\n***") - .append(msgAddVersionNoFilesUpdated) - .append_raw("***")); - if (keep_going) return UpdateResult::NotUpdated; - Checks::exit_fail(VCPKG_LINE_INFO); + return UpdateResult::NotUpdated; } + msg::println_warning(msg::format(msgAddVersionPortFilesShaUnchanged, + msg::package_name = port_name, + msg::version = found_same_sha->version.version) + .append_raw("\n-- SHA: ") + .append_raw(git_tree) + .append_raw("\n-- ") + .append(msgAddVersionCommitChangesReminder) + .append_raw("\n***") + .append(msgAddVersionNoFilesUpdated) + .append_raw("***")); + if (keep_going) return UpdateResult::NotUpdated; + Checks::exit_fail(VCPKG_LINE_INFO); + } - auto it = std::find_if( - versions->begin(), versions_end, [&](const std::pair& entry) -> bool { - return entry.first.version == port_version.version; - }); + auto it = std::find_if(versions->begin(), versions_end, [&](const GitVersionDbEntry& entry) -> bool { + return entry.version.version == port_version.version; + }); - if (it != versions_end) - { - if (!overwrite_version) - { - msg::println_error( - msg::format(msgAddVersionPortFilesShaChanged, msg::package_name = port_name) - .append_raw('\n') - .append(msgAddVersionVersionIs, msg::version = port_version.version) - .append_raw('\n') - .append(msgAddVersionOldShaIs, msg::commit_sha = it->second) - .append_raw('\n') - .append(msgAddVersionNewShaIs, msg::commit_sha = git_tree) - .append_raw('\n') - .append(msgAddVersionUpdateVersionReminder) - .append_raw('\n') - .append(msgAddVersionOverwriteOptionSuggestion, msg::option = OPTION_OVERWRITE_VERSION) - .append_raw("\n***") - .append(msgAddVersionNoFilesUpdated) - .append_raw("***")); - if (keep_going) return UpdateResult::NotUpdated; - Checks::exit_fail(VCPKG_LINE_INFO); - } - - it->first = port_version; - it->second = git_tree; - } - else + if (it != versions_end) + { + if (!overwrite_version) { - versions->insert(versions->begin(), std::make_pair(port_version, git_tree)); + msg::println_error( + msg::format(msgAddVersionPortFilesShaChanged, msg::package_name = port_name) + .append_raw('\n') + .append(msgAddVersionVersionIs, msg::version = port_version.version) + .append_raw('\n') + .append(msgAddVersionOldShaIs, msg::commit_sha = it->git_tree) + .append_raw('\n') + .append(msgAddVersionNewShaIs, msg::commit_sha = git_tree) + .append_raw('\n') + .append(msgAddVersionUpdateVersionReminder) + .append_raw('\n') + .append(msgAddVersionOverwriteOptionSuggestion, msg::option = OPTION_OVERWRITE_VERSION) + .append_raw("\n***") + .append(msgAddVersionNoFilesUpdated) + .append_raw("***")); + if (keep_going) return UpdateResult::NotUpdated; + Checks::exit_fail(VCPKG_LINE_INFO); } - if (!skip_version_format_check) - { - check_used_version_scheme(port_version, port_name); - } + it->version = port_version; + it->git_tree = git_tree; + } + else + { + versions->insert(versions->begin(), GitVersionDbEntry{port_version, git_tree}); + } - write_versions_file(fs, *versions, version_db_file_path); - if (print_success) - { - msg::println(Color::success, - msgAddVersionAddedVersionToFile, - msg::version = port_version.version, - msg::path = version_db_file_path); - } - return UpdateResult::Updated; + if (!skip_version_format_check) + { + check_used_version_scheme(port_version, port_name); } - msg::println_error(msg::format(msgAddVersionUnableToParseVersionsFile, msg::path = version_db_file_path) - .append_raw('\n') - .append(maybe_versions.error())); - Checks::exit_fail(VCPKG_LINE_INFO); + write_versions_file(fs, *versions, version_db_file_path); + if (print_success) + { + msg::println(Color::success, + msgAddVersionAddedVersionToFile, + msg::version = port_version.version, + msg::path = version_db_file_path); + } + return UpdateResult::Updated; } -} -namespace vcpkg::Commands::AddVersion -{ - const CommandSwitch COMMAND_SWITCHES[] = { - {OPTION_ALL, []() { return msg::format(msgCmdAddVersionOptAll); }}, - {OPTION_OVERWRITE_VERSION, []() { return msg::format(msgCmdAddVersionOptOverwriteVersion); }}, - {OPTION_SKIP_FORMATTING_CHECK, []() { return msg::format(msgCmdAddVersionOptSkipFormatChk); }}, - {OPTION_SKIP_VERSION_FORMAT_CHECK, []() { return msg::format(msgCmdAddVersionOptSkipVersionFormatChk); }}, - {OPTION_VERBOSE, []() { return msg::format(msgCmdAddVersionOptVerbose); }}, + constexpr CommandSwitch AddVersionSwitches[] = { + {OPTION_ALL, msgCmdAddVersionOptAll}, + {OPTION_OVERWRITE_VERSION, msgCmdAddVersionOptOverwriteVersion}, + {OPTION_SKIP_FORMATTING_CHECK, msgCmdAddVersionOptSkipFormatChk}, + {OPTION_SKIP_VERSION_FORMAT_CHECK, msgCmdAddVersionOptSkipVersionFormatChk}, + {OPTION_VERBOSE, msgCmdAddVersionOptVerbose}, }; +} // unnamed namespace - const CommandStructure COMMAND_STRUCTURE{ - [] { return create_example_string("x-add-version "); }, +namespace vcpkg +{ + constexpr CommandMetadata CommandAddVersionMetadata{ + "x-add-version", + msgCmdAddVersionSynopsis, + {msgCmdAddVersionExample1, "vcpkg x-add-version curl --overwrite-version"}, + Undocumented, + AutocompletePriority::Public, 0, 1, - {{COMMAND_SWITCHES}, {}, {}}, + {AddVersionSwitches}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_add_version_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - auto parsed_args = args.parse_arguments(COMMAND_STRUCTURE); + auto parsed_args = args.parse_arguments(CommandAddVersionMetadata); const bool add_all = Util::Sets::contains(parsed_args.switches, OPTION_ALL); const bool overwrite_version = Util::Sets::contains(parsed_args.switches, OPTION_OVERWRITE_VERSION); const bool skip_formatting_check = Util::Sets::contains(parsed_args.switches, OPTION_SKIP_FORMATTING_CHECK); @@ -378,7 +386,7 @@ namespace vcpkg::Commands::AddVersion // Get tree-ish from local repository state. auto maybe_git_tree_map = paths.git_get_local_port_treeish_map(); - auto git_tree_map = maybe_git_tree_map.value_or_exit(VCPKG_LINE_INFO); + auto& git_tree_map = maybe_git_tree_map.value_or_exit(VCPKG_LINE_INFO); // Find ports with uncommited changes std::set changed_ports; @@ -404,17 +412,17 @@ namespace vcpkg::Commands::AddVersion continue; } - auto maybe_scf = Paragraphs::try_load_port(fs, paths.builtin_ports_directory() / port_name); - if (!maybe_scf) + auto maybe_scf = + Paragraphs::try_load_port_required(fs, port_name, paths.builtin_ports_directory() / port_name); + auto scf = maybe_scf.get(); + if (!scf) { msg::println_error(msgAddVersionLoadPortFailed, msg::package_name = port_name); - print_error_message(maybe_scf.error()); + msg::println(Color::error, maybe_scf.error()); Checks::check_exit(VCPKG_LINE_INFO, !add_all); continue; } - const auto& scf = maybe_scf.value(VCPKG_LINE_INFO); - if (!skip_formatting_check) { // check if manifest file is property formatted @@ -422,7 +430,7 @@ namespace vcpkg::Commands::AddVersion if (fs.exists(path_to_manifest, IgnoreErrors{})) { const auto current_file_content = fs.read_contents(path_to_manifest, VCPKG_LINE_INFO); - const auto json = serialize_manifest(*scf); + const auto json = serialize_manifest(**scf); const auto formatted_content = Json::stringify(json); if (current_file_content != formatted_content) { @@ -446,7 +454,7 @@ namespace vcpkg::Commands::AddVersion msg::println_warning(msgAddVersionUncommittedChanges, msg::package_name = port_name); } - const auto& schemed_version = scf->to_schemed_version(); + const auto& schemed_version = (*scf)->to_schemed_version(); auto git_tree_it = git_tree_map.find(port_name); if (git_tree_it == git_tree_map.end()) @@ -483,9 +491,4 @@ namespace vcpkg::Commands::AddVersion } Checks::exit_success(VCPKG_LINE_INFO); } - - void AddVersionCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - AddVersion::perform_and_exit(args, paths); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.add.cpp b/src/vcpkg/commands.add.cpp index 6dbd249672..b194314c87 100644 --- a/src/vcpkg/commands.add.cpp +++ b/src/vcpkg/commands.add.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -14,31 +15,26 @@ #include #include -using namespace vcpkg; +#include -namespace +namespace vcpkg { - const CommandStructure AddCommandStructure = { - [] { - return msg::format(msgAddHelp) - .append_raw('\n') - .append(create_example_string("add port png")) - .append_raw('\n') - .append(create_example_string("add artifact cmake")); - }, + constexpr CommandMetadata CommandAddMetadata{ + "add", + msgCmdAddSynopsis, + {msgCmdAddExample1, "vcpkg add port png", msgCmdAddExample2, "vcpkg add artifact cmake"}, + Undocumented, + AutocompletePriority::Public, 2, SIZE_MAX, - {{}, {}}, + {{}, CommonSelectArtifactVersionSettings}, nullptr, }; -} -namespace vcpkg::Commands -{ - void AddCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + void command_add_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { MetricsSubmission metrics; - auto parsed = args.parse_arguments(AddCommandStructure); + auto parsed = args.parse_arguments(CommandAddMetadata); auto&& selector = parsed.command_arguments[0]; if (selector == "artifact") @@ -48,14 +44,23 @@ namespace vcpkg::Commands msgAddArtifactOnlyOne, msg::command_line = "vcpkg add artifact"); - auto artifact_name = parsed.command_arguments[1]; + auto& artifact_name = parsed.command_arguments[1]; auto artifact_hash = Hash::get_string_hash(artifact_name, Hash::Algorithm::Sha256); metrics.track_string(StringMetric::CommandContext, "artifact"); metrics.track_string(StringMetric::CommandArgs, artifact_hash); get_global_metrics_collector().track_submission(std::move(metrics)); - std::string ce_args[] = {"add", artifact_name}; - Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ce_args)); + std::vector ecmascript_args; + ecmascript_args.emplace_back("add"); + ecmascript_args.emplace_back(artifact_name); + auto maybe_version = Util::lookup_value(parsed.settings, OPTION_VERSION); + if (auto version = maybe_version.get()) + { + ecmascript_args.emplace_back("--version"); + ecmascript_args.emplace_back(*version); + } + + Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ecmascript_args)); } if (selector == "port") @@ -67,6 +72,11 @@ namespace vcpkg::Commands VCPKG_LINE_INFO, msgAddPortRequiresManifest, msg::command_line = "vcpkg add port"); } + if (Util::Maps::contains(parsed.settings, OPTION_VERSION)) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgAddVersionArtifactsOnly); + } + std::vector specs; specs.reserve(parsed.command_arguments.size() - 1); for (std::size_t idx = 1; idx < parsed.command_arguments.size(); ++idx) @@ -86,28 +96,33 @@ namespace vcpkg::Commands auto maybe_manifest_scf = SourceControlFile::parse_project_manifest_object(manifest->path, manifest->manifest, stdout_sink); - if (!maybe_manifest_scf) + auto pmanifest_scf = maybe_manifest_scf.get(); + if (!pmanifest_scf) { print_error_message(maybe_manifest_scf.error()); - msg::println(Color::error, msg::msgSeeURL, msg::url = docs::manifests_url); + msg::println(Color::error, msgSeeURL, msg::url = docs::manifests_url); Checks::exit_fail(VCPKG_LINE_INFO); } - auto& manifest_scf = *maybe_manifest_scf.value(VCPKG_LINE_INFO); + auto& manifest_scf = **pmanifest_scf; for (const auto& spec : specs) { auto dep = Util::find_if(manifest_scf.core_paragraph->dependencies, [&spec](Dependency& dep) { return dep.name == spec.name && !dep.host && structurally_equal(spec.platform.value_or(PlatformExpression::Expr()), dep.platform); }); + const auto features = Util::fmap(spec.features.value_or({}), [](const std::string& feature) { + Checks::check_exit(VCPKG_LINE_INFO, !feature.empty() && feature != "core" && feature != "default"); + return DependencyRequestedFeature{feature}; + }); if (dep == manifest_scf.core_paragraph->dependencies.end()) { manifest_scf.core_paragraph->dependencies.push_back( - Dependency{spec.name, spec.features.value_or({}), spec.platform.value_or({})}); + Dependency{spec.name, features, spec.platform.value_or({})}); } else if (spec.features) { - for (const auto& feature : spec.features.value_or_exit(VCPKG_LINE_INFO)) + for (const auto& feature : features) { if (!Util::Vectors::contains(dep->features, feature)) { diff --git a/src/vcpkg/commands.autocomplete.cpp b/src/vcpkg/commands.autocomplete.cpp index 8feab595b5..d43c755a25 100644 --- a/src/vcpkg/commands.autocomplete.cpp +++ b/src/vcpkg/commands.autocomplete.cpp @@ -1,16 +1,13 @@ +#include #include #include #include #include #include -#include -#include -#include -#include +#include #include #include -#include #include #include #include @@ -18,27 +15,44 @@ #include #include -namespace vcpkg::Commands::Autocomplete +using namespace vcpkg; + +namespace { - [[noreturn]] static void output_sorted_results_and_exit(const LineInfo& line_info, - std::vector&& results) + [[noreturn]] void output_sorted_results_and_exit(const LineInfo& line_info, std::vector&& results) { - const SortedVector sorted_results(results); - msg::write_unlocalized_text_to_stdout(Color::none, Strings::join("\n", sorted_results)); - + Util::sort(results); + msg::write_unlocalized_text_to_stdout(Color::none, Strings::join("\n", results)); Checks::exit_success(line_info); } - static std::vector combine_port_with_triplets(StringView port, - const std::vector& triplets) + std::vector combine_port_with_triplets(StringView port, View triplets) { - return Util::fmap(triplets, [&](const std::string& triplet) { return fmt::format("{}:{}", port, triplet); }); + return Util::fmap(triplets, + [&](const TripletFile& triplet) { return fmt::format("{}:{}", port, triplet.name); }); } +} // unnamed namespace - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) +namespace vcpkg +{ + constexpr CommandMetadata CommandAutocompleteMetadata{ + "autocomplete", + {/*Intentionally undocumented*/}, + {}, + Undocumented, + AutocompletePriority::Never, + 0, + SIZE_MAX, + {}, + nullptr, + }; + + void command_autocomplete_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { g_should_send_metrics = false; + const auto all_commands_metadata = get_all_commands_metadata(); + auto&& command_arguments = args.get_forwardable_arguments(); // Handles vcpkg if (command_arguments.size() <= 1) @@ -49,73 +63,57 @@ namespace vcpkg::Commands::Autocomplete requested_command = command_arguments[0]; } + std::vector results; + // First try public commands - std::vector public_commands = {"install", - "search", - "remove", - "list", - "update", - "hash", - "help", - "integrate", - "export", - "edit", - "create", - "owns", - "cache", - "version", - "contact", - "upgrade"}; - - Util::erase_remove_if(public_commands, [&](const std::string& s) { - return !Strings::case_insensitive_ascii_starts_with(s, requested_command); - }); - - if (!public_commands.empty()) + for (auto&& metadata : all_commands_metadata) + { + if (metadata->autocomplete_priority == AutocompletePriority::Public && + Strings::case_insensitive_ascii_starts_with(metadata->name, requested_command)) + { + results.push_back(metadata->name.to_string()); + } + } + + // If no public commands match, try internal commands + if (results.empty()) { - output_sorted_results_and_exit(VCPKG_LINE_INFO, std::move(public_commands)); + for (auto&& metadata : all_commands_metadata) + { + if (metadata->autocomplete_priority == AutocompletePriority::Internal && + Strings::case_insensitive_ascii_starts_with(metadata->name, requested_command)) + { + results.push_back(metadata->name.to_string()); + } + } } - // If no public commands match, try private commands - std::vector private_commands = { - "build", - "buildexternal", - "ci", - "depend-info", - "env", - "portsdiff", - }; - - Util::erase_remove_if(private_commands, [&](const std::string& s) { - return !Strings::case_insensitive_ascii_starts_with(s, requested_command); - }); - - output_sorted_results_and_exit(VCPKG_LINE_INFO, std::move(private_commands)); + output_sorted_results_and_exit(VCPKG_LINE_INFO, std::move(results)); } // command_arguments.size() >= 2 const auto& command_name = command_arguments[0]; // Handles vcpkg install package: - if (command_name == "install") + if (Strings::case_insensitive_ascii_equals(command_name, "install")) { StringView last_arg = command_arguments.back(); auto colon = Util::find(last_arg, ':'); if (colon != last_arg.end()) { - auto port_name = StringView{last_arg.begin(), colon}; - auto triplet_prefix = StringView{colon + 1, last_arg.end()}; + StringView port_name{last_arg.begin(), colon}; + StringView triplet_prefix{colon + 1, last_arg.end()}; // TODO: Support autocomplete for ports in --overlay-ports - auto maybe_port = - Paragraphs::try_load_port(paths.get_filesystem(), paths.builtin_ports_directory() / port_name); + auto maybe_port = Paragraphs::try_load_port_required( + paths.get_filesystem(), port_name, paths.builtin_ports_directory() / port_name); if (!maybe_port) { Checks::exit_success(VCPKG_LINE_INFO); } - std::vector triplets = paths.get_available_triplets_names(); - Util::erase_remove_if(triplets, [&](const std::string& s) { - return !Strings::case_insensitive_ascii_starts_with(s, triplet_prefix); + auto triplets = paths.get_triplet_db().available_triplets; + Util::erase_remove_if(triplets, [&](const TripletFile& tf) { + return !Strings::case_insensitive_ascii_starts_with(tf.name, triplet_prefix); }); auto result = combine_port_with_triplets(port_name, triplets); @@ -124,23 +122,9 @@ namespace vcpkg::Commands::Autocomplete } } - struct CommandEntry + for (auto&& metadata : all_commands_metadata) { - StringLiteral name; - const CommandStructure& structure; - }; - - static constexpr CommandEntry COMMANDS[] = { - CommandEntry{"install", Install::COMMAND_STRUCTURE}, - CommandEntry{"edit", Edit::COMMAND_STRUCTURE}, - CommandEntry{"remove", Remove::COMMAND_STRUCTURE}, - CommandEntry{"integrate", Integrate::COMMAND_STRUCTURE}, - CommandEntry{"upgrade", Upgrade::COMMAND_STRUCTURE}, - }; - - for (auto&& command : COMMANDS) - { - if (command_name == command.name) + if (Strings::case_insensitive_ascii_equals(command_name, metadata->name)) { StringView prefix = command_arguments.back(); std::vector results; @@ -148,24 +132,24 @@ namespace vcpkg::Commands::Autocomplete const bool is_option = Strings::starts_with(prefix, "-"); if (is_option) { - for (const auto& s : command.structure.options.switches) + for (const auto& s : metadata->options.switches) { results.push_back(Strings::concat("--", s.name)); } - for (const auto& s : command.structure.options.settings) + for (const auto& s : metadata->options.settings) { results.push_back(Strings::concat("--", s.name)); } - for (const auto& s : command.structure.options.multisettings) + for (const auto& s : metadata->options.multisettings) { results.push_back(Strings::concat("--", s.name)); } } else { - if (command.structure.valid_arguments != nullptr) + if (metadata->valid_arguments != nullptr) { - results = command.structure.valid_arguments(paths); + results = metadata->valid_arguments(paths); } } @@ -173,10 +157,11 @@ namespace vcpkg::Commands::Autocomplete return !Strings::case_insensitive_ascii_starts_with(s, prefix); }); - if (command.name == "install" && results.size() == 1 && !is_option) + if (Strings::case_insensitive_ascii_equals(metadata->name, "install") && results.size() == 1 && + !is_option) { const auto port_at_each_triplet = - combine_port_with_triplets(results[0], paths.get_available_triplets_names()); + combine_port_with_triplets(results[0], paths.get_triplet_db().available_triplets); Util::Vectors::append(&results, port_at_each_triplet); } @@ -186,9 +171,4 @@ namespace vcpkg::Commands::Autocomplete Checks::exit_success(VCPKG_LINE_INFO); } - - void AutocompleteCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - Autocomplete::perform_and_exit(args, paths); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.bootstrap-standalone.cpp b/src/vcpkg/commands.bootstrap-standalone.cpp index 0b490c8aad..4e08625733 100644 --- a/src/vcpkg/commands.bootstrap-standalone.cpp +++ b/src/vcpkg/commands.bootstrap-standalone.cpp @@ -1,5 +1,3 @@ -#include - #include #include #include @@ -7,15 +5,30 @@ #include #include #include +#include #include #include #include -namespace vcpkg::Commands +namespace vcpkg { - void BootstrapStandaloneCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const + constexpr CommandMetadata CommandBootstrapStandaloneMetadata{ + "bootstrap-standalone", + msgCmdBootstrapStandaloneSynopsis, + {"vcpkg bootstrap-standalone"}, + Undocumented, + AutocompletePriority::Never, + 0, + 0, + {}, + nullptr, + }; + + void command_bootstrap_standalone_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs) { + (void)args.parse_arguments(CommandBootstrapStandaloneMetadata); + DownloadManager download_manager{{}}; const auto maybe_vcpkg_root_env = args.vcpkg_root_dir_env.get(); if (!maybe_vcpkg_root_env) @@ -23,25 +36,13 @@ namespace vcpkg::Commands Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgVcpkgRootRequired); } - const auto& vcpkg_root = fs.almost_canonical(*maybe_vcpkg_root_env, VCPKG_LINE_INFO); + const auto vcpkg_root = fs.almost_canonical(*maybe_vcpkg_root_env, VCPKG_LINE_INFO); fs.create_directories(vcpkg_root, VCPKG_LINE_INFO); - const auto bundle_tarball = vcpkg_root / "vcpkg-standalone-bundle.tar.gz"; -#if defined(VCPKG_STANDALONE_BUNDLE_SHA) - msg::println(msgDownloadingVcpkgStandaloneBundle, msg::version = VCPKG_BASE_VERSION_AS_STRING); - const auto bundle_uri = - "https://github.com/microsoft/vcpkg-tool/releases/download/" VCPKG_BASE_VERSION_AS_STRING - "/vcpkg-standalone-bundle.tar.gz"; - download_manager.download_file( - fs, bundle_uri, {}, bundle_tarball, MACRO_TO_STRING(VCPKG_STANDALONE_BUNDLE_SHA), null_sink); -#else // ^^^ VCPKG_STANDALONE_BUNDLE_SHA / !VCPKG_STANDALONE_BUNDLE_SHA vvv - msg::println(Color::warning, msgDownloadingVcpkgStandaloneBundleLatest); - const auto bundle_uri = - "https://github.com/microsoft/vcpkg-tool/releases/latest/download/vcpkg-standalone-bundle.tar.gz"; - download_manager.download_file(fs, bundle_uri, {}, bundle_tarball, nullopt, null_sink); -#endif // ^^^ !VCPKG_STANDALONE_BUNDLE_SHA - - extract_tar(find_system_tar(fs).value_or_exit(VCPKG_LINE_INFO), bundle_tarball, vcpkg_root); - fs.remove(bundle_tarball, VCPKG_LINE_INFO); + auto tarball = + download_vcpkg_standalone_bundle(download_manager, fs, vcpkg_root).value_or_exit(VCPKG_LINE_INFO); + fs.remove_all(vcpkg_root / "vcpkg-artifacts", VCPKG_LINE_INFO); + extract_tar(find_system_tar(fs).value_or_exit(VCPKG_LINE_INFO), tarball, vcpkg_root); + fs.remove(tarball, VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO); } } diff --git a/src/vcpkg/commands.build-external.cpp b/src/vcpkg/commands.build-external.cpp new file mode 100644 index 0000000000..02ea0d3e3e --- /dev/null +++ b/src/vcpkg/commands.build-external.cpp @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace vcpkg +{ + constexpr CommandMetadata CommandBuildExternalMetadata{ + "build-external", + msgCmdBuildExternalSynopsis, + {msgCmdBuildExternalExample1, msgCmdBuildExternalExample2}, + Undocumented, + AutocompletePriority::Internal, + 2, + 2, + {}, + nullptr, + }; + + void command_build_external_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) + { + const ParsedArguments options = args.parse_arguments(CommandBuildExternalMetadata); + + bool default_triplet_used = false; + const FullPackageSpec spec = check_and_get_full_package_spec(options.command_arguments[0], + default_triplet, + default_triplet_used, + CommandBuildExternalMetadata.get_example_text(), + paths.get_triplet_db()); + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } + + auto overlays = paths.overlay_ports; + overlays.insert(overlays.begin(), options.command_arguments[1]); + + auto& fs = paths.get_filesystem(); + auto registry_set = paths.make_registry_set(); + PathsPortFileProvider provider(fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, overlays)); + command_build_and_exit_ex(args, spec, host_triplet, provider, null_build_logs_recorder(), paths); + } +} diff --git a/src/vcpkg/build.cpp b/src/vcpkg/commands.build.cpp similarity index 79% rename from src/vcpkg/build.cpp rename to src/vcpkg/commands.build.cpp index 024820b837..4d6619e06b 100644 --- a/src/vcpkg/build.cpp +++ b/src/vcpkg/commands.build.cpp @@ -1,8 +1,9 @@ #include #include #include +#include #include -#include +#include #include #include #include @@ -15,15 +16,15 @@ #include #include -#include #include #include +#include #include +#include #include #include #include #include -#include #include #include #include @@ -54,44 +55,63 @@ namespace static const NullBuildLogsRecorder null_build_logs_recorder_instance; } -namespace vcpkg::Build +namespace vcpkg { - void perform_and_exit_ex(const VcpkgCmdArguments& args, - const FullPackageSpec& full_spec, - Triplet host_triplet, - const PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const IBuildLogsRecorder& build_logs_recorder, - const VcpkgPaths& paths) + void command_build_and_exit_ex(const VcpkgCmdArguments& args, + const FullPackageSpec& full_spec, + Triplet host_triplet, + const PathsPortFileProvider& provider, + const IBuildLogsRecorder& build_logs_recorder, + const VcpkgPaths& paths) { - Checks::exit_with_code( - VCPKG_LINE_INFO, - perform_ex(args, full_spec, host_triplet, provider, binary_cache, build_logs_recorder, paths)); + Checks::exit_with_code(VCPKG_LINE_INFO, + command_build_ex(args, full_spec, host_triplet, provider, build_logs_recorder, paths)); } - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("build zlib:x64-windows"); }, + constexpr CommandMetadata CommandBuildMetadata{ + "build", + msgCmdBuildSynopsis, + {msgCmdBuildExample1, "vcpkg build zlib:x64-windows"}, + Undocumented, + AutocompletePriority::Internal, 1, 1, - {{}, {}}, + {}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) + void command_build_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) { - Checks::exit_with_code(VCPKG_LINE_INFO, perform(args, paths, default_triplet, host_triplet)); + // Build only takes a single package and all dependencies must already be installed + const ParsedArguments options = args.parse_arguments(CommandBuildMetadata); + bool default_triplet_used = false; + const FullPackageSpec spec = check_and_get_full_package_spec(options.command_arguments[0], + default_triplet, + default_triplet_used, + CommandBuildMetadata.get_example_text(), + paths.get_triplet_db()); + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } + + auto& fs = paths.get_filesystem(); + auto registry_set = paths.make_registry_set(); + PathsPortFileProvider provider( + fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); + Checks::exit_with_code(VCPKG_LINE_INFO, + command_build_ex(args, spec, host_triplet, provider, null_build_logs_recorder(), paths)); } - int perform_ex(const VcpkgCmdArguments& args, - const FullPackageSpec& full_spec, - Triplet host_triplet, - const PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const IBuildLogsRecorder& build_logs_recorder, - const VcpkgPaths& paths) + int command_build_ex(const VcpkgCmdArguments& args, + const FullPackageSpec& full_spec, + Triplet host_triplet, + const PathsPortFileProvider& provider, + const IBuildLogsRecorder& build_logs_recorder, + const VcpkgPaths& paths) { const PackageSpec& spec = full_spec.package_spec; auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); @@ -99,10 +119,10 @@ namespace vcpkg::Build var_provider.load_dep_info_vars({{spec}}, host_triplet); StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); - auto action_plan = - create_feature_install_plan(provider, var_provider, {&full_spec, 1}, status_db, {host_triplet}); + auto action_plan = create_feature_install_plan( + provider, var_provider, {&full_spec, 1}, status_db, {host_triplet, paths.packages()}); - var_provider.load_tag_vars(action_plan, provider, host_triplet); + var_provider.load_tag_vars(action_plan, host_triplet); compute_all_abis(paths, action_plan, var_provider, status_db); @@ -141,12 +161,13 @@ namespace vcpkg::Build action->build_options.clean_buildtrees = CleanBuildtrees::NO; action->build_options.clean_packages = CleanPackages::NO; + auto binary_cache = BinaryCache::make(args, paths, stdout_sink).value_or_exit(VCPKG_LINE_INFO); const ElapsedTimer build_timer; const auto result = build_package(args, paths, *action, build_logs_recorder, status_db); msg::print(msgElapsedForPackage, msg::spec = spec, msg::elapsed = build_timer); if (result.code == BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES) { - LocalizedString errorMsg = msg::format(msg::msgErrorMessage).append(msgBuildDependenciesMissing); + LocalizedString errorMsg = msg::format(msgErrorMessage).append(msgBuildDependenciesMissing); for (const auto& p : result.unmet_dependencies) { errorMsg.append_raw('\n').append_indent().append_raw(p.to_string()); @@ -172,40 +193,11 @@ namespace vcpkg::Build msg::print(create_user_troubleshooting_message(*action, paths, nullopt)); return 1; } - binary_cache.push_success(*action, paths.package_dir(action->spec)); + binary_cache.push_success(*action); return 0; } - int perform(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet default_triplet, Triplet host_triplet) - { - // Build only takes a single package and all dependencies must already be installed - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); - std::string first_arg = options.command_arguments[0]; - - BinaryCache binary_cache{args, paths}; - const FullPackageSpec spec = check_and_get_full_package_spec( - std::move(first_arg), default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); - print_default_triplet_warning(args, {&options.command_arguments[0], 1}); - - auto& fs = paths.get_filesystem(); - auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider( - fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); - return perform_ex(args, spec, host_triplet, provider, binary_cache, null_build_logs_recorder(), paths); - } -} // namespace vcpkg::Build - -namespace vcpkg -{ - void BuildCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - Build::perform_and_exit(args, paths, default_triplet, host_triplet); - } - static constexpr StringLiteral NAME_EMPTY_PACKAGE = "PolicyEmptyPackage"; static constexpr StringLiteral NAME_DLLS_WITHOUT_LIBS = "PolicyDLLsWithoutLIBs"; static constexpr StringLiteral NAME_DLLS_WITHOUT_EXPORTS = "PolicyDLLsWithoutExports"; @@ -348,27 +340,26 @@ namespace vcpkg msg::arch = target_architecture, msg::path = toolset.visual_studio_root_path, msg::list = toolset_list); - msg::println(msg::msgSeeURL, msg::url = docs::vcpkg_visual_studio_path_url); + msg::println(msgSeeURL, msg::url = docs::vcpkg_visual_studio_path_url); Checks::exit_maybe_upgrade(VCPKG_LINE_INFO); } #endif #if defined(_WIN32) - const Environment& EnvCache::get_action_env(const VcpkgPaths& paths, const AbiInfo& abi_info) + const Environment& EnvCache::get_action_env(const VcpkgPaths& paths, + const PreBuildInfo& pre_build_info, + const Toolset& toolset) { - auto build_env_cmd = - make_build_env_cmd(*abi_info.pre_build_info, abi_info.toolset.value_or_exit(VCPKG_LINE_INFO)); - - const auto& base_env = envs.get_lazy(abi_info.pre_build_info->passthrough_env_vars, [&]() -> EnvMapEntry { + auto build_env_cmd = make_build_env_cmd(pre_build_info, toolset); + const auto& base_env = envs.get_lazy(pre_build_info.passthrough_env_vars, [&]() -> EnvMapEntry { std::unordered_map env; - for (auto&& env_var : abi_info.pre_build_info->passthrough_env_vars) + for (auto&& env_var : pre_build_info.passthrough_env_vars) { - auto env_val = get_environment_variable(env_var); - - if (env_val) + auto maybe_env_val = get_environment_variable(env_var); + if (auto env_val = maybe_env_val.get()) { - env[env_var] = env_val.value_or_exit(VCPKG_LINE_INFO); + env[env_var] = std::move(*env_val); } } static constexpr StringLiteral s_extra_vars[] = { @@ -400,7 +391,7 @@ namespace vcpkg if (proxy_from_env) { - msg::println(msgUseEnvVar, msg::env_var = "HTTP(S)_PROXY"); + msg::println(msgUseEnvVar, msg::env_var = format_environment_variable("HTTP(S)_PROXY")); } else { @@ -420,8 +411,8 @@ namespace vcpkg auto kvp = Strings::split(s, '='); if (kvp.size() == 2) { - auto protocol = kvp[0]; - auto address = kvp[1]; + auto& protocol = kvp[0]; + auto& address = kvp[1]; /* Unlike Python's urllib implementation about this type of proxy configuration * (http=addr:port;https=addr:port) @@ -438,22 +429,28 @@ namespace vcpkg * connection request will fail. */ - protocol = Strings::concat(Strings::ascii_to_uppercase(protocol.c_str()), "_PROXY"); + protocol = Strings::concat(Strings::ascii_to_uppercase(protocol), "_PROXY"); env.emplace(protocol, address); - msg::println(msgSettingEnvVar, msg::env_var = protocol, msg::url = address); + msg::println(msgSettingEnvVar, + msg::env_var = format_environment_variable(protocol), + msg::url = address); } } } // Specified http:// prefix else if (Strings::starts_with(server, "http://")) { - msg::println(msgSettingEnvVar, msg::env_var = "HTTP_PROXY", msg::url = server); + msg::println(msgSettingEnvVar, + msg::env_var = format_environment_variable("HTTP_PROXY"), + msg::url = server); env.emplace("HTTP_PROXY", server); } // Specified https:// prefix else if (Strings::starts_with(server, "https://")) { - msg::println(msgSettingEnvVar, msg::env_var = "HTTPS_PROXY", msg::url = server); + msg::println(msgSettingEnvVar, + msg::env_var = format_environment_variable("HTTPS_PROXY"), + msg::url = server); env.emplace("HTTPS_PROXY", server); } // Most common case: "ip:port" style, apply to HTTP and HTTPS proxies. @@ -464,7 +461,9 @@ namespace vcpkg // We simply set "ip:port" to HTTP(S)_PROXY variables because it works on most common cases. else { - msg::println(msgAutoSettingEnvVar, msg::env_var = "HTTP(S)_PROXY", msg::url = server); + msg::println(msgAutoSettingEnvVar, + msg::env_var = format_environment_variable("HTTP(S)_PROXY"), + msg::url = server); env.emplace("HTTP_PROXY", server.c_str()); env.emplace("HTTPS_PROXY", server.c_str()); @@ -484,21 +483,26 @@ namespace vcpkg }); } #else - const Environment& EnvCache::get_action_env(const VcpkgPaths&, const AbiInfo&) { return get_clean_environment(); } + const Environment& EnvCache::get_action_env(const VcpkgPaths&, const PreBuildInfo&, const Toolset&) + { + return get_clean_environment(); + } #endif - static CompilerInfo load_compiler_info(const VcpkgPaths& paths, const AbiInfo& abi_info); + static CompilerInfo load_compiler_info(const VcpkgPaths& paths, + const PreBuildInfo& pre_build_info, + const Toolset& toolset); static const std::string& get_toolchain_cache(Cache& cache, const Path& tcfile, - const Filesystem& fs) + const ReadOnlyFilesystem& fs) { return cache.get_lazy(tcfile, [&]() { return Hash::get_file_hash(fs, tcfile, Hash::Algorithm::Sha256).value_or_exit(VCPKG_LINE_INFO); }); } - const EnvCache::TripletMapEntry& EnvCache::get_triplet_cache(const Filesystem& fs, const Path& p) const + const EnvCache::TripletMapEntry& EnvCache::get_triplet_cache(const ReadOnlyFilesystem& fs, const Path& p) const { return m_triplet_cache.get_lazy(p, [&]() -> TripletMapEntry { return TripletMapEntry{Hash::get_file_hash(fs, p, Hash::Algorithm::Sha256).value_or_exit(VCPKG_LINE_INFO)}; @@ -594,10 +598,11 @@ namespace vcpkg }; CompilerInfoCacheDeserializer CompilerInfoCacheDeserializer::instance; - const CompilerInfo& EnvCache::get_compiler_info(const VcpkgPaths& paths, const AbiInfo& abi_info) + const CompilerInfo& EnvCache::get_compiler_info(const VcpkgPaths& paths, + const PreBuildInfo& pre_build_info, + const Toolset& toolset) { - Checks::check_exit(VCPKG_LINE_INFO, abi_info.pre_build_info != nullptr); - if (!m_compiler_tracking || abi_info.pre_build_info->disable_compiler_tracking) + if (!m_compiler_tracking || pre_build_info.disable_compiler_tracking) { static CompilerInfo empty_ci; return empty_ci; @@ -605,16 +610,16 @@ namespace vcpkg const auto& fs = paths.get_filesystem(); - const auto triplet_file_path = paths.get_triplet_file_path(abi_info.pre_build_info->triplet); + const auto& triplet_file_path = paths.get_triplet_db().get_triplet_file_path(pre_build_info.triplet); - auto&& toolchain_hash = get_toolchain_cache(m_toolchain_cache, abi_info.pre_build_info->toolchain_file(), fs); + auto&& toolchain_hash = get_toolchain_cache(m_toolchain_cache, pre_build_info.toolchain_file(), fs); auto&& triplet_entry = get_triplet_cache(fs, triplet_file_path); return triplet_entry.compiler_info.get_lazy(toolchain_hash, [&]() -> CompilerInfo { if (m_compiler_tracking) { - auto cache_file = paths.installed().compiler_info_cache_file(abi_info.pre_build_info->triplet); + auto cache_file = paths.installed().compiler_info_cache_file(pre_build_info.triplet); auto& fs = paths.get_filesystem(); if (fs.exists(cache_file, VCPKG_LINE_INFO)) { @@ -633,7 +638,7 @@ namespace vcpkg return cache.compiler_info; } } - auto compiler_info = load_compiler_info(paths, abi_info); + auto compiler_info = load_compiler_info(paths, pre_build_info, toolset); CompilerInfoCache cache; cache.compiler_info = compiler_info; cache.c_compiler_last_write_time = fs.last_write_time(compiler_info.c_compiler_path, VCPKG_LINE_INFO); @@ -650,20 +655,21 @@ namespace vcpkg }); } - const std::string& EnvCache::get_triplet_info(const VcpkgPaths& paths, const AbiInfo& abi_info) + const std::string& EnvCache::get_triplet_info(const VcpkgPaths& paths, + const PreBuildInfo& pre_build_info, + const Toolset& toolset) { const auto& fs = paths.get_filesystem(); - Checks::check_exit(VCPKG_LINE_INFO, abi_info.pre_build_info != nullptr); - const auto triplet_file_path = paths.get_triplet_file_path(abi_info.pre_build_info->triplet); + const auto& triplet_file_path = paths.get_triplet_db().get_triplet_file_path(pre_build_info.triplet); - auto&& toolchain_hash = get_toolchain_cache(m_toolchain_cache, abi_info.pre_build_info->toolchain_file(), fs); + auto&& toolchain_hash = get_toolchain_cache(m_toolchain_cache, pre_build_info.toolchain_file(), fs); auto&& triplet_entry = get_triplet_cache(fs, triplet_file_path); - if (m_compiler_tracking && !abi_info.pre_build_info->disable_compiler_tracking) + if (m_compiler_tracking && !pre_build_info.disable_compiler_tracking) { return triplet_entry.triplet_infos.get_lazy(toolchain_hash, [&]() -> std::string { - auto& compiler_info = get_compiler_info(paths, abi_info); + auto& compiler_info = get_compiler_info(paths, pre_build_info, toolset); return Strings::concat(triplet_entry.hash, '-', toolchain_hash, '-', compiler_info.hash); }); } @@ -695,34 +701,60 @@ namespace vcpkg const auto arch = to_vcvarsall_toolchain(pre_build_info.target_architecture, toolset, pre_build_info.triplet); const auto target = to_vcvarsall_target(pre_build_info.cmake_system_name); - return vcpkg::Command{"cmd"}.string_arg("/c").raw_arg(fmt::format(R"("{}" {} {} {} {} 2>&1 &1 create_binary_control_file( - const SourceParagraph& source_paragraph, - Triplet triplet, - const BuildInfo& build_info, - const std::string& abi_tag, - const std::vector& core_dependencies) + static std::vector fspecs_to_pspecs(View fspecs) + { + std::set set; + for (auto&& f : fspecs) + set.insert(f.spec()); + std::vector ret{set.begin(), set.end()}; + return ret; + } + + static std::unique_ptr create_binary_control_file(const InstallPlanAction& action, + const BuildInfo& build_info) { + const auto& scfl = action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO); + auto bcf = std::make_unique(); - BinaryParagraph bpgh(source_paragraph, triplet, abi_tag, core_dependencies); + + auto find_itr = action.feature_dependencies.find("core"); + Checks::check_exit(VCPKG_LINE_INFO, find_itr != action.feature_dependencies.end()); + BinaryParagraph bpgh(*scfl.source_control_file->core_paragraph, + action.default_features.value_or_exit(VCPKG_LINE_INFO), + action.spec.triplet(), + action.public_abi(), + fspecs_to_pspecs(find_itr->second)); if (const auto p_ver = build_info.version.get()) { bpgh.version = *p_ver; } - bcf->core_paragraph = std::move(bpgh); + + bcf->features.reserve(action.feature_list.size()); + for (auto&& feature : action.feature_list) + { + find_itr = action.feature_dependencies.find(feature); + Checks::check_exit(VCPKG_LINE_INFO, find_itr != action.feature_dependencies.end()); + auto maybe_fpgh = scfl.source_control_file->find_feature(feature); + if (auto fpgh = maybe_fpgh.get()) + { + bcf->features.emplace_back(action.spec, *fpgh, fspecs_to_pspecs(find_itr->second)); + } + } return bcf; } - static void write_binary_control_file(const VcpkgPaths& paths, const BinaryControlFile& bcf) + static void write_binary_control_file(const Filesystem& fs, const Path& package_dir, const BinaryControlFile& bcf) { std::string start = Strings::serialize(bcf.core_paragraph); for (auto&& feature : bcf.features) @@ -730,8 +762,8 @@ namespace vcpkg start.push_back('\n'); start += Strings::serialize(feature); } - const auto binary_control_file = paths.package_dir(bcf.core_paragraph.spec) / "CONTROL"; - paths.get_filesystem().write_contents(binary_control_file, start, VCPKG_LINE_INFO); + const auto binary_control_file = package_dir / "CONTROL"; + fs.write_contents(binary_control_file, start, VCPKG_LINE_INFO); } static void get_generic_cmake_build_args(const VcpkgPaths& paths, @@ -744,7 +776,7 @@ namespace vcpkg {"CMD", "BUILD"}, {"DOWNLOADS", paths.downloads}, {"TARGET_TRIPLET", triplet.canonical_name()}, - {"TARGET_TRIPLET_FILE", paths.get_triplet_file_path(triplet)}, + {"TARGET_TRIPLET_FILE", paths.get_triplet_db().get_triplet_file_path(triplet)}, {"VCPKG_BASE_VERSION", VCPKG_BASE_VERSION_AS_STRING}, {"VCPKG_CONCURRENCY", std::to_string(get_concurrency())}, {"VCPKG_PLATFORM_TOOLSET", toolset.version.c_str()}, @@ -754,7 +786,9 @@ namespace vcpkg out_vars.emplace_back("GIT", git_exe_path); } - static CompilerInfo load_compiler_info(const VcpkgPaths& paths, const AbiInfo& abi_info) + static CompilerInfo load_compiler_info(const VcpkgPaths& paths, + const PreBuildInfo& pre_build_info, + const Toolset& toolset) { static constexpr auto vcpkg_json = R"--( { @@ -796,7 +830,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} ${CMAKE_C_COMPILER} ${CMAKE_CXX_COMPILER}") )--"; - auto triplet = abi_info.pre_build_info->triplet; + auto& triplet = pre_build_info.triplet; msg::println(msgDetectCompilerHash, msg::triplet = triplet); auto buildpath = paths.buildtrees() / "detect_compiler"; auto portpath = paths.buildtrees() / "detect_compiler-port"; @@ -813,11 +847,11 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} // The detect_compiler "port" doesn't depend on the host triplet, so always natively compile {"_HOST_TRIPLET", triplet.canonical_name()}, }; - get_generic_cmake_build_args(paths, triplet, abi_info.toolset.value_or_exit(VCPKG_LINE_INFO), cmake_args); + get_generic_cmake_build_args(paths, triplet, toolset, cmake_args); auto command = vcpkg::make_cmake_cmd(paths, paths.ports_cmake, std::move(cmake_args)); - const auto& env = paths.get_action_env(abi_info); + const auto& env = paths.get_action_env(pre_build_info, toolset); fs.create_directory(buildpath, VCPKG_LINE_INFO); auto stdoutlog = buildpath / ("stdout-" + triplet.canonical_name() + ".log"); @@ -894,6 +928,24 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} variables.emplace_back("ARIA2", paths.get_tool_exe(Tools::ARIA2, stdout_sink)); } + if (auto cmake_debug = args.cmake_debug.get()) + { + if (cmake_debug->is_port_affected(scf.core_paragraph->name)) + { + variables.emplace_back("--debugger"); + variables.emplace_back(fmt::format("--debugger-pipe={}", cmake_debug->value)); + } + } + + if (auto cmake_configure_debug = args.cmake_configure_debug.get()) + { + if (cmake_configure_debug->is_port_affected(scf.core_paragraph->name)) + { + variables.emplace_back(fmt::format("-DVCPKG_CMAKE_CONFIGURE_OPTIONS=--debugger;--debugger-pipe={}", + cmake_configure_debug->value)); + } + } + for (const auto& cmake_arg : args.cmake_args) { variables.emplace_back(cmake_arg); @@ -915,16 +967,16 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} variables.emplace_back("VCPKG_DOWNLOAD_MODE", "true"); } - const Filesystem& fs = paths.get_filesystem(); + const ReadOnlyFilesystem& fs = paths.get_filesystem(); std::vector port_configs; for (const PackageSpec& dependency : action.package_dependencies) { - const Path port_config_path = paths.installed().vcpkg_port_config_cmake(dependency); + Path port_config_path = paths.installed().vcpkg_port_config_cmake(dependency); if (fs.is_regular_file(port_config_path)) { - port_configs.emplace_back(port_config_path.native()); + port_configs.emplace_back(std::move(port_config_path).native()); } } @@ -978,17 +1030,11 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} } else if (cmake_system_name == "WindowsStore") { - // HACK: remove once we have fully shipped a uwp toolchain - static bool have_uwp_triplet = - m_paths.get_filesystem().exists(m_paths.scripts / "toolchains/uwp.cmake", IgnoreErrors{}); - if (have_uwp_triplet) - { - return m_paths.scripts / "toolchains/uwp.cmake"; - } - else - { - return m_paths.scripts / "toolchains/windows.cmake"; - } + return m_paths.scripts / "toolchains/uwp.cmake"; + } + else if (target_is_xbox) + { + return m_paths.scripts / "toolchains/xbox.cmake"; } else if (cmake_system_name.empty() || cmake_system_name == "Windows") { @@ -1023,7 +1069,8 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} const auto now = CTime::now_string(); const auto& abi = action.abi_info.value_or_exit(VCPKG_LINE_INFO); - const auto json_path = paths.package_dir(action.spec) / "share" / action.spec.name() / "vcpkg.spdx.json"; + const auto json_path = + action.package_dir.value_or_exit(VCPKG_LINE_INFO) / "share" / action.spec.name() / "vcpkg.spdx.json"; fs.write_contents_and_dirs( json_path, create_spdx_sbom( @@ -1042,14 +1089,15 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} auto&& scfl = action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO); Triplet triplet = action.spec.triplet(); - const auto& triplet_file_path = paths.get_triplet_file_path(triplet); + const auto& triplet_db = paths.get_triplet_db(); + const auto& triplet_file_path = triplet_db.get_triplet_file_path(triplet); - if (Strings::starts_with(triplet_file_path, paths.community_triplets)) + if (Strings::starts_with(triplet_file_path, triplet_db.community_triplet_directory)) { msg::println_warning(msgUsingCommunityTriplet, msg::triplet = triplet.canonical_name()); msg::println(msgLoadingCommunityTriplet, msg::path = triplet_file_path); } - else if (!Strings::starts_with(triplet_file_path, paths.triplets)) + else if (!Strings::starts_with(triplet_file_path, triplet_db.default_triplet_directory)) { msg::println(msgLoadingOverlayTriplet, msg::path = triplet_file_path); } @@ -1063,7 +1111,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} auto command = vcpkg::make_cmake_cmd(paths, paths.ports_cmake, get_cmake_build_args(args, paths, action)); const auto& abi_info = action.abi_info.value_or_exit(VCPKG_LINE_INFO); - auto env = paths.get_action_env(abi_info); + auto env = paths.get_action_env(*abi_info.pre_build_info, abi_info.toolset.value_or_exit(VCPKG_LINE_INFO)); auto buildpath = paths.build_dir(action.spec); fs.create_directory(buildpath, VCPKG_LINE_INFO); @@ -1135,35 +1183,15 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} error_count = perform_post_build_lint_checks( action.spec, paths, pre_build_info, build_info, scfl.source_location, combo_sink); }; - - auto find_itr = action.feature_dependencies.find("core"); - Checks::check_exit(VCPKG_LINE_INFO, find_itr != action.feature_dependencies.end()); - - std::unique_ptr bcf = create_binary_control_file( - *scfl.source_control_file->core_paragraph, triplet, build_info, action.public_abi(), find_itr->second); - if (error_count != 0 && action.build_options.backcompat_features == BackcompatFeatures::PROHIBIT) { return ExtendedBuildResult{BuildResult::POST_BUILD_CHECKS_FAILED}; } - for (auto&& feature : action.feature_list) - { - for (auto&& f_pgh : scfl.source_control_file->feature_paragraphs) - { - if (f_pgh->name == feature) - { - find_itr = action.feature_dependencies.find(feature); - Checks::check_exit(VCPKG_LINE_INFO, find_itr != action.feature_dependencies.end()); - - bcf->features.emplace_back( - *scfl.source_control_file->core_paragraph, *f_pgh, triplet, find_itr->second); - } - } - } + std::unique_ptr bcf = create_binary_control_file(action, build_info); write_sbom(paths, action, abi_info.heuristic_resources); - write_binary_control_file(paths, *bcf); + write_binary_control_file(paths.get_filesystem(), action.package_dir.value_or_exit(VCPKG_LINE_INFO), *bcf); return {BuildResult::SUCCEEDED, std::move(bcf)}; } @@ -1188,9 +1216,39 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} return result; } - static void abi_entries_from_abi_info(const AbiInfo& abi_info, std::vector& abi_tag_entries) + static std::string grdk_hash(const Filesystem& fs, + Cache>& grdk_cache, + const PreBuildInfo& pre_build_info) + { + if (auto game_dk_latest = pre_build_info.gamedk_latest_path.get()) + { + const auto grdk_header_path = *game_dk_latest / "GRDK/gameKit/Include/grdk.h"; + const auto& maybe_header_hash = grdk_cache.get_lazy(grdk_header_path, [&]() -> Optional { + auto maybe_hash = Hash::get_file_hash(fs, grdk_header_path, Hash::Algorithm::Sha256); + if (auto hash = maybe_hash.get()) + { + return std::move(*hash); + } + else + { + return nullopt; + } + }); + + if (auto header_hash = maybe_header_hash.get()) + { + return *header_hash; + } + } + + return "none"; + } + + static void abi_entries_from_pre_build_info(const Filesystem& fs, + Cache>& grdk_cache, + const PreBuildInfo& pre_build_info, + std::vector& abi_tag_entries) { - const auto& pre_build_info = *abi_info.pre_build_info; if (pre_build_info.public_abi_override) { abi_tag_entries.emplace_back( @@ -1207,36 +1265,38 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} "ENV:" + env_var, Hash::get_string_hash(e.value_or_exit(VCPKG_LINE_INFO), Hash::Algorithm::Sha256)); } } - } - - struct AbiTagAndFiles - { - const std::string* triplet_abi; - std::string tag; - Path tag_file; - std::vector files; - std::vector hashes; - Json::Value heuristic_resources; - }; + if (pre_build_info.target_is_xbox) + { + abi_tag_entries.emplace_back("grdk.h", grdk_hash(fs, grdk_cache, pre_build_info)); + } + } - static Optional compute_abi_tag(const VcpkgPaths& paths, - const InstallPlanAction& action, - Span dependency_abis) + static void populate_abi_tag(const VcpkgPaths& paths, + InstallPlanAction& action, + std::unique_ptr&& proto_pre_build_info, + Span dependency_abis, + Cache>& grdk_cache) { - auto& fs = paths.get_filesystem(); - Triplet triplet = action.spec.triplet(); + Checks::check_exit(VCPKG_LINE_INFO, static_cast(proto_pre_build_info)); + const auto& pre_build_info = *proto_pre_build_info; + const auto& toolset = paths.get_toolset(pre_build_info); + auto& abi_info = action.abi_info.emplace(); + abi_info.pre_build_info = std::move(proto_pre_build_info); + abi_info.toolset.emplace(toolset); if (action.build_options.use_head_version == UseHeadVersion::YES) { Debug::print("Binary caching for package ", action.spec, " is disabled due to --head\n"); - return nullopt; + return; } if (action.build_options.editable == Editable::YES) { Debug::print("Binary caching for package ", action.spec, " is disabled due to --editable\n"); - return nullopt; + return; } + + abi_info.compiler_info = paths.get_compiler_info(*abi_info.pre_build_info, toolset); for (auto&& dep_abi : dependency_abis) { if (dep_abi.value.empty()) @@ -1246,55 +1306,56 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} " is disabled due to missing abi info for ", dep_abi.key, '\n'); - return nullopt; + return; } } std::vector abi_tag_entries(dependency_abis.begin(), dependency_abis.end()); - const auto& abi_info = action.abi_info.value_or_exit(VCPKG_LINE_INFO); - const auto& triplet_abi = paths.get_triplet_info(abi_info); - abi_tag_entries.emplace_back("triplet", triplet.canonical_name()); + const auto& triplet_abi = paths.get_triplet_info(pre_build_info, toolset); + abi_info.triplet_abi.emplace(triplet_abi); + const auto& triplet_canonical_name = action.spec.triplet().canonical_name(); + abi_tag_entries.emplace_back("triplet", triplet_canonical_name); abi_tag_entries.emplace_back("triplet_abi", triplet_abi); - abi_entries_from_abi_info(abi_info, abi_tag_entries); + auto& fs = paths.get_filesystem(); + abi_entries_from_pre_build_info(fs, grdk_cache, pre_build_info, abi_tag_entries); // If there is an unusually large number of files in the port then - // something suspicious is going on. Rather than hash all of them - // just mark the port as no-hash + // something suspicious is going on. constexpr int max_port_file_count = 100; std::string portfile_cmake_contents; - std::vector files; - std::vector hashes; auto&& port_dir = action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO).source_location; - size_t port_file_count = 0; - Path abs_port_file; - for (auto& port_file : fs.get_regular_files_recursive_lexically_proximate(port_dir, VCPKG_LINE_INFO)) + auto raw_files = fs.get_regular_files_recursive_lexically_proximate(port_dir, VCPKG_LINE_INFO); + if (raw_files.size() > max_port_file_count) + { + msg::println_warning( + msgHashPortManyFiles, msg::package_name = action.spec.name(), msg::count = raw_files.size()); + } + + std::vector files; // will be port_files without .DS_Store entries + std::vector hashes; // will be corresponding hashes + for (auto& port_file : raw_files) { if (port_file.filename() == ".DS_Store") { continue; } - abs_port_file = port_dir; - abs_port_file /= port_file; + const auto& abs_port_file = files.emplace_back(port_dir / port_file); if (port_file.extension() == ".cmake") { - portfile_cmake_contents += fs.read_contents(abs_port_file, VCPKG_LINE_INFO); + auto contents = fs.read_contents(abs_port_file, VCPKG_LINE_INFO); + portfile_cmake_contents += contents; + hashes.push_back(vcpkg::Hash::get_string_sha256(contents)); } - - auto hash = - vcpkg::Hash::get_file_hash(fs, abs_port_file, Hash::Algorithm::Sha256).value_or_exit(VCPKG_LINE_INFO); - abi_tag_entries.emplace_back(port_file, hash); - files.push_back(port_file); - hashes.push_back(std::move(hash)); - - ++port_file_count; - if (port_file_count > max_port_file_count) + else { - abi_tag_entries.emplace_back("no_hash_max_portfile", ""); - break; + hashes.push_back(vcpkg::Hash::get_file_hash(fs, abs_port_file, Hash::Algorithm::Sha256) + .value_or_exit(VCPKG_LINE_INFO)); } + + abi_tag_entries.emplace_back(port_file, hashes.back()); } abi_tag_entries.emplace_back("cmake", paths.get_tool_version(Tools::CMAKE, stdout_sink)); @@ -1318,7 +1379,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} InternalFeatureSet sorted_feature_list = action.feature_list; // Check that no "default" feature is present. Default features must be resolved before attempting to calculate // a package ABI, so the "default" should not have made it here. - static constexpr auto default_literal = StringLiteral{"default"}; + static constexpr StringLiteral default_literal{"default"}; const bool has_no_pseudo_features = std::none_of( sorted_feature_list.begin(), sorted_feature_list.end(), [](StringView s) { return s == default_literal; }); Checks::check_exit(VCPKG_LINE_INFO, has_no_pseudo_features); @@ -1349,28 +1410,28 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} } auto abi_tag_entries_missing = Util::filter(abi_tag_entries, [](const AbiEntry& p) { return p.value.empty(); }); - - if (abi_tag_entries_missing.empty()) + if (!abi_tag_entries_missing.empty()) { - auto current_build_tree = paths.build_dir(action.spec); - fs.create_directory(current_build_tree, VCPKG_LINE_INFO); - const auto abi_file_path = current_build_tree / (triplet.canonical_name() + ".vcpkg_abi_info.txt"); - fs.write_contents(abi_file_path, full_abi_info, VCPKG_LINE_INFO); - - return AbiTagAndFiles{ - &triplet_abi, - Hash::get_file_hash(fs, abi_file_path, Hash::Algorithm::Sha256).value_or_exit(VCPKG_LINE_INFO), - abi_file_path, - std::move(files), - std::move(hashes), - run_resource_heuristics(portfile_cmake_contents)}; + Debug::println("Warning: abi keys are missing values:\n", + Strings::join("\n", abi_tag_entries_missing, [](const AbiEntry& e) -> const std::string& { + return e.key; + })); + return; } - Debug::println( - "Warning: abi keys are missing values:\n", - Strings::join("", abi_tag_entries_missing, [](const AbiEntry& e) { return " " + e.key + '\n'; })); + auto abi_file_path = paths.build_dir(action.spec); + fs.create_directory(abi_file_path, VCPKG_LINE_INFO); + abi_file_path /= triplet_canonical_name + ".vcpkg_abi_info.txt"; + fs.write_contents(abi_file_path, full_abi_info, VCPKG_LINE_INFO); - return nullopt; + auto& scf = action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO).source_control_file; + + abi_info.package_abi = Hash::get_string_sha256(full_abi_info); + abi_info.abi_tag_file.emplace(std::move(abi_file_path)); + abi_info.relative_port_files = std::move(files); + abi_info.relative_port_hashes = std::move(hashes); + abi_info.heuristic_resources.push_back( + run_resource_heuristics(portfile_cmake_contents, scf->core_paragraph->raw_version)); } void compute_all_abis(const VcpkgPaths& paths, @@ -1378,6 +1439,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} const CMakeVars::CMakeVarProvider& var_provider, const StatusParagraphs& status_db) { + Cache> grdk_cache; for (auto it = action_plan.install_actions.begin(); it != action_plan.install_actions.end(); ++it) { auto& action = *it; @@ -1412,24 +1474,14 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} } } - action.abi_info = AbiInfo(); - auto& abi_info = action.abi_info.value_or_exit(VCPKG_LINE_INFO); - - abi_info.pre_build_info = std::make_unique( - paths, action.spec.triplet(), var_provider.get_tag_vars(action.spec).value_or_exit(VCPKG_LINE_INFO)); - abi_info.toolset = paths.get_toolset(*abi_info.pre_build_info); - - auto maybe_abi_tag_and_file = compute_abi_tag(paths, action, dependency_abis); - if (auto p = maybe_abi_tag_and_file.get()) - { - abi_info.compiler_info = paths.get_compiler_info(abi_info); - abi_info.triplet_abi = *p->triplet_abi; - abi_info.package_abi = std::move(p->tag); - abi_info.abi_tag_file = std::move(p->tag_file); - abi_info.relative_port_files = std::move(p->files); - abi_info.relative_port_hashes = std::move(p->hashes); - abi_info.heuristic_resources.push_back(std::move(p->heuristic_resources)); - } + populate_abi_tag( + paths, + action, + std::make_unique(paths, + action.spec.triplet(), + var_provider.get_tag_vars(action.spec).value_or_exit(VCPKG_LINE_INFO)), + dependency_abis, + grdk_cache); } } @@ -1481,7 +1533,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} if (abi_info.abi_tag_file) { auto& abi_file = *abi_info.abi_tag_file.get(); - const auto abi_package_dir = paths.package_dir(spec) / "share" / spec.name(); + const auto abi_package_dir = action.package_dir.value_or_exit(VCPKG_LINE_INFO) / "share" / spec.name(); const auto abi_file_in_package = abi_package_dir / "vcpkg_abi_info.txt"; build_logs_recorder.record_build_result(paths, spec, result.code); filesystem.create_directories(abi_package_dir, VCPKG_LINE_INFO); @@ -1587,13 +1639,12 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} return res; } - std::string create_github_issue(const VcpkgCmdArguments& args, - const ExtendedBuildResult& build_result, - const VcpkgPaths& paths, - const InstallPlanAction& action) + struct CreateLogDetails { - const auto& fs = paths.get_filesystem(); - const auto create_log_details = [&fs](vcpkg::Path&& path) { + const Filesystem& fs; + + std::string operator()(const Path& path) const + { static constexpr auto MAX_LOG_LENGTH = 50'000; static constexpr auto START_BLOCK_LENGTH = 3'000; static constexpr auto START_BLOCK_MAX_LENGTH = 5'000; @@ -1604,65 +1655,83 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} { auto first_block_end = log.find_first_of('\n', START_BLOCK_LENGTH); if (first_block_end == std::string::npos || first_block_end > START_BLOCK_MAX_LENGTH) + { first_block_end = START_BLOCK_LENGTH; + } auto last_block_end = log.find_last_of('\n', log.size() - END_BLOCK_LENGTH); if (last_block_end == std::string::npos || last_block_end < log.size() - END_BLOCK_MAX_LENGTH) + { last_block_end = log.size() - END_BLOCK_LENGTH; + } - auto skipped_lines = std::count(log.begin() + first_block_end, log.begin() + last_block_end, '\n'); - log = log.substr(0, first_block_end) + "\n...\nSkipped " + std::to_string(skipped_lines) + - " lines\n...\n" + log.substr(last_block_end); + auto first = log.begin() + first_block_end; + auto last = log.begin() + last_block_end; + auto skipped_lines = std::count(first, last, '\n'); + log.replace(first, last, fmt::format("\n...\nSkipped {} lines\n...", skipped_lines)); } + while (!log.empty() && log.back() == '\n') + { log.pop_back(); - return Strings::concat( - "
", path.native(), "\n\n```\n", log, "\n```\n
"); - }; - const auto manifest = paths.get_manifest() - .map([](const ManifestAndPath& manifest) { - return Strings::concat("
vcpkg.json\n\n```\n", - Json::stringify(manifest.manifest), - "\n```\n
\n"); - }) - .value_or(""); + } - const auto& abi_info = action.abi_info.value_or_exit(VCPKG_LINE_INFO); - const auto& compiler_info = abi_info.compiler_info.value_or_exit(VCPKG_LINE_INFO); - return Strings::concat( - "Package: ", - action.displayname(), - " -> ", - action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO).to_version(), - "\n\n**Host Environment**", - "\n\n- Host: ", - to_zstring_view(get_host_processor()), - '-', - get_host_os_name(), - "\n- Compiler: ", - compiler_info.id, - " ", - compiler_info.version, - "\n-", - paths.get_toolver_diagnostics(), - "\n**To Reproduce**\n\n", - Strings::concat( - "`vcpkg ", args.get_command(), " ", Strings::join(" ", args.get_forwardable_arguments()), "`\n"), - "\n**Failure logs**\n\n```\n", - paths.get_filesystem().read_contents(build_result.stdoutlog.value_or_exit(VCPKG_LINE_INFO), - VCPKG_LINE_INFO), - "\n```\n", - Strings::join("\n", Util::fmap(build_result.error_logs, create_log_details)), - "\n\n**Additional context**\n\n", - manifest); + return fmt::format("
{}\n\n```\n{}\n```\n
", path.native(), log); + } + }; + + std::string create_github_issue(const VcpkgCmdArguments& args, + const ExtendedBuildResult& build_result, + const VcpkgPaths& paths, + const InstallPlanAction& action) + { + const auto& fs = paths.get_filesystem(); + std::string result; + fmt::format_to(std::back_inserter(result), + "Package: {} -> {}\n\n**Host Environment**\n\n- Host: {}-{}\n", + action.displayname(), + action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO).to_version(), + to_zstring_view(get_host_processor()), + get_host_os_name()); + + if (const auto* abi_info = action.abi_info.get()) + { + if (const auto* compiler_info = abi_info->compiler_info.get()) + { + fmt::format_to( + std::back_inserter(result), "- Compiler: {} {}\n", compiler_info->id, compiler_info->version); + } + } + + fmt::format_to(std::back_inserter(result), "-{}\n", paths.get_toolver_diagnostics()); + fmt::format_to(std::back_inserter(result), + "**To Reproduce**\n\n`vcpkg {} {}`\n", + args.get_command(), + Strings::join(" ", args.get_forwardable_arguments())); + fmt::format_to(std::back_inserter(result), + "**Failure logs**\n\n```\n{}\n```\n", + paths.get_filesystem().read_contents(build_result.stdoutlog.value_or_exit(VCPKG_LINE_INFO), + VCPKG_LINE_INFO)); + result.append(Strings::join("\n", build_result.error_logs, CreateLogDetails{fs})); + + const auto maybe_manifest = paths.get_manifest(); + if (auto manifest = maybe_manifest.get()) + { + fmt::format_to( + std::back_inserter(result), + "**Additional context**\n\n
vcpkg.json\n\n```\n{}\n```\n
\n", + Json::stringify(manifest->manifest)); + } + + return result; } - static std::string make_gh_issue_search_url(StringView spec_name) + static std::string make_gh_issue_search_url(const std::string& spec_name) { - return "https://github.com/microsoft/vcpkg/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+" + spec_name.to_string(); + return "https://github.com/microsoft/vcpkg/issues?q=is%3Aissue+is%3Aopen+in%3Atitle+" + spec_name; } - static std::string make_gh_issue_open_url(StringView spec_name, const Path& path) + static std::string make_gh_issue_open_url(StringView spec_name, StringView path) { return Strings::concat("https://github.com/microsoft/vcpkg/issues/new?title=[", spec_name, @@ -1674,19 +1743,14 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} const VcpkgPaths& paths, const Optional& issue_body) { - std::string package = action.displayname(); - if (auto scfl = action.source_control_file_and_location.get()) - { - Strings::append(package, " -> ", scfl->to_version()); - } const auto& spec_name = action.spec.name(); LocalizedString result = msg::format(msgBuildTroubleshootingMessage1).append_raw('\n'); result.append_indent().append_raw(make_gh_issue_search_url(spec_name)).append_raw('\n'); result.append(msgBuildTroubleshootingMessage2).append_raw('\n'); if (issue_body.has_value()) { - auto path = issue_body.get()->generic_u8string(); - result.append_indent().append_raw(make_gh_issue_open_url(spec_name, path)).append_raw("\n"); + const auto path = issue_body.get()->generic_u8string(); + result.append_indent().append_raw(make_gh_issue_open_url(spec_name, path)).append_raw('\n'); if (!paths.get_filesystem().find_from_PATH("gh").empty()) { Command gh("gh"); @@ -1701,8 +1765,8 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} else { result.append_indent() - .append_raw( - "https://github.com/microsoft/vcpkg/issues/new?template=report-package-build-failure.md&title=[") + .append_raw("https://github.com/microsoft/vcpkg/issues/" + "new?template=report-package-build-failure.md&title=[") .append_raw(spec_name) .append_raw("]+Build+error\n"); result.append(msgBuildTroubleshootingMessage3, msg::package_name = spec_name).append_raw('\n'); @@ -1781,7 +1845,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} return build_info; } - BuildInfo read_build_info(const Filesystem& fs, const Path& filepath) + BuildInfo read_build_info(const ReadOnlyFilesystem& fs, const Path& filepath) { auto pghs = Paragraphs::get_single_paragraph(fs, filepath); if (!pghs) @@ -1830,6 +1894,8 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} PUBLIC_ABI_OVERRIDE, LOAD_VCVARS_ENV, DISABLE_COMPILER_TRACKING, + XBOX_CONSOLE_TARGET, + Z_VCPKG_GameDKLatest }; static const std::vector> VCPKG_OPTIONS = { @@ -1847,23 +1913,14 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} // Note: this value must come after VCPKG_CHAINLOAD_TOOLCHAIN_FILE because its default depends upon it. {"VCPKG_LOAD_VCVARS_ENV", VcpkgTripletVar::LOAD_VCVARS_ENV}, {"VCPKG_DISABLE_COMPILER_TRACKING", VcpkgTripletVar::DISABLE_COMPILER_TRACKING}, + {"VCPKG_XBOX_CONSOLE_TARGET", VcpkgTripletVar::XBOX_CONSOLE_TARGET}, + {"Z_VCPKG_GameDKLatest", VcpkgTripletVar::Z_VCPKG_GameDKLatest}, }; - std::string empty; + const std::string empty; for (auto&& kv : VCPKG_OPTIONS) { - const std::string& variable_value = [&]() -> const std::string& { - auto find_itr = cmakevars.find(kv.first); - if (find_itr == cmakevars.end()) - { - return empty; - } - else - { - return find_itr->second; - } - }(); - + const std::string& variable_value = Util::value_or_default(cmakevars, kv.first, empty); switch (kv.second) { case VcpkgTripletVar::TARGET_ARCHITECTURE: target_architecture = variable_value; break; @@ -1923,6 +1980,18 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} from_cmake_bool(variable_value, kv.first).value_or_exit(VCPKG_LINE_INFO); } break; + case VcpkgTripletVar::XBOX_CONSOLE_TARGET: + if (!variable_value.empty()) + { + target_is_xbox = true; + } + break; + case VcpkgTripletVar::Z_VCPKG_GameDKLatest: + if (!variable_value.empty()) + { + gamedk_latest_path.emplace(variable_value); + } + break; } } } diff --git a/src/vcpkg/commands.buildexternal.cpp b/src/vcpkg/commands.buildexternal.cpp deleted file mode 100644 index 8e7ffa0b03..0000000000 --- a/src/vcpkg/commands.buildexternal.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace vcpkg::Commands::BuildExternal -{ - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string(R"(build-external zlib2 C:\path\to\dir\with\vcpkg.json)"); }, - 2, - 2, - {}, - nullptr, - }; - - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) - { - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); - - BinaryCache binary_cache{args, paths}; - - const FullPackageSpec spec = check_and_get_full_package_spec( - std::string(options.command_arguments[0]), default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); - - auto overlays = paths.overlay_ports; - overlays.insert(overlays.begin(), options.command_arguments[1]); - - auto& fs = paths.get_filesystem(); - auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider(fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, overlays)); - Build::perform_and_exit_ex(args, spec, host_triplet, provider, binary_cache, null_build_logs_recorder(), paths); - } - - void BuildExternalCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - BuildExternal::perform_and_exit(args, paths, default_triplet, host_triplet); - } -} diff --git a/src/vcpkg/commands.cache.cpp b/src/vcpkg/commands.cache.cpp deleted file mode 100644 index ddce4145bd..0000000000 --- a/src/vcpkg/commands.cache.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace vcpkg::Commands::Cache -{ - static std::vector read_all_binary_paragraphs(const VcpkgPaths& paths) - { - std::vector output; - for (auto&& path : paths.get_filesystem().get_files_non_recursive(paths.packages(), VCPKG_LINE_INFO)) - { - const auto pghs = Paragraphs::get_single_paragraph(paths.get_filesystem(), path / "CONTROL"); - if (const auto p = pghs.get()) - { - const BinaryParagraph binary_paragraph = BinaryParagraph(*p); - output.push_back(binary_paragraph); - } - } - - return output; - } - - const CommandStructure COMMAND_STRUCTURE = { - [] { return msg::format(msgCacheHelp).append_raw('\n').append(create_example_string("cache png")); }, - 0, - 1, - {}, - nullptr, - }; - - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) - { - auto parsed = args.parse_arguments(COMMAND_STRUCTURE); - - const std::vector binary_paragraphs = read_all_binary_paragraphs(paths); - if (binary_paragraphs.empty()) - { - msg::println(msgNoCachedPackages); - Checks::exit_success(VCPKG_LINE_INFO); - } - - if (parsed.command_arguments.empty()) - { - for (const BinaryParagraph& binary_paragraph : binary_paragraphs) - { - msg::write_unlocalized_text_to_stdout(Color::none, binary_paragraph.displayname() + '\n'); - } - } - else - { - // At this point there is 1 argument - for (const BinaryParagraph& binary_paragraph : binary_paragraphs) - { - const std::string displayname = binary_paragraph.displayname(); - if (!Strings::case_insensitive_ascii_contains(displayname, parsed.command_arguments[0])) - { - continue; - } - msg::write_unlocalized_text_to_stdout(Color::none, displayname + '\n'); - } - } - - Checks::exit_success(VCPKG_LINE_INFO); - } - - void CacheCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - Cache::perform_and_exit(args, paths); - } -} diff --git a/src/vcpkg/commands.check-support.cpp b/src/vcpkg/commands.check-support.cpp index 2a8632d69d..eae5ded56c 100644 --- a/src/vcpkg/commands.check-support.cpp +++ b/src/vcpkg/commands.check-support.cpp @@ -14,111 +14,125 @@ #include #include -namespace vcpkg::Commands -{ - static constexpr StringLiteral OPTION_JSON{"x-json"}; - static constexpr std::array CHECK_SUPPORT_SWITCHES = { - {{OPTION_JSON, []() { return msg::format(msgJsonSwitch); }}}}; +using namespace vcpkg; - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("x-check-support ..."); }, - 1, - SIZE_MAX, - {CHECK_SUPPORT_SWITCHES}, - nullptr, +namespace +{ + struct Port + { + std::string port_name; + std::vector features; + Triplet triplet; + std::string supports_expr; }; - namespace + Json::Object to_object(const Port& p) { - struct Port - { - std::string port_name; - std::vector features; - Triplet triplet; - std::string supports_expr; - }; + Json::Object res; + res.insert("name", Json::Value::string(p.port_name)); + res.insert("triplet", Json::Value::string(p.triplet.to_string())); - Json::Object to_object(const Port& p) + Json::Array& features = res.insert("features", Json::Array{}); + for (const auto& feature : p.features) { - Json::Object res; - res.insert("name", Json::Value::string(p.port_name)); - res.insert("triplet", Json::Value::string(p.triplet.to_string())); - - Json::Array& features = res.insert("features", Json::Array{}); - for (const auto& feature : p.features) - { - features.push_back(Json::Value::string(feature)); - } - - if (!p.supports_expr.empty()) - { - res.insert("supports", Json::Value::string(p.supports_expr)); - } - - return res; + features.push_back(Json::Value::string(feature)); } - void print_port_supported(const Port& p, bool is_top_level_supported, View reasons) + if (!p.supports_expr.empty()) { - const auto full_port_name = [](const Port& port) { - return fmt::format( - "{}[{}]:{}", port.port_name, Strings::join(",", port.features), port.triplet.to_string()); - }; + res.insert("supports", Json::Value::string(p.supports_expr)); + } - if (reasons.size() == 0) - { - if (is_top_level_supported) - { - // supported! - msg::println(msgSupportedPort, msg::package_name = full_port_name(p)); - } - else - { - msg::println(msg::format(msgUnsupportedPort, msg::package_name = full_port_name(p)) - .append_raw('\n') - .append(msgPortSupportsField, msg::supports_expression = p.supports_expr)); - } + return res; + } - return; - } - auto message = msg::format(msgUnsupportedPort, msg::package_name = full_port_name(p)).append_raw('\n'); + void print_port_supported(const Port& p, bool is_top_level_supported, View reasons) + { + const auto full_port_name = [](const Port& port) { + return fmt::format( + "{}[{}]:{}", port.port_name, Strings::join(",", port.features), port.triplet.to_string()); + }; + + if (reasons.size() == 0) + { if (is_top_level_supported) { - message.append(msgPortDependencyConflict, msg::package_name = full_port_name(p)); + // supported! + msg::println(msgSupportedPort, msg::package_name = full_port_name(p)); } else { - message.append(msgPortSupportsField, msg::supports_expression = p.supports_expr) - .append_raw('\n') - .append(msgPortDependencyConflict, msg::package_name = full_port_name(p)); + msg::println(msg::format(msgUnsupportedPort, msg::package_name = full_port_name(p)) + .append_raw('\n') + .append(msgPortSupportsField, msg::supports_expression = p.supports_expr)); } - for (const Port& reason : reasons) - { - message.append_raw('\n') - .append_indent() - .append(msgUnsupportedPortDependency, msg::value = full_port_name(p)) - .append(msgPortSupportsField, msg::supports_expression = reason.supports_expr); - } - msg::println(message); + return; } + auto message = msg::format(msgUnsupportedPort, msg::package_name = full_port_name(p)).append_raw('\n'); + if (is_top_level_supported) + { + message.append(msgPortDependencyConflict, msg::package_name = full_port_name(p)); + } + else + { + message.append(msgPortSupportsField, msg::supports_expression = p.supports_expr) + .append_raw('\n') + .append(msgPortDependencyConflict, msg::package_name = full_port_name(p)); + } + + for (const Port& reason : reasons) + { + message.append_raw('\n') + .append_indent() + .append(msgUnsupportedPortDependency, msg::value = full_port_name(p)) + .append(msgPortSupportsField, msg::supports_expression = reason.supports_expr); + } + msg::println(message); } - void CheckSupport::perform_and_exit(const VcpkgCmdArguments& args, + constexpr StringLiteral OPTION_JSON{"x-json"}; + constexpr CommandSwitch CHECK_SUPPORT_SWITCHES[] = { + {OPTION_JSON, msgJsonSwitch}, + }; +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandCheckSupportMetadata{ + "x-check-support", + msgCmdCheckSupportSynopsis, + {msgCmdCheckSupportExample1, "vcpkg x-check-support zlib"}, + Undocumented, + AutocompletePriority::Public, + 1, + SIZE_MAX, + {CHECK_SUPPORT_SWITCHES}, + nullptr, + }; + + void command_check_support_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet default_triplet, Triplet host_triplet) { - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments options = args.parse_arguments(CommandCheckSupportMetadata); const bool use_json = Util::Sets::contains(options.switches, OPTION_JSON); Json::Array json_to_print; // only used when `use_json` + bool default_triplet_used = false; const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_full_package_spec( - std::string(arg), default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); + return check_and_get_full_package_spec(arg, + default_triplet, + default_triplet_used, + CommandCheckSupportMetadata.get_example_text(), + paths.get_triplet_db()); }); - print_default_triplet_warning(args, options.command_arguments); + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } auto& fs = paths.get_filesystem(); auto registry_set = paths.make_registry_set(); @@ -127,11 +141,12 @@ namespace vcpkg::Commands auto cmake_vars = CMakeVars::make_triplet_cmake_var_provider(paths); // for each spec in the user-requested specs, check all dependencies + CreateInstallPlanOptions create_options{host_triplet, paths.packages()}; for (const auto& user_spec : specs) { - auto action_plan = create_feature_install_plan(provider, *cmake_vars, {&user_spec, 1}, {}, {host_triplet}); + auto action_plan = create_feature_install_plan(provider, *cmake_vars, {&user_spec, 1}, {}, create_options); - cmake_vars->load_tag_vars(action_plan, provider, host_triplet); + cmake_vars->load_tag_vars(action_plan, host_triplet); Port user_port; user_port.port_name = user_spec.package_spec.name(); @@ -198,12 +213,4 @@ namespace vcpkg::Commands msg::write_unlocalized_text_to_stdout(Color::none, Json::stringify(json_to_print)); } } - - void CheckSupport::CheckSupportCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - return CheckSupport::perform_and_exit(args, paths, default_triplet, host_triplet); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.ciclean.cpp b/src/vcpkg/commands.ci-clean.cpp similarity index 59% rename from src/vcpkg/commands.ciclean.cpp rename to src/vcpkg/commands.ci-clean.cpp index b3a64b45e5..e13fd65bc6 100644 --- a/src/vcpkg/commands.ciclean.cpp +++ b/src/vcpkg/commands.ci-clean.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include #include #include @@ -10,7 +10,7 @@ using namespace vcpkg; namespace { - void clear_directory(Filesystem& fs, const Path& target) + void clear_directory(const Filesystem& fs, const Path& target) { if (fs.is_directory(target)) { @@ -24,19 +24,27 @@ namespace } } -namespace vcpkg::Commands::CIClean +namespace vcpkg { - void perform_and_exit(const VcpkgCmdArguments&, const VcpkgPaths& paths) + constexpr CommandMetadata CommandCiCleanMetadata{ + "x-ci-clean", + msgCmdCiCleanSynopsis, + {"vcpkg x-ci-clean"}, + Undocumented, + AutocompletePriority::Internal, + 0, + 0, + {}, + nullptr, + }; + + void command_ci_clean_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { + (void)args.parse_arguments(CommandCiCleanMetadata); auto& fs = paths.get_filesystem(); clear_directory(fs, paths.buildtrees()); clear_directory(fs, paths.installed().root()); clear_directory(fs, paths.packages()); Checks::exit_success(VCPKG_LINE_INFO); } - - void CICleanCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - CIClean::perform_and_exit(args, paths); - } } diff --git a/src/vcpkg/commands.civerifyversions.cpp b/src/vcpkg/commands.ci-verify-versions.cpp similarity index 74% rename from src/vcpkg/commands.civerifyversions.cpp rename to src/vcpkg/commands.ci-verify-versions.cpp index 190269579f..d067c95906 100644 --- a/src/vcpkg/commands.civerifyversions.cpp +++ b/src/vcpkg/commands.ci-verify-versions.cpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include #include @@ -14,10 +14,10 @@ #include #include +using namespace vcpkg; + namespace { - using namespace vcpkg; - std::string get_scheme_name(VersionScheme scheme) { switch (scheme) @@ -29,50 +29,27 @@ namespace default: Checks::unreachable(VCPKG_LINE_INFO); } } -} - -namespace vcpkg::Commands::CIVerifyVersions -{ - static constexpr StringLiteral OPTION_EXCLUDE = "exclude"; - static constexpr StringLiteral OPTION_VERBOSE = "verbose"; - static constexpr StringLiteral OPTION_VERIFY_GIT_TREES = "verify-git-trees"; - - static constexpr CommandSwitch VERIFY_VERSIONS_SWITCHES[]{ - {OPTION_VERBOSE, []() { return msg::format(msgCISettingsVerifyVersion); }}, - {OPTION_VERIFY_GIT_TREES, []() { return msg::format(msgCISettingsVerifyGitTree); }}, - }; - - static constexpr CommandSetting VERIFY_VERSIONS_SETTINGS[] = { - {OPTION_EXCLUDE, []() { return msg::format(msgCISettingsExclude); }}, - }; - const CommandStructure COMMAND_STRUCTURE{ - [] { return create_example_string("x-ci-verify-versions"); }, - 0, - SIZE_MAX, - {{VERIFY_VERSIONS_SWITCHES}, {VERIFY_VERSIONS_SETTINGS}, {}}, - nullptr, - }; - - static ExpectedL verify_version_in_db(const VcpkgPaths& paths, - const std::map> baseline, - StringView port_name, - const Path& port_path, - const Path& versions_file_path, - const std::string& local_git_tree, - bool verify_git_trees) + ExpectedL verify_version_in_db(const VcpkgPaths& paths, + const std::map> baseline, + StringView port_name, + const Path& port_path, + const Path& versions_file_path, + const std::string& local_git_tree, + bool verify_git_trees) { - auto maybe_versions = vcpkg::get_builtin_versions(paths, port_name); - if (!maybe_versions.has_value()) + auto maybe_maybe_versions = vcpkg::get_builtin_versions(paths, port_name); + const auto maybe_versions = maybe_maybe_versions.get(); + if (!maybe_versions) { return {msg::format_error( msgWhileParsingVersionsForPort, msg::package_name = port_name, msg::path = versions_file_path) - .append(std::move(maybe_versions).error()), + .append(std::move(maybe_maybe_versions).error()), expected_right_tag}; } - const auto& versions = maybe_versions.value_or_exit(VCPKG_LINE_INFO); - if (versions.empty()) + const auto versions = maybe_versions->get(); + if (!versions || versions->empty()) { return {msg::format_error( msgWhileParsingVersionsForPort, msg::package_name = port_name, msg::path = versions_file_path) @@ -83,46 +60,46 @@ namespace vcpkg::Commands::CIVerifyVersions if (verify_git_trees) { - for (auto&& version_entry : versions) + for (auto&& version_entry : *versions) { bool version_ok = false; for (StringView control_file : {"CONTROL", "vcpkg.json"}) { - auto treeish = Strings::concat(version_entry.second, ':', control_file); + auto treeish = Strings::concat(version_entry.git_tree, ':', control_file); auto maybe_file = paths.git_show(Strings::concat(treeish), paths.root / ".git"); if (!maybe_file) continue; const auto& file = maybe_file.value_or_exit(VCPKG_LINE_INFO); auto maybe_scf = Paragraphs::try_load_port_text(file, treeish, control_file == "vcpkg.json", stdout_sink); - if (!maybe_scf) + auto scf = maybe_scf.get(); + if (!scf) { return {msg::format_error(msgWhileParsingVersionsForPort, msg::package_name = port_name, msg::path = versions_file_path) .append_raw('\n') - .append(msgWhileValidatingVersion, msg::version = version_entry.first.version) + .append(msgWhileValidatingVersion, msg::version = version_entry.version.version) .append_raw('\n') .append(msgWhileLoadingPortFromGitTree, msg::commit_sha = treeish) .append_raw('\n') - .append_raw(maybe_scf.error()->error), + .append(maybe_scf.error()), expected_right_tag}; } - const auto& scf = maybe_scf.value(VCPKG_LINE_INFO); - auto&& git_tree_version = scf->to_schemed_version(); - if (version_entry.first.version != git_tree_version.version) + auto&& git_tree_version = (*scf)->to_schemed_version(); + if (version_entry.version.version != git_tree_version.version) { return { msg::format_error(msgWhileParsingVersionsForPort, msg::package_name = port_name, msg::path = versions_file_path) .append_raw('\n') - .append(msgWhileValidatingVersion, msg::version = version_entry.first.version) + .append(msgWhileValidatingVersion, msg::version = version_entry.version.version) .append_raw('\n') .append(msgVersionInDeclarationDoesNotMatch, msg::version = git_tree_version.version) .append_raw('\n') - .append(msgCheckedOutGitSha, msg::commit_sha = version_entry.second), + .append(msgCheckedOutGitSha, msg::commit_sha = version_entry.git_tree), expected_right_tag}; } version_ok = true; @@ -135,32 +112,32 @@ namespace vcpkg::Commands::CIVerifyVersions msg::package_name = port_name, msg::path = versions_file_path) .append_raw('\n') - .append(msgWhileValidatingVersion, msg::version = version_entry.first.version) + .append(msgWhileValidatingVersion, msg::version = version_entry.version.version) .append_raw('\n') .append(msgCheckedOutObjectMissingManifest) .append_raw('\n') - .append(msgCheckedOutGitSha, msg::commit_sha = version_entry.second), + .append(msgCheckedOutGitSha, msg::commit_sha = version_entry.git_tree), expected_right_tag}; } } } - auto maybe_scf = Paragraphs::try_load_port(paths.get_filesystem(), port_path); - if (!maybe_scf) + auto maybe_scf = Paragraphs::try_load_port_required(paths.get_filesystem(), port_name, port_path); + auto scf = maybe_scf.get(); + if (!scf) { return {msg::format_error(msgWhileLoadingLocalPort, msg::package_name = port_name) .append_raw('\n') - .append_raw(maybe_scf.error()->error), + .append(maybe_scf.error()), expected_right_tag}; } - const auto local_port_version = maybe_scf.value(VCPKG_LINE_INFO)->to_schemed_version(); + const auto local_port_version = (*scf)->to_schemed_version(); - auto versions_end = versions.end(); - auto it = - std::find_if(versions.begin(), versions_end, [&](const std::pair& entry) { - return entry.first.version == local_port_version.version; - }); + auto versions_end = versions->end(); + auto it = std::find_if(versions->begin(), versions_end, [&](const GitVersionDbEntry& entry) { + return entry.version.version == local_port_version.version; + }); if (it == versions_end) { return {msg::format_error( @@ -173,28 +150,28 @@ namespace vcpkg::Commands::CIVerifyVersions } auto& entry = *it; - if (entry.first.scheme != local_port_version.scheme) + if (entry.version.scheme != local_port_version.scheme) { return {msg::format_error( msgWhileParsingVersionsForPort, msg::package_name = port_name, msg::path = versions_file_path) .append_raw('\n') .append(msgVersionSchemeMismatch, - msg::version = entry.first.version, - msg::expected = get_scheme_name(entry.first.scheme), + msg::version = entry.version.version, + msg::expected = get_scheme_name(entry.version.scheme), msg::actual = get_scheme_name(local_port_version.scheme), msg::path = port_path, msg::package_name = port_name), expected_right_tag}; } - if (local_git_tree != entry.second) + if (local_git_tree != entry.git_tree) { return {msg::format_error( msgWhileParsingVersionsForPort, msg::package_name = port_name, msg::path = versions_file_path) .append_raw('\n') .append(msgVersionShaMismatch, - msg::version = entry.first.version, - msg::expected = entry.second, + msg::version = entry.version.version, + msg::expected = entry.git_tree, msg::actual = local_git_tree, msg::package_name = port_name), expected_right_tag}; @@ -213,13 +190,13 @@ namespace vcpkg::Commands::CIVerifyVersions } auto&& baseline_version = maybe_baseline->second; - if (baseline_version != entry.first.version) + if (baseline_version != entry.version.version) { return {msg::format_error( msgWhileParsingVersionsForPort, msg::package_name = port_name, msg::path = versions_file_path) .append_raw('\n') .append(msgVersionBaselineMismatch, - msg::expected = entry.first.version, + msg::expected = entry.version.version, msg::actual = baseline_version, msg::package_name = port_name), expected_right_tag}; @@ -227,22 +204,49 @@ namespace vcpkg::Commands::CIVerifyVersions return { msg::format(msgVersionVerifiedOK, - msg::package_name = port_name, - msg::version = entry.first.version, - msg::commit_sha = entry.second), + msg::version_spec = Strings::concat(port_name, '@', entry.version.version), + msg::commit_sha = entry.git_tree), expected_left_tag, }; } - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + constexpr StringLiteral OPTION_EXCLUDE = "exclude"; + constexpr StringLiteral OPTION_VERBOSE = "verbose"; + constexpr StringLiteral OPTION_VERIFY_GIT_TREES = "verify-git-trees"; + + constexpr CommandSwitch VERIFY_VERSIONS_SWITCHES[]{ + {OPTION_VERBOSE, msgCISettingsVerifyVersion}, + {OPTION_VERIFY_GIT_TREES, msgCISettingsVerifyGitTree}, + }; + + constexpr CommandSetting VERIFY_VERSIONS_SETTINGS[] = { + {OPTION_EXCLUDE, msgCISettingsExclude}, + }; +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandCiVerifyVersionsMetadata{ + "x-ci-verify-versions", + msgCmdCiVerifyVersionsSynopsis, + {"vcpkg x-ci-verify-versions"}, + Undocumented, + AutocompletePriority::Internal, + 0, + SIZE_MAX, + {VERIFY_VERSIONS_SWITCHES, VERIFY_VERSIONS_SETTINGS}, + nullptr, + }; + + void command_ci_verify_versions_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - auto parsed_args = args.parse_arguments(COMMAND_STRUCTURE); + auto parsed_args = args.parse_arguments(CommandCiVerifyVersionsMetadata); bool verbose = Util::Sets::contains(parsed_args.switches, OPTION_VERBOSE); bool verify_git_trees = Util::Sets::contains(parsed_args.switches, OPTION_VERIFY_GIT_TREES); std::set exclusion_set; - auto settings = parsed_args.settings; + auto& settings = parsed_args.settings; auto it_exclusions = settings.find(OPTION_EXCLUDE); if (it_exclusions != settings.end()) { @@ -259,7 +263,7 @@ namespace vcpkg::Commands::CIVerifyVersions .append_raw(maybe_port_git_tree_map.error())); } - auto port_git_tree_map = maybe_port_git_tree_map.value_or_exit(VCPKG_LINE_INFO); + auto& port_git_tree_map = maybe_port_git_tree_map.value_or_exit(VCPKG_LINE_INFO); // Baseline is required. auto baseline = get_builtin_baseline(paths).value_or_exit(VCPKG_LINE_INFO); @@ -286,7 +290,7 @@ namespace vcpkg::Commands::CIVerifyVersions continue; } - auto git_tree = git_tree_it->second; + auto& git_tree = git_tree_it->second; auto control_path = port_path / "CONTROL"; auto manifest_path = port_path / "vcpkg.json"; auto manifest_exists = fs.exists(manifest_path, IgnoreErrors{}); @@ -348,9 +352,4 @@ namespace vcpkg::Commands::CIVerifyVersions } Checks::exit_success(VCPKG_LINE_INFO); } - - void CIVerifyVersionsCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - CIVerifyVersions::perform_and_exit(args, paths); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.ci.cpp b/src/vcpkg/commands.ci.cpp index bfaeae14f0..28d008efae 100644 --- a/src/vcpkg/commands.ci.cpp +++ b/src/vcpkg/commands.ci.cpp @@ -10,15 +10,16 @@ #include #include -#include #include #include +#include #include +#include +#include +#include #include #include -#include #include -#include #include #include #include @@ -29,14 +30,12 @@ #include #include -#include +#include using namespace vcpkg; namespace { - const Path readme_dot_log = "readme.log"; - struct CiBuildLogsRecorder final : IBuildLogsRecorder { CiBuildLogsRecorder(const Path& base_path_) : base_path(base_path_) { } @@ -54,7 +53,7 @@ namespace const auto source_path = paths.build_dir(spec); auto children = filesystem.get_regular_files_non_recursive(source_path, IgnoreErrors{}); Util::erase_remove_if(children, NotExtensionCaseInsensitive{".log"}); - const auto target_path = base_path / spec.name(); + auto target_path = base_path / spec.name(); (void)filesystem.create_directory(target_path, VCPKG_LINE_INFO); if (children.empty()) { @@ -63,7 +62,7 @@ namespace " build.\n" "This is usually because the build failed early and outside of a task that is logged.\n" "See the console output logs from vcpkg for more information on the failure.\n"; - filesystem.write_contents(target_path / readme_dot_log, message, VCPKG_LINE_INFO); + filesystem.write_contents(std::move(target_path) / "readme.log", message, VCPKG_LINE_INFO); } else { @@ -78,46 +77,36 @@ namespace private: Path base_path; }; -} -namespace vcpkg::Commands::CI -{ - static constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; - static constexpr StringLiteral OPTION_EXCLUDE = "exclude"; - static constexpr StringLiteral OPTION_HOST_EXCLUDE = "host-exclude"; - static constexpr StringLiteral OPTION_FAILURE_LOGS = "failure-logs"; - static constexpr StringLiteral OPTION_XUNIT = "x-xunit"; - static constexpr StringLiteral OPTION_XUNIT_ALL = "x-xunit-all"; - static constexpr StringLiteral OPTION_CI_BASELINE = "ci-baseline"; - static constexpr StringLiteral OPTION_ALLOW_UNEXPECTED_PASSING = "allow-unexpected-passing"; - static constexpr StringLiteral OPTION_SKIP_FAILURES = "skip-failures"; - static constexpr StringLiteral OPTION_RANDOMIZE = "x-randomize"; - static constexpr StringLiteral OPTION_OUTPUT_HASHES = "output-hashes"; - static constexpr StringLiteral OPTION_PARENT_HASHES = "parent-hashes"; - - static constexpr std::array CI_SETTINGS = { - {{OPTION_EXCLUDE, []() { return msg::format(msgCISettingsOptExclude); }}, - {OPTION_HOST_EXCLUDE, []() { return msg::format(msgCISettingsOptHostExclude); }}, - {OPTION_XUNIT, []() { return msg::format(msgCISettingsOptXUnit); }}, - {OPTION_CI_BASELINE, []() { return msg::format(msgCISettingsOptCIBase); }}, - {OPTION_FAILURE_LOGS, []() { return msg::format(msgCISettingsOptFailureLogs); }}, - {OPTION_OUTPUT_HASHES, []() { return msg::format(msgCISettingsOptOutputHashes); }}, - {OPTION_PARENT_HASHES, []() { return msg::format(msgCISettingsOptParentHashes); }}}}; - - static constexpr std::array CI_SWITCHES = {{ - {OPTION_DRY_RUN, []() { return msg::format(msgCISwitchOptDryRun); }}, - {OPTION_RANDOMIZE, []() { return msg::format(msgCISwitchOptRandomize); }}, - {OPTION_ALLOW_UNEXPECTED_PASSING, []() { return msg::format(msgCISwitchOptAllowUnexpectedPassing); }}, - {OPTION_SKIP_FAILURES, []() { return msg::format(msgCISwitchOptSkipFailures); }}, - {OPTION_XUNIT_ALL, []() { return msg::format(msgCISwitchOptXUnitAll); }}, - }}; - - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("ci --triplet=x64-windows"); }, - 0, - 0, - {CI_SWITCHES, CI_SETTINGS}, - nullptr, + constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; + constexpr StringLiteral OPTION_EXCLUDE = "exclude"; + constexpr StringLiteral OPTION_HOST_EXCLUDE = "host-exclude"; + constexpr StringLiteral OPTION_FAILURE_LOGS = "failure-logs"; + constexpr StringLiteral OPTION_XUNIT = "x-xunit"; + constexpr StringLiteral OPTION_XUNIT_ALL = "x-xunit-all"; + constexpr StringLiteral OPTION_CI_BASELINE = "ci-baseline"; + constexpr StringLiteral OPTION_ALLOW_UNEXPECTED_PASSING = "allow-unexpected-passing"; + constexpr StringLiteral OPTION_SKIP_FAILURES = "skip-failures"; + constexpr StringLiteral OPTION_RANDOMIZE = "x-randomize"; + constexpr StringLiteral OPTION_OUTPUT_HASHES = "output-hashes"; + constexpr StringLiteral OPTION_PARENT_HASHES = "parent-hashes"; + + constexpr CommandSetting CI_SETTINGS[] = { + {OPTION_EXCLUDE, msgCISettingsOptExclude}, + {OPTION_HOST_EXCLUDE, msgCISettingsOptHostExclude}, + {OPTION_XUNIT, msgCISettingsOptXUnit}, + {OPTION_CI_BASELINE, msgCISettingsOptCIBase}, + {OPTION_FAILURE_LOGS, msgCISettingsOptFailureLogs}, + {OPTION_OUTPUT_HASHES, msgCISettingsOptOutputHashes}, + {OPTION_PARENT_HASHES, msgCISettingsOptParentHashes}, + }; + + constexpr CommandSwitch CI_SWITCHES[] = { + {OPTION_DRY_RUN, msgCISwitchOptDryRun}, + {OPTION_RANDOMIZE, msgCISwitchOptRandomize}, + {OPTION_ALLOW_UNEXPECTED_PASSING, msgCISwitchOptAllowUnexpectedPassing}, + {OPTION_SKIP_FAILURES, msgCISwitchOptSkipFailures}, + {OPTION_XUNIT_ALL, msgCISwitchOptXUnitAll}, }; struct UnknownCIPortsResults @@ -129,9 +118,9 @@ namespace vcpkg::Commands::CI std::vector action_state_string; }; - static bool supported_for_triplet(const CMakeVars::CMakeVarProvider& var_provider, - const SourceControlFile& source_control_file, - PackageSpec spec) + bool supported_for_triplet(const CMakeVars::CMakeVarProvider& var_provider, + const SourceControlFile& source_control_file, + PackageSpec spec) { const auto& supports_expression = source_control_file.core_paragraph->supports_expression; if (supports_expression.is_empty()) @@ -142,26 +131,19 @@ namespace vcpkg::Commands::CI return supports_expression.evaluate(context); } - static bool supported_for_triplet(const CMakeVars::CMakeVarProvider& var_provider, - const InstallPlanAction* install_plan) - { - auto&& scfl = install_plan->source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO); - return supported_for_triplet(var_provider, *scfl.source_control_file, install_plan->spec); - } - - static bool supported_for_triplet(const CMakeVars::CMakeVarProvider& var_provider, - const PortFileProvider& provider, - PackageSpec spec) + bool supported_for_triplet(const CMakeVars::CMakeVarProvider& var_provider, + const PortFileProvider& provider, + PackageSpec spec) { auto&& scf = provider.get_control_file(spec.name()).value_or_exit(VCPKG_LINE_INFO).source_control_file; return supported_for_triplet(var_provider, *scf, spec); } - static ActionPlan compute_full_plan(const VcpkgPaths& paths, - const PortFileProvider& provider, - const CMakeVars::CMakeVarProvider& var_provider, - const std::vector& specs, - const CreateInstallPlanOptions& serialize_options) + ActionPlan compute_full_plan(const VcpkgPaths& paths, + const PortFileProvider& provider, + const CMakeVars::CMakeVarProvider& var_provider, + const std::vector& specs, + const CreateInstallPlanOptions& serialize_options) { std::vector packages_with_qualified_deps; for (auto&& spec : specs) @@ -182,7 +164,7 @@ namespace vcpkg::Commands::CI }); auto action_plan = create_feature_install_plan(provider, var_provider, applicable_specs, {}, serialize_options); - var_provider.load_tag_vars(action_plan, provider, serialize_options.host_triplet); + var_provider.load_tag_vars(action_plan, serialize_options.host_triplet); Checks::check_exit(VCPKG_LINE_INFO, action_plan.already_installed.empty()); Checks::check_exit(VCPKG_LINE_INFO, action_plan.remove_actions.empty()); @@ -191,9 +173,8 @@ namespace vcpkg::Commands::CI return action_plan; } - static std::unique_ptr compute_action_statuses( + std::unique_ptr compute_action_statuses( ExclusionPredicate is_excluded, - const CMakeVars::CMakeVarProvider& var_provider, const std::vector& precheck_results, const ActionPlan& action_plan) { @@ -209,22 +190,12 @@ namespace vcpkg::Commands::CI auto p = &action; ret->abi_map.emplace(action.spec, action.abi_info.value_or_exit(VCPKG_LINE_INFO).package_abi); ret->features.emplace(action.spec, action.feature_list); - if (is_excluded(p->spec)) { ret->action_state_string.emplace_back("skip"); ret->known.emplace(p->spec, BuildResult::EXCLUDED); will_fail.emplace(p->spec); } - else if (!supported_for_triplet(var_provider, p)) - { - // This treats unsupported ports as if they are excluded - // which means the ports dependent on it will be cascaded due to missing dependencies - // Should this be changed so instead it is a failure to depend on a unsupported port? - ret->action_state_string.emplace_back("n/a"); - ret->known.emplace(p->spec, BuildResult::EXCLUDED); - will_fail.emplace(p->spec); - } else if (Util::any_of(p->package_dependencies, [&](const PackageSpec& spec) { return Util::Sets::contains(will_fail, spec); })) { @@ -246,9 +217,9 @@ namespace vcpkg::Commands::CI } // This algorithm reduces an action plan to only unknown actions and their dependencies - static void reduce_action_plan(ActionPlan& action_plan, - const std::map& known, - View parent_hashes) + void reduce_action_plan(ActionPlan& action_plan, + const std::map& known, + View parent_hashes) { std::set to_keep; for (auto it = action_plan.install_actions.rbegin(); it != action_plan.install_actions.rend(); ++it) @@ -284,10 +255,10 @@ namespace vcpkg::Commands::CI }); } - static void parse_exclusions(const std::map>& settings, - StringLiteral opt, - Triplet triplet, - ExclusionsMap& exclusions_map) + void parse_exclusions(const std::map>& settings, + StringLiteral opt, + Triplet triplet, + ExclusionsMap& exclusions_map) { auto it_exclusions = settings.find(opt); exclusions_map.insert(triplet, @@ -296,15 +267,17 @@ namespace vcpkg::Commands::CI : SortedVector(Strings::split(it_exclusions->second, ','))); } - static void print_regressions(const std::vector& results, - const std::map& known, - const CiBaselineData& cidata, - const std::string& ci_baseline_file_name, - bool allow_unexpected_passing) + void print_regressions(const std::vector& results, + const std::map& known, + const CiBaselineData& cidata, + const std::string& ci_baseline_file_name, + const LocalizedString& not_supported_regressions, + bool allow_unexpected_passing) { bool has_error = false; LocalizedString output = msg::format(msgCiBaselineRegressionHeader); output.append_raw('\n'); + output.append(not_supported_regressions); for (auto&& r : results) { auto result = r.build_result.value_or_exit(VCPKG_LINE_INFO).code; @@ -339,20 +312,34 @@ namespace vcpkg::Commands::CI fwrite(output_data.data(), 1, output_data.size(), stderr); } - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet target_triplet, - Triplet host_triplet) +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandCiMetadata{ + "ci", + msgCmdCiSynopsis, + {"vcpkg ci --triplet=x64-windows"}, + Undocumented, + AutocompletePriority::Internal, + 0, + 0, + {CI_SWITCHES, CI_SETTINGS}, + nullptr, + }; + + void command_ci_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet target_triplet, + Triplet host_triplet) { msg::println_warning(msgInternalCICommand); - print_default_triplet_warning(args, {}); + print_default_triplet_warning(args, paths.get_triplet_db()); - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments options = args.parse_arguments(CommandCiMetadata); const auto& settings = options.settings; - BinaryCache binary_cache{args, paths}; - ExclusionsMap exclusions_map; parse_exclusions(settings, OPTION_EXCLUDE, target_triplet, exclusions_map); parse_exclusions(settings, OPTION_HOST_EXCLUDE, host_triplet, exclusions_map); @@ -404,18 +391,16 @@ namespace vcpkg::Commands::CI auto& var_provider = *var_provider_storage; const ElapsedTimer timer; - std::vector all_port_names = - Util::fmap(provider.load_all_control_files(), Paragraphs::get_name_of_control_file); // Install the default features for every package std::vector all_default_full_specs; - all_default_full_specs.reserve(all_port_names.size()); - for (auto&& port_name : all_port_names) + for (auto scfl : provider.load_all_control_files()) { - all_default_full_specs.emplace_back(PackageSpec{std::move(port_name), target_triplet}, - InternalFeatureSet{"core", "default"}); + all_default_full_specs.emplace_back( + PackageSpec{scfl->source_control_file->core_paragraph->name, target_triplet}, + InternalFeatureSet{"core", "default"}); } - CreateInstallPlanOptions serialize_options(host_triplet, UnsupportedPortAction::Warn); + CreateInstallPlanOptions serialize_options(host_triplet, paths.packages(), UnsupportedPortAction::Warn); struct RandomizerInstance : GraphRandomizer { @@ -435,10 +420,10 @@ namespace vcpkg::Commands::CI } auto action_plan = compute_full_plan(paths, provider, var_provider, all_default_full_specs, serialize_options); + auto binary_cache = BinaryCache::make(args, paths, stdout_sink).value_or_exit(VCPKG_LINE_INFO); const auto precheck_results = binary_cache.precheck(action_plan.install_actions); - auto split_specs = - compute_action_statuses(ExclusionPredicate{&exclusions_map}, var_provider, precheck_results, action_plan); - + auto split_specs = compute_action_statuses(ExclusionPredicate{&exclusions_map}, precheck_results, action_plan); + LocalizedString regressions; { std::string msg; for (const auto& spec : all_default_full_specs) @@ -449,6 +434,15 @@ namespace vcpkg::Commands::CI split_specs->known.emplace(spec.package_spec, supp ? BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES : BuildResult::EXCLUDED); + + if (cidata.expected_failures.contains(spec.package_spec)) + { + regressions + .append(supp ? msgCiBaselineUnexpectedFailCascade : msgCiBaselineUnexpectedFail, + msg::spec = spec.package_spec, + msg::triplet = spec.package_spec.triplet()) + .append_raw('\n'); + } msg += fmt::format("{:>40}: {:>8}\n", spec.package_spec, supp ? "cascade" : "skip"); } } @@ -505,22 +499,50 @@ namespace vcpkg::Commands::CI if (is_dry_run) { print_plan(action_plan, true, paths.builtin_ports_directory()); + if (!regressions.empty()) + { + msg::println(Color::error, msgCiBaselineRegressionHeader); + msg::print(Color::error, regressions); + } } else { StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); - auto summary = Install::perform( - args, action_plan, KeepGoing::YES, paths, status_db, binary_cache, build_logs_recorder, var_provider); + auto already_installed = adjust_action_plan_to_status_db(action_plan, status_db); + Util::erase_if(already_installed, + [&](auto& spec) { return Util::Sets::contains(split_specs->known, spec); }); + if (!already_installed.empty()) + { + LocalizedString warning; + warning.append(msgCISkipInstallation); + warning.append_floating_list(1, Util::fmap(already_installed, [](const PackageSpec& spec) { + return LocalizedString::from_raw(spec.to_string()); + })); + msg::println_warning(warning); + } + + install_preclear_packages(paths, action_plan); + binary_cache.fetch(action_plan.install_actions); + auto summary = install_execute_plan( + args, action_plan, KeepGoing::YES, paths, status_db, binary_cache, build_logs_recorder); for (auto&& result : summary.results) { split_specs->known.erase(result.get_spec()); } - msg::write_unlocalized_text_to_stdout(Color::none, fmt::format("\nTriplet: {}\n", target_triplet)); + msg::print(LocalizedString::from_raw("\n") + .append(msgTripletLabel) + .append_raw(' ') + .append_raw(target_triplet) + .append_raw('\n')); summary.print(); - print_regressions( - summary.results, split_specs->known, cidata, baseline_iter->second, allow_unexpected_passing); + print_regressions(summary.results, + split_specs->known, + cidata, + baseline_iter->second, + regressions, + allow_unexpected_passing); auto it_xunit = settings.find(OPTION_XUNIT); if (it_xunit != settings.end()) @@ -560,12 +582,4 @@ namespace vcpkg::Commands::CI Checks::exit_success(VCPKG_LINE_INFO); } - - void CICommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - CI::perform_and_exit(args, paths, default_triplet, host_triplet); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.contact.cpp b/src/vcpkg/commands.contact.cpp index 25d279aac8..9c353dde66 100644 --- a/src/vcpkg/commands.contact.cpp +++ b/src/vcpkg/commands.contact.cpp @@ -1,60 +1,26 @@ -#include -#include -#include +#include #include -#include -#include #include -namespace vcpkg::Commands::Contact +namespace vcpkg { - static constexpr StringLiteral OPTION_SURVEY = "survey"; - - static constexpr std::array SWITCHES = {{ - {OPTION_SURVEY, []() { return msg::format(msgCmdContactOptSurvey); }}, - }}; - - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("contact"); }, + constexpr CommandMetadata CommandContactMetadata{ + "contact", + msgHelpContactCommand, + {"vcpkg contact"}, + Undocumented, + AutocompletePriority::Internal, 0, 0, - {SWITCHES, {}}, + {}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) + void command_contact_and_exit(const VcpkgCmdArguments& args, const Filesystem&) { - const ParsedArguments parsed_args = args.parse_arguments(COMMAND_STRUCTURE); - - if (Util::Sets::contains(parsed_args.switches, SWITCHES[0].name)) - { - auto maybe_now = CTime::now(); - if (const auto p_now = maybe_now.get()) - { - auto config = try_read_metrics_user(fs); - config.last_completed_survey = p_now->to_string(); - config.try_write(fs); - } - -#if defined(_WIN32) - cmd_execute(Command("start").string_arg("https://aka.ms/NPS_vcpkg")); - msg::println(msgDefaultBrowserLaunched, msg::url = "https://aka.ms/NPS_vcpkg"); - msg::println(msgFeedbackAppreciated); -#else - msg::println(msgNavigateToNPS, msg::url = "https://aka.ms/NPS_vcpkg"); - msg::println(msgFeedbackAppreciated); -#endif - } - else - { - msg::println(msgEmailVcpkgTeam, msg::url = "vcpkg@microsoft.com"); - } + (void)args.parse_arguments(CommandContactMetadata); + msg::println(msgEmailVcpkgTeam, msg::url = "vcpkg@microsoft.com"); Checks::exit_success(VCPKG_LINE_INFO); } - - void ContactCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const - { - Contact::perform_and_exit(args, fs); - } } diff --git a/src/vcpkg/commands.cpp b/src/vcpkg/commands.cpp index 68436d5afb..3e16ebe1aa 100644 --- a/src/vcpkg/commands.cpp +++ b/src/vcpkg/commands.cpp @@ -1,189 +1,230 @@ -#include #include #include #include #include #include -#include #include #include -#include -#include +#include +#include #include +#include +#include #include -#include -#include #include #include #include -#include +#include +#include #include #include +#include #include #include #include -#include #include #include #include -#include +#include #include +#include #include #include #include #include +#include #include #include +#include #include -#include +#include #include +#include +#include #include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace vcpkg::Commands +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace vcpkg { - Span> get_available_basic_commands() - { - static const Version::VersionCommand version{}; - static const Contact::ContactCommand contact{}; - static const InitRegistry::InitRegistryCommand init_registry{}; - static const X_Download::XDownloadCommand xdownload{}; - static const GenerateDefaultMessageMapCommand generate_message_map{}; - static const Hash::HashCommand hash{}; - static const BootstrapStandaloneCommand boostrap_standalone{}; - static const ZPreRegisterTelemetryCommand zpreregister_telemetry{}; + static constexpr CommandRegistration basic_commands_storage[] = { + {CommandBootstrapStandaloneMetadata, command_bootstrap_standalone_and_exit}, + {CommandContactMetadata, command_contact_and_exit}, + {CommandDownloadMetadata, command_download_and_exit}, + {CommandHashMetadata, command_hash_and_exit}, + {CommandInitRegistryMetadata, command_init_registry_and_exit}, + {CommandVersionMetadata, command_version_and_exit}, #if defined(_WIN32) - static const AppLocalCommand applocal{}; - static const UploadMetrics::UploadMetricsCommand upload_metrics{}; + {CommandZUploadMetricsMetadata, command_z_upload_metrics_and_exit}, + {CommandZApplocalMetadata, command_z_applocal_and_exit}, #endif // defined(_WIN32) + {CommandZGenerateDefaultMessageMapMetadata, command_z_generate_default_message_map_and_exit}, + {CommandZPreregisterTelemetryMetadata, command_z_preregister_telemetry_and_exit}, + }; - static std::vector> t = { - {"version", &version}, - {"contact", &contact}, - {"hash", &hash}, - {"x-init-registry", &init_registry}, - {"x-download", &xdownload}, - {"x-generate-default-message-map", &generate_message_map}, - {"bootstrap-standalone", &boostrap_standalone}, - {"z-preregister-telemetry", &zpreregister_telemetry}, -#if defined(_WIN32) - {"x-upload-metrics", &upload_metrics}, - {"z-applocal", &applocal} -#endif // defined(_WIN32) - }; - return t; + constexpr View> basic_commands = basic_commands_storage; + + static constexpr CommandRegistration paths_commands_storage[] = { + {CommandAcquireMetadata, command_acquire_and_exit}, + {CommandAcquireProjectMetadata, command_acquire_project_and_exit}, + {CommandActivateMetadata, command_activate_and_exit}, + {CommandAddMetadata, command_add_and_exit}, + {CommandAddVersionMetadata, command_add_version_and_exit}, + {CommandAutocompleteMetadata, command_autocomplete_and_exit}, + {CommandCiCleanMetadata, command_ci_clean_and_exit}, + {CommandCiVerifyVersionsMetadata, command_ci_verify_versions_and_exit}, + {CommandCreateMetadata, command_create_and_exit}, + {CommandDeactivateMetadata, command_deactivate_and_exit}, + {CommandEditMetadata, command_edit_and_exit}, + {CommandFetchMetadata, command_fetch_and_exit}, + {CommandGenerateMsbuildPropsMetadata, command_generate_msbuild_props_and_exit}, + {CommandFindMetadata, command_find_and_exit}, + {CommandFormatManifestMetadata, command_format_manifest_and_exit}, + {CommandHelpMetadata, command_help_and_exit}, + {CommandIntegrateMetadata, command_integrate_and_exit}, + {CommandListMetadata, command_list_and_exit}, + {CommandNewMetadata, command_new_and_exit}, + {CommandOwnsMetadata, command_owns_and_exit}, + {CommandPackageInfoMetadata, command_package_info_and_exit}, + {CommandPortsdiffMetadata, command_portsdiff_and_exit}, + {CommandRegenerateMetadata, command_regenerate_and_exit}, + {CommandSearchMetadata, command_search_and_exit}, + {CommandUpdateMetadata, command_update_and_exit}, + {CommandUpdateBaselineMetadata, command_update_baseline_and_exit}, + {CommandUpdateRegistryMetadata, command_update_registry_and_exit}, + {CommandUseMetadata, command_use_and_exit}, + {CommandVsInstancesMetadata, command_vs_instances_and_exit}, + {CommandZCEMetadata, command_z_ce_and_exit}, + {CommandZExtractMetadata, command_z_extract_and_exit}, + {CommandZChangelogMetadata, command_z_changelog_and_exit}, + }; + + constexpr View> paths_commands = paths_commands_storage; + + static constexpr CommandRegistration triplet_commands_storage[] = { + {CommandBuildMetadata, command_build_and_exit}, + {CommandBuildExternalMetadata, command_build_external_and_exit}, + {CommandCheckSupportMetadata, command_check_support_and_exit}, + {CommandCiMetadata, command_ci_and_exit}, + {CommandDependInfoMetadata, command_depend_info_and_exit}, + {CommandEnvMetadata, command_env_and_exit}, + {CommandExportMetadata, command_export_and_exit}, + {CommandInstallMetadata, command_install_and_exit}, + {CommandRemoveMetadata, command_remove_and_exit}, + {CommandSetInstalledMetadata, command_set_installed_and_exit}, + {CommandUpgradeMetadata, command_upgrade_and_exit}, + {CommandZPrintConfigMetadata, command_z_print_config_and_exit}, + }; + + constexpr View> triplet_commands = triplet_commands_storage; + + std::vector get_all_commands_metadata() + { + std::vector result; + for (auto&& basic_command : basic_commands_storage) + { + result.push_back(&basic_command.metadata); + } + + for (auto&& paths_command : paths_commands_storage) + { + result.push_back(&paths_command.metadata); + } + + for (auto&& triplet_command : triplet_commands_storage) + { + result.push_back(&triplet_command.metadata); + } + + return result; } - Span> get_available_paths_commands() + static void format_command_usage_entry(HelpTableFormatter& table, const CommandMetadata& metadata) { - static const AcquireCommand acquire{}; - static const AcquireProjectCommand acquire_project{}; - static const ActivateCommand activate{}; - static const AddCommand add{}; - static const AddVersion::AddVersionCommand add_version{}; - static const Autocomplete::AutocompleteCommand autocomplete{}; - static const Cache::CacheCommand cache{}; - static const CIClean::CICleanCommand ciclean{}; - static const CIVerifyVersions::CIVerifyVersionsCommand ci_verify_versions{}; - static const Create::CreateCommand create{}; - static const DeactivateCommand deactivate{}; - static const Edit::EditCommand edit{}; - static const Fetch::FetchCommand fetch{}; - static const FindCommand find_{}; - static const FormatManifest::FormatManifestCommand format_manifest{}; - static const GenerateMSBuildPropsCommand generate_msbuildprops{}; - static const Help::HelpCommand help{}; - static const Info::InfoCommand info{}; - static const Integrate::IntegrateCommand integrate{}; - static const List::ListCommand list{}; - static const NewCommand new_{}; - static const Owns::OwnsCommand owns{}; - static const PortsDiff::PortsDiffCommand portsdiff{}; - static const RegenerateCommand regenerate{}; - static const SearchCommand search{}; - static const Update::UpdateCommand update{}; - static const UpdateBaselineCommand update_baseline{}; - static const UseCommand use{}; - static const X_VSInstances::VSInstancesCommand vsinstances{}; - static const ZCeCommand ce{}; - - static std::vector> t = { - {"/?", &help}, - {"help", &help}, - {"acquire", &acquire}, - {"acquire-project", &acquire_project}, - {"activate", &activate}, - {"add", &add}, - {"autocomplete", &autocomplete}, - {"cache", &cache}, - {"create", &create}, - {"deactivate", &deactivate}, - {"edit", &edit}, - {"fetch", &fetch}, - {"find", &find_}, - {"format-manifest", &format_manifest}, - {"integrate", &integrate}, - {"list", &list}, - {"new", &new_}, - {"owns", &owns}, - {"portsdiff", &portsdiff}, - {"search", &search}, - {"update", &update}, - {"x-update-baseline", &update_baseline}, - {"use", &use}, - {"x-generate-msbuild-props", &generate_msbuildprops}, - {"x-add-version", &add_version}, - {"x-ci-clean", &ciclean}, - {"x-ci-verify-versions", &ci_verify_versions}, - {"x-package-info", &info}, - {"x-regenerate", ®enerate}, - {"x-vsinstances", &vsinstances}, - {"z-ce", &ce}, - }; - return t; + if (metadata.synopsis) + { + table.format(metadata.name, metadata.synopsis.to_string()); + } } - Span> get_available_triplet_commands() + void print_zero_args_usage() { - static const InstallCommand install{}; - static const SetInstalled::SetInstalledCommand set_installed{}; - static const CI::CICommand ci{}; - static const Remove::RemoveCommand remove{}; - static const Upgrade::UpgradeCommand upgrade{}; - static const BuildCommand build{}; - static const Env::EnvCommand env{}; - static const BuildExternal::BuildExternalCommand build_external{}; - static const Export::ExportCommand export_command{}; - static const DependInfo::DependInfoCommand depend_info{}; - static const CheckSupport::CheckSupportCommand check_support{}; - static const Z_PrintConfig::PrintConfigCommand print_config{}; - - static std::vector> t = { - {"install", &install}, - {"x-set-installed", &set_installed}, - {"ci", &ci}, - {"remove", &remove}, - {"upgrade", &upgrade}, - {"build", &build}, - {"env", &env}, - {"build-external", &build_external}, - {"export", &export_command}, - {"depend-info", &depend_info}, - {"x-check-support", &check_support}, - {"z-print-config", &print_config}, - }; - return t; + HelpTableFormatter table; + table.example(msg::format(msgVcpkgUsage)); + table.format(msg::format(msgResponseFileCode), msg::format(msgHelpResponseFileCommand)); + table.blank(); + + table.header(msg::format(msgPackageInstallationHeader)); + format_command_usage_entry(table, CommandExportMetadata); + format_command_usage_entry(table, CommandInstallMetadata); + format_command_usage_entry(table, CommandRemoveMetadata); + format_command_usage_entry(table, CommandSetInstalledMetadata); + format_command_usage_entry(table, CommandUpgradeMetadata); + table.blank(); + + table.header(msg::format(msgPackageDiscoveryHeader)); + format_command_usage_entry(table, CommandCheckSupportMetadata); + format_command_usage_entry(table, CommandDependInfoMetadata); + format_command_usage_entry(table, CommandListMetadata); + format_command_usage_entry(table, CommandOwnsMetadata); + format_command_usage_entry(table, CommandPackageInfoMetadata); + format_command_usage_entry(table, CommandPortsdiffMetadata); + format_command_usage_entry(table, CommandSearchMetadata); + format_command_usage_entry(table, CommandUpdateMetadata); + table.blank(); + + table.header(msg::format(msgPackageManipulationHeader)); + format_command_usage_entry(table, CommandAddMetadata); + format_command_usage_entry(table, CommandAddVersionMetadata); + format_command_usage_entry(table, CommandCreateMetadata); + format_command_usage_entry(table, CommandEditMetadata); + format_command_usage_entry(table, CommandEnvMetadata); + format_command_usage_entry(table, CommandFormatManifestMetadata); + format_command_usage_entry(table, CommandHashMetadata); + format_command_usage_entry(table, CommandInitRegistryMetadata); + format_command_usage_entry(table, CommandNewMetadata); + format_command_usage_entry(table, CommandUpdateBaselineMetadata); + table.blank(); + + table.header(msg::format(msgOtherCommandsHeader)); + format_command_usage_entry(table, CommandCiMetadata); + format_command_usage_entry(table, CommandCiVerifyVersionsMetadata); + format_command_usage_entry(table, CommandContactMetadata); + format_command_usage_entry(table, CommandFetchMetadata); + format_command_usage_entry(table, CommandIntegrateMetadata); + table.blank(); + + table.header(msg::format(msgForMoreHelp)); + table.format("help topics", msg::format(msgHelpTopicsCommand)); + table.format(msg::format(msgCmdHelpTopic), msg::format(msgHelpTopicCommand)); + table.format("help commands", msg::format(msgCmdHelpCommandsSynopsis)); + table.format(msg::format(msgCmdHelpCommands), msg::format(msgCmdHelpCommandSynopsis)); + table.blank(); + table.example(msg::format(msgHelpExampleCommand)); + + msg::println(LocalizedString::from_raw(table.m_str)); + } + + void print_full_command_list() + { + HelpTableFormatter table; + auto all_commands = get_all_commands_metadata(); + Util::sort(all_commands, + [](const CommandMetadata* lhs, const CommandMetadata* rhs) { return lhs->name < rhs->name; }); + for (auto command : all_commands) + { + format_command_usage_entry(table, *command); + } + + msg::println(LocalizedString::from_raw(table.m_str)); } } diff --git a/src/vcpkg/commands.create.cpp b/src/vcpkg/commands.create.cpp index 4244d65fed..3bc94c8d25 100644 --- a/src/vcpkg/commands.create.cpp +++ b/src/vcpkg/commands.create.cpp @@ -4,11 +4,13 @@ #include #include +#include #include -#include #include #include +using namespace vcpkg; + namespace { std::string remove_trailing_url_slashes(std::string argument) @@ -19,33 +21,42 @@ namespace } } -namespace vcpkg::Commands::Create +namespace vcpkg { - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string(R"###(create zlib2 http://zlib.net/zlib1211.zip "zlib1211-2.zip")###"); }, + constexpr CommandMetadata CommandCreateMetadata{ + "create", + msgHelpCreateCommand, + { + msgCmdCreateExample1, + msgCmdCreateExample2, + msgCmdCreateExample3, + "vcpkg create zlib2 http://zlib.net/zlib1211.zip zlib1211-2.zip", + }, + Undocumented, + AutocompletePriority::Public, 2, 3, {}, nullptr, }; - int perform(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + int command_create(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - auto parsed = args.parse_arguments(COMMAND_STRUCTURE); - const std::string port_name = parsed.command_arguments[0]; - const std::string url = remove_trailing_url_slashes(parsed.command_arguments[1]); + auto parsed = args.parse_arguments(CommandCreateMetadata); + const std::string& port_name = parsed.command_arguments[0]; + std::string url = remove_trailing_url_slashes(parsed.command_arguments[1]); std::vector cmake_args{ {"CMD", "CREATE"}, {"PORT", port_name}, {"PORT_PATH", (paths.builtin_ports_directory() / port_name).generic_u8string()}, - {"URL", url}, + {"URL", std::move(url)}, {"VCPKG_BASE_VERSION", VCPKG_BASE_VERSION_AS_STRING}, }; if (parsed.command_arguments.size() >= 3) { - const std::string& zip_file_name = parsed.command_arguments[2]; + std::string& zip_file_name = parsed.command_arguments[2]; Checks::msg_check_exit(VCPKG_LINE_INFO, !has_invalid_chars_for_filesystem(zip_file_name), msgInvalidFilename, @@ -58,13 +69,8 @@ namespace vcpkg::Commands::Create return cmd_execute_clean(cmd_launch_cmake).value_or_exit(VCPKG_LINE_INFO); } - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) - { - Checks::exit_with_code(VCPKG_LINE_INFO, perform(args, paths)); - } - - void CreateCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + void command_create_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - Create::perform_and_exit(args, paths); + Checks::exit_with_code(VCPKG_LINE_INFO, command_create(args, paths)); } } diff --git a/src/vcpkg/commands.deactivate.cpp b/src/vcpkg/commands.deactivate.cpp index b89ab5f354..3cc3fd3a4c 100644 --- a/src/vcpkg/commands.deactivate.cpp +++ b/src/vcpkg/commands.deactivate.cpp @@ -4,19 +4,25 @@ #include #include -namespace +namespace vcpkg { - using namespace vcpkg; + constexpr CommandMetadata CommandDeactivateMetadata{ + "deactivate", + msgCmdDeactivateSynopsis, + {"vcpkg deactivate"}, + Undocumented, + AutocompletePriority::Public, + 0, + 0, + {}, + nullptr, + }; - const CommandStructure COMMAND_STRUCTURE = {[] { return create_example_string("deactivate"); }, 0, 0}; -} - -namespace vcpkg::Commands -{ - void DeactivateCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + void command_deactivate_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - (void)args.parse_arguments(COMMAND_STRUCTURE); + (void)args.parse_arguments(CommandDeactivateMetadata); + const std::string deactivate = "deactivate"; Checks::exit_with_code(VCPKG_LINE_INFO, - run_configure_environment_command(paths, "deactivate", View{})); + run_configure_environment_command(paths, View{&deactivate, 1})); } } diff --git a/src/vcpkg/commands.depend-info.cpp b/src/vcpkg/commands.depend-info.cpp new file mode 100644 index 0000000000..a0c0d85d51 --- /dev/null +++ b/src/vcpkg/commands.depend-info.cpp @@ -0,0 +1,534 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +using namespace vcpkg; + +namespace +{ + // invariant: prefix_buf is equivalent on exitv (but may have been reallocated) + void print_dep_tree(std::string& prefix_buf, + const std::string& currDepend, + const std::vector& allDepends, + std::set& printed) + { + if (prefix_buf.size() > 400) + { + Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgExceededRecursionDepth); + } + auto currPos = std::find_if( + allDepends.begin(), allDepends.end(), [&currDepend](const auto& p) { return p.package == currDepend; }); + Checks::check_exit(VCPKG_LINE_INFO, currPos != allDepends.end(), "internal vcpkg error"); + if (currPos->dependencies.empty()) + { + return; + } + + const size_t original_size = prefix_buf.size(); + + if (Util::Sets::contains(printed, currDepend)) + { + // If we've already printed the set of dependencies, print an elipsis instead + Strings::append(prefix_buf, "+- ...\n"); + msg::write_unlocalized_text_to_stdout(Color::none, prefix_buf); + prefix_buf.resize(original_size); + } + else + { + printed.insert(currDepend); + + for (auto i = currPos->dependencies.begin(); i != currPos->dependencies.end() - 1; ++i) + { + // Print the current level + Strings::append(prefix_buf, "+-- ", *i, "\n"); + msg::write_unlocalized_text_to_stdout(Color::none, prefix_buf); + prefix_buf.resize(original_size); + + // Recurse + prefix_buf.append("| "); + print_dep_tree(prefix_buf, *i, allDepends, printed); + prefix_buf.resize(original_size); + } + + // Print the last of the current level + Strings::append(prefix_buf, "+-- ", currPos->dependencies.back(), "\n"); + msg::write_unlocalized_text_to_stdout(Color::none, prefix_buf); + prefix_buf.resize(original_size); + + // Recurse + prefix_buf.append(" "); + print_dep_tree(prefix_buf, currPos->dependencies.back(), allDepends, printed); + prefix_buf.resize(original_size); + } + } + + constexpr StringLiteral OPTION_DOT = "dot"; + constexpr StringLiteral OPTION_DGML = "dgml"; + constexpr StringLiteral OPTION_SHOW_DEPTH = "show-depth"; + constexpr StringLiteral OPTION_MAX_RECURSE = "max-recurse"; + constexpr StringLiteral OPTION_SORT = "sort"; + constexpr StringLiteral OPTION_FORMAT = "format"; + + constexpr CommandSwitch DEPEND_SWITCHES[] = { + {OPTION_DOT, {}}, + {OPTION_DGML, {}}, + {OPTION_SHOW_DEPTH, msgCmdDependInfoOptDepth}, + }; + + constexpr CommandSetting DEPEND_SETTINGS[] = { + {OPTION_MAX_RECURSE, msgCmdDependInfoOptMaxRecurse}, + {OPTION_SORT, msgCmdDependInfoOptSort}, + {OPTION_FORMAT, msgCmdDependInfoFormatHelp}, + }; + + void assign_depth_to_dependencies(const std::string& package, + const int depth, + const int max_depth, + std::map& dependencies_map) + { + auto iter = dependencies_map.find(package); + if (iter == dependencies_map.end()) + { + Checks::unreachable(VCPKG_LINE_INFO, fmt::format("Not found in dependency graph: {}", package)); + } + + PackageDependInfo& info = iter->second; + + if (depth > info.depth) + { + info.depth = depth; + if (depth < max_depth) + { + for (auto&& dependency : info.dependencies) + { + assign_depth_to_dependencies(dependency, depth + 1, max_depth, dependencies_map); + } + } + } + } + + std::vector extract_depend_info(const std::vector& install_actions, + const int max_depth) + { + std::map package_dependencies; + for (const InstallPlanAction* pia : install_actions) + { + const InstallPlanAction& install_action = *pia; + + const std::vector dependencies = + Util::fmap(install_action.package_dependencies, [](const PackageSpec& spec) { return spec.name(); }); + + std::unordered_set features{install_action.feature_list.begin(), + install_action.feature_list.end()}; + features.erase("core"); + + auto& port_name = install_action.spec.name(); + + PackageDependInfo info{port_name, -1, features, dependencies}; + package_dependencies.emplace(port_name, std::move(info)); + } + + const InstallPlanAction& init = *install_actions.back(); + assign_depth_to_dependencies(init.spec.name(), 0, max_depth, package_dependencies); + + std::vector out = + Util::fmap(package_dependencies, [](auto&& kvpair) -> PackageDependInfo { return kvpair.second; }); + Util::erase_remove_if(out, [](auto&& info) { return info.depth < 0; }); + return out; + } + + // Try to emplace candidate into maybe_target. If that would be inconsistent, return true. + // An engaged maybe_target is consistent with candidate if the contained value equals candidate. + template + bool emplace_inconsistent(Optional& maybe_target, const T& candidate) + { + if (auto target = maybe_target.get()) + { + return *target != candidate; + } + + maybe_target.emplace(candidate); + return false; + } +} // unnamed namespace + +namespace vcpkg +{ + std::string create_dot_as_string(const std::vector& depend_info) + { + int empty_node_count = 0; + + std::string s = "digraph G{ rankdir=LR; edge [minlen=3]; overlap=false;"; + + for (const auto& package : depend_info) + { + if (package.dependencies.empty()) + { + empty_node_count++; + continue; + } + + const std::string name = Strings::replace_all(std::string{package.package}, "-", "_"); + fmt::format_to(std::back_inserter(s), "{};", name); + for (const auto& d : package.dependencies) + { + const std::string dependency_name = Strings::replace_all(std::string{d}, "-", "_"); + fmt::format_to(std::back_inserter(s), "{} -> {};", name, dependency_name); + } + } + + fmt::format_to(std::back_inserter(s), "empty [label=\"{} singletons...\"]; }}", empty_node_count); + return s; + } + + std::string create_dgml_as_string(const std::vector& depend_info) + { + XmlSerializer xml; + xml.emit_declaration().open_tag(R"(DirectedGraph xmlns="http://schemas.microsoft.com/vs/2009/dgml")"); + + XmlSerializer nodes, links; + nodes.open_tag("Nodes"); + links.open_tag("Links"); + for (const auto& package : depend_info) + { + const std::string& name = package.package; + nodes.start_complex_open_tag("Node").attr("Id", name).finish_self_closing_complex_tag(); + + // Iterate over dependencies. + for (const auto& d : package.dependencies) + { + links.start_complex_open_tag("Link") + .attr("Source", name) + .attr("Target", d) + .finish_self_closing_complex_tag(); + } + } + nodes.close_tag("Nodes"); + links.close_tag("Links"); + xml.buf.append(nodes.buf).append(links.buf); + xml.close_tag("DirectedGraph"); + return xml.buf; + } + + std::string create_mermaid_as_string(const std::vector& depend_info) + { + std::string s = "flowchart TD;"; + + for (const auto& package : depend_info) + { + for (const auto& dependency : package.dependencies) + { + s.append(fmt::format(" {} --> {};", package.package, dependency)); + } + } + + return s; + } + + constexpr CommandMetadata CommandDependInfoMetadata{ + "depend-info", + msgHelpDependInfoCommand, + {msgCmdDependInfoExample1, "vcpkg depend-info zlib"}, + "https://learn.microsoft.com/vcpkg/commands/depend-info", + AutocompletePriority::Public, + 1, + 1, + {DEPEND_SWITCHES, DEPEND_SETTINGS}, + nullptr, + }; + + ExpectedL determine_depend_info_mode(const ParsedArguments& args) + { + static constexpr StringLiteral OPTION_FORMAT_LIST = "list"; + static constexpr StringLiteral OPTION_FORMAT_TREE = "tree"; + static constexpr StringLiteral OPTION_FORMAT_DOT = "dot"; + static constexpr StringLiteral OPTION_FORMAT_DGML = "dgml"; + static constexpr StringLiteral OPTION_FORMAT_MERMAID = "mermaid"; + + auto& settings = args.settings; + + Optional maybe_format; + { + auto it = settings.find(OPTION_FORMAT); + if (it != settings.end()) + { + auto as_lower = Strings::ascii_to_lowercase(it->second); + if (as_lower == OPTION_FORMAT_LIST) + { + maybe_format.emplace(DependInfoFormat::List); + } + else if (as_lower == OPTION_FORMAT_TREE) + { + maybe_format.emplace(DependInfoFormat::Tree); + } + else if (as_lower == OPTION_FORMAT_DOT) + { + maybe_format.emplace(DependInfoFormat::Dot); + } + else if (as_lower == OPTION_FORMAT_DGML) + { + maybe_format.emplace(DependInfoFormat::Dgml); + } + else if (as_lower == OPTION_FORMAT_MERMAID) + { + maybe_format.emplace(DependInfoFormat::Mermaid); + } + else + { + return msg::format_error(msgCmdDependInfoFormatInvalid, msg::value = it->second); + } + } + } + + if (Util::Sets::contains(args.switches, OPTION_DOT)) + { + if (emplace_inconsistent(maybe_format, DependInfoFormat::Dot)) + { + return msg::format_error(msgCmdDependInfoFormatConflict); + } + } + + if (Util::Sets::contains(args.switches, OPTION_DGML)) + { + if (emplace_inconsistent(maybe_format, DependInfoFormat::Dgml)) + { + return msg::format_error(msgCmdDependInfoFormatConflict); + } + } + + static constexpr StringLiteral OPTION_SORT_LEXICOGRAPHICAL = "lexicographical"; + static constexpr StringLiteral OPTION_SORT_TOPOLOGICAL = "topological"; + static constexpr StringLiteral OPTION_SORT_REVERSE = "reverse"; + static constexpr StringLiteral OPTION_SORT_TREE = "x-tree"; + Optional maybe_sort_mode; + { + auto it = settings.find(OPTION_SORT); + if (it != settings.end()) + { + auto as_lower = Strings::ascii_to_lowercase(it->second); + if (as_lower == OPTION_SORT_LEXICOGRAPHICAL) + { + maybe_sort_mode.emplace(DependInfoSortMode::Lexicographical); + } + else if (as_lower == OPTION_SORT_TOPOLOGICAL) + { + maybe_sort_mode.emplace(DependInfoSortMode::Topological); + } + else if (as_lower == OPTION_SORT_REVERSE) + { + maybe_sort_mode.emplace(DependInfoSortMode::ReverseTopological); + } + else if (as_lower == OPTION_SORT_TREE) + { + if (emplace_inconsistent(maybe_format, DependInfoFormat::Tree)) + { + return msg::format_error(msgCmdDependInfoXtreeTree); + } + } + else + { + return msg::format_error(msgInvalidCommandArgSort); + } + } + } + + DependInfoStrategy result{maybe_sort_mode.value_or(DependInfoSortMode::Topological), + maybe_format.value_or(DependInfoFormat::List), + INT_MAX, + Util::Sets::contains(args.switches, OPTION_SHOW_DEPTH)}; + + { + auto it = settings.find(OPTION_MAX_RECURSE); + if (it != settings.end()) + { + auto maybe_parsed = Strings::strto(it->second); + if (auto parsed = maybe_parsed.get()) + { + if (*parsed >= 0) + { + result.max_depth = *parsed; + } + } + else + { + return msg::format_error(msgOptionMustBeInteger, msg::option = OPTION_MAX_RECURSE); + } + } + } + + if (result.show_depth) + { + switch (result.format) + { + case DependInfoFormat::List: + case DependInfoFormat::Tree: + // ok + break; + case DependInfoFormat::Dot: + case DependInfoFormat::Dgml: + case DependInfoFormat::Mermaid: return msg::format_error(msgCmdDependInfoShowDepthFormatMismatch); + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + return result; + } + + void command_depend_info_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) + { + const ParsedArguments options = args.parse_arguments(CommandDependInfoMetadata); + const auto strategy = determine_depend_info_mode(options).value_or_exit(VCPKG_LINE_INFO); + + bool default_triplet_used = false; + const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { + return check_and_get_full_package_spec(arg, + default_triplet, + default_triplet_used, + CommandDependInfoMetadata.get_example_text(), + paths.get_triplet_db()); + }); + + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } + + auto& fs = paths.get_filesystem(); + auto registry_set = paths.make_registry_set(); + PathsPortFileProvider provider( + fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); + auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); + auto& var_provider = *var_provider_storage; + + // By passing an empty status_db, we should get a plan containing all dependencies. + // All actions in the plan should be install actions, as there's no installed packages to remove. + StatusParagraphs status_db; + auto action_plan = create_feature_install_plan( + provider, var_provider, specs, status_db, {host_triplet, paths.packages(), UnsupportedPortAction::Warn}); + action_plan.print_unsupported_warnings(); + + if (!action_plan.remove_actions.empty()) + { + Checks::unreachable(VCPKG_LINE_INFO, "Only install actions should exist in the plan"); + } + + std::vector install_actions = + Util::fmap(action_plan.already_installed, [&](const auto& action) { return &action; }); + for (auto&& action : action_plan.install_actions) + { + install_actions.push_back(&action); + } + + std::vector depend_info = extract_depend_info(install_actions, strategy.max_depth); + + if (strategy.format == DependInfoFormat::Dot) + { + msg::write_unlocalized_text_to_stdout(Color::none, create_dot_as_string(depend_info)); + msg::write_unlocalized_text_to_stdout(Color::none, "\n"); + Checks::exit_success(VCPKG_LINE_INFO); + } + + if (strategy.format == DependInfoFormat::Dgml) + { + msg::write_unlocalized_text_to_stdout(Color::none, create_dgml_as_string(depend_info)); + msg::write_unlocalized_text_to_stdout(Color::none, "\n"); + Checks::exit_success(VCPKG_LINE_INFO); + } + + if (strategy.format == DependInfoFormat::Mermaid) + { + msg::write_unlocalized_text_to_stdout(Color::none, create_mermaid_as_string(depend_info)); + msg::write_unlocalized_text_to_stdout(Color::none, "\n"); + Checks::exit_success(VCPKG_LINE_INFO); + } + + auto lex = [](const PackageDependInfo& lhs, const PackageDependInfo& rhs) -> bool { + return lhs.package < rhs.package; + }; + auto topo = [](const PackageDependInfo& lhs, const PackageDependInfo& rhs) -> bool { + return lhs.depth > rhs.depth; + }; + auto reverse = [](const PackageDependInfo& lhs, const PackageDependInfo& rhs) -> bool { + return lhs.depth < rhs.depth; + }; + + if (strategy.format == DependInfoFormat::Tree) + { + Util::sort(depend_info, reverse); + auto first = depend_info.begin(); + std::string features = Strings::join(", ", first->features); + + if (strategy.show_depth) + { + msg::write_unlocalized_text_to_stdout(Color::error, fmt::format("({})", first->depth)); + } + + msg::write_unlocalized_text_to_stdout(Color::success, first->package); + if (!features.empty()) + { + msg::write_unlocalized_text_to_stdout(Color::warning, "[" + features + "]"); + } + + msg::write_unlocalized_text_to_stdout(Color::none, "\n"); + std::set printed; + std::string prefix_buf; + print_dep_tree(prefix_buf, first->package, depend_info, printed); + Checks::exit_success(VCPKG_LINE_INFO); + } + + if (strategy.format != DependInfoFormat::List) + { + Checks::unreachable(VCPKG_LINE_INFO); + } + + switch (strategy.sort_mode) + { + case DependInfoSortMode::Lexicographical: Util::sort(depend_info, lex); break; + case DependInfoSortMode::ReverseTopological: Util::sort(depend_info, reverse); break; + case DependInfoSortMode::Topological: Util::sort(depend_info, topo); break; + default: Checks::unreachable(VCPKG_LINE_INFO); + } + + for (auto&& info : depend_info) + { + if (info.depth < 0) + { + continue; + } + + if (strategy.show_depth) + { + msg::write_unlocalized_text_to_stdout(Color::error, fmt::format("({})", info.depth)); + } + + msg::write_unlocalized_text_to_stdout(Color::success, info.package); + if (!info.features.empty()) + { + msg::write_unlocalized_text_to_stdout(Color::warning, "[" + Strings::join(", ", info.features) + "]"); + } + + msg::write_unlocalized_text_to_stdout(Color::none, ": " + Strings::join(", ", info.dependencies) + "\n"); + } + + Checks::exit_success(VCPKG_LINE_INFO); + } +} // namespace vcpkg diff --git a/src/vcpkg/commands.dependinfo.cpp b/src/vcpkg/commands.dependinfo.cpp deleted file mode 100644 index 48296658b1..0000000000 --- a/src/vcpkg/commands.dependinfo.cpp +++ /dev/null @@ -1,420 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace vcpkg::Commands::DependInfo -{ - namespace - { - struct PackageDependInfo - { - std::string package; - int depth; - std::unordered_set features; - std::vector dependencies; - }; - - // invariant: prefix_buf is equivalent on exitv (but may have been reallocated) - void print_dep_tree(std::string& prefix_buf, - const std::string& currDepend, - const std::vector& allDepends, - std::set& printed) - { - if (prefix_buf.size() > 400) - { - Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgExceededRecursionDepth); - } - auto currPos = std::find_if( - allDepends.begin(), allDepends.end(), [&currDepend](const auto& p) { return p.package == currDepend; }); - Checks::check_exit(VCPKG_LINE_INFO, currPos != allDepends.end(), "internal vcpkg error"); - if (currPos->dependencies.empty()) - { - return; - } - - const size_t original_size = prefix_buf.size(); - - if (Util::Sets::contains(printed, currDepend)) - { - // If we've already printed the set of dependencies, print an elipsis instead - Strings::append(prefix_buf, "+- ...\n"); - msg::write_unlocalized_text_to_stdout(Color::none, prefix_buf); - prefix_buf.resize(original_size); - } - else - { - printed.insert(currDepend); - - for (auto i = currPos->dependencies.begin(); i != currPos->dependencies.end() - 1; ++i) - { - // Print the current level - Strings::append(prefix_buf, "+-- ", *i, "\n"); - msg::write_unlocalized_text_to_stdout(Color::none, prefix_buf); - prefix_buf.resize(original_size); - - // Recurse - prefix_buf.append("| "); - print_dep_tree(prefix_buf, *i, allDepends, printed); - prefix_buf.resize(original_size); - } - - // Print the last of the current level - Strings::append(prefix_buf, "+-- ", currPos->dependencies.back(), "\n"); - msg::write_unlocalized_text_to_stdout(Color::none, prefix_buf); - prefix_buf.resize(original_size); - - // Recurse - prefix_buf.append(" "); - print_dep_tree(prefix_buf, currPos->dependencies.back(), allDepends, printed); - prefix_buf.resize(original_size); - } - } - - constexpr StringLiteral OPTION_DOT = "dot"; - constexpr StringLiteral OPTION_DGML = "dgml"; - constexpr StringLiteral OPTION_SHOW_DEPTH = "show-depth"; - constexpr StringLiteral OPTION_MAX_RECURSE = "max-recurse"; - constexpr StringLiteral OPTION_SORT = "sort"; - - constexpr int NO_RECURSE_LIMIT_VALUE = -1; - - constexpr std::array DEPEND_SWITCHES = { - {{OPTION_DOT, []() { return msg::format(msgCmdDependInfoOptDot); }}, - {OPTION_DGML, []() { return msg::format(msgCmdDependInfoOptDGML); }}, - {OPTION_SHOW_DEPTH, []() { return msg::format(msgCmdDependInfoOptDepth); }}}}; - - constexpr std::array DEPEND_SETTINGS = { - {{OPTION_MAX_RECURSE, []() { return msg::format(msgCmdDependInfoOptMaxRecurse); }}, - {OPTION_SORT, []() { return msg::format(msgCmdDependInfoOptSort); }}}}; - - enum SortMode - { - Lexicographical = 0, - Topological, - ReverseTopological, - Treelogical, - Default = Topological - }; - - int get_max_depth(const ParsedArguments& options) - { - auto iter = options.settings.find(OPTION_MAX_RECURSE); - if (iter != options.settings.end()) - { - std::string value = iter->second; - try - { - return std::max(std::stoi(value), NO_RECURSE_LIMIT_VALUE); - } - catch (std::exception&) - { - Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgOptionMustBeInteger, msg::option = "max-depth"); - } - } - // No --max-depth set, default to no limit. - return NO_RECURSE_LIMIT_VALUE; - } - - SortMode get_sort_mode(const ParsedArguments& options) - { - constexpr StringLiteral OPTION_SORT_LEXICOGRAPHICAL = "lexicographical"; - constexpr StringLiteral OPTION_SORT_TOPOLOGICAL = "topological"; - constexpr StringLiteral OPTION_SORT_REVERSE = "reverse"; - constexpr StringLiteral OPTION_SORT_TREE = "x-tree"; - - static const std::map> sortModesMap{ - {OPTION_SORT_LEXICOGRAPHICAL, Lexicographical}, - {OPTION_SORT_TOPOLOGICAL, Topological}, - {OPTION_SORT_REVERSE, ReverseTopological}, - {OPTION_SORT_TREE, Treelogical}, - }; - - auto iter = options.settings.find(OPTION_SORT); - if (iter != options.settings.end()) - { - const std::string value = Strings::ascii_to_lowercase(std::string{iter->second}); - auto it = sortModesMap.find(value); - if (it != sortModesMap.end()) - { - return it->second; - } - Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgInvalidCommandArgSort); - } - return Default; - } - - std::string create_dot_as_string(const std::vector& depend_info) - { - int empty_node_count = 0; - - std::string s; - s.append("digraph G{ rankdir=LR; edge [minlen=3]; overlap=false;"); - - for (const auto& package : depend_info) - { - if (package.dependencies.empty()) - { - empty_node_count++; - continue; - } - - const std::string name = Strings::replace_all(std::string{package.package}, "-", "_"); - fmt::format_to(std::back_inserter(s), "{};", name); - for (const auto& d : package.dependencies) - { - const std::string dependency_name = Strings::replace_all(std::string{d}, "-", "_"); - fmt::format_to(std::back_inserter(s), "{} -> {};", name, dependency_name); - } - } - - fmt::format_to(std::back_inserter(s), "empty [label=\"{} singletons...\"]; }}", empty_node_count); - return s; - } - - std::string create_dgml_as_string(const std::vector& depend_info) - { - std::string s; - s.append(""); - s.append(""); - - std::string nodes, links; - for (const auto& package : depend_info) - { - const std::string name = package.package; - fmt::format_to(std::back_inserter(nodes), "", name); - - // Iterate over dependencies. - for (const auto& d : package.dependencies) - { - fmt::format_to(std::back_inserter(links), "", name, d); - } - } - - fmt::format_to(std::back_inserter(s), "{}", nodes); - fmt::format_to(std::back_inserter(s), "{}", links); - s.append(""); - return s; - } - - std::string create_graph_as_string(const std::set>& switches, - const std::vector& depend_info) - { - if (Util::Sets::contains(switches, OPTION_DOT)) - { - return create_dot_as_string(depend_info); - } - else if (Util::Sets::contains(switches, OPTION_DGML)) - { - return create_dgml_as_string(depend_info); - } - return {}; - } - - void assign_depth_to_dependencies(const std::string& package, - const int depth, - const int max_depth, - std::map& dependencies_map) - { - auto iter = dependencies_map.find(package); - if (iter == dependencies_map.end()) - { - Checks::unreachable(VCPKG_LINE_INFO, fmt::format("Not found in dependency graph: {}", package)); - } - - PackageDependInfo& info = iter->second; - - if (depth > info.depth) - { - info.depth = depth; - if (depth < max_depth || max_depth == NO_RECURSE_LIMIT_VALUE) - { - for (auto&& dependency : info.dependencies) - { - assign_depth_to_dependencies(dependency, depth + 1, max_depth, dependencies_map); - } - } - } - } - - std::vector extract_depend_info(const std::vector& install_actions, - const int max_depth) - { - std::map package_dependencies; - for (const InstallPlanAction* pia : install_actions) - { - const InstallPlanAction& install_action = *pia; - - const std::vector dependencies = Util::fmap( - install_action.package_dependencies, [](const PackageSpec& spec) { return spec.name(); }); - - std::unordered_set features{install_action.feature_list.begin(), - install_action.feature_list.end()}; - features.erase("core"); - - std::string port_name = install_action.spec.name(); - - PackageDependInfo info{port_name, -1, features, dependencies}; - package_dependencies.emplace(port_name, std::move(info)); - } - - const InstallPlanAction& init = *install_actions.back(); - assign_depth_to_dependencies(init.spec.name(), 0, max_depth, package_dependencies); - - std::vector out = - Util::fmap(package_dependencies, [](auto&& kvpair) -> PackageDependInfo { return kvpair.second; }); - Util::erase_remove_if(out, [](auto&& info) { return info.depth < 0; }); - return out; - } - } - - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("depend-info sqlite3"); }, - 1, - 1, - {DEPEND_SWITCHES, DEPEND_SETTINGS}, - nullptr, - }; - - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) - { - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); - const int max_depth = get_max_depth(options); - const SortMode sort_mode = get_sort_mode(options); - const bool show_depth = Util::Sets::contains(options.switches, OPTION_SHOW_DEPTH); - - const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_full_package_spec( - std::string{arg}, default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); - }); - - print_default_triplet_warning(args, options.command_arguments); - - auto& fs = paths.get_filesystem(); - auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider( - fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); - auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); - auto& var_provider = *var_provider_storage; - - // By passing an empty status_db, we should get a plan containing all dependencies. - // All actions in the plan should be install actions, as there's no installed packages to remove. - StatusParagraphs status_db; - auto action_plan = create_feature_install_plan( - provider, var_provider, specs, status_db, {host_triplet, UnsupportedPortAction::Warn}); - action_plan.print_unsupported_warnings(); - - if (!action_plan.remove_actions.empty()) - { - Checks::unreachable(VCPKG_LINE_INFO, "Only install actions should exist in the plan"); - } - - std::vector install_actions = - Util::fmap(action_plan.already_installed, [&](const auto& action) { return &action; }); - for (auto&& action : action_plan.install_actions) - install_actions.push_back(&action); - - std::vector depend_info = extract_depend_info(install_actions, max_depth); - - if (Util::Sets::contains(options.switches, OPTION_DOT) || Util::Sets::contains(options.switches, OPTION_DGML)) - { - const std::vector source_control_files = - Util::fmap(install_actions, [](const InstallPlanAction* install_action) { - const SourceControlFileAndLocation& scfl = - install_action->source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO); - return const_cast(scfl.source_control_file.get()); - }); - - std::string graph_as_string = create_graph_as_string(options.switches, depend_info); - graph_as_string.push_back('\n'); - msg::write_unlocalized_text_to_stdout(Color::none, graph_as_string); - Checks::exit_success(VCPKG_LINE_INFO); - } - - // TODO: Improve this code - auto lex = [](const PackageDependInfo& lhs, const PackageDependInfo& rhs) -> bool { - return lhs.package < rhs.package; - }; - auto topo = [](const PackageDependInfo& lhs, const PackageDependInfo& rhs) -> bool { - return lhs.depth > rhs.depth; - }; - auto reverse = [](const PackageDependInfo& lhs, const PackageDependInfo& rhs) -> bool { - return lhs.depth < rhs.depth; - }; - - switch (sort_mode) - { - case SortMode::Lexicographical: std::sort(std::begin(depend_info), std::end(depend_info), lex); break; - case SortMode::ReverseTopological: - case SortMode::Treelogical: std::sort(std::begin(depend_info), std::end(depend_info), reverse); break; - case SortMode::Topological: std::sort(std::begin(depend_info), std::end(depend_info), topo); break; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - - if (sort_mode == SortMode::Treelogical) - { - auto first = depend_info.begin(); - std::string features = Strings::join(", ", first->features); - - if (show_depth) - { - msg::write_unlocalized_text_to_stdout(Color::error, fmt::format("({})", first->depth)); - } - msg::write_unlocalized_text_to_stdout(Color::success, first->package); - if (!features.empty()) - { - msg::write_unlocalized_text_to_stdout(Color::warning, "[" + features + "]"); - } - msg::write_unlocalized_text_to_stdout(Color::none, "\n"); - std::set printed; - std::string prefix_buf; - print_dep_tree(prefix_buf, first->package, depend_info, printed); - } - else - { - for (auto&& info : depend_info) - { - if (info.depth >= 0) - { - const std::string features = Strings::join(", ", info.features); - const std::string dependencies = Strings::join(", ", info.dependencies); - - if (show_depth) - { - msg::write_unlocalized_text_to_stdout(Color::error, fmt::format("({})", info.depth)); - } - msg::write_unlocalized_text_to_stdout(Color::success, info.package); - if (!features.empty()) - { - msg::write_unlocalized_text_to_stdout(Color::warning, "[" + features + "]"); - } - msg::write_unlocalized_text_to_stdout(Color::none, ": " + dependencies + "\n"); - } - } - } - Checks::exit_success(VCPKG_LINE_INFO); - } - - void DependInfoCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - DependInfo::perform_and_exit(args, paths, default_triplet, host_triplet); - } -} diff --git a/src/vcpkg/commands.xdownload.cpp b/src/vcpkg/commands.download.cpp similarity index 70% rename from src/vcpkg/commands.xdownload.cpp rename to src/vcpkg/commands.download.cpp index 6766e0c014..aeac703691 100644 --- a/src/vcpkg/commands.xdownload.cpp +++ b/src/vcpkg/commands.download.cpp @@ -1,42 +1,49 @@ #include #include +#include #include #include #include #include #include -#include +#include #include -namespace vcpkg::Commands::X_Download +using namespace vcpkg; + +namespace { - static constexpr StringLiteral OPTION_STORE = "store"; - static constexpr StringLiteral OPTION_SKIP_SHA512 = "skip-sha512"; - static constexpr StringLiteral OPTION_SHA512 = "sha512"; - static constexpr StringLiteral OPTION_URL = "url"; - static constexpr StringLiteral OPTION_HEADER = "header"; - static constexpr StringLiteral OPTION_MACHINE_PROGRESS = "z-machine-readable-progress"; - - static constexpr CommandSwitch FETCH_SWITCHES[] = { - {OPTION_STORE, []() { return msg::format(msgCmdXDownloadOptStore); }}, - {OPTION_SKIP_SHA512, []() { return msg::format(msgCmdXDownloadOptSkipSha); }}, - {OPTION_MACHINE_PROGRESS, nullptr}}; - static constexpr CommandSetting FETCH_SETTINGS[] = { - {OPTION_SHA512, []() { return msg::format(msgCmdXDownloadOptSha); }}, + constexpr StringLiteral OPTION_STORE = "store"; + constexpr StringLiteral OPTION_SKIP_SHA512 = "skip-sha512"; + constexpr StringLiteral OPTION_SHA512 = "sha512"; + constexpr StringLiteral OPTION_URL = "url"; + constexpr StringLiteral OPTION_HEADER = "header"; + constexpr StringLiteral OPTION_MACHINE_PROGRESS = "z-machine-readable-progress"; + + constexpr CommandSwitch FETCH_SWITCHES[] = { + {OPTION_STORE, msgCmdXDownloadOptStore}, + {OPTION_SKIP_SHA512, msgCmdXDownloadOptSkipSha}, + {OPTION_MACHINE_PROGRESS, {}}, + }; + constexpr CommandSetting FETCH_SETTINGS[] = { + {OPTION_SHA512, msgCmdXDownloadOptSha}, }; - static constexpr CommandMultiSetting FETCH_MULTISETTINGS[] = { - {OPTION_URL, []() { return msg::format(msgCmdXDownloadOptUrl); }}, - {OPTION_HEADER, []() { return msg::format(msgCmdXDownloadOptHeader); }}, + constexpr CommandMultiSetting FETCH_MULTISETTINGS[] = { + {OPTION_URL, msgCmdXDownloadOptUrl}, + {OPTION_HEADER, msgCmdXDownloadOptHeader}, }; +} // unnamed namespace - const CommandStructure COMMAND_STRUCTURE = { - [] { - return create_example_string("x-download [--sha512=] [--url=https://...]...") - .append_raw('\n') - .append(create_example_string("x-download --skip-sha512 [--url=https://...]...")); - }, +namespace vcpkg +{ + constexpr CommandMetadata CommandDownloadMetadata{ + "x-download", + msgCmdDownloadSynopsis, + {msgCmdDownloadExample1, msgCmdDownloadExample2, msgCmdDownloadExample3}, + Undocumented, + AutocompletePriority::Internal, 1, 2, {FETCH_SWITCHES, FETCH_SETTINGS, FETCH_MULTISETTINGS}, @@ -81,15 +88,15 @@ namespace vcpkg::Commands::X_Download { Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgImproperShaLength, msg::value = *p); } - Strings::ascii_to_lowercase(p->data(), p->data() + p->size()); + Strings::inplace_ascii_to_lowercase(p->data(), p->data() + p->size()); } return sha; } - void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) + void command_download_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs) { - auto parsed = args.parse_arguments(COMMAND_STRUCTURE); + auto parsed = args.parse_arguments(CommandDownloadMetadata); DownloadManager download_manager{ parse_download_configuration(args.asset_sources_template()).value_or_exit(VCPKG_LINE_INFO)}; auto file = fs.absolute(parsed.command_arguments[0], VCPKG_LINE_INFO); @@ -147,9 +154,4 @@ namespace vcpkg::Commands::X_Download Checks::exit_success(VCPKG_LINE_INFO); } } - - void XDownloadCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const - { - X_Download::perform_and_exit(args, fs); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.edit.cpp b/src/vcpkg/commands.edit.cpp index 437dc13938..9bacec7088 100644 --- a/src/vcpkg/commands.edit.cpp +++ b/src/vcpkg/commands.edit.cpp @@ -1,10 +1,11 @@ +#include #include #include #include #include #include -#include +#include #include #include #include @@ -12,10 +13,11 @@ #include -#if defined(_WIN32) +using namespace vcpkg; + namespace { - using namespace vcpkg; +#if defined(_WIN32) std::vector find_from_registry() { std::vector output; @@ -39,13 +41,13 @@ namespace for (auto&& keypath : REGKEYS) { - const ExpectedL code_installpath = + ExpectedL code_installpath = get_registry_string(keypath.root, keypath.subkey, "InstallLocation"); - if (const auto c = code_installpath.get()) + if (auto c = code_installpath.get()) { - const Path install_path = *c; + Path install_path = std::move(*c); output.push_back(install_path / "Code - Insiders.exe"); - output.push_back(install_path / "Code.exe"); + output.push_back(std::move(install_path) / "Code.exe"); } } return output; @@ -78,38 +80,27 @@ namespace } while (!done); return Strings::to_utf8(result); } -} #endif -namespace vcpkg::Commands::Edit -{ - static constexpr StringLiteral OPTION_BUILDTREES = "buildtrees"; + constexpr StringLiteral OPTION_BUILDTREES = "buildtrees"; - static constexpr StringLiteral OPTION_ALL = "all"; + constexpr StringLiteral OPTION_ALL = "all"; - static std::vector valid_arguments(const VcpkgPaths& paths) + std::vector valid_arguments(const VcpkgPaths& paths) { - auto registry_set = paths.make_registry_set(); - auto sources_and_errors = Paragraphs::try_load_all_registry_ports(paths.get_filesystem(), *registry_set); - - return Util::fmap(sources_and_errors.paragraphs, Paragraphs::get_name_of_control_file); + return Util::fmap( + paths.get_filesystem().get_directories_non_recursive(paths.builtin_ports_directory(), IgnoreErrors{}), + [](const Path& p) { return p.filename().to_string(); }); } - static constexpr std::array EDIT_SWITCHES = { - {{OPTION_BUILDTREES, []() { return msg::format(msgCmdEditOptBuildTrees); }}, - {OPTION_ALL, []() { return msg::format(msgCmdEditOptAll); }}}}; - - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("edit zlib"); }, - 1, - 10, - {EDIT_SWITCHES, {}}, - &valid_arguments, + constexpr CommandSwitch EDIT_SWITCHES[] = { + {OPTION_BUILDTREES, msgCmdEditOptBuildTrees}, + {OPTION_ALL, msgCmdEditOptAll}, }; - static std::vector create_editor_arguments(const VcpkgPaths& paths, - const ParsedArguments& options, - const std::vector& ports) + std::vector create_editor_arguments(const VcpkgPaths& paths, + const ParsedArguments& options, + const std::vector& ports) { if (Util::Sets::contains(options.switches, OPTION_ALL)) { @@ -151,11 +142,27 @@ namespace vcpkg::Commands::Edit }); } - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandEditMetadata{ + "edit", + [] { return msg::format(msgHelpEditCommand, msg::env_var = format_environment_variable("EDITOR")); }, + {msgCmdEditExample1, "vcpkg edit zlib"}, + Undocumented, + AutocompletePriority::Public, + 1, + SIZE_MAX, + {EDIT_SWITCHES}, + &valid_arguments, + }; + + void command_edit_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { auto& fs = paths.get_filesystem(); - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments options = args.parse_arguments(CommandEditMetadata); const std::vector& ports = options.command_arguments; for (auto&& port_name : ports) @@ -169,10 +176,14 @@ namespace vcpkg::Commands::Edit } std::vector candidate_paths; - auto maybe_editor_path = get_environment_variable("EDITOR"); - if (const std::string* editor_path = maybe_editor_path.get()) + + // Scope to prevent use of moved-from variable { - candidate_paths.emplace_back(*editor_path); + auto maybe_editor_path = get_environment_variable("EDITOR"); + if (std::string* editor_path = maybe_editor_path.get()) + { + candidate_paths.emplace_back(std::move(*editor_path)); + } } #ifdef _WIN32 @@ -193,17 +204,17 @@ namespace vcpkg::Commands::Edit candidate_paths.push_back(*pf / VS_CODE); } - const auto& app_data = get_environment_variable("APPDATA"); - if (const auto* ad = app_data.get()) + auto app_data = get_environment_variable("APPDATA"); + if (auto* ad = app_data.get()) { - Path default_base = *ad; + Path default_base = std::move(*ad); default_base.replace_filename("Local\\Programs"); candidate_paths.push_back(default_base / VS_CODE_INSIDERS); - candidate_paths.push_back(default_base / VS_CODE); + candidate_paths.push_back(std::move(default_base) / VS_CODE); } - const std::vector from_registry = find_from_registry(); - candidate_paths.insert(candidate_paths.end(), from_registry.cbegin(), from_registry.cend()); + std::vector from_registry = find_from_registry(); + candidate_paths.insert(candidate_paths.end(), from_registry.begin(), from_registry.end()); const auto txt_default = get_registry_string(HKEY_CLASSES_ROOT, R"(.txt\ShellNew)", "ItemName"); if (const auto entry = txt_default.get()) @@ -244,15 +255,15 @@ namespace vcpkg::Commands::Edit const auto it = Util::find_if(candidate_paths, [&](const Path& p) { return fs.exists(p, IgnoreErrors{}); }); if (it == candidate_paths.cend()) { - msg::println_error(msg::format(msgErrorVsCodeNotFound, msg::env_var = "EDITOR") + msg::println_error(msg::format(msgErrorVsCodeNotFound, msg::env_var = format_environment_variable("EDITOR")) .append_raw('\n') .append(msgErrorVsCodeNotFoundPathExamined)); - print_paths(candidate_paths); - msg::println(msgInfoSetEnvVar, msg::env_var = "EDITOR"); + print_paths(stdout_sink, candidate_paths); + msg::println(msgInfoSetEnvVar, msg::env_var = format_environment_variable("EDITOR")); Checks::exit_fail(VCPKG_LINE_INFO); } - const Path env_editor = *it; + const Path& env_editor = *it; const std::vector arguments = create_editor_arguments(paths, options, ports); const auto args_as_string = Strings::join(" ", arguments); auto cmd_line = Command(env_editor).raw_arg(args_as_string).string_arg("-n"); @@ -261,17 +272,12 @@ namespace vcpkg::Commands::Edit if (editor_exe == "Code.exe" || editor_exe == "Code - Insiders.exe") { // note that we are invoking cmd silently but Code.exe is relaunched from there - cmd_execute_background( - Command("cmd").string_arg("/c").raw_arg(Strings::concat('"', cmd_line.command_line(), R"( #include -#include #include +#include #include -#include +#include #include #include #include #include #include -namespace vcpkg::Commands::Env +using namespace vcpkg; + +namespace { - static constexpr StringLiteral OPTION_BIN = "bin"; - static constexpr StringLiteral OPTION_INCLUDE = "include"; - static constexpr StringLiteral OPTION_DEBUG_BIN = "debug-bin"; - static constexpr StringLiteral OPTION_TOOLS = "tools"; - static constexpr StringLiteral OPTION_PYTHON = "python"; - - static constexpr std::array SWITCHES = {{ - {OPTION_BIN, []() { return msg::format(msgCmdEnvOptions, msg::path = "bin/", msg::env_var = "PATH"); }}, + constexpr StringLiteral OPTION_BIN = "bin"; + constexpr StringLiteral OPTION_INCLUDE = "include"; + constexpr StringLiteral OPTION_DEBUG_BIN = "debug-bin"; + constexpr StringLiteral OPTION_TOOLS = "tools"; + constexpr StringLiteral OPTION_PYTHON = "python"; + + constexpr CommandSwitch SWITCHES[] = { + {OPTION_BIN, + [] { + return msg::format( + msgCmdEnvOptions, msg::path = "bin/", msg::env_var = format_environment_variable("PATH")); + }}, {OPTION_INCLUDE, - []() { return msg::format(msgCmdEnvOptions, msg::path = "include/", msg::env_var = "INCLUDE"); }}, + [] { + return msg::format( + msgCmdEnvOptions, msg::path = "include/", msg::env_var = format_environment_variable("INCLUDE")); + }}, {OPTION_DEBUG_BIN, - []() { return msg::format(msgCmdEnvOptions, msg::path = "debug/bin/", msg::env_var = "PATH"); }}, - {OPTION_TOOLS, []() { return msg::format(msgCmdEnvOptions, msg::path = "tools/*/", msg::env_var = "PATH"); }}, + [] { + return msg::format( + msgCmdEnvOptions, msg::path = "debug/bin/", msg::env_var = format_environment_variable("PATH")); + }}, + {OPTION_TOOLS, + [] { + return msg::format( + msgCmdEnvOptions, msg::path = "tools/*/", msg::env_var = format_environment_variable("PATH")); + }}, {OPTION_PYTHON, - []() { return msg::format(msgCmdEnvOptions, msg::path = "python/", msg::env_var = "PYTHONPATH"); }}, - }}; + [] { + return msg::format( + msgCmdEnvOptions, msg::path = "python/", msg::env_var = format_environment_variable("PYTHONPATH")); + }}, + }; - const CommandStructure COMMAND_STRUCTURE = { - [] { - return create_example_string( - fmt::format("env <{}> --triplet x64-windows", msg::format(msgOptionalCommand))); +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandEnvMetadata{ + "env", + msgHelpEnvCommand, + { + "vcpkg env --triplet x64-windows", + msgCommandEnvExample2, + "vcpkg env \"ninja --version\" --triplet x64-windows", }, + Undocumented, + AutocompletePriority::Public, 0, 1, - {SWITCHES, {}}, + {SWITCHES}, nullptr, }; // This command should probably optionally take a port - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet triplet, - Triplet /*host_triplet*/) + void command_env_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet triplet, + Triplet /*host_triplet*/) { const auto& fs = paths.get_filesystem(); - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments options = args.parse_arguments(CommandEnvMetadata); auto registry_set = paths.make_registry_set(); PathsPortFileProvider provider( @@ -96,7 +124,7 @@ namespace vcpkg::Commands::Env { if (auto e = get_environment_variable(passthrough)) { - extra_env.emplace(passthrough, e.value_or_exit(VCPKG_LINE_INFO)); + extra_env.emplace(passthrough, std::move(e.value_or_exit(VCPKG_LINE_INFO))); } } @@ -112,6 +140,7 @@ namespace vcpkg::Commands::Env #if defined(_WIN32) Command cmd("cmd"); + cmd.string_arg("/d"); #else // ^^^ _WIN32 / !_WIN32 vvv Command cmd(""); Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgEnvPlatformNotSupported); @@ -129,12 +158,4 @@ namespace vcpkg::Commands::Env #endif Checks::exit_with_code(VCPKG_LINE_INFO, rc.value_or_exit(VCPKG_LINE_INFO)); } - - void EnvCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - Env::perform_and_exit(args, paths, default_triplet, host_triplet); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/export.cpp b/src/vcpkg/commands.export.cpp similarity index 65% rename from src/vcpkg/export.cpp rename to src/vcpkg/commands.export.cpp index 55467692f9..1be849645d 100644 --- a/src/vcpkg/export.cpp +++ b/src/vcpkg/commands.export.cpp @@ -6,15 +6,15 @@ #include #include +#include #include +#include +#include #include #include -#include #include #include -#include #include -#include #include #include #include @@ -23,14 +23,16 @@ #include #include -namespace vcpkg::Export +using namespace vcpkg; + +namespace { - static std::string create_nuspec_file_contents(const Path& raw_exported_dir, - const Path& targets_redirect_path, - const Path& props_redirect_path, - const std::string& nuget_id, - const std::string& nupkg_version, - const std::string& nuget_description) + std::string create_nuspec_file_contents(const Path& raw_exported_dir, + const Path& targets_redirect_path, + const Path& props_redirect_path, + const std::string& nuget_id, + const std::string& nupkg_version, + const std::string& nuget_description) { XmlSerializer xml; xml.open_tag("package").line_break(); @@ -77,7 +79,7 @@ namespace vcpkg::Export return std::move(xml.buf); } - static std::string create_targets_redirect(const std::string& target_path) noexcept + std::string create_targets_redirect(const std::string& target_path) noexcept { return fmt::format(R"###( @@ -88,10 +90,13 @@ namespace vcpkg::Export target_path); } - static void print_plan(const std::map>& group_by_plan_type) + void print_export_plan(const std::map>& group_by_plan_type) { - static constexpr std::array ORDER = {ExportPlanType::ALREADY_BUILT, - ExportPlanType::NOT_BUILT}; + static constexpr ExportPlanType ORDER[] = { + ExportPlanType::ALREADY_BUILT, + ExportPlanType::NOT_BUILT, + }; + for (const ExportPlanType plan_type : ORDER) { const auto it = group_by_plan_type.find(plan_type); @@ -102,24 +107,24 @@ namespace vcpkg::Export std::vector cont = it->second; std::sort(cont.begin(), cont.end(), &ExportPlanAction::compare_by_name); - const std::string as_string = Strings::join("\n", cont, [](const ExportPlanAction* p) { - return to_output_string(p->request_type, p->spec.to_string(), default_build_package_options); - }); + LocalizedString msg; + if (plan_type == ExportPlanType::ALREADY_BUILT) + msg = msg::format(msgExportingAlreadyBuiltPackages); + else if (plan_type == ExportPlanType::NOT_BUILT) + msg = msg::format(msgPackagesToInstall); + else + Checks::unreachable(VCPKG_LINE_INFO); - switch (plan_type) + msg.append_raw('\n'); + for (auto&& action : cont) { - case ExportPlanType::ALREADY_BUILT: - msg::println(msg::format(msgExportingAlreadyBuiltPackages).append_raw("\n" + as_string)); - continue; - case ExportPlanType::NOT_BUILT: - msg::println(msg::format(msgPackagesToInstall).append_raw("\n" + as_string)); - continue; - default: Checks::unreachable(VCPKG_LINE_INFO); + msg.append_raw(request_type_indent(action->request_type)).append_raw(action->spec).append_raw('\n'); } + msg::print(msg); } } - static std::string create_export_id() + std::string create_export_id() { const tm date_time = get_current_date_time_local(); @@ -136,14 +141,14 @@ namespace vcpkg::Export return ("vcpkg-export-" + date_time_as_string); } - static Path do_nuget_export(const VcpkgPaths& paths, - const std::string& nuget_id, - const std::string& nuget_version, - const std::string& nuget_description, - const Path& raw_exported_dir, - const Path& output_dir) + Path do_nuget_export(const VcpkgPaths& paths, + const std::string& nuget_id, + const std::string& nuget_version, + const std::string& nuget_description, + const Path& raw_exported_dir, + const Path& output_dir) { - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); fs.create_directories(paths.buildsystems / "tmp", IgnoreErrors{}); // This file will be placed in "build\native" in the nuget package. Therefore, go up two dirs. @@ -212,10 +217,10 @@ namespace vcpkg::Export constexpr const ArchiveFormat SEVEN_ZIP(ArchiveFormat::BackingEnum::SEVEN_ZIP, "7z", "7zip"); } - static Path do_archive_export(const VcpkgPaths& paths, - const Path& raw_exported_dir, - const Path& output_dir, - const ArchiveFormat& format) + Path do_archive_export(const VcpkgPaths& paths, + const Path& raw_exported_dir, + const Path& output_dir, + const ArchiveFormat& format) { const Path& cmake_exe = paths.get_tool_exe(Tools::CMAKE, stdout_sink); @@ -239,45 +244,6 @@ namespace vcpkg::Export return exported_archive_path; } - static Optional maybe_lookup(std::map> const& m, StringView key) - { - const auto it = m.find(key); - if (it != m.end()) return it->second; - return nullopt; - } - - void export_integration_files(const Path& raw_exported_dir_path, const VcpkgPaths& paths) - { - const std::vector integration_files_relative_to_root = { - Path{"scripts/buildsystems/msbuild/applocal.ps1"}, - Path{"scripts/buildsystems/msbuild/vcpkg.targets"}, - Path{"scripts/buildsystems/msbuild/vcpkg.props"}, - Path{"scripts/buildsystems/msbuild/vcpkg-general.xml"}, - Path{"scripts/buildsystems/vcpkg.cmake"}, - Path{"scripts/cmake/vcpkg_get_windows_sdk.cmake"}, - }; - - Filesystem& fs = paths.get_filesystem(); - for (const Path& file : integration_files_relative_to_root) - { - const auto source = paths.root / file; - auto destination = raw_exported_dir_path / file; - fs.create_directories(destination.parent_path(), IgnoreErrors{}); - fs.copy_file(source, destination, CopyOptions::overwrite_existing, VCPKG_LINE_INFO); - } - - // Copying exe (this is not relative to root) - Path vcpkg_exe = get_exe_path_of_current_process(); -#if defined(_WIN32) - auto destination = raw_exported_dir_path / "vcpkg.exe"; -#else - auto destination = raw_exported_dir_path / "vcpkg"; -#endif - fs.copy_file(vcpkg_exe, destination, CopyOptions::overwrite_existing, VCPKG_LINE_INFO); - - fs.write_contents(raw_exported_dir_path / ".vcpkg-root", "", VCPKG_LINE_INFO); - } - struct ExportArguments { bool dry_run = false; @@ -303,108 +269,122 @@ namespace vcpkg::Export std::vector specs; }; - static constexpr StringLiteral OPTION_OUTPUT = "output"; - static constexpr StringLiteral OPTION_OUTPUT_DIR = "output-dir"; - static constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; - static constexpr StringLiteral OPTION_RAW = "raw"; - static constexpr StringLiteral OPTION_NUGET = "nuget"; - static constexpr StringLiteral OPTION_IFW = "ifw"; - static constexpr StringLiteral OPTION_ZIP = "zip"; - static constexpr StringLiteral OPTION_SEVEN_ZIP = "7zip"; - static constexpr StringLiteral OPTION_NUGET_ID = "nuget-id"; - static constexpr StringLiteral OPTION_NUGET_DESCRIPTION = "nuget-description"; - static constexpr StringLiteral OPTION_NUGET_VERSION = "nuget-version"; - static constexpr StringLiteral OPTION_IFW_REPOSITORY_URL = "ifw-repository-url"; - static constexpr StringLiteral OPTION_IFW_PACKAGES_DIR_PATH = "ifw-packages-directory-path"; - static constexpr StringLiteral OPTION_IFW_REPOSITORY_DIR_PATH = "ifw-repository-directory-path"; - static constexpr StringLiteral OPTION_IFW_CONFIG_FILE_PATH = "ifw-configuration-file-path"; - static constexpr StringLiteral OPTION_IFW_INSTALLER_FILE_PATH = "ifw-installer-file-path"; - static constexpr StringLiteral OPTION_CHOCOLATEY = "x-chocolatey"; - static constexpr StringLiteral OPTION_CHOCOLATEY_MAINTAINER = "x-maintainer"; - static constexpr StringLiteral OPTION_CHOCOLATEY_VERSION_SUFFIX = "x-version-suffix"; - static constexpr StringLiteral OPTION_ALL_INSTALLED = "x-all-installed"; - - static constexpr StringLiteral OPTION_PREFAB = "prefab"; - static constexpr StringLiteral OPTION_PREFAB_GROUP_ID = "prefab-group-id"; - static constexpr StringLiteral OPTION_PREFAB_ARTIFACT_ID = "prefab-artifact-id"; - static constexpr StringLiteral OPTION_PREFAB_VERSION = "prefab-version"; - static constexpr StringLiteral OPTION_PREFAB_SDK_MIN_VERSION = "prefab-min-sdk"; - static constexpr StringLiteral OPTION_PREFAB_SDK_TARGET_VERSION = "prefab-target-sdk"; - static constexpr StringLiteral OPTION_PREFAB_ENABLE_MAVEN = "prefab-maven"; - static constexpr StringLiteral OPTION_PREFAB_ENABLE_DEBUG = "prefab-debug"; - - static constexpr std::array EXPORT_SWITCHES = {{ - {OPTION_DRY_RUN, []() { return msg::format(msgCmdExportOptDryRun); }}, - {OPTION_RAW, []() { return msg::format(msgCmdExportOptRaw); }}, - {OPTION_NUGET, []() { return msg::format(msgCmdExportOptNuget); }}, - {OPTION_IFW, []() { return msg::format(msgCmdExportOptIFW); }}, - {OPTION_ZIP, []() { return msg::format(msgCmdExportOptZip); }}, - {OPTION_SEVEN_ZIP, []() { return msg::format(msgCmdExportOpt7Zip); }}, - {OPTION_CHOCOLATEY, []() { return msg::format(msgCmdExportOptChocolatey); }}, - {OPTION_PREFAB, []() { return msg::format(msgCmdExportOptPrefab); }}, - {OPTION_PREFAB_ENABLE_MAVEN, []() { return msg::format(msgCmdExportOptMaven); }}, - {OPTION_PREFAB_ENABLE_DEBUG, []() { return msg::format(msgCmdExportOptDebug); }}, - {OPTION_ALL_INSTALLED, []() { return msg::format(msgCmdExportOptInstalled); }}, - }}; - - static constexpr std::array EXPORT_SETTINGS = {{ - {OPTION_OUTPUT, []() { return msg::format(msgCmdExportSettingOutput); }}, - {OPTION_OUTPUT_DIR, []() { return msg::format(msgCmdExportSettingOutputDir); }}, - {OPTION_NUGET_ID, []() { return msg::format(msgCmdExportSettingNugetID); }}, - {OPTION_NUGET_DESCRIPTION, []() { return msg::format(msgCmdExportSettingNugetDesc); }}, - {OPTION_NUGET_VERSION, []() { return msg::format(msgCmdExportSettingNugetVersion); }}, - {OPTION_IFW_REPOSITORY_URL, []() { return msg::format(msgCmdExportSettingRepoURL); }}, - {OPTION_IFW_PACKAGES_DIR_PATH, []() { return msg::format(msgCmdExportSettingPkgDir); }}, - {OPTION_IFW_REPOSITORY_DIR_PATH, []() { return msg::format(msgCmdExportSettingRepoDir); }}, - {OPTION_IFW_CONFIG_FILE_PATH, []() { return msg::format(msgCmdExportSettingConfigFile); }}, - {OPTION_IFW_INSTALLER_FILE_PATH, []() { return msg::format(msgCmdExportSettingInstallerPath); }}, - {OPTION_CHOCOLATEY_MAINTAINER, []() { return msg::format(msgCmdExportSettingChocolateyMaint); }}, - {OPTION_CHOCOLATEY_VERSION_SUFFIX, []() { return msg::format(msgCmdExportSettingChocolateyVersion); }}, - {OPTION_PREFAB_GROUP_ID, []() { return msg::format(msgCmdExportSettingPrefabGroupID); }}, - {OPTION_PREFAB_ARTIFACT_ID, []() { return msg::format(msgCmdExportSettingPrefabArtifactID); }}, - {OPTION_PREFAB_VERSION, []() { return msg::format(msgCmdExportSettingPrefabVersion); }}, - {OPTION_PREFAB_SDK_MIN_VERSION, []() { return msg::format(msgCmdExportSettingSDKMinVersion); }}, - {OPTION_PREFAB_SDK_TARGET_VERSION, []() { return msg::format(msgCmdExportSettingSDKTargetVersion); }}, - }}; - - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("export zlib zlib:x64-windows boost --nuget"); }, - 0, - SIZE_MAX, - {EXPORT_SWITCHES, EXPORT_SETTINGS}, - nullptr, + constexpr StringLiteral OPTION_OUTPUT = "output"; + constexpr StringLiteral OPTION_OUTPUT_DIR = "output-dir"; + constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; + constexpr StringLiteral OPTION_RAW = "raw"; + constexpr StringLiteral OPTION_NUGET = "nuget"; + constexpr StringLiteral OPTION_IFW = "ifw"; + constexpr StringLiteral OPTION_ZIP = "zip"; + constexpr StringLiteral OPTION_SEVEN_ZIP = "7zip"; + constexpr StringLiteral OPTION_NUGET_ID = "nuget-id"; + constexpr StringLiteral OPTION_NUGET_DESCRIPTION = "nuget-description"; + constexpr StringLiteral OPTION_NUGET_VERSION = "nuget-version"; + constexpr StringLiteral OPTION_IFW_REPOSITORY_URL = "ifw-repository-url"; + constexpr StringLiteral OPTION_IFW_PACKAGES_DIR_PATH = "ifw-packages-directory-path"; + constexpr StringLiteral OPTION_IFW_REPOSITORY_DIR_PATH = "ifw-repository-directory-path"; + constexpr StringLiteral OPTION_IFW_CONFIG_FILE_PATH = "ifw-configuration-file-path"; + constexpr StringLiteral OPTION_IFW_INSTALLER_FILE_PATH = "ifw-installer-file-path"; + constexpr StringLiteral OPTION_CHOCOLATEY = "x-chocolatey"; + constexpr StringLiteral OPTION_CHOCOLATEY_MAINTAINER = "x-maintainer"; + constexpr StringLiteral OPTION_CHOCOLATEY_VERSION_SUFFIX = "x-version-suffix"; + constexpr StringLiteral OPTION_ALL_INSTALLED = "x-all-installed"; + + constexpr StringLiteral OPTION_PREFAB = "prefab"; + constexpr StringLiteral OPTION_PREFAB_GROUP_ID = "prefab-group-id"; + constexpr StringLiteral OPTION_PREFAB_ARTIFACT_ID = "prefab-artifact-id"; + constexpr StringLiteral OPTION_PREFAB_VERSION = "prefab-version"; + constexpr StringLiteral OPTION_PREFAB_SDK_MIN_VERSION = "prefab-min-sdk"; + constexpr StringLiteral OPTION_PREFAB_SDK_TARGET_VERSION = "prefab-target-sdk"; + constexpr StringLiteral OPTION_PREFAB_ENABLE_MAVEN = "prefab-maven"; + constexpr StringLiteral OPTION_PREFAB_ENABLE_DEBUG = "prefab-debug"; + + constexpr CommandSwitch EXPORT_SWITCHES[] = { + {OPTION_DRY_RUN, msgCmdExportOptDryRun}, + {OPTION_RAW, msgCmdExportOptRaw}, + {OPTION_NUGET, msgCmdExportOptNuget}, + {OPTION_IFW, msgCmdExportOptIFW}, + {OPTION_ZIP, msgCmdExportOptZip}, + {OPTION_SEVEN_ZIP, msgCmdExportOpt7Zip}, + {OPTION_CHOCOLATEY, msgCmdExportOptChocolatey}, + {OPTION_PREFAB, msgCmdExportOptPrefab}, + {OPTION_PREFAB_ENABLE_MAVEN, msgCmdExportOptMaven}, + {OPTION_PREFAB_ENABLE_DEBUG, msgCmdExportOptDebug}, + {OPTION_ALL_INSTALLED, msgCmdExportOptInstalled}, }; - static ExportArguments handle_export_command_arguments(const VcpkgPaths& paths, - const VcpkgCmdArguments& args, - Triplet default_triplet, - const StatusParagraphs& status_db) + constexpr CommandSetting EXPORT_SETTINGS[] = { + {OPTION_OUTPUT, msgCmdExportSettingOutput}, + {OPTION_OUTPUT_DIR, msgCmdExportSettingOutputDir}, + {OPTION_NUGET_ID, msgCmdExportSettingNugetID}, + {OPTION_NUGET_DESCRIPTION, msgCmdExportSettingNugetDesc}, + {OPTION_NUGET_VERSION, msgCmdExportSettingNugetVersion}, + {OPTION_IFW_REPOSITORY_URL, msgCmdExportSettingRepoURL}, + {OPTION_IFW_PACKAGES_DIR_PATH, msgCmdExportSettingPkgDir}, + {OPTION_IFW_REPOSITORY_DIR_PATH, msgCmdExportSettingRepoDir}, + {OPTION_IFW_CONFIG_FILE_PATH, msgCmdExportSettingConfigFile}, + {OPTION_IFW_INSTALLER_FILE_PATH, msgCmdExportSettingInstallerPath}, + {OPTION_CHOCOLATEY_MAINTAINER, msgCmdExportSettingChocolateyMaint}, + {OPTION_CHOCOLATEY_VERSION_SUFFIX, msgCmdExportSettingChocolateyVersion}, + {OPTION_PREFAB_GROUP_ID, msgCmdExportSettingPrefabGroupID}, + {OPTION_PREFAB_ARTIFACT_ID, msgCmdExportSettingPrefabArtifactID}, + {OPTION_PREFAB_VERSION, msgCmdExportSettingPrefabVersion}, + {OPTION_PREFAB_SDK_MIN_VERSION, msgCmdExportSettingSDKMinVersion}, + {OPTION_PREFAB_SDK_TARGET_VERSION, msgCmdExportSettingSDKTargetVersion}, + }; + + ExportArguments handle_export_command_arguments(const VcpkgPaths& paths, + const VcpkgCmdArguments& args, + Triplet default_triplet, + const StatusParagraphs& status_db) { ExportArguments ret; - const auto options = args.parse_arguments(COMMAND_STRUCTURE); - - ret.dry_run = options.switches.find(OPTION_DRY_RUN) != options.switches.cend(); - ret.raw = options.switches.find(OPTION_RAW) != options.switches.cend(); - ret.nuget = options.switches.find(OPTION_NUGET) != options.switches.cend(); - ret.ifw = options.switches.find(OPTION_IFW) != options.switches.cend(); - ret.zip = options.switches.find(OPTION_ZIP) != options.switches.cend(); - ret.seven_zip = options.switches.find(OPTION_SEVEN_ZIP) != options.switches.cend(); - ret.chocolatey = options.switches.find(OPTION_CHOCOLATEY) != options.switches.cend(); - ret.prefab = options.switches.find(OPTION_PREFAB) != options.switches.cend(); - ret.prefab_options.enable_maven = options.switches.find(OPTION_PREFAB_ENABLE_MAVEN) != options.switches.cend(); - ret.prefab_options.enable_debug = options.switches.find(OPTION_PREFAB_ENABLE_DEBUG) != options.switches.cend(); - ret.maybe_output = maybe_lookup(options.settings, OPTION_OUTPUT); - auto maybe_output_dir = maybe_lookup(options.settings, OPTION_OUTPUT_DIR); - if (auto output_dir = maybe_output_dir.get()) - { - ret.output_dir = paths.original_cwd / *output_dir; - } - else + const auto options = args.parse_arguments(CommandExportMetadata); + + ret.dry_run = Util::Sets::contains(options.switches, OPTION_DRY_RUN); + ret.raw = Util::Sets::contains(options.switches, OPTION_RAW); + ret.nuget = Util::Sets::contains(options.switches, OPTION_NUGET); + ret.ifw = Util::Sets::contains(options.switches, OPTION_IFW); + ret.zip = Util::Sets::contains(options.switches, OPTION_ZIP); + ret.seven_zip = Util::Sets::contains(options.switches, OPTION_SEVEN_ZIP); + ret.chocolatey = Util::Sets::contains(options.switches, OPTION_CHOCOLATEY); + ret.prefab = Util::Sets::contains(options.switches, OPTION_PREFAB); + ret.prefab_options.enable_maven = Util::Sets::contains(options.switches, OPTION_PREFAB_ENABLE_MAVEN); + ret.prefab_options.enable_debug = Util::Sets::contains(options.switches, OPTION_PREFAB_ENABLE_DEBUG); + ret.maybe_output = Util::lookup_value_copy(options.settings, OPTION_OUTPUT); + ret.all_installed = Util::Sets::contains(options.switches, OPTION_ALL_INSTALLED); + + if (paths.manifest_mode_enabled()) { - ret.output_dir = paths.root; + auto output_dir_opt = Util::lookup_value(options.settings, OPTION_OUTPUT_DIR); + + // --output-dir is required in manifest mode + if (auto d = output_dir_opt.get()) + { + ret.output_dir = paths.original_cwd / *d; + } + else + { + msg::println_error(msgMissingOption, msg::option = "output-dir"); + Checks::exit_fail(VCPKG_LINE_INFO); + } + + // Force enable --all-installed in manifest mode + ret.all_installed = true; + + // In manifest mode the entire installed directory is exported + if (!options.command_arguments.empty()) + { + msg::println_error(msgUnexpectedArgument, msg::option = options.command_arguments[0]); + Checks::exit_fail(VCPKG_LINE_INFO); + } } - ret.all_installed = options.switches.find(OPTION_ALL_INSTALLED) != options.switches.end(); + + ret.output_dir = ret.output_dir.empty() ? Util::lookup_value(options.settings, OPTION_OUTPUT_DIR) + .map([&](const Path& p) { return paths.original_cwd / p; }) + .value_or(paths.root) + : ret.output_dir; if (ret.all_installed) { @@ -417,18 +397,23 @@ namespace vcpkg::Export else { // input sanitization + bool default_triplet_used = false; ret.specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_package_spec( - std::string(arg), default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); + return parse_package_spec( + arg, default_triplet, default_triplet_used, CommandExportMetadata.get_example_text()); }); - print_default_triplet_warning(args, options.command_arguments); + + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } } if (!ret.raw && !ret.nuget && !ret.ifw && !ret.zip && !ret.seven_zip && !ret.dry_run && !ret.chocolatey && !ret.prefab) { msg::println_error(msgProvideExportType); - msg::write_unlocalized_text_to_stdout(Color::none, COMMAND_STRUCTURE.get_example_text()); + msg::write_unlocalized_text_to_stdout(Color::none, CommandExportMetadata.get_example_text()); Checks::exit_fail(VCPKG_LINE_INFO); } @@ -443,13 +428,13 @@ namespace vcpkg::Export if (is_main_opt) { for (auto&& opt : implying_opts) - opt.out_opt = maybe_lookup(options.settings, opt.name); + opt.out_opt = Util::lookup_value_copy(options.settings, opt.name); } else { for (auto&& opt : implying_opts) Checks::msg_check_exit(VCPKG_LINE_INFO, - !maybe_lookup(options.settings, opt.name), + !Util::Maps::contains(options.settings, opt.name), msgMutuallyExclusiveOption, msg::value = opt.name, msg::option = main_opt_name); @@ -494,19 +479,19 @@ namespace vcpkg::Export return ret; } - static void print_next_step_info(const Path& prefix) + void print_next_step_info(const Path& prefix) { const auto cmake_toolchain = prefix / "scripts/buildsystems/vcpkg.cmake"; const CMakeVariable cmake_variable = CMakeVariable("CMAKE_TOOLCHAIN_FILE", cmake_toolchain.generic_u8string()); msg::println(msg::format(msgCMakeUsingExportedLibs, msg::value = cmake_variable.s)); } - static void handle_raw_based_export(Span export_plan, - const ExportArguments& opts, - const std::string& export_id, - const VcpkgPaths& paths) + void handle_raw_based_export(Span export_plan, + const ExportArguments& opts, + const std::string& export_id, + const VcpkgPaths& paths) { - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); const auto raw_exported_dir_path = opts.output_dir / export_id; fs.remove_all(raw_exported_dir_path, VCPKG_LINE_INFO); @@ -593,13 +578,61 @@ namespace vcpkg::Export fs.remove_all(raw_exported_dir_path, VCPKG_LINE_INFO); } } +} // unnamed namespace - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet default_triplet) +namespace vcpkg +{ + void export_integration_files(const Path& raw_exported_dir_path, const VcpkgPaths& paths) { - if (paths.manifest_mode_enabled()) + const std::vector integration_files_relative_to_root = { + Path{"scripts/buildsystems/msbuild/applocal.ps1"}, + Path{"scripts/buildsystems/msbuild/vcpkg.targets"}, + Path{"scripts/buildsystems/msbuild/vcpkg.props"}, + Path{"scripts/buildsystems/msbuild/vcpkg-general.xml"}, + Path{"scripts/buildsystems/vcpkg.cmake"}, + Path{"scripts/buildsystems/osx/applocal.py"}, + Path{"scripts/cmake/vcpkg_get_windows_sdk.cmake"}, + }; + + const Filesystem& fs = paths.get_filesystem(); + for (const Path& file : integration_files_relative_to_root) { - Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, msgExportUnsupportedInManifest); + const auto source = paths.root / file; + auto destination = raw_exported_dir_path / file; + fs.create_directories(destination.parent_path(), IgnoreErrors{}); + fs.copy_file(source, destination, CopyOptions::overwrite_existing, VCPKG_LINE_INFO); } + + // Copying exe (this is not relative to root) + Path vcpkg_exe = get_exe_path_of_current_process(); +#if defined(_WIN32) + auto destination = raw_exported_dir_path / "vcpkg.exe"; +#else + auto destination = raw_exported_dir_path / "vcpkg"; +#endif + fs.copy_file(vcpkg_exe, destination, CopyOptions::overwrite_existing, VCPKG_LINE_INFO); + + fs.write_contents(raw_exported_dir_path / ".vcpkg-root", "", VCPKG_LINE_INFO); + } + + constexpr CommandMetadata CommandExportMetadata{ + "export", + msgCmdExportSynopsis, + {msgCmdExportExample1, "vcpkg export zlib zlib:x64-windows boost --nuget"}, + "https://learn.microsoft.com/vcpkg/commands/export", + AutocompletePriority::Public, + 0, + SIZE_MAX, + {EXPORT_SWITCHES, EXPORT_SETTINGS}, + nullptr, + }; + + void command_export_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) + { + (void)host_triplet; const StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); const auto opts = handle_export_command_arguments(paths, args, default_triplet, status_db); @@ -613,13 +646,13 @@ namespace vcpkg::Export std::vector export_plan = create_export_plan(opts.specs, status_db); if (export_plan.empty()) { - Debug::print("Export plan cannot be empty."); + msg::println_error(msgCmdExportEmptyPlan); Checks::exit_fail(VCPKG_LINE_INFO); } std::map> group_by_plan_type; Util::group_by(export_plan, &group_by_plan_type, [](const ExportPlanAction& p) { return p.plan_type; }); - print_plan(group_by_plan_type); + print_export_plan(group_by_plan_type); const bool has_non_user_requested_packages = Util::find_if(export_plan, [](const ExportPlanAction& package) -> bool { @@ -675,12 +708,4 @@ namespace vcpkg::Export Checks::exit_success(VCPKG_LINE_INFO); } - - void ExportCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet /*host_triplet*/) const - { - Export::perform_and_exit(args, paths, default_triplet); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.fetch.cpp b/src/vcpkg/commands.fetch.cpp index a843858d34..d824227db5 100644 --- a/src/vcpkg/commands.fetch.cpp +++ b/src/vcpkg/commands.fetch.cpp @@ -6,31 +6,36 @@ #include #include -namespace vcpkg::Commands::Fetch +using namespace vcpkg; + +namespace { - static constexpr CommandSwitch STDERR_STATUS = {"x-stderr-status", - []() { return msg::format(msgCmdFetchOptXStderrStatus); }}; + static constexpr CommandSwitch STDERR_STATUS[] = { + {"x-stderr-status", msgCmdFetchOptXStderrStatus}, + }; +} // unnamed namespace - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("fetch cmake"); }, +namespace vcpkg +{ + constexpr CommandMetadata CommandFetchMetadata{ + "fetch", + msgCmdFetchSynopsis, + {"vcpkg fetch python"}, + Undocumented, + AutocompletePriority::Public, 1, 1, - {{&STDERR_STATUS, 1}}, + {STDERR_STATUS}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_fetch_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - const auto parsed = args.parse_arguments(COMMAND_STRUCTURE); - const bool stderr_status = Util::Sets::contains(parsed.switches, STDERR_STATUS.name); + const auto parsed = args.parse_arguments(CommandFetchMetadata); + const bool stderr_status = Util::Sets::contains(parsed.switches, STDERR_STATUS[0].name); const std::string tool = parsed.command_arguments[0]; const Path& tool_path = paths.get_tool_exe(tool, stderr_status ? stderr_sink : stdout_sink); msg::write_unlocalized_text_to_stdout(Color::none, tool_path.native() + '\n'); Checks::exit_success(VCPKG_LINE_INFO); } - - void FetchCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - Fetch::perform_and_exit(args, paths); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.find.cpp b/src/vcpkg/commands.find.cpp index 8b267c4168..89975f774b 100644 --- a/src/vcpkg/commands.find.cpp +++ b/src/vcpkg/commands.find.cpp @@ -1,11 +1,12 @@ #include +#include #include #include +#include #include #include #include -#include #include #include #include @@ -101,27 +102,33 @@ namespace constexpr StringLiteral OPTION_FULLDESC = "x-full-desc"; // TODO: This should find a better home, eventually constexpr StringLiteral OPTION_JSON = "x-json"; - constexpr std::array FindSwitches = {{ - {OPTION_FULLDESC, []() { return msg::format(msgHelpTextOptFullDesc); }}, - {OPTION_JSON, []() { return msg::format(msgJsonSwitch); }}, - }}; - - const CommandStructure FindCommandStructure = { - [] { - return msg::format(msgFindHelp) - .append_raw('\n') - .append(create_example_string("find port png")) - .append_raw('\n') - .append(create_example_string("find artifact cmake")); - }, - 1, - 2, - {FindSwitches, {}}, - nullptr, + constexpr CommandSwitch FindSwitches[] = { + {OPTION_FULLDESC, msgHelpTextOptFullDesc}, + {OPTION_JSON, msgJsonSwitch}, }; -} -namespace vcpkg::Commands + void perform_find_artifact_and_exit(const VcpkgPaths& paths, + Optional filter, + Optional version) + { + std::vector ce_args; + ce_args.emplace_back("find"); + if (auto* filter_str = filter.get()) + { + ce_args.emplace_back(filter_str->data(), filter_str->size()); + } + + if (auto v = version.get()) + { + ce_args.emplace_back("--version"); + ce_args.emplace_back(*v); + } + + Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ce_args)); + } +} // unnamed namespace + +namespace vcpkg { void perform_find_port_and_exit(const VcpkgPaths& paths, bool full_description, @@ -207,21 +214,26 @@ namespace vcpkg::Commands Checks::exit_success(VCPKG_LINE_INFO); } - void perform_find_artifact_and_exit(const VcpkgPaths& paths, Optional filter) - { - std::vector ce_args; - ce_args.emplace_back("find"); - if (auto* filter_str = filter.get()) + constexpr CommandMetadata CommandFindMetadata{ + "find", + msgCmdFindSynopsis, { - ce_args.emplace_back(filter_str->data(), filter_str->size()); - } - - Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ce_args)); - } + msgCmdFindExample1, + "vcpkg find port png", + msgCmdFindExample2, + "vcpkg find artifact cmake", + }, + Undocumented, + AutocompletePriority::Public, + 1, + 2, + {FindSwitches, CommonSelectArtifactVersionSettings}, + nullptr, + }; - void FindCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + void command_find_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - const ParsedArguments options = args.parse_arguments(FindCommandStructure); + const ParsedArguments options = args.parse_arguments(CommandFindMetadata); const bool full_description = Util::Sets::contains(options.switches, OPTION_FULLDESC); const bool enable_json = Util::Sets::contains(options.switches, OPTION_JSON); auto&& selector = options.command_arguments[0]; @@ -244,7 +256,6 @@ namespace vcpkg::Commands } Optional filter_hash = filter.map(Hash::get_string_sha256); - auto args_hash = Hash::get_string_hash(filter.value_or_exit(VCPKG_LINE_INFO), Hash::Algorithm::Sha256); MetricsSubmission metrics; metrics.track_string(StringMetric::CommandContext, "artifact"); if (auto p_filter_hash = filter_hash.get()) @@ -253,11 +264,16 @@ namespace vcpkg::Commands } get_global_metrics_collector().track_submission(std::move(metrics)); - perform_find_artifact_and_exit(paths, filter); + perform_find_artifact_and_exit(paths, filter, Util::lookup_value(options.settings, OPTION_VERSION)); } if (selector == "port") { + if (Util::Maps::contains(options.settings, OPTION_VERSION)) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgFindVersionArtifactsOnly); + } + Optional filter_hash = filter.map(Hash::get_string_sha256); MetricsSubmission metrics; metrics.track_string(StringMetric::CommandContext, "port"); @@ -272,4 +288,4 @@ namespace vcpkg::Commands Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgAddCommandFirstArg); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.format-manifest.cpp b/src/vcpkg/commands.format-manifest.cpp index c87f9dcd52..f4d04a031a 100644 --- a/src/vcpkg/commands.format-manifest.cpp +++ b/src/vcpkg/commands.format-manifest.cpp @@ -12,10 +12,10 @@ #include #include +using namespace vcpkg; + namespace { - using namespace vcpkg; - struct ToWrite { SourceControlFile scf; @@ -24,7 +24,7 @@ namespace std::string original_source; }; - Optional read_manifest(Filesystem& fs, Path&& manifest_path) + Optional read_manifest(const ReadOnlyFilesystem& fs, Path&& manifest_path) { const auto& path_string = manifest_path.native(); Debug::println("Reading ", path_string); @@ -61,7 +61,7 @@ namespace }; } - Optional read_control_file(Filesystem& fs, Path&& control_path) + Optional read_control_file(const ReadOnlyFilesystem& fs, Path&& control_path) { Debug::println("Reading ", control_path); @@ -93,7 +93,7 @@ namespace }; } - void open_for_write(Filesystem& fs, const ToWrite& data) + void open_for_write(const Filesystem& fs, const ToWrite& data) { const auto& original_path_string = data.original_path.native(); const auto& file_to_write_string = data.file_to_write.native(); @@ -153,29 +153,34 @@ namespace } } } -} -namespace vcpkg::Commands::FormatManifest -{ - static constexpr StringLiteral OPTION_ALL = "all"; - static constexpr StringLiteral OPTION_CONVERT_CONTROL = "convert-control"; + constexpr StringLiteral OPTION_ALL = "all"; + constexpr StringLiteral OPTION_CONVERT_CONTROL = "convert-control"; - const CommandSwitch FORMAT_SWITCHES[] = { - {OPTION_ALL, []() { return msg::format(msgCmdFormatManifestOptAll); }}, - {OPTION_CONVERT_CONTROL, []() { return msg::format(msgCmdFormatManifestOptConvertControl); }}, + constexpr CommandSwitch FORMAT_SWITCHES[] = { + {OPTION_ALL, msgCmdFormatManifestOptAll}, + {OPTION_CONVERT_CONTROL, msgCmdFormatManifestOptConvertControl}, }; - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("format-manifest --all"); }, +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandFormatManifestMetadata{ + "format-manifest", + msgCmdFormatManifestSynopsis, + {msgCmdFormatManifestExample1, "vcpkg format-manifest ports/zlib/vcpkg.json", "vcpkg format-manifest --all"}, + Undocumented, + AutocompletePriority::Public, 0, SIZE_MAX, - {FORMAT_SWITCHES, {}, {}}, + {FORMAT_SWITCHES}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_format_manifest_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - auto parsed_args = args.parse_arguments(COMMAND_STRUCTURE); + auto parsed_args = args.parse_arguments(CommandFormatManifestMetadata); auto& fs = paths.get_filesystem(); bool has_error = false; @@ -263,9 +268,4 @@ namespace vcpkg::Commands::FormatManifest Checks::exit_success(VCPKG_LINE_INFO); } } - - void FormatManifestCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - FormatManifest::perform_and_exit(args, paths); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.generate-msbuild-props.cpp b/src/vcpkg/commands.generate-msbuild-props.cpp index da8bfb921f..8c12c224ae 100644 --- a/src/vcpkg/commands.generate-msbuild-props.cpp +++ b/src/vcpkg/commands.generate-msbuild-props.cpp @@ -1,15 +1,48 @@ #include +#include #include #include #include -namespace vcpkg::Commands +using namespace vcpkg; + +namespace +{ + constexpr StringLiteral OPTION_MSBUILD_PROPS = "msbuild-props"; + + constexpr CommandSetting GenerateMSBuildPropsOptions[] = { + {OPTION_MSBUILD_PROPS, msgArtifactsOptionMSBuildProps}, + }; +} // unnamed namespace + +namespace vcpkg { - void GenerateMSBuildPropsCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + constexpr CommandMetadata CommandGenerateMsbuildPropsMetadata{ + "generate-msbuild-props", + msgCmdGenerateMSBuildPropsSynopsis, + {msgCmdGenerateMSBuildPropsExample1, msgCmdGenerateMSBuildPropsExample2}, + Undocumented, + AutocompletePriority::Internal, + 0, + 0, + {CommonAcquireArtifactSwitches, GenerateMSBuildPropsOptions}, + nullptr, + }; + + void command_generate_msbuild_props_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - Checks::exit_with_code( - VCPKG_LINE_INFO, - run_configure_environment_command(paths, "generate-msbuild-props", args.get_forwardable_arguments())); + auto parsed = args.parse_arguments(CommandGenerateMsbuildPropsMetadata); + std::vector ecmascript_args; + ecmascript_args.emplace_back("generate-msbuild-props"); + + forward_common_artifacts_arguments(ecmascript_args, parsed); + + if (!Util::Maps::contains(parsed.settings, OPTION_MSBUILD_PROPS)) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgOptionRequiresAValue, msg::option = OPTION_MSBUILD_PROPS); + } + + Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ecmascript_args)); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.hash.cpp b/src/vcpkg/commands.hash.cpp index da3202ec81..282f7f416d 100644 --- a/src/vcpkg/commands.hash.cpp +++ b/src/vcpkg/commands.hash.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -5,19 +6,23 @@ #include #include -namespace vcpkg::Commands::Hash +namespace vcpkg { - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("hash boost_1_62_0.tar.bz2"); }, + constexpr CommandMetadata CommandHashMetadata{ + "hash", + msgCmdHashSynopsis, + {msgCmdHashExample1, msgCmdHashExample2, "vcpkg hash boost_1_62_0.tar.bz2"}, + Undocumented, + AutocompletePriority::Public, 1, 2, {}, nullptr, }; - void HashCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const + void command_hash_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs) { - const auto parsed = args.parse_arguments(COMMAND_STRUCTURE); + const auto parsed = args.parse_arguments(CommandHashMetadata); const auto file_to_hash = (fs.current_path(VCPKG_LINE_INFO) / parsed.command_arguments[0]).lexically_normal(); diff --git a/src/vcpkg/commands.help.cpp b/src/vcpkg/commands.help.cpp new file mode 100644 index 0000000000..173e0bff68 --- /dev/null +++ b/src/vcpkg/commands.help.cpp @@ -0,0 +1,195 @@ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +using namespace vcpkg; + +namespace +{ + struct Topic + { + StringLiteral name; + void (*print)(const VcpkgPaths&); + }; + + void help_topics(const VcpkgPaths&); + + void help_topic_versioning(const VcpkgPaths&) + { + HelpTableFormatter tbl; + tbl.text(msg::format(msgHelpVersioning)); + tbl.blank(); + tbl.blank(); + tbl.header(msg::format(msgHelpVersionSchemes)); + tbl.format("version", msg::format(msgHelpVersionScheme)); + tbl.format("version-date", msg::format(msgHelpVersionDateScheme)); + tbl.format("version-semver", msg::format(msgHelpVersionSemverScheme)); + tbl.format("version-string", msg::format(msgHelpVersionStringScheme)); + tbl.blank(); + tbl.text(msg::format(msgHelpPortVersionScheme)); + tbl.blank(); + tbl.blank(); + tbl.header(msg::format(msgHelpManifestConstraints)); + tbl.format("builtin-baseline", msg::format(msgHelpBuiltinBase)); + tbl.blank(); + tbl.format("version>=", msg::format(msgHelpVersionGreater)); + tbl.blank(); + tbl.format("overrides", msg::format(msgHelpOverrides)); + tbl.blank(); + tbl.text(msg::format(msgHelpMinVersion)); + tbl.blank(); + tbl.text(msg::format(msgHelpUpdateBaseline)); + tbl.blank(); + tbl.text(msg::format(msgHelpPackagePublisher)); + tbl.blank(); + tbl.text(msg::format(msgHelpExampleManifest)); + tbl.blank(); + tbl.text(R"({ + "builtin-baseline": "a14a6bcb27287e3ec138dba1b948a0cdbc337a3a", + "dependencies": [ + { "name": "zlib", "version>=": "1.2.11#8" }, + "rapidjson" + ], + "overrides": [ + { "name": "rapidjson", "version": "2020-09-14" } + ] +})"); + msg::println(LocalizedString::from_raw(std::move(tbl).m_str)); + msg::println(msgExtendedDocumentationAtUrl, msg::url = docs::versioning_url); + } + + constexpr Topic topics[] = { + {"assetcaching", [](const VcpkgPaths&) { msg::println(format_help_topic_asset_caching()); }}, + {"binarycaching", [](const VcpkgPaths&) { msg::println(format_help_topic_binary_caching()); }}, + {"commands", [](const VcpkgPaths&) { print_full_command_list(); }}, + {"topics", help_topics}, + {"triplet", [](const VcpkgPaths& paths) { help_topic_valid_triplet(paths.get_triplet_db()); }}, + {"versioning", help_topic_versioning}, + }; + + void help_topics(const VcpkgPaths&) + { + std::vector all_topic_names; + for (auto&& topic : topics) + { + all_topic_names.push_back(LocalizedString::from_raw(topic.name)); + } + + for (auto&& command_metadata : get_all_commands_metadata()) + { + all_topic_names.push_back(LocalizedString::from_raw(command_metadata->name)); + } + + Util::sort(all_topic_names); + + LocalizedString result; + result.append(msgAvailableHelpTopics); + result.append_floating_list(1, all_topic_names); + result.append_raw('\n'); + msg::print(result); + } + +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandHelpMetadata{ + "help", + msgHelpTopicCommand, + {"vcpkg help topics", "vcpkg help commands", "vcpkg help install"}, + Undocumented, + AutocompletePriority::Public, + 0, + 1, + {}, + nullptr, + }; + + void help_topic_valid_triplet(const TripletDatabase& database) + { + std::map> triplets_per_location; + vcpkg::Util::group_by(database.available_triplets, + &triplets_per_location, + [](const TripletFile& triplet_file) -> StringView { return triplet_file.location; }); + + LocalizedString result; + result.append(msgBuiltInTriplets).append_raw('\n'); + for (auto* triplet : triplets_per_location[database.default_triplet_directory]) + { + result.append_indent().append_raw(triplet->name).append_raw('\n'); + } + + triplets_per_location.erase(database.default_triplet_directory); + result.append(msgCommunityTriplets).append_raw('\n'); + for (auto* triplet : triplets_per_location[database.community_triplet_directory]) + { + result.append_indent().append_raw(triplet->name).append_raw('\n'); + } + + triplets_per_location.erase(database.community_triplet_directory); + for (auto&& kv_pair : triplets_per_location) + { + result.append(msgOverlayTriplets, msg::path = kv_pair.first).append_raw('\n'); + for (auto* triplet : kv_pair.second) + { + result.append_indent().append_raw(triplet->name).append_raw('\n'); + } + } + + result.append(msgSeeURL, msg::url = "https://learn.microsoft.com/vcpkg/users/triplets"); + result.append_raw('\n'); + msg::print(result); + } + + void command_help_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + { + const auto parsed = args.parse_arguments(CommandHelpMetadata); + + if (parsed.command_arguments.empty()) + { + print_zero_args_usage(); + Checks::exit_success(VCPKG_LINE_INFO); + } + const auto& topic = parsed.command_arguments[0]; + if (Strings::case_insensitive_ascii_equals(topic, "triplets") || + Strings::case_insensitive_ascii_equals(topic, "triple")) + { + help_topic_valid_triplet(paths.get_triplet_db()); + get_global_metrics_collector().track_string(StringMetric::CommandContext, "triplet"); + Checks::exit_success(VCPKG_LINE_INFO); + } + + for (auto&& candidate : topics) + { + if (Strings::case_insensitive_ascii_equals(candidate.name, topic)) + { + candidate.print(paths); + get_global_metrics_collector().track_string(StringMetric::CommandContext, candidate.name); + Checks::exit_success(VCPKG_LINE_INFO); + } + } + + for (auto&& command_metadata : get_all_commands_metadata()) + { + if (Strings::case_insensitive_ascii_equals(command_metadata->name, topic)) + { + print_usage(*command_metadata); + get_global_metrics_collector().track_string(StringMetric::CommandContext, command_metadata->name); + Checks::exit_success(VCPKG_LINE_INFO); + } + } + + msg::println_error(msgUnknownTopic, msg::value = topic); + help_topics(paths); + get_global_metrics_collector().track_string(StringMetric::CommandContext, "unknown"); + Checks::exit_fail(VCPKG_LINE_INFO); + } +} // namespace vcpkg diff --git a/src/vcpkg/commands.init-registry.cpp b/src/vcpkg/commands.init-registry.cpp index ec53876828..3295ced94f 100644 --- a/src/vcpkg/commands.init-registry.cpp +++ b/src/vcpkg/commands.init-registry.cpp @@ -3,19 +3,23 @@ #include #include -namespace vcpkg::Commands::InitRegistry +namespace vcpkg { - static const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string(R"(x-init-registry .)"); }, + constexpr CommandMetadata CommandInitRegistryMetadata{ + "x-init-registry", + msgCmdInitRegistrySynopsis, + {msgCmdInitRegistryExample1, "vcpkg x-init-registry ."}, + Undocumented, + AutocompletePriority::Public, 1, 1, - {{}, {}, {}}, + {}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) + void command_init_registry_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs) { - auto parsed_args = args.parse_arguments(COMMAND_STRUCTURE); + auto parsed_args = args.parse_arguments(CommandInitRegistryMetadata); const Path string_argument = parsed_args.command_arguments.front(); const auto path = fs.current_path(VCPKG_LINE_INFO) / string_argument; @@ -40,9 +44,4 @@ namespace vcpkg::Commands::InitRegistry msg::println(msgRegistryCreated, msg::path = path); Checks::exit_success(VCPKG_LINE_INFO); } - - void InitRegistryCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const - { - InitRegistry::perform_and_exit(args, fs); - } } diff --git a/src/vcpkg/install.cpp b/src/vcpkg/commands.install.cpp similarity index 82% rename from src/vcpkg/install.cpp rename to src/vcpkg/commands.install.cpp index 83ae072047..8ccd17875d 100644 --- a/src/vcpkg/install.cpp +++ b/src/vcpkg/commands.install.cpp @@ -8,21 +8,21 @@ #include #include -#include #include -#include +#include +#include +#include +#include +#include #include #include #include #include -#include #include -#include #include #include #include #include -#include #include #include #include @@ -46,7 +46,9 @@ namespace vcpkg const Path& InstallDir::listfile() const { return this->m_listfile; } - void install_package_and_write_listfile(Filesystem& fs, const Path& source_dir, const InstallDir& destination_dir) + void install_package_and_write_listfile(const Filesystem& fs, + const Path& source_dir, + const InstallDir& destination_dir) { Checks::check_exit(VCPKG_LINE_INFO, fs.exists(source_dir, IgnoreErrors{}), @@ -55,7 +57,7 @@ namespace vcpkg Util::erase_remove_if(files, [](Path& path) { return path.filename() == ".DS_Store"; }); install_files_and_write_listfile(fs, source_dir, files, destination_dir); } - void install_files_and_write_listfile(Filesystem& fs, + void install_files_and_write_listfile(const Filesystem& fs, const Path& source_dir, const std::vector& files, const InstallDir& destination_dir) @@ -93,6 +95,7 @@ namespace vcpkg const auto suffix = file.generic_u8string().substr(prefix_length + 1); const auto target = destination / suffix; + bool use_hard_link = true; auto this_output = Strings::concat(destination_subdirectory, "/", suffix); switch (status) { @@ -114,9 +117,24 @@ namespace vcpkg if (fs.exists(target, IgnoreErrors{})) { msg::println_warning(msgOverwritingFile, msg::path = target); + fs.remove_all(target, IgnoreErrors{}); + } + if (use_hard_link) + { + fs.create_hard_link(file, target, ec); + if (ec) + { + Debug::println("Install from packages to installed: Fallback to copy " + "instead creating hard links because of: ", + ec.message()); + use_hard_link = false; + } + } + if (!use_hard_link) + { + fs.copy_file(file, target, CopyOptions::overwrite_existing, ec); } - fs.copy_file(file, target, CopyOptions::overwrite_existing, ec); if (ec) { msg::println_error(msgInstallFailed, msg::path = target, msg::error_msg = ec.message()); @@ -177,7 +195,7 @@ namespace vcpkg return output; } - static SortedVector build_list_of_package_files(const Filesystem& fs, const Path& package_dir) + static SortedVector build_list_of_package_files(const ReadOnlyFilesystem& fs, const Path& package_dir) { std::vector package_file_paths = fs.get_files_recursive(package_dir, IgnoreErrors{}); Util::erase_remove_if(package_file_paths, [](Path& path) { return path.filename() == ".DS_Store"; }); @@ -271,9 +289,7 @@ namespace vcpkg std::vector features_spghs; for (auto&& feature : bcf.features) { - features_spghs.emplace_back(); - - StatusParagraph& feature_paragraph = features_spghs.back(); + StatusParagraph& feature_paragraph = features_spghs.emplace_back(); feature_paragraph.package = feature; feature_paragraph.want = Want::INSTALL; feature_paragraph.state = InstallState::HALF_INSTALLED; @@ -285,7 +301,7 @@ namespace vcpkg const InstallDir install_dir = InstallDir::from_destination_root(paths.installed(), triplet, bcf.core_paragraph); - install_package_and_write_listfile(fs, paths.package_dir(bcf.core_paragraph.spec), install_dir); + install_package_and_write_listfile(fs, package_dir, install_dir); source_paragraph.state = InstallState::INSTALLED; write_update(fs, installed, source_paragraph); @@ -303,7 +319,7 @@ namespace vcpkg static ExtendedBuildResult perform_install_plan_action(const VcpkgCmdArguments& args, const VcpkgPaths& paths, - InstallPlanAction& action, + const InstallPlanAction& action, StatusParagraphs& status_db, BinaryCache& binary_cache, const IBuildLogsRecorder& build_logs_recorder) @@ -326,10 +342,10 @@ namespace vcpkg if (plan_type == InstallPlanType::BUILD_AND_INSTALL) { std::unique_ptr bcf; - auto restore = binary_cache.try_restore(action); - if (restore == RestoreResult::restored) + if (binary_cache.is_restored(action)) { - auto maybe_bcf = Paragraphs::try_load_cached_package(fs, paths.package_dir(action.spec), action.spec); + auto maybe_bcf = Paragraphs::try_load_cached_package( + fs, action.package_dir.value_or_exit(VCPKG_LINE_INFO), action.spec); bcf = std::make_unique(std::move(maybe_bcf).value_or_exit(VCPKG_LINE_INFO)); } else if (action.build_options.build_missing == BuildMissing::NO) @@ -381,14 +397,7 @@ namespace vcpkg case InstallResult::FILE_CONFLICTS: code = BuildResult::FILE_CONFLICTS; break; default: Checks::unreachable(VCPKG_LINE_INFO); } - if (restore != RestoreResult::restored) - { - binary_cache.push_success(action, paths.package_dir(action.spec)); - } - else if (action.build_options.clean_packages == CleanPackages::YES) - { - fs.remove_all(paths.package_dir(action.spec), VCPKG_LINE_INFO); - } + binary_cache.push_success(action); if (action.build_options.clean_downloads == CleanDownloads::YES) { @@ -510,47 +519,60 @@ namespace vcpkg msg::spec = action.spec); } - ~TrackedPackageInstallGuard() + void print_elapsed_time() const { current_summary.timing = build_timer.elapsed(); msg::println( msgElapsedForPackage, msg::spec = current_summary.get_spec(), msg::elapsed = current_summary.timing); } + ~TrackedPackageInstallGuard() { print_elapsed_time(); } + TrackedPackageInstallGuard(const TrackedPackageInstallGuard&) = delete; TrackedPackageInstallGuard& operator=(const TrackedPackageInstallGuard&) = delete; }; - InstallSummary Install::perform(const VcpkgCmdArguments& args, - ActionPlan& action_plan, - const KeepGoing keep_going, - const VcpkgPaths& paths, - StatusParagraphs& status_db, - BinaryCache& binary_cache, - const IBuildLogsRecorder& build_logs_recorder, - const CMakeVars::CMakeVarProvider& var_provider) + void install_preclear_packages(const VcpkgPaths& paths, const ActionPlan& action_plan) + { + auto& fs = paths.get_filesystem(); + for (auto&& action : action_plan.remove_actions) + { + fs.remove_all(paths.package_dir(action.spec), VCPKG_LINE_INFO); + } + + for (auto&& action : action_plan.install_actions) + { + fs.remove_all(action.package_dir.value_or_exit(VCPKG_LINE_INFO), VCPKG_LINE_INFO); + } + } + + InstallSummary install_execute_plan(const VcpkgCmdArguments& args, + const ActionPlan& action_plan, + const KeepGoing keep_going, + const VcpkgPaths& paths, + StatusParagraphs& status_db, + BinaryCache& binary_cache, + const IBuildLogsRecorder& build_logs_recorder) { const ElapsedTimer timer; std::vector results; const size_t action_count = action_plan.remove_actions.size() + action_plan.install_actions.size(); size_t action_index = 1; + auto& fs = paths.get_filesystem(); for (auto&& action : action_plan.remove_actions) { TrackedPackageInstallGuard this_install(action_index++, action_count, results, action); - Remove::perform_remove_plan_action(paths, action, Remove::Purge::YES, &status_db); + remove_package(fs, paths.installed(), action.spec, status_db); results.back().build_result.emplace(BuildResult::REMOVED); } for (auto&& action : action_plan.already_installed) { - results.emplace_back(action); - results.back().build_result.emplace( + results.emplace_back(action).build_result.emplace( perform_install_plan_action(args, paths, action, status_db, binary_cache, build_logs_recorder)); } - compute_all_abis(paths, action_plan, var_provider, status_db); - binary_cache.prefetch(action_plan.install_actions); for (auto&& action : action_plan.install_actions) { TrackedPackageInstallGuard this_install(action_index++, action_count, results, action); @@ -558,6 +580,7 @@ namespace vcpkg perform_install_plan_action(args, paths, action, status_db, binary_cache, build_logs_recorder); if (result.code != BuildResult::SUCCEEDED && keep_going == KeepGoing::NO) { + this_install.print_elapsed_time(); print_user_troubleshooting_message(action, paths, result.stdoutlog.then([&](auto&) -> Optional { auto issue_body_path = paths.installed().root() / "vcpkg" / "issue_body.md"; paths.get_filesystem().write_contents( @@ -596,75 +619,88 @@ namespace vcpkg static constexpr StringLiteral OPTION_ALLOW_UNSUPPORTED_PORT = "allow-unsupported"; static constexpr StringLiteral OPTION_NO_PRINT_USAGE = "no-print-usage"; - static constexpr std::array INSTALL_SWITCHES = { - {{OPTION_DRY_RUN, []() { return msg::format(msgHelpTxtOptDryRun); }}, - {OPTION_USE_HEAD_VERSION, []() { return msg::format(msgHelpTxtOptUseHeadVersion); }}, - {OPTION_NO_DOWNLOADS, []() { return msg::format(msgHelpTxtOptNoDownloads); }}, - {OPTION_ONLY_DOWNLOADS, []() { return msg::format(msgHelpTxtOptOnlyDownloads); }}, - {OPTION_ONLY_BINARYCACHING, []() { return msg::format(msgHelpTxtOptOnlyBinCache); }}, - {OPTION_RECURSE, []() { return msg::format(msgHelpTxtOptRecurse); }}, - {OPTION_KEEP_GOING, []() { return msg::format(msgHelpTxtOptKeepGoing); }}, - {OPTION_EDITABLE, []() { return msg::format(msgHelpTxtOptEditable); }}, - {OPTION_USE_ARIA2, []() { return msg::format(msgHelpTxtOptUseAria2); }}, - {OPTION_CLEAN_AFTER_BUILD, []() { return msg::format(msgHelpTxtOptCleanAfterBuild); }}, - {OPTION_CLEAN_BUILDTREES_AFTER_BUILD, []() { return msg::format(msgHelpTxtOptCleanBuildTreesAfterBuild); }}, - {OPTION_CLEAN_PACKAGES_AFTER_BUILD, []() { return msg::format(msgHelpTxtOptCleanPkgAfterBuild); }}, - {OPTION_CLEAN_DOWNLOADS_AFTER_BUILD, []() { return msg::format(msgHelpTxtOptCleanDownloadsAfterBuild); }}, - {OPTION_MANIFEST_NO_DEFAULT_FEATURES, []() { return msg::format(msgHelpTxtOptManifestNoDefault); }}, - {OPTION_ENFORCE_PORT_CHECKS, []() { return msg::format(msgHelpTxtOptEnforcePortChecks); }}, - {OPTION_PROHIBIT_BACKCOMPAT_FEATURES, nullptr}, - {OPTION_ALLOW_UNSUPPORTED_PORT, []() { return msg::format(msgHelpTxtOptAllowUnsupportedPort); }}, - {OPTION_NO_PRINT_USAGE, []() { return msg::format(msgHelpTxtOptNoUsage); }}}}; - - static constexpr std::array INSTALL_SETTINGS = {{ - {OPTION_XUNIT, nullptr}, // internal use - {OPTION_WRITE_PACKAGES_CONFIG, []() { return msg::format(msgHelpTxtOptWritePkgConfig); }}, - }}; - - static constexpr std::array INSTALL_MULTISETTINGS = {{ - {OPTION_MANIFEST_FEATURE, []() { return msg::format(msgHelpTxtOptManifestFeature); }}, - }}; - - static std::vector get_all_port_names(const VcpkgPaths& paths) - { - const auto registries = paths.make_registry_set(); + static constexpr CommandSwitch INSTALL_SWITCHES[] = { + {OPTION_DRY_RUN, msgHelpTxtOptDryRun}, + {OPTION_USE_HEAD_VERSION, msgHelpTxtOptUseHeadVersion}, + {OPTION_NO_DOWNLOADS, msgHelpTxtOptNoDownloads}, + {OPTION_ONLY_DOWNLOADS, msgHelpTxtOptOnlyDownloads}, + {OPTION_ONLY_BINARYCACHING, msgHelpTxtOptOnlyBinCache}, + {OPTION_RECURSE, msgHelpTxtOptRecurse}, + {OPTION_KEEP_GOING, msgHelpTxtOptKeepGoing}, + {OPTION_EDITABLE, msgHelpTxtOptEditable}, + {OPTION_USE_ARIA2, msgHelpTxtOptUseAria2}, + {OPTION_CLEAN_AFTER_BUILD, msgHelpTxtOptCleanAfterBuild}, + {OPTION_CLEAN_BUILDTREES_AFTER_BUILD, msgHelpTxtOptCleanBuildTreesAfterBuild}, + {OPTION_CLEAN_PACKAGES_AFTER_BUILD, msgHelpTxtOptCleanPkgAfterBuild}, + {OPTION_CLEAN_DOWNLOADS_AFTER_BUILD, msgHelpTxtOptCleanDownloadsAfterBuild}, + {OPTION_MANIFEST_NO_DEFAULT_FEATURES, msgHelpTxtOptManifestNoDefault}, + {OPTION_ENFORCE_PORT_CHECKS, msgHelpTxtOptEnforcePortChecks}, + {OPTION_PROHIBIT_BACKCOMPAT_FEATURES, {}}, + {OPTION_ALLOW_UNSUPPORTED_PORT, msgHelpTxtOptAllowUnsupportedPort}, + {OPTION_NO_PRINT_USAGE, msgHelpTxtOptNoUsage}, + }; - std::vector ret; - for (const auto& registry : registries->registries()) - { - const auto packages = registry.packages(); - ret.insert(ret.end(), packages.begin(), packages.end()); - } - if (auto registry = registries->default_registry()) - { - registry->get_all_port_names(ret); - } + static constexpr CommandSetting INSTALL_SETTINGS[] = { + {OPTION_XUNIT, {}}, // internal use + {OPTION_WRITE_PACKAGES_CONFIG, msgHelpTxtOptWritePkgConfig}, + }; - Util::sort_unique_erase(ret); - return ret; + static constexpr CommandMultiSetting INSTALL_MULTISETTINGS[] = { + {OPTION_MANIFEST_FEATURE, msgHelpTxtOptManifestFeature}, + }; + + static std::vector get_all_known_reachable_port_names_no_network(const VcpkgPaths& paths) + { + return paths.make_registry_set()->get_all_known_reachable_port_names_no_network().value_or_exit( + VCPKG_LINE_INFO); } - const CommandStructure Install::COMMAND_STRUCTURE = { - [] { return create_example_string("install zlib zlib:x64-windows curl boost"); }, + constexpr CommandMetadata CommandInstallMetadata{ + "install", + msgHelpInstallCommand, + {msgCmdInstallExample1, + "vcpkg install zlib zlib:x64-windows curl boost", + "vcpkg install --triplet x64-windows"}, + "https://learn.microsoft.com/vcpkg/commands/install", + AutocompletePriority::Public, 0, SIZE_MAX, {INSTALL_SWITCHES, INSTALL_SETTINGS, INSTALL_MULTISETTINGS}, - &get_all_port_names, + &get_all_known_reachable_port_names_no_network, }; - // This command structure must share "critical" values (switches, number of arguments). It exists only to provide a - // better example string. - const CommandStructure MANIFEST_COMMAND_STRUCTURE = { - [] { return create_example_string("install --triplet x64-windows"); }, + // These command metadata must share "critical" values (switches, number of arguments). They exist only to provide + // better example strings. + constexpr CommandMetadata CommandInstallMetadataClassic{ + "install", + msgHelpInstallCommand, + {msgCmdInstallExample1, "vcpkg install zlib zlib:x64-windows curl boost"}, + "https://learn.microsoft.com/vcpkg/commands/install", + AutocompletePriority::Public, + 0, + SIZE_MAX, + {INSTALL_SWITCHES, INSTALL_SETTINGS, INSTALL_MULTISETTINGS}, + &get_all_known_reachable_port_names_no_network, + }; + + constexpr CommandMetadata CommandInstallMetadataManifest{ + "install", + msgHelpInstallCommand, + {msgCmdInstallExample1, + "vcpkg install zlib zlib:x64-windows curl boost", + "vcpkg install --triplet x64-windows"}, + "https://learn.microsoft.com/vcpkg/commands/install", + AutocompletePriority::Public, 0, SIZE_MAX, {INSTALL_SWITCHES, INSTALL_SETTINGS, INSTALL_MULTISETTINGS}, nullptr, }; - void Install::print_usage_information(const BinaryParagraph& bpgh, - std::set& printed_usages, - const Filesystem& fs, - const InstalledPaths& installed) + + void install_print_usage_information(const BinaryParagraph& bpgh, + std::set& printed_usages, + const ReadOnlyFilesystem& fs, + const InstalledPaths& installed) { auto message = get_cmake_usage(fs, installed, bpgh).message; if (!message.empty()) @@ -750,7 +786,9 @@ namespace vcpkg return std::string(res); } - CMakeUsageInfo get_cmake_usage(const Filesystem& fs, const InstalledPaths& installed, const BinaryParagraph& bpgh) + CMakeUsageInfo get_cmake_usage(const ReadOnlyFilesystem& fs, + const InstalledPaths& installed, + const BinaryParagraph& bpgh) { CMakeUsageInfo ret; @@ -857,10 +895,10 @@ namespace vcpkg bool has_targets_for_output = false; for (auto&& package : config_packages) { - const auto library_target_pair = library_targets.find(package.dir); - if (library_target_pair == library_targets.end()) continue; + const auto library_target_it = library_targets.find(package.dir); + if (library_target_it == library_targets.end()) continue; - auto& targets = library_target_pair->second; + auto& targets = library_target_it->second; if (!targets.empty()) { if (!package.name.empty()) has_targets_for_output = true; @@ -917,8 +955,9 @@ namespace vcpkg } else if (ret.header_only) { - static auto cmakeify = [](std::string name) { - auto n = Strings::ascii_to_uppercase(Strings::replace_all(std::move(name), "-", "_")); + static auto cmakeify = [](StringView name) { + auto n = Strings::ascii_to_uppercase(name); + Strings::inplace_replace_all(n, "-", "_"); if (n.empty() || ParserBase::is_ascii_digit(n[0])) { n.insert(n.begin(), '_'); @@ -938,13 +977,18 @@ namespace vcpkg return ret; } - void Install::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) + static bool cmake_args_sets_variable(const VcpkgCmdArguments& args) { - const ParsedArguments options = - args.parse_arguments(paths.manifest_mode_enabled() ? MANIFEST_COMMAND_STRUCTURE : COMMAND_STRUCTURE); + return Util::any_of(args.cmake_args, [](auto& s) { return Strings::starts_with(s, "-D"); }); + } + + void command_install_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) + { + const ParsedArguments options = args.parse_arguments( + paths.manifest_mode_enabled() ? CommandInstallMetadataManifest : CommandInstallMetadataClassic); const bool dry_run = Util::Sets::contains(options.switches, OPTION_DRY_RUN); const bool use_head_version = Util::Sets::contains(options.switches, (OPTION_USE_HEAD_VERSION)); @@ -952,7 +996,8 @@ namespace vcpkg const bool only_downloads = Util::Sets::contains(options.switches, (OPTION_ONLY_DOWNLOADS)); const bool no_build_missing = Util::Sets::contains(options.switches, OPTION_ONLY_BINARYCACHING); const bool is_recursive = Util::Sets::contains(options.switches, (OPTION_RECURSE)); - const bool is_editable = Util::Sets::contains(options.switches, (OPTION_EDITABLE)) || !args.cmake_args.empty(); + const bool is_editable = + Util::Sets::contains(options.switches, (OPTION_EDITABLE)) || cmake_args_sets_variable(args); const bool use_aria2 = Util::Sets::contains(options.switches, (OPTION_USE_ARIA2)); const bool clean_after_build = Util::Sets::contains(options.switches, (OPTION_CLEAN_AFTER_BUILD)); const bool clean_buildtrees_after_build = @@ -981,7 +1026,7 @@ namespace vcpkg if (!options.command_arguments.empty()) { msg::println_error(msgErrorIndividualPackagesUnsupported); - msg::println(Color::error, msg::msgSeeURL, msg::url = docs::manifests_url); + msg::println(Color::error, msgSeeURL, msg::url = docs::manifests_url); failure = true; } if (use_head_version) @@ -997,10 +1042,11 @@ namespace vcpkg if (failure) { msg::println(msgUsingManifestAt, msg::path = p->path); - print_usage(MANIFEST_COMMAND_STRUCTURE); + print_usage(CommandInstallMetadataManifest); Checks::exit_fail(VCPKG_LINE_INFO); } - print_default_triplet_warning(args, {}); + + print_default_triplet_warning(args, paths.get_triplet_db()); } else { @@ -1022,17 +1068,11 @@ namespace vcpkg } if (failure) { - print_usage(COMMAND_STRUCTURE); + print_usage(CommandInstallMetadataClassic); Checks::exit_fail(VCPKG_LINE_INFO); } } - BinaryCache binary_cache(paths.get_filesystem()); - if (!only_downloads) - { - binary_cache.install_providers_for(args, paths); - } - auto& fs = paths.get_filesystem(); DownloadTool download_tool = DownloadTool::BUILT_IN; @@ -1055,6 +1095,8 @@ namespace vcpkg auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); auto& var_provider = *var_provider_storage; + const CreateInstallPlanOptions create_options{host_triplet, paths.packages(), unsupported_port_action}; + if (auto manifest = paths.get_manifest().get()) { Optional pkgsconfig; @@ -1069,6 +1111,7 @@ namespace vcpkg if (!maybe_manifest_scf) { print_error_message(maybe_manifest_scf.error()); + msg::println(); msg::println(msgExtendedDocumentationAtUrl, msg::url = docs::manifests_url); Checks::exit_fail(VCPKG_LINE_INFO); } @@ -1091,12 +1134,23 @@ namespace vcpkg { features.emplace_back("core"); } - + PackageSpec toplevel{manifest_core.name, default_triplet}; auto core_it = std::remove(features.begin(), features.end(), "core"); if (core_it == features.end()) { - const auto& default_features = manifest_core.default_features; - features.insert(features.end(), default_features.begin(), default_features.end()); + if (Util::any_of(manifest_core.default_features, [](const auto& f) { return !f.platform.is_empty(); })) + { + const auto& vars = var_provider.get_or_load_dep_info_vars(toplevel, host_triplet); + for (const auto& f : manifest_core.default_features) + { + if (f.platform.evaluate(vars)) features.push_back(f.name); + } + } + else + { + for (const auto& f : manifest_core.default_features) + features.push_back(f.name); + } } else { @@ -1150,7 +1204,6 @@ namespace vcpkg auto oprovider = make_manifest_provider( fs, paths.original_cwd, extended_overlay_ports, manifest->path, std::move(manifest_scf)); - PackageSpec toplevel{manifest_core.name, default_triplet}; auto install_plan = create_versioned_install_plan(*verprovider, *baseprovider, *oprovider, @@ -1158,8 +1211,7 @@ namespace vcpkg dependencies, manifest_core.overrides, toplevel, - host_triplet, - unsupported_port_action) + create_options) .value_or_exit(VCPKG_LINE_INFO); install_plan.print_unsupported_warnings(); @@ -1174,39 +1226,42 @@ namespace vcpkg Util::erase_remove_if(install_plan.install_actions, [&toplevel](auto&& action) { return action.spec == toplevel; }); - PathsPortFileProvider provider(fs, *registry_set, std::move(oprovider)); - Commands::SetInstalled::perform_and_exit_ex(args, - paths, - provider, - binary_cache, - var_provider, - std::move(install_plan), - dry_run ? Commands::DryRun::Yes : Commands::DryRun::No, - pkgsconfig, - host_triplet, - keep_going, - only_downloads, - print_cmake_usage); + command_set_installed_and_exit_ex(args, + paths, + var_provider, + std::move(install_plan), + dry_run ? DryRun::Yes : DryRun::No, + pkgsconfig, + host_triplet, + keep_going, + only_downloads, + print_cmake_usage); } auto registry_set = paths.make_registry_set(); PathsPortFileProvider provider( fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); + bool default_triplet_used = false; const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_full_package_spec( - std::string(arg), default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); + return check_and_get_full_package_spec(arg, + default_triplet, + default_triplet_used, + CommandInstallMetadataClassic.get_example_text(), + paths.get_triplet_db()); }); - print_default_triplet_warning(args, options.command_arguments); + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } // create the plan msg::println(msgComputingInstallPlan); StatusParagraphs status_db = database_load_check(fs, paths.installed()); // Note: action_plan will hold raw pointers to SourceControlFileLocations from this map - auto action_plan = create_feature_install_plan( - provider, var_provider, specs, status_db, {host_triplet, unsupported_port_action}); + auto action_plan = create_feature_install_plan(provider, var_provider, specs, status_db, create_options); action_plan.print_unsupported_warnings(); for (auto&& action : action_plan.install_actions) @@ -1219,7 +1274,7 @@ namespace vcpkg } } - var_provider.load_tag_vars(action_plan, provider, host_triplet); + var_provider.load_tag_vars(action_plan, host_triplet); // install plan will be empty if it is already installed - need to change this at status paragraph part if (action_plan.empty()) @@ -1262,10 +1317,14 @@ namespace vcpkg compute_all_abis(paths, action_plan, var_provider, status_db); auto pkgsconfig_path = paths.original_cwd / it_pkgsconfig->second; - auto pkgsconfig_contents = generate_nuget_packages_config(action_plan); + auto pkgsconfig_contents = generate_nuget_packages_config(action_plan, args.nuget_id_prefix.value_or("")); fs.write_contents(pkgsconfig_path, pkgsconfig_contents, VCPKG_LINE_INFO); msg::println(msgWroteNuGetPkgConfInfo, msg::path = pkgsconfig_path); } + else if (!dry_run) + { + compute_all_abis(paths, action_plan, var_provider, status_db); + } if (dry_run) { @@ -1275,9 +1334,13 @@ namespace vcpkg paths.flush_lockfile(); track_install_plan(action_plan); + install_preclear_packages(paths, action_plan); - const InstallSummary summary = Install::perform( - args, action_plan, keep_going, paths, status_db, binary_cache, null_build_logs_recorder(), var_provider); + auto binary_cache = only_downloads ? BinaryCache(paths.get_filesystem()) + : BinaryCache::make(args, paths, stdout_sink).value_or_exit(VCPKG_LINE_INFO); + binary_cache.fetch(action_plan.install_actions); + const InstallSummary summary = install_execute_plan( + args, action_plan, keep_going, paths, status_db, binary_cache, null_build_logs_recorder()); if (keep_going == KeepGoing::YES) { @@ -1312,21 +1375,13 @@ namespace vcpkg // If a package failed to build, don't attempt to print usage. // e.g. --keep-going if (!bpgh) continue; - Install::print_usage_information(*bpgh, printed_usages, fs, paths.installed()); + install_print_usage_information(*bpgh, printed_usages, fs, paths.installed()); } } Checks::exit_with_code(VCPKG_LINE_INFO, summary.failed()); } - void InstallCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - Install::perform_and_exit(args, paths, default_triplet, host_triplet); - } - SpecSummary::SpecSummary(const InstallPlanAction& action) : build_result() , timing() @@ -1374,7 +1429,7 @@ namespace vcpkg return m_install_action && m_install_action->request_type == RequestType::USER_REQUESTED; } - void track_install_plan(ActionPlan& plan) + void track_install_plan(const ActionPlan& plan) { Cache triplet_hashes; diff --git a/src/vcpkg/commands.integrate.cpp b/src/vcpkg/commands.integrate.cpp index 618ff40dfa..e1492297b7 100644 --- a/src/vcpkg/commands.integrate.cpp +++ b/src/vcpkg/commands.integrate.cpp @@ -15,7 +15,7 @@ #include #include -namespace vcpkg::Commands::Integrate +namespace vcpkg { Optional find_targets_file_version(StringView contents) { @@ -122,12 +122,8 @@ namespace vcpkg::Commands::Integrate target_path, target_path); } -#endif -#if defined(_WIN32) - static std::string create_system_targets_shortcut() - { - return R"###( + static constexpr StringLiteral SystemTargetsShortcut = R"###( @@ -137,10 +133,7 @@ namespace vcpkg::Commands::Integrate )###"; - } -#endif -#if defined(_WIN32) static std::string create_nuget_targets_file_contents(const Path& msbuild_vcpkg_targets_file) { return fmt::format(R"###( @@ -154,7 +147,7 @@ namespace vcpkg::Commands::Integrate msbuild_vcpkg_targets_file, msbuild_vcpkg_targets_file); } -#endif +#endif // ^^^ _WIN32 #if defined(_WIN32) static constexpr StringLiteral NUGET_PROPS_FILE_CONTENTS = R"###( @@ -164,7 +157,7 @@ namespace vcpkg::Commands::Integrate )###"; -#endif +#endif // ^^^ _WIN32 #if defined(_WIN32) static std::string get_nuget_id(const Path& vcpkg_root_dir) @@ -176,17 +169,16 @@ namespace vcpkg::Commands::Integrate // NuGet id cannot have invalid characters. We will only use alphanumeric and dot. Util::erase_remove_if(dir_id, [](char c) { return !isalnum(static_cast(c)) && (c != '.'); }); - const std::string nuget_id = "vcpkg." + dir_id; - return nuget_id; + return "vcpkg." + dir_id; } -#endif +#endif // ^^^ _WIN32 #if defined(_WIN32) static std::string create_nuspec_file_contents(const Path& vcpkg_root_dir, const std::string& nuget_id, const std::string& nupkg_version) { - static constexpr auto CONTENT_TEMPLATE = R"( + static constexpr StringLiteral CONTENT_TEMPLATE = R"( @NUGET_ID@ @@ -208,7 +200,7 @@ namespace vcpkg::Commands::Integrate Strings::inplace_replace_all(content, "@VERSION@", nupkg_version); return content; } -#endif +#endif // ^^^ _WIN32 #if defined(_WIN32) enum class ElevationPromptChoice @@ -244,7 +236,7 @@ namespace vcpkg::Commands::Integrate CloseHandle(sh_ex_info.hProcess); return ElevationPromptChoice::YES; } -#endif +#endif // ^^^ _WIN32 static constexpr StringLiteral vcpkg_path_txt = "vcpkg.path.txt"; @@ -252,13 +244,14 @@ namespace vcpkg::Commands::Integrate static constexpr StringLiteral vcpkg_user_props = "vcpkg.user.props"; static constexpr StringLiteral vcpkg_user_targets = "vcpkg.user.targets"; - static void integrate_install_msbuild14(Filesystem& fs) + static bool integrate_install_msbuild14(const Filesystem& fs) { - std::array OLD_SYSTEM_TARGET_FILES = { + Path OLD_SYSTEM_TARGET_FILES[] = { get_program_files_32_bit().value_or_exit(VCPKG_LINE_INFO) / "MSBuild/14.0/Microsoft.Common.Targets/ImportBefore/vcpkg.nuget.targets", get_program_files_32_bit().value_or_exit(VCPKG_LINE_INFO) / "MSBuild/14.0/Microsoft.Common.Targets/ImportBefore/vcpkg.system.targets"}; + Path SYSTEM_WIDE_TARGETS_FILE = get_program_files_32_bit().value_or_exit(VCPKG_LINE_INFO) / "MSBuild/Microsoft.Cpp/v4.0/V140/ImportBefore/Default/vcpkg.system.props"; @@ -267,19 +260,17 @@ namespace vcpkg::Commands::Integrate { if (fs.exists(old_system_wide_targets_file, IgnoreErrors{})) { - const std::string param = fmt::format(R"(/c "DEL "{}" /Q > nul")", old_system_wide_targets_file); + const std::string param = fmt::format(R"(/d /c "DEL "{}" /Q > nul")", old_system_wide_targets_file); const ElevationPromptChoice user_choice = elevated_cmd_execute(param); switch (user_choice) { case ElevationPromptChoice::YES: break; - case ElevationPromptChoice::NO: - msg::println_warning(msgPreviousIntegrationFileRemains); - Checks::exit_fail(VCPKG_LINE_INFO); + case ElevationPromptChoice::NO: msg::println_warning(msgPreviousIntegrationFileRemains); break; default: Checks::unreachable(VCPKG_LINE_INFO); } } } - bool should_install_system = true; + std::error_code ec; std::string system_wide_file_contents = fs.read_contents(SYSTEM_WIDE_TARGETS_FILE, ec); if (!ec) @@ -287,76 +278,73 @@ namespace vcpkg::Commands::Integrate auto opt = find_targets_file_version(system_wide_file_contents); if (opt.value_or(0) >= 1) { - should_install_system = false; + return true; } } - if (should_install_system) - { - const auto tmp_dir = fs.create_or_get_temp_directory(VCPKG_LINE_INFO); - const auto sys_src_path = tmp_dir / "vcpkg.system.targets"; - fs.write_contents(sys_src_path, create_system_targets_shortcut(), VCPKG_LINE_INFO); - - const std::string param = fmt::format(R"(/c "mkdir "{}" & copy "{}" "{}" /Y > nul")", - SYSTEM_WIDE_TARGETS_FILE.parent_path(), - sys_src_path, - SYSTEM_WIDE_TARGETS_FILE); - const ElevationPromptChoice user_choice = elevated_cmd_execute(param); - fs.remove_all(tmp_dir, VCPKG_LINE_INFO); - switch (user_choice) - { - case ElevationPromptChoice::YES: break; - case ElevationPromptChoice::NO: - msg::println_warning(msgIntegrationFailed); - Checks::exit_fail(VCPKG_LINE_INFO); - default: Checks::unreachable(VCPKG_LINE_INFO); - } + const auto tmp_dir = fs.create_or_get_temp_directory(VCPKG_LINE_INFO); + const auto sys_src_path = tmp_dir / "vcpkg.system.targets"; + fs.write_contents(sys_src_path, SystemTargetsShortcut, VCPKG_LINE_INFO); + + const std::string param = fmt::format(R"(/d /c "mkdir "{}" & copy "{}" "{}" /Y > nul")", + SYSTEM_WIDE_TARGETS_FILE.parent_path(), + sys_src_path, + SYSTEM_WIDE_TARGETS_FILE); + elevated_cmd_execute(param); + fs.remove_all(tmp_dir, VCPKG_LINE_INFO); - Checks::msg_exit_with_error( - VCPKG_LINE_INFO, msgSystemTargetsInstallFailed, msg::path = SYSTEM_WIDE_TARGETS_FILE); + if (!fs.exists(SYSTEM_WIDE_TARGETS_FILE, IgnoreErrors{})) + { + msg::println_warning(msg::format(msgSystemTargetsInstallFailed, msg::path = SYSTEM_WIDE_TARGETS_FILE)); + return false; } + + return true; } -#endif +#endif // ^^^ _WIN32 static void integrate_install(const VcpkgPaths& paths) { auto& fs = paths.get_filesystem(); - auto user_configuration_home = get_user_configuration_home().value_or_exit(VCPKG_LINE_INFO); + const auto cmake_toolchain = paths.buildsystems / "vcpkg.cmake"; + auto message = msg::format(msgCMakeToolChainFile, msg::path = cmake_toolchain.generic_u8string()); + + auto& user_configuration_home = get_user_configuration_home().value_or_exit(VCPKG_LINE_INFO); fs.create_directories(user_configuration_home, VCPKG_LINE_INFO); fs.write_contents(user_configuration_home / vcpkg_path_txt, paths.root.generic_u8string(), VCPKG_LINE_INFO); #if defined(_WIN32) - integrate_install_msbuild14(fs); - fs.write_contents(user_configuration_home / vcpkg_user_props, create_appdata_shortcut(paths.buildsystems_msbuild_props), VCPKG_LINE_INFO); fs.write_contents(user_configuration_home / vcpkg_user_targets, create_appdata_shortcut(paths.buildsystems_msbuild_targets), VCPKG_LINE_INFO); -#endif - msg::println(Color::success, msgAppliedUserIntegration); - const auto cmake_toolchain = paths.buildsystems / "vcpkg.cmake"; + if (!integrate_install_msbuild14(fs)) + { + message.append_raw("\n\n").append(msgAutomaticLinkingForVS2017AndLater); + msg::println(message); + Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgIntegrationFailedVS2015); + } - auto message = msg::format(msgCMakeToolChainFile, msg::path = cmake_toolchain.generic_u8string()); -#if defined(_WIN32) message.append_raw("\n\n").append(msgAutomaticLinkingForMSBuildProjects); -#endif +#endif // ^^^ _WIN32 + msg::println(Color::success, msgAppliedUserIntegration); msg::println(message); Checks::exit_success(VCPKG_LINE_INFO); } - static void integrate_remove(Filesystem& fs) + static void integrate_remove(const Filesystem& fs) { bool was_deleted = false; - auto user_configuration_home = get_user_configuration_home().value_or_exit(VCPKG_LINE_INFO); + auto& user_configuration_home = get_user_configuration_home().value_or_exit(VCPKG_LINE_INFO); #if defined(_WIN32) was_deleted |= fs.remove(user_configuration_home / vcpkg_user_props, VCPKG_LINE_INFO); was_deleted |= fs.remove(user_configuration_home / vcpkg_user_targets, VCPKG_LINE_INFO); -#endif +#endif // ^^^ _WIN32 was_deleted |= fs.remove(user_configuration_home / vcpkg_path_txt, VCPKG_LINE_INFO); if (was_deleted) @@ -371,9 +359,9 @@ namespace vcpkg::Commands::Integrate Checks::exit_success(VCPKG_LINE_INFO); } -#if defined(WIN32) static void integrate_project(const VcpkgPaths& paths) { +#if defined(WIN32) auto& fs = paths.get_filesystem(); const Path& nuget_exe = paths.get_tool_exe(Tools::NUGET, stdout_sink); @@ -421,12 +409,16 @@ namespace vcpkg::Commands::Integrate msg::println(msgInstallPackageInstruction, msg::value = nuget_id, msg::path = source_path); Checks::exit_success(VCPKG_LINE_INFO); +#else // ^^^ _WIN32 // !_WIN32 vvv + (void)paths; + Checks::msg_exit_with_error( + VCPKG_LINE_INFO, msgIntegrateWindowsOnly, msg::command_line = "vcpkg integrate project"); +#endif // ^^^ !_WIN32 } -#endif -#if defined(_WIN32) static void integrate_powershell(const VcpkgPaths& paths) { +#if defined(_WIN32) static constexpr StringLiteral TITLE = "PowerShell Tab-Completion"; const auto script_path = paths.scripts / "addPoshVcpkgToPowershellProfile.ps1"; @@ -443,14 +435,24 @@ namespace vcpkg::Commands::Integrate msg::println_error(msg::format(msgCommandFailed, msg::command_line = TITLE) .append_raw('\n') .append_raw(script_path.generic_u8string())); - get_global_metrics_collector().track_string(StringMetric::Title, TITLE.to_string()); + get_global_metrics_collector().track_string(StringMetric::Title, TITLE); } Checks::exit_with_code(VCPKG_LINE_INFO, rc); +#else // ^^^ _WIN32 // !_WIN32 vvv + (void)paths; + Checks::msg_exit_with_error( + VCPKG_LINE_INFO, msgIntegrateWindowsOnly, msg::command_line = "vcpkg integrate powershell"); +#endif // ^^^ !_WIN32 } -#else + static void integrate_bash(const VcpkgPaths& paths) { +#if defined(_WIN32) + (void)paths; + Checks::msg_exit_with_error( + VCPKG_LINE_INFO, msgIntegrateNonWindowsOnly, msg::command_line = "vcpkg integrate bash"); +#else // ^^^ _WIN32 // !_WIN32 vvv const auto home_path = get_environment_variable("HOME").value_or_exit(VCPKG_LINE_INFO); #if defined(__APPLE__) const auto bashrc_path = Path{home_path} / ".bash_profile"; @@ -478,10 +480,16 @@ namespace vcpkg::Commands::Integrate bashrc_content.push_back('\n'); fs.write_contents(bashrc_path, bashrc_content, VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO); +#endif // ^^^ !_WIN32 } static void integrate_zsh(const VcpkgPaths& paths) { +#if defined(_WIN32) + (void)paths; + Checks::msg_exit_with_error( + VCPKG_LINE_INFO, msgIntegrateNonWindowsOnly, msg::command_line = "vcpkg integrate zsh"); +#else // ^^^ _WIN32 // !_WIN32 vvv const auto home_path = get_environment_variable("HOME").value_or_exit(VCPKG_LINE_INFO); const auto zshrc_path = Path{home_path} / ".zshrc"; @@ -515,10 +523,16 @@ namespace vcpkg::Commands::Integrate zshrc_content.push_back('\n'); fs.write_contents(zshrc_path, zshrc_content, VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO); +#endif // ^^^ !_WIN32 } static void integrate_fish(const VcpkgPaths& paths) { +#if defined(_WIN32) + (void)paths; + Checks::msg_exit_with_error( + VCPKG_LINE_INFO, msgIntegrateNonWindowsOnly, msg::command_line = "vcpkg integrate x-fish"); +#else // ^^^ _WIN32 // !_WIN32 vvv Path fish_completions_path; const auto config_path = get_environment_variable("XDG_CONFIG_HOME"); if (config_path.has_value()) @@ -527,18 +541,18 @@ namespace vcpkg::Commands::Integrate } else { - const Path home_path = get_environment_variable("HOME").value_or_exit(VCPKG_LINE_INFO); - fish_completions_path = home_path / ".config"; + Path home_path = get_environment_variable("HOME").value_or_exit(VCPKG_LINE_INFO); + fish_completions_path = std::move(home_path) / ".config"; } - fish_completions_path = fish_completions_path / "fish/completions"; + fish_completions_path /= "fish/completions"; auto& fs = paths.get_filesystem(); std::error_code ec; fs.create_directories(fish_completions_path, ec); - fish_completions_path = fish_completions_path / "vcpkg.fish"; + fish_completions_path /= "vcpkg.fish"; if (fs.exists(fish_completions_path, IgnoreErrors{})) { @@ -550,107 +564,99 @@ namespace vcpkg::Commands::Integrate msg::println(msgAddingCompletionEntry, msg::path = fish_completions_path); fs.create_symlink(completion_script_path, fish_completions_path, VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO); - } -#endif - - void append_helpstring(HelpTableFormatter& table) - { -#if defined(_WIN32) - table.format("vcpkg integrate install", msg::format(msgIntegrateInstallHelpWindows)); - table.format("vcpkg integrate remove", msg::format(msgIntegrateRemoveHelp)); - table.format("vcpkg integrate project", msg::format(msgIntegrateProjectHelp)); - table.format("vcpkg integrate powershell", msg::format(msgIntegratePowerShellHelp)); -#else // ^^^ defined(_WIN32) // !defined(_WIN32) vvv - table.format("vcpkg integrate install", msg::format(msgIntegrateInstallHelpLinux)); - table.format("vcpkg integrate remove", msg::format(msgIntegrateRemoveHelp)); - table.format("vcpkg integrate bash", msg::format(msgIntegrateBashHelp)); - table.format("vcpkg integrate zsh", msg::format(msgIntegrateZshHelp)); - table.format("vcpkg integrate x-fish", msg::format(msgIntegrateFishHelp)); -#endif // ^^^ !defined(_WIN32) +#endif // ^^^ !_WIN32 } - LocalizedString get_helpstring() - { - HelpTableFormatter table; - append_helpstring(table); - return msg::format(msgCommands).append_raw('\n').append_raw(table.m_str); - } - - namespace Subcommand - { - static constexpr StringLiteral INSTALL = "install"; - static constexpr StringLiteral REMOVE = "remove"; -#if defined(_WIN32) - static constexpr StringLiteral PROJECT = "project"; - static constexpr StringLiteral POWERSHELL = "powershell"; -#endif // ^^^ _WIN32 - static constexpr StringLiteral BASH = "bash"; - static constexpr StringLiteral ZSH = "zsh"; - static constexpr StringLiteral FISH = "x-fish"; - } + static constexpr StringLiteral INSTALL = "install"; + static constexpr StringLiteral REMOVE = "remove"; + static constexpr StringLiteral PROJECT = "project"; + static constexpr StringLiteral POWERSHELL = "powershell"; + static constexpr StringLiteral BASH = "bash"; + static constexpr StringLiteral ZSH = "zsh"; + static constexpr StringLiteral FISH = "x-fish"; static std::vector valid_arguments(const VcpkgPaths&) { + // Note that help lists all supported args, but we only want to autocomplete the ones valid on this platform return { - Subcommand::INSTALL.to_string(), Subcommand::REMOVE.to_string(), + INSTALL.to_string(), REMOVE.to_string(), #if defined(_WIN32) - Subcommand::PROJECT.to_string(), Subcommand::POWERSHELL.to_string(), + PROJECT.to_string(), POWERSHELL.to_string(), #else - Subcommand::BASH.to_string(), Subcommand::FISH.to_string(), + BASH.to_string(), FISH.to_string(), ZSH.to_string() #endif }; } - const CommandStructure COMMAND_STRUCTURE = { - [] { return get_helpstring(); }, + constexpr CommandMetadata CommandIntegrateMetadata{ + "integrate", + msgCmdIntegrateSynopsis, + {[] { + HelpTableFormatter table; +#if defined(_WIN32) + table.format("vcpkg integrate install", msg::format(msgIntegrateInstallHelpWindows)); +#else // ^^^ defined(_WIN32) // !defined(_WIN32) vvv + table.format("vcpkg integrate install", msg::format(msgIntegrateInstallHelpLinux)); +#endif // ^^^ !defined(_WIN32) + table.format("vcpkg integrate remove", msg::format(msgIntegrateRemoveHelp)); + table.blank(); + table.format("vcpkg integrate project", msg::format(msgIntegrateProjectHelp)); + table.blank(); + table.format("vcpkg integrate bash", msg::format(msgIntegrateBashHelp)); + table.format("vcpkg integrate x-fish", msg::format(msgIntegrateFishHelp)); + table.format("vcpkg integrate powershell", msg::format(msgIntegratePowerShellHelp)); + table.format("vcpkg integrate zsh", msg::format(msgIntegrateZshHelp)); + return LocalizedString::from_raw("\n").append_raw(std::move(table.m_str)); + }}, + "https://learn.microsoft.com/vcpkg/commands/integrate", + AutocompletePriority::Public, 1, 1, {}, &valid_arguments, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_integrate_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - const auto parsed = args.parse_arguments(COMMAND_STRUCTURE); + const auto parsed = args.parse_arguments(CommandIntegrateMetadata); - if (parsed.command_arguments[0] == Subcommand::INSTALL) + if (Strings::case_insensitive_ascii_equals(parsed.command_arguments[0], INSTALL)) { return integrate_install(paths); } - if (parsed.command_arguments[0] == Subcommand::REMOVE) + + if (Strings ::case_insensitive_ascii_equals(parsed.command_arguments[0], REMOVE)) { return integrate_remove(paths.get_filesystem()); } -#if defined(_WIN32) - if (parsed.command_arguments[0] == Subcommand::PROJECT) + + if (Strings ::case_insensitive_ascii_equals(parsed.command_arguments[0], PROJECT)) { return integrate_project(paths); } - if (parsed.command_arguments[0] == Subcommand::POWERSHELL) + + if (Strings ::case_insensitive_ascii_equals(parsed.command_arguments[0], POWERSHELL)) { return integrate_powershell(paths); } -#else - if (parsed.command_arguments[0] == Subcommand::BASH) + + if (Strings ::case_insensitive_ascii_equals(parsed.command_arguments[0], BASH)) { return integrate_bash(paths); } - if (parsed.command_arguments[0] == Subcommand::ZSH) + + if (Strings ::case_insensitive_ascii_equals(parsed.command_arguments[0], ZSH)) { return integrate_zsh(paths); } - if (parsed.command_arguments[0] == Subcommand::FISH) + + if (Strings ::case_insensitive_ascii_equals(parsed.command_arguments[0], FISH)) { return integrate_fish(paths); } -#endif + Checks::msg_exit_maybe_upgrade( VCPKG_LINE_INFO, msgUnknownParameterForIntegrate, msg::value = parsed.command_arguments[0]); } - - void IntegrateCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - Integrate::perform_and_exit(args, paths); - } } diff --git a/src/vcpkg/commands.list.cpp b/src/vcpkg/commands.list.cpp index ab08f7b3ab..51bc88e962 100644 --- a/src/vcpkg/commands.list.cpp +++ b/src/vcpkg/commands.list.cpp @@ -1,19 +1,21 @@ #include #include +#include #include -#include #include #include #include #include -namespace vcpkg::Commands::List +using namespace vcpkg; + +namespace { - static constexpr StringLiteral OPTION_FULLDESC = "x-full-desc"; // TODO: This should find a better home, eventually - static constexpr StringLiteral OPTION_JSON = "x-json"; + constexpr StringLiteral OPTION_FULLDESC = "x-full-desc"; + constexpr StringLiteral OPTION_JSON = "x-json"; - static void do_print_json(std::vector installed_packages) + void do_print_json(std::vector installed_packages) { Json::Object obj; for (const StatusParagraph* status_paragraph : installed_packages) @@ -51,7 +53,7 @@ namespace vcpkg::Commands::List msg::write_unlocalized_text_to_stdout(Color::none, Json::stringify(obj)); } - static void do_print(const StatusParagraph& pgh, const bool full_desc) + void do_print(const StatusParagraph& pgh, const bool full_desc) { auto full_version = Version(pgh.package.version, pgh.package.port_version).to_string(); if (full_desc) @@ -77,22 +79,29 @@ namespace vcpkg::Commands::List } } - static constexpr std::array LIST_SWITCHES = {{ - {OPTION_FULLDESC, []() { return msg::format(msgHelpTextOptFullDesc); }}, - {OPTION_JSON, []() { return msg::format(msgJsonSwitch); }}, - }}; + constexpr CommandSwitch LIST_SWITCHES[] = { + {OPTION_FULLDESC, msgHelpTextOptFullDesc}, + {OPTION_JSON, msgJsonSwitch}, + }; +} // unnamed namespace - const CommandStructure COMMAND_STRUCTURE = { - [] { return msg::format(msgListHelp).append_raw('\n').append(create_example_string("list png")); }, +namespace vcpkg +{ + constexpr CommandMetadata CommandListMetadata{ + "list", + msgListHelp, + {"vcpkg list", msgCmdListExample2, "vcpkg list png"}, + "https://learn.microsoft.com/vcpkg/commands/list", + AutocompletePriority::Public, 0, 1, - {LIST_SWITCHES, {}}, + {LIST_SWITCHES}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_list_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments options = args.parse_arguments(CommandListMetadata); const StatusParagraphs status_paragraphs = database_load_check(paths.get_filesystem(), paths.installed()); auto installed_ipv = get_installed_ports(status_paragraphs); @@ -143,9 +152,4 @@ namespace vcpkg::Commands::List Checks::exit_success(VCPKG_LINE_INFO); } - - void ListCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - List::perform_and_exit(args, paths); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.new.cpp b/src/vcpkg/commands.new.cpp index 171c7137c2..e124a96670 100644 --- a/src/vcpkg/commands.new.cpp +++ b/src/vcpkg/commands.new.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include #include @@ -9,44 +11,48 @@ #include #include +using namespace vcpkg; + namespace { - using namespace vcpkg; - - static constexpr StringLiteral OPTION_APPLICATION = "application"; - static constexpr StringLiteral OPTION_SINGLE_FILE = "single-file"; - - static constexpr StringLiteral SETTING_NAME = "name"; - static constexpr StringLiteral SETTING_VERSION = "version"; - - static constexpr StringLiteral OPTION_VERSION_RELAXED = "version-relaxed"; - static constexpr StringLiteral OPTION_VERSION_DATE = "version-date"; - static constexpr StringLiteral OPTION_VERSION_STRING = "version-string"; - - const CommandSwitch SWITCHES[] = { - {OPTION_APPLICATION, []() { return msg::format(msgCmdNewOptApplication); }}, - {OPTION_SINGLE_FILE, []() { return msg::format(msgCmdNewOptSingleFile); }}, - {OPTION_VERSION_RELAXED, []() { return msg::format(msgCmdNewOptVersionRelaxed); }}, - {OPTION_VERSION_DATE, []() { return msg::format(msgCmdNewOptVersionDate); }}, - {OPTION_VERSION_STRING, []() { return msg::format(msgCmdNewOptVersionString); }}, + constexpr StringLiteral OPTION_APPLICATION = "application"; + constexpr StringLiteral OPTION_SINGLE_FILE = "single-file"; + + constexpr StringLiteral SETTING_NAME = "name"; + constexpr StringLiteral SETTING_VERSION = "version"; + + constexpr StringLiteral OPTION_VERSION_RELAXED = "version-relaxed"; + constexpr StringLiteral OPTION_VERSION_DATE = "version-date"; + constexpr StringLiteral OPTION_VERSION_STRING = "version-string"; + + constexpr CommandSwitch SWITCHES[] = { + {OPTION_APPLICATION, msgCmdNewOptApplication}, + {OPTION_SINGLE_FILE, msgCmdNewOptSingleFile}, + {OPTION_VERSION_RELAXED, msgCmdNewOptVersionRelaxed}, + {OPTION_VERSION_DATE, msgCmdNewOptVersionDate}, + {OPTION_VERSION_STRING, msgCmdNewOptVersionString}, }; - const CommandSetting SETTINGS[] = { - {SETTING_NAME, []() { return msg::format(msgCmdNewSettingName); }}, - {SETTING_VERSION, []() { return msg::format(msgCmdNewSettingVersion); }}, + constexpr CommandSetting SETTINGS[] = { + {SETTING_NAME, msgCmdNewSettingName}, + {SETTING_VERSION, msgCmdNewSettingVersion}, }; +} // unnamed namespace - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("new --name=example --version=1.0 --version-kind=relaxed"); }, +namespace vcpkg +{ + constexpr CommandMetadata CommandNewMetadata{ + "new", + msgCmdNewSynposis, + {msgCmdNewExample1, "vcpkg new --application"}, + Undocumented, + AutocompletePriority::Public, 0, 0, - {SWITCHES, SETTINGS, {}}, + {SWITCHES, SETTINGS}, nullptr, }; -} -namespace vcpkg::Commands -{ ExpectedL build_prototype_manifest(const std::string* name, const std::string* version, bool option_application, @@ -72,6 +78,13 @@ namespace vcpkg::Commands return msg::format_error(msgNewNameCannotBeEmpty); } + if (!Json::IdentifierDeserializer::is_ident(*name)) + { + return msg::format_error(msgParseIdentifierError, + msg::value = *name, + msg::url = "https://learn.microsoft.com/vcpkg/commands/new"); + } + manifest.insert("name", *name); } @@ -127,11 +140,11 @@ namespace vcpkg::Commands return std::move(manifest); } - void NewCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + void command_new_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { auto& fs = paths.get_filesystem(); const auto& current_configuration = paths.get_configuration(); - const auto parsed = args.parse_arguments(COMMAND_STRUCTURE); + const auto parsed = args.parse_arguments(CommandNewMetadata); const bool option_application = Util::Sets::contains(parsed.switches, OPTION_APPLICATION); const bool option_single_file = Util::Sets::contains(parsed.switches, OPTION_SINGLE_FILE); @@ -195,7 +208,8 @@ namespace vcpkg::Commands RegistryConfig default_ms_registry; default_ms_registry.kind.emplace("artifact"); default_ms_registry.name.emplace("microsoft"); - default_ms_registry.location.emplace("https://aka.ms/vcpkg-ce-default"); + default_ms_registry.location.emplace( + "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip"); configuration.registries.emplace_back(std::move(default_ms_registry)); } @@ -212,4 +226,4 @@ namespace vcpkg::Commands fs.write_contents(candidate_manifest_path, Json::stringify(manifest), VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.owns.cpp b/src/vcpkg/commands.owns.cpp index 13773b1597..d0bea99929 100644 --- a/src/vcpkg/commands.owns.cpp +++ b/src/vcpkg/commands.owns.cpp @@ -1,15 +1,17 @@ +#include #include -#include #include #include #include -namespace vcpkg::Commands::Owns +using namespace vcpkg; + +namespace { - static void search_file(Filesystem& fs, - const InstalledPaths& installed, - const std::string& file_substr, - const StatusParagraphs& status_db) + void search_file(const Filesystem& fs, + const InstalledPaths& installed, + const std::string& file_substr, + const StatusParagraphs& status_db) { const auto installed_files = get_installed_files(fs, installed, status_db); for (auto&& pgh_and_file : installed_files) @@ -26,25 +28,28 @@ namespace vcpkg::Commands::Owns } } } - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("owns zlib.dll"); }, +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandOwnsMetadata{ + "owns", + msgHelpOwnsCommand, + {msgCmdOwnsExample1, "vcpkg owns zlib1.dll"}, + Undocumented, + AutocompletePriority::Public, 1, 1, {}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_owns_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - const auto parsed = args.parse_arguments(COMMAND_STRUCTURE); + const auto parsed = args.parse_arguments(CommandOwnsMetadata); const StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); search_file(paths.get_filesystem(), paths.installed(), parsed.command_arguments[0], status_db); Checks::exit_success(VCPKG_LINE_INFO); } - - void OwnsCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - Owns::perform_and_exit(args, paths); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.info.cpp b/src/vcpkg/commands.package-info.cpp similarity index 80% rename from src/vcpkg/commands.info.cpp rename to src/vcpkg/commands.package-info.cpp index e6d9227f9b..d5108eb9d9 100644 --- a/src/vcpkg/commands.info.cpp +++ b/src/vcpkg/commands.package-info.cpp @@ -2,9 +2,9 @@ #include #include -#include +#include +#include #include -#include #include #include #include @@ -12,33 +12,38 @@ #include #include -namespace vcpkg::Commands::Info +using namespace vcpkg; + +namespace { - static constexpr StringLiteral OPTION_JSON = "x-json"; - static constexpr StringLiteral OPTION_TRANSITIVE = "x-transitive"; - static constexpr StringLiteral OPTION_INSTALLED = "x-installed"; - - static constexpr CommandSwitch INFO_SWITCHES[] = { - {OPTION_JSON, []() { return msg::format(msgJsonSwitch); }}, - {OPTION_INSTALLED, []() { return msg::format(msgCmdInfoOptInstalled); }}, - {OPTION_TRANSITIVE, []() { return msg::format(msgCmdInfoOptTransitive); }}, + constexpr StringLiteral OPTION_JSON = "x-json"; + constexpr StringLiteral OPTION_TRANSITIVE = "x-transitive"; + constexpr StringLiteral OPTION_INSTALLED = "x-installed"; + + constexpr CommandSwitch INFO_SWITCHES[] = { + {OPTION_JSON, msgJsonSwitch}, + {OPTION_INSTALLED, msgCmdInfoOptInstalled}, + {OPTION_TRANSITIVE, msgCmdInfoOptTransitive}, }; +} // unnamed namespace - const CommandStructure COMMAND_STRUCTURE = { - [] { - return msg::format(msgPackageInfoHelp) - .append_raw('\n') - .append(create_example_string("x-package-info zlib openssl:x64-windows")); - }, +namespace vcpkg +{ + constexpr CommandMetadata CommandPackageInfoMetadata{ + "x-package-info", + msgPackageInfoHelp, + {msgCmdPackageInfoExample1, "vcpkg x-package-info zlib openssl:x64-windows"}, + Undocumented, + AutocompletePriority::Public, 1, SIZE_MAX, - {INFO_SWITCHES, {}}, + {INFO_SWITCHES}, nullptr, }; - void InfoCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + void command_package_info_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments options = args.parse_arguments(CommandPackageInfoMetadata); if (!Util::Vectors::contains(options.switches, OPTION_JSON)) { Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, msgMissingOption, msg::option = OPTION_JSON); @@ -87,10 +92,10 @@ namespace vcpkg::Commands::Info } auto& qpkg = *maybe_qpkg.get(); - auto t = Triplet::from_canonical_name(std::string(*qpkg.triplet.get())); - check_triplet(t, paths); - specs_to_write.emplace_back(qpkg.name, t); + // intentionally no triplet name check + specs_to_write.emplace_back(qpkg.name, Triplet::from_canonical_name(*qpkg.triplet.get())); } + Json::Object response; Json::Object results; while (!specs_to_write.empty()) @@ -151,4 +156,4 @@ namespace vcpkg::Commands::Info msg::write_unlocalized_text_to_stdout(Color::none, Json::stringify(response)); } } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.portsdiff.cpp b/src/vcpkg/commands.portsdiff.cpp index 7c3044756d..ce557ed653 100644 --- a/src/vcpkg/commands.portsdiff.cpp +++ b/src/vcpkg/commands.portsdiff.cpp @@ -1,83 +1,35 @@ -#include +#include #include #include +#include #include -#include #include #include #include #include #include -namespace vcpkg::Commands::PortsDiff -{ - struct UpdatedPort - { - static bool compare_by_name(const UpdatedPort& left, const UpdatedPort& right) - { - return left.port < right.port; - } +using namespace vcpkg; - std::string port; - VersionDiff version_diff; - }; - - template - struct SetElementPresence +namespace +{ + void print_name_only(StringView name) { - static SetElementPresence create(std::vector left, std::vector right) - { - // TODO: This can be done with one pass instead of three passes - SetElementPresence output; - std::set_difference( - left.cbegin(), left.cend(), right.cbegin(), right.cend(), std::back_inserter(output.only_left)); - std::set_intersection( - left.cbegin(), left.cend(), right.cbegin(), right.cend(), std::back_inserter(output.both)); - std::set_difference( - right.cbegin(), right.cend(), left.cbegin(), left.cend(), std::back_inserter(output.only_right)); - - return output; - } - - std::vector only_left; - std::vector both; - std::vector only_right; - }; + msg::write_unlocalized_text_to_stdout(Color::none, fmt::format("\t- {:<15}\n", name)); + } - static std::vector find_updated_ports( - const std::vector& ports, - const std::map& previous_names_and_versions, - const std::map& current_names_and_versions) + void print_name_and_version(StringView name, const Version& version) { - std::vector output; - for (const std::string& name : ports) - { - const Version& previous_version = previous_names_and_versions.at(name); - const Version& current_version = current_names_and_versions.at(name); - if (previous_version == current_version) - { - continue; - } - - output.push_back({name, VersionDiff(previous_version, current_version)}); - } - - return output; + msg::write_unlocalized_text_to_stdout(Color::none, fmt::format("\t- {:<15}{:<}\n", name, version)); } - static void do_print_name_and_version(const std::vector& ports_to_print, - const std::map& names_and_versions) + void print_name_and_version_diff(StringView name, const VersionDiff& version_diff) { - for (const std::string& name : ports_to_print) - { - const Version& version = names_and_versions.at(name); - msg::write_unlocalized_text_to_stdout(Color::none, fmt::format("\t- {:<15}{:<}\n", name, version)); - } + msg::write_unlocalized_text_to_stdout(Color::none, fmt::format("\t- {:<15}{:<}\n", name, version_diff)); } - static std::map read_ports_from_commit(const VcpkgPaths& paths, - const std::string& git_commit_id) + std::vector read_ports_from_commit(const VcpkgPaths& paths, StringView git_commit_id) { auto& fs = paths.get_filesystem(); const auto dot_git_dir = paths.root / ".git"; @@ -85,7 +37,7 @@ namespace vcpkg::Commands::PortsDiff const auto temp_checkout_path = paths.root / fmt::format("{}-{}", ports_dir_name, git_commit_id); fs.create_directory(temp_checkout_path, IgnoreErrors{}); const auto checkout_this_dir = - fmt::format(R"(.\{})", ports_dir_name); // Must be relative to the root of the repository + fmt::format("./{}", ports_dir_name); // Must be relative to the root of the repository auto cmd = paths.git_cmd_builder(dot_git_dir, temp_checkout_path) .string_arg("checkout") @@ -100,17 +52,21 @@ namespace vcpkg::Commands::PortsDiff default_working_directory, get_clean_environment()); const auto ports_at_commit = Paragraphs::load_overlay_ports(fs, temp_checkout_path / ports_dir_name); - std::map names_and_versions; + fs.remove_all(temp_checkout_path, VCPKG_LINE_INFO); + + std::vector results; for (auto&& port : ports_at_commit) { const auto& core_pgh = *port.source_control_file->core_paragraph; - names_and_versions.emplace(core_pgh.name, Version(core_pgh.raw_version, core_pgh.port_version)); + results.emplace_back(VersionSpec{core_pgh.name, Version{core_pgh.raw_version, core_pgh.port_version}}); } - fs.remove_all(temp_checkout_path, VCPKG_LINE_INFO); - return names_and_versions; + + Util::sort(results, + [](const VersionSpec& lhs, const VersionSpec& rhs) { return lhs.port_name < rhs.port_name; }); + return results; } - static void check_commit_exists(const VcpkgPaths& paths, const std::string& git_commit_id) + void check_commit_exists(const VcpkgPaths& paths, StringView git_commit_id) { static constexpr StringLiteral VALID_COMMIT_OUTPUT = "commit\n"; auto cmd = paths.git_cmd_builder(paths.root / ".git", paths.root) @@ -123,68 +79,132 @@ namespace vcpkg::Commands::PortsDiff msgInvalidCommitId, msg::commit_sha = git_commit_id); } +} // unnamed namespace + +namespace vcpkg +{ + PortsDiff find_portsdiff(const VcpkgPaths& paths, + StringView git_commit_id_for_previous_snapshot, + StringView git_commit_id_for_current_snapshot) + { + check_commit_exists(paths, git_commit_id_for_previous_snapshot); + check_commit_exists(paths, git_commit_id_for_current_snapshot); + + const auto previous = read_ports_from_commit(paths, git_commit_id_for_previous_snapshot); + const auto current = read_ports_from_commit(paths, git_commit_id_for_current_snapshot); + + auto firstPrevious = previous.begin(); + const auto lastPrevious = previous.end(); + + auto firstCurrent = current.begin(); + const auto lastCurrent = current.end(); + + PortsDiff result; + for (;;) + { + if (firstCurrent == lastCurrent) + { + // all remaining previous were removed + for (; firstPrevious != lastPrevious; ++firstPrevious) + { + result.removed_ports.emplace_back(firstPrevious->port_name); + } + + return result; + } + + if (firstPrevious == lastPrevious) + { + // all remaining ports were added + result.added_ports.insert(result.added_ports.end(), firstCurrent, lastCurrent); + return result; + } + + if (firstCurrent->port_name < firstPrevious->port_name) + { + // *firstCurrent is an added port + result.added_ports.emplace_back(*firstCurrent); + ++firstCurrent; + continue; + } + + if (firstPrevious->port_name < firstCurrent->port_name) + { + // *firstPrevious is a removed port + result.removed_ports.emplace_back(firstPrevious->port_name); + ++firstPrevious; + continue; + } + + if (firstCurrent->version != firstPrevious->version) + { + // update + result.updated_ports.emplace_back( + UpdatedPort{firstPrevious->port_name, VersionDiff{firstPrevious->version, firstCurrent->version}}); + } + + // no change + ++firstCurrent; + ++firstPrevious; + } + } - const CommandStructure COMMAND_STRUCTURE = { - [] { - return msg::format(msgPortsDiffHelp) - .append_raw('\n') - .append(create_example_string("portsdiff mybranchname")); - }, + constexpr CommandMetadata CommandPortsdiffMetadata{ + "portsdiff", + msgCmdPortsdiffSynopsis, + {msgCmdPortsdiffExample1, msgCmdPortsdiffExample2}, + Undocumented, + AutocompletePriority::Public, 1, 2, {}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_portsdiff_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - const auto parsed = args.parse_arguments(COMMAND_STRUCTURE); - - const std::string git_commit_id_for_previous_snapshot = parsed.command_arguments.at(0); - const std::string git_commit_id_for_current_snapshot = - parsed.command_arguments.size() < 2 ? "HEAD" : parsed.command_arguments.at(1); - - check_commit_exists(paths, git_commit_id_for_current_snapshot); - check_commit_exists(paths, git_commit_id_for_previous_snapshot); + const auto parsed = args.parse_arguments(CommandPortsdiffMetadata); - const std::map current_names_and_versions = - read_ports_from_commit(paths, git_commit_id_for_current_snapshot); - const std::map previous_names_and_versions = - read_ports_from_commit(paths, git_commit_id_for_previous_snapshot); + const StringView git_commit_id_for_previous_snapshot = parsed.command_arguments[0]; + const StringView git_commit_id_for_current_snapshot = + parsed.command_arguments.size() < 2 ? StringLiteral{"HEAD"} : StringView{parsed.command_arguments[1]}; - // Already sorted, so set_difference can work on std::vector too - const std::vector current_ports = Util::extract_keys(current_names_and_versions); - const std::vector previous_ports = Util::extract_keys(previous_names_and_versions); - - const SetElementPresence setp = - SetElementPresence::create(current_ports, previous_ports); - - const std::vector& added_ports = setp.only_left; + const auto portsdiff = + find_portsdiff(paths, git_commit_id_for_previous_snapshot, git_commit_id_for_current_snapshot); + const auto& added_ports = portsdiff.added_ports; if (!added_ports.empty()) { msg::println(msgPortsAdded, msg::count = added_ports.size()); - do_print_name_and_version(added_ports, current_names_and_versions); + for (auto&& added_port : added_ports) + { + print_name_and_version(added_port.port_name, added_port.version); + } + + msg::println(); } - const std::vector& removed_ports = setp.only_right; + const auto& removed_ports = portsdiff.removed_ports; if (!removed_ports.empty()) { msg::println(msgPortsRemoved, msg::count = removed_ports.size()); - do_print_name_and_version(removed_ports, previous_names_and_versions); - } + for (auto&& removed_port : removed_ports) + { + print_name_only(removed_port); + } - const std::vector& common_ports = setp.both; - const std::vector updated_ports = - find_updated_ports(common_ports, previous_names_and_versions, current_names_and_versions); + msg::println(); + } + const auto& updated_ports = portsdiff.updated_ports; if (!updated_ports.empty()) { msg::println(msgPortsUpdated, msg::count = updated_ports.size()); - for (const UpdatedPort& p : updated_ports) + for (auto&& updated_port : updated_ports) { - msg::write_unlocalized_text_to_stdout( - Color::none, fmt::format("\t- {:<15}{:<}\n", p.port, p.version_diff.to_string())); + print_name_and_version_diff(updated_port.port_name, updated_port.version_diff); } + + msg::println(); } if (added_ports.empty() && removed_ports.empty() && updated_ports.empty()) @@ -194,9 +214,4 @@ namespace vcpkg::Commands::PortsDiff Checks::exit_success(VCPKG_LINE_INFO); } - - void PortsDiffCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - PortsDiff::perform_and_exit(args, paths); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.regenerate.cpp b/src/vcpkg/commands.regenerate.cpp index 5d29c5ed91..56d8f6d7a8 100644 --- a/src/vcpkg/commands.regenerate.cpp +++ b/src/vcpkg/commands.regenerate.cpp @@ -10,40 +10,40 @@ #include #include +using namespace vcpkg; + namespace { - using namespace vcpkg; - constexpr StringLiteral DRY_RUN = "dry-run"; constexpr StringLiteral FORCE = "force"; constexpr StringLiteral NORMALIZE = "normalize"; - constexpr std::array command_switches = {{ - {FORCE, []() { return msg::format(msgCmdRegenerateOptForce); }}, - {DRY_RUN, []() { return msg::format(msgCmdRegenerateOptDryRun); }}, - {NORMALIZE, []() { return msg::format(msgCmdRegenerateOptNormalize); }}, - }}; + constexpr CommandSwitch command_switches[] = { + {FORCE, msgCmdRegenerateOptForce}, + {DRY_RUN, msgCmdRegenerateOptDryRun}, + {NORMALIZE, msgCmdRegenerateOptNormalize}, + }; +} // unnamed namespace - static const CommandStructure command_structure = { - [] { - return msg::format(msgRegeneratesArtifactRegistry) - .append_raw('\n') - .append(create_example_string("x-regenerate")); - }, +namespace vcpkg +{ + constexpr CommandMetadata CommandRegenerateMetadata{ + "x-regenerate", + msgRegeneratesArtifactRegistry, + {"vcpkg x-regenerate"}, + Undocumented, + AutocompletePriority::Public, 1, 1, {command_switches}, nullptr, }; -} -namespace vcpkg -{ - void RegenerateCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + void command_regenerate_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { std::vector forwarded_args; forwarded_args.emplace_back("regenerate"); - const auto parsed = args.parse_arguments(command_structure); + const auto parsed = args.parse_arguments(CommandRegenerateMetadata); forwarded_args.push_back(parsed.command_arguments[0]); if (Util::Sets::contains(parsed.switches, FORCE)) @@ -63,4 +63,4 @@ namespace vcpkg Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, forwarded_args)); } -} +} // namespace vcpkg diff --git a/src/vcpkg/remove.cpp b/src/vcpkg/commands.remove.cpp similarity index 50% rename from src/vcpkg/remove.cpp rename to src/vcpkg/commands.remove.cpp index 5633f3e426..b2e77821e9 100644 --- a/src/vcpkg/remove.cpp +++ b/src/vcpkg/commands.remove.cpp @@ -2,28 +2,26 @@ #include #include +#include +#include +#include #include -#include #include #include #include #include #include -#include -#include #include #include -namespace vcpkg::Remove +namespace vcpkg { - using Update::OutdatedPackage; - - static void remove_package(Filesystem& fs, - const InstalledPaths& installed, - const PackageSpec& spec, - StatusParagraphs* status_db) + void remove_package(const Filesystem& fs, + const InstalledPaths& installed, + const PackageSpec& spec, + StatusParagraphs& status_db) { - auto maybe_ipv = status_db->get_installed_package_view(spec); + auto maybe_ipv = status_db.get_installed_package_view(spec); Checks::msg_check_exit(VCPKG_LINE_INFO, maybe_ipv.has_value(), msgPackageAlreadyRemoved, msg::spec = spec); @@ -99,99 +97,97 @@ namespace vcpkg::Remove spgh.state = InstallState::NOT_INSTALLED; write_update(fs, installed, spgh); - status_db->insert(std::make_unique(std::move(spgh))); + status_db.insert(std::make_unique(std::move(spgh))); } } +} // namespace vcpkg - static void print_plan(const std::map>& group_by_plan_type) +namespace +{ + using namespace vcpkg; + constexpr struct OpAddressOf { - static constexpr std::array ORDER = {RemovePlanType::NOT_INSTALLED, RemovePlanType::REMOVE}; - - for (const RemovePlanType plan_type : ORDER) + template + T* operator()(T& t) const { - const auto it = group_by_plan_type.find(plan_type); - if (it == group_by_plan_type.cend()) - { - continue; - } - - std::vector cont = it->second; - std::sort(cont.begin(), cont.end(), &RemovePlanAction::compare_by_name); - const std::string as_string = Strings::join("\n", cont, [](const RemovePlanAction* p) { - return to_output_string(p->request_type, p->spec.to_string()); - }); - - switch (plan_type) - { - case RemovePlanType::NOT_INSTALLED: - msg::println(msg::format(msgFollowingPackagesNotInstalled).append_raw(as_string)); - continue; - case RemovePlanType::REMOVE: - msg::println(msg::format(msgPackagesToRemove).append_raw('\n').append_raw(as_string)); - continue; - default: Checks::unreachable(VCPKG_LINE_INFO); - } + return &t; } - } + } op_address_of; - void perform_remove_plan_action(const VcpkgPaths& paths, - const RemovePlanAction& action, - const Purge purge, - StatusParagraphs* status_db) + void print_remove_plan(const RemovePlan& plan) { - Filesystem& fs = paths.get_filesystem(); - - const std::string display_name = action.spec.to_string(); - - switch (action.plan_type) + if (!plan.not_installed.empty()) { - case RemovePlanType::NOT_INSTALLED: break; - case RemovePlanType::REMOVE: remove_package(fs, paths.installed(), action.spec, status_db); break; - case RemovePlanType::UNKNOWN: - default: Checks::unreachable(VCPKG_LINE_INFO); + std::vector not_installed = Util::fmap(plan.not_installed, op_address_of); + Util::sort(not_installed, &BasicAction::compare_by_name); + LocalizedString msg; + msg.append(msgFollowingPackagesNotInstalled).append_raw("\n"); + for (auto p : not_installed) + { + msg.append_raw(request_type_indent(RequestType::USER_REQUESTED)).append_raw(p->spec).append_raw("\n"); + } + msg::print(msg); } - - if (purge == Purge::YES) + if (!plan.remove.empty()) { - fs.remove_all(paths.packages() / action.spec.dir(), VCPKG_LINE_INFO); + std::vector remove = Util::fmap(plan.remove, op_address_of); + Util::sort(remove, &BasicAction::compare_by_name); + LocalizedString msg; + msg.append(msgPackagesToRemove).append_raw("\n"); + for (auto p : remove) + { + msg.append_raw(request_type_indent(p->request_type)).append_raw(p->spec).append_raw("\n"); + } + msg::print(msg); } } - static constexpr StringLiteral OPTION_PURGE = "purge"; - static constexpr StringLiteral OPTION_RECURSE = "recurse"; - static constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; - static constexpr StringLiteral OPTION_OUTDATED = "outdated"; + constexpr StringLiteral OPTION_PURGE = "purge"; + constexpr StringLiteral OPTION_RECURSE = "recurse"; + constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; + constexpr StringLiteral OPTION_OUTDATED = "outdated"; - static constexpr std::array SWITCHES = {{ - {OPTION_PURGE, nullptr}, - {OPTION_RECURSE, []() { return msg::format(msgCmdRemoveOptRecurse); }}, - {OPTION_DRY_RUN, []() { return msg::format(msgCmdRemoveOptDryRun); }}, - {OPTION_OUTDATED, []() { return msg::format(msgCmdRemoveOptOutdated); }}, - }}; + constexpr CommandSwitch SWITCHES[] = { + {OPTION_PURGE, {}}, + {OPTION_RECURSE, msgCmdRemoveOptRecurse}, + {OPTION_DRY_RUN, msgCmdRemoveOptDryRun}, + {OPTION_OUTDATED, msgCmdRemoveOptOutdated}, + }; - static std::vector valid_arguments(const VcpkgPaths& paths) + std::vector valid_arguments(const VcpkgPaths& paths) { const StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); auto installed_packages = get_installed_ports(status_db); return Util::fmap(installed_packages, [](auto&& pgh) -> std::string { return pgh.spec().to_string(); }); } +} // unnamed namespace - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("remove zlib zlib:x64-windows curl boost"); }, +namespace vcpkg +{ + constexpr CommandMetadata CommandRemoveMetadata{ + "remove", + msgHelpRemoveCommand, + {msgCmdRemoveExample1, "vcpkg remove zlib zlib:x64-windows curl boost", "vcpkg remove --outdated"}, + "https://learn.microsoft.com/vcpkg/commands/remove", + AutocompletePriority::Public, 0, SIZE_MAX, - {SWITCHES, {}}, + {SWITCHES}, &valid_arguments, }; - static void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet default_triplet) + void command_remove_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) { + (void)host_triplet; if (paths.manifest_mode_enabled()) { Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, msgRemoveDependencies); } - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments options = args.parse_arguments(CommandRemoveMetadata); StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); std::vector specs; @@ -209,8 +205,8 @@ namespace vcpkg::Remove PathsPortFileProvider provider( fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); - specs = Util::fmap(Update::find_outdated_packages(provider, status_db), - [](auto&& outdated) { return outdated.spec; }); + specs = + Util::fmap(find_outdated_packages(provider, status_db), [](auto&& outdated) { return outdated.spec; }); if (specs.empty()) { @@ -225,35 +221,33 @@ namespace vcpkg::Remove msg::println_error(msgInvalidOptionForRemove); Checks::exit_fail(VCPKG_LINE_INFO); } + + bool default_triplet_used = false; specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_package_spec( - std::string(arg), default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); + return parse_package_spec( + arg, default_triplet, default_triplet_used, CommandRemoveMetadata.get_example_text()); }); - print_default_triplet_warning(args, options.command_arguments); + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } } const Purge purge = Util::Sets::contains(options.switches, OPTION_PURGE) ? Purge::YES : Purge::NO; const bool is_recursive = Util::Sets::contains(options.switches, OPTION_RECURSE); const bool dry_run = Util::Sets::contains(options.switches, OPTION_DRY_RUN); - const std::vector remove_plan = create_remove_plan(specs, status_db); + const auto plan = create_remove_plan(specs, status_db); - if (remove_plan.empty()) + if (plan.empty()) { Checks::unreachable(VCPKG_LINE_INFO, "Remove plan cannot be empty"); } - std::map> group_by_plan_type; - Util::group_by(remove_plan, &group_by_plan_type, [](const RemovePlanAction& p) { return p.plan_type; }); - print_plan(group_by_plan_type); - - const bool has_non_user_requested_packages = - Util::find_if(remove_plan, [](const RemovePlanAction& package) -> bool { - return package.request_type != RequestType::USER_REQUESTED; - }) != remove_plan.cend(); + print_remove_plan(plan); - if (has_non_user_requested_packages) + if (plan.has_non_user_requested()) { msg::println_warning(msgAdditionalPackagesToRemove); @@ -264,22 +258,26 @@ namespace vcpkg::Remove } } - for (const auto& action : remove_plan) + std::map not_installed_names; + for (auto&& action : plan.not_installed) { - if (action.plan_type == RemovePlanType::NOT_INSTALLED && action.request_type == RequestType::USER_REQUESTED) + // Only keep one spec per name + not_installed_names.emplace(action.spec.name(), action.spec); + } + if (!not_installed_names.empty()) + { + // The user requested removing a package that was not installed. If the port is installed for another + // triplet, warn the user that they may have meant that other package. + for (const auto& package : status_db) { - // The user requested removing a package that was not installed. If the port is installed for another - // triplet, warn the user that they may have meant that other package. - const auto& action_spec = action.spec; - const auto& action_package_name = action_spec.name(); - for (const auto& package : status_db) + if (package->is_installed() && !package->package.is_feature()) { - if (package->is_installed() && !package->package.is_feature() && - package->package.spec.name() == action_package_name) + auto it = not_installed_names.find(package->package.spec.name()); + if (it != not_installed_names.end()) { msg::println_warning(msgRemovePackageConflict, - msg::package_name = action_package_name, - msg::spec = action.spec, + msg::package_name = it->first, + msg::spec = it->second, msg::triplet = package->package.spec.triplet()); } } @@ -291,25 +289,29 @@ namespace vcpkg::Remove Checks::exit_success(VCPKG_LINE_INFO); } - // note that we try to "remove" things that aren't installed to trigger purge actions - for (std::size_t idx = 0; idx < remove_plan.size(); ++idx) + const Filesystem& fs = paths.get_filesystem(); + if (purge == Purge::YES) + { + for (auto&& action : plan.not_installed) + { + fs.remove_all(paths.package_dir(action.spec), VCPKG_LINE_INFO); + } + } + + for (std::size_t idx = 0; idx < plan.remove.size(); ++idx) { - const RemovePlanAction& action = remove_plan[idx]; + const RemovePlanAction& action = plan.remove[idx]; msg::println(msgRemovingPackage, msg::action_index = idx + 1, - msg::count = remove_plan.size(), + msg::count = plan.remove.size(), msg::spec = action.spec); - perform_remove_plan_action(paths, action, purge, &status_db); + remove_package(fs, paths.installed(), action.spec, status_db); + if (purge == Purge::YES) + { + fs.remove_all(paths.package_dir(action.spec), VCPKG_LINE_INFO); + } } Checks::exit_success(VCPKG_LINE_INFO); } - - void RemoveCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet /*host_triplet*/) const - { - Remove::perform_and_exit(args, paths, default_triplet); - } } diff --git a/src/vcpkg/commands.search.cpp b/src/vcpkg/commands.search.cpp index fffbd5914a..fe809200fa 100644 --- a/src/vcpkg/commands.search.cpp +++ b/src/vcpkg/commands.search.cpp @@ -1,31 +1,41 @@ #include #include +#include #include -#include #include #include -namespace vcpkg::Commands +using namespace vcpkg; + +namespace { - static constexpr StringLiteral OPTION_FULLDESC = "x-full-desc"; // TODO: This should find a better home, eventually - static constexpr StringLiteral OPTION_JSON = "x-json"; + constexpr StringLiteral OPTION_FULLDESC = "x-full-desc"; // TODO: This should find a better home, eventually + constexpr StringLiteral OPTION_JSON = "x-json"; - static constexpr std::array SearchSwitches = { - {{OPTION_FULLDESC, []() { return msg::format(msgHelpTextOptFullDesc); }}, - {OPTION_JSON, []() { return msg::format(msgJsonSwitch); }}}}; + constexpr CommandSwitch SearchSwitches[] = { + {OPTION_FULLDESC, msgHelpTextOptFullDesc}, + {OPTION_JSON, msgJsonSwitch}, + }; +} // unnamed namespace - const CommandStructure SearchCommandStructure = { - [] { return msg::format(msgSearchHelp).append_raw('\n').append(create_example_string("search png")); }, +namespace vcpkg +{ + constexpr CommandMetadata CommandSearchMetadata = { + "search", + msgHelpSearchCommand, + {msgCmdSearchExample1, "vcpkg search png"}, + "https://learn.microsoft.com/vcpkg/commands/search", + AutocompletePriority::Public, 0, 1, {SearchSwitches, {}}, nullptr, }; - void SearchCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + void command_search_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - const ParsedArguments options = args.parse_arguments(SearchCommandStructure); + const ParsedArguments options = args.parse_arguments(CommandSearchMetadata); const bool full_description = Util::Sets::contains(options.switches, OPTION_FULLDESC); Optional filter; if (!options.command_arguments.empty()) @@ -36,4 +46,4 @@ namespace vcpkg::Commands perform_find_port_and_exit( paths, full_description, Util::Sets::contains(options.switches, OPTION_JSON), filter, paths.overlay_ports); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.set-installed.cpp b/src/vcpkg/commands.set-installed.cpp new file mode 100644 index 0000000000..529878fbcf --- /dev/null +++ b/src/vcpkg/commands.set-installed.cpp @@ -0,0 +1,345 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace vcpkg; + +namespace +{ + constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; + constexpr StringLiteral OPTION_KEEP_GOING = "keep-going"; + constexpr StringLiteral OPTION_ONLY_DOWNLOADS = "only-downloads"; + constexpr StringLiteral OPTION_WRITE_PACKAGES_CONFIG = "x-write-nuget-packages-config"; + constexpr StringLiteral OPTION_NO_PRINT_USAGE = "no-print-usage"; + constexpr StringLiteral OPTION_ENFORCE_PORT_CHECKS = "enforce-port-checks"; + constexpr StringLiteral OPTION_ALLOW_UNSUPPORTED_PORT = "allow-unsupported"; + + constexpr CommandSwitch INSTALL_SWITCHES[] = { + {OPTION_DRY_RUN, msgCmdSetInstalledOptDryRun}, + {OPTION_NO_PRINT_USAGE, msgCmdSetInstalledOptNoUsage}, + {OPTION_ONLY_DOWNLOADS, msgHelpTxtOptOnlyDownloads}, + {OPTION_ENFORCE_PORT_CHECKS, msgHelpTxtOptEnforcePortChecks}, + {OPTION_ALLOW_UNSUPPORTED_PORT, msgHelpTxtOptAllowUnsupportedPort}, + }; + + constexpr CommandSetting INSTALL_SETTINGS[] = { + {OPTION_WRITE_PACKAGES_CONFIG, msgCmdSetInstalledOptWritePkgConfig}, + }; +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandSetInstalledMetadata = { + "x-set-installed", + msgCmdSetInstalledSynopsis, + {msgCmdSetInstalledExample1, "vcpkg x-set-installed zlib:x64-windows boost"}, + Undocumented, + AutocompletePriority::Public, + 0, + SIZE_MAX, + {INSTALL_SWITCHES, INSTALL_SETTINGS}, + nullptr, + }; + + Optional create_dependency_graph_snapshot(const VcpkgCmdArguments& args, + const ActionPlan& action_plan) + { + if (args.github_ref.has_value() && args.github_sha.has_value() && args.github_job.has_value() && + args.github_workflow.has_value() && args.github_run_id.has_value()) + { + Json::Object detector; + detector.insert("name", Json::Value::string("vcpkg")); + detector.insert("url", Json::Value::string("https://github.com/microsoft/vcpkg")); + detector.insert("version", Json::Value::string("1.0.0")); + + Json::Object job; + job.insert("id", Json::Value::string(*args.github_run_id.get())); + job.insert("correlator", Json::Value::string(*args.github_workflow.get() + "-" + *args.github_job.get())); + + Json::Object snapshot; + snapshot.insert("job", job); + snapshot.insert("version", Json::Value::integer(0)); + snapshot.insert("sha", Json::Value::string(*args.github_sha.get())); + snapshot.insert("ref", Json::Value::string(*args.github_ref.get())); + snapshot.insert("scanned", Json::Value::string(CTime::now_string())); + snapshot.insert("detector", detector); + + Json::Object manifest; + manifest.insert("name", "vcpkg.json"); + + std::unordered_map map; + for (auto&& action : action_plan.install_actions) + { + if (!action.source_control_file_and_location.has_value()) + { + return nullopt; + } + const auto& scf = *action.source_control_file_and_location.get(); + auto version = scf.to_version().to_string(); + auto s = action.spec.to_string(); + auto pkg_url = Strings::concat("pkg:github/vcpkg/", s, "@", version); + map.insert({s, pkg_url}); + } + + Json::Object resolved; + for (auto&& action : action_plan.install_actions) + { + Json::Object resolved_item; + if (map.find(action.spec.to_string()) != map.end()) + { + auto pkg_url = map.at(action.spec.to_string()); + resolved_item.insert("package_url", pkg_url); + resolved_item.insert("relationship", Json::Value::string("direct")); + Json::Array deps_list; + for (auto&& dep : action.package_dependencies) + { + if (map.find(dep.to_string()) != map.end()) + { + auto dep_pkg_url = map.at(dep.to_string()); + deps_list.push_back(dep_pkg_url); + } + } + resolved_item.insert("dependencies", deps_list); + resolved.insert(pkg_url, resolved_item); + } + } + manifest.insert("resolved", resolved); + Json::Object manifests; + manifests.insert("vcpkg.json", manifest); + snapshot.insert("manifests", manifests); + + Debug::print(Json::stringify(snapshot)); + return snapshot; + } + return nullopt; + } + + std::set adjust_action_plan_to_status_db(ActionPlan& action_plan, const StatusParagraphs& status_db) + { + std::set all_abis; + for (const auto& action : action_plan.install_actions) + { + all_abis.insert(action.abi_info.value_or_exit(VCPKG_LINE_INFO).package_abi); + } + + std::vector specs_to_remove; + std::set specs_installed; + for (auto&& status_pgh : status_db) + { + if (!status_pgh->is_installed()) continue; + if (status_pgh->package.is_feature()) continue; + + const auto& abi = status_pgh->package.abi; + if (abi.empty() || !Util::Sets::contains(all_abis, abi)) + { + specs_to_remove.push_back(status_pgh->package.spec); + } + else + { + specs_installed.emplace(status_pgh->package.spec); + } + } + action_plan.remove_actions = create_remove_plan(specs_to_remove, status_db).remove; + + for (const auto& action : action_plan.remove_actions) + { + // This should not technically be needed, however ensuring that all specs to be removed are not included in + // `specs_installed` acts as a sanity check + specs_installed.erase(action.spec); + } + + Util::erase_remove_if(action_plan.install_actions, [&](const InstallPlanAction& ipa) { + return Util::Sets::contains(specs_installed, ipa.spec); + }); + return specs_installed; + } + + void command_set_installed_and_exit_ex(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + const CMakeVars::CMakeVarProvider& cmake_vars, + ActionPlan action_plan, + DryRun dry_run, + const Optional& maybe_pkgsconfig, + Triplet host_triplet, + const KeepGoing keep_going, + const bool only_downloads, + const PrintUsage print_cmake_usage) + { + auto& fs = paths.get_filesystem(); + + cmake_vars.load_tag_vars(action_plan, host_triplet); + compute_all_abis(paths, action_plan, cmake_vars, {}); + + std::vector user_requested_specs; + for (const auto& action : action_plan.install_actions) + { + if (action.request_type == RequestType::USER_REQUESTED) + { + // save for reporting usage later + user_requested_specs.push_back(action.spec); + } + } + + if (paths.manifest_mode_enabled() && paths.get_feature_flags().dependency_graph) + { + msg::println(msgDependencyGraphCalculation); + auto snapshot = create_dependency_graph_snapshot(args, action_plan); + bool s = false; + if (snapshot.has_value() && args.github_token.has_value() && args.github_repository.has_value()) + { + s = send_snapshot_to_api(*args.github_token.get(), *args.github_repository.get(), *snapshot.get()); + if (s) + { + msg::println(msgDependencyGraphSuccess); + } + else + { + msg::println(msgDependencyGraphFailure); + } + } + get_global_metrics_collector().track_bool(BoolMetric::DependencyGraphSuccess, s); + } + + // currently (or once) installed specifications + auto status_db = database_load_check(fs, paths.installed()); + adjust_action_plan_to_status_db(action_plan, status_db); + + print_plan(action_plan, true, paths.builtin_ports_directory()); + + if (auto p_pkgsconfig = maybe_pkgsconfig.get()) + { + auto pkgsconfig_path = paths.original_cwd / *p_pkgsconfig; + auto pkgsconfig_contents = generate_nuget_packages_config(action_plan, args.nuget_id_prefix.value_or("")); + fs.write_contents(pkgsconfig_path, pkgsconfig_contents, VCPKG_LINE_INFO); + msg::println(msgWroteNuGetPkgConfInfo, msg::path = pkgsconfig_path); + } + + if (dry_run == DryRun::Yes) + { + Checks::exit_success(VCPKG_LINE_INFO); + } + + paths.flush_lockfile(); + + track_install_plan(action_plan); + install_preclear_packages(paths, action_plan); + + auto binary_cache = only_downloads ? BinaryCache(paths.get_filesystem()) + : BinaryCache::make(args, paths, stdout_sink).value_or_exit(VCPKG_LINE_INFO); + binary_cache.fetch(action_plan.install_actions); + const auto summary = install_execute_plan( + args, action_plan, keep_going, paths, status_db, binary_cache, null_build_logs_recorder()); + + if (keep_going == KeepGoing::YES && summary.failed()) + { + summary.print_failed(); + if (!only_downloads) + { + Checks::exit_fail(VCPKG_LINE_INFO); + } + } + + if (print_cmake_usage == PrintUsage::YES) + { + std::set printed_usages; + for (auto&& ur_spec : user_requested_specs) + { + auto it = status_db.find_installed(ur_spec); + if (it != status_db.end()) + { + install_print_usage_information(it->get()->package, printed_usages, fs, paths.installed()); + } + } + } + + Checks::exit_success(VCPKG_LINE_INFO); + } + + void command_set_installed_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) + { + // input sanitization + const ParsedArguments options = args.parse_arguments(CommandSetInstalledMetadata); + bool default_triplet_used = false; + const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { + return check_and_get_full_package_spec(arg, + default_triplet, + default_triplet_used, + CommandSetInstalledMetadata.get_example_text(), + paths.get_triplet_db()); + }); + + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } + + const bool dry_run = Util::Sets::contains(options.switches, OPTION_DRY_RUN); + const bool only_downloads = Util::Sets::contains(options.switches, OPTION_ONLY_DOWNLOADS); + const KeepGoing keep_going = Util::Sets::contains(options.switches, OPTION_KEEP_GOING) || only_downloads + ? KeepGoing::YES + : KeepGoing::NO; + const PrintUsage print_cmake_usage = + Util::Sets::contains(options.switches, OPTION_NO_PRINT_USAGE) ? PrintUsage::NO : PrintUsage::YES; + const auto unsupported_port_action = Util::Sets::contains(options.switches, OPTION_ALLOW_UNSUPPORTED_PORT) + ? UnsupportedPortAction::Warn + : UnsupportedPortAction::Error; + const bool prohibit_backcompat_features = Util::Sets::contains(options.switches, (OPTION_ENFORCE_PORT_CHECKS)); + + auto& fs = paths.get_filesystem(); + auto registry_set = paths.make_registry_set(); + PathsPortFileProvider provider( + fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); + auto cmake_vars = CMakeVars::make_triplet_cmake_var_provider(paths); + + Optional pkgsconfig; + auto it_pkgsconfig = options.settings.find(OPTION_WRITE_PACKAGES_CONFIG); + if (it_pkgsconfig != options.settings.end()) + { + get_global_metrics_collector().track_define(DefineMetric::X_WriteNugetPackagesConfig); + pkgsconfig = it_pkgsconfig->second; + } + + // We have a set of user-requested specs. + // We need to know all the specs which are required to fulfill dependencies for those specs. + // Therefore, we see what we would install into an empty installed tree, so we can use the existing code. + auto action_plan = create_feature_install_plan( + provider, *cmake_vars, specs, {}, {host_triplet, paths.packages(), unsupported_port_action}); + + for (auto&& action : action_plan.install_actions) + { + action.build_options = default_build_package_options; + action.build_options.backcompat_features = + (prohibit_backcompat_features ? BackcompatFeatures::PROHIBIT : BackcompatFeatures::ALLOW); + } + + command_set_installed_and_exit_ex(args, + paths, + *cmake_vars, + std::move(action_plan), + dry_run ? DryRun::Yes : DryRun::No, + pkgsconfig, + host_triplet, + keep_going, + only_downloads, + print_cmake_usage); + } +} // namespace vcpkg diff --git a/src/vcpkg/commands.setinstalled.cpp b/src/vcpkg/commands.setinstalled.cpp deleted file mode 100644 index 98a26c7801..0000000000 --- a/src/vcpkg/commands.setinstalled.cpp +++ /dev/null @@ -1,223 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace vcpkg::Commands::SetInstalled -{ - static constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; - static constexpr StringLiteral OPTION_KEEP_GOING = "keep-going"; - static constexpr StringLiteral OPTION_ONLY_DOWNLOADS = "only-downloads"; - static constexpr StringLiteral OPTION_WRITE_PACKAGES_CONFIG = "x-write-nuget-packages-config"; - static constexpr StringLiteral OPTION_NO_PRINT_USAGE = "no-print-usage"; - - static constexpr CommandSwitch INSTALL_SWITCHES[] = { - {OPTION_DRY_RUN, []() { return msg::format(msgCmdSetInstalledOptDryRun); }}, - {OPTION_NO_PRINT_USAGE, []() { return msg::format(msgCmdSetInstalledOptNoUsage); }}, - {OPTION_ONLY_DOWNLOADS, []() { return msg::format(msgHelpTxtOptOnlyDownloads); }}, - }; - static constexpr CommandSetting INSTALL_SETTINGS[] = { - {OPTION_WRITE_PACKAGES_CONFIG, []() { return msg::format(msgCmdSetInstalledOptWritePkgConfig); }}, - }; - - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("x-set-installed ..."); }, - 0, - SIZE_MAX, - {INSTALL_SWITCHES, INSTALL_SETTINGS}, - nullptr, - }; - - void perform_and_exit_ex(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - const PathsPortFileProvider& provider, - BinaryCache& binary_cache, - const CMakeVars::CMakeVarProvider& cmake_vars, - ActionPlan action_plan, - DryRun dry_run, - const Optional& maybe_pkgsconfig, - Triplet host_triplet, - const KeepGoing keep_going, - const bool only_downloads, - const PrintUsage print_cmake_usage) - { - auto& fs = paths.get_filesystem(); - - cmake_vars.load_tag_vars(action_plan, provider, host_triplet); - compute_all_abis(paths, action_plan, cmake_vars, {}); - - std::set all_abis; - - std::vector user_requested_specs; - for (const auto& action : action_plan.install_actions) - { - all_abis.insert(action.abi_info.value_or_exit(VCPKG_LINE_INFO).package_abi); - if (action.request_type == RequestType::USER_REQUESTED) - { - // save for reporting usage later - user_requested_specs.push_back(action.spec); - } - } - - // currently (or once) installed specifications - auto status_db = database_load_check(fs, paths.installed()); - std::vector specs_to_remove; - std::set specs_installed; - for (auto&& status_pgh : status_db) - { - if (!status_pgh->is_installed()) continue; - if (status_pgh->package.is_feature()) continue; - - const auto& abi = status_pgh->package.abi; - if (abi.empty() || !Util::Sets::contains(all_abis, abi)) - { - specs_to_remove.push_back(status_pgh->package.spec); - } - else - { - specs_installed.emplace(status_pgh->package.spec); - } - } - - action_plan.remove_actions = create_remove_plan(specs_to_remove, status_db); - - for (const auto& action : action_plan.remove_actions) - { - // This should not technically be needed, however ensuring that all specs to be removed are not included in - // `specs_installed` acts as a sanity check - specs_installed.erase(action.spec); - } - - Util::erase_remove_if(action_plan.install_actions, [&](const InstallPlanAction& ipa) { - return Util::Sets::contains(specs_installed, ipa.spec); - }); - - print_plan(action_plan, true, paths.builtin_ports_directory()); - - if (auto p_pkgsconfig = maybe_pkgsconfig.get()) - { - compute_all_abis(paths, action_plan, cmake_vars, status_db); - auto pkgsconfig_path = paths.original_cwd / *p_pkgsconfig; - auto pkgsconfig_contents = generate_nuget_packages_config(action_plan); - fs.write_contents(pkgsconfig_path, pkgsconfig_contents, VCPKG_LINE_INFO); - msg::println(msgWroteNuGetPkgConfInfo, msg::path = pkgsconfig_path); - } - - if (dry_run == DryRun::Yes) - { - Checks::exit_success(VCPKG_LINE_INFO); - } - - paths.flush_lockfile(); - - track_install_plan(action_plan); - - const auto summary = Install::perform( - args, action_plan, keep_going, paths, status_db, binary_cache, null_build_logs_recorder(), cmake_vars); - - if (keep_going == KeepGoing::YES && summary.failed()) - { - summary.print_failed(); - if (!only_downloads) - { - Checks::exit_fail(VCPKG_LINE_INFO); - } - } - - if (print_cmake_usage == PrintUsage::YES) - { - std::set printed_usages; - for (auto&& ur_spec : user_requested_specs) - { - auto it = status_db.find_installed(ur_spec); - if (it != status_db.end()) - { - Install::print_usage_information(it->get()->package, printed_usages, fs, paths.installed()); - } - } - } - - Checks::exit_success(VCPKG_LINE_INFO); - } - - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) - { - // input sanitization - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); - - const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_full_package_spec( - std::string(arg), default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); - }); - - print_default_triplet_warning(args, options.command_arguments); - - BinaryCache binary_cache{args, paths}; - - const bool dry_run = Util::Sets::contains(options.switches, OPTION_DRY_RUN); - const bool only_downloads = Util::Sets::contains(options.switches, OPTION_ONLY_DOWNLOADS); - const KeepGoing keep_going = Util::Sets::contains(options.switches, OPTION_KEEP_GOING) || only_downloads - ? KeepGoing::YES - : KeepGoing::NO; - const PrintUsage print_cmake_usage = - Util::Sets::contains(options.switches, OPTION_NO_PRINT_USAGE) ? PrintUsage::NO : PrintUsage::YES; - - auto& fs = paths.get_filesystem(); - auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider( - fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); - auto cmake_vars = CMakeVars::make_triplet_cmake_var_provider(paths); - - Optional pkgsconfig; - auto it_pkgsconfig = options.settings.find(OPTION_WRITE_PACKAGES_CONFIG); - if (it_pkgsconfig != options.settings.end()) - { - get_global_metrics_collector().track_define(DefineMetric::X_WriteNugetPackagesConfig); - pkgsconfig = it_pkgsconfig->second; - } - - // We have a set of user-requested specs. - // We need to know all the specs which are required to fulfill dependencies for those specs. - // Therefore, we see what we would install into an empty installed tree, so we can use the existing code. - auto action_plan = create_feature_install_plan(provider, *cmake_vars, specs, {}, {host_triplet}); - - for (auto&& action : action_plan.install_actions) - { - action.build_options = default_build_package_options; - } - - perform_and_exit_ex(args, - paths, - provider, - binary_cache, - *cmake_vars, - std::move(action_plan), - dry_run ? DryRun::Yes : DryRun::No, - pkgsconfig, - host_triplet, - keep_going, - only_downloads, - print_cmake_usage); - } - - void SetInstalledCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - SetInstalled::perform_and_exit(args, paths, default_triplet, host_triplet); - } -} diff --git a/src/vcpkg/commands.update-baseline.cpp b/src/vcpkg/commands.update-baseline.cpp index 003b83f4e6..8e5680193b 100644 --- a/src/vcpkg/commands.update-baseline.cpp +++ b/src/vcpkg/commands.update-baseline.cpp @@ -8,24 +8,11 @@ #include #include -namespace vcpkg::Commands -{ - static constexpr StringLiteral OPTION_ADD_INITIAL_BASELINE = "add-initial-baseline"; - static constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; - - static constexpr CommandSwitch switches[] = { - {OPTION_ADD_INITIAL_BASELINE, []() { return msg::format(msgCmdUpdateBaselineOptInitial); }}, - {OPTION_DRY_RUN, []() { return msg::format(msgCmdUpdateBaselineOptDryRun); }}, - }; - - static const CommandStructure COMMAND_STRUCTURE{ - [] { return create_example_string("x-update-baseline"); }, - 0, - 0, - {switches}, - }; +using namespace vcpkg; - static void update_baseline_in_config(const VcpkgPaths& paths, RegistryConfig& reg) +namespace +{ + void update_baseline_in_config(const VcpkgPaths& paths, RegistryConfig& reg) { auto url = reg.pretty_location(); auto new_baseline_res = reg.get_latest_baseline(paths); @@ -56,14 +43,39 @@ namespace vcpkg::Commands .append(new_baseline_res.error())); } - void UpdateBaselineCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + constexpr StringLiteral OPTION_ADD_INITIAL_BASELINE = "add-initial-baseline"; + constexpr StringLiteral OPTION_DRY_RUN = "dry-run"; + + constexpr CommandSwitch switches[] = { + {OPTION_ADD_INITIAL_BASELINE, msgCmdUpdateBaselineOptInitial}, + {OPTION_DRY_RUN, msgCmdUpdateBaselineOptDryRun}, + }; + +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandUpdateBaselineMetadata{ + "x-update-baseline", + msgCmdUpdateBaselineSynopsis, + {"vcpkg x-update-baseline"}, + "https://learn.microsoft.com/vcpkg/commands/update-baseline", + AutocompletePriority::Public, + 0, + 0, + {switches}, + nullptr, + }; + + void command_update_baseline_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - auto options = args.parse_arguments(COMMAND_STRUCTURE); + auto options = args.parse_arguments(CommandUpdateBaselineMetadata); const bool add_builtin_baseline = Util::Sets::contains(options.switches, OPTION_ADD_INITIAL_BASELINE); const bool dry_run = Util::Sets::contains(options.switches, OPTION_DRY_RUN); auto configuration = paths.get_configuration(); + const bool has_manifest = paths.get_manifest().has_value(); auto manifest = has_manifest ? *paths.get_manifest().get() : ManifestAndPath{}; @@ -135,4 +147,4 @@ namespace vcpkg::Commands Checks::exit_success(VCPKG_LINE_INFO); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.update-registry.cpp b/src/vcpkg/commands.update-registry.cpp new file mode 100644 index 0000000000..114aa18f85 --- /dev/null +++ b/src/vcpkg/commands.update-registry.cpp @@ -0,0 +1,68 @@ +#include +#include + +#include +#include +#include + +using namespace vcpkg; + +namespace +{ + constexpr StringLiteral OPTION_ALL = "all"; + constexpr CommandSwitch UpdateRegistrySwitches[] = { + {OPTION_ALL, msgCmdUpdateRegistryAll}, + }; +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandUpdateRegistryMetadata{ + "x-update-registry", + msgCmdUpdateRegistrySynopsis, + { + "vcpkg x-update-registry ", + "vcpkg x-update-registry https://example.com", + msgCmdUpdateRegistryExample3, + "vcpkg x-update-registry microsoft", + }, + Undocumented, + AutocompletePriority::Public, + 0, + SIZE_MAX, + {UpdateRegistrySwitches}, + nullptr, + }; + + void command_update_registry_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + { + auto parsed = args.parse_arguments(CommandUpdateRegistryMetadata); + const bool all = Util::Sets::contains(parsed.switches, OPTION_ALL); + auto&& command_arguments = parsed.command_arguments; + if (all) + { + if (command_arguments.empty()) + { + command_arguments.emplace_back("update"); + command_arguments.emplace_back("--all"); + } + else + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgCmdUpdateRegistryAllExcludesTargets); + } + } + else + { + if (command_arguments.empty()) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgCmdUpdateRegistryAllOrTargets); + } + else + { + command_arguments.emplace(command_arguments.begin(), "update"); + } + } + + Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, command_arguments)); + } +} // namespace vcpkg diff --git a/src/vcpkg/update.cpp b/src/vcpkg/commands.update.cpp similarity index 86% rename from src/vcpkg/update.cpp rename to src/vcpkg/commands.update.cpp index 36c5e1c119..1c6f82b7b8 100644 --- a/src/vcpkg/update.cpp +++ b/src/vcpkg/commands.update.cpp @@ -1,14 +1,16 @@ +#include + #include -#include +#include +#include #include #include #include -#include #include #include #include -namespace vcpkg::Update +namespace vcpkg { bool OutdatedPackage::compare_by_name(const OutdatedPackage& left, const OutdatedPackage& right) { @@ -45,22 +47,26 @@ namespace vcpkg::Update return output; } - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("update"); }, + constexpr CommandMetadata CommandUpdateMetadata{ + "update", + msgHelpUpdateCommand, + {"vcpkg update"}, + "https://learn.microsoft.com/vcpkg/commands/update", + AutocompletePriority::Public, 0, 0, {}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_update_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { if (paths.manifest_mode_enabled()) { Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, msgUnsupportedUpdateCMD); } - (void)args.parse_arguments(COMMAND_STRUCTURE); + (void)args.parse_arguments(CommandUpdateMetadata); msg::println(msgLocalPortfileVersion); auto& fs = paths.get_filesystem(); @@ -97,9 +103,4 @@ namespace vcpkg::Update Checks::exit_success(VCPKG_LINE_INFO); } - - void UpdateCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - Update::perform_and_exit(args, paths); - } } diff --git a/src/vcpkg/commands.upgrade.cpp b/src/vcpkg/commands.upgrade.cpp index e078de4add..c2b2b45b11 100644 --- a/src/vcpkg/commands.upgrade.cpp +++ b/src/vcpkg/commands.upgrade.cpp @@ -3,54 +3,60 @@ #include #include +#include +#include +#include #include #include #include -#include #include -#include #include #include #include -#include #include #include #include using namespace vcpkg; -namespace vcpkg::Commands::Upgrade +namespace { - static constexpr StringLiteral OPTION_NO_DRY_RUN = "no-dry-run"; - static constexpr StringLiteral OPTION_NO_KEEP_GOING = "no-keep-going"; - static constexpr StringLiteral OPTION_ALLOW_UNSUPPORTED_PORT = "allow-unsupported"; - - static constexpr std::array INSTALL_SWITCHES = {{ - {OPTION_NO_DRY_RUN, []() { return msg::format(msgCmdUpgradeOptNoDryRun); }}, - {OPTION_NO_KEEP_GOING, []() { return msg::format(msgCmdUpgradeOptNoKeepGoing); }}, - {OPTION_ALLOW_UNSUPPORTED_PORT, []() { return msg::format(msgCmdUpgradeOptAllowUnsupported); }}, - }}; - - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("upgrade --no-dry-run"); }, + constexpr StringLiteral OPTION_NO_DRY_RUN = "no-dry-run"; + constexpr StringLiteral OPTION_NO_KEEP_GOING = "no-keep-going"; + constexpr StringLiteral OPTION_ALLOW_UNSUPPORTED_PORT = "allow-unsupported"; + + constexpr CommandSwitch SWITCHES[] = { + {OPTION_NO_DRY_RUN, msgCmdUpgradeOptNoDryRun}, + {OPTION_NO_KEEP_GOING, msgCmdUpgradeOptNoKeepGoing}, + {OPTION_ALLOW_UNSUPPORTED_PORT, msgHelpTxtOptAllowUnsupportedPort}, + }; +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandUpgradeMetadata = { + "upgrade", + msgHelpUpgradeCommand, + {"vcpkg upgrade --no-dry-run"}, + "https://learn.microsoft.com/vcpkg/commands/upgrade", + AutocompletePriority::Public, 0, SIZE_MAX, - {INSTALL_SWITCHES, {}}, + {SWITCHES}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) + void command_upgrade_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) { if (paths.manifest_mode_enabled()) { - msg::println_error(msgUpgradeInManifest); - Checks::unreachable(VCPKG_LINE_INFO); + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgUpgradeInManifest); } - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments options = args.parse_arguments(CommandUpgradeMetadata); const bool no_dry_run = Util::Sets::contains(options.switches, OPTION_NO_DRY_RUN); const KeepGoing keep_going = @@ -59,7 +65,6 @@ namespace vcpkg::Commands::Upgrade ? UnsupportedPortAction::Warn : UnsupportedPortAction::Error; - BinaryCache binary_cache{args, paths}; StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed()); // Load ports from ports dirs @@ -70,17 +75,11 @@ namespace vcpkg::Commands::Upgrade auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); auto& var_provider = *var_provider_storage; - // input sanitization - const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { - return check_and_get_package_spec( - std::string(arg), default_triplet, COMMAND_STRUCTURE.get_example_text(), paths); - }); - ActionPlan action_plan; - if (specs.empty()) + if (options.command_arguments.empty()) { // If no packages specified, upgrade all outdated packages. - auto outdated_packages = Update::find_outdated_packages(provider, status_db); + auto outdated_packages = find_outdated_packages(provider, status_db); if (outdated_packages.empty()) { @@ -91,13 +90,26 @@ namespace vcpkg::Commands::Upgrade action_plan = create_upgrade_plan( provider, var_provider, - Util::fmap(outdated_packages, [](const Update::OutdatedPackage& package) { return package.spec; }), + Util::fmap(outdated_packages, [](const OutdatedPackage& package) { return package.spec; }), status_db, - {host_triplet, unsupported_port_action}); + {host_triplet, paths.packages(), unsupported_port_action}); } else { - print_default_triplet_warning(args, options.command_arguments); + // input sanitization + bool default_triplet_used = false; + const std::vector specs = Util::fmap(options.command_arguments, [&](auto&& arg) { + return check_and_get_package_spec(arg, + default_triplet, + default_triplet_used, + CommandUpgradeMetadata.get_example_text(), + paths.get_triplet_db()); + }); + + if (default_triplet_used) + { + print_default_triplet_warning(args, paths.get_triplet_db()); + } std::vector not_installed; std::vector no_control_file; @@ -174,8 +186,11 @@ namespace vcpkg::Commands::Upgrade if (to_upgrade.empty()) Checks::exit_success(VCPKG_LINE_INFO); - action_plan = create_upgrade_plan( - provider, var_provider, to_upgrade, status_db, {host_triplet, unsupported_port_action}); + action_plan = create_upgrade_plan(provider, + var_provider, + to_upgrade, + status_db, + {host_triplet, paths.packages(), unsupported_port_action}); } Checks::check_exit(VCPKG_LINE_INFO, !action_plan.empty()); @@ -194,10 +209,13 @@ namespace vcpkg::Commands::Upgrade Checks::exit_fail(VCPKG_LINE_INFO); } - var_provider.load_tag_vars(action_plan, provider, host_triplet); + var_provider.load_tag_vars(action_plan, host_triplet); - const InstallSummary summary = Install::perform( - args, action_plan, keep_going, paths, status_db, binary_cache, null_build_logs_recorder(), var_provider); + auto binary_cache = BinaryCache::make(args, paths, stdout_sink).value_or_exit(VCPKG_LINE_INFO); + compute_all_abis(paths, action_plan, var_provider, status_db); + binary_cache.fetch(action_plan.install_actions); + const InstallSummary summary = install_execute_plan( + args, action_plan, keep_going, paths, status_db, binary_cache, null_build_logs_recorder()); if (keep_going == KeepGoing::YES) { @@ -206,12 +224,4 @@ namespace vcpkg::Commands::Upgrade Checks::exit_success(VCPKG_LINE_INFO); } - - void UpgradeCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const - { - Upgrade::perform_and_exit(args, paths, default_triplet, host_triplet); - } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.upload-metrics.cpp b/src/vcpkg/commands.upload-metrics.cpp deleted file mode 100644 index 1490f39c38..0000000000 --- a/src/vcpkg/commands.upload-metrics.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include - -#if defined(_WIN32) -#include -#include - -#include -#include - -using namespace vcpkg; - -namespace vcpkg::Commands::UploadMetrics -{ - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("x-upload-metrics metrics.txt"); }, - 1, - 1, - }; - - void UploadMetricsCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const - { - const auto parsed = args.parse_arguments(COMMAND_STRUCTURE); - const auto& payload_path = parsed.command_arguments[0]; - auto payload = fs.read_contents(payload_path, VCPKG_LINE_INFO); - winhttp_upload_metrics(payload); - Checks::exit_success(VCPKG_LINE_INFO); - } -} -#endif // defined(_WIN32) diff --git a/src/vcpkg/commands.use.cpp b/src/vcpkg/commands.use.cpp index bd26da435f..a280244d27 100644 --- a/src/vcpkg/commands.use.cpp +++ b/src/vcpkg/commands.use.cpp @@ -1,14 +1,70 @@ #include +#include #include #include #include -namespace vcpkg::Commands +#include + +using namespace vcpkg; + +namespace +{ + constexpr StringLiteral OPTION_MSBUILD_PROPS = "msbuild-props"; + + constexpr CommandSetting UseOptions[] = { + {OPTION_MSBUILD_PROPS, msgArtifactsOptionMSBuildProps}, + }; + + constexpr StringLiteral OPTION_VERSION = "version"; + + constexpr CommandMultiSetting UseMultiOptions[] = { + {OPTION_VERSION, msgArtifactsOptionVersion}, + }; +} // unnamed namespace + +namespace vcpkg { - void UseCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const + constexpr CommandMetadata CommandUseMetadata{ + "use", + msgCmdUseSynopsis, + {msgCmdUseExample1, "vcpkg use cmake"}, + Undocumented, + AutocompletePriority::Public, + 1, + SIZE_MAX, + {CommonAcquireArtifactSwitches, UseOptions, UseMultiOptions}, + nullptr, + }; + + void command_use_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - Checks::exit_with_code(VCPKG_LINE_INFO, - run_configure_environment_command(paths, "use", args.get_forwardable_arguments())); + auto parsed = args.parse_arguments(CommandUseMetadata); + std::vector ecmascript_args; + ecmascript_args.emplace_back("use"); + + forward_common_artifacts_arguments(ecmascript_args, parsed); + + auto maybe_versions = Util::lookup_value(parsed.multisettings, OPTION_VERSION); + if (auto versions = maybe_versions.get()) + { + if (versions->size() != parsed.command_arguments.size()) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgArtifactsOptionVersionMismatch); + } + + for (auto&& version : *versions) + { + ecmascript_args.push_back("--version"); + ecmascript_args.push_back(version); + } + } + + ecmascript_args.insert(ecmascript_args.end(), + std::make_move_iterator(parsed.command_arguments.begin()), + std::make_move_iterator(parsed.command_arguments.end())); + + Checks::exit_with_code(VCPKG_LINE_INFO, run_configure_environment_command(paths, ecmascript_args)); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.version.cpp b/src/vcpkg/commands.version.cpp index 372cec6d93..db142ed816 100644 --- a/src/vcpkg/commands.version.cpp +++ b/src/vcpkg/commands.version.cpp @@ -1,12 +1,13 @@ +#include #include -#include #include #include #include +using namespace vcpkg; + namespace { - using namespace vcpkg; constexpr StringLiteral version_init = VCPKG_BASE_VERSION_AS_STRING "-" VCPKG_VERSION_AS_STRING #ifndef NDEBUG "-debug" @@ -14,26 +15,25 @@ namespace ; } -namespace vcpkg::Commands::Version +namespace vcpkg { - constexpr StringLiteral version = version_init; - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("version"); }, + constexpr StringLiteral vcpkg_executable_version = version_init; + constexpr CommandMetadata CommandVersionMetadata{ + "version", + msgHelpVersionCommand, + {"vcpkg version"}, + "https://learn.microsoft.com/vcpkg/commands/version", + AutocompletePriority::Public, 0, 0, {}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, Filesystem&) + void command_version_and_exit(const VcpkgCmdArguments& args, const Filesystem&) { - (void)args.parse_arguments(COMMAND_STRUCTURE); - msg::println(msgVersionCommandHeader, msg::version = version); + (void)args.parse_arguments(CommandVersionMetadata); + msg::println(msgVersionCommandHeader, msg::version = vcpkg_executable_version); Checks::exit_success(VCPKG_LINE_INFO); } - - void VersionCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const - { - Version::perform_and_exit(args, fs); - } } diff --git a/src/vcpkg/commands.xvsinstances.cpp b/src/vcpkg/commands.vsinstances.cpp similarity index 57% rename from src/vcpkg/commands.xvsinstances.cpp rename to src/vcpkg/commands.vsinstances.cpp index 8a479487b4..14e3c84208 100644 --- a/src/vcpkg/commands.xvsinstances.cpp +++ b/src/vcpkg/commands.vsinstances.cpp @@ -1,23 +1,28 @@ -#include -#include +#include + +#include #include #include #include -namespace vcpkg::Commands::X_VSInstances +namespace vcpkg { - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("x-vsinstances"); }, + constexpr CommandMetadata CommandVsInstancesMetadata{ + "x-vsinstances", + msgCmdVSInstancesSynopsis, + {"vcpkg x-vsinstances"}, + Undocumented, + AutocompletePriority::Public, 0, 0, - {{}, {}}, + {}, nullptr, }; - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + void command_vs_instances_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { #if defined(_WIN32) - const ParsedArguments parsed_args = args.parse_arguments(COMMAND_STRUCTURE); + const ParsedArguments parsed_args = args.parse_arguments(CommandVsInstancesMetadata); const auto instances = vcpkg::VisualStudio::get_visual_studio_instances(paths.get_filesystem()); for (const std::string& instance : instances) @@ -32,9 +37,4 @@ namespace vcpkg::Commands::X_VSInstances Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgWindowsOnlyCommand); #endif } - - void VSInstancesCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - X_VSInstances::perform_and_exit(args, paths); - } } diff --git a/src/vcpkg/commands.applocal.cpp b/src/vcpkg/commands.z-applocal.cpp similarity index 82% rename from src/vcpkg/commands.applocal.cpp rename to src/vcpkg/commands.z-applocal.cpp index c17dce212e..64da6001d6 100644 --- a/src/vcpkg/commands.applocal.cpp +++ b/src/vcpkg/commands.z-applocal.cpp @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include @@ -13,13 +13,13 @@ #include #include +using namespace vcpkg; + namespace { - using namespace vcpkg; - WriteFilePointer maybe_create_log(const std::map>& settings, StringLiteral setting, - Filesystem& fs) + const Filesystem& fs) { const auto entry = settings.find(setting); if (entry == settings.end()) @@ -58,26 +58,47 @@ namespace HANDLE h; }; + struct BinaryPathDecodedInfo + { + Path installed_root; + bool is_debug; + }; + + BinaryPathDecodedInfo decode_from_canonical_bin_dir(const Path& canonical_bin_dir) + { + auto maybe_installed_root = canonical_bin_dir.parent_path(); + static constexpr StringLiteral debug_suffix = "\\debug"; + const bool is_debug = Strings::case_insensitive_ascii_ends_with(maybe_installed_root, debug_suffix); + if (is_debug) + { + maybe_installed_root = maybe_installed_root.substr(0, maybe_installed_root.size() - debug_suffix.size()); + } + + return BinaryPathDecodedInfo{maybe_installed_root, is_debug}; + } + struct AppLocalInvocation { - AppLocalInvocation(Filesystem& fs, + AppLocalInvocation(const Filesystem& fs, const Path& deployment_dir, const Path& installed_bin_dir, + const Path& installed, + bool is_debug, WriteFilePointer&& tlog_file, WriteFilePointer&& copied_files_log) : m_fs(fs) , m_deployment_dir(deployment_dir) - , m_installed_bin_dir(fs.almost_canonical(installed_bin_dir, VCPKG_LINE_INFO)) - , m_installed_bin_parent(m_installed_bin_dir.parent_path()) + , m_installed_bin_dir(installed_bin_dir) + , m_installed(installed) + , m_is_debug(is_debug) , m_tlog_file(std::move(tlog_file)) , m_copied_files_log(std::move(copied_files_log)) - , m_openni2_installed( - m_fs.exists(m_installed_bin_parent / "bin/OpenNI2/openni2deploy.ps1", VCPKG_LINE_INFO)) + , m_openni2_installed(m_fs.exists(m_installed / "bin/OpenNI2/openni2deploy.ps1", VCPKG_LINE_INFO)) , m_azurekinectsdk_installed( - m_fs.exists(m_installed_bin_parent / "tools/azure-kinect-sensor-sdk/k4adeploy.ps1", VCPKG_LINE_INFO)) - , m_magnum_installed(m_fs.exists(m_installed_bin_parent / "bin/magnum/magnumdeploy.ps1", VCPKG_LINE_INFO) || - m_fs.exists(m_installed_bin_parent / "bin/magnum-d/magnumdeploy.ps1", VCPKG_LINE_INFO)) - , m_qt_installed(m_fs.exists(m_installed_bin_parent / "plugins/qtdeploy.ps1", VCPKG_LINE_INFO)) + m_fs.exists(m_installed / "tools/azure-kinect-sensor-sdk/k4adeploy.ps1", VCPKG_LINE_INFO)) + , m_magnum_installed(m_fs.exists(m_installed / "bin/magnum/magnumdeploy.ps1", VCPKG_LINE_INFO) || + m_fs.exists(m_installed / "bin/magnum-d/magnumdeploy.ps1", VCPKG_LINE_INFO)) + , m_qt_installed(m_fs.exists(m_installed / "plugins/qtdeploy.ps1", VCPKG_LINE_INFO)) { } @@ -109,37 +130,36 @@ namespace if (m_openni2_installed) { - deployOpenNI2(target_binary_dir, m_installed_bin_parent, imported_name); + deployOpenNI2(target_binary_dir, m_installed, imported_name); } if (m_azurekinectsdk_installed) { - deployAzureKinectSensorSDK(target_binary_dir, m_installed_bin_parent, imported_name); + deployAzureKinectSensorSDK(target_binary_dir, m_installed, imported_name); } if (m_magnum_installed) { - bool g_is_debug = m_installed_bin_parent.stem() == "debug"; - if (g_is_debug) + if (m_is_debug) { - deployMagnum(target_binary_dir, m_installed_bin_parent / "bin/magnum-d", imported_name); + deployMagnum(target_binary_dir, m_installed / "bin/magnum-d", imported_name); } else { - deployMagnum(target_binary_dir, m_installed_bin_parent / "bin/magnum", imported_name); + deployMagnum(target_binary_dir, m_installed / "bin/magnum", imported_name); } } if (m_qt_installed) { - deployQt(m_deployment_dir, m_installed_bin_parent / "plugins", imported_name); + deployQt(m_deployment_dir, m_installed / "plugins", imported_name); } resolve(m_deployment_dir / imported_name); } else if (m_fs.exists(target_item_file_path, VCPKG_LINE_INFO)) { - Debug::println(" ", imported_name, " not found in ", m_installed_bin_parent, "; locally deployed"); + Debug::println(" ", imported_name, " not found in ", m_installed, "; locally deployed"); resolve(target_item_file_path); } else @@ -457,8 +477,10 @@ namespace const Path& installed_dir, const std::string& target_binary_name) { - const auto source = installed_dir / target_binary_name; - const auto target = target_binary_dir / target_binary_name; + auto source = installed_dir / target_binary_name; + source.make_preferred(); + auto target = target_binary_dir / target_binary_name; + target.make_preferred(); const auto mutant_name = "vcpkg-applocal-" + Hash::get_string_sha256(target_binary_dir); const MutantGuard mutant(mutant_name); @@ -505,10 +527,11 @@ namespace return did_deploy; } - Filesystem& m_fs; + const Filesystem& m_fs; Path m_deployment_dir; Path m_installed_bin_dir; - Path m_installed_bin_parent; + Path m_installed; + bool m_is_debug; WriteFilePointer m_tlog_file; WriteFilePointer m_copied_files_log; std::unordered_set m_searched; @@ -517,54 +540,63 @@ namespace bool m_magnum_installed; bool m_qt_installed; }; -} -namespace vcpkg::Commands + constexpr StringLiteral OPTION_TARGET_BINARY = "target-binary"; + constexpr StringLiteral OPTION_INSTALLED_DIR = "installed-bin-dir"; + constexpr StringLiteral OPTION_TLOG_FILE = "tlog-file"; + constexpr StringLiteral OPTION_COPIED_FILES_LOG = "copied-files-log"; + + constexpr CommandSetting SETTINGS[] = { + {OPTION_TARGET_BINARY, msgCmdSettingTargetBin}, + {OPTION_INSTALLED_DIR, msgCmdSettingInstalledDir}, + {OPTION_TLOG_FILE, msgCmdSettingTLogFile}, + {OPTION_COPIED_FILES_LOG, msgCmdSettingCopiedFilesLog}, + }; +} // unnamed namespace + +namespace vcpkg { - void AppLocalCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem&) const + constexpr CommandMetadata CommandZApplocalMetadata{ + "z-applocal", + msgCmdZApplocalSynopsis, + {"vcpkg z-applocal --target-binary=\"Path/to/binary\" --installed-bin-dir=\"Path/to/installed/bin\" " + "--tlog-file=\"Path/to/tlog.tlog\" --copied-files-log=\"Path/to/copiedFilesLog.log\""}, + Undocumented, + AutocompletePriority::Internal, + 0, + 0, + {{}, SETTINGS}, + nullptr, + }; + + void command_z_applocal_and_exit(const VcpkgCmdArguments& args, const Filesystem&) { - static constexpr StringLiteral OPTION_TARGET_BINARY = "target-binary"; - static constexpr StringLiteral OPTION_INSTALLED_DIR = "installed-bin-dir"; - static constexpr StringLiteral OPTION_TLOG_FILE = "tlog-file"; - static constexpr StringLiteral OPTION_COPIED_FILES_LOG = "copied-files-log"; - - static constexpr CommandSetting SETTINGS[] = { - {OPTION_TARGET_BINARY, []() { return msg::format(msgCmdSettingTargetBin); }}, - {OPTION_INSTALLED_DIR, []() { return msg::format(msgCmdSettingInstalledDir); }}, - {OPTION_TLOG_FILE, []() { return msg::format(msgCmdSettingTLogFile); }}, - {OPTION_COPIED_FILES_LOG, []() { return msg::format(msgCmdSettingCopiedFilesLog); }}, - }; - - const CommandStructure COMMAND_STRUCTURE = { - [] { - return LocalizedString::from_raw( - "--target-binary=\"Path/to/binary\" --installed-bin-dir=\"Path/to/installed/bin\" --tlog-file=" - "\"Path/to/tlog.tlog\" --copied-files-log=\"Path/to/copiedFilesLog.log\""); - }, - 0, - 0, - {{}, SETTINGS, {}}, - nullptr}; - - auto& fs = get_real_filesystem(); - - auto parsed = args.parse_arguments(COMMAND_STRUCTURE); + auto parsed = args.parse_arguments(CommandZApplocalMetadata); const auto target_binary = parsed.settings.find(OPTION_TARGET_BINARY); - Checks::check_exit( - VCPKG_LINE_INFO, target_binary != parsed.settings.end(), "The --target-binary setting is required."); - const auto target_installed_bin_dir = parsed.settings.find(OPTION_INSTALLED_DIR); - Checks::check_exit(VCPKG_LINE_INFO, - target_installed_bin_dir != parsed.settings.end(), - "The --installed-bin-dir setting is required."); - - const auto target_binary_path = fs.almost_canonical(target_binary->second, VCPKG_LINE_INFO); - AppLocalInvocation invocation(fs, + if (target_binary == parsed.settings.end()) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgOptionRequiresAValue, msg::option = OPTION_TARGET_BINARY); + } + + const auto target_installed_bin_setting = parsed.settings.find(OPTION_INSTALLED_DIR); + if (target_installed_bin_setting == parsed.settings.end()) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgOptionRequiresAValue, msg::option = OPTION_INSTALLED_DIR); + } + + const auto target_installed_bin_dir = + real_filesystem.almost_canonical(target_installed_bin_setting->second, VCPKG_LINE_INFO); + const auto target_binary_path = real_filesystem.almost_canonical(target_binary->second, VCPKG_LINE_INFO); + const auto decoded = decode_from_canonical_bin_dir(target_installed_bin_dir); + AppLocalInvocation invocation(real_filesystem, target_binary_path.parent_path(), - target_installed_bin_dir->second, - maybe_create_log(parsed.settings, OPTION_TLOG_FILE, fs), - maybe_create_log(parsed.settings, OPTION_COPIED_FILES_LOG, fs)); + target_installed_bin_dir, + decoded.installed_root, + decoded.is_debug, + maybe_create_log(parsed.settings, OPTION_TLOG_FILE, real_filesystem), + maybe_create_log(parsed.settings, OPTION_COPIED_FILES_LOG, real_filesystem)); invocation.resolve(target_binary_path); Checks::exit_success(VCPKG_LINE_INFO); } -} -#endif +} // namespace vcpkg +#endif // ^^^ _WIN32 diff --git a/src/vcpkg/commands.z-ce.cpp b/src/vcpkg/commands.z-ce.cpp new file mode 100644 index 0000000000..ad76f518f8 --- /dev/null +++ b/src/vcpkg/commands.z-ce.cpp @@ -0,0 +1,26 @@ +#include + +#include +#include +#include + +namespace vcpkg +{ + constexpr CommandMetadata CommandZCEMetadata{ + "z-ce", + {/*intentionally undocumented*/}, + {}, + Undocumented, + AutocompletePriority::Never, + 0, + SIZE_MAX, + {}, + nullptr, + }; + + void command_z_ce_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + { + Checks::exit_with_code(VCPKG_LINE_INFO, + run_configure_environment_command(paths, args.get_forwardable_arguments())); + } +} diff --git a/src/vcpkg/commands.z-changelog.cpp b/src/vcpkg/commands.z-changelog.cpp new file mode 100644 index 0000000000..16f03b32e6 --- /dev/null +++ b/src/vcpkg/commands.z-changelog.cpp @@ -0,0 +1,121 @@ +#include +#include + +#include +#include +#include +#include + +#include +#include + +namespace vcpkg +{ + constexpr CommandMetadata CommandZChangelogMetadata{ + "z-changelog", + "Generate github.com/microsoft/vcpkg changelog", + {}, + Undocumented, + AutocompletePriority::Never, + 1, + 1, + {}, + nullptr, + }; + + void command_z_changelog_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + { + const auto parsed = args.parse_arguments(CommandZChangelogMetadata); + const StringView git_commit_id_for_previous_snapshot = parsed.command_arguments[0]; + const auto portsdiff = find_portsdiff(paths, git_commit_id_for_previous_snapshot, "HEAD"); + + std::string result; + result.append("vcpkg (FROM - TO)\n"); + result.append("---\n"); + auto total_port_count = paths.get_filesystem() + .get_directories_non_recursive(paths.builtin_ports_directory(), VCPKG_LINE_INFO) + .size(); + fmt::format_to(std::back_inserter(result), "#### Total port count: {}\n", total_port_count); + result.append("#### Total port count per triplet (tested): LINK\n"); + result.append("|triplet|ports available|\n"); + result.append("|---|---|\n"); + result.append("|x86-windows|Building...|\n"); + result.append("|**x64-windows**|Building...|\n"); + result.append("|x64-windows-static|Building...|\n"); + result.append("|x64-windows-static-md|Building...|\n"); + result.append("|x64-uwp|Building...|\n"); + result.append("|arm64-windows|Building...|\n"); + result.append("|arm64-uwp|Building...|\n"); + result.append("|**x64-osx**|Building...|\n"); + result.append("|**x64-linux**|Building...|\n"); + result.append("|arm-neon-android|Building...|\n"); + result.append("|x64-android|Building...|\n"); + result.append("|arm64-android|Building...|\n"); + result.append("\n"); + + result.append("The following vcpkg-tool releases have occurred since the last registry release:\n"); + result.append("* \n"); + result.append("\n"); + + result.append("In those tool releases, the following changes are particularly meaningful:\n"); + result.append("* \n"); + result.append("\n"); + + if (!portsdiff.added_ports.empty()) + { + result.append("
\n"); + fmt::format_to(std::back_inserter(result), + "The following {} ports have been added:\n\n", + portsdiff.added_ports.size()); + result.append("|port|version|\n"); + result.append("|---|---|\n"); + for (auto&& added_port : portsdiff.added_ports) + { + fmt::format_to(std::back_inserter(result), "|{}|{}|\n", added_port.port_name, added_port.version); + } + + result.append("
\n\n"); + } + + if (!portsdiff.updated_ports.empty()) + { + result.append("
\n"); + fmt::format_to(std::back_inserter(result), + "The following {} ports have been updated:\n\n", + portsdiff.added_ports.size()); + result.append("|port|original version|new version|\n"); + result.append("|---|---|---|\n"); + for (auto&& updated_port : portsdiff.updated_ports) + { + fmt::format_to(std::back_inserter(result), + "|{}|{}|{}|\n", + updated_port.port_name, + updated_port.version_diff.left, + updated_port.version_diff.right); + } + + result.append("
\n\n"); + } + + if (!portsdiff.removed_ports.empty()) + { + result.append("
\n"); + fmt::format_to(std::back_inserter(result), + "The following {} ports have been removed:\n\n", + portsdiff.removed_ports.size()); + result.append("|port|\n"); + result.append("|---|\n"); + for (auto&& removed_port : portsdiff.removed_ports) + { + fmt::format_to(std::back_inserter(result), "|{}|\n", removed_port); + } + + result.append("
\n\n"); + } + + result.append("#### New Contributors\n"); + + msg::write_unlocalized_text_to_stdout(Color::none, result); + Checks::exit_success(VCPKG_LINE_INFO); + } +} diff --git a/src/vcpkg/commands.z-extract.cpp b/src/vcpkg/commands.z-extract.cpp new file mode 100644 index 0000000000..8135cdb508 --- /dev/null +++ b/src/vcpkg/commands.z-extract.cpp @@ -0,0 +1,175 @@ +#include + +#include +#include + +#include +#include +#include +#include +#include + +using namespace vcpkg; + +namespace +{ + constexpr StringLiteral OPTION_STRIP = "strip"; + + constexpr CommandSetting EXTRACT_SETTINGS[] = { + {OPTION_STRIP, msgCmdZExtractOptStrip}, + }; +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandZExtractMetadata{ + "z-extract", + msgExtractHelp, + {msgCmdZExtractExample1, msgCmdZExtractExample2}, + Undocumented, + AutocompletePriority::Internal, + 2, + 3, + {{}, {EXTRACT_SETTINGS}}, + nullptr, + }; + + ExpectedL get_strip_setting(std::map> settings) + { + auto iter = settings.find(OPTION_STRIP); + if (iter == settings.end()) + { + // no strip option specified - default to manual strip 0 + return StripSetting{StripMode::Manual, 0}; + } + + std::string maybe_value = iter->second; + + if (Strings::case_insensitive_ascii_equals(maybe_value, "auto")) + { + return StripSetting{StripMode::Automatic, -1}; + } + + auto maybe_strip_value = Strings::strto(maybe_value); + if (auto value = maybe_strip_value.get(); value && *value >= 0) + { + return StripSetting{StripMode::Manual, *value}; + } + + // If the value is not an integer or is less than 0 + return msg::format_error(msgErrorInvalidExtractOption, msg::option = OPTION_STRIP, msg::value = maybe_value); + } + + constexpr IsSlash is_slash; + size_t get_common_directories_count(std::vector paths) + { + if (paths.size() == 0) + { + return 0; + } + + std::string known_common_prefix = paths[0].native(); + for (size_t idx = 1; idx < paths.size(); ++idx) + { + auto&& candidate = paths[idx].native(); + auto mismatch_point = std::mismatch(known_common_prefix.begin(), + known_common_prefix.end(), + + candidate.begin(), + candidate.end()) + .first; + known_common_prefix.erase(mismatch_point, known_common_prefix.end()); + } + + return std::count_if(known_common_prefix.begin(), known_common_prefix.end(), is_slash); + } + + std::vector> get_archive_deploy_operations(const ExtractedArchive& archive, + StripSetting strip_setting) + { + std::vector> result; + + const auto& temp_dir = archive.temp_path; + const auto& base_path = archive.base_path; + const auto& proximate = archive.proximate_to_temp; + + size_t strip_count = strip_setting.mode == StripMode::Automatic ? get_common_directories_count(proximate) + : static_cast(strip_setting.count); + + for (const auto& prox_path : proximate) + { + const auto& prox_str = prox_path.native(); + auto first = prox_str.data(); + auto last = first + prox_str.size(); + + // strip leading directories equivalent to the number specified + for (size_t i = 0; i < strip_count && first != last; ++i) + { + first = std::find_if(first, last, is_slash); + first = std::find_if_not(first, last, is_slash); + } + + if (first == last) + { + continue; + } + + result.emplace_back(temp_dir / prox_path, + base_path / std::string(first, static_cast(last - first))); + } + + return result; + } + + static void extract_and_strip( + const Filesystem& fs, const VcpkgPaths& paths, StripSetting strip_setting, Path archive_path, Path output_dir) + { + auto temp_dir = + extract_archive_to_temp_subdirectory(fs, paths.get_tool_cache(), null_sink, archive_path, output_dir); + + ExtractedArchive archive = { + temp_dir, output_dir, fs.get_regular_files_recursive_lexically_proximate(temp_dir, VCPKG_LINE_INFO)}; + + auto mapping = get_archive_deploy_operations(archive, strip_setting); + + for (const auto& file : mapping) + { + const auto& source = file.first; + const auto& destination = file.second; + + if (!fs.is_directory(destination.parent_path())) + { + fs.create_directories(destination.parent_path(), VCPKG_LINE_INFO); + } + + fs.rename(source, destination, VCPKG_LINE_INFO); + } + + fs.remove_all(temp_dir, VCPKG_LINE_INFO); + } + + void command_z_extract_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + { + auto& fs = paths.get_filesystem(); + auto parse_args = args.parse_arguments(CommandZExtractMetadata); + auto archive_path = Path{parse_args.command_arguments[0]}; + auto destination_path = Path{parse_args.command_arguments[1]}; + auto strip_setting = get_strip_setting(parse_args.settings).value_or_exit(VCPKG_LINE_INFO); + + if (!fs.is_directory(destination_path)) + { + fs.create_directories(destination_path, VCPKG_LINE_INFO); + } + + if (strip_setting.mode == StripMode::Manual && strip_setting.count == 0) + { + extract_archive(fs, paths.get_tool_cache(), null_sink, archive_path, destination_path); + } + else + { + extract_and_strip(fs, paths, strip_setting, archive_path, destination_path); + } + + Checks::exit_success(VCPKG_LINE_INFO); + } +} // namespace vcpkg diff --git a/src/vcpkg/commands.generate-message-map.cpp b/src/vcpkg/commands.z-generate-message-map.cpp similarity index 89% rename from src/vcpkg/commands.generate-message-map.cpp rename to src/vcpkg/commands.z-generate-message-map.cpp index f79dbff0d9..083c4b5f6a 100644 --- a/src/vcpkg/commands.generate-message-map.cpp +++ b/src/vcpkg/commands.z-generate-message-map.cpp @@ -4,21 +4,30 @@ #include #include -#include +#include -namespace vcpkg::Commands +using namespace vcpkg; + +namespace { - static constexpr StringLiteral OPTION_NO_OUTPUT_COMMENTS = "no-output-comments"; + constexpr StringLiteral OPTION_NO_OUTPUT_COMMENTS = "no-output-comments"; - static constexpr CommandSwitch GENERATE_MESSAGE_MAP_SWITCHES[]{ - {OPTION_NO_OUTPUT_COMMENTS, []() { return msg::format(msgCmdGenerateMessageMapOptNoOutputComments); }}, + constexpr CommandSwitch GENERATE_MESSAGE_MAP_SWITCHES[]{ + {OPTION_NO_OUTPUT_COMMENTS, msgCmdGenerateMessageMapOptNoOutputComments}, }; +} // unnamed namespace - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("x-generate-default-message-map locales/messages.json"); }, +namespace vcpkg +{ + constexpr CommandMetadata CommandZGenerateDefaultMessageMapMetadata{ + "z-generate-default-message-map", + {/*intentionally undocumented*/}, + {}, + Undocumented, + AutocompletePriority::Never, 2, 2, - {GENERATE_MESSAGE_MAP_SWITCHES, {}, {}}, + {GENERATE_MESSAGE_MAP_SWITCHES}, nullptr, }; @@ -124,9 +133,9 @@ namespace vcpkg::Commands return res; } - void GenerateDefaultMessageMapCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const + void command_z_generate_default_message_map_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs) { - auto parsed_args = args.parse_arguments(COMMAND_STRUCTURE); + auto parsed_args = args.parse_arguments(CommandZGenerateDefaultMessageMapMetadata); const bool output_comments = !Util::Sets::contains(parsed_args.switches, OPTION_NO_OUTPUT_COMMENTS); auto messages = msg::get_sorted_english_messages(); diff --git a/src/vcpkg/commands.zpreregistertelemetry.cpp b/src/vcpkg/commands.z-preregister-telemetry.cpp similarity index 71% rename from src/vcpkg/commands.zpreregistertelemetry.cpp rename to src/vcpkg/commands.z-preregister-telemetry.cpp index 3876e507f0..1b1ac30845 100644 --- a/src/vcpkg/commands.zpreregistertelemetry.cpp +++ b/src/vcpkg/commands.z-preregister-telemetry.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -29,15 +29,25 @@ namespace metrics.track_string(metric.metric, metric.preregister_value); } } -} +} // unnamed namespace -namespace vcpkg::Commands +namespace vcpkg { - void ZPreRegisterTelemetryCommand::perform_and_exit(const VcpkgCmdArguments& args, Filesystem& fs) const - { - (void)args; - (void)fs; + constexpr CommandMetadata CommandZPreregisterTelemetryMetadata{ + "z-preregister-telemetry", + {/*intentionally undocumented*/}, + {}, + Undocumented, + AutocompletePriority::Never, + 0, + 0, + {}, + nullptr, + }; + void command_z_preregister_telemetry_and_exit(const VcpkgCmdArguments& args, const Filesystem&) + { + (void)args.parse_arguments(CommandZPreregisterTelemetryMetadata); auto metrics_enabled = g_metrics_enabled.load(); if (metrics_enabled) { @@ -57,4 +67,4 @@ namespace vcpkg::Commands Checks::exit_success(VCPKG_LINE_INFO); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.zprintconfig.cpp b/src/vcpkg/commands.z-print-config.cpp similarity index 63% rename from src/vcpkg/commands.zprintconfig.cpp rename to src/vcpkg/commands.z-print-config.cpp index e446672a93..3d2aa4ab5e 100644 --- a/src/vcpkg/commands.zprintconfig.cpp +++ b/src/vcpkg/commands.z-print-config.cpp @@ -1,28 +1,46 @@ #include #include -#include +#include #include #include #include #include -namespace vcpkg::Commands::Z_PrintConfig +using namespace vcpkg; + +namespace { - static void opt_add(Json::Object& obj, StringLiteral key, const Optional& opt) + void opt_add(Json::Object& obj, StringLiteral key, const Optional& opt) { if (auto p = opt.get()) { obj.insert(key, p->native()); } } +} // unnamed namespace + +namespace vcpkg +{ + constexpr CommandMetadata CommandZPrintConfigMetadata{ + "z-print-config", + {/*intentionally undocumented*/}, + {}, + Undocumented, + AutocompletePriority::Never, + 0, + 0, + {}, + nullptr, + }; - void PrintConfigCommand::perform_and_exit(const VcpkgCmdArguments& args, - const VcpkgPaths& paths, - Triplet default_triplet, - Triplet host_triplet) const + void command_z_print_config_and_exit(const VcpkgCmdArguments& args, + const VcpkgPaths& paths, + Triplet default_triplet, + Triplet host_triplet) { + (void)args.parse_arguments(CommandZPrintConfigMetadata); Json::Object obj; obj.insert("downloads", paths.downloads.native()); obj.insert("default_triplet", default_triplet.canonical_name()); @@ -48,4 +66,4 @@ namespace vcpkg::Commands::Z_PrintConfig msg::write_unlocalized_text_to_stdout(Color::none, Json::stringify(obj) + "\n"); Checks::exit_success(VCPKG_LINE_INFO); } -} +} // namespace vcpkg diff --git a/src/vcpkg/commands.z-upload-metrics.cpp b/src/vcpkg/commands.z-upload-metrics.cpp new file mode 100644 index 0000000000..21dcbd1ab5 --- /dev/null +++ b/src/vcpkg/commands.z-upload-metrics.cpp @@ -0,0 +1,33 @@ +#include + +#if defined(_WIN32) +#include +#include + +#include +#include + +namespace vcpkg +{ + constexpr CommandMetadata CommandZUploadMetricsMetadata{ + "z-upload-metrics", + {/*intentionally undocumented*/}, + {}, + Undocumented, + AutocompletePriority::Never, + 1, + 1, + {}, + nullptr, + }; + + void command_z_upload_metrics_and_exit(const VcpkgCmdArguments& args, const Filesystem& fs) + { + const auto parsed = args.parse_arguments(CommandZUploadMetricsMetadata); + const auto& payload_path = parsed.command_arguments[0]; + auto payload = fs.read_contents(payload_path, VCPKG_LINE_INFO); + winhttp_upload_metrics(payload); + Checks::exit_success(VCPKG_LINE_INFO); + } +} +#endif // defined(_WIN32) diff --git a/src/vcpkg/commands.zce.cpp b/src/vcpkg/commands.zce.cpp deleted file mode 100644 index 9928276d47..0000000000 --- a/src/vcpkg/commands.zce.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include - -#include -#include -#include - -namespace vcpkg::Commands -{ - void ZCeCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - Checks::exit_with_code(VCPKG_LINE_INFO, - run_configure_environment_command(paths, args.get_forwardable_arguments())); - } -} diff --git a/src/vcpkg/configuration.cpp b/src/vcpkg/configuration.cpp index fb97444667..b81a948c7a 100644 --- a/src/vcpkg/configuration.cpp +++ b/src/vcpkg/configuration.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -13,6 +14,44 @@ namespace { using namespace vcpkg; + /// + /// Deserializes a list of package names and patterns along with their respective in-file declaration locations. + /// + struct PackagePatternDeserializer final : Json::IDeserializer + { + virtual LocalizedString type_name() const override; + virtual Optional visit_string(Json::Reader&, StringView sv) const override; + + static const PackagePatternDeserializer instance; + }; + + struct PackagePatternArrayDeserializer final : Json::ArrayDeserializer + { + virtual LocalizedString type_name() const override; + static const PackagePatternArrayDeserializer instance; + }; + LocalizedString PackagePatternDeserializer::type_name() const { return msg::format(msgAPackagePattern); } + + Optional PackagePatternDeserializer::visit_string(Json::Reader& r, StringView sv) const + { + if (!is_package_pattern(sv)) + { + r.add_generic_error( + type_name(), + msg::format(msgParsePackagePatternError, msg::package_name = sv, msg::url = docs::registries_url)); + } + + return PackagePatternDeclaration{ + sv.to_string(), + r.path(), + }; + } + + const PackagePatternDeserializer PackagePatternDeserializer::instance; + + LocalizedString PackagePatternArrayDeserializer::type_name() const { return msg::format(msgAPackagePatternArray); } + + const PackagePatternArrayDeserializer PackagePatternArrayDeserializer::instance; struct RegistryImplementationKindDeserializer : Json::StringDeserializer { LocalizedString type_name() const override { return msg::format(msgARegistryImplementationKind); } @@ -295,7 +334,7 @@ namespace { auto& declarations = config->package_declarations.emplace(); r.required_object_field( - type_name(), obj, PACKAGES, declarations, Json::PackagePatternArrayDeserializer::instance); + type_name(), obj, PACKAGES, declarations, PackagePatternArrayDeserializer::instance); config->packages.emplace(Util::fmap(declarations, [](auto&& decl) { return decl.pattern; })); } } @@ -494,8 +533,6 @@ namespace { StringView location; StringView registry; - - LocationAndRegistry() = default; }; // handle warnings from package pattern declarations @@ -506,12 +543,7 @@ namespace { for (auto&& pkg : *packages) { - auto it = patterns.find(pkg.pattern); - if (it == patterns.end()) - { - it = patterns.emplace(pkg.pattern, std::vector{}).first; - } - it->second.emplace_back(LocationAndRegistry{ + patterns[pkg.pattern].emplace_back(LocationAndRegistry{ pkg.location, reg.pretty_location(), }); @@ -1032,4 +1064,61 @@ namespace vcpkg find_unknown_fields_impl(config.ce_metadata, out, "$"); return out; } + + bool is_package_pattern(StringView sv) + { + if (Json::IdentifierDeserializer::is_ident(sv)) + { + return true; + } + + /*if (sv == "*") + { + return true; + }*/ + + // ([a-z0-9]+(-[a-z0-9]+)*)(\*?) + auto cur = sv.begin(); + const auto last = sv.end(); + for (;;) + { + // [a-z0-9]+ + if (cur == last) + { + return false; + } + + if (!ParserBase::is_lower_digit(*cur)) + { + if (*cur != '*') + { + return false; + } + + return ++cur == last; + } + + do + { + ++cur; + if (cur == last) + { + return true; + } + } while (ParserBase::is_lower_digit(*cur)); + + switch (*cur) + { + case '-': + // repeat outer [a-z0-9]+ again to match -[a-z0-9]+ + ++cur; + continue; + case '*': + // match last optional * + ++cur; + return cur == last; + default: return false; + } + } + } } diff --git a/src/vcpkg/configure-environment.cpp b/src/vcpkg/configure-environment.cpp index 6e27857bd8..0360d6a8af 100644 --- a/src/vcpkg/configure-environment.cpp +++ b/src/vcpkg/configure-environment.cpp @@ -2,11 +2,13 @@ #include #include +#include #include #include #include #include #include +#include #include #include @@ -16,57 +18,11 @@ #include #include -#if defined(VCPKG_CE_SHA) -#define VCPKG_CE_SHA_AS_STRING MACRO_TO_STRING(VCPKG_CE_SHA) -#endif // ^^^ VCPKG_CE_SHA -#include +using namespace vcpkg; namespace { - using namespace vcpkg; -#if !defined(VCPKG_ARTIFACTS_PATH) - void extract_ce_tarball(const VcpkgPaths& paths, - const Path& ce_tarball, - const Path& node_path, - const Path& ce_base_path) - { - auto& fs = paths.get_filesystem(); - if (!fs.is_regular_file(ce_tarball)) - { - Debug::println("Download succeeded but file isn't present?"); - Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgFailedToProvisionCe); - } - - fs.remove_all(ce_base_path, VCPKG_LINE_INFO); - fs.create_directories(ce_base_path, VCPKG_LINE_INFO); - Path node_root = node_path.parent_path(); - auto npm_path = node_root / "node_modules" / "npm" / "bin" / "npm-cli.js"; - if (!fs.exists(npm_path, VCPKG_LINE_INFO)) - { - npm_path = Path(node_root.parent_path()) / "lib" / "node_modules" / "npm" / "bin" / "npm-cli.js"; - } - - Command cmd_provision(node_path); - cmd_provision.string_arg(npm_path); - cmd_provision.string_arg("--force"); - cmd_provision.string_arg("install"); - cmd_provision.string_arg("--no-save"); - cmd_provision.string_arg("--no-lockfile"); - cmd_provision.string_arg("--scripts-prepend-node-path=true"); - cmd_provision.string_arg("--silent"); - cmd_provision.string_arg(ce_tarball); - auto env = get_modified_clean_environment({}, node_root); - const auto provision_status = cmd_execute(cmd_provision, WorkingDirectory{ce_base_path}, env); - fs.remove(ce_tarball, VCPKG_LINE_INFO); - if (!succeeded(provision_status)) - { - fs.remove_all(ce_base_path, VCPKG_LINE_INFO); - Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgFailedToProvisionCe); - } - } -#endif // ^^^ !defined(VCPKG_ARTIFACTS_PATH) - - void track_telemetry(Filesystem& fs, const Path& telemetry_file_path) + void track_telemetry(const Filesystem& fs, const Path& telemetry_file_path) { std::error_code ec; auto telemetry_file = fs.read_contents(telemetry_file_path, ec); @@ -115,57 +71,122 @@ namespace Debug::println("No artifacts activated."); } } -} + + constexpr const StringLiteral* ArtifactOperatingSystemsSwitchNamesStorage[] = { + &SWITCH_WINDOWS, &SWITCH_OSX, &SWITCH_LINUX, &SWITCH_FREEBSD}; + constexpr const StringLiteral* ArtifactHostPlatformSwitchNamesStorage[] = { + &SWITCH_X86, &SWITCH_X64, &SWITCH_ARM, &SWITCH_ARM64}; + constexpr const StringLiteral* ArtifactTargetPlatformSwitchNamesStorage[] = { + &SWITCH_TARGET_X86, &SWITCH_TARGET_X64, &SWITCH_TARGET_ARM, &SWITCH_TARGET_ARM64}; + + bool more_than_one_mapped(View candidates, const std::set>& switches) + { + bool seen = false; + for (auto&& candidate : candidates) + { + if (Util::Sets::contains(switches, *candidate)) + { + if (seen) + { + return true; + } + + seen = true; + } + } + + return false; + } +} // unnamed namespace namespace vcpkg { + ExpectedL download_vcpkg_standalone_bundle(const DownloadManager& download_manager, + const Filesystem& fs, + const Path& download_root) + { +#if defined(VCPKG_STANDALONE_BUNDLE_SHA) + const auto bundle_tarball = download_root / "vcpkg-standalone-bundle-" VCPKG_BASE_VERSION_AS_STRING ".tar.gz"; + msg::println(msgDownloadingVcpkgStandaloneBundle, msg::version = VCPKG_BASE_VERSION_AS_STRING); + const auto bundle_uri = + "https://github.com/microsoft/vcpkg-tool/releases/download/" VCPKG_BASE_VERSION_AS_STRING + "/vcpkg-standalone-bundle.tar.gz"; + download_manager.download_file( + fs, bundle_uri, {}, bundle_tarball, MACRO_TO_STRING(VCPKG_STANDALONE_BUNDLE_SHA), null_sink); +#else // ^^^ VCPKG_STANDALONE_BUNDLE_SHA / !VCPKG_STANDALONE_BUNDLE_SHA vvv + const auto bundle_tarball = download_root / "vcpkg-standalone-bundle-latest.tar.gz"; + msg::println(Color::warning, msgDownloadingVcpkgStandaloneBundleLatest); + fs.remove(bundle_tarball, VCPKG_LINE_INFO); + const auto bundle_uri = + "https://github.com/microsoft/vcpkg-tool/releases/latest/download/vcpkg-standalone-bundle.tar.gz"; + download_manager.download_file(fs, bundle_uri, {}, bundle_tarball, nullopt, null_sink); +#endif // ^^^ !VCPKG_STANDALONE_BUNDLE_SHA + return bundle_tarball; + } + int run_configure_environment_command(const VcpkgPaths& paths, View args) { msg::println_warning(msgVcpkgCeIsExperimental); auto& fs = paths.get_filesystem(); - auto& download_manager = paths.get_download_manager(); - auto node_path = paths.get_tool_exe(Tools::NODE, stdout_sink); -#if defined(VCPKG_ARTIFACTS_PATH) - // use hard coded in-source copy - (void)fs; - (void)download_manager; - Path ce_path = MACRO_TO_STRING(VCPKG_ARTIFACTS_PATH); - // development support: intentionally unlocalized - msg::println(Color::warning, - LocalizedString::from_raw("Using in-development vcpkg-artifacts built at: ").append_raw(ce_path)); -#else // ^^^ VCPKG_ARTIFACTS_PATH / might need to download vvv -#if defined(VCPKG_CE_SHA) - auto base_path = - get_platform_cache_vcpkg().value_or_exit(VCPKG_LINE_INFO) / "artifacts-" VCPKG_BASE_VERSION_AS_STRING; - Debug::println("vcpkg-artifacts base path: ", base_path); - auto ce_path = base_path / "node_modules" / "vcpkg-ce"; - bool needs_provisioning = !fs.is_directory(ce_path); - if (needs_provisioning) - { - msg::println(msgDownloadingVcpkgCeBundle, msg::version = VCPKG_BASE_VERSION_AS_STRING); - const auto ce_uri = - "https://github.com/microsoft/vcpkg-tool/releases/download/" VCPKG_BASE_VERSION_AS_STRING - "/vcpkg-ce.tgz"; - const auto ce_tarball = paths.downloads / "vcpkg-ce-" VCPKG_BASE_VERSION_AS_STRING ".tgz"; - download_manager.download_file(fs, ce_uri, {}, ce_tarball, VCPKG_CE_SHA_AS_STRING, null_sink); - extract_ce_tarball(paths, ce_tarball, node_path, base_path); - } -#else // ^^^ VCPKG_CE_SHA (official build) // always get latest vvv - auto base_path = get_platform_cache_vcpkg().value_or_exit(VCPKG_LINE_INFO) / "artifacts-latest"; - Debug::println("vcpkg-artifacts base path: ", base_path); - auto ce_path = base_path / "node_modules" / "vcpkg-ce"; - msg::println(Color::warning, msgDownloadingVcpkgCeBundleLatest); - const auto ce_uri = "https://github.com/microsoft/vcpkg-tool/releases/latest/download/vcpkg-ce.tgz"; - const auto ce_tarball = paths.downloads / "vcpkg-ce-latest.tgz"; - download_manager.download_file(fs, ce_uri, {}, ce_tarball, nullopt, null_sink); - extract_ce_tarball(paths, ce_tarball, node_path, base_path); -#endif // ^^^ always get latest -#endif // ^^^ might need to download + + // if artifacts is deployed in development, with Visual Studio, or with the One Liner, it will be deployed here + Path vcpkg_artifacts_path = get_exe_path_of_current_process(); + vcpkg_artifacts_path.replace_filename("vcpkg-artifacts"); + vcpkg_artifacts_path.make_preferred(); + Path vcpkg_artifacts_main_path = vcpkg_artifacts_path / "main.js"; + // Official / Development / None + // cross with + // Git / OneLiner / VS + // + // Official Git: Check for matching version number, use if set + // Development Git: Use development copy + // None Git: Use latest copy, download every time + if (paths.try_provision_vcpkg_artifacts()) + { +#if defined(VCPKG_STANDALONE_BUNDLE_SHA) + Path vcpkg_artifacts_version_path = vcpkg_artifacts_path / "version.txt"; + bool out_of_date = fs.check_update_required(vcpkg_artifacts_version_path, VCPKG_BASE_VERSION_AS_STRING) + .value_or_exit(VCPKG_LINE_INFO); +#else // ^^^ VCPKG_STANDALONE_BUNDLE_SHA / !VCPKG_STANDALONE_BUNDLE_SHA vvv + bool out_of_date = !fs.exists(vcpkg_artifacts_path / "artifacts-development.txt", VCPKG_LINE_INFO); +#endif // ^^^ !VCPKG_STANDALONE_BUNDLE_SHA + if (out_of_date) + { + fs.remove_all(vcpkg_artifacts_path, VCPKG_LINE_INFO); + auto temp = get_exe_path_of_current_process(); + temp.replace_filename("vcpkg-artifacts-temp"); + auto tarball = download_vcpkg_standalone_bundle(paths.get_download_manager(), fs, paths.downloads) + .value_or_exit(VCPKG_LINE_INFO); + set_directory_to_archive_contents(fs, paths.get_tool_cache(), null_sink, tarball, temp); + fs.rename_with_retry(temp / "vcpkg-artifacts", vcpkg_artifacts_path, VCPKG_LINE_INFO); + fs.remove(tarball, VCPKG_LINE_INFO); + fs.remove_all(temp, VCPKG_LINE_INFO); +#if defined(VCPKG_STANDALONE_BUNDLE_SHA) + fs.write_contents(vcpkg_artifacts_version_path, VCPKG_BASE_VERSION_AS_STRING, VCPKG_LINE_INFO); +#endif // ^^^ VCPKG_STANDALONE_BUNDLE_SHA + } + + if (!fs.exists(vcpkg_artifacts_main_path, VCPKG_LINE_INFO)) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgArtifactsBootstrapFailed); + } + } + else if (!fs.exists(vcpkg_artifacts_path, VCPKG_LINE_INFO)) + { + // Official OneLiner: Do nothing, should be handled by z-boostrap-standalone + // Development OneLiner: (N/A) + // None OneLiner: (N/A) + // + // Official VS: Do nothing, should be bundled by VS + // Development VS: (N/A) + // None VS: (N/A) + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgArtifactsNotInstalledReadonlyRoot); + } auto temp_directory = fs.create_or_get_temp_directory(VCPKG_LINE_INFO); - Command cmd_run(node_path); - cmd_run.string_arg(ce_path); + Command cmd_run(paths.get_tool_exe(Tools::NODE, stdout_sink)); + cmd_run.string_arg(vcpkg_artifacts_main_path); cmd_run.forwarded_args(args); if (Debug::g_debugging) { @@ -204,15 +225,42 @@ namespace vcpkg track_telemetry(fs, *telemetry_file_path); } + // workaround some systems which only keep the lower 7 bits + if (result < 0 || result > 127) + { + result = 1; + } + return result; } - int run_configure_environment_command(const VcpkgPaths& paths, StringView arg0, View args) + void forward_common_artifacts_arguments(std::vector& appended_to, const ParsedArguments& parsed) { - std::vector all_args; - all_args.reserve(args.size() + 1); - all_args.emplace_back(arg0.data(), arg0.size()); - all_args.insert(all_args.end(), args.begin(), args.end()); - return run_configure_environment_command(paths, all_args); + auto&& switches = parsed.switches; + for (auto&& parsed_switch : switches) + { + appended_to.push_back(fmt::format("--{}", parsed_switch)); + } + + if (more_than_one_mapped(ArtifactOperatingSystemsSwitchNamesStorage, parsed.switches)) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgArtifactsSwitchOnlyOneOperatingSystem); + } + + if (more_than_one_mapped(ArtifactHostPlatformSwitchNamesStorage, parsed.switches)) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgArtifactsSwitchOnlyOneHostPlatform); + } + + if (more_than_one_mapped(ArtifactTargetPlatformSwitchNamesStorage, parsed.switches)) + { + Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgArtifactsSwitchOnlyOneTargetPlatform); + } + + for (auto&& parsed_option : parsed.settings) + { + appended_to.push_back(fmt::format("--{}", parsed_option.first)); + appended_to.push_back(parsed_option.second); + } } -} +} // namespace vcpkg diff --git a/src/vcpkg/dependencies.cpp b/src/vcpkg/dependencies.cpp index b5fd097848..fa7fccd69c 100644 --- a/src/vcpkg/dependencies.cpp +++ b/src/vcpkg/dependencies.cpp @@ -1,10 +1,12 @@ #include #include +#include #include #include #include #include +#include #include #include #include @@ -13,6 +15,9 @@ #include #include +#include +#include + namespace vcpkg { namespace @@ -43,6 +48,8 @@ namespace vcpkg std::map> build_edges; std::map> version_constraints; bool defaults_requested = false; + std::vector default_features; + bool reduced_defaults = false; }; /// @@ -66,7 +73,7 @@ namespace vcpkg { if (const ClusterInstalled* inst = m_installed.get()) { - return inst->original_features.find(feature) != inst->original_features.end(); + return Util::Sets::contains(inst->original_features, feature); } return false; } @@ -78,8 +85,7 @@ namespace vcpkg return std::all_of(inst->ipv.core->package.default_features.begin(), inst->ipv.core->package.default_features.end(), [&](const std::string& feature) { - return inst->original_features.find(feature) != - inst->original_features.end(); + return Util::Sets::contains(inst->original_features, feature); }); } return false; @@ -99,9 +105,59 @@ namespace vcpkg { if (!info.defaults_requested) { - info.defaults_requested = true; - for (auto&& f : scfl.source_control_file->core_paragraph->default_features) - out_new_dependencies.emplace_back(m_spec, f); + if (Util::any_of(scfl.source_control_file->core_paragraph->default_features, + [](const auto& feature) { return !feature.platform.is_empty(); })) + { + if (auto maybe_vars = var_provider.get_dep_info_vars(m_spec)) + { + info.defaults_requested = true; + for (auto&& f : scfl.source_control_file->core_paragraph->default_features) + { + if (f.platform.evaluate(maybe_vars.value_or_exit(VCPKG_LINE_INFO))) + { + info.default_features.push_back(f.name); + } + } + } + } + else + { + info.defaults_requested = true; + for (auto&& f : scfl.source_control_file->core_paragraph->default_features) + info.default_features.push_back(f.name); + } + + if (info.reduced_defaults) + { + info.reduced_defaults = false; + // If the user did not explicitly request this installation, we need to add all new default + // features + std::set defaults_set{info.default_features.begin(), + info.default_features.end()}; + + // Install only features that were not previously available + if (auto p_inst = m_installed.get()) + { + for (auto&& prev_default : p_inst->ipv.core->package.default_features) + { + defaults_set.erase(prev_default); + } + } + + for (const std::string& default_feature : defaults_set) + { + // Instead of dealing with adding default features to each of our dependencies right + // away we just defer to the next pass of the loop. + out_new_dependencies.emplace_back(m_spec, default_feature); + } + } + else + { + for (auto&& default_feature : std::move(info.default_features)) + { + out_new_dependencies.emplace_back(m_spec, std::move(default_feature)); + } + } } return; } @@ -131,7 +187,16 @@ namespace vcpkg { if (dep.platform.evaluate(*vars)) { - auto fullspec = dep.to_full_spec(m_spec.triplet(), host_triplet, ImplicitDefault::YES); + std::vector features; + features.reserve(dep.features.size()); + for (const auto& f : dep.features) + { + if (f.platform.evaluate(*vars)) + { + features.push_back(f.name); + } + } + auto fullspec = dep.to_full_spec(features, m_spec.triplet(), host_triplet); fullspec.expand_fspecs_to(dep_list); if (auto opt = dep.constraint.try_get_minimum_version()) { @@ -149,9 +214,12 @@ namespace vcpkg bool requires_qualified_resolution = false; for (const Dependency& dep : *qualified_deps) { - if (dep.platform.is_empty()) + if (!dep.has_platform_expressions()) { - auto fullspec = dep.to_full_spec(m_spec.triplet(), host_triplet, ImplicitDefault::YES); + auto fullspec = + dep.to_full_spec(Util::fmap(dep.features, [](const auto& f) { return f.name; }), + m_spec.triplet(), + host_triplet); fullspec.expand_fspecs_to(dep_list); if (auto opt = dep.constraint.try_get_minimum_version()) { @@ -199,30 +267,12 @@ namespace vcpkg if (defaults_requested) { - for (auto&& def_feature : get_scfl_or_exit().source_control_file->core_paragraph->default_features) - out_reinstall_requirements.emplace_back(m_spec, def_feature); + out_reinstall_requirements.emplace_back(m_spec, "default"); } else if (request_type != RequestType::USER_REQUESTED) { - // If the user did not explicitly request this installation, we need to add all new default features - auto&& new_defaults = get_scfl_or_exit().source_control_file->core_paragraph->default_features; - std::set defaults_set{new_defaults.begin(), new_defaults.end()}; - - // Install only features that were not previously available - if (auto p_inst = m_installed.get()) - { - for (auto&& prev_default : p_inst->ipv.core->package.default_features) - { - defaults_set.erase(prev_default); - } - } - - for (const std::string& feature : defaults_set) - { - // Instead of dealing with adding default features to each of our dependencies right - // away we just defer to the next pass of the loop. - out_reinstall_requirements.emplace_back(m_spec, feature); - } + out_reinstall_requirements.emplace_back(m_spec, "default"); + m_install_info.get()->reduced_defaults = true; } } @@ -288,7 +338,8 @@ namespace vcpkg PackageGraph(const PortFileProvider& provider, const CMakeVars::CMakeVarProvider& var_provider, const StatusParagraphs& status_db, - Triplet host_triplet); + Triplet host_triplet, + const Path& packages_dir); ~PackageGraph() = default; void install(Span specs, UnsupportedPortAction unsupported_port_action); @@ -302,6 +353,7 @@ namespace vcpkg const CMakeVars::CMakeVarProvider& m_var_provider; std::unique_ptr m_graph; + Path m_packages_dir; std::map m_unsupported_features; }; @@ -380,115 +432,108 @@ namespace vcpkg }; } - static std::string to_output_string(RequestType request_type, - const ZStringView s, - const BuildPackageOptions& options, - const SourceControlFileAndLocation* scfl, - const InstalledPackageView* ipv, - const Path& builtin_ports_dir) + static void format_plan_row(LocalizedString& out, const InstallPlanAction& action, const Path& builtin_ports_dir) { - std::string ret; - switch (request_type) - { - case RequestType::AUTO_SELECTED: Strings::append(ret, " * "); break; - case RequestType::USER_REQUESTED: Strings::append(ret, " "); break; - default: Checks::unreachable(VCPKG_LINE_INFO); - } - Strings::append(ret, s); - if (scfl) - { - Strings::append(ret, " -> ", scfl->to_version()); - } - else if (ipv) - { - Strings::append(ret, " -> ", Version{ipv->core->package.version, ipv->core->package.port_version}); - } - if (options.use_head_version == UseHeadVersion::YES) + out.append_raw(request_type_indent(action.request_type)) + .append_raw(action.displayname()) + .append_raw(" -> ") + .append_raw(action.version()); + if (action.build_options.use_head_version == UseHeadVersion::YES) { - Strings::append(ret, " (+HEAD)"); + out.append_raw(" (+HEAD)"); } - if (scfl) + if (auto scfl = action.source_control_file_and_location.get()) { if (!builtin_ports_dir.empty() && !Strings::case_insensitive_ascii_starts_with(scfl->source_location, builtin_ports_dir)) { - Strings::append(ret, " -- ", scfl->source_location); + out.append_raw(" -- ").append_raw(scfl->source_location); } } - return ret; } - std::string to_output_string(RequestType request_type, const ZStringView s, const BuildPackageOptions& options) + StringLiteral request_type_indent(RequestType request_type) + { + switch (request_type) + { + case RequestType::AUTO_SELECTED: return " * "; + case RequestType::USER_REQUESTED: return " "; + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + bool BasicAction::compare_by_name(const BasicAction* left, const BasicAction* right) { - return to_output_string(request_type, s, options, {}, {}, {}); + return left->spec.name() < right->spec.name(); + } + + std::string PackageAction::displayname() const + { + if (this->feature_list.empty_or_only_core()) + { + return this->spec.to_string(); + } + + const std::string features = Strings::join(",", feature_list); + return fmt::format("{}[{}]:{}", this->spec.name(), features, this->spec.triplet()); } - std::string to_output_string(RequestType request_type, const ZStringView s) + static std::vector fdeps_to_pdeps(const PackageSpec& self, + const std::map>& dependencies) { - return to_output_string(request_type, s, {}, {}, {}, {}); + std::set specs; + for (auto&& p : dependencies) + { + for (auto&& q : p.second) + { + specs.insert(q.spec()); + } + } + specs.erase(self); + return {specs.begin(), specs.end()}; } - InstallPlanAction::InstallPlanAction() noexcept - : plan_type(InstallPlanType::UNKNOWN), request_type(RequestType::UNKNOWN), build_options{} + static InternalFeatureSet fdeps_to_feature_list(const std::map>& fdeps) { + InternalFeatureSet ret; + for (auto&& d : fdeps) + { + ret.push_back(d.first); + } + return ret; } InstallPlanAction::InstallPlanAction(const PackageSpec& spec, const SourceControlFileAndLocation& scfl, + const Path& packages_dir, const RequestType& request_type, Triplet host_triplet, std::map>&& dependencies, - std::vector&& build_failure_messages) - : spec(spec) + std::vector&& build_failure_messages, + std::vector default_features) + : PackageAction{{spec}, fdeps_to_pdeps(spec, dependencies), fdeps_to_feature_list(dependencies)} , source_control_file_and_location(scfl) + , default_features(std::move(default_features)) , plan_type(InstallPlanType::BUILD_AND_INSTALL) , request_type(request_type) , build_options{} , feature_dependencies(std::move(dependencies)) , build_failure_messages(std::move(build_failure_messages)) , host_triplet(host_triplet) + , package_dir(packages_dir / spec.dir()) { - for (const auto& kv : feature_dependencies) - { - feature_list.emplace_back(kv.first); - for (const FeatureSpec& fspec : kv.second) - { - if (spec != fspec.spec()) - { - package_dependencies.emplace_back(fspec.spec()); - } - } - } - - Util::sort_unique_erase(package_dependencies); - Util::sort_unique_erase(feature_list); } InstallPlanAction::InstallPlanAction(InstalledPackageView&& ipv, const RequestType& request_type) - : spec(ipv.spec()) + : PackageAction{{ipv.spec()}, ipv.dependencies(), ipv.feature_list()} , installed_package(std::move(ipv)) , plan_type(InstallPlanType::ALREADY_INSTALLED) , request_type(request_type) , build_options{} , feature_dependencies(installed_package.get()->feature_dependencies()) - , package_dependencies(installed_package.get()->dependencies()) { - for (const auto& kv : feature_dependencies) - { - feature_list.emplace_back(kv.first); - } } - std::string InstallPlanAction::displayname() const - { - if (this->feature_list.empty()) - { - return this->spec.to_string(); - } - - const std::string features = Strings::join(",", feature_list); - return fmt::format("{}[{}]:{}", this->spec.name(), features, this->spec.triplet()); - } const std::string& InstallPlanAction::public_abi() const { switch (plan_type) @@ -521,26 +566,30 @@ namespace vcpkg { return *abi_info.value_or_exit(li).pre_build_info; } - - bool InstallPlanAction::compare_by_name(const InstallPlanAction* left, const InstallPlanAction* right) + Version InstallPlanAction::version() const { - return left->spec.name() < right->spec.name(); + if (auto scfl = source_control_file_and_location.get()) + { + return scfl->to_version(); + } + else if (auto ipv = installed_package.get()) + { + return ipv->version(); + } + else + { + Checks::unreachable(VCPKG_LINE_INFO); + } } - RemovePlanAction::RemovePlanAction() noexcept - : plan_type(RemovePlanType::UNKNOWN), request_type(RequestType::UNKNOWN) - { - } + NotInstalledAction::NotInstalledAction(const PackageSpec& spec) : BasicAction{spec} { } - RemovePlanAction::RemovePlanAction(const PackageSpec& spec, - const RemovePlanType& plan_type, - const RequestType& request_type) - : spec(spec), plan_type(plan_type), request_type(request_type) + RemovePlanAction::RemovePlanAction(const PackageSpec& spec, RequestType request_type) + : BasicAction{spec}, request_type(request_type) { } - template - static LocalizedString create_unsupported_message(Message m, + static LocalizedString create_unsupported_message(decltype(msgUnsupportedFeatureSupportsExpression) m, const FeatureSpec& spec, const PlatformExpression::Expr& expr) { @@ -567,28 +616,18 @@ namespace vcpkg } } - bool ExportPlanAction::compare_by_name(const ExportPlanAction* left, const ExportPlanAction* right) - { - return left->spec.name() < right->spec.name(); - } - - ExportPlanAction::ExportPlanAction() noexcept - : plan_type(ExportPlanType::UNKNOWN), request_type(RequestType::UNKNOWN) - { - } - ExportPlanAction::ExportPlanAction(const PackageSpec& spec, InstalledPackageView&& installed_package, - const RequestType& request_type) - : spec(spec) + RequestType request_type) + : BasicAction{spec} , plan_type(ExportPlanType::ALREADY_BUILT) , request_type(request_type) , m_installed_package(std::move(installed_package)) { } - ExportPlanAction::ExportPlanAction(const PackageSpec& spec, const RequestType& request_type) - : spec(spec), plan_type(ExportPlanType::NOT_BUILT), request_type(request_type) + ExportPlanAction::ExportPlanAction(const PackageSpec& spec, RequestType request_type) + : BasicAction{spec}, plan_type(ExportPlanType::NOT_BUILT), request_type(request_type) { } @@ -609,67 +648,62 @@ namespace vcpkg return {}; } - bool RemovePlanAction::compare_by_name(const RemovePlanAction* left, const RemovePlanAction* right) + bool RemovePlan::empty() const { return not_installed.empty() && remove.empty(); } + + bool RemovePlan::has_non_user_requested() const { - return left->spec.name() < right->spec.name(); + constexpr struct + { + bool operator()(const RemovePlanAction& a) const { return a.request_type != RequestType::USER_REQUESTED; } + } non_user_requested; + + return Util::find_if(remove, non_user_requested) != remove.end(); } - std::vector create_remove_plan(const std::vector& specs, - const StatusParagraphs& status_db) + RemovePlan create_remove_plan(const std::vector& specs, const StatusParagraphs& status_db) { - struct RemoveAdjacencyProvider final : AdjacencyProvider + struct RemoveAdjacencyProvider final : AdjacencyProvider { - const StatusParagraphs& status_db; - const std::vector& installed_ports; - const std::unordered_set& specs_as_set; + std::unordered_map> rev_edges; - RemoveAdjacencyProvider(const StatusParagraphs& status_db, - const std::vector& installed_ports, - const std::unordered_set& specs_as_set) - : status_db(status_db), installed_ports(installed_ports), specs_as_set(specs_as_set) + std::vector adjacency_list(const PackageSpec& spec) const override { + return Util::copy_or_default(rev_edges, spec); } - std::vector adjacency_list(const RemovePlanAction& plan) const override - { - if (plan.plan_type == RemovePlanType::NOT_INSTALLED) - { - return {}; - } - - const PackageSpec& spec = plan.spec; - std::vector dependents; - for (auto&& ipv : installed_ports) - { - auto deps = ipv.dependencies(); - - if (std::find(deps.begin(), deps.end(), spec) == deps.end()) continue; + PackageSpec load_vertex_data(const PackageSpec& s) const override { return s; } - dependents.push_back(ipv.spec()); - } + std::string to_string(const PackageSpec& spec) const override { return spec.to_string(); } + }; - return dependents; + RemoveAdjacencyProvider p; + for (auto&& a : get_installed_ports(status_db)) + { + p.rev_edges.emplace(a.spec(), std::initializer_list{}); + for (auto&& b : a.dependencies()) + { + p.rev_edges[b].push_back(a.spec()); } + } + auto remove_order = topological_sort(specs, p, nullptr); - RemovePlanAction load_vertex_data(const PackageSpec& spec) const override + const std::unordered_set requested(specs.cbegin(), specs.cend()); + RemovePlan plan; + for (auto&& step : remove_order) + { + if (p.rev_edges.find(step) != p.rev_edges.end()) { - const RequestType request_type = specs_as_set.find(spec) != specs_as_set.end() - ? RequestType::USER_REQUESTED - : RequestType::AUTO_SELECTED; - const StatusParagraphs::const_iterator it = status_db.find_installed(spec); - if (it == status_db.end()) - { - return RemovePlanAction{spec, RemovePlanType::NOT_INSTALLED, request_type}; - } - return RemovePlanAction{spec, RemovePlanType::REMOVE, request_type}; + // installed + plan.remove.emplace_back(step, + Util::Sets::contains(requested, step) ? RequestType::USER_REQUESTED + : RequestType::AUTO_SELECTED); } - - std::string to_string(const PackageSpec& spec) const override { return spec.to_string(); } - }; - - auto installed_ports = get_installed_ports(status_db); - const std::unordered_set specs_as_set(specs.cbegin(), specs.cend()); - return topological_sort(specs, RemoveAdjacencyProvider{status_db, installed_ports, specs_as_set}, {}); + else + { + plan.not_installed.emplace_back(step); + } + } + return plan; } std::vector create_export_plan(const std::vector& specs, @@ -692,9 +726,8 @@ namespace vcpkg ExportPlanAction load_vertex_data(const PackageSpec& spec) const override { - const RequestType request_type = specs_as_set.find(spec) != specs_as_set.end() - ? RequestType::USER_REQUESTED - : RequestType::AUTO_SELECTED; + const RequestType request_type = + Util::Sets::contains(specs_as_set, spec) ? RequestType::USER_REQUESTED : RequestType::AUTO_SELECTED; auto maybe_ipv = status_db.get_installed_package_view(spec); @@ -726,7 +759,7 @@ namespace vcpkg const StatusParagraphs& status_db, const CreateInstallPlanOptions& options) { - PackageGraph pgraph(port_provider, var_provider, status_db, options.host_triplet); + PackageGraph pgraph(port_provider, var_provider, status_db, options.host_triplet, options.packages_dir); std::vector feature_specs; for (const FullPackageSpec& spec : specs) @@ -738,9 +771,7 @@ namespace vcpkg pgraph.install(feature_specs, options.unsupported_port_action); - auto res = pgraph.serialize(options.randomizer); - - return res; + return pgraph.serialize(options.randomizer); } void PackageGraph::mark_for_reinstall(const PackageSpec& first_remove_spec, @@ -814,6 +845,9 @@ namespace vcpkg } else if (spec.feature() == "default") { + has_supports = Util::any_of( + clust.get_scfl_or_exit().source_control_file->core_paragraph->default_features, + [](const DependencyRequestedFeature& feature) { return !feature.platform.is_empty(); }); } else { @@ -829,9 +863,10 @@ namespace vcpkg } // And it has at least one qualified dependency - if (has_supports || (paragraph_depends && Util::any_of(*paragraph_depends, [](auto&& dep) { - return !dep.platform.is_empty(); - }))) + if (has_supports || + (paragraph_depends && Util::any_of(*paragraph_depends, [](const Dependency& dep) { + return dep.has_platform_expressions(); + }))) { // Add it to the next batch run qualified_dependencies.emplace_back(spec); @@ -938,7 +973,7 @@ namespace vcpkg const StatusParagraphs& status_db, const CreateInstallPlanOptions& options) { - PackageGraph pgraph(port_provider, var_provider, status_db, options.host_triplet); + PackageGraph pgraph(port_provider, var_provider, status_db, options.host_triplet, options.packages_dir); pgraph.upgrade(specs, options.unsupported_port_action); @@ -1012,7 +1047,7 @@ namespace vcpkg for (auto&& p_cluster : remove_toposort) { - plan.remove_actions.emplace_back(p_cluster->m_spec, RemovePlanType::REMOVE, p_cluster->request_type); + plan.remove_actions.emplace_back(p_cluster->m_spec, p_cluster->request_type); } for (auto&& p_cluster : insert_toposort) @@ -1055,25 +1090,37 @@ namespace vcpkg fspecs.insert(fspec); continue; } + auto&& dep_clust = m_graph->get(fspec.spec()); const auto& default_features = [&] { if (dep_clust.m_install_info.has_value()) - return dep_clust.get_scfl_or_exit() - .source_control_file->core_paragraph->default_features; - if (auto p = dep_clust.m_installed.get()) return p->ipv.core->package.default_features; + { + return dep_clust.m_install_info.get()->default_features; + } + + if (auto p = dep_clust.m_installed.get()) + { + return p->ipv.core->package.default_features; + } + Checks::unreachable(VCPKG_LINE_INFO); }(); + for (auto&& default_feature : default_features) + { fspecs.emplace(fspec.spec(), default_feature); + } } computed_edges[kv.first].assign(fspecs.begin(), fspecs.end()); } plan.install_actions.emplace_back(p_cluster->m_spec, p_cluster->get_scfl_or_exit(), + m_packages_dir, p_cluster->request_type, m_graph->m_host_triplet, std::move(computed_edges), - std::move(constraint_violations)); + std::move(constraint_violations), + std::move(info_ptr->default_features)); } else if (p_cluster->request_type == RequestType::USER_REQUESTED && p_cluster->m_installed.has_value()) { @@ -1124,23 +1171,27 @@ namespace vcpkg PackageGraph::PackageGraph(const PortFileProvider& port_provider, const CMakeVars::CMakeVarProvider& var_provider, const StatusParagraphs& status_db, - Triplet host_triplet) - : m_var_provider(var_provider), m_graph(create_feature_install_graph(port_provider, status_db, host_triplet)) + Triplet host_triplet, + const Path& packages_dir) + : m_var_provider(var_provider) + , m_graph(create_feature_install_graph(port_provider, status_db, host_triplet)) + , m_packages_dir(packages_dir) { } - void print_plan(const ActionPlan& action_plan, const bool is_recursive, const Path& builtin_ports_dir) + FormattedPlan format_plan(const ActionPlan& action_plan, const Path& builtin_ports_dir) { + FormattedPlan ret; if (action_plan.remove_actions.empty() && action_plan.already_installed.empty() && action_plan.install_actions.empty()) { - msg::println(msgInstalledRequestedPackages); - return; + ret.text = msg::format(msgInstalledRequestedPackages); + ret.text.append_raw('\n'); + return ret; } std::set remove_specs; std::vector rebuilt_plans; - std::vector only_install_plans; std::vector new_plans; std::vector already_installed_plans; std::vector excluded; @@ -1172,78 +1223,74 @@ namespace vcpkg new_plans.push_back(&install_action); } } - for (auto&& action : action_plan.already_installed) - { - if (action.request_type == RequestType::USER_REQUESTED) already_installed_plans.emplace_back(&action); - } already_installed_plans = Util::fmap(action_plan.already_installed, [](auto&& action) { return &action; }); std::sort(rebuilt_plans.begin(), rebuilt_plans.end(), &InstallPlanAction::compare_by_name); - std::sort(only_install_plans.begin(), only_install_plans.end(), &InstallPlanAction::compare_by_name); std::sort(new_plans.begin(), new_plans.end(), &InstallPlanAction::compare_by_name); std::sort(already_installed_plans.begin(), already_installed_plans.end(), &InstallPlanAction::compare_by_name); std::sort(excluded.begin(), excluded.end(), &InstallPlanAction::compare_by_name); - static auto actions_to_output_string = [&](const std::vector& v) { - return Strings::join("\n", v, [&](const InstallPlanAction* p) { - return to_output_string(p->request_type, - p->displayname(), - p->build_options, - p->source_control_file_and_location.get(), - p->installed_package.get(), - builtin_ports_dir); - }); - }; + struct + { + void operator()(LocalizedString& msg, msg::MessageT<> header, View actions) + { + msg.append(header).append_raw('\n'); + for (auto action : actions) + { + format_plan_row(msg, *action, builtin_ports_dir); + msg.append_raw('\n'); + } + } + void operator()(LocalizedString& msg, msg::MessageT<> header, const std::set& specs) + { + msg.append(header).append_raw('\n'); + for (auto&& spec : specs) + { + msg.append_raw(request_type_indent(RequestType::USER_REQUESTED)).append_raw(spec).append_raw('\n'); + } + } + const Path& builtin_ports_dir; + } format_plan{builtin_ports_dir}; if (!excluded.empty()) { - msg::println( - msg::format(msgExcludedPackages).append_raw('\n').append_raw(actions_to_output_string(excluded))); + format_plan(ret.text, msgExcludedPackages, excluded); } if (!already_installed_plans.empty()) { - msg::println(msg::format(msgInstalledPackages) - .append_raw('\n') - .append_raw(actions_to_output_string(already_installed_plans))); + format_plan(ret.text, msgInstalledPackages, already_installed_plans); } if (!remove_specs.empty()) { - auto message = msg::format(msgPackagesToRemove); - for (auto&& spec : remove_specs) - { - message.append_raw('\n').append_raw(to_output_string(RequestType::USER_REQUESTED, spec.to_string())); - } - msg::println(message); + format_plan(ret.text, msgPackagesToRemove, remove_specs); } if (!rebuilt_plans.empty()) { - msg::println( - msg::format(msgPackagesToRebuild).append_raw('\n').append_raw(actions_to_output_string(rebuilt_plans))); + format_plan(ret.text, msgPackagesToRebuild, rebuilt_plans); } if (!new_plans.empty()) { - msg::println( - msg::format(msgPackagesToInstall).append_raw('\n').append_raw(actions_to_output_string(new_plans))); - } - - if (!only_install_plans.empty()) - { - msg::println(msg::format(msgPackagesToInstallDirectly) - .append_raw('\n') - .append_raw(actions_to_output_string(only_install_plans))); + format_plan(ret.text, msgPackagesToInstall, new_plans); } if (has_non_user_requested_packages) { - msg::println(msgPackagesToModify); + ret.text.append(msgPackagesToModify).append_raw('\n'); } - bool have_removals = !remove_specs.empty() || !rebuilt_plans.empty(); - if (have_removals && !is_recursive) + ret.has_removals = !remove_specs.empty() || !rebuilt_plans.empty(); + return ret; + } + + void print_plan(const ActionPlan& action_plan, const bool is_recursive, const Path& builtin_ports_dir) + { + auto formatted = format_plan(action_plan, builtin_ports_dir); + msg::print(formatted.text); + if (!is_recursive && formatted.has_removals) { msg::println_warning(msgPackagesToRebuildSuggestRecurse); Checks::exit_fail(VCPKG_LINE_INFO); @@ -1252,24 +1299,54 @@ namespace vcpkg namespace { + + /** + * vcpkg's Versioned Constraint Resolution Algorithm + * --- + * + * Phase 1: + * - Every spec not mentioned at top-level will have default features applied. + * - Every feature constraint from all applied versions will be applied. + * - If pinned, that version will be applied; otherwise the baseline version will be applied. + * - If a spec is not pinned, and a version constraint compares >= the baseline, that version will be applied. + * + * Phase 2: + * - Perform a postfix walk to serialize the plan. + * - Use the greatest version applied from Phase 1. + * - Use all features applied in Phase 1 that exist in the selected version. + * - Validate that every version constraint from the selected version is satisfied or pinned. + * - Validate that every feature constraint from the selected version is satisfied. + * - Validate that every spec in the plan is supported, applying the user's policy. + * - Validate that every feature in the plan is supported, applying the user's policy. + * + * (pinned means there is a matching override or overlay) + * + * Phase 1 does not depend on the order of evaluation. The implementation below exploits this to batch calls to + * CMake for calculationg dependency resolution tags. However, the results are sensitive to the definition of + * comparison. If "compares >= the baseline" changes, the set of considered constraints will change, and so will + * the results. + */ + struct VersionedPackageGraph { VersionedPackageGraph(const IVersionedPortfileProvider& ver_provider, const IBaselineProvider& base_provider, const IOverlayProvider& oprovider, const CMakeVars::CMakeVarProvider& var_provider, - Triplet host_triplet) + Triplet host_triplet, + const Path& packages_dir) : m_ver_provider(ver_provider) , m_base_provider(base_provider) , m_o_provider(oprovider) , m_var_provider(var_provider) , m_host_triplet(host_triplet) + , m_packages_dir(packages_dir) { } void add_override(const std::string& name, const Version& v); - void add_roots(View dep, const PackageSpec& toplevel); + void solve_with_roots(View dep, const PackageSpec& toplevel); ExpectedL finalize_extract_plan(const PackageSpec& toplevel, UnsupportedPortAction unsupported_port_action); @@ -1280,423 +1357,314 @@ namespace vcpkg const IOverlayProvider& m_o_provider; const CMakeVars::CMakeVarProvider& m_var_provider; const Triplet m_host_triplet; + const Path m_packages_dir; struct DepSpec { PackageSpec spec; - Version ver; - std::vector features; + DependencyConstraint dc; + std::vector features; }; - // This object contains the current version within a given version scheme (except for the "string" scheme, - // there we save an object for every version) - struct VersionSchemeInfo + struct PackageNodeData { - VersionScheme scheme; + // set of all scfls that have been considered + std::set considered; + + // Versions occluded by the baseline constraint are not considered. + SchemedVersion baseline; + // If overlay_or_override is true, ignore scheme and baseline_version + bool overlay_or_override = false; + // The current "best" scfl const SourceControlFileAndLocation* scfl = nullptr; - Version version; - // This tracks a list of constraint sources for debugging purposes - std::vector origins; - // mapping from feature name -> dependencies of this feature - std::map> deps; - bool is_less_than(const Version& new_ver) const; - }; + // This tracks a list of constraint sources for debugging purposes + std::set origins; - struct PackageNode - { - // Mapping from version to the newest version in the corresponding version scheme - // For example, given the versions: - // - "version-string": "1.0.0" - // - "version": "1.0.1" - // - "version": "1.0.2" - // you'd have a map: - // { - // "1.0.0": { "version-string": "1.0.0" }, - // "1.0.1": { "version": "1.0.2" }, - // "1.0.2": { "version": "1.0.2" } - // } - std::map vermap; - // We don't know how to compare "version-string" versions, so keep all the versions separately - std::map exacts; - // for each version type besides string (relaxed-semver, date), we only track the latest version - // required - Optional> relaxed_semver; - Optional> date; + // The set of features that have been requested across all constraints std::set requested_features; - bool default_features = true; - bool user_requested = false; - - VersionSchemeInfo* get_node(const Version& ver); - // Adds the version to the version resolver: - // - for string version schemes, just adds the newer version to the set - // - for non-string version schemes: - // - if the scheme doesn't exist in the set, adds the version to the set - // - if the scheme already exists in the set, and the version is newer than the existing entry, - // replaces the current entry for the scheme - VersionSchemeInfo& emplace_node(VersionScheme scheme, const Version& ver); - - PackageNode() = default; - PackageNode(const PackageNode&) = delete; - PackageNode(PackageNode&&) = default; - PackageNode& operator=(const PackageNode&) = delete; - PackageNode& operator=(PackageNode&&) = default; - - template - void foreach_vsi(F f) - { - if (auto r = this->relaxed_semver.get()) - { - f(**r); - } - if (auto d = this->date.get()) - { - f(**d); - } - for (auto&& vsi : this->exacts) - { - f(vsi.second); - } - } + bool default_features = false; }; - // the roots of the dependency graph (given in the manifest file) - std::vector m_roots; + using PackageNode = std::pair; + // mapping from portname -> version. "overrides" field in manifest file std::map m_overrides; + // direct dependencies in unevaluated form + std::vector m_roots; + // set of direct dependencies + std::set m_user_requested; // mapping from { package specifier -> node containing resolution information for that package } - std::map m_graph; + std::map m_graph; + // the set of nodes that could not be constructed in the graph due to failures + std::set m_failed_nodes; + + struct ConstraintFrame + { + PackageSpec spec; + View deps; + }; + std::vector m_resolve_stack; + + // Add an initial requirement for a package. + // Returns a reference to the node to place additional constraints + Optional require_package(const PackageSpec& spec, const std::string& origin); + + void require_scfl(PackageNode& ref, const SourceControlFileAndLocation* scfl, const std::string& origin); + + void require_port_feature(PackageNode& ref, const std::string& feature, const std::string& origin); - std::pair& emplace_package(const PackageSpec& spec); + void require_port_defaults(PackageNode& ref, const std::string& origin); - // the following functions will add stuff recursively - void require_dependency(std::pair& ref, - const Dependency& dep, - const std::string& origin); - void require_port_version(std::pair& graph_entry, - const Version& ver, - const std::string& origin); - void require_port_feature(std::pair& ref, - const std::string& feature, - const std::string& origin); + void resolve_stack(const ConstraintFrame& frame); + const CMakeVars::CMakeVars& batch_load_vars(const PackageSpec& spec); - void require_port_defaults(std::pair& ref, const std::string& origin); + Optional find_package(const PackageSpec& spec) const; - void add_feature_to(std::pair& ref, - VersionSchemeInfo& vsi, - const std::string& feature); + // For node, for each requested feature existing in the best scfl, calculate the set of package and feature + // dependencies. + // The FeatureSpec list will contain a [core] entry for each package dependency. + // The FeatureSpec list will not contain [default]. + std::map> compute_feature_dependencies( + const PackageNode& node, std::vector& out_dep_specs) const; - ExpectedL dep_to_version(const std::string& name, const DependencyConstraint& dc); + bool evaluate(const PackageSpec& spec, const PlatformExpression::Expr& platform_expr) const; static LocalizedString format_incomparable_versions_message(const PackageSpec& on, StringView from, - const VersionSchemeInfo& current, - const VersionSchemeInfo& target); + const SchemedVersion& baseline, + const SchemedVersion& target); std::vector m_errors; }; - VersionedPackageGraph::VersionSchemeInfo& VersionedPackageGraph::PackageNode::emplace_node(VersionScheme scheme, - const Version& ver) + const CMakeVars::CMakeVars& VersionedPackageGraph::batch_load_vars(const PackageSpec& spec) { - auto it = vermap.find(ver); - if (it != vermap.end()) return *it->second; - - VersionSchemeInfo* vsi = nullptr; - if (scheme == VersionScheme::String) - { - vsi = &exacts[ver.text()]; - } - else if (scheme == VersionScheme::Relaxed || scheme == VersionScheme::Semver) + auto vars = m_var_provider.get_dep_info_vars(spec); + if (!vars) { - if (auto p = relaxed_semver.get()) + // We want to batch as many dep_infos as possible, so look ahead in the stack + std::unordered_set spec_set = {spec}; + for (auto&& s : m_resolve_stack) { - vsi = p->get(); - } - else - { - relaxed_semver = std::make_unique(); - vsi = relaxed_semver.get()->get(); + spec_set.insert(s.spec); + for (auto&& d : s.deps) + spec_set.insert({d.name, d.host ? m_host_triplet : s.spec.triplet()}); } + std::vector spec_vec(spec_set.begin(), spec_set.end()); + m_var_provider.load_dep_info_vars(spec_vec, m_host_triplet); + return m_var_provider.get_dep_info_vars(spec).value_or_exit(VCPKG_LINE_INFO); } - else if (scheme == VersionScheme::Date) - { - if (auto p = date.get()) - { - vsi = p->get(); - } - else - { - date = std::make_unique(); - vsi = date.get()->get(); - } - } - else - { - // not implemented - Checks::unreachable(VCPKG_LINE_INFO); - } - vsi->scheme = scheme; - vermap.emplace(ver, vsi); - return *vsi; - } - - VersionedPackageGraph::VersionSchemeInfo* VersionedPackageGraph::PackageNode::get_node(const Version& ver) - { - auto it = vermap.find(ver); - return it == vermap.end() ? nullptr : it->second; - } - - bool VersionedPackageGraph::VersionSchemeInfo::is_less_than(const Version& new_ver) const - { - Checks::check_exit(VCPKG_LINE_INFO, scfl); - ASSUME(scfl != nullptr); - auto s = scfl->source_control_file->core_paragraph->version_scheme; - auto r = compare_versions(s, version, s, new_ver); - Checks::check_exit(VCPKG_LINE_INFO, r != VerComp::unk); - return r == VerComp::lt; + return *vars.get(); } - void VersionedPackageGraph::add_feature_to(std::pair& ref, - VersionSchemeInfo& vsi, - const std::string& feature) + void VersionedPackageGraph::resolve_stack(const ConstraintFrame& frame) { - auto deps = vsi.scfl->source_control_file->find_dependencies_for_feature(feature); - if (!deps) + for (auto&& dep : frame.deps) { - // This version doesn't have this feature. This may result in an error during finalize if the - // constraint is not removed via upgrades. - return; - } - auto p = vsi.deps.emplace(feature, std::vector{}); - if (!p.second) - { - // This feature has already been handled - return; - } + if (!dep.platform.is_empty() && !dep.platform.evaluate(batch_load_vars(frame.spec))) continue; - for (auto&& dep : *deps.get()) - { - PackageSpec dep_spec(dep.name, dep.host ? m_host_triplet : ref.first.triplet()); - - if (!dep.platform.is_empty()) + PackageSpec dep_spec(dep.name, dep.host ? m_host_triplet : frame.spec.triplet()); + auto maybe_node = require_package(dep_spec, frame.spec.name()); + if (auto node = maybe_node.get()) { - auto maybe_vars = m_var_provider.get_dep_info_vars(ref.first); - if (!maybe_vars) + // If the node is overlayed or overridden, don't apply version constraints + // If the baseline is a version_string, it occludes other constraints + if (!node->second.overlay_or_override) { - m_var_provider.load_dep_info_vars({&ref.first, 1}, m_host_triplet); - maybe_vars = m_var_provider.get_dep_info_vars(ref.first); + const auto maybe_dep_ver = dep.constraint.try_get_minimum_version(); + if (auto dep_ver = maybe_dep_ver.get()) + { + auto maybe_scfl = m_ver_provider.get_control_file({dep.name, *dep_ver}); + if (auto p_scfl = maybe_scfl.get()) + { + const auto sver = p_scfl->schemed_version(); + if (compare_versions(node->second.scfl->schemed_version(), sver) == VerComp::lt) + { + // mark as current best and apply constraints + node->second.scfl = p_scfl; + require_scfl(*node, p_scfl, frame.spec.name()); + } + else if (compare_versions(node->second.baseline, sver) == VerComp::lt) + { + // apply constraints + require_scfl(*node, p_scfl, frame.spec.name()); + } + } + } } - if (!dep.platform.evaluate(maybe_vars.value_or_exit(VCPKG_LINE_INFO))) + // apply selected features + for (auto&& f : dep.features) { - continue; + if (f.name == "default") abort(); + if (evaluate(frame.spec, f.platform)) + { + require_port_feature(*node, f.name, frame.spec.name()); + } } - } - - auto& dep_node = emplace_package(dep_spec); - if (dep_spec == ref.first) - { - // this is a feature dependency for oneself - for (auto&& f : dep.features) + if (dep.default_features) { - require_port_feature(ref, f, ref.first.name()); + require_port_defaults(*node, frame.spec.name()); } } - else - { - require_dependency(dep_node, dep, ref.first.name()); - } - - p.first->second.emplace_back(dep_spec, "core"); - for (auto&& f : dep.features) - { - p.first->second.emplace_back(dep_spec, f); - } } } - void VersionedPackageGraph::require_dependency(std::pair& ref, - const Dependency& dep, - const std::string& origin) + void VersionedPackageGraph::require_port_defaults(PackageNode& ref, const std::string& origin) { - const auto maybe_overlay = m_o_provider.get_control_file(ref.first.name()); - if (auto p_overlay = maybe_overlay.get()) - { - const auto overlay_version = p_overlay->source_control_file->to_version(); - require_port_version(ref, overlay_version, origin); - } - else if (const auto over_it = m_overrides.find(ref.first.name()); over_it != m_overrides.end()) - { - require_port_version(ref, over_it->second, origin); - } - else + ref.second.origins.insert(origin); + if (!ref.second.default_features) { - const auto base_ver = m_base_provider.get_baseline_version(dep.name); - const auto dep_ver = dep.constraint.try_get_minimum_version(); - - if (auto dv = dep_ver.get()) - { - require_port_version(ref, *dv, origin); - } + ref.second.default_features = true; - if (auto bv = base_ver.get()) + auto scfls = ref.second.considered; + for (auto scfl : scfls) { - require_port_version(ref, *bv, origin); + for (auto&& f : scfl->source_control_file->core_paragraph->default_features) + { + if (evaluate(ref.first, f.platform)) + { + auto deps = scfl->source_control_file->find_dependencies_for_feature(f.name); + if (!deps) continue; + m_resolve_stack.push_back({ref.first, *deps.get()}); + } + } } } - - for (auto&& f : dep.features) - { - require_port_feature(ref, f, origin); - } - - if (Util::find(dep.features, StringView{"core"}) == dep.features.end()) - { - require_port_defaults(ref, origin); - } } - void VersionedPackageGraph::require_port_version(std::pair& graph_entry, - const Version& version, + void VersionedPackageGraph::require_port_feature(PackageNode& ref, + const std::string& feature, const std::string& origin) { - // if this port is an overlay port, ignore the given version and use the version from the overlay - auto maybe_overlay = m_o_provider.get_control_file(graph_entry.first.name()); - const vcpkg::SourceControlFileAndLocation* p_scfl = maybe_overlay.get(); - if (p_scfl) + ref.second.origins.insert(origin); + auto inserted = ref.second.requested_features.emplace(feature).second; + if (inserted) { - const auto overlay_version = p_scfl->source_control_file->to_version(); - // If the original request did not match the overlay version, restart this function to operate on the - // overlay version - if (version != overlay_version) + auto scfls = ref.second.considered; + for (auto scfl : scfls) { - require_port_version(graph_entry, overlay_version, origin); - return; + auto deps = scfl->source_control_file->find_dependencies_for_feature(feature); + if (!deps) continue; + m_resolve_stack.push_back({ref.first, *deps.get()}); } } - else + } + void VersionedPackageGraph::require_scfl(PackageNode& ref, + const SourceControlFileAndLocation* scfl, + const std::string& origin) + { + ref.second.origins.insert(origin); + + if (Util::Sets::contains(ref.second.considered, scfl)) return; + ref.second.considered.insert(scfl); + + auto features = ref.second.requested_features; + if (ref.second.default_features) { - // if there is a override, ignore the given version and use the version from the override - auto over_it = m_overrides.find(graph_entry.first.name()); - if (over_it != m_overrides.end() && over_it->second != version) + for (auto&& f : ref.second.scfl->source_control_file->core_paragraph->default_features) { - require_port_version(graph_entry, over_it->second, origin); - return; + if (evaluate(ref.first, f.platform)) + { + features.insert(f.name); + } } + } - auto maybe_scfl = m_ver_provider.get_control_file({graph_entry.first.name(), version}); - p_scfl = maybe_scfl.get(); - if (!p_scfl) + m_resolve_stack.push_back({ref.first, scfl->source_control_file->core_paragraph->dependencies}); + for (auto&& f : features) + { + auto deps = ref.second.scfl->source_control_file->find_dependencies_for_feature(f); + if (!deps) { - m_errors.push_back(std::move(maybe_scfl).error()); + // This version doesn't have this feature. return; } + m_resolve_stack.push_back({ref.first, *deps.get()}); } + } + + Optional VersionedPackageGraph::find_package( + const PackageSpec& spec) const + { + auto it = m_graph.find(spec); + if (it == m_graph.end()) return nullopt; + return *it; + } - auto& versioned_graph_entry = - graph_entry.second.emplace_node(p_scfl->source_control_file->core_paragraph->version_scheme, version); - versioned_graph_entry.origins.push_back(origin); - // Use the new source control file if we currently don't have one or the new one is newer - bool replace; - if (versioned_graph_entry.scfl == nullptr) + Optional VersionedPackageGraph::require_package(const PackageSpec& spec, + const std::string& origin) + { + auto it = m_graph.find(spec); + if (it != m_graph.end()) { - replace = true; + it->second.origins.insert(origin); + return *it; } - else if (versioned_graph_entry.scfl == p_scfl) + + if (Util::Maps::contains(m_failed_nodes, spec.name())) { - replace = false; + return nullopt; } - else + + const auto maybe_overlay = m_o_provider.get_control_file(spec.name()); + if (auto p_overlay = maybe_overlay.get()) { - replace = versioned_graph_entry.is_less_than(version); + it = m_graph.emplace(spec, PackageNodeData{}).first; + it->second.overlay_or_override = true; + it->second.scfl = p_overlay; } - - if (replace) + else { - versioned_graph_entry.scfl = p_scfl; - versioned_graph_entry.version = p_scfl->source_control_file->to_version(); - versioned_graph_entry.deps.clear(); - - // add all dependencies to the graph - add_feature_to(graph_entry, versioned_graph_entry, "core"); - - for (auto&& f : graph_entry.second.requested_features) + Version ver; + if (const auto over_it = m_overrides.find(spec.name()); over_it != m_overrides.end()) { - add_feature_to(graph_entry, versioned_graph_entry, f); + auto maybe_scfl = m_ver_provider.get_control_file({spec.name(), over_it->second}); + if (auto p_scfl = maybe_scfl.get()) + { + it = m_graph.emplace(spec, PackageNodeData{}).first; + it->second.overlay_or_override = true; + it->second.scfl = p_scfl; + } + else + { + m_errors.push_back(std::move(maybe_scfl).error()); + m_failed_nodes.insert(spec.name()); + return nullopt; + } } - - if (graph_entry.second.default_features) + else { - for (auto&& f : p_scfl->source_control_file->core_paragraph->default_features) + auto maybe_scfl = m_base_provider.get_baseline_version(spec.name()).then([&](const Version& ver) { + return m_ver_provider.get_control_file({spec.name(), ver}); + }); + if (auto p_scfl = maybe_scfl.get()) { - add_feature_to(graph_entry, versioned_graph_entry, f); + it = m_graph.emplace(spec, PackageNodeData{}).first; + it->second.baseline = p_scfl->schemed_version(); + it->second.scfl = p_scfl; } - } - } - } - - void VersionedPackageGraph::require_port_defaults(std::pair& ref, - const std::string& origin) - { - (void)origin; - if (!ref.second.default_features) - { - ref.second.default_features = true; - ref.second.foreach_vsi([this, &ref](VersionSchemeInfo& vsi) { - if (vsi.scfl) + else { - for (auto&& f : vsi.scfl->source_control_file->core_paragraph->default_features) - { - this->add_feature_to(ref, vsi, f); - } + m_errors.push_back(std::move(maybe_scfl).error()); + m_failed_nodes.insert(spec.name()); + return nullopt; } - }); - } - } - void VersionedPackageGraph::require_port_feature(std::pair& ref, - const std::string& feature, - const std::string& origin) - { - if (feature == "default") - { - return require_port_defaults(ref, origin); - } - auto inserted = ref.second.requested_features.emplace(feature).second; - if (inserted) - { - ref.second.foreach_vsi( - [this, &ref, &feature](VersionSchemeInfo& vsi) { this->add_feature_to(ref, vsi, feature); }); + } } - (void)origin; - } - std::pair& VersionedPackageGraph::emplace_package( - const PackageSpec& spec) - { - return *m_graph.emplace(spec, PackageNode{}).first; + // Implicit defaults are disabled if spec has been mentioned at top-level. + // Note that if top-level doesn't also mark that reference as `[core]`, defaults will be re-engaged. + it->second.default_features = !Util::Maps::contains(m_user_requested, spec); + it->second.requested_features.insert("core"); + + require_scfl(*it, it->second.scfl, origin); + return *it; } - ExpectedL VersionedPackageGraph::dep_to_version(const std::string& name, - const DependencyConstraint& dc) + bool VersionedPackageGraph::evaluate(const PackageSpec& spec, + const PlatformExpression::Expr& platform_expr) const { - auto maybe_overlay = m_o_provider.get_control_file(name); - if (auto p_overlay = maybe_overlay.get()) - { - return p_overlay->source_control_file->to_version(); - } - - auto over_it = m_overrides.find(name); - if (over_it != m_overrides.end()) - { - return over_it->second; - } - - auto maybe_cons = dc.try_get_minimum_version(); - if (auto p = maybe_cons.get()) - { - return std::move(*p); - } - - return m_base_provider.get_baseline_version(name); + return platform_expr.evaluate(m_var_provider.get_or_load_dep_info_vars(spec, m_host_triplet)); } void VersionedPackageGraph::add_override(const std::string& name, const Version& v) @@ -1704,7 +1672,7 @@ namespace vcpkg m_overrides.emplace(name, v); } - void VersionedPackageGraph::add_roots(View deps, const PackageSpec& toplevel) + void VersionedPackageGraph::solve_with_roots(View deps, const PackageSpec& toplevel) { auto dep_to_spec = [&toplevel, this](const Dependency& d) { return PackageSpec{d.name, d.host ? m_host_triplet : toplevel.triplet()}; @@ -1713,143 +1681,124 @@ namespace vcpkg specs.push_back(toplevel); Util::sort_unique_erase(specs); - m_var_provider.load_dep_info_vars(specs, m_host_triplet); - const auto& vars = m_var_provider.get_dep_info_vars(toplevel).value_or_exit(VCPKG_LINE_INFO); - std::vector active_deps; - - // First add all top level packages to ensure the default_features is set to false before recursing into the - // individual packages. Otherwise, a case like: - // A -> B, C[core] - // B -> C - // could install the default features of C. (A is the manifest/vcpkg.json) for (auto&& dep : deps) { - if (!dep.platform.evaluate(vars)) continue; - - active_deps.push_back(&dep); - - // Disable default features for deps with [core] as a dependency - // Note: x[core], x[y] will still eventually depend on defaults due to the second x[y] - if (Util::find(dep.features, "core") != dep.features.end()) + if (!dep.platform.is_empty() && + !dep.platform.evaluate(m_var_provider.get_or_load_dep_info_vars(toplevel, m_host_triplet))) { - auto& node = emplace_package(dep_to_spec(dep)); - node.second.default_features = false; + continue; } + + auto spec = dep_to_spec(dep); + m_user_requested.insert(spec); + m_roots.push_back(DepSpec{std::move(spec), dep.constraint, dep.features}); } - for (auto pdep : active_deps) + m_resolve_stack.push_back({toplevel, deps}); + + while (!m_resolve_stack.empty()) { - const auto& dep = *pdep; - auto spec = dep_to_spec(dep); + ConstraintFrame frame = std::move(m_resolve_stack.back()); + m_resolve_stack.pop_back(); + // Frame must be passed as a local because resolve_stack() will add new elements to m_resolve_stack + resolve_stack(frame); + } + } - auto& node = emplace_package(spec); - node.second.user_requested = true; + LocalizedString VersionedPackageGraph::format_incomparable_versions_message(const PackageSpec& on, + StringView from, + const SchemedVersion& baseline, + const SchemedVersion& target) + { + LocalizedString doc = msg::format_error(msgVersionIncomparable1, + msg::spec = on, + msg::constraint_origin = from, + msg::expected = target.version, + msg::actual = baseline.version) + .append_raw("\n\n"); + if (baseline.scheme == VersionScheme::String && target.scheme == VersionScheme::String) + { + doc.append(msgVersionIncomparableSchemeString).append_raw("\n\n"); + } + else + { + doc.append(msgVersionIncomparableSchemes).append_raw('\n'); + doc.append_indent() + .append(msgVersionIncomparable2, + msg::version_spec = Strings::concat(on.name(), '@', baseline.version), + msg::new_scheme = baseline.scheme) + .append_raw('\n'); + doc.append_indent() + .append(msgVersionIncomparable2, + msg::version_spec = Strings::concat(on.name(), '@', target.version), + msg::new_scheme = target.scheme) + .append_raw("\n\n"); + } + doc.append(msgVersionIncomparable3).append_raw("\n\n"); + doc.append_indent().append_raw("\"overrides\": [\n"); + doc.append_indent(2) + .append_raw(fmt::format(R"({{ "name": "{}", "version": "{}" }})", on.name(), baseline.version)) + .append_raw('\n'); + doc.append_indent().append_raw("]\n\n"); + doc.append(msgVersionIncomparable4, msg::url = docs::versioning_url); + return doc; + } - auto maybe_overlay = m_o_provider.get_control_file(dep.name); - auto over_it = m_overrides.find(dep.name); - if (auto p_overlay = maybe_overlay.get()) - { - const auto ver = p_overlay->source_control_file->to_version(); - m_roots.push_back(DepSpec{spec, ver, dep.features}); - require_port_version(node, ver, toplevel.name()); - } - else if (over_it != m_overrides.end()) + std::map> VersionedPackageGraph::compute_feature_dependencies( + const PackageNode& node, std::vector& out_dep_specs) const + { + std::map> feature_deps; + std::set all_features = node.second.requested_features; + if (node.second.default_features) + { + for (auto&& f : node.second.scfl->source_control_file->core_paragraph->default_features) { - m_roots.push_back(DepSpec{spec, over_it->second, dep.features}); - require_port_version(node, over_it->second, toplevel.name()); + if (evaluate(node.first, f.platform)) + { + all_features.insert(f.name); + } } - else + } + std::vector fspecs; + for (auto&& f : all_features) + { + auto maybe_fdeps = node.second.scfl->source_control_file->find_dependencies_for_feature(f); + if (auto fdeps = maybe_fdeps.get()) { - const auto dep_ver = dep.constraint.try_get_minimum_version(); - const auto base_ver = m_base_provider.get_baseline_version(dep.name); - if (auto p_dep_ver = dep_ver.get()) + fspecs.clear(); + for (auto&& fdep : *fdeps) { - m_roots.push_back(DepSpec{spec, *p_dep_ver, dep.features}); - if (auto p_base_ver = base_ver.get()) + PackageSpec fspec{fdep.name, fdep.host ? m_host_triplet : node.first.triplet()}; + + // Ignore intra-package dependencies + if (fspec == node.first) continue; + + if (!fdep.platform.is_empty() && + !fdep.platform.evaluate( + m_var_provider.get_or_load_dep_info_vars(node.first, m_host_triplet))) { - // Compare version constraint with baseline to only evaluate the "tighter" constraint - auto dep_scfl = m_ver_provider.get_control_file({dep.name, *p_dep_ver}); - auto base_scfl = m_ver_provider.get_control_file({dep.name, *p_base_ver}); - if (dep_scfl && base_scfl) - { - auto r = compare_versions( - dep_scfl.get()->source_control_file->core_paragraph->version_scheme, - *p_dep_ver, - base_scfl.get()->source_control_file->core_paragraph->version_scheme, - *p_base_ver); - if (r == VerComp::lt) - { - require_port_version(node, *p_base_ver, "baseline"); - require_port_version(node, *p_dep_ver, toplevel.name()); - } - else - { - require_port_version(node, *p_dep_ver, toplevel.name()); - require_port_version(node, *p_base_ver, "baseline"); - } - } - else - { - if (!dep_scfl) m_errors.push_back(dep_scfl.error()); - if (!base_scfl) m_errors.push_back(base_scfl.error()); - } + continue; } - else + + fspecs.emplace_back(fspec, "core"); + for (auto&& g : fdep.features) { - require_port_version(node, *p_dep_ver, toplevel.name()); + if (evaluate(fspec, g.platform)) + { + fspecs.emplace_back(fspec, g.name); + } } + out_dep_specs.push_back({std::move(fspec), fdep.constraint, fdep.features}); } - else if (auto p_base_ver = base_ver.get()) - { - m_roots.push_back(DepSpec{spec, *p_base_ver, dep.features}); - require_port_version(node, *p_base_ver, toplevel.name()); - } - else - { - m_errors.push_back(msg::format( - msgVersionConstraintUnresolvable, msg::package_name = dep.name, msg::spec = toplevel)); - } - } - - for (auto&& f : dep.features) - { - require_port_feature(node, f, toplevel.name()); + Util::sort_unique_erase(fspecs); + feature_deps.emplace(f, fspecs); } } - } - - LocalizedString VersionedPackageGraph::format_incomparable_versions_message(const PackageSpec& on, - StringView from, - const VersionSchemeInfo& current, - const VersionSchemeInfo& target) - { - return msg::format_error(msgVersionIncomparable1, - msg::spec = on, - msg::package_name = from, - msg::expected = target.version, - msg::actual = current.version) - .append_raw('\n') - .append_indent() - .append(msgVersionIncomparable2, msg::version = current.version, msg::new_scheme = current.scheme) - .append_raw('\n') - .append_indent() - .append(msgVersionIncomparable2, msg::version = target.version, msg::new_scheme = target.scheme) - .append_raw('\n') - .append(msgVersionIncomparable3) - .append_raw('\n') - .append_indent() - .append_raw("\"overrides\": [\n") - .append_indent(2) - .append_raw(fmt::format(R"({{ "name": "{}", "version": "{}" }})", on.name(), current.version)) - .append_raw('\n') - .append_indent() - .append_raw("]\n") - .append(msgVersionIncomparable4); + return feature_deps; } // This function is called after all versioning constraints have been resolved. It is responsible for - // serializing out the final execution graph and performing all final validations (such as all required - // features being selected and present) + // serializing out the final execution graph and performing all final validations. ExpectedL VersionedPackageGraph::finalize_extract_plan( const PackageSpec& toplevel, UnsupportedPortAction unsupported_port_action) { @@ -1861,8 +1810,8 @@ namespace vcpkg ActionPlan ret; - // second == nullptr means "in progress" - std::map emitted; + // second == false means "in progress" + std::map emitted; struct Frame { InstallPlanAction ipa; @@ -1871,181 +1820,105 @@ namespace vcpkg std::vector stack; // Adds a new Frame to the stack if the spec was not already added - auto push = [&emitted, this, &stack, unsupported_port_action, &ret]( - const PackageSpec& spec, - const Version& new_ver, - const PackageSpec& origin, - View features) -> Optional { - auto&& node = emplace_package(spec).second; - auto overlay = m_o_provider.get_control_file(spec.name()); - auto over_it = m_overrides.find(spec.name()); - - VersionedPackageGraph::VersionSchemeInfo* p_vnode; - if (auto p_overlay = overlay.get()) - p_vnode = node.get_node(p_overlay->source_control_file->to_version()); - else if (over_it != m_overrides.end()) - p_vnode = node.get_node(over_it->second); - else - p_vnode = node.get_node(new_ver); - - if (!p_vnode) + auto push = [&emitted, this, &stack](const DepSpec& dep, StringView origin) -> ExpectedL { + auto p = emitted.emplace(dep.spec, false); + // Dependency resolution should have ensured that either every node exists OR an error should have been + // logged to m_errors + const auto& node = find_package(dep.spec).value_or_exit(VCPKG_LINE_INFO); + + // Evaluate the >=version constraint (if any) + auto maybe_min = dep.dc.try_get_minimum_version(); + if (!node.second.overlay_or_override && maybe_min) { - return msg::format_error( - msgVersionNotFoundDuringDiscovery, msg::spec = spec, msg::version = new_ver); - } - - { // use if(init;condition) if we support c++17 - const auto& supports_expr = p_vnode->scfl->source_control_file->core_paragraph->supports_expression; - if (!supports_expr.is_empty()) + // Dependency resolution should have already logged any errors retrieving the scfl + const auto& dep_scfl = m_ver_provider.get_control_file({dep.spec.name(), *maybe_min.get()}) + .value_or_exit(VCPKG_LINE_INFO); + const auto constraint_sver = dep_scfl.schemed_version(); + const auto selected_sver = node.second.scfl->schemed_version(); + auto r = compare_versions(selected_sver, constraint_sver); + if (r == VerComp::unk) { - if (!supports_expr.evaluate(m_var_provider.get_or_load_dep_info_vars(spec, m_host_triplet))) - { - FeatureSpec feature_spec(spec, "core"); - - if (unsupported_port_action == UnsupportedPortAction::Error) - { - return msg::format_error(create_unsupported_message( - msgUnsupportedFeatureSupportsExpression, feature_spec, supports_expr)); - } - - ret.unsupported_features.insert({FeatureSpec(spec, "core"), supports_expr}); - } + // In the error message, we report the baseline version instead of the "best selected" version + // to give the user simpler data to work with. + return format_incomparable_versions_message( + dep.spec, origin, node.second.baseline, constraint_sver); } + Checks::check_exit( + VCPKG_LINE_INFO, + r != VerComp::lt, + "Dependency resolution failed to consider a constraint. This is an internal error."); } - for (auto&& f : features) + // Evaluate feature constraints (if any) + for (auto&& f : dep.features) { - if (f == "core") continue; - if (f == "default") continue; - auto feature = p_vnode->scfl->source_control_file->find_feature(f); + if (f.name == "core") continue; + if (f.name == "default") continue; + auto feature = node.second.scfl->source_control_file->find_feature(f.name); if (!feature) { - return msg::format_error(msgVersionMissingRequiredFeature, - msg::spec = spec, - msg::version = new_ver, - msg::feature = f); - } - - const auto& supports_expr = feature.get()->supports_expression; - if (!supports_expr.is_empty()) - { - if (!supports_expr.evaluate(m_var_provider.get_or_load_dep_info_vars(spec, m_host_triplet))) - { - if (unsupported_port_action == UnsupportedPortAction::Error) - { - const auto feature_spec_text = format_name_only_feature_spec(spec.name(), f); - const auto supports_expression_text = to_string(supports_expr); - return msg::format_error(msgUnsupportedFeatureSupportsExpression, - msg::package_name = spec.name(), - msg::feature_spec = feature_spec_text, - msg::supports_expression = supports_expression_text, - msg::triplet = spec.triplet()); - } - - ret.unsupported_features.emplace(FeatureSpec{spec, f}, supports_expr); - } + return msg::format_error( + msgVersionMissingRequiredFeature, + msg::version_spec = Strings::concat(dep.spec.name(), '@', node.second.scfl->to_version()), + msg::feature = f.name, + msg::constraint_origin = origin); } } - auto p = emitted.emplace(spec, nullptr); if (p.second) { - // Newly inserted - if (!overlay && over_it == m_overrides.end()) - { - // Not overridden -- Compare against baseline - if (auto baseline = m_base_provider.get_baseline_version(spec.name())) - { - if (auto base_node = node.get_node(*baseline.get())) - { - if (base_node != p_vnode) - { - return format_incomparable_versions_message(spec, "baseline", *p_vnode, *base_node); - } - } - } - } + // Newly inserted -> Add stack frame + auto maybe_vars = m_var_provider.get_or_load_dep_info_vars(p.first->first, m_host_triplet); - // -> Add stack frame - auto maybe_vars = m_var_provider.get_dep_info_vars(spec); - - InstallPlanAction ipa(spec, - *p_vnode->scfl, - node.user_requested ? RequestType::USER_REQUESTED - : RequestType::AUTO_SELECTED, - m_host_triplet, - std::move(p_vnode->deps), - {}); - std::vector deps; - for (auto&& f : ipa.feature_list) + std::vector default_features; + for (const auto& feature : node.second.scfl->source_control_file->core_paragraph->default_features) { - if (auto maybe_deps = - p_vnode->scfl->source_control_file->find_dependencies_for_feature(f).get()) + if (feature.platform.evaluate(maybe_vars)) { - for (auto&& dep : *maybe_deps) - { - PackageSpec dep_spec(dep.name, dep.host ? m_host_triplet : spec.triplet()); - if (dep_spec == spec) continue; - - if (!dep.platform.is_empty() && - !dep.platform.evaluate(maybe_vars.value_or_exit(VCPKG_LINE_INFO))) - { - continue; - } - auto maybe_cons = dep_to_version(dep.name, dep.constraint); - - if (auto cons = maybe_cons.get()) - { - deps.emplace_back(DepSpec{std::move(dep_spec), std::move(*cons), dep.features}); - } - else - { - return msg::format_error(msgVersionConstraintUnresolvable, - msg::package_name = dep.name, - msg::spec = spec); - } - } + default_features.push_back(feature.name); } } + std::vector deps; + RequestType request = Util::Sets::contains(m_user_requested, dep.spec) ? RequestType::USER_REQUESTED + : RequestType::AUTO_SELECTED; + InstallPlanAction ipa(dep.spec, + *node.second.scfl, + m_packages_dir, + request, + m_host_triplet, + compute_feature_dependencies(node, deps), + {}, + std::move(default_features)); stack.push_back(Frame{std::move(ipa), std::move(deps)}); - return nullopt; } - else + else if (p.first->second == false) { - // spec already present in map - if (p.first->second == nullptr) - { - return msg::format_error(msgCycleDetectedDuring, msg::spec = spec) - .append_raw('\n') - .append_raw(Strings::join( - "\n", stack, [](const auto& p) -> const PackageSpec& { return p.ipa.spec; })); - } - else if (p.first->second != p_vnode) - { - // comparable versions should retrieve the same info node - return format_incomparable_versions_message( - spec, origin.to_string(), *p_vnode, *p.first->second); - } - return nullopt; + return msg::format_error(msgCycleDetectedDuring, msg::spec = dep.spec) + .append_raw('\n') + .append_raw(Strings::join("\n", stack, [](const Frame& p) { + return Strings::concat( + p.ipa.spec, + '@', + p.ipa.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO).to_version()); + })); } + return Unit{}; }; for (auto&& root : m_roots) { - if (auto err = push(root.spec, root.ver, toplevel, root.features)) + auto x = push(root, toplevel.name()); + if (!x.has_value()) { - return std::move(*err.get()); + return std::move(x).error(); } - while (stack.size() > 0) + while (!stack.empty()) { auto& back = stack.back(); if (back.deps.empty()) { - emitted[back.ipa.spec] = - emplace_package(back.ipa.spec) - .second.get_node( - back.ipa.source_control_file_and_location.get()->source_control_file->to_version()); + emitted[back.ipa.spec] = true; ret.install_actions.push_back(std::move(back.ipa)); stack.pop_back(); } @@ -2053,13 +1926,70 @@ namespace vcpkg { auto dep = std::move(back.deps.back()); back.deps.pop_back(); - if (auto err = push(dep.spec, dep.ver, back.ipa.spec, dep.features)) + const auto origin = Strings::concat( + back.ipa.spec, + "@", + back.ipa.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO).to_version()); + x = push(dep, origin); + if (!x.has_value()) { - return std::move(*err.get()); + return std::move(x).error(); } } } } + + // Because supports expressions are commonplace, we assume that all dep info will be needed + m_var_provider.load_dep_info_vars( + Util::fmap(ret.install_actions, [](const InstallPlanAction& a) { return a.spec; }), m_host_triplet); + + // Evaluate supports over the produced plan + for (auto&& action : ret.install_actions) + { + const auto& scfl = action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO); + const auto& vars = m_var_provider.get_or_load_dep_info_vars(action.spec, m_host_triplet); + // Evaluate core supports condition + const auto& supports_expr = scfl.source_control_file->core_paragraph->supports_expression; + if (!supports_expr.evaluate(vars)) + { + ret.unsupported_features.insert({FeatureSpec(action.spec, "core"), supports_expr}); + } + + // Evaluate per-feature supports conditions + for (auto&& fdeps : action.feature_dependencies) + { + if (fdeps.first == "core") continue; + + auto& fpgh = scfl.source_control_file->find_feature(fdeps.first).value_or_exit(VCPKG_LINE_INFO); + if (!fpgh.supports_expression.evaluate(vars)) + { + ret.unsupported_features.insert( + {FeatureSpec(action.spec, fdeps.first), fpgh.supports_expression}); + } + } + } + + if (unsupported_port_action == UnsupportedPortAction::Error && !ret.unsupported_features.empty()) + { + LocalizedString msg; + for (auto&& f : ret.unsupported_features) + { + if (!msg.empty()) msg.append_raw("\n"); + + const auto feature_spec = + f.first.feature() == "core" + ? f.first.spec().name() + : format_name_only_feature_spec(f.first.spec().name(), f.first.feature()); + + msg.append(msgUnsupportedFeatureSupportsExpression, + msg::package_name = f.first.spec().name(), + msg::feature_spec = feature_spec, + msg::supports_expression = to_string(f.second), + msg::triplet = f.first.spec().triplet()); + } + + return msg; + } return ret; } } @@ -2071,16 +2001,16 @@ namespace vcpkg const std::vector& deps, const std::vector& overrides, const PackageSpec& toplevel, - Triplet host_triplet, - UnsupportedPortAction unsupported_port_action) + const CreateInstallPlanOptions& options) { - VersionedPackageGraph vpg(provider, bprovider, oprovider, var_provider, host_triplet); + VersionedPackageGraph vpg( + provider, bprovider, oprovider, var_provider, options.host_triplet, options.packages_dir); for (auto&& o : overrides) { vpg.add_override(o.name, {o.version, o.port_version}); } - vpg.add_roots(deps, toplevel); - return vpg.finalize_extract_plan(toplevel, unsupported_port_action); + vpg.solve_with_roots(deps, toplevel); + return vpg.finalize_extract_plan(toplevel, options.unsupported_port_action); } } diff --git a/src/vcpkg/export.chocolatey.cpp b/src/vcpkg/export.chocolatey.cpp index 06a8cd1028..976f918462 100644 --- a/src/vcpkg/export.chocolatey.cpp +++ b/src/vcpkg/export.chocolatey.cpp @@ -3,20 +3,21 @@ #include #include +#include #include +#include #include -#include -#include #include #include #include -namespace vcpkg::Export::Chocolatey +namespace vcpkg::Chocolatey { static std::string create_nuspec_dependencies(const BinaryParagraph& binary_paragraph, const std::map& packages_version) { - static constexpr auto CONTENT_TEMPLATE = R"()"; + static constexpr StringLiteral CONTENT_TEMPLATE = + R"()"; std::string nuspec_dependencies; for (const auto& depend : binary_paragraph.dependencies) @@ -38,7 +39,7 @@ namespace vcpkg::Export::Chocolatey const std::map& packages_version, const Options& chocolatey_options) { - static constexpr auto CONTENT_TEMPLATE = R"( + static constexpr StringLiteral CONTENT_TEMPLATE = R"( @PACKAGE_ID@ @@ -79,7 +80,7 @@ namespace vcpkg::Export::Chocolatey static std::string create_chocolatey_install_contents() { - static constexpr auto CONTENT_TEMPLATE = R"###( + static constexpr StringLiteral CONTENT_TEMPLATE = R"###( $ErrorActionPreference = 'Stop'; $packageName= $env:ChocolateyPackageName @@ -92,12 +93,12 @@ namespace vcpkg::Export::Chocolatey Set-Content -Path $whereToInstallCache -Value $whereToInstall Copy-Item $installedDir -destination $whereToInstall -recurse -force )###"; - return CONTENT_TEMPLATE; + return CONTENT_TEMPLATE.to_string(); } static std::string create_chocolatey_uninstall_contents(const BinaryParagraph& binary_paragraph) { - static constexpr auto CONTENT_TEMPLATE = R"###( + static constexpr StringLiteral CONTENT_TEMPLATE = R"###( $ErrorActionPreference = 'Stop'; $packageName= $env:ChocolateyPackageName @@ -156,8 +157,8 @@ if (Test-Path $installedDir) msgOptionRequired, msg::option = "x-maintainer"); - Filesystem& fs = paths.get_filesystem(); - const auto vcpkg_root_path = paths.root; + const Filesystem& fs = paths.get_filesystem(); + const auto& vcpkg_root_path = paths.root; const auto raw_exported_dir_path = vcpkg_root_path / "chocolatey"; const auto exported_dir_path = vcpkg_root_path / "chocolatey_exports"; const Path& nuget_exe = paths.get_tool_exe(Tools::NUGET, stdout_sink); diff --git a/src/vcpkg/export.ifw.cpp b/src/vcpkg/export.ifw.cpp index 6da6c3ebb6..73129566c5 100644 --- a/src/vcpkg/export.ifw.cpp +++ b/src/vcpkg/export.ifw.cpp @@ -4,15 +4,15 @@ #include #include +#include #include -#include +#include #include -#include #include #include #include -namespace vcpkg::Export::IFW +namespace vcpkg::IFW { // requires: after_prefix <= semi // requires: *semi == ';' @@ -137,7 +137,9 @@ namespace vcpkg::Export::IFW : paths.root / (export_id + "-ifw-installer.exe"); } - Path export_real_package(const Path& ifw_packages_dir_path, const ExportPlanAction& action, Filesystem& fs) + Path export_real_package(const Path& ifw_packages_dir_path, + const ExportPlanAction& action, + const Filesystem& fs) { const BinaryParagraph& binary_paragraph = action.core_paragraph().value_or_exit(VCPKG_LINE_INFO); @@ -179,7 +181,7 @@ namespace vcpkg::Export::IFW void export_unique_packages(const Path& raw_exported_dir_path, std::map unique_packages, - Filesystem& fs) + const Filesystem& fs) { auto package_xml_dir_path = raw_exported_dir_path / "packages/meta"; auto package_xml_file_path = package_xml_dir_path / "package.xml"; @@ -224,7 +226,7 @@ namespace vcpkg::Export::IFW void export_unique_triplets(const Path& raw_exported_dir_path, std::set unique_triplets, - Filesystem& fs) + const Filesystem& fs) { // triplets @@ -263,7 +265,7 @@ namespace vcpkg::Export::IFW } } - void export_integration(const Path& raw_exported_dir_path, Filesystem& fs) + void export_integration(const Path& raw_exported_dir_path, const Filesystem& fs) { // integration auto package_xml_dir_path = raw_exported_dir_path / "integration/meta"; @@ -284,7 +286,7 @@ namespace vcpkg::Export::IFW void export_config(const std::string& export_id, const Options& ifw_options, const VcpkgPaths& paths) { - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); const auto config_xml_file_path = get_config_file_path(export_id, ifw_options, paths); fs.create_directories(config_xml_file_path.parent_path(), VCPKG_LINE_INFO); @@ -319,7 +321,7 @@ namespace vcpkg::Export::IFW { msg::println(msgExportingMaintenanceTool); - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); const Path& installerbase_exe = paths.get_tool_exe(Tools::IFW_INSTALLER_BASE, stdout_sink); auto tempmaintenancetool_dir = ifw_packages_dir_path / "maintenance/data"; @@ -359,7 +361,7 @@ namespace vcpkg::Export::IFW const auto repository_dir = get_repository_dir_path(export_id, ifw_options, paths); msg::println(msgGeneratingRepo, msg::path = repository_dir); - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); fs.remove_all(repository_dir, VCPKG_LINE_INFO); auto cmd_line = @@ -417,7 +419,7 @@ namespace vcpkg::Export::IFW { std::error_code ec; Path failure_point; - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); // Prepare packages directory const auto ifw_packages_dir_path = get_packages_dir_path(export_id, ifw_options, paths); diff --git a/src/vcpkg/export.prefab.cpp b/src/vcpkg/export.prefab.cpp index 4954d7ee84..c202b5a176 100644 --- a/src/vcpkg/export.prefab.cpp +++ b/src/vcpkg/export.prefab.cpp @@ -7,21 +7,21 @@ #include #include -#include #include +#include +#include #include -#include +#include #include -#include #include #include #include -namespace vcpkg::Export::Prefab +namespace vcpkg::Prefab { static std::vector find_modules(const VcpkgPaths& system, const Path& root, const std::string& ext) { - Filesystem& fs = system.get_filesystem(); + const Filesystem& fs = system.get_filesystem(); std::error_code ec; auto paths = fs.get_regular_files_recursive(root, ec); if (ec) @@ -261,7 +261,7 @@ namespace vcpkg::Export::Prefab VCPKG_LINE_INFO, is_supported(*build_info), msgExportPrefabRequiresAndroidTriplet); } - std::vector available_triplets = paths.get_available_triplets(); + const auto& triplet_db = paths.get_triplet_db(); std::unordered_map required_archs = {{CPUArchitecture::ARM, "armeabi-v7a"}, {CPUArchitecture::ARM64, "arm64-v8a"}, @@ -277,7 +277,7 @@ namespace vcpkg::Export::Prefab std::unordered_map triplet_abi_map; std::unordered_map triplet_api_map; - for (auto& triplet_file : available_triplets) + for (auto& triplet_file : triplet_db.available_triplets) { if (triplet_file.name.size() > 0) { @@ -308,23 +308,23 @@ namespace vcpkg::Export::Prefab Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgMissingAndroidEnv); } - Filesystem& utils = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); const Path ndk_location = android_ndk_home.value_or_exit(VCPKG_LINE_INFO); Checks::msg_check_maybe_upgrade(VCPKG_LINE_INFO, - utils.exists(ndk_location, IgnoreErrors{}), + fs.exists(ndk_location, IgnoreErrors{}), msgMissingAndroidHomeDir, msg::path = ndk_location); const auto source_properties_location = ndk_location / "source.properties"; Checks::msg_check_maybe_upgrade(VCPKG_LINE_INFO, - utils.exists(ndk_location, IgnoreErrors{}), + fs.exists(ndk_location, IgnoreErrors{}), msgAndroidHomeDirMissingProps, - msg::env_var = "ANDROID_NDK_HOME", + msg::env_var = format_environment_variable("ANDROID_NDK_HOME"), msg::path = source_properties_location); - std::string content = utils.read_contents(source_properties_location, VCPKG_LINE_INFO); + std::string content = fs.read_contents(source_properties_location, VCPKG_LINE_INFO); Optional version_opt = find_ndk_version(content); @@ -332,7 +332,7 @@ namespace vcpkg::Export::Prefab NdkVersion version = to_version(version_opt.value_or_exit(VCPKG_LINE_INFO)).value_or_exit(VCPKG_LINE_INFO); - utils.remove_all(paths.prefab, VCPKG_LINE_INFO); + fs.remove_all(paths.prefab, VCPKG_LINE_INFO); /* prefab @@ -373,7 +373,7 @@ namespace vcpkg::Export::Prefab const std::string name = action.spec.name(); auto dependencies = action.dependencies(); - const auto action_build_info = read_build_info(utils, paths.build_info_file_path(action.spec)); + const auto action_build_info = read_build_info(fs, paths.build_info_file_path(action.spec)); const bool is_empty_package = action_build_info.policies.is_enabled(BuildPolicy::EMPTY_PACKAGE); if (is_empty_package) @@ -408,7 +408,7 @@ namespace vcpkg::Export::Prefab auto prefab_directory = package_directory / "prefab"; auto modules_directory = prefab_directory / "modules"; - utils.create_directories(modules_directory, IgnoreErrors{}); + fs.create_directories(modules_directory, IgnoreErrors{}); std::string artifact_id = prefab_options.maybe_artifact_id.value_or(name); std::string group_id = prefab_options.maybe_group_id.value_or("com.vcpkg.ndk.support"); @@ -429,14 +429,14 @@ namespace vcpkg::Export::Prefab auto meta_dir = package_directory / "META-INF"; - utils.create_directories(meta_dir, IgnoreErrors{}); + fs.create_directories(meta_dir, IgnoreErrors{}); const auto share_root = paths.packages() / fmt::format("{}_{}", name, action.spec.triplet()); - utils.copy_file(share_root / "share" / name / "copyright", - meta_dir / "LICENSE", - CopyOptions::overwrite_existing, - IgnoreErrors{}); + fs.copy_file(share_root / "share" / name / "copyright", + meta_dir / "LICENSE", + CopyOptions::overwrite_existing, + IgnoreErrors{}); PackageMetadata pm; pm.name = artifact_id; @@ -496,8 +496,8 @@ namespace vcpkg::Export::Prefab Debug::print(fmt::format("Writing manifest to \n\t{}", manifest_path)); Debug::print(fmt::format("Writing prefab meta data to \n\t{}", prefab_path)); - utils.write_contents(manifest_path, manifest, VCPKG_LINE_INFO); - utils.write_contents(prefab_path, pm.to_json(), VCPKG_LINE_INFO); + fs.write_contents(manifest_path, manifest, VCPKG_LINE_INFO); + fs.write_contents(prefab_path, pm.to_json(), VCPKG_LINE_INFO); std::vector triplet_names; triplet_names.reserve(triplets.size()); @@ -514,7 +514,7 @@ namespace vcpkg::Export::Prefab const auto listfile = paths.installed().vcpkg_dir_info() / fmt::format("{}_{}_{}.list", name, norm_version, triplet); const auto installed_dir = paths.packages() / fmt::format("{}_{}", name, triplet); - if (!(utils.exists(listfile, IgnoreErrors{}))) + if (!(fs.exists(listfile, IgnoreErrors{}))) { msg::println_error(msgCorruptedInstallTree); Checks::exit_fail(VCPKG_LINE_INFO); @@ -543,15 +543,15 @@ namespace vcpkg::Export::Prefab { auto module_dir = modules_directory / name; auto module_libs_dir = module_dir / "libs"; - utils.create_directories(module_libs_dir, IgnoreErrors{}); + fs.create_directories(module_libs_dir, IgnoreErrors{}); auto installed_headers_dir = installed_dir / "include"; auto exported_headers_dir = module_dir / "include"; ModuleMetadata meta; auto module_meta_path = module_dir / "module.json"; - utils.write_contents(module_meta_path, meta.to_json(), VCPKG_LINE_INFO); + fs.write_contents(module_meta_path, meta.to_json(), VCPKG_LINE_INFO); - utils.copy_regular_recursive(installed_headers_dir, exported_headers_dir, VCPKG_LINE_INFO); + fs.copy_regular_recursive(installed_headers_dir, exported_headers_dir, VCPKG_LINE_INFO); break; } else @@ -569,7 +569,7 @@ namespace vcpkg::Export::Prefab ab.ndk = version.major(); Debug::print(fmt::format("Found module {} {}", module_name, ab.abi)); - module_name = Strings::trim(std::move(module_name)); + Strings::inplace_trim(module_name); if (Strings::starts_with(module_name, "lib")) { @@ -577,20 +577,20 @@ namespace vcpkg::Export::Prefab } auto module_dir = modules_directory / module_name; auto module_libs_dir = module_dir / "libs" / fmt::format("android.{}", ab.abi); - utils.create_directories(module_libs_dir, IgnoreErrors{}); + fs.create_directories(module_libs_dir, IgnoreErrors{}); auto abi_path = module_libs_dir / "abi.json"; Debug::print(fmt::format("Writing abi metadata to {}", abi_path)); - utils.write_contents(abi_path, ab.to_string(), VCPKG_LINE_INFO); + fs.write_contents(abi_path, ab.to_string(), VCPKG_LINE_INFO); auto installed_module_path = libs / module.filename(); auto exported_module_path = module_libs_dir / module.filename(); - utils.copy_file(installed_module_path, - exported_module_path, - CopyOptions::overwrite_existing, - IgnoreErrors{}); + fs.copy_file(installed_module_path, + exported_module_path, + CopyOptions::overwrite_existing, + IgnoreErrors{}); Debug::print( "Copying libraries...\nFrom {}\nTo {}", installed_module_path, exported_module_path); @@ -598,13 +598,13 @@ namespace vcpkg::Export::Prefab auto exported_headers_dir = module_libs_dir / "include"; Debug::print("Copying headers...\nFrom {}\nTo {}", installed_headers_dir, exported_headers_dir); - utils.copy_regular_recursive(installed_headers_dir, exported_headers_dir, VCPKG_LINE_INFO); + fs.copy_regular_recursive(installed_headers_dir, exported_headers_dir, VCPKG_LINE_INFO); ModuleMetadata meta; auto module_meta_path = module_dir / "module.json"; Debug::print(fmt::format("Writing module metadata to {}", module_meta_path)); - utils.write_contents(module_meta_path, meta.to_json(), VCPKG_LINE_INFO); + fs.write_contents(module_meta_path, meta.to_json(), VCPKG_LINE_INFO); } } } @@ -615,8 +615,10 @@ namespace vcpkg::Export::Prefab Debug::print( fmt::format("Exporting AAR and POM\n\tAAR path {}\n\tPOM path {}", exported_archive_path, pom_path)); - auto compress_result = compress_directory_to_zip( - paths.get_filesystem(), paths.get_tool_cache(), stdout_sink, package_directory, exported_archive_path); + auto zip = ZipTool::make(paths.get_tool_cache(), stdout_sink).value_or_exit(VCPKG_LINE_INFO); + + auto compress_result = + zip.compress_directory_to_zip(paths.get_filesystem(), package_directory, exported_archive_path); if (!compress_result) { Checks::msg_exit_with_message( @@ -647,7 +649,7 @@ namespace vcpkg::Export::Prefab Strings::inplace_replace_all(pom, "@DEPENDENCIES@", Strings::join("\n", pom_dependencies)); Strings::inplace_replace_all(pom, "@VERSION@", norm_version); - utils.write_contents(pom_path, pom, VCPKG_LINE_INFO); + fs.write_contents(pom_path, pom, VCPKG_LINE_INFO); if (prefab_options.enable_maven) { diff --git a/src/vcpkg/help.cpp b/src/vcpkg/help.cpp deleted file mode 100644 index ce9c40d11b..0000000000 --- a/src/vcpkg/help.cpp +++ /dev/null @@ -1,193 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace vcpkg::Help -{ - struct Topic - { - using topic_function = void (*)(const VcpkgPaths& paths); - - constexpr Topic(StringLiteral n, topic_function fn) : name(n), print(fn) { } - - StringLiteral name; - topic_function print; - }; - - template - static void command_topic_fn(const VcpkgPaths&) - { - print_usage(S); - } - - static void integrate_topic_fn(const VcpkgPaths&) { msg::println(Commands::Integrate::get_helpstring()); } - - static void help_topics(const VcpkgPaths&); - - const CommandStructure COMMAND_STRUCTURE = { - [] { return create_example_string("help"); }, - 0, - 1, - {}, - nullptr, - }; - - static void help_topic_versioning(const VcpkgPaths&) - { - HelpTableFormatter tbl; - tbl.text(msg::format(msgHelpVersioning)); - tbl.blank(); - tbl.blank(); - tbl.header(msg::format(msgHelpVersionSchemes)); - tbl.format("version", msg::format(msgHelpVersionScheme)); - tbl.format("version-date", msg::format(msgHelpVersionDateScheme)); - tbl.format("version-semver", msg::format(msgHelpVersionSemverScheme)); - tbl.format("version-string", msg::format(msgHelpVersionStringScheme)); - tbl.blank(); - tbl.text(msg::format(msgHelpPortVersionScheme)); - tbl.blank(); - tbl.blank(); - tbl.header(msg::format(msgHelpManifestConstraints)); - tbl.format("builtin-baseline", msg::format(msgHelpBuiltinBase)); - tbl.blank(); - tbl.format("version>=", msg::format(msgHelpVersionGreater)); - tbl.blank(); - tbl.format("overrides", msg::format(msgHelpOverrides)); - tbl.blank(); - tbl.text(msg::format(msgHelpMinVersion)); - tbl.blank(); - tbl.text(msg::format(msgHelpUpdateBaseline)); - tbl.blank(); - tbl.text(msg::format(msgHelpPackagePublisher)); - tbl.blank(); - tbl.text(msg::format(msgHelpExampleManifest)); - tbl.blank(); - tbl.text(R"({ - "name": "example", - "version": "1.0", - "builtin-baseline": "a14a6bcb27287e3ec138dba1b948a0cdbc337a3a", - "dependencies": [ - { "name": "zlib", "version>=": "1.2.11#8" }, - "rapidjson" - ], - "overrides": [ - { "name": "rapidjson", "version": "2020-09-14" } - ] -})"); - msg::write_unlocalized_text_to_stdout(Color::none, tbl.m_str); - msg::println(msgExtendedDocumentationAtUrl, msg::url = docs::versioning_url); - } - - static constexpr std::array topics = {{ - {"assetcaching", [](const VcpkgPaths&) { msg::println(format_help_topic_asset_caching()); }}, - {"binarycaching", [](const VcpkgPaths&) { msg::println(format_help_topic_binary_caching()); }}, - {"create", command_topic_fn}, - {"depend-info", command_topic_fn}, - {"edit", command_topic_fn}, - {"env", command_topic_fn}, - {"export", command_topic_fn}, - {"help", command_topic_fn}, - {"install", command_topic_fn}, - {"integrate", integrate_topic_fn}, - {"list", command_topic_fn}, - {"owns", command_topic_fn}, - {"remove", command_topic_fn}, - {"search", command_topic_fn}, - {"topics", help_topics}, - {"triplet", help_topic_valid_triplet}, - {"versioning", help_topic_versioning}, - }}; - - static void help_topics(const VcpkgPaths&) - { - auto msg = msg::format(msgAvailableHelpTopics); - for (auto topic : topics) - { - msg.append_raw(fmt::format("\n {}", topic.name)); - } - msg::println(msg); - } - - void help_topic_valid_triplet(const VcpkgPaths& paths) - { - std::map> triplets_per_location; - vcpkg::Util::group_by(paths.get_available_triplets(), - &triplets_per_location, - [](const TripletFile& triplet_file) -> StringView { return triplet_file.location; }); - - msg::println(msgAvailableArchitectureTriplets); - msg::println(msgBuiltInTriplets); - for (auto* triplet : triplets_per_location[paths.triplets]) - { - msg::write_unlocalized_text_to_stdout(Color::none, fmt::format(" {}\n", triplet->name)); - } - - triplets_per_location.erase(paths.triplets); - msg::println(msgCommunityTriplets); - for (auto* triplet : triplets_per_location[paths.community_triplets]) - { - msg::write_unlocalized_text_to_stdout(Color::none, fmt::format(" {}\n", triplet->name)); - } - - triplets_per_location.erase(paths.community_triplets); - for (auto&& kv_pair : triplets_per_location) - { - msg::println(msgOverlayTriplets, msg::path = kv_pair.first); - for (auto* triplet : kv_pair.second) - { - msg::write_unlocalized_text_to_stdout(Color::none, fmt::format(" {}\n", triplet->name)); - } - } - } - - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) - { - const auto parsed = args.parse_arguments(COMMAND_STRUCTURE); - - if (parsed.command_arguments.empty()) - { - print_command_list_usage(); - Checks::exit_success(VCPKG_LINE_INFO); - } - const auto& topic = parsed.command_arguments[0]; - if (topic == "triplets" || topic == "triple") - { - help_topic_valid_triplet(paths); - get_global_metrics_collector().track_string(StringMetric::CommandContext, topic); - Checks::exit_success(VCPKG_LINE_INFO); - } - - auto it_topic = Util::find_if(topics, [&](const Topic& t) { return t.name == topic; }); - if (it_topic != topics.end()) - { - it_topic->print(paths); - get_global_metrics_collector().track_string(StringMetric::CommandContext, it_topic->name); - Checks::exit_success(VCPKG_LINE_INFO); - } - - msg::println_error(msgUnknownTopic, msg::value = topic); - help_topics(paths); - get_global_metrics_collector().track_string(StringMetric::CommandContext, "unknown"); - Checks::exit_fail(VCPKG_LINE_INFO); - } - - void HelpCommand::perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) const - { - Help::perform_and_exit(args, paths); - } -} diff --git a/src/vcpkg/input.cpp b/src/vcpkg/input.cpp index 89bf9da938..f0c1e9285c 100644 --- a/src/vcpkg/input.cpp +++ b/src/vcpkg/input.cpp @@ -1,61 +1,114 @@ + +#include +#include #include +#include -#include -#include +#include #include -#include #include -#include + +#include +#include namespace vcpkg { - PackageSpec check_and_get_package_spec(std::string&& spec_string, - Triplet default_triplet, - const LocalizedString& example_text, - const VcpkgPaths& paths) + PackageSpec parse_package_spec(StringView spec_string, + Triplet default_triplet, + bool& default_triplet_used, + const LocalizedString& example_text) { - const std::string as_lowercase = Strings::ascii_to_lowercase(std::move(spec_string)); + auto maybe_qualified_specifier = parse_qualified_specifier(Strings::ascii_to_lowercase(spec_string)); + if (auto qualified_specifier = maybe_qualified_specifier.get()) + { + auto expected_spec = qualified_specifier->to_package_spec(default_triplet, default_triplet_used); + if (auto spec = expected_spec.get()) + { + return std::move(*spec); + } - auto expected_spec = - parse_qualified_specifier(as_lowercase).then(&ParsedQualifiedSpecifier::to_package_spec, default_triplet); - if (auto spec = expected_spec.get()) + msg::println(Color::error, expected_spec.error()); + } + else { - check_triplet(spec->triplet(), paths); - return std::move(*spec); + msg::println(Color::error, maybe_qualified_specifier.error()); } - // Intentionally show the lowercased string - msg::println(Color::error, expected_spec.error()); msg::println(Color::none, example_text); Checks::exit_fail(VCPKG_LINE_INFO); } - void check_triplet(Triplet t, const VcpkgPaths& paths) + void check_triplet(StringView name, const TripletDatabase& database) { - if (!paths.is_valid_triplet(t)) + // Intentionally show the lowercased string + auto as_lower = Strings::ascii_to_lowercase(name); + if (!database.is_valid_triplet_canonical_name(as_lower)) { - msg::println_error(msgInvalidTriplet, msg::triplet = t); - Help::help_topic_valid_triplet(paths); + msg::println_error(msgInvalidTriplet, msg::triplet = as_lower); + help_topic_valid_triplet(database); Checks::exit_fail(VCPKG_LINE_INFO); } } - FullPackageSpec check_and_get_full_package_spec(std::string&& full_package_spec_as_string, + PackageSpec check_and_get_package_spec(StringView spec_string, + Triplet default_triplet, + bool& default_triplet_used, + const LocalizedString& example_text, + const TripletDatabase& database) + { + auto maybe_qualified_specifier = parse_qualified_specifier(Strings::ascii_to_lowercase(spec_string)); + if (auto qualified_specifier = maybe_qualified_specifier.get()) + { + if (auto specified_triplet = qualified_specifier->triplet.get()) + { + check_triplet(*specified_triplet, database); + } + + auto expected_spec = qualified_specifier->to_package_spec(default_triplet, default_triplet_used); + if (auto spec = expected_spec.get()) + { + return std::move(*spec); + } + + msg::println(Color::error, expected_spec.error()); + } + else + { + msg::println(Color::error, maybe_qualified_specifier.error()); + } + + msg::println(Color::none, example_text); + Checks::exit_fail(VCPKG_LINE_INFO); + } + + FullPackageSpec check_and_get_full_package_spec(StringView spec_string, Triplet default_triplet, + bool& default_triplet_used, const LocalizedString& example_text, - const VcpkgPaths& paths) + const TripletDatabase& database) { - const std::string as_lowercase = Strings::ascii_to_lowercase(std::move(full_package_spec_as_string)); - auto expected_spec = parse_qualified_specifier(as_lowercase) - .then(&ParsedQualifiedSpecifier::to_full_spec, default_triplet, ImplicitDefault::YES); - if (const auto spec = expected_spec.get()) + auto maybe_qualified_specifier = parse_qualified_specifier(Strings::ascii_to_lowercase(spec_string)); + if (auto qualified_specifier = maybe_qualified_specifier.get()) + { + if (auto specified_triplet = qualified_specifier->triplet.get()) + { + check_triplet(*specified_triplet, database); + } + + auto expected_spec = + qualified_specifier->to_full_spec(default_triplet, default_triplet_used, ImplicitDefault::YES); + if (auto spec = expected_spec.get()) + { + return std::move(*spec); + } + + msg::println(Color::error, expected_spec.error()); + } + else { - check_triplet(spec->package_spec.triplet(), paths); - return *spec; + msg::println(Color::error, maybe_qualified_specifier.error()); } - // Intentionally show the lowercased string - msg::println(Color::error, expected_spec.error()); msg::println(Color::none, example_text); Checks::exit_fail(VCPKG_LINE_INFO); } diff --git a/src/vcpkg/metrics.cpp b/src/vcpkg/metrics.cpp index 40ef200316..bcb25447bc 100644 --- a/src/vcpkg/metrics.cpp +++ b/src/vcpkg/metrics.cpp @@ -133,9 +133,13 @@ namespace vcpkg {StringMetric::CommandName, "command_name", "z-preregister-telemetry"}, {StringMetric::DeploymentKind, "deployment_kind", "Git"}, {StringMetric::DetectedCiEnvironment, "detected_ci_environment", "Generic"}, + {StringMetric::CiProjectId, "ci_project_id", "0"}, + {StringMetric::CiOwnerId, "ci_owner_id", "0"}, // spec:triplet:version,... {StringMetric::InstallPlan_1, "installplan_1", plan_example}, {StringMetric::ListFile, "listfile", "update to new format"}, + // hashed list of parent process names ;-separated (parent_process;grandparent_process;...) + {StringMetric::ProcessTree, "process_tree", "0000000011111111aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffff"}, {StringMetric::RegistriesDefaultRegistryKind, "registries-default-registry-kind", "builtin-files"}, {StringMetric::RegistriesKindsUsed, "registries-kinds-used", "git,filesystem"}, {StringMetric::Title, "title", "title"}, @@ -146,8 +150,10 @@ namespace vcpkg const constexpr std::array(BoolMetric::COUNT)> all_bool_metrics{{ {BoolMetric::DetectedContainer, "detected_container"}, + {BoolMetric::DependencyGraphSuccess, "dependency-graph-success"}, {BoolMetric::FeatureFlagBinaryCaching, "feature-flag-binarycaching"}, {BoolMetric::FeatureFlagCompilerTracking, "feature-flag-compilertracking"}, + {BoolMetric::FeatureFlagDependencyGraph, "feature-flag-dependency-graph"}, {BoolMetric::FeatureFlagManifests, "feature-flag-manifests"}, {BoolMetric::FeatureFlagRegistries, "feature-flag-registries"}, {BoolMetric::FeatureFlagVersions, "feature-flag-versions"}, @@ -282,7 +288,7 @@ namespace vcpkg return ret; } - void MetricsUserConfig::try_write(Filesystem& fs) const + void MetricsUserConfig::try_write(const Filesystem& fs) const { const auto& maybe_user_dir = get_user_configuration_home(); if (auto p_user_dir = maybe_user_dir.get()) @@ -328,7 +334,7 @@ namespace vcpkg return ret; } - MetricsUserConfig try_read_metrics_user(const Filesystem& fs) + MetricsUserConfig try_read_metrics_user(const ReadOnlyFilesystem& fs) { const auto& maybe_user_dir = get_user_configuration_home(); if (auto p_user_dir = maybe_user_dir.get()) @@ -368,6 +374,12 @@ namespace vcpkg result.os_version.append(get_os_version_string()); result.session_id = generate_random_UUID(); + + std::vector process_list; + get_parent_process_list(process_list); + result.parent_process_list = Strings::join( + ";", process_list, [](auto&& s) { return Hash::get_string_sha256(Strings::ascii_to_lowercase(s)); }); + return result; } @@ -443,6 +455,9 @@ namespace vcpkg measurements.insert_or_replace("elapsed_us", Json::Value::number(submission.elapsed_us)); } + properties.insert_or_replace(get_metric_name(StringMetric::ProcessTree, all_string_metrics), + Json::Value::string(session.parent_process_list)); + return Json::stringify(arr); } @@ -549,7 +564,7 @@ namespace vcpkg } #endif // ^^^ _WIN32 - void flush_global_metrics(Filesystem& fs) + void flush_global_metrics(const Filesystem& fs) { if (!g_metrics_enabled.load()) { @@ -589,7 +604,7 @@ namespace vcpkg if (ec) return; Command builder; builder.string_arg(temp_folder_path_exe); - builder.string_arg("x-upload-metrics"); + builder.string_arg("z-upload-metrics"); builder.string_arg(vcpkg_metrics_txt_path); cmd_execute_background(builder); #else diff --git a/src/vcpkg/packagespec.cpp b/src/vcpkg/packagespec.cpp index 765ce14bfa..e0358f9b4a 100644 --- a/src/vcpkg/packagespec.cpp +++ b/src/vcpkg/packagespec.cpp @@ -7,6 +7,23 @@ #include #include +namespace +{ + using namespace vcpkg; + Triplet resolve_triplet(const Optional& specified_triplet, + Triplet default_triplet, + bool& default_triplet_used) + { + if (auto pspecified = specified_triplet.get()) + { + return Triplet::from_canonical_name(*pspecified); + } + + default_triplet_used = true; + return default_triplet; + } +} // unnamed namespace + namespace vcpkg { std::string FeatureSpec::to_string() const @@ -26,6 +43,32 @@ namespace vcpkg return fmt::format("{}[{}]", package_name, feature_name); } + bool InternalFeatureSet::empty_or_only_core() const { return empty() || (size() == 1 && *begin() == "core"); } + + InternalFeatureSet internalize_feature_list(View fs, ImplicitDefault id) + { + InternalFeatureSet ret; + bool core = false; + for (auto&& f : fs) + { + if (f == "core") + { + core = true; + } + ret.emplace_back(f); + } + + if (!core) + { + ret.emplace_back("core"); + if (id == ImplicitDefault::YES) + { + ret.emplace_back("default"); + } + } + return ret; + } + void FullPackageSpec::expand_fspecs_to(std::vector& out) const { for (auto&& feature : features) @@ -51,55 +94,39 @@ namespace vcpkg return left.name() == right.name() && left.triplet() == right.triplet(); } - static InternalFeatureSet normalize_feature_list(View fs, ImplicitDefault id) + ExpectedL ParsedQualifiedSpecifier::to_full_spec(Triplet default_triplet, + bool& default_triplet_used, + ImplicitDefault id) const { - InternalFeatureSet ret; - bool core = false; - for (auto&& f : fs) - { - if (f == "core") - { - core = true; - } - ret.emplace_back(f); - } - - if (!core) + if (platform) { - ret.emplace_back("core"); - if (id == ImplicitDefault::YES) - { - ret.emplace_back("default"); - } + return msg::format_error(msgIllegalPlatformSpec); } - return ret; - } - ExpectedL ParsedQualifiedSpecifier::to_full_spec(Triplet default_triplet, ImplicitDefault id) const - { - if (platform) + View fs{}; + if (auto pfeatures = features.get()) { - return msg::format_error(msgIllegalPlatformSpec); + fs = *pfeatures; } - const Triplet t = triplet ? Triplet::from_canonical_name(*triplet.get()) : default_triplet; - const View fs = !features.get() ? View{} : *features.get(); - return FullPackageSpec{{name, t}, normalize_feature_list(fs, id)}; + return FullPackageSpec{{name, resolve_triplet(triplet, default_triplet, default_triplet_used)}, + internalize_feature_list(fs, id)}; } - ExpectedL ParsedQualifiedSpecifier::to_package_spec(Triplet default_triplet) const + ExpectedL ParsedQualifiedSpecifier::to_package_spec(Triplet default_triplet, + bool& default_triplet_used) const { if (platform) { return msg::format_error(msgIllegalPlatformSpec); } + if (features) { return msg::format_error(msgIllegalFeatures); } - const Triplet t = triplet ? Triplet::from_canonical_name(*triplet.get()) : default_triplet; - return PackageSpec{name, t}; + return PackageSpec{name, resolve_triplet(triplet, default_triplet, default_triplet_used)}; } ExpectedL parse_qualified_specifier(StringView input) @@ -256,52 +283,4 @@ namespace vcpkg parser.skip_tabs_spaces(); return ret; } - - bool operator==(const DependencyConstraint& lhs, const DependencyConstraint& rhs) - { - if (lhs.type != rhs.type) return false; - if (lhs.value != rhs.value) return false; - return lhs.port_version == rhs.port_version; - } - - Optional DependencyConstraint::try_get_minimum_version() const - { - if (type == VersionConstraintKind::None) - { - return nullopt; - } - - return Version{ - value, - port_version, - }; - } - - FullPackageSpec Dependency::to_full_spec(Triplet target, Triplet host_triplet, ImplicitDefault id) const - { - return FullPackageSpec{{name, host ? host_triplet : target}, normalize_feature_list(features, id)}; - } - - bool operator==(const Dependency& lhs, const Dependency& rhs) - { - if (lhs.name != rhs.name) return false; - if (lhs.features != rhs.features) return false; - if (!structurally_equal(lhs.platform, rhs.platform)) return false; - if (lhs.extra_info != rhs.extra_info) return false; - if (lhs.constraint != rhs.constraint) return false; - if (lhs.host != rhs.host) return false; - - return true; - } - bool operator!=(const Dependency& lhs, const Dependency& rhs); - - bool operator==(const DependencyOverride& lhs, const DependencyOverride& rhs) - { - if (lhs.version_scheme != rhs.version_scheme) return false; - if (lhs.port_version != rhs.port_version) return false; - if (lhs.name != rhs.name) return false; - if (lhs.version != rhs.version) return false; - return lhs.extra_info == rhs.extra_info; - } - bool operator!=(const DependencyOverride& lhs, const DependencyOverride& rhs); } diff --git a/src/vcpkg/paragraphs.cpp b/src/vcpkg/paragraphs.cpp index ea9ebaf806..9a23b31861 100644 --- a/src/vcpkg/paragraphs.cpp +++ b/src/vcpkg/paragraphs.cpp @@ -13,6 +13,8 @@ #include #include +#include + static std::atomic g_load_ports_stats(0); namespace vcpkg @@ -79,6 +81,19 @@ namespace vcpkg return result; } + LocalizedString ToLocalizedString_t::operator()(std::unique_ptr p) const + { + return LocalizedString::from_raw(p->to_string()); + } + + std::unique_ptr ParseControlErrorInfo::from_error(StringView name, LocalizedString&& ls) + { + auto error_info = std::make_unique(); + error_info->name.assign(name.data(), name.size()); + error_info->error = std::move(ls); + return error_info; + } + static Optional> remove_field(Paragraph* fields, StringView fieldname) { auto it = fields->find(fieldname.to_string()); @@ -198,7 +213,19 @@ namespace vcpkg loc); return nullopt; } - return Dependency{pqs.name, pqs.features.value_or({}), pqs.platform.value_or({})}; + Dependency dependency{pqs.name, {}, pqs.platform.value_or({})}; + for (const auto& feature : pqs.features.value_or({})) + { + if (feature == "core") + { + dependency.default_features = false; + } + else + { + dependency.features.push_back({feature}); + } + } + return dependency; }); }); if (!opt) return {LocalizedString::from_raw(parser.get_error()->to_string()), expected_right_tag}; @@ -272,8 +299,7 @@ namespace vcpkg::Paragraphs skip_whitespace(); while (!at_eof()) { - paragraphs.emplace_back(); - get_paragraph(paragraphs.back()); + get_paragraph(paragraphs.emplace_back()); match_while(is_lineend); } if (get_error()) return LocalizedString::from_raw(get_error()->to_string()); @@ -319,7 +345,7 @@ namespace vcpkg::Paragraphs }); } - ExpectedL get_single_paragraph(const Filesystem& fs, const Path& control_path) + ExpectedL get_single_paragraph(const ReadOnlyFilesystem& fs, const Path& control_path) { std::error_code ec; std::string contents = fs.read_contents(control_path, ec); @@ -331,7 +357,7 @@ namespace vcpkg::Paragraphs return parse_single_paragraph(contents, control_path); } - ExpectedL> get_paragraphs(const Filesystem& fs, const Path& control_path) + ExpectedL> get_paragraphs(const ReadOnlyFilesystem& fs, const Path& control_path) { std::error_code ec; std::string contents = fs.read_contents(control_path, ec); @@ -348,42 +374,36 @@ namespace vcpkg::Paragraphs return PghParser(str, origin).get_paragraphs(); } - bool is_port_directory(const Filesystem& fs, const Path& maybe_directory) + bool is_port_directory(const ReadOnlyFilesystem& fs, const Path& maybe_directory) { return fs.exists(maybe_directory / "CONTROL", IgnoreErrors{}) || fs.exists(maybe_directory / "vcpkg.json", IgnoreErrors{}); } - static ParseExpected try_load_manifest_text(const std::string& text, - StringView origin, - MessageSink& warning_sink) + static ExpectedL> try_load_manifest_text(const std::string& text, + StringView origin, + MessageSink& warning_sink) { auto res = Json::parse(text, origin); - LocalizedString error; if (auto val = res.get()) { if (val->value.is_object()) { return SourceControlFile::parse_port_manifest_object( - origin, val->value.object(VCPKG_LINE_INFO), warning_sink); + origin, val->value.object(VCPKG_LINE_INFO), warning_sink) + .map_error(ToLocalizedString); } - error = msg::format(msgJsonValueNotObject); + return msg::format(msgJsonValueNotObject); } - else - { - error = LocalizedString::from_raw(res.error()->to_string()); - } - auto error_info = std::make_unique(); - error_info->name = origin.to_string(); - error_info->error = std::move(error); - return error_info; + + return LocalizedString::from_raw(res.error()->to_string()); } - ParseExpected try_load_port_text(const std::string& text, - StringView origin, - bool is_manifest, - MessageSink& warning_sink) + ExpectedL> try_load_port_text(const std::string& text, + StringView origin, + bool is_manifest, + MessageSink& warning_sink) { StatsTimer timer(g_load_ports_stats); @@ -392,91 +412,87 @@ namespace vcpkg::Paragraphs return try_load_manifest_text(text, origin, warning_sink); } - ExpectedL> pghs = parse_paragraphs(StringView{text}, origin); + auto pghs = parse_paragraphs(StringView{text}, origin); if (auto vector_pghs = pghs.get()) { - return SourceControlFile::parse_control_file(origin, std::move(*vector_pghs)); + return SourceControlFile::parse_control_file(origin, std::move(*vector_pghs)).map_error(ToLocalizedString); } - auto error_info = std::make_unique(); - error_info->name = origin.to_string(); - error_info->error = pghs.error(); - return error_info; + + return std::move(pghs).error(); } - ParseExpected try_load_port(const Filesystem& fs, const Path& port_directory) + ExpectedL> try_load_port(const ReadOnlyFilesystem& fs, + StringView port_name, + const Path& port_directory) { StatsTimer timer(g_load_ports_stats); const auto manifest_path = port_directory / "vcpkg.json"; const auto control_path = port_directory / "CONTROL"; - const auto port_name = port_directory.filename().to_string(); std::error_code ec; auto manifest_contents = fs.read_contents(manifest_path, ec); if (ec) { - if (fs.exists(manifest_path, IgnoreErrors{})) + const auto exists = ec != std::errc::no_such_file_or_directory; + if (exists) { - auto error_info = std::make_unique(); - error_info->name = port_name; - error_info->error = msg::format_error(msgFailedToParseManifest, msg::path = manifest_path); - return error_info; + return msg::format_error(msgFailedToParseManifest, msg::path = manifest_path) + .append_raw("\n") + .append(format_filesystem_call_error(ec, "read_contents", {manifest_path})); } - } - else - { - vcpkg::Checks::msg_check_exit(VCPKG_LINE_INFO, - !fs.exists(control_path, IgnoreErrors{}), - msgManifestConflict, - msg::path = port_directory); - return try_load_manifest_text(manifest_contents, manifest_path, stdout_sink); - } + if (fs.exists(control_path, IgnoreErrors{})) + { + return get_paragraphs(fs, control_path).then([&](std::vector&& vector_pghs) { + return SourceControlFile::parse_control_file(control_path, std::move(vector_pghs)) + .map_error(ToLocalizedString); + }); + } - if (fs.exists(control_path, IgnoreErrors{})) - { - ExpectedL> pghs = get_paragraphs(fs, control_path); - if (auto vector_pghs = pghs.get()) + if (fs.exists(port_directory, IgnoreErrors{})) { - return SourceControlFile::parse_control_file(control_path, std::move(*vector_pghs)); + return msg::format_error( + msgPortMissingManifest, msg::package_name = port_name, msg::path = port_directory); } - auto error_info = std::make_unique(); - error_info->name = port_name; - error_info->error = pghs.error(); - return error_info; - } - auto error_info = std::make_unique(); - error_info->name = port_name; - if (fs.exists(port_directory, IgnoreErrors{})) - { - error_info->error = - msg::format_error(msgPortMissingManifest, msg::package_name = port_name, msg::path = port_directory); + return std::unique_ptr(); } - else + + if (fs.exists(control_path, IgnoreErrors{})) { - error_info->error = msg::format_error(msgPortDoesNotExist, msg::package_name = port_name); + return msg::format_error(msgManifestConflict, msg::path = port_directory); } - return error_info; + return try_load_manifest_text(manifest_contents, manifest_path, stdout_sink); } - ExpectedL try_load_cached_package(const Filesystem& fs, + ExpectedL> try_load_port_required(const ReadOnlyFilesystem& fs, + StringView port_name, + const Path& port_directory) + { + return try_load_port(fs, port_name, port_directory) + .then([&](std::unique_ptr&& loaded) -> ExpectedL> { + if (!loaded) + { + return msg::format_error(msgPortDoesNotExist, msg::package_name = port_name); + } + + return std::move(loaded); + }); + } + + ExpectedL try_load_cached_package(const ReadOnlyFilesystem& fs, const Path& package_dir, const PackageSpec& spec) { StatsTimer timer(g_load_ports_stats); - ExpectedL> pghs = get_paragraphs(fs, package_dir / "CONTROL"); - - if (auto p = pghs.get()) + ExpectedL> maybe_paragraphs = get_paragraphs(fs, package_dir / "CONTROL"); + if (auto pparagraphs = maybe_paragraphs.get()) { + auto& paragraphs = *pparagraphs; BinaryControlFile bcf; - bcf.core_paragraph = BinaryParagraph(p->front()); - p->erase(p->begin()); - - bcf.features = - Util::fmap(*p, [&](auto&& raw_feature) -> BinaryParagraph { return BinaryParagraph(raw_feature); }); - + bcf.core_paragraph = BinaryParagraph(std::move(paragraphs[0])); if (bcf.core_paragraph.spec != spec) { return msg::format(msgMismatchedSpec, @@ -485,33 +501,25 @@ namespace vcpkg::Paragraphs msg::actual = bcf.core_paragraph.spec); } + bcf.features.reserve(paragraphs.size() - 1); + for (std::size_t idx = 1; idx < paragraphs.size(); ++idx) + { + bcf.features.emplace_back(BinaryParagraph{std::move(paragraphs[idx])}); + } + return bcf; } - return pghs.error(); + return maybe_paragraphs.error(); } - LoadResults try_load_all_registry_ports(const Filesystem& fs, const RegistrySet& registries) + LoadResults try_load_all_registry_ports(const ReadOnlyFilesystem& fs, const RegistrySet& registries) { LoadResults ret; - - std::vector ports; - - for (const auto& registry : registries.registries()) - { - const auto packages = registry.packages(); - ports.insert(end(ports), begin(packages), end(packages)); - } - if (auto registry = registries.default_registry()) - { - registry->get_all_port_names(ports); - } - - Util::sort_unique_erase(ports); - + std::vector ports = registries.get_all_reachable_port_names().value_or_exit(VCPKG_LINE_INFO); for (const auto& port_name : ports) { - auto impl = registries.registry_for_port(port_name); + const auto impl = registries.registry_for_port(port_name); if (!impl) { // this is a port for which no registry is set @@ -520,24 +528,30 @@ namespace vcpkg::Paragraphs continue; } - const auto baseline_version = impl->get_baseline_version(port_name); + auto maybe_baseline_version = impl->get_baseline_version(port_name).value_or_exit(VCPKG_LINE_INFO); + auto baseline_version = maybe_baseline_version.get(); if (!baseline_version) continue; // port is attributed to this registry, but it is not in the baseline - const auto port_entry = impl->get_port_entry(port_name); - if (!port_entry) continue; // port is attributed to this registry, but there is no version db - auto port_location = port_entry->get_version(*baseline_version.get()); + auto maybe_port_entry = impl->get_port_entry(port_name); + const auto port_entry = maybe_port_entry.get(); + if (!port_entry) continue; // port is attributed to this registry, but loading it failed + if (!*port_entry) continue; // port is attributed to this registry, but doesn't exist in this registry + auto maybe_port_location = (*port_entry)->get_version(*baseline_version); + const auto port_location = maybe_port_location.get(); if (!port_location) continue; // baseline version was not in version db (registry consistency issue) - auto maybe_spgh = try_load_port(fs, port_location.get()->path); + auto maybe_spgh = try_load_port_required(fs, port_name, port_location->path); if (const auto spgh = maybe_spgh.get()) { ret.paragraphs.push_back({ std::move(*spgh), - std::move(port_location.get()->path), - std::move(port_location.get()->location), + std::move(port_location->path), + std::move(port_location->location), }); } else { - ret.errors.emplace_back(std::move(maybe_spgh).error()); + ret.errors.emplace_back(std::piecewise_construct, + std::forward_as_tuple(port_name.data(), port_name.size()), + std::forward_as_tuple(std::move(maybe_spgh).error())); } } @@ -550,20 +564,26 @@ namespace vcpkg::Paragraphs { if (Debug::g_debugging) { - print_error_message(results.errors); + print_error_message(LocalizedString::from_raw( + Strings::join("\n", + results.errors, + [](const std::pair& err) -> const LocalizedString& { + return err.second; + }))); } else { for (auto&& error : results.errors) { - msg::println_warning(msgErrorWhileParsing, msg::path = error->name); + msg::println_warning(msgErrorWhileParsing, msg::path = error.first); } + msg::println_warning(msgGetParseFailureInfo); } } } - std::vector load_all_registry_ports(const Filesystem& fs, + std::vector load_all_registry_ports(const ReadOnlyFilesystem& fs, const RegistrySet& registries) { auto results = try_load_all_registry_ports(fs, registries); @@ -571,7 +591,7 @@ namespace vcpkg::Paragraphs return std::move(results.paragraphs); } - std::vector load_overlay_ports(const Filesystem& fs, const Path& directory) + std::vector load_overlay_ports(const ReadOnlyFilesystem& fs, const Path& directory) { LoadResults ret; @@ -583,14 +603,17 @@ namespace vcpkg::Paragraphs for (auto&& path : port_dirs) { - auto maybe_spgh = try_load_port(fs, path); + auto port_name = path.filename(); + auto maybe_spgh = try_load_port_required(fs, port_name, path); if (const auto spgh = maybe_spgh.get()) { ret.paragraphs.push_back({std::move(*spgh), std::move(path)}); } else { - ret.errors.emplace_back(std::move(maybe_spgh).error()); + ret.errors.emplace_back(std::piecewise_construct, + std::forward_as_tuple(port_name.data(), port_name.size()), + std::forward_as_tuple(std::move(maybe_spgh).error())); } } diff --git a/src/vcpkg/platform-expression.cpp b/src/vcpkg/platform-expression.cpp index 16418ee50e..26a6b4b231 100644 --- a/src/vcpkg/platform-expression.cpp +++ b/src/vcpkg/platform-expression.cpp @@ -489,6 +489,17 @@ namespace vcpkg::PlatformExpression const Context& context; const std::map& override_ctxt; + bool true_if_exists_and_nonempty(const std::string& variable_name) const + { + auto iter = context.find(variable_name); + if (iter == context.end()) + { + return false; + } + + return !iter->second.empty(); + } + bool true_if_exists_and_equal(const std::string& variable_name, const std::string& value) const { auto iter = context.find(variable_name); @@ -542,9 +553,7 @@ namespace vcpkg::PlatformExpression case Identifier::osx: return true_if_exists_and_equal("VCPKG_CMAKE_SYSTEM_NAME", "Darwin"); case Identifier::uwp: return true_if_exists_and_equal("VCPKG_CMAKE_SYSTEM_NAME", "WindowsStore"); - case Identifier::xbox: - // This identifier is intended to be enabled via VCPKG_DEP_INFO_OVERRIDE_VARS - return false; + case Identifier::xbox: return true_if_exists_and_nonempty("VCPKG_XBOX_CONSOLE_TARGET"); case Identifier::android: return true_if_exists_and_equal("VCPKG_CMAKE_SYSTEM_NAME", "Android"); case Identifier::emscripten: return true_if_exists_and_equal("VCPKG_CMAKE_SYSTEM_NAME", "Emscripten"); diff --git a/src/vcpkg/portfileprovider.cpp b/src/vcpkg/portfileprovider.cpp index 6e39eb0299..472037ed91 100644 --- a/src/vcpkg/portfileprovider.cpp +++ b/src/vcpkg/portfileprovider.cpp @@ -1,4 +1,5 @@ -#include +#include +#include #include #include @@ -20,7 +21,7 @@ namespace { OverlayRegistryEntry(Path&& p, Version&& v) : root(p), version(v) { } - View get_port_versions() const override { return {&version, 1}; } + ExpectedL> get_port_versions() const override { return View{&version, 1}; } ExpectedL get_version(const Version& v) const override { if (v == version) @@ -37,6 +38,8 @@ namespace namespace vcpkg { + PortFileProvider::~PortFileProvider() = default; + MapPortFileProvider::MapPortFileProvider(const std::unordered_map& map) : ports(map) { @@ -54,9 +57,15 @@ namespace vcpkg return Util::fmap(ports, [](auto&& kvpair) -> const SourceControlFileAndLocation* { return &kvpair.second; }); } - PathsPortFileProvider::PathsPortFileProvider(const Filesystem& fs, + IVersionedPortfileProvider::~IVersionedPortfileProvider() = default; + + IBaselineProvider::~IBaselineProvider() = default; + + IOverlayProvider::~IOverlayProvider() = default; + + PathsPortFileProvider::PathsPortFileProvider(const ReadOnlyFilesystem& fs, const RegistrySet& registry_set, - std::unique_ptr&& overlay) + std::unique_ptr&& overlay) : m_baseline(make_baseline_provider(registry_set)) , m_versioned(make_versioned_portfile_provider(fs, registry_set)) , m_overlay(std::move(overlay)) @@ -100,27 +109,32 @@ namespace vcpkg virtual ExpectedL get_baseline_version(StringView port_name) const override { - auto it = m_baseline_cache.find(port_name); - if (it != m_baseline_cache.end()) - { - return it->second; - } - else - { - auto version = registry_set.baseline_for_port(port_name); - m_baseline_cache.emplace(port_name.to_string(), version); - return version; - } + return m_baseline_cache.get_lazy(port_name, [this, port_name]() -> ExpectedL { + auto maybe_maybe_version = registry_set.baseline_for_port(port_name); + auto maybe_version = maybe_maybe_version.get(); + if (!maybe_version) + { + return std::move(maybe_maybe_version).error(); + } + + auto version = maybe_version->get(); + if (!version) + { + return msg::format_error(msgPortNotInBaseline, msg::package_name = port_name); + } + + return std::move(*version); + }); } private: const RegistrySet& registry_set; - mutable std::map, std::less<>> m_baseline_cache; + Cache> m_baseline_cache; }; - struct VersionedPortfileProviderImpl : IVersionedPortfileProvider + struct VersionedPortfileProviderImpl : IFullVersionedPortfileProvider { - VersionedPortfileProviderImpl(const Filesystem& fs, const RegistrySet& rset) + VersionedPortfileProviderImpl(const ReadOnlyFilesystem& fs, const RegistrySet& rset) : m_fs(fs), m_registry_set(rset) { } @@ -159,7 +173,10 @@ namespace vcpkg virtual View get_port_versions(StringView port_name) const override { - return entry(port_name).value_or_exit(VCPKG_LINE_INFO)->get_port_versions(); + return entry(port_name) + .value_or_exit(VCPKG_LINE_INFO) + ->get_port_versions() + .value_or_exit(VCPKG_LINE_INFO); } ExpectedL> load_control_file( @@ -171,7 +188,8 @@ namespace vcpkg auto maybe_path = ent->get()->get_version(version_spec.version); if (auto path = maybe_path.get()) { - auto maybe_control_file = Paragraphs::try_load_port(m_fs, path->path); + auto maybe_control_file = + Paragraphs::try_load_port_required(m_fs, version_spec.port_name, path->path); if (auto scf = maybe_control_file.get()) { auto scf_vspec = scf->get()->to_version_spec(); @@ -185,7 +203,7 @@ namespace vcpkg } else { - return msg::format(msg::msgErrorMessage) + return msg::format(msgErrorMessage) .append(msgVersionSpecMismatch, msg::path = path->path, msg::expected_version = version_spec, @@ -240,7 +258,7 @@ namespace vcpkg } private: - const Filesystem& m_fs; + const ReadOnlyFilesystem& m_fs; const RegistrySet& m_registry_set; mutable std:: unordered_map>, VersionSpecHasher> @@ -248,9 +266,9 @@ namespace vcpkg mutable std::map>, std::less<>> m_entry_cache; }; - struct OverlayProviderImpl : IOverlayProvider + struct OverlayProviderImpl : IFullOverlayProvider { - OverlayProviderImpl(const Filesystem& fs, const Path& original_cwd, View overlay_ports) + OverlayProviderImpl(const ReadOnlyFilesystem& fs, const Path& original_cwd, View overlay_ports) : m_fs(fs), m_overlay_ports(Util::fmap(overlay_ports, [&original_cwd](const std::string& s) -> Path { return original_cwd / s; })) @@ -278,7 +296,7 @@ namespace vcpkg // Try loading individual port if (Paragraphs::is_port_directory(m_fs, ports_dir)) { - auto maybe_scf = Paragraphs::try_load_port(m_fs, ports_dir); + auto maybe_scf = Paragraphs::try_load_port_required(m_fs, port_name, ports_dir); if (auto scfp = maybe_scf.get()) { auto& scf = *scfp; @@ -302,7 +320,7 @@ namespace vcpkg auto ports_spec = ports_dir / port_name; if (Paragraphs::is_port_directory(m_fs, ports_spec)) { - auto found_scf = Paragraphs::try_load_port(m_fs, ports_spec); + auto found_scf = Paragraphs::try_load_port_required(m_fs, port_name, ports_spec); if (auto scfp = found_scf.get()) { auto& scf = *scfp; @@ -310,6 +328,7 @@ namespace vcpkg { return SourceControlFileAndLocation{std::move(scf), std::move(ports_spec)}; } + Checks::msg_exit_maybe_upgrade( VCPKG_LINE_INFO, msg::format(msgFailedToLoadPort, msg::package_name = port_name, msg::path = ports_spec) @@ -352,7 +371,7 @@ namespace vcpkg // Try loading individual port if (Paragraphs::is_port_directory(m_fs, ports_dir)) { - auto maybe_scf = Paragraphs::try_load_port(m_fs, ports_dir); + auto maybe_scf = Paragraphs::try_load_port_required(m_fs, ports_dir.filename(), ports_dir); if (auto scfp = maybe_scf.get()) { SourceControlFileAndLocation scfl{std::move(*scfp), ports_dir}; @@ -384,14 +403,14 @@ namespace vcpkg } private: - const Filesystem& m_fs; + const ReadOnlyFilesystem& m_fs; const std::vector m_overlay_ports; mutable std::map, std::less<>> m_overlay_cache; }; - struct ManifestProviderImpl : IOverlayProvider + struct ManifestProviderImpl : IFullOverlayProvider { - ManifestProviderImpl(const Filesystem& fs, + ManifestProviderImpl(const ReadOnlyFilesystem& fs, const Path& original_cwd, View overlay_ports, const Path& manifest_path, @@ -431,20 +450,20 @@ namespace vcpkg return std::make_unique(registry_set); } - std::unique_ptr make_versioned_portfile_provider(const Filesystem& fs, - const RegistrySet& registry_set) + std::unique_ptr make_versioned_portfile_provider(const ReadOnlyFilesystem& fs, + const RegistrySet& registry_set) { return std::make_unique(fs, registry_set); } - std::unique_ptr make_overlay_provider(const Filesystem& fs, - const Path& original_cwd, - View overlay_ports) + std::unique_ptr make_overlay_provider(const ReadOnlyFilesystem& fs, + const Path& original_cwd, + View overlay_ports) { return std::make_unique(fs, original_cwd, overlay_ports); } - std::unique_ptr make_manifest_provider(const Filesystem& fs, + std::unique_ptr make_manifest_provider(const ReadOnlyFilesystem& fs, const Path& original_cwd, View overlay_ports, const Path& manifest_path, diff --git a/src/vcpkg/postbuildlint.cpp b/src/vcpkg/postbuildlint.cpp index 351c942671..49f46681a1 100644 --- a/src/vcpkg/postbuildlint.cpp +++ b/src/vcpkg/postbuildlint.cpp @@ -2,11 +2,12 @@ #include #include #include +#include #include #include #include -#include +#include #include #include #include @@ -70,7 +71,7 @@ namespace vcpkg #undef OUTDATED_V_NO_120 - static LintStatus check_for_files_in_include_directory(const Filesystem& fs, + static LintStatus check_for_files_in_include_directory(const ReadOnlyFilesystem& fs, const BuildPolicies& policies, const Path& package_dir, MessageSink& msg_sink) @@ -104,7 +105,7 @@ namespace vcpkg return LintStatus::SUCCESS; } - static LintStatus check_for_restricted_include_files(const Filesystem& fs, + static LintStatus check_for_restricted_include_files(const ReadOnlyFilesystem& fs, const BuildPolicies& policies, const Path& package_dir, MessageSink& msg_sink) @@ -183,18 +184,16 @@ namespace vcpkg if (!violations.empty()) { - msg_sink.println_warning(msgPortBugRestrictedHeaderPaths, - msg::env_var = to_cmake_variable(BuildPolicy::ALLOW_RESTRICTED_HEADERS)); - print_paths(violations); - msg_sink.println(msgPortBugRestrictedHeaderPaths, - msg::env_var = to_cmake_variable(BuildPolicy::ALLOW_RESTRICTED_HEADERS)); + msg_sink.println_warning(msgPortBugRestrictedHeaderPaths); + print_paths(msg_sink, violations); + msg_sink.println(msgPortBugRestrictedHeaderPaths); return LintStatus::PROBLEM_DETECTED; } return LintStatus::SUCCESS; } - static LintStatus check_for_files_in_debug_include_directory(const Filesystem& fs, + static LintStatus check_for_files_in_debug_include_directory(const ReadOnlyFilesystem& fs, const Path& package_dir, MessageSink& msg_sink) { @@ -213,7 +212,7 @@ namespace vcpkg return LintStatus::SUCCESS; } - static LintStatus check_for_files_in_debug_share_directory(const Filesystem& fs, + static LintStatus check_for_files_in_debug_share_directory(const ReadOnlyFilesystem& fs, const Path& package_dir, MessageSink& msg_sink) { @@ -227,7 +226,7 @@ namespace vcpkg return LintStatus::SUCCESS; } - static LintStatus check_for_vcpkg_port_config(const Filesystem& fs, + static LintStatus check_for_vcpkg_port_config(const ReadOnlyFilesystem& fs, const BuildPolicies& policies, const Path& package_dir, const PackageSpec& spec, @@ -247,7 +246,7 @@ namespace vcpkg return LintStatus::SUCCESS; } - static LintStatus check_for_usage_forgot_install(const Filesystem& fs, + static LintStatus check_for_usage_forgot_install(const ReadOnlyFilesystem& fs, const Path& port_dir, const Path& package_dir, const PackageSpec& spec, @@ -270,7 +269,7 @@ namespace vcpkg return LintStatus::SUCCESS; } - static LintStatus check_folder_lib_cmake(const Filesystem& fs, + static LintStatus check_folder_lib_cmake(const ReadOnlyFilesystem& fs, const Path& package_dir, const PackageSpec& spec, MessageSink& msg_sink) @@ -285,7 +284,7 @@ namespace vcpkg return LintStatus::SUCCESS; } - static LintStatus check_for_misplaced_cmake_files(const Filesystem& fs, + static LintStatus check_for_misplaced_cmake_files(const ReadOnlyFilesystem& fs, const Path& package_dir, const PackageSpec& spec, MessageSink& msg_sink) @@ -312,14 +311,14 @@ namespace vcpkg if (!misplaced_cmake_files.empty()) { msg_sink.println_warning(msgPortBugMisplacedCMakeFiles, msg::spec = spec.name()); - print_paths(misplaced_cmake_files); + print_paths(msg_sink, misplaced_cmake_files); return LintStatus::PROBLEM_DETECTED; } return LintStatus::SUCCESS; } - static LintStatus check_folder_debug_lib_cmake(const Filesystem& fs, + static LintStatus check_folder_debug_lib_cmake(const ReadOnlyFilesystem& fs, const Path& package_dir, const PackageSpec& spec, MessageSink& msg_sink) @@ -334,7 +333,9 @@ namespace vcpkg return LintStatus::SUCCESS; } - static LintStatus check_for_dlls_in_lib_dir(const Filesystem& fs, const Path& package_dir, MessageSink& msg_sink) + static LintStatus check_for_dlls_in_lib_dir(const ReadOnlyFilesystem& fs, + const Path& package_dir, + MessageSink& msg_sink) { std::vector dlls = fs.get_regular_files_recursive(package_dir / "lib", IgnoreErrors{}); Util::erase_remove_if(dlls, NotExtensionCaseInsensitive{".dll"}); @@ -342,20 +343,20 @@ namespace vcpkg if (!dlls.empty()) { msg_sink.println_warning(msgPortBugDllInLibDir); - print_paths(dlls); + print_paths(msg_sink, dlls); return LintStatus::PROBLEM_DETECTED; } return LintStatus::SUCCESS; } - static LintStatus check_for_copyright_file(const Filesystem& fs, + static LintStatus check_for_copyright_file(const ReadOnlyFilesystem& fs, const PackageSpec& spec, + const Path& package_dir, const VcpkgPaths& paths, MessageSink& msg_sink) { - const auto packages_dir = paths.packages() / spec.dir(); - const auto copyright_file = packages_dir / "share" / spec.name() / "copyright"; + const auto copyright_file = package_dir / "share" / spec.name() / "copyright"; switch (fs.status(copyright_file, IgnoreErrors{})) { @@ -388,27 +389,25 @@ namespace vcpkg if (potential_copyright_files.size() == 1) { // if there is only one candidate, provide the cmake lines needed to place it in the proper location - const auto found_file = potential_copyright_files[0]; + const auto& found_file = potential_copyright_files[0]; auto found_relative_native = found_file.native(); found_relative_native.erase(current_buildtrees_dir.native().size() + 1); // The +1 is needed to remove the "/" const Path relative_path = found_relative_native; msg_sink.print(Color::none, - fmt::format("\n configure_file(\"${{CURRENT_BUILDTREES_DIR}}/{}/{}\" " - "\"${{CURRENT_PACKAGES_DIR}}/share/{}/copyright\" COPYONLY)\n", + fmt::format("\n vcpkg_install_copyright(FILE_LIST \"${{SOURCE_PATH}}/{}/{}\")\n", relative_path.generic_u8string(), - found_file.filename(), - spec.name())); + found_file.filename())); } else if (potential_copyright_files.size() > 1) { msg_sink.println_warning(msgPortBugFoundCopyrightFiles); - print_paths(potential_copyright_files); + print_paths(msg_sink, potential_copyright_files); } return LintStatus::PROBLEM_DETECTED; } - static LintStatus check_for_exes(const Filesystem& fs, const Path& package_dir, MessageSink& msg_sink) + static LintStatus check_for_exes(const ReadOnlyFilesystem& fs, const Path& package_dir, MessageSink& msg_sink) { std::vector exes = fs.get_regular_files_recursive(package_dir / "bin", IgnoreErrors{}); Util::erase_remove_if(exes, NotExtensionCaseInsensitive{".exe"}); @@ -416,7 +415,7 @@ namespace vcpkg if (!exes.empty()) { msg_sink.println_warning(msgPortBugFoundExeInBinDir); - print_paths(exes); + print_paths(msg_sink, exes); return LintStatus::PROBLEM_DETECTED; } @@ -433,7 +432,7 @@ namespace vcpkg std::vector dependencies; }; - static ExpectedL try_load_dll_data(const Filesystem& fs, const Path& path) + static ExpectedL try_load_dll_data(const ReadOnlyFilesystem& fs, const Path& path) { auto maybe_file = fs.try_open_for_read(path); auto file = maybe_file.get(); @@ -485,13 +484,13 @@ namespace vcpkg } static LintStatus check_exports_of_dlls(const BuildPolicies& policies, - const std::vector& dlls, + const std::vector& dlls_data, MessageSink& msg_sink) { if (policies.is_enabled(BuildPolicy::DLLS_WITHOUT_EXPORTS)) return LintStatus::SUCCESS; std::vector dlls_with_no_exports; - for (const PostBuildCheckDllData& dll_data : dlls) + for (const PostBuildCheckDllData& dll_data : dlls_data) { if (!dll_data.has_exports) { @@ -502,15 +501,15 @@ namespace vcpkg if (!dlls_with_no_exports.empty()) { msg_sink.println_warning(msgPortBugSetDllsWithoutExports); - print_paths(dlls_with_no_exports); + print_paths(msg_sink, dlls_with_no_exports); return LintStatus::PROBLEM_DETECTED; } return LintStatus::SUCCESS; } - static LintStatus check_uwp_bit_of_dlls(const std::string& expected_system_name, - const std::vector& dlls, + static LintStatus check_uwp_bit_of_dlls(StringView expected_system_name, + const std::vector& dlls_data, MessageSink& msg_sink) { if (expected_system_name != "WindowsStore") @@ -519,7 +518,7 @@ namespace vcpkg } std::vector dlls_with_improper_uwp_bit; - for (const PostBuildCheckDllData& dll_data : dlls) + for (const PostBuildCheckDllData& dll_data : dlls_data) { if (!dll_data.has_appcontainer) { @@ -530,7 +529,7 @@ namespace vcpkg if (!dlls_with_improper_uwp_bit.empty()) { msg_sink.println_warning(msgPortBugDllAppContainerBitNotSet); - print_paths(dlls_with_improper_uwp_bit); + print_paths(msg_sink, dlls_with_improper_uwp_bit); return LintStatus::PROBLEM_DETECTED; } @@ -575,6 +574,8 @@ namespace vcpkg case MachineType::THUMB: return "thumb"; case MachineType::WCEMIPSV2: return "mips-le-wce-v2"; case MachineType::LLVM_BITCODE: return "llvm-bitcode"; + case MachineType::LOONGARCH32: return "loongarch32"; + case MachineType::LOONGARCH64: return "loongarch64"; default: return fmt::format("unknown-{}", static_cast(machine_type)); } } @@ -594,12 +595,12 @@ namespace vcpkg } static LintStatus check_dll_architecture(const std::string& expected_architecture, - const std::vector& dlls, + const std::vector& dlls_data, MessageSink& msg_sink) { std::vector binaries_with_invalid_architecture; - for (const PostBuildCheckDllData& dll_data : dlls) + for (const PostBuildCheckDllData& dll_data : dlls_data) { const std::string actual_architecture = get_printable_architecture(dll_data.machine_type); if (expected_architecture == "arm64ec") @@ -627,7 +628,7 @@ namespace vcpkg static LintStatus check_lib_architecture(const std::string& expected_architecture, const std::string& cmake_system_name, const std::vector& files, - const Filesystem& fs, + const ReadOnlyFilesystem& fs, MessageSink& msg_sink) { std::vector binaries_with_invalid_architecture; @@ -713,7 +714,7 @@ namespace vcpkg return LintStatus::SUCCESS; } msg_sink.println_warning(msgPortBugFoundDllInStaticBuild); - print_paths(dlls); + print_paths(msg_sink, dlls); return LintStatus::PROBLEM_DETECTED; } @@ -736,7 +737,7 @@ namespace vcpkg else { msg_sink.println(msgPortBugFoundDebugBinaries, msg::count = debug_count); - print_paths(debug_binaries); + print_paths(msg_sink, debug_binaries); } if (release_count == 0) @@ -746,7 +747,7 @@ namespace vcpkg else { msg_sink.println(msgPortBugFoundReleaseBinaries, msg::count = release_count); - print_paths(release_binaries); + print_paths(msg_sink, release_binaries); } return LintStatus::PROBLEM_DETECTED; @@ -770,7 +771,7 @@ namespace vcpkg } static LintStatus check_bin_folders_are_not_present_in_static_build(const BuildPolicies& policies, - const Filesystem& fs, + const ReadOnlyFilesystem& fs, const Path& package_dir, MessageSink& msg_sink) { @@ -809,7 +810,7 @@ namespace vcpkg return LintStatus::PROBLEM_DETECTED; } - static LintStatus check_no_empty_folders(const Filesystem& fs, const Path& dir, MessageSink& msg_sink) + static LintStatus check_no_empty_folders(const ReadOnlyFilesystem& fs, const Path& dir, MessageSink& msg_sink) { std::vector empty_directories = fs.get_directories_recursive(dir, IgnoreErrors{}); Util::erase_remove_if(empty_directories, @@ -818,7 +819,7 @@ namespace vcpkg if (!empty_directories.empty()) { msg_sink.println_warning(msgPortBugFoundEmptyDirectories, msg::path = dir); - print_paths(empty_directories); + print_paths(msg_sink, empty_directories); std::string dirs = " file(REMOVE_RECURSE"; for (auto&& empty_dir : empty_directories) @@ -837,7 +838,7 @@ namespace vcpkg return LintStatus::SUCCESS; } - static LintStatus check_pkgconfig_dir_only_in_lib_dir(const Filesystem& fs, + static LintStatus check_pkgconfig_dir_only_in_lib_dir(const ReadOnlyFilesystem& fs, const Path& dir_raw, MessageSink& msg_sink) { @@ -993,7 +994,7 @@ namespace vcpkg } } - static LintStatus check_crt_linkage_of_libs(const Filesystem& fs, + static LintStatus check_crt_linkage_of_libs(const ReadOnlyFilesystem& fs, const BuildInfo& build_info, bool expect_release, const std::vector& libs, @@ -1015,10 +1016,10 @@ namespace vcpkg "The lib ", lib.native(), " has directives: ", Strings::join(" ", lib_info.linker_directives)); BuildTypeAndFile this_lib{lib}; - constexpr static const StringLiteral static_release_crt = "/DEFAULTLIB:LIBCMT"; - constexpr static const StringLiteral static_debug_crt = "/DEFAULTLIB:LIBCMTd"; - constexpr static const StringLiteral dynamic_release_crt = "/DEFAULTLIB:MSVCRT"; - constexpr static const StringLiteral dynamic_debug_crt = "/DEFAULTLIB:MSVCRTd"; + constexpr static StringLiteral static_release_crt = "/DEFAULTLIB:LIBCMT"; + constexpr static StringLiteral static_debug_crt = "/DEFAULTLIB:LIBCMTd"; + constexpr static StringLiteral dynamic_release_crt = "/DEFAULTLIB:MSVCRT"; + constexpr static StringLiteral dynamic_debug_crt = "/DEFAULTLIB:MSVCRTd"; for (auto&& directive : lib_info.linker_directives) { @@ -1106,7 +1107,7 @@ namespace vcpkg } msg_sink.println(msg::format(msgPortBugInspectFiles, msg::extension = "lib") - .append_raw("\n dumpbin.exe /directives mylibfile.lib")); + .append_raw("\n dumpbin.exe /directives mylibfile.lib")); return LintStatus::PROBLEM_DETECTED; } @@ -1119,7 +1120,7 @@ namespace vcpkg StringLiteral outdated_crt; }; - static LintStatus check_outdated_crt_linkage_of_dlls(const std::vector& dlls, + static LintStatus check_outdated_crt_linkage_of_dlls(const std::vector& dlls_data, const BuildInfo& build_info, const PreBuildInfo& pre_build_info, MessageSink& msg_sink) @@ -1129,7 +1130,7 @@ namespace vcpkg const auto outdated_crts = get_outdated_dynamic_crts(pre_build_info.platform_toolset); std::vector dlls_with_outdated_crt; - for (const PostBuildCheckDllData& dll_data : dlls) + for (const PostBuildCheckDllData& dll_data : dlls_data) { for (const StringLiteral& outdated_crt : outdated_crts) { @@ -1147,17 +1148,56 @@ namespace vcpkg msg_sink.println_warning(msgPortBugOutdatedCRT); for (const OutdatedDynamicCrtAndFile& btf : dlls_with_outdated_crt) { - msg_sink.print(Color::warning, fmt::format(" {}:{}\n", btf.file, btf.outdated_crt)); + msg_sink.print(Color::warning, fmt::format(" {}:{}\n", btf.file, btf.outdated_crt)); } msg_sink.println(msg::format(msgPortBugInspectFiles, msg::extension = "dll") - .append_raw("\n dumpbin.exe /dependents mylibfile.dll")); + .append_raw("\n dumpbin.exe /dependents mylibfile.dll")); return LintStatus::PROBLEM_DETECTED; } return LintStatus::SUCCESS; } - static LintStatus check_no_files_in_dir(const Filesystem& fs, const Path& dir, MessageSink& msg_sink) + static LintStatus check_bad_kernel32_from_xbox(const std::vector& dlls_data, + const PreBuildInfo& pre_build_info, + MessageSink& msg_sink) + { + if (!pre_build_info.target_is_xbox) + { + return LintStatus::SUCCESS; + } + + std::vector bad_dlls; + for (auto&& dll_data : dlls_data) + { + for (auto&& dependency : dll_data.dependencies) + { + Debug::println("Dependency: ", dependency); + if (Strings::case_insensitive_ascii_equals("kernel32.dll", dependency)) + { + bad_dlls.push_back(&dll_data); + break; + } + } + } + + if (bad_dlls.empty()) + { + return LintStatus::SUCCESS; + } + + msg_sink.println(msgPortBugKernel32FromXbox); + for (auto&& bad_dll : bad_dlls) + { + msg_sink.println(LocalizedString{}.append_indent().append_raw(bad_dll->path)); + } + + msg_sink.println(msg::format(msgPortBugInspectFiles, msg::extension = "dll") + .append_raw("\n dumpbin.exe /dependents mylibfile.dll")); + return LintStatus::PROBLEM_DETECTED; + } + + static LintStatus check_no_files_in_dir(const ReadOnlyFilesystem& fs, const Path& dir, MessageSink& msg_sink) { std::vector misplaced_files = fs.get_regular_files_non_recursive(dir, IgnoreErrors{}); Util::erase_remove_if(misplaced_files, [](const Path& target) { @@ -1168,7 +1208,7 @@ namespace vcpkg if (!misplaced_files.empty()) { msg_sink.println_warning(msg::format(msgPortBugMisplacedFiles, msg::path = dir).append_raw('\n')); - print_paths(misplaced_files); + print_paths(msg_sink, misplaced_files); msg_sink.println_warning(msgPortBugMisplacedFilesCont); return LintStatus::PROBLEM_DETECTED; } @@ -1176,7 +1216,7 @@ namespace vcpkg return LintStatus::SUCCESS; } - static bool file_contains_absolute_paths(const Filesystem& fs, + static bool file_contains_absolute_paths(const ReadOnlyFilesystem& fs, const Path& file, const std::vector stringview_paths) { @@ -1217,7 +1257,7 @@ namespace vcpkg return false; } - static LintStatus check_no_absolute_paths_in(const Filesystem& fs, + static LintStatus check_no_absolute_paths_in(const ReadOnlyFilesystem& fs, const Path& dir, Span absolute_paths, MessageSink& msg_sink) @@ -1242,13 +1282,16 @@ namespace vcpkg const auto stringview_paths = Util::fmap(string_paths, [](std::string& s) { return StringView(s); }); std::vector failing_files; - for (auto&& file : fs.get_regular_files_recursive(dir, IgnoreErrors{})) - { + std::mutex mtx; + auto files = fs.get_regular_files_recursive(dir, IgnoreErrors{}); + + parallel_for_each_n(files.begin(), files.size(), [&](const Path& file) { if (file_contains_absolute_paths(fs, file, stringview_paths)) { + std::lock_guard lock{mtx}; failing_files.push_back(file); } - } + }); if (failing_files.empty()) { @@ -1273,8 +1316,8 @@ namespace vcpkg static void operator+=(size_t& left, const LintStatus& right) { left += static_cast(right); } - static size_t perform_post_build_checks_dll_loads(const Filesystem& fs, - std::vector& dlls, + static size_t perform_post_build_checks_dll_loads(const ReadOnlyFilesystem& fs, + std::vector& dlls_data, const std::vector& dll_files, MessageSink& msg_sink) { @@ -1282,9 +1325,9 @@ namespace vcpkg for (const Path& dll : dll_files) { auto maybe_dll_data = try_load_dll_data(fs, dll); - if (const auto dll_data = maybe_dll_data.get()) + if (auto dll_data = maybe_dll_data.get()) { - dlls.emplace_back(std::move(*dll_data)); + dlls_data.emplace_back(std::move(*dll_data)); } else { @@ -1323,7 +1366,7 @@ namespace vcpkg error_count += check_folder_debug_lib_cmake(fs, package_dir, spec, msg_sink); error_count += check_for_dlls_in_lib_dir(fs, package_dir, msg_sink); error_count += check_for_dlls_in_lib_dir(fs, package_dir / "debug", msg_sink); - error_count += check_for_copyright_file(fs, spec, paths, msg_sink); + error_count += check_for_copyright_file(fs, spec, package_dir, paths, msg_sink); error_count += check_for_exes(fs, package_dir, msg_sink); error_count += check_for_exes(fs, package_dir / "debug", msg_sink); error_count += check_for_usage_forgot_install(fs, port_dir, package_dir, spec, msg_sink); @@ -1371,6 +1414,12 @@ namespace vcpkg std::vector release_dlls = fs.get_regular_files_recursive(release_bin_dir, IgnoreErrors{}); Util::erase_remove_if(release_dlls, NotExtensionCaseInsensitive{".dll"}); + std::vector dlls_data; + dlls_data.reserve(debug_dlls.size() + release_dlls.size()); + error_count += perform_post_build_checks_dll_loads(fs, dlls_data, debug_dlls, msg_sink); + error_count += perform_post_build_checks_dll_loads(fs, dlls_data, release_dlls, msg_sink); + error_count += check_bad_kernel32_from_xbox(dlls_data, pre_build_info, msg_sink); + switch (build_info.library_linkage) { case LinkageType::DYNAMIC: @@ -1384,16 +1433,12 @@ namespace vcpkg error_count += check_lib_files_are_available_if_dlls_are_available( build_info.policies, release_libs.size(), release_dlls.size(), release_lib_dir, msg_sink); - std::vector dlls; - dlls.reserve(debug_dlls.size() + release_dlls.size()); - error_count += perform_post_build_checks_dll_loads(fs, dlls, debug_dlls, msg_sink); - error_count += perform_post_build_checks_dll_loads(fs, dlls, release_dlls, msg_sink); - error_count += check_exports_of_dlls(build_info.policies, dlls, msg_sink); - error_count += check_uwp_bit_of_dlls(pre_build_info.cmake_system_name, dlls, msg_sink); - error_count += check_outdated_crt_linkage_of_dlls(dlls, build_info, pre_build_info, msg_sink); + error_count += check_exports_of_dlls(build_info.policies, dlls_data, msg_sink); + error_count += check_uwp_bit_of_dlls(pre_build_info.cmake_system_name, dlls_data, msg_sink); + error_count += check_outdated_crt_linkage_of_dlls(dlls_data, build_info, pre_build_info, msg_sink); if (!build_info.policies.is_enabled(BuildPolicy::SKIP_ARCHITECTURE_CHECK)) { - error_count += check_dll_architecture(pre_build_info.target_architecture, dlls, msg_sink); + error_count += check_dll_architecture(pre_build_info.target_architecture, dlls_data, msg_sink); } } break; @@ -1424,11 +1469,8 @@ namespace vcpkg error_count += check_pkgconfig_dir_only_in_lib_dir(fs, package_dir, msg_sink); if (!build_info.policies.is_enabled(BuildPolicy::SKIP_ABSOLUTE_PATHS_CHECK)) { - error_count += check_no_absolute_paths_in( - fs, - package_dir, - std::vector{package_dir, paths.installed().root(), paths.build_dir(spec)}, - msg_sink); + Path tests[] = {package_dir, paths.installed().root(), paths.build_dir(spec), paths.downloads}; + error_count += check_no_absolute_paths_in(fs, package_dir, tests, msg_sink); } return error_count; diff --git a/src/vcpkg/registries.cpp b/src/vcpkg/registries.cpp index 05af5653b5..26f464e16c 100644 --- a/src/vcpkg/registries.cpp +++ b/src/vcpkg/registries.cpp @@ -1,41 +1,260 @@ #include #include +#include #include #include #include -#include +#include #include +#include #include #include #include #include -#include #include #include #include +#include +#include #include +#include +#include namespace { using namespace vcpkg; + struct GitTreeStringDeserializer : Json::StringDeserializer + { + LocalizedString type_name() const override { return msg::format(msgAGitObjectSha); } + + static const GitTreeStringDeserializer instance; + }; + const GitTreeStringDeserializer GitTreeStringDeserializer::instance; + + struct RegistryPathStringDeserializer : Json::StringDeserializer + { + LocalizedString type_name() const override { return msg::format(msgARegistryPath); } + + static const RegistryPathStringDeserializer instance; + }; + const RegistryPathStringDeserializer RegistryPathStringDeserializer::instance; + + struct GitVersionDbEntryDeserializer final : Json::IDeserializer + { + static constexpr StringLiteral GIT_TREE = "git-tree"; + + LocalizedString type_name() const override; + View valid_fields() const override; + Optional visit_object(Json::Reader& r, const Json::Object& obj) const override; + }; + constexpr StringLiteral GitVersionDbEntryDeserializer::GIT_TREE; + LocalizedString GitVersionDbEntryDeserializer::type_name() const { return msg::format(msgAVersionDatabaseEntry); } + View GitVersionDbEntryDeserializer::valid_fields() const + { + static constexpr StringView u_git[] = {GIT_TREE}; + static const auto t_git = vcpkg::Util::Vectors::concat(schemed_deserializer_fields(), u_git); + + return t_git; + } + + Optional GitVersionDbEntryDeserializer::visit_object(Json::Reader& r, + const Json::Object& obj) const + { + GitVersionDbEntry ret; + ret.version = visit_required_schemed_deserializer(type_name(), r, obj); + r.required_object_field(type_name(), obj, GIT_TREE, ret.git_tree, GitTreeStringDeserializer::instance); + return ret; + } + + struct GitVersionDbEntryArrayDeserializer final : Json::IDeserializer> + { + virtual LocalizedString type_name() const override; + virtual Optional> visit_array(Json::Reader& r, + const Json::Array& arr) const override; + + private: + GitVersionDbEntryDeserializer underlying; + }; + LocalizedString GitVersionDbEntryArrayDeserializer::type_name() const { return msg::format(msgAnArrayOfVersions); } + + Optional> GitVersionDbEntryArrayDeserializer::visit_array( + Json::Reader& r, const Json::Array& arr) const + { + return r.array_elements(arr, underlying); + } + + struct FilesystemVersionDbEntryDeserializer final : Json::IDeserializer + { + static constexpr StringLiteral PATH = "path"; + + LocalizedString type_name() const override; + View valid_fields() const override; + Optional visit_object(Json::Reader& r, const Json::Object& obj) const override; + FilesystemVersionDbEntryDeserializer(const Path& root) : registry_root(root) { } + + private: + Path registry_root; + }; + constexpr StringLiteral FilesystemVersionDbEntryDeserializer::PATH; + LocalizedString FilesystemVersionDbEntryDeserializer::type_name() const + { + return msg::format(msgAVersionDatabaseEntry); + } + View FilesystemVersionDbEntryDeserializer::valid_fields() const + { + static constexpr StringView u_path[] = {PATH}; + static const auto t_path = vcpkg::Util::Vectors::concat(schemed_deserializer_fields(), u_path); + return t_path; + } + + Optional FilesystemVersionDbEntryDeserializer::visit_object(Json::Reader& r, + const Json::Object& obj) const + { + FilesystemVersionDbEntry ret; + ret.version = visit_required_schemed_deserializer(type_name(), r, obj); + + std::string path_res; + r.required_object_field(type_name(), obj, PATH, path_res, RegistryPathStringDeserializer::instance); + if (!Strings::starts_with(path_res, "$/")) + { + r.add_generic_error(msg::format(msgARegistryPath), msg::format(msgARegistryPathMustStartWithDollar)); + return nullopt; + } + + if (Strings::contains(path_res, '\\') || Strings::contains(path_res, "//")) + { + r.add_generic_error(msg::format(msgARegistryPath), + msg::format(msgARegistryPathMustBeDelimitedWithForwardSlashes)); + return nullopt; + } + + auto first = path_res.begin(); + const auto last = path_res.end(); + for (std::string::iterator candidate;; first = candidate) + { + candidate = std::find(first, last, '/'); + if (candidate == last) + { + break; + } + + ++candidate; + if (candidate == last) + { + break; + } + + if (*candidate != '.') + { + continue; + } + + ++candidate; + if (candidate == last || *candidate == '/') + { + r.add_generic_error(msg::format(msgARegistryPath), msg::format(msgARegistryPathMustNotHaveDots)); + return nullopt; + } + + if (*candidate != '.') + { + first = candidate; + continue; + } + + ++candidate; + if (candidate == last || *candidate == '/') + { + r.add_generic_error(msg::format(msgARegistryPath), msg::format(msgARegistryPathMustNotHaveDots)); + return nullopt; + } + } + + ret.p = registry_root / StringView{path_res}.substr(2); + + return ret; + } + + struct FilesystemVersionDbEntryArrayDeserializer final : Json::IDeserializer> + { + virtual LocalizedString type_name() const override; + virtual Optional> visit_array(Json::Reader& r, + const Json::Array& arr) const override; + FilesystemVersionDbEntryArrayDeserializer(const Path& root) : underlying{root} { } + + private: + FilesystemVersionDbEntryDeserializer underlying; + }; + LocalizedString FilesystemVersionDbEntryArrayDeserializer::type_name() const + { + return msg::format(msgAnArrayOfVersions); + } + + Optional> FilesystemVersionDbEntryArrayDeserializer::visit_array( + Json::Reader& r, const Json::Array& arr) const + { + return r.array_elements(arr, underlying); + } + using Baseline = std::map>; static constexpr StringLiteral registry_versions_dir_name = "versions"; struct GitRegistry; + struct PortVersionsGitTreesStructOfArrays + { + PortVersionsGitTreesStructOfArrays() = default; + PortVersionsGitTreesStructOfArrays(const PortVersionsGitTreesStructOfArrays&) = default; + PortVersionsGitTreesStructOfArrays(PortVersionsGitTreesStructOfArrays&&) = default; + PortVersionsGitTreesStructOfArrays& operator=(const PortVersionsGitTreesStructOfArrays&) = default; + PortVersionsGitTreesStructOfArrays& operator=(PortVersionsGitTreesStructOfArrays&&) = default; + + explicit PortVersionsGitTreesStructOfArrays(std::vector&& db_entries) + { + assign(std::move(db_entries)); + } + + void assign(std::vector&& db_entries) + { + m_port_versions.reserve(db_entries.size()); + m_git_trees.reserve(db_entries.size()); + m_port_versions.clear(); + m_git_trees.clear(); + for (auto& entry : db_entries) + { + m_port_versions.push_back(std::move(entry.version.version)); + m_git_trees.push_back(std::move(entry.git_tree)); + } + + db_entries.clear(); + } + + // these two map port versions to git trees + // these shall have the same size, and git_trees[i] shall be the git tree for port_versions[i] + const std::vector& port_versions() const noexcept { return m_port_versions; } + const std::vector& git_trees() const noexcept { return m_git_trees; } + + private: + std::vector m_port_versions; + std::vector m_git_trees; + }; + struct GitRegistryEntry final : RegistryEntry { - GitRegistryEntry(const GitRegistry& reg, StringView name); + GitRegistryEntry(StringView port_name, + const GitRegistry& parent, + bool stale, + std::vector&& version_entries); - View get_port_versions() const override; + ExpectedL> get_port_versions() const override; ExpectedL get_version(const Version& version) const override; private: - void fill_data_from_path(const Filesystem& fs, const Path& port_versions_path) const; + ExpectedL ensure_not_stale() const; std::string port_name; @@ -44,10 +263,7 @@ namespace // Indicates whether port_versions and git_trees were filled in with stale (i.e. lock) data. mutable bool stale; - // these two map port versions to git trees - // these shall have the same size, and git_trees[i] shall be the git tree for port_versions[i] - mutable std::vector port_versions; - mutable std::vector git_trees; + mutable PortVersionsGitTreesStructOfArrays last_loaded; }; struct GitRegistry final : RegistryImplementation @@ -62,46 +278,62 @@ namespace StringLiteral kind() const override { return "git"; } - std::unique_ptr get_port_entry(StringView) const override; + ExpectedL> get_port_entry(StringView) const override; + + ExpectedL append_all_port_names(std::vector&) const override; - void get_all_port_names(std::vector&) const override; + ExpectedL try_append_all_port_names_no_network(std::vector& port_names) const override; - ExpectedL get_baseline_version(StringView) const override; + ExpectedL> get_baseline_version(StringView) const override; private: friend struct GitRegistryEntry; - LockFile::Entry get_lock_entry() const + const ExpectedL& get_lock_entry() const { return m_lock_entry.get( [this]() { return m_paths.get_installed_lockfile().get_or_fetch(m_paths, m_repo, m_reference); }); } - Path get_versions_tree_path() const + const ExpectedL& get_versions_tree_path() const { - return m_versions_tree.get([this]() -> Path { - auto e = get_lock_entry(); - e.ensure_up_to_date(m_paths); + return m_versions_tree.get([this]() -> ExpectedL { + auto& maybe_lock_entry = get_lock_entry(); + auto lock_entry = maybe_lock_entry.get(); + if (!lock_entry) + { + return maybe_lock_entry.error(); + } + + auto maybe_up_to_date = lock_entry->ensure_up_to_date(m_paths); + if (!maybe_up_to_date) + { + return maybe_up_to_date.error(); + } + auto maybe_tree = m_paths.git_find_object_id_for_remote_registry_path( - e.commit_id(), registry_versions_dir_name.to_string()); - if (!maybe_tree) + lock_entry->commit_id(), registry_versions_dir_name.to_string()); + auto tree = maybe_tree.get(); + if (!tree) { get_global_metrics_collector().track_define(DefineMetric::RegistriesErrorNoVersionsAtCommit); - Checks::msg_exit_with_error(VCPKG_LINE_INFO, - msg::format(msgCouldNotFindGitTreeAtCommit, - msg::package_name = m_repo, - msg::commit_sha = e.commit_id()) - .append_raw('\n') - .append_raw(maybe_tree.error())); + return msg::format_error(msgCouldNotFindGitTreeAtCommit, + msg::package_name = m_repo, + msg::commit_sha = lock_entry->commit_id()) + .append_raw('\n') + .append_raw(maybe_tree.error()); } - auto maybe_path = m_paths.git_checkout_object_from_remote_registry(*maybe_tree.get()); - if (!maybe_path) + + auto maybe_path = m_paths.git_extract_tree_from_remote_registry(*tree); + auto path = maybe_path.get(); + if (!path) { - msg::println_error(msgFailedToCheckoutRepo, msg::package_name = m_repo); - msg::println_error(LocalizedString::from_raw(maybe_path.error())); - Checks::exit_fail(VCPKG_LINE_INFO); + return msg::format_error(msgFailedToCheckoutRepo, msg::package_name = m_repo) + .append_raw('\n') + .append(maybe_path.error()); } - return std::move(*maybe_path.get()); + + return std::move(*path); }); } @@ -111,31 +343,54 @@ namespace bool stale; }; - VersionsTreePathResult get_stale_versions_tree_path() const + ExpectedL get_unstale_stale_versions_tree_path() const { - auto e = get_lock_entry(); - if (!e.stale()) + auto& maybe_versions_tree = get_versions_tree_path(); + if (auto versions_tree = maybe_versions_tree.get()) { - return {get_versions_tree_path(), false}; + return VersionsTreePathResult{*versions_tree, false}; } + + return maybe_versions_tree.error(); + } + + ExpectedL get_stale_versions_tree_path() const + { + const auto& maybe_entry = get_lock_entry(); + auto entry = maybe_entry.get(); + if (!entry) + { + return maybe_entry.error(); + } + + if (!entry->stale()) + { + return get_unstale_stale_versions_tree_path(); + } + if (!m_stale_versions_tree.has_value()) { auto maybe_tree = m_paths.git_find_object_id_for_remote_registry_path( - e.commit_id(), registry_versions_dir_name.to_string()); - if (!maybe_tree) + entry->commit_id(), registry_versions_dir_name.to_string()); + auto tree = maybe_tree.get(); + if (!tree) { // This could be caused by git gc or otherwise -- fall back to full fetch - return {get_versions_tree_path(), false}; + return get_unstale_stale_versions_tree_path(); } - auto maybe_path = m_paths.git_checkout_object_from_remote_registry(*maybe_tree.get()); - if (!maybe_path) + + auto maybe_path = m_paths.git_extract_tree_from_remote_registry(*tree); + auto path = maybe_path.get(); + if (!path) { // This could be caused by git gc or otherwise -- fall back to full fetch - return {get_versions_tree_path(), false}; + return get_unstale_stale_versions_tree_path(); } - m_stale_versions_tree = std::move(*maybe_path.get()); + + m_stale_versions_tree = std::move(*path); } - return {*m_stale_versions_tree.get(), true}; + + return VersionsTreePathResult{m_stale_versions_tree.value_or_exit(VCPKG_LINE_INFO), true}; } const VcpkgPaths& m_paths; @@ -143,10 +398,10 @@ namespace std::string m_repo; std::string m_reference; std::string m_baseline_identifier; - DelayedInit m_lock_entry; + DelayedInit> m_lock_entry; mutable Optional m_stale_versions_tree; - DelayedInit m_versions_tree; - DelayedInit m_baseline; + DelayedInit> m_versions_tree; + DelayedInit> m_baseline; }; struct BuiltinPortTreeRegistryEntry final : RegistryEntry @@ -156,7 +411,7 @@ namespace { } - View get_port_versions() const override { return {&version, 1}; } + ExpectedL> get_port_versions() const override { return View{&version, 1}; } ExpectedL get_version(const Version& v) const override { if (v == version) @@ -179,24 +434,24 @@ namespace { BuiltinGitRegistryEntry(const VcpkgPaths& paths) : m_paths(paths) { } - View get_port_versions() const override { return port_versions; } + ExpectedL> get_port_versions() const override + { + return View{port_versions_soa.port_versions()}; + } ExpectedL get_version(const Version& version) const override; const VcpkgPaths& m_paths; std::string port_name; - // these two map port versions to git trees - // these shall have the same size, and git_trees[i] shall be the git tree for port_versions[i] - std::vector port_versions; - std::vector git_trees; + PortVersionsGitTreesStructOfArrays port_versions_soa; }; struct FilesystemRegistryEntry final : RegistryEntry { explicit FilesystemRegistryEntry(std::string&& port_name) : port_name(port_name) { } - View get_port_versions() const override { return port_versions; } + ExpectedL> get_port_versions() const override { return View{port_versions}; } ExpectedL get_version(const Version& version) const override; @@ -220,25 +475,27 @@ namespace StringLiteral kind() const override { return s_kind; } - std::unique_ptr get_port_entry(StringView port_name) const override; + ExpectedL> get_port_entry(StringView port_name) const override; - void get_all_port_names(std::vector&) const override; + ExpectedL append_all_port_names(std::vector&) const override; - ExpectedL get_baseline_version(StringView port_name) const override; + ExpectedL try_append_all_port_names_no_network(std::vector& port_names) const override; + + ExpectedL> get_baseline_version(StringView port_name) const override; ~BuiltinFilesRegistry() = default; DelayedInit m_baseline; private: - const ParseExpected& get_scf(const Path& path) const + const ExpectedL>& get_scf(StringView port_name, const Path& path) const { - return m_scfs.get_lazy(path, [this, &path]() { return Paragraphs::try_load_port(m_fs, path); }); + return m_scfs.get_lazy(path, [&, this]() { return Paragraphs::try_load_port(m_fs, port_name, path); }); } - const Filesystem& m_fs; + const ReadOnlyFilesystem& m_fs; const Path m_builtin_ports_directory; - Cache> m_scfs; + Cache>> m_scfs; }; constexpr StringLiteral BuiltinFilesRegistry::s_kind; @@ -257,16 +514,18 @@ namespace StringLiteral kind() const override { return s_kind; } - std::unique_ptr get_port_entry(StringView port_name) const override; + ExpectedL> get_port_entry(StringView port_name) const override; + + ExpectedL append_all_port_names(std::vector&) const override; - void get_all_port_names(std::vector&) const override; + ExpectedL try_append_all_port_names_no_network(std::vector& port_names) const override; - ExpectedL get_baseline_version(StringView port_name) const override; + ExpectedL> get_baseline_version(StringView port_name) const override; ~BuiltinGitRegistry() = default; std::string m_baseline_identifier; - DelayedInit m_baseline; + DelayedInit> m_baseline; private: std::unique_ptr m_files_impl; @@ -283,19 +542,24 @@ namespace StringLiteral kind() const override { return s_kind; } - std::unique_ptr get_port_entry(StringView) const override + ExpectedL> get_port_entry(StringView) const override + { + return msg::format_error(msgErrorRequireBaseline); + } + + ExpectedL append_all_port_names(std::vector&) const override { - Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgErrorRequireBaseline); + return msg::format_error(msgErrorRequireBaseline); } - void get_all_port_names(std::vector&) const override + ExpectedL try_append_all_port_names_no_network(std::vector&) const override { - Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgErrorRequireBaseline); + return msg::format_error(msgErrorRequireBaseline); } - ExpectedL get_baseline_version(StringView) const override + ExpectedL> get_baseline_version(StringView) const override { - Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgErrorRequireBaseline); + return msg::format_error(msgErrorRequireBaseline); } ~BuiltinErrorRegistry() = default; @@ -304,71 +568,90 @@ namespace struct FilesystemRegistry final : RegistryImplementation { - FilesystemRegistry(const Filesystem& fs, Path&& path, std::string&& baseline) + FilesystemRegistry(const ReadOnlyFilesystem& fs, Path&& path, std::string&& baseline) : m_fs(fs), m_path(std::move(path)), m_baseline_identifier(std::move(baseline)) { } StringLiteral kind() const override { return "filesystem"; } - std::unique_ptr get_port_entry(StringView) const override; + ExpectedL> get_port_entry(StringView) const override; - void get_all_port_names(std::vector&) const override; + ExpectedL append_all_port_names(std::vector&) const override; - ExpectedL get_baseline_version(StringView) const override; + ExpectedL try_append_all_port_names_no_network(std::vector& port_names) const override; + + ExpectedL> get_baseline_version(StringView) const override; private: - const Filesystem& m_fs; + const ReadOnlyFilesystem& m_fs; Path m_path; std::string m_baseline_identifier; - DelayedInit m_baseline; + DelayedInit> m_baseline; }; Path relative_path_to_versions(StringView port_name); - ExpectedL> load_versions_file(const Filesystem& fs, - VersionDbType vdb, - const Path& port_versions, - StringView port_name, - const Path& registry_root = {}); + ExpectedL>> load_git_versions_file(const ReadOnlyFilesystem& fs, + const Path& registry_versions, + StringView port_name); + + ExpectedL>> load_filesystem_versions_file( + const ReadOnlyFilesystem& fs, const Path& registry_versions, StringView port_name, const Path& registry_root); // returns nullopt if the baseline is valid, but doesn't contain the specified baseline, // or (equivalently) if the baseline does not exist. - ExpectedL> parse_baseline_versions(StringView contents, StringView baseline, StringView origin); - ExpectedL> load_baseline_versions(const Filesystem& fs, - const Path& baseline_path, - StringView identifier = {}); - - void load_all_port_names_from_registry_versions(std::vector& out, - const Filesystem& fs, - const Path& port_versions_path) + ExpectedL parse_baseline_versions(StringView contents, StringView baseline, StringView origin); + ExpectedL load_baseline_versions(const ReadOnlyFilesystem& fs, + const Path& baseline_path, + StringView identifier = {}); + + ExpectedL load_all_port_names_from_registry_versions(std::vector& out, + const ReadOnlyFilesystem& fs, + const Path& registry_versions) { - for (auto&& super_directory : fs.get_directories_non_recursive(port_versions_path, VCPKG_LINE_INFO)) + auto maybe_super_directories = fs.try_get_directories_non_recursive(registry_versions); + const auto super_directories = maybe_super_directories.get(); + if (!super_directories) + { + return std::move(maybe_super_directories).error(); + } + + for (auto&& super_directory : *super_directories) { - for (auto&& file : fs.get_regular_files_non_recursive(super_directory, VCPKG_LINE_INFO)) + auto maybe_files = fs.try_get_regular_files_non_recursive(super_directory); + const auto files = maybe_files.get(); + if (!files) + { + return std::move(maybe_files).error(); + } + + for (auto&& file : *files) { auto filename = file.filename(); if (!Strings::case_insensitive_ascii_ends_with(filename, ".json")) continue; if (!Strings::ends_with(filename, ".json")) { - Checks::msg_exit_with_message(VCPKG_LINE_INFO, msgJsonFileMissingExtension, msg::path = file); + return msg::format_error(msgJsonFileMissingExtension, msg::path = file); } auto port_name = filename.substr(0, filename.size() - 5); if (!Json::IdentifierDeserializer::is_ident(port_name)) { - Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, msgInvalidPortVersonName, msg::path = file); + return msg::format_error(msgInvalidPortVersonName, msg::path = file); } out.push_back(port_name.to_string()); } } + + return Unit{}; } static ExpectedL git_checkout_baseline(const VcpkgPaths& paths, StringView commit_sha) { - Filesystem& fs = paths.get_filesystem(); + const Filesystem& fs = paths.get_filesystem(); const auto destination_parent = paths.baselines_output() / commit_sha; auto destination = destination_parent / "baseline.json"; if (!fs.exists(destination, IgnoreErrors{})) @@ -382,30 +665,30 @@ namespace fs.create_directories(destination_parent, ec); if (ec) { - return {msg::format(msg::msgErrorMessage) + return {msg::format(msgErrorMessage) .append(format_filesystem_call_error(ec, "create_directories", {destination_parent})) .append_raw('\n') - .append(msg::msgNoteMessage) + .append(msgNoteMessage) .append(msgWhileCheckingOutBaseline, msg::commit_sha = commit_sha), expected_right_tag}; } fs.write_contents(destination_tmp, *contents, ec); if (ec) { - return {msg::format(msg::msgErrorMessage) + return {msg::format(msgErrorMessage) .append(format_filesystem_call_error(ec, "write_contents", {destination_tmp})) .append_raw('\n') - .append(msg::msgNoteMessage) + .append(msgNoteMessage) .append(msgWhileCheckingOutBaseline, msg::commit_sha = commit_sha), expected_right_tag}; } fs.rename(destination_tmp, destination, ec); if (ec) { - return {msg::format(msg::msgErrorMessage) + return {msg::format(msgErrorMessage) .append(format_filesystem_call_error(ec, "rename", {destination_tmp, destination})) .append_raw('\n') - .append(msg::msgNoteMessage) + .append(msgNoteMessage) .append(msgWhileCheckingOutBaseline, msg::commit_sha = commit_sha), expected_right_tag}; } @@ -425,221 +708,319 @@ namespace // { RegistryImplementation // { BuiltinFilesRegistry::RegistryImplementation - std::unique_ptr BuiltinFilesRegistry::get_port_entry(StringView port_name) const + ExpectedL> BuiltinFilesRegistry::get_port_entry(StringView port_name) const { auto port_directory = m_builtin_ports_directory / port_name; - if (m_fs.exists(port_directory, IgnoreErrors{})) + const auto& maybe_maybe_scf = get_scf(port_name, port_directory); + const auto maybe_scf = maybe_maybe_scf.get(); + if (!maybe_scf) { - const auto& found_scf = get_scf(port_directory); - if (auto scfp = found_scf.get()) - { - auto& scf = *scfp; - if (scf->core_paragraph->name == port_name) - { - return std::make_unique( - scf->core_paragraph->name, port_directory, scf->to_version()); - } - msg::println_error(msgUnexpectedPortName, - msg::expected = scf->core_paragraph->name, - msg::actual = port_name, - msg::path = port_directory); - Checks::exit_fail(VCPKG_LINE_INFO); - } + return maybe_maybe_scf.error(); } - return nullptr; + auto scf = maybe_scf->get(); + if (!scf) + { + return std::unique_ptr(); + } + + if (scf->core_paragraph->name == port_name) + { + return std::make_unique( + scf->core_paragraph->name, port_directory, scf->to_version()); + } + + return msg::format_error(msgUnexpectedPortName, + msg::expected = scf->core_paragraph->name, + msg::actual = port_name, + msg::path = port_directory); } - ExpectedL BuiltinFilesRegistry::get_baseline_version(StringView port_name) const + ExpectedL> BuiltinFilesRegistry::get_baseline_version(StringView port_name) const { // if a baseline is not specified, use the ports directory version - auto port_path = m_builtin_ports_directory / port_name; - const auto& maybe_scf = get_scf(port_path); - if (auto pscf = maybe_scf.get()) + const auto& maybe_maybe_scf = get_scf(port_name, m_builtin_ports_directory / port_name); + auto maybe_scf = maybe_maybe_scf.get(); + if (!maybe_scf) { - return (*pscf)->to_version(); + return maybe_maybe_scf.error(); } - return LocalizedString::from_raw(ParseControlErrorInfo::format_errors({&maybe_scf.error(), 1})); + + auto scf = maybe_scf->get(); + if (!scf) + { + return Optional(); + } + + return scf->to_version(); } - void BuiltinFilesRegistry::get_all_port_names(std::vector& out) const + ExpectedL BuiltinFilesRegistry::append_all_port_names(std::vector& out) const { - std::error_code ec; - auto port_directories = m_fs.get_directories_non_recursive(m_builtin_ports_directory, VCPKG_LINE_INFO); - - for (auto&& port_directory : port_directories) + auto maybe_port_directories = m_fs.try_get_directories_non_recursive(m_builtin_ports_directory); + if (auto port_directories = maybe_port_directories.get()) { - auto filename = port_directory.filename(); - if (filename == ".DS_Store") continue; - out.push_back(filename.to_string()); + for (auto&& port_directory : *port_directories) + { + auto filename = port_directory.filename(); + if (filename == ".DS_Store") continue; + out.emplace_back(filename.data(), filename.size()); + } + + return Unit{}; } + + return std::move(maybe_port_directories).error(); + } + + ExpectedL BuiltinFilesRegistry::try_append_all_port_names_no_network( + std::vector& port_names) const + { + return append_all_port_names(port_names).map([](Unit) { return true; }); } // } BuiltinFilesRegistry::RegistryImplementation // { BuiltinGitRegistry::RegistryImplementation - std::unique_ptr BuiltinGitRegistry::get_port_entry(StringView port_name) const + ExpectedL> BuiltinGitRegistry::get_port_entry(StringView port_name) const { const auto& fs = m_paths.get_filesystem(); auto versions_path = m_paths.builtin_registry_versions / relative_path_to_versions(port_name); - if (fs.exists(versions_path, IgnoreErrors{})) + auto maybe_maybe_version_entries = load_git_versions_file(fs, m_paths.builtin_registry_versions, port_name); + auto maybe_version_entries = maybe_maybe_version_entries.get(); + if (!maybe_version_entries) { - auto maybe_version_entries = - load_versions_file(fs, VersionDbType::Git, m_paths.builtin_registry_versions, port_name); - if (!maybe_version_entries) - { - Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, maybe_version_entries.error()); - } + return std::move(maybe_maybe_version_entries).error(); + } - auto version_entries = std::move(maybe_version_entries).value_or_exit(VCPKG_LINE_INFO); - auto res = std::make_unique(m_paths); - res->port_name = port_name.to_string(); - for (auto&& version_entry : version_entries) - { - res->port_versions.push_back(version_entry.version); - res->git_trees.push_back(version_entry.git_tree); - } - return res; + auto version_entries = maybe_version_entries->get(); + if (!version_entries) + { + return m_files_impl->get_port_entry(port_name); } - return m_files_impl->get_port_entry(port_name); + auto res = std::make_unique(m_paths); + res->port_name.assign(port_name.data(), port_name.size()); + res->port_versions_soa.assign(std::move(*version_entries)); + return res; } - ExpectedL BuiltinGitRegistry::get_baseline_version(StringView port_name) const + ExpectedL> BuiltinGitRegistry::get_baseline_version(StringView port_name) const { - const auto& baseline = m_baseline.get([this]() -> Baseline { - auto maybe_path = git_checkout_baseline(m_paths, m_baseline_identifier); - if (!maybe_path) - { - msg::println(Color::error, LocalizedString::from_raw(maybe_path.error())); - msg::println(Color::error, LocalizedString::from_raw(m_paths.get_current_git_sha_baseline_message())); - Checks::exit_fail(VCPKG_LINE_INFO); - } - auto b = load_baseline_versions(m_paths.get_filesystem(), *maybe_path.get()).value_or_exit(VCPKG_LINE_INFO); - if (auto p = b.get()) - { - return std::move(*p); - } - Checks::msg_exit_with_message( - VCPKG_LINE_INFO, msgBaselineFileNoDefaultField, msg::commit_sha = m_baseline_identifier); + const auto& maybe_baseline = m_baseline.get([this]() -> ExpectedL { + return git_checkout_baseline(m_paths, m_baseline_identifier) + .then([&](Path&& path) { return load_baseline_versions(m_paths.get_filesystem(), path); }) + .map_error([&](LocalizedString&& error) { + return std::move(error).append(msgWhileCheckingOutBaseline, + msg::commit_sha = m_baseline_identifier); + }); }); - auto it = baseline.find(port_name); - if (it != baseline.end()) + auto baseline = maybe_baseline.get(); + if (!baseline) + { + return maybe_baseline.error(); + } + + auto it = baseline->find(port_name); + if (it != baseline->end()) { return it->second; } - return msg::format(msg::msgErrorMessage).append(msgPortNotInBaseline, msg::package_name = port_name); + + return Optional(); } - void BuiltinGitRegistry::get_all_port_names(std::vector& out) const + ExpectedL BuiltinGitRegistry::append_all_port_names(std::vector& out) const { const auto& fs = m_paths.get_filesystem(); if (fs.exists(m_paths.builtin_registry_versions, IgnoreErrors{})) { - load_all_port_names_from_registry_versions(out, fs, m_paths.builtin_registry_versions); + return load_all_port_names_from_registry_versions(out, fs, m_paths.builtin_registry_versions); } + else + { + return m_files_impl->append_all_port_names(out); + } + } - m_files_impl->get_all_port_names(out); + ExpectedL BuiltinGitRegistry::try_append_all_port_names_no_network(std::vector& port_names) const + { + return append_all_port_names(port_names).map([](Unit) { return true; }); } // } BuiltinGitRegistry::RegistryImplementation // { FilesystemRegistry::RegistryImplementation - ExpectedL FilesystemRegistry::get_baseline_version(StringView port_name) const + ExpectedL> FilesystemRegistry::get_baseline_version(StringView port_name) const { - const auto& baseline = m_baseline.get([this]() -> Baseline { - auto path_to_baseline = m_path / registry_versions_dir_name / "baseline.json"; - auto res_baseline = load_baseline_versions(m_fs, path_to_baseline, m_baseline_identifier); - if (auto opt_baseline = res_baseline.get()) - { - if (auto p = opt_baseline->get()) - { - return std::move(*p); - } - - if (m_baseline_identifier.size() == 0) + return m_baseline + .get([this]() { + return load_baseline_versions( + m_fs, m_path / registry_versions_dir_name / "baseline.json", m_baseline_identifier); + }) + .then([&](const Baseline& baseline) -> ExpectedL> { + auto it = baseline.find(port_name); + if (it != baseline.end()) { - return {}; + return it->second; } - Checks::msg_exit_with_error(VCPKG_LINE_INFO, - msgCouldNotFindBaseline, - msg::commit_sha = m_baseline_identifier, - msg::path = path_to_baseline); - } - - Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, res_baseline.error()); - }); + return Optional(); + }); + } - auto it = baseline.find(port_name); - if (it != baseline.end()) + ExpectedL> FilesystemRegistry::get_port_entry(StringView port_name) const + { + auto maybe_maybe_version_entries = + load_filesystem_versions_file(m_fs, m_path / registry_versions_dir_name, port_name, m_path); + auto maybe_version_entries = maybe_maybe_version_entries.get(); + if (!maybe_version_entries) { - return it->second; + return std::move(maybe_maybe_version_entries).error(); } - else + + auto version_entries = maybe_version_entries->get(); + if (!version_entries) { - return msg::format(msg::msgErrorMessage).append(msgPortNotInBaseline, msg::package_name = port_name); + return std::unique_ptr{}; } - } - - std::unique_ptr FilesystemRegistry::get_port_entry(StringView port_name) const - { - auto maybe_version_entries = - load_versions_file(m_fs, VersionDbType::Filesystem, m_path / registry_versions_dir_name, port_name, m_path); - - auto version_entries = std::move(maybe_version_entries).value_or_exit(VCPKG_LINE_INFO); auto res = std::make_unique(port_name.to_string()); - for (auto&& version_entry : version_entries) + for (auto&& version_entry : *version_entries) { - res->port_versions.push_back(std::move(version_entry.version)); + res->port_versions.push_back(std::move(version_entry.version.version)); res->version_paths.push_back(std::move(version_entry.p)); } + return res; } - void FilesystemRegistry::get_all_port_names(std::vector& out) const + ExpectedL FilesystemRegistry::append_all_port_names(std::vector& out) const { - load_all_port_names_from_registry_versions(out, m_fs, m_path / registry_versions_dir_name); + return load_all_port_names_from_registry_versions(out, m_fs, m_path / registry_versions_dir_name); + } + + ExpectedL FilesystemRegistry::try_append_all_port_names_no_network(std::vector& port_names) const + { + return append_all_port_names(port_names).map([](Unit) { return true; }); } // } FilesystemRegistry::RegistryImplementation // { GitRegistry::RegistryImplementation - std::unique_ptr GitRegistry::get_port_entry(StringView port_name) const + ExpectedL> GitRegistry::get_port_entry(StringView port_name) const { - return std::make_unique(*this, port_name); + auto maybe_stale_vtp = get_stale_versions_tree_path(); + auto stale_vtp = maybe_stale_vtp.get(); + if (!stale_vtp) + { + return std::move(maybe_stale_vtp).error(); + } + + { + // try to load using "stale" version database + auto maybe_maybe_version_entries = + load_git_versions_file(m_paths.get_filesystem(), stale_vtp->p, port_name); + auto maybe_version_entries = maybe_maybe_version_entries.get(); + if (!maybe_version_entries) + { + return std::move(maybe_maybe_version_entries).error(); + } + + auto version_entries = maybe_version_entries->get(); + if (version_entries) + { + return std::make_unique( + port_name, *this, stale_vtp->stale, std::move(*version_entries)); + } + } + + if (!stale_vtp->stale) + { + // data is already live but we don't know of this port + return std::unique_ptr(); + } + + auto maybe_live_vdb = get_versions_tree_path(); + auto live_vcb = maybe_live_vdb.get(); + if (!live_vcb) + { + return std::move(maybe_live_vdb).error(); + } + + { + auto maybe_maybe_version_entries = load_git_versions_file(m_paths.get_filesystem(), *live_vcb, port_name); + auto maybe_version_entries = maybe_maybe_version_entries.get(); + if (!maybe_version_entries) + { + return std::move(maybe_maybe_version_entries).error(); + } + + auto version_entries = maybe_version_entries->get(); + if (!version_entries) + { + // data is already live but we don't know of this port + return std::unique_ptr(); + } + + return std::make_unique(port_name, *this, false, std::move(*version_entries)); + } } - GitRegistryEntry::GitRegistryEntry(const GitRegistry& reg, StringView name) - : port_name(name.to_string()), parent(reg) + GitRegistryEntry::GitRegistryEntry(StringView port_name, + const GitRegistry& parent, + bool stale, + std::vector&& version_entries) + : port_name(port_name.data(), port_name.size()) + , parent(parent) + , stale(stale) + , last_loaded(std::move(version_entries)) { - auto vtp = parent.get_stale_versions_tree_path(); - stale = vtp.stale; - fill_data_from_path(parent.m_paths.get_filesystem(), vtp.p); } - ExpectedL GitRegistry::get_baseline_version(StringView port_name) const + ExpectedL> GitRegistry::get_baseline_version(StringView port_name) const { - const auto& baseline = m_baseline.get([this]() -> Baseline { + const auto& maybe_baseline = m_baseline.get([this, port_name]() -> ExpectedL { // We delay baseline validation until here to give better error messages and suggestions if (!is_git_commit_sha(m_baseline_identifier)) { - auto e = get_lock_entry(); - e.ensure_up_to_date(m_paths); - Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, - msgGitRegistryMustHaveBaseline, - msg::package_name = m_repo, - msg::value = e.commit_id()); + auto& maybe_lock_entry = get_lock_entry(); + auto lock_entry = maybe_lock_entry.get(); + if (!lock_entry) + { + return maybe_lock_entry.error(); + } + + auto maybe_up_to_date = lock_entry->ensure_up_to_date(m_paths); + if (maybe_up_to_date) + { + return msg::format_error( + msgGitRegistryMustHaveBaseline, msg::url = m_repo, msg::commit_sha = lock_entry->commit_id()); + } + + return std::move(maybe_up_to_date).error(); } auto path_to_baseline = Path(registry_versions_dir_name.to_string()) / "baseline.json"; auto maybe_contents = m_paths.git_show_from_remote_registry(m_baseline_identifier, path_to_baseline); if (!maybe_contents) { - get_lock_entry().ensure_up_to_date(m_paths); + auto& maybe_lock_entry = get_lock_entry(); + auto lock_entry = maybe_lock_entry.get(); + if (!lock_entry) + { + return maybe_lock_entry.error(); + } + + auto maybe_up_to_date = lock_entry->ensure_up_to_date(m_paths); + if (!maybe_up_to_date) + { + return std::move(maybe_up_to_date).error(); + } + maybe_contents = m_paths.git_show_from_remote_registry(m_baseline_identifier, path_to_baseline); } + if (!maybe_contents) { msg::println(msgFetchingBaselineInfo, msg::package_name = m_repo); @@ -647,18 +1028,9 @@ namespace if (!maybe_err) { get_global_metrics_collector().track_define(DefineMetric::RegistriesErrorCouldNotFindBaseline); - - msg::println_error(msgCouldNotFindBaselineForRepo, - msg::commit_sha = m_baseline_identifier, - msg::package_name = m_repo); - - msg::println_error(msg::format(msgFailedToFetchError, - msg::error_msg = maybe_contents.error(), - msg::package_name = m_repo) - .append_raw('\n') - .append_raw(maybe_err.error())); - - Checks::exit_fail(VCPKG_LINE_INFO); + return msg::format_error(msgFailedToFetchRepo, msg::url = m_repo) + .append_raw('\n') + .append(maybe_err.error()); } maybe_contents = m_paths.git_show_from_remote_registry(m_baseline_identifier, path_to_baseline); @@ -667,55 +1039,59 @@ namespace if (!maybe_contents) { get_global_metrics_collector().track_define(DefineMetric::RegistriesErrorCouldNotFindBaseline); - Checks::msg_exit_with_message(VCPKG_LINE_INFO, - msg::format(msgCouldNotFindBaselineInCommit, - msg::commit_sha = m_baseline_identifier, - msg::package_name = m_repo) - .append_raw('\n') - .append_raw(maybe_contents.error())); + return msg::format_error(msgCouldNotFindBaselineInCommit, + msg::url = m_repo, + msg::commit_sha = m_baseline_identifier, + msg::package_name = port_name) + .append_raw('\n') + .append_raw(maybe_contents.error()); } auto contents = maybe_contents.get(); - auto res_baseline = parse_baseline_versions(*contents, "default", path_to_baseline); - if (auto opt_baseline = res_baseline.get()) - { - if (auto p = opt_baseline->get()) - { - return std::move(*p); - } - else - { + return parse_baseline_versions(*contents, "default", path_to_baseline) + .map_error([&](LocalizedString&& error) { get_global_metrics_collector().track_define(DefineMetric::RegistriesErrorCouldNotFindBaseline); - Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, - msgBaselineMissingDefault, - msg::commit_sha = m_baseline_identifier, - msg::url = m_repo); - } - } - else - { - msg::println_error(msg::format(msgErrorWhileFetchingBaseline, - msg::value = m_baseline_identifier, - msg::package_name = m_repo) - .append_raw('\n') - .append(LocalizedString::from_raw(res_baseline.error()))); - Checks::exit_fail(VCPKG_LINE_INFO); - } + return msg::format_error(msgErrorWhileFetchingBaseline, + msg::value = m_baseline_identifier, + msg::package_name = m_repo) + .append_raw('\n') + .append(error); + }); }); - auto it = baseline.find(port_name); - if (it != baseline.end()) + auto baseline = maybe_baseline.get(); + if (!baseline) + { + return maybe_baseline.error(); + } + + auto it = baseline->find(port_name); + if (it != baseline->end()) { return it->second; } - return msg::format(msg::msgErrorMessage).append(msgPortNotInBaseline, msg::package_name = port_name); + return Optional(); + } + + ExpectedL GitRegistry::append_all_port_names(std::vector& out) const + { + auto maybe_versions_path = get_stale_versions_tree_path(); + if (auto versions_path = maybe_versions_path.get()) + { + return load_all_port_names_from_registry_versions(out, m_paths.get_filesystem(), versions_path->p); + } + + return std::move(maybe_versions_path).error(); } - void GitRegistry::get_all_port_names(std::vector& out) const + ExpectedL GitRegistry::try_append_all_port_names_no_network(std::vector&) const { - auto versions_path = get_stale_versions_tree_path(); - load_all_port_names_from_registry_versions(out, m_paths.get_filesystem(), versions_path.p); + // At this time we don't record enough information to know what the last fetch for a registry is, + // so we can't even return what the most recent answer was. + // + // This would be fixable if we recorded LockFile in the registries cache. + return false; } // } GitRegistry::RegistryImplementation @@ -733,7 +1109,7 @@ namespace error_msg.append_indent().append_raw(version.to_string()).append_raw('\n'); } - error_msg.append(msgVersionIncomparable4); + error_msg.append(msgVersionIncomparable4, msg::url = docs::versioning_url); return error_msg; } @@ -742,16 +1118,17 @@ namespace // { BuiltinRegistryEntry::RegistryEntry ExpectedL BuiltinGitRegistryEntry::get_version(const Version& version) const { + auto& port_versions = port_versions_soa.port_versions(); auto it = std::find(port_versions.begin(), port_versions.end(), version); if (it == port_versions.end()) { return format_version_git_entry_missing(port_name, version, port_versions) .append_raw('\n') - .append(msg::msgNoteMessage) + .append(msgNoteMessage) .append(msgChecksUpdateVcpkg); } - const auto& git_tree = git_trees[it - port_versions.begin()]; + const auto& git_tree = port_versions_soa.git_trees()[it - port_versions.begin()]; return m_paths.git_checkout_port(port_name, git_tree, m_paths.root / ".git") .map([&git_tree](Path&& p) -> PathAndLocation { return { @@ -779,32 +1156,75 @@ namespace // } FilesystemRegistryEntry::RegistryEntry // { GitRegistryEntry::RegistryEntry - View GitRegistryEntry::get_port_versions() const + ExpectedL GitRegistryEntry::ensure_not_stale() const { if (stale) { - fill_data_from_path(parent.m_paths.get_filesystem(), parent.get_versions_tree_path()); + auto maybe_live_vdb = parent.get_versions_tree_path(); + auto live_vdb = maybe_live_vdb.get(); + if (!live_vdb) + { + return std::move(maybe_live_vdb).error(); + } + + auto maybe_maybe_version_entries = + load_git_versions_file(parent.m_paths.get_filesystem(), *live_vdb, port_name); + auto maybe_version_entries = maybe_maybe_version_entries.get(); + if (!maybe_version_entries) + { + return std::move(maybe_maybe_version_entries).error(); + } + + auto version_entries = maybe_version_entries->get(); + if (!version_entries) + { + // Somehow the port existed in the stale version database but doesn't exist in the + // live one? + return msg::format_error(msgCouldNotFindVersionDatabaseFile, + msg::path = *live_vdb / relative_path_to_versions(port_name)); + } + + last_loaded.assign(std::move(*version_entries)); stale = false; } - return port_versions; + + return Unit{}; + } + + ExpectedL> GitRegistryEntry::get_port_versions() const + { + // Getting all versions that might exist must always be done with 'live' data + auto maybe_not_stale = ensure_not_stale(); + if (maybe_not_stale) + { + return View{last_loaded.port_versions()}; + } + + return std::move(maybe_not_stale).error(); } ExpectedL GitRegistryEntry::get_version(const Version& version) const { - auto it = std::find(port_versions.begin(), port_versions.end(), version); - if (it == port_versions.end() && stale) + auto it = std::find(last_loaded.port_versions().begin(), last_loaded.port_versions().end(), version); + if (it == last_loaded.port_versions().end() && stale) { - fill_data_from_path(parent.m_paths.get_filesystem(), parent.get_versions_tree_path()); - stale = false; - it = std::find(port_versions.begin(), port_versions.end(), version); + // didn't find the version, maybe a newer version database will have it + auto maybe_not_stale = ensure_not_stale(); + if (!maybe_not_stale) + { + return std::move(maybe_not_stale).error(); + } + + it = std::find(last_loaded.port_versions().begin(), last_loaded.port_versions().end(), version); } - if (it == port_versions.end()) + + if (it == last_loaded.port_versions().end()) { - return format_version_git_entry_missing(port_name, version, port_versions); + return format_version_git_entry_missing(port_name, version, last_loaded.port_versions()); } - const auto& git_tree = git_trees[it - port_versions.begin()]; - return parent.m_paths.git_checkout_object_from_remote_registry(git_tree).map( + const auto& git_tree = last_loaded.git_trees()[it - last_loaded.port_versions().begin()]; + return parent.m_paths.git_extract_tree_from_remote_registry(git_tree).map( [this, &git_tree](Path&& p) -> PathAndLocation { return { std::move(p), @@ -813,18 +1233,6 @@ namespace }); } - void GitRegistryEntry::fill_data_from_path(const Filesystem& fs, const Path& port_versions_path) const - { - auto maybe_version_entries = load_versions_file(fs, VersionDbType::Git, port_versions_path, port_name); - auto version_entries = std::move(maybe_version_entries).value_or_exit(VCPKG_LINE_INFO); - - for (auto&& version_entry : version_entries) - { - port_versions.push_back(version_entry.version); - git_trees.push_back(version_entry.git_tree); - } - } - // } GitRegistryEntry::RegistryEntry // } RegistryEntry @@ -866,67 +1274,97 @@ namespace return Path(prefix) / port_name.to_string() + ".json"; } - ExpectedL> load_versions_file(const Filesystem& fs, - VersionDbType type, - const Path& registry_versions, - StringView port_name, - const Path& registry_root) + ExpectedL>> load_git_versions_file(const ReadOnlyFilesystem& fs, + const Path& registry_versions, + StringView port_name) { - if (type == VersionDbType::Filesystem && registry_root.empty()) + auto versions_file_path = registry_versions / relative_path_to_versions(port_name); + std::error_code ec; + auto contents = fs.read_contents(versions_file_path, ec); + if (ec) { - Checks::unreachable(VCPKG_LINE_INFO, "type should never = Filesystem when registry_root is empty."); + if (ec == std::errc::no_such_file_or_directory) + { + return Optional>{}; + } + + return format_filesystem_call_error(ec, "read_contents", {versions_file_path}); } - auto versions_file_path = registry_versions / relative_path_to_versions(port_name); + auto maybe_versions_json = Json::parse_object(contents, versions_file_path); + auto versions_json = maybe_versions_json.get(); + if (!versions_json) + { + return std::move(maybe_versions_json).error(); + } + + auto maybe_versions_array = versions_json->get("versions"); + if (!maybe_versions_array || !maybe_versions_array->is_array()) + { + return msg::format_error(msgFailedToParseNoVersionsArray, msg::path = versions_file_path); + } + + std::vector db_entries; + GitVersionDbEntryArrayDeserializer deserializer{}; + Json::Reader r; + r.visit_in_key(*maybe_versions_array, "versions", db_entries, deserializer); + if (!r.errors().empty()) + { + return msg::format_error(msgFailedToParseVersionsFile, msg::path = versions_file_path) + .append_raw(Strings::join("\n", r.errors())); + } - if (!fs.exists(versions_file_path, IgnoreErrors{})) + return db_entries; + } + + ExpectedL>> load_filesystem_versions_file( + const ReadOnlyFilesystem& fs, const Path& registry_versions, StringView port_name, const Path& registry_root) + { + if (registry_root.empty()) { - return msg::format_error(msgCouldNotFindVersionDatabaseFile, msg::path = versions_file_path); + Checks::unreachable(VCPKG_LINE_INFO, "type should never = Filesystem when registry_root is empty."); } + auto versions_file_path = registry_versions / relative_path_to_versions(port_name); std::error_code ec; auto contents = fs.read_contents(versions_file_path, ec); if (ec) { + if (ec == std::errc::no_such_file_or_directory) + { + return Optional>{}; + } + return format_filesystem_call_error(ec, "read_contents", {versions_file_path}); } - auto maybe_versions_json = Json::parse(contents); + auto maybe_versions_json = Json::parse_object(contents, versions_file_path); auto versions_json = maybe_versions_json.get(); if (!versions_json) { - return LocalizedString::from_raw(maybe_versions_json.error()->to_string()); - } - - if (!versions_json->value.is_object()) - { - return msg::format_error(msgFailedToParseNoTopLevelObj, msg::path = versions_file_path); + return std::move(maybe_versions_json).error(); } - const auto& versions_object = versions_json->value.object(VCPKG_LINE_INFO); - auto maybe_versions_array = versions_object.get("versions"); + auto maybe_versions_array = versions_json->get("versions"); if (!maybe_versions_array || !maybe_versions_array->is_array()) { return msg::format_error(msgFailedToParseNoVersionsArray, msg::path = versions_file_path); } - std::vector db_entries; - VersionDbEntryArrayDeserializer deserializer{type, registry_root}; - // Avoid warning treated as error. - if (maybe_versions_array != nullptr) + std::vector db_entries; + FilesystemVersionDbEntryArrayDeserializer deserializer{registry_root}; + Json::Reader r; + r.visit_in_key(*maybe_versions_array, "versions", db_entries, deserializer); + if (!r.errors().empty()) { - Json::Reader r; - r.visit_in_key(*maybe_versions_array, "versions", db_entries, deserializer); - if (!r.errors().empty()) - { - return msg::format_error(msgFailedToParseVersionsFile, msg::path = versions_file_path) - .append_raw(Strings::join("\n", r.errors())); - } + return msg::format_error(msgFailedToParseVersionsFile, msg::path = versions_file_path) + .append_raw(Strings::join("\n", r.errors())); } + return db_entries; } - ExpectedL> parse_baseline_versions(StringView contents, StringView baseline, StringView origin) + ExpectedL parse_baseline_versions(StringView contents, StringView baseline, StringView origin) { auto maybe_value = Json::parse(contents, origin); if (!maybe_value) @@ -941,20 +1379,24 @@ namespace } auto real_baseline = baseline.size() == 0 ? "default" : baseline; - const auto& obj = value.value.object(VCPKG_LINE_INFO); auto baseline_value = obj.get(real_baseline); if (!baseline_value) { - return {nullopt, expected_left_tag}; + return LocalizedString::from_raw(origin) + .append_raw(": ") + .append(msgErrorMessage) + .append(msgMissingRequiredField, + msg::json_field = baseline, + msg::json_type = msg::format(msgABaselineObject)); } Json::Reader r; - std::map> result; + Baseline result; r.visit_in_key(*baseline_value, real_baseline, result, BaselineDeserializer::instance); if (r.errors().empty()) { - return {std::move(result), expected_left_tag}; + return std::move(result); } else { @@ -964,153 +1406,19 @@ namespace } } - ExpectedL> load_baseline_versions(const Filesystem& fs, - const Path& baseline_path, - StringView baseline) + ExpectedL load_baseline_versions(const ReadOnlyFilesystem& fs, + const Path& baseline_path, + StringView baseline) { - std::error_code ec; - auto contents = fs.read_contents(baseline_path, ec); - if (ec) - { - if (ec == std::errc::no_such_file_or_directory) - { - msg::println(msgFailedToFindBaseline); - return {nullopt, expected_left_tag}; - } - - return format_filesystem_call_error(ec, "read_contents", {baseline_path}); - } - - return parse_baseline_versions(contents, baseline, baseline_path); + return fs.try_read_contents(baseline_path).then([&](FileContents&& fc) { + return parse_baseline_versions(fc.content, baseline, fc.origin); + }); } - - struct GitTreeStringDeserializer : Json::StringDeserializer - { - LocalizedString type_name() const override { return msg::format(msgAGitObjectSha); } - - static const GitTreeStringDeserializer instance; - }; - - const GitTreeStringDeserializer GitTreeStringDeserializer::instance; - - struct RegistryPathStringDeserializer : Json::StringDeserializer - { - LocalizedString type_name() const override { return msg::format(msgARegistryPath); } - - static const RegistryPathStringDeserializer instance; - }; - - const RegistryPathStringDeserializer RegistryPathStringDeserializer::instance; } namespace vcpkg { - constexpr StringLiteral VersionDbEntryDeserializer::GIT_TREE; - constexpr StringLiteral VersionDbEntryDeserializer::PATH; - LocalizedString VersionDbEntryDeserializer::type_name() const { return msg::format(msgAVersionDatabaseEntry); } - View VersionDbEntryDeserializer::valid_fields() const - { - static constexpr StringView u_git[] = {GIT_TREE}; - static constexpr StringView u_path[] = {PATH}; - static const auto t_git = vcpkg::Util::Vectors::concat(schemed_deserializer_fields(), u_git); - static const auto t_path = vcpkg::Util::Vectors::concat(schemed_deserializer_fields(), u_path); - - return type == VersionDbType::Git ? t_git : t_path; - } - - Optional VersionDbEntryDeserializer::visit_object(Json::Reader& r, const Json::Object& obj) const - { - VersionDbEntry ret; - - auto schemed_version = visit_required_schemed_deserializer(type_name(), r, obj); - ret.scheme = schemed_version.scheme; - ret.version = std::move(schemed_version.version); - switch (type) - { - case VersionDbType::Git: - { - r.required_object_field(type_name(), obj, GIT_TREE, ret.git_tree, GitTreeStringDeserializer::instance); - break; - } - case VersionDbType::Filesystem: - { - std::string path_res; - r.required_object_field(type_name(), obj, PATH, path_res, RegistryPathStringDeserializer::instance); - if (!Strings::starts_with(path_res, "$/")) - { - r.add_generic_error(msg::format(msgARegistryPath), - msg::format(msgARegistryPathMustStartWithDollar)); - return nullopt; - } - - if (Strings::contains(path_res, '\\') || Strings::contains(path_res, "//")) - { - r.add_generic_error(msg::format(msgARegistryPath), - msg::format(msgARegistryPathMustBeDelimitedWithForwardSlashes)); - return nullopt; - } - - auto first = path_res.begin(); - const auto last = path_res.end(); - for (std::string::iterator candidate;; first = candidate) - { - candidate = std::find(first, last, '/'); - if (candidate == last) - { - break; - } - - ++candidate; - if (candidate == last) - { - break; - } - - if (*candidate != '.') - { - continue; - } - - ++candidate; - if (candidate == last || *candidate == '/') - { - r.add_generic_error(msg::format(msgARegistryPath), - msg::format(msgARegistryPathMustNotHaveDots)); - return nullopt; - } - - if (*candidate != '.') - { - first = candidate; - continue; - } - - ++candidate; - if (candidate == last || *candidate == '/') - { - r.add_generic_error(msg::format(msgARegistryPath), - msg::format(msgARegistryPathMustNotHaveDots)); - return nullopt; - } - } - - ret.p = registry_root / StringView{path_res}.substr(2); - break; - } - } - - return ret; - } - - LocalizedString VersionDbEntryArrayDeserializer::type_name() const { return msg::format(msgAnArrayOfVersions); } - - Optional> VersionDbEntryArrayDeserializer::visit_array(Json::Reader& r, - const Json::Array& arr) const - { - return r.array_elements(arr, underlying); - } - - LockFile::Entry LockFile::get_or_fetch(const VcpkgPaths& paths, StringView repo, StringView reference) + ExpectedL LockFile::get_or_fetch(const VcpkgPaths& paths, StringView repo, StringView reference) { auto range = lockdata.equal_range(repo); auto it = std::find_if(range.first, range.second, [&reference](const LockDataType::value_type& repo2entry) { @@ -1120,15 +1428,21 @@ namespace vcpkg if (it == range.second) { msg::println(msgFetchingRegistryInfo, msg::url = repo, msg::value = reference); - auto x = paths.git_fetch_from_remote_registry(repo, reference); - it = lockdata.emplace(repo.to_string(), - EntryData{reference.to_string(), x.value_or_exit(VCPKG_LINE_INFO), false}); - modified = true; + auto maybe_commit = paths.git_fetch_from_remote_registry(repo, reference); + if (auto commit = maybe_commit.get()) + { + it = lockdata.emplace(repo.to_string(), EntryData{reference.to_string(), *commit, false}); + modified = true; + } + else + { + return std::move(maybe_commit).error(); + } } - return {this, it}; + return LockFile::Entry{this, it}; } - void LockFile::Entry::ensure_up_to_date(const VcpkgPaths& paths) const + ExpectedL LockFile::Entry::ensure_up_to_date(const VcpkgPaths& paths) const { if (data->second.stale) { @@ -1136,17 +1450,26 @@ namespace vcpkg StringView reference(data->second.reference); msg::println(msgFetchingRegistryInfo, msg::url = repo, msg::value = reference); - data->second.commit_id = - paths.git_fetch_from_remote_registry(repo, reference).value_or_exit(VCPKG_LINE_INFO); - data->second.stale = false; - lockfile->modified = true; + auto maybe_commit_id = paths.git_fetch_from_remote_registry(repo, reference); + if (const auto commit_id = maybe_commit_id.get()) + { + data->second.commit_id = *commit_id; + data->second.stale = false; + lockfile->modified = true; + } + else + { + return std::move(maybe_commit_id).error(); + } } + + return Unit{}; } - Registry::Registry(std::vector&& packages, std::unique_ptr&& impl) - : packages_(std::move(packages)), implementation_(std::move(impl)) + Registry::Registry(std::vector&& patterns, std::unique_ptr&& impl) + : patterns_(std::move(patterns)), implementation_(std::move(impl)) { - Util::sort_unique_erase(packages_); + Util::sort_unique_erase(patterns_); Checks::check_exit(VCPKG_LINE_INFO, implementation_ != nullptr); } @@ -1161,25 +1484,23 @@ namespace vcpkg return candidates[0]; } - size_t package_match_prefix(StringView name, StringView prefix) + size_t package_pattern_match(StringView name, StringView pattern) { - if (name == prefix) - { - // exact match is like matching "infinity" prefix - return SIZE_MAX; - } - - // Note that the * is included in the match so that 0 means no match - const auto prefix_size = prefix.size(); - if (prefix_size != 0) + const auto pattern_size = pattern.size(); + const auto maybe_star_index = pattern_size - 1; + if (pattern_size != 0 && pattern[maybe_star_index] == '*') { - const auto star_index = prefix_size - 1; - if (prefix[star_index] == '*' && name.size() >= star_index && - name.substr(0, star_index) == prefix.substr(0, star_index)) + // pattern ends in wildcard + if (name.size() >= maybe_star_index && std::equal(pattern.begin(), pattern.end() - 1, name.begin())) { - return prefix_size; + return pattern_size; } } + else if (name == pattern) + { + // exact match is like matching "infinity" prefix + return SIZE_MAX; + } return 0; } @@ -1196,9 +1517,9 @@ namespace vcpkg for (auto&& registry : registries()) { std::size_t longest_prefix = 0; - for (auto&& package : registry.packages()) + for (auto&& pattern : registry.patterns()) { - longest_prefix = std::max(longest_prefix, package_match_prefix(name, package)); + longest_prefix = std::max(longest_prefix, package_pattern_match(name, pattern)); } if (longest_prefix != 0) @@ -1220,10 +1541,10 @@ namespace vcpkg return Util::fmap(std::move(candidates), [](const RegistryCandidate& target) { return target.impl; }); } - ExpectedL RegistrySet::baseline_for_port(StringView port_name) const + ExpectedL> RegistrySet::baseline_for_port(StringView port_name) const { auto impl = registry_for_port(port_name); - if (!impl) return msg::format(msg::msgErrorMessage).append(msgNoRegistryForPort, msg::package_name = port_name); + if (!impl) return msg::format(msgErrorMessage).append(msgNoRegistryForPort, msg::package_name = port_name); return impl->get_baseline_version(port_name); } @@ -1232,32 +1553,110 @@ namespace vcpkg return default_registry_ && default_registry_->kind() == BuiltinFilesRegistry::s_kind; } bool RegistrySet::has_modifications() const { return !registries_.empty() || !is_default_builtin_registry(); } +} // namespace vcpkg - ExpectedL>> get_builtin_versions(const VcpkgPaths& paths, - StringView port_name) +namespace +{ + void remove_unreachable_port_names_by_patterns(std::vector& result, + std::size_t start_at, + View patterns) { - return load_versions_file( - paths.get_filesystem(), VersionDbType::Git, paths.builtin_registry_versions, port_name) - .map([&](std::vector&& versions) { - return Util::fmap( - versions, [](const VersionDbEntry& entry) -> auto{ - return std::make_pair(SchemedVersion{entry.scheme, entry.version}, entry.git_tree); - }); - }); + // Remove names in result[start_at .. end] which no package pattern matches + result.erase(std::remove_if(result.begin() + start_at, + result.end(), + [&](const std::string& name) { + return std::none_of( + patterns.begin(), patterns.end(), [&](const std::string& pattern) { + return package_pattern_match(name, pattern) != 0; + }); + }), + result.end()); } +} // unnamed namespace - ExpectedL get_builtin_baseline(const VcpkgPaths& paths) +namespace vcpkg +{ + ExpectedL> RegistrySet::get_all_reachable_port_names() const { - auto baseline_path = paths.builtin_registry_versions / "baseline.json"; - return load_baseline_versions(paths.get_filesystem(), baseline_path) - .then([&](Optional&& b) -> ExpectedL { - if (auto p = b.get()) - { - return std::move(*p); - } + std::vector result; + for (const auto& registry : registries()) + { + const auto start_at = result.size(); + auto this_append = registry.implementation().append_all_port_names(result); + if (!this_append) + { + return std::move(this_append).error(); + } - return msg::format_error(msgBaselineFileNoDefaultFieldPath, msg::path = baseline_path); - }); + remove_unreachable_port_names_by_patterns(result, start_at, registry.patterns()); + } + + if (auto registry = default_registry()) + { + auto this_append = registry->append_all_port_names(result); + if (!this_append) + { + return std::move(this_append).error(); + } + } + + Util::sort_unique_erase(result); + return result; + } + + ExpectedL> RegistrySet::get_all_known_reachable_port_names_no_network() const + { + std::vector result; + for (const auto& registry : registries()) + { + const auto start_at = result.size(); + const auto patterns = registry.patterns(); + auto maybe_append = registry.implementation().try_append_all_port_names_no_network(result); + auto append = maybe_append.get(); + if (!append) + { + return std::move(maybe_append).error(); + } + + if (*append) + { + remove_unreachable_port_names_by_patterns(result, start_at, patterns); + } + else + { + // we don't know all names, but we can at least assume the exact match patterns + // will be names + std::remove_copy_if(patterns.begin(), + patterns.end(), + std::back_inserter(result), + [&](const std::string& package_pattern) -> bool { + return package_pattern.empty() || package_pattern.back() == '*'; + }); + } + } + + if (auto registry = default_registry()) + { + auto maybe_append = registry->try_append_all_port_names_no_network(result); + if (!maybe_append) + { + return std::move(maybe_append).error(); + } + } + + Util::sort_unique_erase(result); + return result; + } + + ExpectedL>> get_builtin_versions(const VcpkgPaths& paths, + StringView port_name) + { + return load_git_versions_file(paths.get_filesystem(), paths.builtin_registry_versions, port_name); + } + + ExpectedL get_builtin_baseline(const VcpkgPaths& paths) + { + return load_baseline_versions(paths.get_filesystem(), paths.builtin_registry_versions / "baseline.json"); } bool is_git_commit_sha(StringView sv) @@ -1300,10 +1699,21 @@ namespace vcpkg { return std::make_unique(paths, std::move(repo), std::move(reference), std::move(baseline)); } - std::unique_ptr make_filesystem_registry(const Filesystem& fs, + std::unique_ptr make_filesystem_registry(const ReadOnlyFilesystem& fs, Path path, std::string baseline) { return std::make_unique(fs, std::move(path), std::move(baseline)); } + + std::unique_ptr>> make_git_version_db_deserializer() + { + return std::make_unique(); + } + + std::unique_ptr>> make_filesystem_version_db_deserializer( + const Path& root) + { + return std::make_unique(root); + } } diff --git a/src/vcpkg/sourceparagraph.cpp b/src/vcpkg/sourceparagraph.cpp index 7fb35478b1..7ec557738a 100644 --- a/src/vcpkg/sourceparagraph.cpp +++ b/src/vcpkg/sourceparagraph.cpp @@ -19,6 +19,76 @@ namespace vcpkg { + + bool operator==(const DependencyConstraint& lhs, const DependencyConstraint& rhs) + { + if (lhs.type != rhs.type) return false; + if (lhs.value != rhs.value) return false; + return lhs.port_version == rhs.port_version; + } + + Optional DependencyConstraint::try_get_minimum_version() const + { + if (type == VersionConstraintKind::None) + { + return nullopt; + } + + return Version{ + value, + port_version, + }; + } + + bool Dependency::has_platform_expressions() const + { + return !platform.is_empty() || Util::any_of(features, [](const auto f) { return !f.platform.is_empty(); }); + } + + FullPackageSpec Dependency::to_full_spec(View feature_list, Triplet target, Triplet host_triplet) const + { + InternalFeatureSet internal_feature_list(feature_list.begin(), feature_list.end()); + internal_feature_list.push_back("core"); + if (default_features) + { + internal_feature_list.push_back("default"); + } + return FullPackageSpec{{name, host ? host_triplet : target}, std::move(internal_feature_list)}; + } + + bool operator==(const Dependency& lhs, const Dependency& rhs) + { + if (lhs.name != rhs.name) return false; + if (lhs.features != rhs.features) return false; + if (!structurally_equal(lhs.platform, rhs.platform)) return false; + if (lhs.extra_info != rhs.extra_info) return false; + if (lhs.constraint != rhs.constraint) return false; + if (lhs.host != rhs.host) return false; + + return true; + } + bool operator!=(const Dependency& lhs, const Dependency& rhs); + + bool operator==(const DependencyOverride& lhs, const DependencyOverride& rhs) + { + if (lhs.version_scheme != rhs.version_scheme) return false; + if (lhs.port_version != rhs.port_version) return false; + if (lhs.name != rhs.name) return false; + if (lhs.version != rhs.version) return false; + return lhs.extra_info == rhs.extra_info; + } + bool operator!=(const DependencyOverride& lhs, const DependencyOverride& rhs); + + bool operator==(const DependencyRequestedFeature& lhs, const DependencyRequestedFeature& rhs) + { + return lhs.name == rhs.name && structurally_equal(lhs.platform, rhs.platform); + } + + bool operator!=(const DependencyRequestedFeature& lhs, const DependencyRequestedFeature& rhs) + { + return !(lhs == rhs); + } + struct UrlDeserializer : Json::StringDeserializer { LocalizedString type_name() const override { return msg::format(msgAUrl); } @@ -112,13 +182,11 @@ namespace vcpkg return valid_fields; } - void print_error_message(Span> error_info_list); - static void trim_all(std::vector& arr) { for (auto& el : arr) { - el = Strings::trim(std::move(el)); + Strings::inplace_trim(el); } } @@ -151,6 +219,19 @@ namespace vcpkg } }; + struct DependencyFeatureLess + { + bool operator()(const DependencyRequestedFeature& lhs, const DependencyRequestedFeature& rhs) const + { + if (lhs.name == rhs.name) + { + auto platform_cmp = compare(lhs.platform, rhs.platform); + return platform_cmp < 0; + } + return lhs.name < rhs.name; + } + }; + // assume canonicalized feature list struct DependencyLess { @@ -177,8 +258,11 @@ namespace vcpkg if (rhs.features.size() < lhs.features.size()) return false; // then finally order by feature list - if (std::lexicographical_compare( - lhs.features.begin(), lhs.features.end(), rhs.features.begin(), rhs.features.end())) + if (std::lexicographical_compare(lhs.features.begin(), + lhs.features.end(), + rhs.features.begin(), + rhs.features.end(), + DependencyFeatureLess{})) { return true; } @@ -194,7 +278,7 @@ namespace vcpkg void operator()(Dependency& dep) const { - std::sort(dep.features.begin(), dep.features.end()); + std::sort(dep.features.begin(), dep.features.end(), DependencyFeatureLess{}); dep.extra_info.sort_keys(); } void operator()(SourceParagraph& spgh) const @@ -202,7 +286,7 @@ namespace vcpkg std::for_each(spgh.dependencies.begin(), spgh.dependencies.end(), *this); std::sort(spgh.dependencies.begin(), spgh.dependencies.end(), DependencyLess{}); - std::sort(spgh.default_features.begin(), spgh.default_features.end()); + std::sort(spgh.default_features.begin(), spgh.default_features.end(), DependencyFeatureLess{}); spgh.extra_info.sort_keys(); } @@ -276,10 +360,7 @@ namespace vcpkg } else { - auto error_info = std::make_unique(); - error_info->name = origin.to_string(); - error_info->error = maybe_dependencies.error(); - return error_info; + return ParseControlErrorInfo::from_error(origin, std::move(maybe_dependencies).error()); } buf.clear(); @@ -288,14 +369,35 @@ namespace vcpkg auto maybe_default_features = parse_default_features_list(buf, origin, textrowcol); if (const auto default_features = maybe_default_features.get()) { - spgh->default_features = *default_features; + for (auto&& default_feature : *default_features) + { + if (default_feature == "core") + { + return ParseControlErrorInfo::from_error(origin, msg::format_error(msgDefaultFeatureCore)); + } + + if (default_feature == "default") + { + return ParseControlErrorInfo::from_error(origin, msg::format_error(msgDefaultFeatureDefault)); + } + + if (!Json::IdentifierDeserializer::is_ident(default_feature)) + { + return ParseControlErrorInfo::from_error(origin, + msg::format_error(msgDefaultFeatureIdentifier) + .append_raw('\n') + .append(msgNoteMessage) + .append(msgParseIdentifierError, + msg::value = default_feature, + msg::url = docs::manifests_url)); + } + + spgh->default_features.push_back({std::move(default_feature)}); + } } else { - auto error_info = std::make_unique(); - error_info->name = origin.to_string(); - error_info->error = maybe_default_features.error(); - return error_info; + return ParseControlErrorInfo::from_error(origin, std::move(maybe_default_features).error()); } auto supports_expr = parser.optional_field(SourceParagraphFields::SUPPORTS); @@ -340,10 +442,7 @@ namespace vcpkg } else { - auto error_info = std::make_unique(); - error_info->name = origin.to_string(); - error_info->error = maybe_dependencies.error(); - return error_info; + return ParseControlErrorInfo::from_error(origin, std::move(maybe_dependencies).error()); } auto err = parser.error_info(fpgh->name.empty() ? origin : fpgh->name); @@ -405,15 +504,146 @@ namespace vcpkg else { r.add_generic_error(type_name(), std::move(opt).error()); - return PlatformExpression::Expr::Empty(); + return PlatformExpression::Expr(); } } static const PlatformExprDeserializer instance; }; - const PlatformExprDeserializer PlatformExprDeserializer::instance; + struct DefaultFeatureNameDeserializer : Json::IDeserializer + { + virtual LocalizedString type_name() const override { return msg::format(msgADefaultFeature); } + virtual Optional visit_string(Json::Reader& r, StringView sv) const override + { + if (sv == "core") + { + r.add_generic_error(type_name(), msg::format(msgDefaultFeatureCore)); + return sv.to_string(); + } + + if (sv == "default") + { + r.add_generic_error(type_name(), msg::format(msgDefaultFeatureDefault)); + return sv.to_string(); + } + + return Json::FeatureNameDeserializer::instance.visit_string(r, sv); + } + static const DefaultFeatureNameDeserializer instance; + }; + + const DefaultFeatureNameDeserializer DefaultFeatureNameDeserializer::instance; + + struct DefaultFeatureDeserializer : Json::IDeserializer + { + LocalizedString type_name() const override { return msg::format(msgADefaultFeature); } + + constexpr static StringLiteral NAME = "name"; + constexpr static StringLiteral PLATFORM = "platform"; + + Span valid_fields() const override + { + static const StringView t[] = { + NAME, + PLATFORM, + }; + return t; + } + + Optional visit_string(Json::Reader& r, StringView sv) const override + { + return DefaultFeatureNameDeserializer::instance.visit_string(r, sv).map( + [](std::string&& name) { return DependencyRequestedFeature{std::move(name)}; }); + } + + Optional visit_object(Json::Reader& r, const Json::Object& obj) const override + { + DependencyRequestedFeature answer; + r.required_object_field(type_name(), obj, NAME, answer.name, DefaultFeatureNameDeserializer::instance); + r.optional_object_field(obj, PLATFORM, answer.platform, PlatformExprDeserializer::instance); + return answer; + } + + const static DefaultFeatureDeserializer instance; + }; + const DefaultFeatureDeserializer DefaultFeatureDeserializer::instance; + + struct DefaultFeatureArrayDeserializer : Json::ArrayDeserializer + { + LocalizedString type_name() const override { return msg::format(msgAnArrayOfDefaultFeatures); } + + static const DefaultFeatureArrayDeserializer instance; + }; + const DefaultFeatureArrayDeserializer DefaultFeatureArrayDeserializer::instance; + + struct DependencyFeatureNameDeserializer : Json::IDeserializer + { + virtual LocalizedString type_name() const override { return msg::format(msgAFeatureName); } + virtual Optional visit_string(Json::Reader& r, StringView sv) const override + { + if (sv == "core") + { + r.add_generic_error(type_name(), msg::format(msgDependencyFeatureCore)); + return sv.to_string(); + } + + if (sv == "default") + { + r.add_generic_error(type_name(), msg::format(msgDependencyFeatureDefault)); + return sv.to_string(); + } + + return Json::FeatureNameDeserializer::instance.visit_string(r, sv); + } + static const DependencyFeatureNameDeserializer instance; + }; + + const DependencyFeatureNameDeserializer DependencyFeatureNameDeserializer::instance; + + struct DependencyFeatureDeserializer : Json::IDeserializer + { + LocalizedString type_name() const override { return msg::format(msgADependencyFeature); } + + constexpr static StringLiteral NAME = "name"; + constexpr static StringLiteral PLATFORM = "platform"; + + Span valid_fields() const override + { + static const StringView t[] = { + NAME, + PLATFORM, + }; + return t; + } + + Optional visit_string(Json::Reader& r, StringView sv) const override + { + return DependencyFeatureNameDeserializer::instance.visit_string(r, sv).map( + [](std::string&& name) { return DependencyRequestedFeature{std::move(name)}; }); + } + + Optional visit_object(Json::Reader& r, const Json::Object& obj) const override + { + DependencyRequestedFeature result; + r.required_object_field(type_name(), obj, NAME, result.name, DependencyFeatureNameDeserializer::instance); + r.optional_object_field(obj, PLATFORM, result.platform, PlatformExprDeserializer::instance); + return result; + } + + const static DependencyFeatureDeserializer instance; + }; + const DependencyFeatureDeserializer DependencyFeatureDeserializer::instance; + + struct DependencyFeatureArrayDeserializer : Json::ArrayDeserializer + { + LocalizedString type_name() const override { return msg::format(msgAnArrayOfFeatures); } + + static const DependencyFeatureArrayDeserializer instance; + }; + const DependencyFeatureArrayDeserializer DependencyFeatureArrayDeserializer::instance; + struct DependencyDeserializer final : Json::IDeserializer { virtual LocalizedString type_name() const override { return msg::format(msgADependency); } @@ -441,14 +671,8 @@ namespace vcpkg virtual Optional visit_string(Json::Reader& r, StringView sv) const override { - if (!Json::IdentifierDeserializer::is_ident(sv)) - { - r.add_generic_error(type_name(), msg::format(msgInvalidDependency)); - } - - Dependency dep; - dep.name = sv.to_string(); - return dep; + return Json::PackageNameDeserializer::instance.visit_string(r, sv).map( + [](std::string&& name) { return Dependency{std::move(name)}; }); } virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) const override @@ -464,15 +688,9 @@ namespace vcpkg } r.required_object_field(type_name(), obj, NAME, dep.name, Json::PackageNameDeserializer::instance); - r.optional_object_field(obj, FEATURES, dep.features, Json::IdentifierArrayDeserializer::instance); - - bool default_features = true; - r.optional_object_field(obj, DEFAULT_FEATURES, default_features, Json::BooleanDeserializer::instance); - if (!default_features) - { - dep.features.emplace_back("core"); - } + r.optional_object_field(obj, FEATURES, dep.features, DependencyFeatureArrayDeserializer::instance); + r.optional_object_field(obj, DEFAULT_FEATURES, dep.default_features, Json::BooleanDeserializer::instance); r.optional_object_field(obj, HOST, dep.host, Json::BooleanDeserializer::instance); r.optional_object_field(obj, PLATFORM, dep.platform, PlatformExprDeserializer::instance); auto has_ge_constraint = r.optional_object_field( @@ -548,7 +766,7 @@ namespace vcpkg VersionScheme& version_scheme, int& port_version) { - r.required_object_field(type_name, obj, NAME, name, Json::IdentifierDeserializer::instance); + r.required_object_field(type_name, obj, NAME, name, Json::PackageNameDeserializer::instance); auto schemed_version = visit_required_schemed_deserializer(type_name, r, obj, true); version = schemed_version.version.text(); @@ -589,116 +807,6 @@ namespace vcpkg const DependencyOverrideArrayDeserializer DependencyOverrideArrayDeserializer::instance; - // reasoning for these two distinct types -- FeatureDeserializer and ArrayFeatureDeserializer: - // `"features"` may be defined in one of two ways: - // - An array of feature objects, which contains the `"name"` field - // - An object mapping feature names to feature objects, which do not contain the `"name"` field - // `ArrayFeatureDeserializer` is used for the former, `FeatureDeserializer` is used for the latter. - struct FeatureDeserializer final : Json::IDeserializer> - { - virtual LocalizedString type_name() const override { return msg::format(msgAFeature); } - - constexpr static StringLiteral NAME = "name"; - constexpr static StringLiteral DESCRIPTION = "description"; - constexpr static StringLiteral DEPENDENCIES = "dependencies"; - constexpr static StringLiteral SUPPORTS = "supports"; - - virtual Span valid_fields() const override - { - static constexpr StringView t[] = {DESCRIPTION, DEPENDENCIES, SUPPORTS}; - return t; - } - - virtual Optional> visit_object(Json::Reader& r, - const Json::Object& obj) const override - { - auto feature = std::make_unique(); - for (const auto& el : obj) - { - if (Strings::starts_with(el.first, "$")) - { - feature->extra_info.insert_or_replace(el.first.to_string(), el.second); - } - } - - r.required_object_field( - type_name(), obj, DESCRIPTION, feature->description, Json::ParagraphDeserializer::instance); - r.optional_object_field(obj, DEPENDENCIES, feature->dependencies, DependencyArrayDeserializer::instance); - r.optional_object_field(obj, SUPPORTS, feature->supports_expression, PlatformExprDeserializer::instance); - - return std::move(feature); // gcc-7 bug workaround redundant move - } - - static const FeatureDeserializer instance; - }; - - const FeatureDeserializer FeatureDeserializer::instance; - constexpr StringLiteral FeatureDeserializer::NAME; - constexpr StringLiteral FeatureDeserializer::DESCRIPTION; - constexpr StringLiteral FeatureDeserializer::DEPENDENCIES; - constexpr StringLiteral FeatureDeserializer::SUPPORTS; - - struct FeaturesObject - { - std::vector> feature_paragraphs; - Json::Object extra_features_info; - }; - - struct FeaturesFieldDeserializer final : Json::IDeserializer - { - virtual LocalizedString type_name() const override { return msg::format(msgASetOfFeatures); } - - virtual Span valid_fields() const override { return {}; } - - virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) const override - { - FeaturesObject res; - std::vector extra_fields; - - for (const auto& pr : obj) - { - if (Strings::starts_with(pr.first, "$")) - { - res.extra_features_info.insert(pr.first.to_string(), pr.second); - continue; - } - if (!Json::IdentifierDeserializer::is_ident(pr.first)) - { - r.add_generic_error(type_name(), msg::format(msgInvalidFeature)); - continue; - } - std::unique_ptr v; - r.visit_in_key(pr.second, pr.first, v, FeatureDeserializer::instance); - if (v) - { - v->name = pr.first.to_string(); - res.feature_paragraphs.push_back(std::move(v)); - } - } - - return std::move(res); // gcc-7 bug workaround redundant move - } - - static const FeaturesFieldDeserializer instance; - }; - - const FeaturesFieldDeserializer FeaturesFieldDeserializer::instance; - - struct ContactsDeserializer final : Json::IDeserializer - { - virtual LocalizedString type_name() const override { return msg::format(msgADictionaryOfContacts); } - - virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) const override - { - (void)r; - return obj; - } - - static const ContactsDeserializer instance; - }; - - const ContactsDeserializer ContactsDeserializer::instance; - static constexpr StringLiteral VALID_LICENSES[] = { #include "spdx-licenses.inc" }; @@ -954,6 +1062,122 @@ namespace vcpkg const LicenseExpressionDeserializer LicenseExpressionDeserializer::instance; + // reasoning for these two distinct types -- FeatureDeserializer and ArrayFeatureDeserializer: + // `"features"` may be defined in one of two ways: + // - An array of feature objects, which contains the `"name"` field + // - An object mapping feature names to feature objects, which do not contain the `"name"` field + // `ArrayFeatureDeserializer` is used for the former, `FeatureDeserializer` is used for the latter. + struct FeatureDeserializer final : Json::IDeserializer> + { + virtual LocalizedString type_name() const override { return msg::format(msgAFeature); } + + constexpr static StringLiteral NAME = "name"; + constexpr static StringLiteral DESCRIPTION = "description"; + constexpr static StringLiteral DEPENDENCIES = "dependencies"; + constexpr static StringLiteral SUPPORTS = "supports"; + constexpr static StringLiteral LICENSE = "license"; + + virtual Span valid_fields() const override + { + static constexpr StringView t[] = {DESCRIPTION, DEPENDENCIES, SUPPORTS, LICENSE}; + return t; + } + + virtual Optional> visit_object(Json::Reader& r, + const Json::Object& obj) const override + { + auto feature = std::make_unique(); + for (const auto& el : obj) + { + if (Strings::starts_with(el.first, "$")) + { + feature->extra_info.insert_or_replace(el.first.to_string(), el.second); + } + } + + r.required_object_field( + type_name(), obj, DESCRIPTION, feature->description, Json::ParagraphDeserializer::instance); + r.optional_object_field(obj, DEPENDENCIES, feature->dependencies, DependencyArrayDeserializer::instance); + r.optional_object_field(obj, SUPPORTS, feature->supports_expression, PlatformExprDeserializer::instance); + std::string license; + if (r.optional_object_field(obj, LICENSE, license, LicenseExpressionDeserializer::instance)) + { + feature->license = {std::move(license)}; + } + + return std::move(feature); // gcc-7 bug workaround redundant move + } + + static const FeatureDeserializer instance; + }; + + const FeatureDeserializer FeatureDeserializer::instance; + constexpr StringLiteral FeatureDeserializer::NAME; + constexpr StringLiteral FeatureDeserializer::DESCRIPTION; + constexpr StringLiteral FeatureDeserializer::DEPENDENCIES; + constexpr StringLiteral FeatureDeserializer::SUPPORTS; + + struct FeaturesObject + { + std::vector> feature_paragraphs; + Json::Object extra_features_info; + }; + + struct FeaturesFieldDeserializer final : Json::IDeserializer + { + virtual LocalizedString type_name() const override { return msg::format(msgASetOfFeatures); } + + virtual Span valid_fields() const override { return {}; } + + virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) const override + { + FeaturesObject res; + std::vector extra_fields; + + for (const auto& pr : obj) + { + if (Strings::starts_with(pr.first, "$")) + { + res.extra_features_info.insert(pr.first.to_string(), pr.second); + continue; + } + if (!Json::IdentifierDeserializer::is_ident(pr.first)) + { + r.add_generic_error(type_name(), msg::format(msgInvalidFeature)); + continue; + } + std::unique_ptr v; + r.visit_in_key(pr.second, pr.first, v, FeatureDeserializer::instance); + if (v) + { + v->name = pr.first.to_string(); + res.feature_paragraphs.push_back(std::move(v)); + } + } + + return std::move(res); // gcc-7 bug workaround redundant move + } + + static const FeaturesFieldDeserializer instance; + }; + + const FeaturesFieldDeserializer FeaturesFieldDeserializer::instance; + + struct ContactsDeserializer final : Json::IDeserializer + { + virtual LocalizedString type_name() const override { return msg::format(msgADictionaryOfContacts); } + + virtual Optional visit_object(Json::Reader& r, const Json::Object& obj) const override + { + (void)r; + return obj; + } + + static const ContactsDeserializer instance; + }; + + const ContactsDeserializer ContactsDeserializer::instance; + struct BaselineCommitDeserializer final : Json::IDeserializer { virtual LocalizedString type_name() const override { return msg::format(msgAVcpkgRepositoryCommit); } @@ -1050,9 +1274,8 @@ namespace vcpkg } r.optional_object_field(obj, SUPPORTS, spgh.supports_expression, PlatformExprDeserializer::instance); - r.optional_object_field( - obj, DEFAULT_FEATURES, spgh.default_features, Json::IdentifierArrayDeserializer::instance); + obj, DEFAULT_FEATURES, spgh.default_features, DefaultFeatureArrayDeserializer::instance); FeaturesObject features_tmp; r.optional_object_field(obj, FEATURES, features_tmp, FeaturesFieldDeserializer::instance); @@ -1105,7 +1328,7 @@ namespace vcpkg auto& spgh = *control_file->core_paragraph; - r.optional_object_field(obj, NAME, spgh.name, Json::IdentifierDeserializer::instance); + r.optional_object_field(obj, NAME, spgh.name, Json::PackageNameDeserializer::instance); auto maybe_schemed_version = visit_optional_schemed_deserializer(type_name(), r, obj, false); if (auto p = maybe_schemed_version.get()) { @@ -1136,7 +1359,7 @@ namespace vcpkg auto& spgh = *control_file->core_paragraph; - r.required_object_field(type_name(), obj, NAME, spgh.name, Json::IdentifierDeserializer::instance); + r.required_object_field(type_name(), obj, NAME, spgh.name, Json::PackageNameDeserializer::instance); auto schemed_version = visit_required_schemed_deserializer(type_name(), r, obj, false); spgh.raw_version = schemed_version.version.text(); spgh.version_scheme = schemed_version.scheme; @@ -1398,18 +1621,16 @@ namespace vcpkg return Strings::starts_with(sv, "Error") || Strings::starts_with(sv, "error: "); } - void print_error_message(Span> error_info_list) + void print_error_message(const LocalizedString& message) { - auto msg = ParseControlErrorInfo::format_errors(error_info_list); - // To preserve previous behavior, each line starting with "Error" should be error-colored. All other lines // should be neutral color. // To minimize the number of print calls on Windows (which is a significant performance bottleneck), this // algorithm chunks groups of similarly-colored lines. - const char* start_of_chunk = msg.data(); - const char* end_of_chunk = msg.data(); - const char* const last = msg.data() + msg.size(); + const char* start_of_chunk = message.data().data(); + const char* end_of_chunk = start_of_chunk; + const char* const last = start_of_chunk + message.data().size(); while (end_of_chunk != last) { while (end_of_chunk != last && starts_with_error({end_of_chunk, last})) @@ -1432,6 +1653,14 @@ namespace vcpkg start_of_chunk = end_of_chunk; } } + + msg::println(); + } + + void print_error_message(const std::unique_ptr& error_info_list) + { + print_error_message(LocalizedString::from_raw( + ParseControlErrorInfo::format_errors(View>{&error_info_list, 1}))); } Optional SourceControlFile::find_feature(StringView featurename) const @@ -1476,15 +1705,20 @@ namespace vcpkg std::vector filter_dependencies(const std::vector& deps, Triplet target, Triplet host, - const std::unordered_map& cmake_vars, - ImplicitDefault id) + const std::unordered_map& cmake_vars) { std::vector ret; for (auto&& dep : deps) { if (dep.platform.evaluate(cmake_vars)) { - ret.emplace_back(dep.to_full_spec(target, host, id)); + std::vector features; + features.reserve(dep.features.size()); + for (const auto& f : dep.features) + { + if (f.platform.evaluate(cmake_vars)) features.push_back(f.name); + } + ret.emplace_back(dep.to_full_spec(features, target, host)); } } return ret; @@ -1492,7 +1726,7 @@ namespace vcpkg static bool is_dependency_trivial(const Dependency& dep) { - return dep.features.empty() && dep.platform.is_empty() && dep.extra_info.is_empty() && + return dep.features.empty() && dep.default_features && dep.platform.is_empty() && dep.extra_info.is_empty() && dep.constraint.type == VersionConstraintKind::None && !dep.host; } @@ -1514,16 +1748,6 @@ namespace vcpkg return; } - auto& arr = obj.insert(name, Json::Array()); - for (const auto& s : pgh) - { - arr.push_back(Json::Value::string(s)); - } - }; - auto serialize_optional_array = - [&](Json::Object& obj, StringLiteral name, const std::vector& pgh) { - if (pgh.empty()) return; - auto& arr = obj.insert(name, Json::Array()); for (const auto& s : pgh) { @@ -1536,6 +1760,26 @@ namespace vcpkg obj.insert(name, s); } }; + auto serialize_dependency_features = [&](Json::Object& obj, StringLiteral name, const auto& features) { + if (!features.empty()) + { + auto& features_array = obj.insert(name, Json::Array()); + for (const auto& f : features) + { + if (f.platform.is_empty()) + { + features_array.push_back(Json::Value::string(f.name)); + } + else + { + Json::Object entry; + entry.insert(DependencyFeatureDeserializer::NAME, f.name); + entry.insert(DependencyFeatureDeserializer::PLATFORM, to_string(f.platform)); + features_array.push_back(std::move(entry)); + } + } + } + }; auto serialize_dependency = [&](Json::Array& arr, const Dependency& dep) { if (is_dependency_trivial(dep)) { @@ -1552,15 +1796,11 @@ namespace vcpkg dep_obj.insert(DependencyDeserializer::NAME, dep.name); if (dep.host) dep_obj.insert(DependencyDeserializer::HOST, Json::Value::boolean(true)); - auto features_copy = dep.features; - auto core_it = std::find(features_copy.begin(), features_copy.end(), "core"); - if (core_it != features_copy.end()) + if (!dep.default_features) { dep_obj.insert(DependencyDeserializer::DEFAULT_FEATURES, Json::Value::boolean(false)); - features_copy.erase(core_it); } - - serialize_optional_array(dep_obj, DependencyDeserializer::FEATURES, features_copy); + serialize_dependency_features(dep_obj, DependencyDeserializer::FEATURES, dep.features); serialize_optional_string(dep_obj, DependencyDeserializer::PLATFORM, to_string(dep.platform)); if (dep.constraint.type == VersionConstraintKind::Minimum) { @@ -1586,6 +1826,21 @@ namespace vcpkg serialize_schemed_version(dep_obj, dep.version_scheme, dep.version, dep.port_version); }; + auto serialize_license = + [&](Json::Object& obj, StringLiteral name, const Optional& maybe_license) { + if (auto license = maybe_license.get()) + { + if (license->empty()) + { + obj.insert(name, Json::Value::null(nullptr)); + } + else + { + obj.insert(name, Json::Value::string(*license)); + } + } + }; + Json::Object obj; for (const auto& el : scf.core_paragraph->extra_info) @@ -1621,17 +1876,7 @@ namespace vcpkg serialize_optional_string(obj, ManifestDeserializer::HOMEPAGE, scf.core_paragraph->homepage); serialize_optional_string(obj, ManifestDeserializer::DOCUMENTATION, scf.core_paragraph->documentation); - if (auto license = scf.core_paragraph->license.get()) - { - if (license->empty()) - { - obj.insert(ManifestDeserializer::LICENSE, Json::Value::null(nullptr)); - } - else - { - obj.insert(ManifestDeserializer::LICENSE, Json::Value::string(*license)); - } - } + serialize_license(obj, ManifestDeserializer::LICENSE, scf.core_paragraph->license); serialize_optional_string( obj, ManifestDeserializer::SUPPORTS, to_string(scf.core_paragraph->supports_expression)); @@ -1651,7 +1896,8 @@ namespace vcpkg } } - serialize_optional_array(obj, ManifestDeserializer::DEFAULT_FEATURES, scf.core_paragraph->default_features); + serialize_dependency_features( + obj, ManifestDeserializer::DEFAULT_FEATURES, scf.core_paragraph->default_features); if (!scf.feature_paragraphs.empty() || !scf.extra_features_info.is_empty()) { @@ -1671,6 +1917,7 @@ namespace vcpkg serialize_paragraph(feature_obj, FeatureDeserializer::DESCRIPTION, feature->description, true); serialize_optional_string( feature_obj, FeatureDeserializer::SUPPORTS, to_string(feature->supports_expression)); + serialize_license(feature_obj, FeatureDeserializer::LICENSE, feature->license); if (!feature->dependencies.empty()) { diff --git a/src/vcpkg/spdx.cpp b/src/vcpkg/spdx.cpp index a6259c274a..374e36a1f6 100644 --- a/src/vcpkg/spdx.cpp +++ b/src/vcpkg/spdx.cpp @@ -8,6 +8,11 @@ using namespace vcpkg; +static std::string fix_ref_version(StringView ref, StringView version) +{ + return Strings::replace_all(ref, "${VERSION}", version); +} + static std::string conclude_license(const std::string& license) { if (license.empty()) return "NOASSERTION"; @@ -71,12 +76,12 @@ static Json::Object make_resource( auto& chk = obj.insert("checksums", Json::Array()); auto& chk512 = chk.push_back(Json::Object()); chk512.insert("algorithm", "SHA512"); - chk512.insert("checksumValue", Strings::ascii_to_lowercase(sha512.to_string())); + chk512.insert("checksumValue", Strings::ascii_to_lowercase(sha512)); } return obj; } -Json::Value vcpkg::run_resource_heuristics(StringView contents) +Json::Value vcpkg::run_resource_heuristics(StringView contents, StringView portRawVersion) { // These are a sequence of heuristics to enable proof-of-concept extraction of remote resources for SPDX SBOM // inclusion @@ -87,8 +92,9 @@ Json::Value vcpkg::run_resource_heuristics(StringView contents) if (!github.empty()) { auto repo = extract_cmake_invocation_argument(github, "REPO"); - auto ref = extract_cmake_invocation_argument(github, "REF"); + auto ref = fix_ref_version(extract_cmake_invocation_argument(github, "REF"), portRawVersion); auto sha = extract_cmake_invocation_argument(github, "SHA512"); + packages.push_back(make_resource(fmt::format("SPDXRef-resource-{}", ++n), repo.to_string(), fmt::format("git+https://github.com/{}@{}", repo, ref), @@ -99,7 +105,7 @@ Json::Value vcpkg::run_resource_heuristics(StringView contents) if (!git.empty()) { auto url = extract_cmake_invocation_argument(github, "URL"); - auto ref = extract_cmake_invocation_argument(github, "REF"); + auto ref = fix_ref_version(extract_cmake_invocation_argument(github, "REF"), portRawVersion); packages.push_back(make_resource( fmt::format("SPDXRef-resource-{}", ++n), url.to_string(), fmt::format("git+{}@{}", url, ref), {}, {})); } @@ -116,7 +122,7 @@ Json::Value vcpkg::run_resource_heuristics(StringView contents) if (!sfg.empty()) { auto repo = extract_cmake_invocation_argument(sfg, "REPO"); - auto ref = extract_cmake_invocation_argument(sfg, "REF"); + auto ref = fix_ref_version(extract_cmake_invocation_argument(sfg, "REF"), portRawVersion); auto filename = extract_cmake_invocation_argument(sfg, "FILENAME"); auto sha = extract_cmake_invocation_argument(sfg, "SHA512"); auto url = Strings::concat("https://sourceforge.net/projects/", repo, "/files/", ref, '/', filename); diff --git a/src/vcpkg/statusparagraph.cpp b/src/vcpkg/statusparagraph.cpp index 470431538e..a739b58b07 100644 --- a/src/vcpkg/statusparagraph.cpp +++ b/src/vcpkg/statusparagraph.cpp @@ -96,6 +96,18 @@ namespace vcpkg return deps; } + InternalFeatureSet InstalledPackageView::feature_list() const + { + InternalFeatureSet ret; + ret.emplace_back("core"); + for (const auto& f : features) + { + ret.emplace_back(f->package.feature); + } + return ret; + } + Version InstalledPackageView::version() const { return {core->package.version, core->package.port_version}; } + std::vector InstalledPackageView::dependencies() const { // accumulate all features in installed dependencies diff --git a/src/vcpkg/statusparagraphs.cpp b/src/vcpkg/statusparagraphs.cpp index d8a53eccfe..3c110c58d6 100644 --- a/src/vcpkg/statusparagraphs.cpp +++ b/src/vcpkg/statusparagraphs.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include #include @@ -151,7 +151,9 @@ namespace vcpkg } } - Json::Value serialize_ipv(const InstalledPackageView& ipv, const InstalledPaths& installed, const Filesystem& fs) + Json::Value serialize_ipv(const InstalledPackageView& ipv, + const InstalledPaths& installed, + const ReadOnlyFilesystem& fs) { Json::Object iobj; iobj.insert("version-string", Json::Value::string(ipv.core->package.version)); diff --git a/src/vcpkg/tools.cpp b/src/vcpkg/tools.cpp index e6e9a0783b..c4cd4a2c62 100644 --- a/src/vcpkg/tools.cpp +++ b/src/vcpkg/tools.cpp @@ -192,7 +192,7 @@ namespace vcpkg // considered. virtual bool ignore_version() const { return false; } - virtual void add_system_paths(Filesystem& fs, std::vector& out_candidate_paths) const + virtual void add_system_paths(const ReadOnlyFilesystem& fs, std::vector& out_candidate_paths) const { (void)fs; (void)out_candidate_paths; @@ -240,7 +240,7 @@ namespace vcpkg virtual std::array default_min_version() const override { return {3, 17, 1}; } #if defined(_WIN32) - virtual void add_system_paths(Filesystem&, std::vector& out_candidate_paths) const override + virtual void add_system_paths(const ReadOnlyFilesystem&, std::vector& out_candidate_paths) const override { const auto& program_files = get_program_files_platform_bitness(); if (const auto pf = program_files.get()) @@ -346,7 +346,7 @@ namespace vcpkg virtual std::array default_min_version() const override { return {16, 12, 0}; } #if defined(_WIN32) - virtual void add_system_paths(Filesystem&, std::vector& out_candidate_paths) const override + virtual void add_system_paths(const ReadOnlyFilesystem&, std::vector& out_candidate_paths) const override { const auto& program_files = get_program_files_platform_bitness(); if (const auto pf = program_files.get()) out_candidate_paths.push_back(*pf / "nodejs" / "node.exe"); @@ -373,7 +373,7 @@ namespace vcpkg virtual std::array default_min_version() const override { return {2, 7, 4}; } #if defined(_WIN32) - virtual void add_system_paths(Filesystem&, std::vector& out_candidate_paths) const override + virtual void add_system_paths(const ReadOnlyFilesystem&, std::vector& out_candidate_paths) const override { const auto& program_files = get_program_files_platform_bitness(); if (const auto pf = program_files.get()) out_candidate_paths.push_back(*pf / "git" / "cmd" / "git.exe"); @@ -527,7 +527,7 @@ namespace vcpkg virtual std::array default_min_version() const override { return {3, 5, 0}; } // 3.5 added -m venv #if defined(_WIN32) - void add_system_paths_impl(Filesystem& fs, + void add_system_paths_impl(const ReadOnlyFilesystem& fs, std::vector& out_candidate_paths, const Path& program_files_root) const { @@ -542,7 +542,8 @@ namespace vcpkg } } - virtual void add_system_paths(Filesystem& fs, std::vector& out_candidate_paths) const + virtual void add_system_paths(const ReadOnlyFilesystem& fs, + std::vector& out_candidate_paths) const override { const auto& program_files = get_program_files_platform_bitness(); if (const auto pf = program_files.get()) @@ -602,7 +603,7 @@ namespace vcpkg struct ToolCacheImpl final : ToolCache { - Filesystem& fs; + const Filesystem& fs; const std::shared_ptr downloader; const Path downloads; const Path xml_config; @@ -612,7 +613,7 @@ namespace vcpkg vcpkg::Lazy xml_config_contents; vcpkg::Cache path_version_cache; - ToolCacheImpl(Filesystem& fs, + ToolCacheImpl(const Filesystem& fs, const std::shared_ptr& downloader, Path downloads, Path xml_config, @@ -627,16 +628,23 @@ namespace vcpkg { } - template + /** + * @param accept_version Callback that accepts a std::array and returns true if the version is accepted + * @param log_candidate Callback that accepts Path, ExpectedL maybe_version. Gets called on every + * existing candidate. + */ + template Optional find_first_with_sufficient_version(MessageSink& status_sink, const ToolProvider& tool_provider, const std::vector& candidates, - Func&& accept_version) const + Func&& accept_version, + const Func2& log_candidate) const { for (auto&& candidate : candidates) { if (!fs.exists(candidate, IgnoreErrors{})) continue; auto maybe_version = tool_provider.get_version(*this, status_sink, candidate); + log_candidate(candidate, maybe_version); const auto version = maybe_version.get(); if (!version) continue; const auto parsed_version = parse_tool_version_string(*version); @@ -697,7 +705,7 @@ namespace vcpkg else #endif // ^^^ _WIN32 { - extract_archive(fs, *this, status_sink, download_path, tool_dir_path); + set_directory_to_archive_contents(fs, *this, status_sink, download_path, tool_dir_path); } } else @@ -772,6 +780,7 @@ namespace vcpkg tool.add_system_paths(fs, candidate_paths); } + std::string considered_versions; if (ignore_version) { // If we are forcing the system copy (and therefore ignoring versions), take the first entry that @@ -804,6 +813,12 @@ namespace vcpkg (actual_version[0] == min_version[0] && actual_version[1] > min_version[1]) || (actual_version[0] == min_version[0] && actual_version[1] == min_version[1] && actual_version[2] >= min_version[2]); + }, + [&](const auto& path, const ExpectedL& maybe_version) { + considered_versions += fmt::format("{}: {}\n", + path, + maybe_version.has_value() ? *maybe_version.get() + : maybe_version.error().data()); }); if (const auto p = maybe_path.get()) { @@ -824,11 +839,12 @@ namespace vcpkg } // If no acceptable tool was found and downloading was unavailable, emit an error message - LocalizedString s = msg::format(msg::msgErrorMessage); + LocalizedString s = msg::format(msgErrorMessage); s.append(msgToolFetchFailed, msg::tool_name = tool.tool_data_name()); if (env_force_system_binaries && download_available) { - s.append_raw(' ').append(msgDownloadAvailable, msg::env_var = s_env_vcpkg_force_system_binaries); + s.append_raw(' ').append(msgDownloadAvailable, + msg::env_var = format_environment_variable(s_env_vcpkg_force_system_binaries)); } if (consider_system) { @@ -838,6 +854,13 @@ namespace vcpkg { s.append_raw(' ').append(msgUnknownTool); } + if (!considered_versions.empty()) + { + s.append_raw('\n') + .append(msgConsideredVersions, msg::version = fmt::join(min_version, ".")) + .append_raw('\n') + .append_raw(considered_versions); + } Checks::msg_exit_maybe_upgrade(VCPKG_LINE_INFO, s); } @@ -880,12 +903,12 @@ namespace vcpkg } }; - ExpectedL find_system_tar(const Filesystem& fs) + ExpectedL find_system_tar(const ReadOnlyFilesystem& fs) { const auto tools = fs.find_from_PATH(Tools::TAR); if (tools.empty()) { - return msg::format(msg::msgErrorMessage) + return msg::format(msgErrorMessage) .append(msgToolFetchFailed, msg::tool_name = Tools::TAR) #if defined(_WIN32) .append(msgToolInWin10) @@ -900,7 +923,7 @@ namespace vcpkg } } - ExpectedL find_system_cmake(const Filesystem& fs) + ExpectedL find_system_cmake(const ReadOnlyFilesystem& fs) { auto tools = fs.find_from_PATH(Tools::CMAKE); if (!tools.empty()) @@ -925,7 +948,7 @@ namespace vcpkg } #endif - return msg::format(msg::msgErrorMessage) + return msg::format(msgErrorMessage) .append(msgToolFetchFailed, msg::tool_name = Tools::CMAKE) #if !defined(_WIN32) .append(msgInstallWithSystemManager) @@ -933,7 +956,7 @@ namespace vcpkg ; } - std::unique_ptr get_tool_cache(Filesystem& fs, + std::unique_ptr get_tool_cache(const Filesystem& fs, std::shared_ptr downloader, Path downloads, Path xml_config, diff --git a/src/vcpkg/triplet.cpp b/src/vcpkg/triplet.cpp index 1ecec3ac2a..6277794192 100644 --- a/src/vcpkg/triplet.cpp +++ b/src/vcpkg/triplet.cpp @@ -1,6 +1,8 @@ #include #include +#include +#include #include #include #include @@ -33,7 +35,7 @@ namespace vcpkg Triplet Triplet::from_canonical_name(std::string triplet_as_string) { static std::unordered_set g_triplet_instances; - Strings::ascii_to_lowercase(triplet_as_string.data(), triplet_as_string.data() + triplet_as_string.size()); + Strings::inplace_ascii_to_lowercase(triplet_as_string); const auto p = g_triplet_instances.emplace(std::move(triplet_as_string)); return &*p.first; } @@ -82,63 +84,83 @@ namespace vcpkg { return CPUArchitecture::RISCV64; } + if (Strings::starts_with(this->canonical_name(), "loongarch32-")) + { + return CPUArchitecture::LOONGARCH32; + } + if (Strings::starts_with(this->canonical_name(), "loongarch64-")) + { + return CPUArchitecture::LOONGARCH64; + } return nullopt; } - static Triplet system_triplet() + static std::string system_triplet_canonical_name() { auto host_proc = get_host_processor(); - auto canonical_name = fmt::format("{}-{}", to_zstring_view(host_proc), get_host_os_name()); - return Triplet::from_canonical_name(std::move(canonical_name)); + return fmt::format("{}-{}", to_zstring_view(host_proc), get_host_os_name()); } - Triplet default_triplet(const VcpkgCmdArguments& args) + Triplet default_triplet(const VcpkgCmdArguments& args, const TripletDatabase& database) { - if (auto triplet = args.triplet.get()) + if (auto triplet_name = args.triplet.get()) { - return Triplet::from_canonical_name(*triplet); + check_triplet(*triplet_name, database); + return Triplet::from_canonical_name(*triplet_name); } -#if defined(_WIN32) - return Triplet::from_canonical_name("x86-windows"); -#else - return system_triplet(); -#endif + + return default_host_triplet(args, database); } - Triplet default_host_triplet(const VcpkgCmdArguments& args) + Triplet default_host_triplet(const VcpkgCmdArguments& args, const TripletDatabase& database) { - if (auto host_triplet = args.host_triplet.get()) - { - return Triplet::from_canonical_name(*host_triplet); - } - return system_triplet(); + auto host_triplet_name = args.host_triplet.value_or(system_triplet_canonical_name()); + check_triplet(host_triplet_name, database); + return Triplet::from_canonical_name(host_triplet_name); } - void print_default_triplet_warning(const VcpkgCmdArguments& args, View specs) + void print_default_triplet_warning(const VcpkgCmdArguments& args, const TripletDatabase& database) { (void)args; - (void)specs; + (void)database; #if defined(_WIN32) - // The triplet is not set by --triplet or VCPKG_DEFAULT_TRIPLET if (!args.triplet.has_value()) { - if (specs.size() == 0) - { - msg::println_warning(msgDefaultTriplet, msg::triplet = default_host_triplet(args)); - return; - } - for (auto&& arg : specs) - { - const std::string as_lowercase = Strings::ascii_to_lowercase(std::string{arg}); - auto maybe_qpkg = parse_qualified_specifier(as_lowercase); - if (maybe_qpkg.has_value() && !maybe_qpkg.get()->triplet.has_value()) - { - msg::println_warning(msgDefaultTriplet, msg::triplet = default_host_triplet(args)); - return; - } - } + // Remove this warning in March 2024 + // The triplet is not set by --triplet or VCPKG_DEFAULT_TRIPLET + msg::println_warning(msgDefaultTripletChanged, msg::triplet = default_host_triplet(args, database)); } -#endif +#endif // ^^^ _WIN32 + } + + TripletFile::TripletFile(StringView name, StringView location) : name(name.data(), name.size()), location(location) + { + } + + Path TripletFile::get_full_path() const { return location / (name + ".cmake"); } + + Path TripletDatabase::get_triplet_file_path(Triplet triplet) const + { + auto it = Util::find_if(available_triplets, + [&](const TripletFile& tf) { return tf.name == triplet.canonical_name(); }); + + if (it == available_triplets.end()) + { + Checks::msg_exit_with_message( + VCPKG_LINE_INFO, msgTripletFileNotFound, msg::triplet = triplet.canonical_name()); + } + + return it->get_full_path(); + } + + bool TripletDatabase::is_valid_triplet_name(StringView name) const + { + return is_valid_triplet_canonical_name(Strings::ascii_to_lowercase(name)); + } + + bool TripletDatabase::is_valid_triplet_canonical_name(StringView name) const + { + return Util::any_of(available_triplets, [=](const TripletFile& tf) { return tf.name == name; }); } } diff --git a/src/vcpkg/vcpkgcmdarguments.cpp b/src/vcpkg/vcpkgcmdarguments.cpp index a8938aacaa..bda11c57f4 100644 --- a/src/vcpkg/vcpkgcmdarguments.cpp +++ b/src/vcpkg/vcpkgcmdarguments.cpp @@ -10,6 +10,10 @@ #include #include +#include +#include +#include + namespace { using namespace vcpkg; @@ -66,9 +70,9 @@ namespace void maybe_parse_cmd_arguments(CmdParser& cmd_parser, ParsedArguments& output, - const CommandStructure& command_structure) + const CommandMetadata& command_metadata) { - for (const auto& switch_ : command_structure.options.switches) + for (const auto& switch_ : command_metadata.options.switches) { bool parse_result; auto name = switch_.name.to_string(); @@ -86,7 +90,7 @@ namespace if (switch_.helpmsg) { - if (cmd_parser.parse_switch(name, tag, parse_result, switch_.helpmsg()) && parse_result) + if (cmd_parser.parse_switch(name, tag, parse_result, switch_.helpmsg.to_string()) && parse_result) { output.switches.emplace(switch_.name.to_string()); } @@ -102,7 +106,7 @@ namespace { std::string maybe_parse_result; - for (const auto& option : command_structure.options.settings) + for (const auto& option : command_metadata.options.settings) { auto name = option.name.to_string(); StabilityTag tag = StabilityTag::Standard; @@ -119,7 +123,7 @@ namespace if (option.helpmsg) { - if (cmd_parser.parse_option(name, tag, maybe_parse_result, option.helpmsg())) + if (cmd_parser.parse_option(name, tag, maybe_parse_result, option.helpmsg.to_string())) { output.settings.emplace(option.name.to_string(), std::move(maybe_parse_result)); } @@ -134,7 +138,7 @@ namespace } } - for (const auto& option : command_structure.options.multisettings) + for (const auto& option : command_metadata.options.multisettings) { auto name = option.name.to_string(); StabilityTag tag = StabilityTag::Standard; @@ -152,7 +156,7 @@ namespace std::vector maybe_parse_result; if (option.helpmsg) { - if (cmd_parser.parse_multi_option(name, tag, maybe_parse_result, option.helpmsg())) + if (cmd_parser.parse_multi_option(name, tag, maybe_parse_result, option.helpmsg.to_string())) { output.multisettings.emplace(option.name.to_string(), std::move(maybe_parse_result)); } @@ -181,6 +185,38 @@ namespace vcpkg return &loc->second; } + LocalizedString MetadataMessage::to_string() const + { + switch (kind) + { + case MetadataMessageKind::Message: return msg::format(*message); + case MetadataMessageKind::Literal: return LocalizedString::from_raw(literal); + case MetadataMessageKind::Callback: return callback(); + case MetadataMessageKind::Unused: + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + void MetadataMessage::to_string(LocalizedString& target) const + { + switch (kind) + { + case MetadataMessageKind::Message: msg::format_to(target, *message); return; + case MetadataMessageKind::Literal: target.append_raw(literal); return; + case MetadataMessageKind::Callback: target.append(callback()); return; + case MetadataMessageKind::Unused: + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + + MetadataMessage::operator bool() const noexcept { return kind != MetadataMessageKind::Unused; } + + LocalizedString LearnWebsiteLinkLiteral::to_string() const { return LocalizedString::from_raw(literal); } + + void LearnWebsiteLinkLiteral::to_string(LocalizedString& target) const { target.append_raw(literal); } + + LearnWebsiteLinkLiteral::operator bool() const noexcept { return literal != nullptr; } + static void set_from_feature_flag(const std::vector& flags, StringView flag, Optional& place) { if (!place.has_value()) @@ -222,6 +258,7 @@ namespace vcpkg {VcpkgCmdArguments::COMPILER_TRACKING_FEATURE, args.compiler_tracking}, {VcpkgCmdArguments::REGISTRIES_FEATURE, args.registries_feature}, {VcpkgCmdArguments::VERSIONS_FEATURE, args.versions_feature}, + {VcpkgCmdArguments::DEPENDENCY_GRAPH_FEATURE, args.dependency_graph_feature}, }; for (const auto& desc : flag_descriptions) @@ -230,6 +267,28 @@ namespace vcpkg } } + PortApplicableSetting::PortApplicableSetting(StringView setting) + { + auto split = Strings::split(setting, ';'); + if (!split.empty()) + { + value = std::move(split[0]); + split.erase(split.begin()); + Util::sort(split); + affected_ports = std::move(split); + } + } + + PortApplicableSetting::PortApplicableSetting(const PortApplicableSetting&) = default; + PortApplicableSetting::PortApplicableSetting(PortApplicableSetting&&) = default; + PortApplicableSetting& PortApplicableSetting::operator=(const PortApplicableSetting&) = default; + PortApplicableSetting& PortApplicableSetting::operator=(PortApplicableSetting&&) = default; + + bool PortApplicableSetting::is_port_affected(StringView port_name) const noexcept + { + return affected_ports.empty() || std::binary_search(affected_ports.begin(), affected_ports.end(), port_name); + } + VcpkgCmdArguments VcpkgCmdArguments::create_from_command_line(const ILineReader& fs, const int argc, const CommandLineCharType* const* const argv) @@ -255,27 +314,31 @@ namespace vcpkg args.parser.parse_switch( EXACT_ABI_TOOLS_VERSIONS_SWITCH, StabilityTag::Experimental, args.exact_abi_tools_versions); - args.parser.parse_option(VCPKG_ROOT_DIR_ARG, - StabilityTag::Standard, - args.vcpkg_root_dir_arg, - msg::format(msgVcpkgRootsDir, msg::env_var = "VCPKG_ROOT")); - args.parser.parse_option(TRIPLET_ARG, - StabilityTag::Standard, - args.triplet, - msg::format(msgSpecifyTargetArch, msg::env_var = "VCPKG_DEFAULT_TRIPLET")); - args.parser.parse_option(HOST_TRIPLET_ARG, - StabilityTag::Standard, - args.host_triplet, - msg::format(msgSpecifyHostArch, msg::env_var = "VCPKG_DEFAULT_HOST_TRIPLET")); + args.parser.parse_option( + VCPKG_ROOT_DIR_ARG, + StabilityTag::Standard, + args.vcpkg_root_dir_arg, + msg::format(msgVcpkgRootsDir, msg::env_var = format_environment_variable("VCPKG_ROOT"))); + args.parser.parse_option( + TRIPLET_ARG, + StabilityTag::Standard, + args.triplet, + msg::format(msgSpecifyTargetArch, msg::env_var = format_environment_variable("VCPKG_DEFAULT_TRIPLET"))); + args.parser.parse_option( + HOST_TRIPLET_ARG, + StabilityTag::Standard, + args.host_triplet, + msg::format(msgSpecifyHostArch, msg::env_var = format_environment_variable("VCPKG_DEFAULT_HOST_TRIPLET"))); args.parser.parse_option(MANIFEST_ROOT_DIR_ARG, StabilityTag::Experimental, args.manifest_root_dir); args.parser.parse_option(BUILDTREES_ROOT_DIR_ARG, StabilityTag::Experimental, args.buildtrees_root_dir, msg::format(msgBuildTreesRootDir)); - args.parser.parse_option(DOWNLOADS_ROOT_DIR_ARG, - StabilityTag::Standard, - args.downloads_root_dir, - msg::format(msgDownloadRootsDir, msg::env_var = "VCPKG_DOWNLOADS")); + args.parser.parse_option( + DOWNLOADS_ROOT_DIR_ARG, + StabilityTag::Standard, + args.downloads_root_dir, + msg::format(msgDownloadRootsDir, msg::env_var = format_environment_variable("VCPKG_DOWNLOADS"))); args.parser.parse_option( INSTALL_ROOT_DIR_ARG, StabilityTag::Experimental, args.install_root_dir, msg::format(msgInstallRootDir)); args.parser.parse_option( @@ -289,19 +352,31 @@ namespace vcpkg StabilityTag::Experimental, args.asset_sources_template_arg, msg::format(msgAssetSourcesArg)); + { + std::string raw_cmake_debug; + if (args.parser.parse_option(CMAKE_DEBUGGING_ARG, StabilityTag::Experimental, raw_cmake_debug)) + { + args.cmake_debug.emplace(raw_cmake_debug); + } + + if (args.parser.parse_option(CMAKE_CONFIGURE_DEBUGGING_ARG, StabilityTag::Experimental, raw_cmake_debug)) + { + args.cmake_configure_debug.emplace(raw_cmake_debug); + } + } args.parser.parse_multi_option( OVERLAY_PORTS_ARG, StabilityTag::Standard, args.cli_overlay_ports, - msg::format(msgSpecifyDirectoriesWhenSearching, msg::env_var = "VCPKG_OVERLAY_PORTS")); + msg::format(msgOverlayPortsDirectoriesHelp, msg::env_var = format_environment_variable(OVERLAY_PORTS_ENV))); + args.parser.parse_multi_option(OVERLAY_TRIPLETS_ARG, + StabilityTag::Standard, + args.cli_overlay_triplets, + msg::format(msgOverlayTripletDirectoriesHelp, + msg::env_var = format_environment_variable(OVERLAY_TRIPLETS_ENV))); args.parser.parse_multi_option( - OVERLAY_TRIPLETS_ARG, - StabilityTag::Standard, - args.cli_overlay_triplets, - msg::format(msgSpecifyDirectoriesContaining, msg::env_var = "VCPKG_OVERLAY_TRIPLETS")); - args.parser.parse_multi_option( - BINARY_SOURCES_ARG, StabilityTag::Standard, args.binary_sources, msg::format(msgBinarySourcesArg)); + BINARY_SOURCES_ARG, StabilityTag::Standard, args.cli_binary_sources, msg::format(msgBinarySourcesArg)); args.parser.parse_multi_option(CMAKE_SCRIPT_ARG, StabilityTag::Standard, args.cmake_args); std::vector feature_flags; @@ -329,16 +404,16 @@ namespace vcpkg return args; } - ParsedArguments VcpkgCmdArguments::parse_arguments(const CommandStructure& command_structure) const + ParsedArguments VcpkgCmdArguments::parse_arguments(const CommandMetadata& command_metadata) const { ParsedArguments output; auto cmd_parser = this->parser; - maybe_parse_cmd_arguments(cmd_parser, output, command_structure); - if (command_structure.maximum_arity == 0) + maybe_parse_cmd_arguments(cmd_parser, output, command_metadata); + if (command_metadata.maximum_arity == 0) { cmd_parser.enforce_no_remaining_args(command); } - else if (command_structure.minimum_arity == 0 && command_structure.maximum_arity == 1) + else if (command_metadata.minimum_arity == 0 && command_metadata.maximum_arity == 1) { auto maybe_arg = cmd_parser.consume_only_remaining_arg_optional(command); if (auto arg = maybe_arg.get()) @@ -346,28 +421,21 @@ namespace vcpkg output.command_arguments.push_back(std::move(*arg)); } } - else if (command_structure.minimum_arity == 1 && command_structure.maximum_arity == 1) + else if (command_metadata.minimum_arity == 1 && command_metadata.maximum_arity == 1) { output.command_arguments.push_back(cmd_parser.consume_only_remaining_arg(command)); } - else if (command_structure.minimum_arity == command_structure.maximum_arity) + else if (command_metadata.minimum_arity == command_metadata.maximum_arity) { - output.command_arguments = cmd_parser.consume_remaining_args(command, command_structure.minimum_arity); + output.command_arguments = cmd_parser.consume_remaining_args(command, command_metadata.minimum_arity); } else { output.command_arguments = cmd_parser.consume_remaining_args( - command, command_structure.minimum_arity, command_structure.maximum_arity); - } - - LocalizedString example_text; - const auto get_example_text = command_structure.get_example_text; - if (get_example_text) - { - example_text = get_example_text(); + command, command_metadata.minimum_arity, command_metadata.maximum_arity); } - cmd_parser.exit_with_errors(example_text); + cmd_parser.exit_with_errors(command_metadata.get_example_text()); return output; } @@ -384,57 +452,60 @@ namespace vcpkg VcpkgCmdArguments::VcpkgCmdArguments(CmdParser&& parser_) : parser(std::move(parser_)) { } - void print_command_list_usage() + LocalizedString CommandMetadata::get_example_text() const { - HelpTableFormatter table; - table.header("Commands"); - table.format("vcpkg search [pat]", msg::format(msgHelpSearchCommand)); - table.format("vcpkg install ...", msg::format(msgHelpInstallCommand)); - table.format("vcpkg remove ...", msg::format(msgHelpRemoveCommand)); - table.format("vcpkg update", msg::format(msgHelpUpdateCommand)); - table.format("vcpkg remove --outdated", msg::format(msgHelpRemoveOutdatedCommand)); - table.format("vcpkg upgrade", msg::format(msgHelpUpgradeCommand)); - table.format("vcpkg hash [alg]", msg::format(msgHelpHashCommand)); - table.format("vcpkg help topics", msg::format(msgHelpTopicsCommand)); - table.format("vcpkg help ", msg::format(msgHelpTopicCommand)); - table.format("vcpkg list", msg::format(msgHelpListCommand)); - table.blank(); - Commands::Integrate::append_helpstring(table); - table.blank(); - table.format("vcpkg export ... [opt]...", msg::format(msgHelpExportCommand)); - table.format("vcpkg edit ", msg::format(msgHelpEditCommand, msg::env_var = "EDITOR")); - table.format("vcpkg create [archivename]", msg::format(msgHelpCreateCommand)); - table.format("vcpkg x-init-registry ", msg::format(msgHelpInitializeRegistryCommand)); - table.format("vcpkg format-manifest --all", msg::format(msgHelpFormatManifestCommand)); - table.format("vcpkg owns ", msg::format(msgHelpOwnsCommand)); - table.format("vcpkg depend-info ...", msg::format(msgHelpDependInfoCommand)); - table.format("vcpkg env", msg::format(msgHelpEnvCommand)); - table.format("vcpkg version", msg::format(msgHelpVersionCommand)); - table.format("vcpkg contact", msg::format(msgHelpContactCommand)); - table.blank(); - table.format(msg::format(msgResponseFileCode), msg::format(msgHelpResponseFileCommand)); - table.blank(); - table.example(msg::format(msgHelpExampleCommand)); - - msg::println(LocalizedString::from_raw(table.m_str)); + LocalizedString result; + if (examples[0]) + { + examples[0].to_string(result); + for (std::size_t idx = 1; idx < example_max_size; ++idx) + { + if (examples[idx]) + { + result.append_raw('\n'); + examples[idx].to_string(result); + } + } + } + + return result; } - void print_usage(const CommandStructure& command_structure) + void print_usage(const CommandMetadata& command_metadata) { auto with_common_options = VcpkgCmdArguments::create_from_arg_sequence(nullptr, nullptr); ParsedArguments throwaway; - maybe_parse_cmd_arguments(with_common_options.parser, throwaway, command_structure); + maybe_parse_cmd_arguments(with_common_options.parser, throwaway, command_metadata); LocalizedString result; - const auto get_example_text = command_structure.get_example_text; - if (get_example_text) + if (command_metadata.synopsis) { - auto example_text = get_example_text(); - if (!example_text.empty()) + result.append(msgSynopsisHeader); + result.append_raw(' '); + command_metadata.synopsis.to_string(result); + result.append_raw('\n'); + } + + std::vector examples; + for (auto&& maybe_example : command_metadata.examples) + { + if (maybe_example) { - result.append(example_text).append_raw('\n'); + examples.push_back(maybe_example.to_string()); } } + if (!examples.empty()) + { + result.append(msgExamplesHeader); + result.append_floating_list(1, examples); + result.append_raw('\n'); + } + + if (command_metadata.website_link) + { + result.append(msgSeeURL, msg::url = command_metadata.website_link.to_string()).append_raw('\n'); + } + with_common_options.parser.append_options_table(result); msg::println(result); } @@ -476,11 +547,29 @@ namespace vcpkg from_env(get_env, TRIPLET_ENV, triplet); from_env(get_env, HOST_TRIPLET_ENV, host_triplet); - vcpkg_root_dir_env = get_environment_variable(VCPKG_ROOT_DIR_ENV); + vcpkg_root_dir_env = get_env(VCPKG_ROOT_DIR_ENV); from_env(get_env, DOWNLOADS_ROOT_DIR_ENV, downloads_root_dir); - from_env(get_env, DEFAULT_VISUAL_STUDIO_PATH_ENV, default_visual_studio_path); from_env(get_env, ASSET_SOURCES_ENV, asset_sources_template_env); from_env(get_env, REGISTRIES_CACHE_DIR_ENV, registries_cache_dir); + from_env(get_env, DEFAULT_VISUAL_STUDIO_PATH_ENV, default_visual_studio_path); + from_env(get_env, BINARY_SOURCES_ENV, env_binary_sources); + from_env(get_env, ACTIONS_CACHE_URL_ENV, actions_cache_url); + from_env(get_env, ACTIONS_RUNTIME_TOKEN_ENV, actions_runtime_token); + from_env(get_env, NUGET_ID_PREFIX_ENV, nuget_id_prefix); + use_nuget_cache = get_env(VCPKG_USE_NUGET_CACHE_ENV).map([](const std::string& s) { + return Strings::case_insensitive_ascii_equals(s, "true") || s == "1"; + }); + from_env(get_env, VCPKG_NUGET_REPOSITORY_ENV, vcpkg_nuget_repository); + from_env(get_env, GITHUB_REPOSITORY_ENV, github_repository); + from_env(get_env, GITHUB_SERVER_URL_ENV, github_server_url); + from_env(get_env, GITHUB_REF_ENV, github_ref); + from_env(get_env, GITHUB_SHA_ENV, github_sha); + from_env(get_env, GITHUB_JOB_ENV, github_job); + from_env(get_env, GITHUB_REPOSITORY_ID, github_repository_id); + from_env(get_env, GITHUB_REPOSITORY_OWNER_ID, github_repository_owner_id); + from_env(get_env, GITHUB_RUN_ID_ENV, github_run_id); + from_env(get_env, GITHUB_TOKEN_ENV, github_token); + from_env(get_env, GITHUB_WORKFLOW_ENV, github_workflow); // detect whether we are running in a CI environment for (auto&& ci_env_var : KNOWN_CI_VARIABLES) @@ -619,7 +708,7 @@ namespace vcpkg StringView option; bool is_inconsistent; } possible_inconsistencies[] = { - {BINARY_CACHING_FEATURE, BINARY_SOURCES_ARG, !binary_sources.empty() && !binary_caching.value_or(true)}, + {BINARY_CACHING_FEATURE, BINARY_SOURCES_ARG, !cli_binary_sources.empty() && !binary_caching.value_or(true)}, }; for (const auto& el : possible_inconsistencies) { @@ -645,6 +734,7 @@ namespace vcpkg {COMPILER_TRACKING_FEATURE, compiler_tracking}, {REGISTRIES_FEATURE, registries_feature}, {VERSIONS_FEATURE, versions_feature}, + {DEPENDENCY_GRAPH_FEATURE, dependency_graph_feature}, }; for (const auto& flag : flags) @@ -665,6 +755,7 @@ namespace vcpkg MetricsSubmission submission; submission.track_bool(BoolMetric::FeatureFlagBinaryCaching, binary_caching_enabled()); submission.track_bool(BoolMetric::FeatureFlagCompilerTracking, compiler_tracking_enabled()); + submission.track_bool(BoolMetric::FeatureFlagDependencyGraph, dependency_graph_enabled()); submission.track_bool(BoolMetric::FeatureFlagRegistries, registries_enabled()); submission.track_bool(BoolMetric::FeatureFlagVersions, versions_enabled()); get_global_metrics_collector().track_submission(std::move(submission)); @@ -672,11 +763,24 @@ namespace vcpkg void VcpkgCmdArguments::track_environment_metrics() const { + MetricsSubmission submission; if (auto ci_env = m_detected_ci_environment.get()) { Debug::println("Detected CI environment: ", *ci_env); - get_global_metrics_collector().track_string(StringMetric::DetectedCiEnvironment, *ci_env); + submission.track_string(StringMetric::DetectedCiEnvironment, *ci_env); + } + + if (auto repo_id = github_repository_id.get()) + { + submission.track_string(StringMetric::CiProjectId, *repo_id); } + + if (auto owner_id = github_repository_owner_id.get()) + { + submission.track_string(StringMetric::CiOwnerId, *owner_id); + } + + get_global_metrics_collector().track_submission(std::move(submission)); } Optional VcpkgCmdArguments::asset_sources_template() const @@ -691,15 +795,6 @@ namespace vcpkg return Optional(std::move(asset_sources_template)); } - LocalizedString create_example_string(StringView command_and_arguments) - { - return msg::format(msgExample) - .append_raw('\n') - .append_indent() - .append_raw("vcpkg ") - .append_raw(command_and_arguments); - } - // out-of-line definitions since C++14 doesn't allow inline constexpr static variables constexpr StringLiteral VcpkgCmdArguments::VCPKG_ROOT_DIR_ENV; constexpr StringLiteral VcpkgCmdArguments::VCPKG_ROOT_DIR_ARG; @@ -726,6 +821,11 @@ namespace vcpkg constexpr StringLiteral VcpkgCmdArguments::OVERLAY_TRIPLETS_ARG; constexpr StringLiteral VcpkgCmdArguments::BINARY_SOURCES_ARG; + constexpr StringLiteral VcpkgCmdArguments::BINARY_SOURCES_ENV; + constexpr StringLiteral VcpkgCmdArguments::ACTIONS_CACHE_URL_ENV; + constexpr StringLiteral VcpkgCmdArguments::ACTIONS_RUNTIME_TOKEN_ENV; + constexpr StringLiteral VcpkgCmdArguments::NUGET_ID_PREFIX_ENV; + constexpr StringLiteral VcpkgCmdArguments::VCPKG_USE_NUGET_CACHE_ENV; constexpr StringLiteral VcpkgCmdArguments::DEBUG_SWITCH; constexpr StringLiteral VcpkgCmdArguments::DEBUG_ENV_SWITCH; @@ -741,10 +841,21 @@ namespace vcpkg constexpr StringLiteral VcpkgCmdArguments::ASSET_SOURCES_ENV; constexpr StringLiteral VcpkgCmdArguments::ASSET_SOURCES_ARG; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_JOB_ENV; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_RUN_ID_ENV; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_REPOSITORY_ENV; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_REF_ENV; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_SHA_ENV; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_REPOSITORY_ID; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_REPOSITORY_OWNER_ID; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_TOKEN_ENV; + constexpr StringLiteral VcpkgCmdArguments::GITHUB_WORKFLOW_ENV; + constexpr StringLiteral VcpkgCmdArguments::FEATURE_FLAGS_ENV; constexpr StringLiteral VcpkgCmdArguments::FEATURE_FLAGS_ARG; constexpr StringLiteral VcpkgCmdArguments::FEATURE_PACKAGES_SWITCH; + constexpr StringLiteral VcpkgCmdArguments::DEPENDENCY_GRAPH_FEATURE; constexpr StringLiteral VcpkgCmdArguments::BINARY_CACHING_FEATURE; constexpr StringLiteral VcpkgCmdArguments::BINARY_CACHING_SWITCH; constexpr StringLiteral VcpkgCmdArguments::COMPILER_TRACKING_FEATURE; @@ -754,5 +865,7 @@ namespace vcpkg constexpr StringLiteral VcpkgCmdArguments::VERSIONS_FEATURE; constexpr StringLiteral VcpkgCmdArguments::CMAKE_SCRIPT_ARG; + constexpr StringLiteral VcpkgCmdArguments::CMAKE_DEBUGGING_ARG; + constexpr StringLiteral VcpkgCmdArguments::CMAKE_CONFIGURE_DEBUGGING_ARG; constexpr StringLiteral VcpkgCmdArguments::EXACT_ABI_TOOLS_VERSIONS_SWITCH; } diff --git a/src/vcpkg/vcpkglib.cpp b/src/vcpkg/vcpkglib.cpp index f7cc983f38..fd8bb5a86a 100644 --- a/src/vcpkg/vcpkglib.cpp +++ b/src/vcpkg/vcpkglib.cpp @@ -10,7 +10,7 @@ namespace vcpkg { - static StatusParagraphs load_current_database(Filesystem& fs, + static StatusParagraphs load_current_database(const Filesystem& fs, const Path& vcpkg_dir_status_file, const Path& vcpkg_dir_status_file_old) { @@ -37,7 +37,7 @@ namespace vcpkg return StatusParagraphs(std::move(status_pghs)); } - StatusParagraphs database_load_check(Filesystem& fs, const InstalledPaths& installed) + StatusParagraphs database_load_check(const Filesystem& fs, const InstalledPaths& installed) { const auto updates_dir = installed.vcpkg_dir_updates(); @@ -83,7 +83,7 @@ namespace vcpkg return current_status_db; } - void write_update(Filesystem& fs, const InstalledPaths& installed, const StatusParagraph& p) + void write_update(const Filesystem& fs, const InstalledPaths& installed, const StatusParagraph& p) { static std::atomic update_id = 0; @@ -93,7 +93,7 @@ namespace vcpkg fs.write_rename_contents(update_path, "incomplete", Strings::serialize(p), VCPKG_LINE_INFO); } - static void upgrade_to_slash_terminated_sorted_format(Filesystem& fs, + static void upgrade_to_slash_terminated_sorted_format(const Filesystem& fs, std::vector* lines, const Path& listfile_path) { @@ -189,7 +189,7 @@ namespace vcpkg return Util::fmap(ipv_map, [](auto&& p) -> InstalledPackageView { return std::move(p.second); }); } - std::vector get_installed_files(Filesystem& fs, + std::vector get_installed_files(const Filesystem& fs, const InstalledPaths& installed, const StatusParagraphs& status_db) { @@ -205,7 +205,7 @@ namespace vcpkg const auto listfile_path = installed.listfile_path(pgh->package); std::vector installed_files_of_current_pgh = fs.read_lines(listfile_path).value_or_exit(VCPKG_LINE_INFO); - Strings::trim_all_and_remove_whitespace_strings(&installed_files_of_current_pgh); + Strings::inplace_trim_all_and_remove_whitespace_strings(installed_files_of_current_pgh); upgrade_to_slash_terminated_sorted_format(fs, &installed_files_of_current_pgh, listfile_path); // Remove the directories diff --git a/src/vcpkg/vcpkgpaths.cpp b/src/vcpkg/vcpkgpaths.cpp index f865e9abee..96226e1680 100644 --- a/src/vcpkg/vcpkgpaths.cpp +++ b/src/vcpkg/vcpkgpaths.cpp @@ -16,8 +16,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -37,8 +37,11 @@ namespace { using namespace vcpkg; - Path process_input_directory_impl( - Filesystem& filesystem, const Path& root, const std::string* option, StringLiteral name, LineInfo li) + Path process_input_directory_impl(const ReadOnlyFilesystem& filesystem, + const Path& root, + const std::string* option, + StringLiteral name, + LineInfo li) { if (option) { @@ -50,20 +53,23 @@ namespace } } - Path process_input_directory( - Filesystem& filesystem, const Path& root, const std::string* option, StringLiteral name, LineInfo li) + Path process_input_directory(const ReadOnlyFilesystem& filesystem, + const Path& root, + const std::string* option, + StringLiteral name, + LineInfo li) { auto result = process_input_directory_impl(filesystem, root, option, name, li); Debug::print("Using ", name, "-root: ", result, '\n'); return result; } - Path process_output_directory(Filesystem& fs, const std::string* option, const Path& default_path) + Path process_output_directory(const ReadOnlyFilesystem& fs, const std::string* option, const Path& default_path) { return fs.almost_canonical(option ? Path(*option) : default_path, VCPKG_LINE_INFO); } - ManifestAndPath load_manifest(const Filesystem& fs, const Path& manifest_dir) + ManifestAndPath load_manifest(const ReadOnlyFilesystem& fs, const Path& manifest_dir) { std::error_code ec; auto manifest_path = manifest_dir / "vcpkg.json"; @@ -205,7 +211,7 @@ namespace return ret; } - Optional maybe_get_tmp_path(const Filesystem& fs, + Optional maybe_get_tmp_path(const ReadOnlyFilesystem& fs, const Optional& installed, const Path& root, bool root_read_only, @@ -235,7 +241,7 @@ namespace } } - Path compute_manifest_dir(const Filesystem& fs, const VcpkgCmdArguments& args, const Path& original_cwd) + Path compute_manifest_dir(const ReadOnlyFilesystem& fs, const VcpkgCmdArguments& args, const Path& original_cwd) { if (auto manifest_root_dir = args.manifest_root_dir.get()) { @@ -250,22 +256,21 @@ namespace // This structure holds members for VcpkgPathsImpl that don't require explicit initialization/destruction struct VcpkgPathsImplStage0 { - Lazy> available_triplets; + Lazy triplets_db; Lazy toolsets; Lazy> cmake_script_hashes; Lazy ports_cmake_hash; - Cache m_triplets_cache; Optional m_installed_lock; }; - Path compute_registries_cache_root(const Filesystem& fs, const VcpkgCmdArguments& args) + Path compute_registries_cache_root(const ReadOnlyFilesystem& fs, const VcpkgCmdArguments& args) { Path ret; if (auto registries_cache_dir = args.registries_cache_dir.get()) { get_global_metrics_collector().track_define(DefineMetric::X_VcpkgRegistriesCache); ret = *registries_cache_dir; - const auto status = get_real_filesystem().status(ret, VCPKG_LINE_INFO); + const auto status = real_filesystem.status(ret, VCPKG_LINE_INFO); if (!vcpkg::is_directory(status)) { @@ -291,7 +296,7 @@ namespace // 2. Are const (and therefore initialized in the initializer list) struct VcpkgPathsImplStage1 : VcpkgPathsImplStage0 { - VcpkgPathsImplStage1(Filesystem& fs, + VcpkgPathsImplStage1(const Filesystem& fs, const VcpkgCmdArguments& args, const BundleSettings& bundle, const Path& root, @@ -314,7 +319,7 @@ namespace Debug::println("Using builtin-ports: ", m_builtin_ports); } - Filesystem& m_fs; + const Filesystem& m_fs; const FeatureFlagSettings m_ff_settings; const Path m_manifest_dir; const BundleSettings m_bundle; @@ -325,8 +330,11 @@ namespace const Path m_registries_cache; }; - Optional compute_installed( - Filesystem& fs, const VcpkgCmdArguments& args, const Path& root, bool root_read_only, const Path& manifest_dir) + Optional compute_installed(const ReadOnlyFilesystem& fs, + const VcpkgCmdArguments& args, + const Path& root, + bool root_read_only, + const Path& manifest_dir) { if (manifest_dir.empty()) { @@ -343,7 +351,7 @@ namespace return nullopt; } - Path compute_downloads_root(const Filesystem& fs, + Path compute_downloads_root(const ReadOnlyFilesystem& fs, const VcpkgCmdArguments& args, const Path& root, bool root_read_only) @@ -366,7 +374,7 @@ namespace } // Guaranteed to return non-empty - Path determine_root(const Filesystem& fs, const Path& original_cwd, const VcpkgCmdArguments& args) + Path determine_root(const ReadOnlyFilesystem& fs, const Path& original_cwd, const VcpkgCmdArguments& args) { Path ret; if (auto vcpkg_root_dir_arg = args.vcpkg_root_dir_arg.get()) @@ -407,7 +415,7 @@ namespace return ret; } - Path preferred_current_path(const Filesystem& fs) + Path preferred_current_path(const ReadOnlyFilesystem& fs) { #if defined(_WIN32) return vcpkg::win32_fix_path_case(fs.current_path(VCPKG_LINE_INFO)); @@ -473,7 +481,7 @@ namespace return obj; } - vcpkg::LockFile load_lockfile(const Filesystem& fs, const Path& p) + vcpkg::LockFile load_lockfile(const ReadOnlyFilesystem& fs, const Path& p) { vcpkg::LockFile ret; std::error_code ec; @@ -513,7 +521,7 @@ namespace vcpkg struct VcpkgPathsImpl : VcpkgPathsImplStage1 { - VcpkgPathsImpl(Filesystem& fs, + VcpkgPathsImpl(const Filesystem& fs, const VcpkgCmdArguments& args, const BundleSettings bundle, const Path& root, @@ -620,7 +628,7 @@ namespace vcpkg ConfigurationAndSource m_config; }; - VcpkgPaths::VcpkgPaths(Filesystem& filesystem, const VcpkgCmdArguments& args, const BundleSettings& bundle) + VcpkgPaths::VcpkgPaths(const Filesystem& filesystem, const VcpkgCmdArguments& args, const BundleSettings& bundle) : original_cwd(preferred_current_path(filesystem)) , root(determine_root(filesystem, original_cwd, args)) // this is used during the initialization of the below public members @@ -662,17 +670,19 @@ namespace vcpkg return (m_pimpl->m_config.directory / overlay_path).native(); }; + std::vector overlay_triplet_paths; + std::vector overlay_port_paths; + if (!m_pimpl->m_config.directory.empty()) { auto& config = m_pimpl->m_config.config; - Util::transform(config.overlay_ports, resolve_relative_to_config); - Util::transform(config.overlay_triplets, resolve_relative_to_config); + overlay_triplet_paths = Util::fmap(config.overlay_triplets, resolve_relative_to_config); + overlay_port_paths = Util::fmap(config.overlay_ports, resolve_relative_to_config); } - overlay_ports = - merge_overlays(args.cli_overlay_ports, m_pimpl->m_config.config.overlay_ports, args.env_overlay_ports); - overlay_triplets = merge_overlays( - args.cli_overlay_triplets, m_pimpl->m_config.config.overlay_triplets, args.env_overlay_triplets); + overlay_ports = merge_overlays(args.cli_overlay_ports, overlay_port_paths, args.env_overlay_ports); + overlay_triplets = + merge_overlays(args.cli_overlay_triplets, overlay_triplet_paths, args.env_overlay_triplets); } for (const std::string& triplet : this->overlay_triplets) @@ -693,37 +703,23 @@ namespace vcpkg return this->package_dir(spec) / "BUILD_INFO"; } - bool VcpkgPaths::is_valid_triplet(Triplet t) const + const TripletDatabase& VcpkgPaths::get_triplet_db() const { - const auto it = Util::find_if(this->get_available_triplets(), [&](auto&& available_triplet) { - return t.canonical_name() == available_triplet.name; - }); - return it != this->get_available_triplets().cend(); - } - - const std::vector VcpkgPaths::get_available_triplets_names() const - { - return vcpkg::Util::fmap(this->get_available_triplets(), - [](auto&& triplet_file) -> std::string { return triplet_file.name; }); - } - - const std::vector& VcpkgPaths::get_available_triplets() const - { - return m_pimpl->available_triplets.get_lazy([this]() -> std::vector { - std::vector output; - Filesystem& fs = this->get_filesystem(); + return m_pimpl->triplets_db.get_lazy([this]() -> TripletDatabase { + std::vector available_triplets; + const Filesystem& fs = this->get_filesystem(); for (auto&& triplets_dir : m_pimpl->triplets_dirs) { for (auto&& path : fs.get_regular_files_non_recursive(triplets_dir, VCPKG_LINE_INFO)) { if (Strings::case_insensitive_ascii_equals(path.extension(), ".cmake")) { - output.emplace_back(path.stem(), triplets_dir); + available_triplets.emplace_back(path.stem(), triplets_dir); } } } - return output; + return TripletDatabase{triplets, community_triplets, std::move(available_triplets)}; }); } @@ -754,24 +750,6 @@ namespace vcpkg }); } - const Path VcpkgPaths::get_triplet_file_path(Triplet triplet) const - { - return m_pimpl->m_triplets_cache.get_lazy( - triplet, [&]() -> auto{ - for (const auto& triplet_dir : m_pimpl->triplets_dirs) - { - auto path = triplet_dir / (triplet.canonical_name() + ".cmake"); - if (this->get_filesystem().exists(path, IgnoreErrors{})) - { - return path; - } - } - - Checks::msg_exit_with_message( - VCPKG_LINE_INFO, msgTripletFileNotFound, msg::triplet = triplet.canonical_name()); - }); - } - LockFile& VcpkgPaths::get_installed_lockfile() const { if (!m_pimpl->m_installed_lock.has_value()) @@ -832,11 +810,21 @@ namespace vcpkg Path VcpkgPaths::baselines_output() const { return buildtrees() / "versioning_" / "baselines"; } Path VcpkgPaths::versions_output() const { return buildtrees() / "versioning_" / "versions"; } + bool VcpkgPaths::try_provision_vcpkg_artifacts() const + { + switch (m_pimpl->m_bundle.deployment) + { + case DeploymentKind::Git: return true; + case DeploymentKind::OneLiner: return false; // handled by z-boostrap-standalone + case DeploymentKind::VisualStudio: return false; // bundled in VS itself + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } std::string VcpkgPaths::get_toolver_diagnostics() const { std::string ret; - Strings::append(ret, " vcpkg-tool version: ", Commands::Version::version, "\n"); + Strings::append(ret, " vcpkg-tool version: ", vcpkg_executable_version, "\n"); if (m_pimpl->m_bundle.read_only) { Strings::append(ret, " vcpkg-readonly: true\n"); @@ -866,7 +854,7 @@ namespace vcpkg return ret; } - Filesystem& VcpkgPaths::get_filesystem() const { return m_pimpl->m_fs; } + const Filesystem& VcpkgPaths::get_filesystem() const { return m_pimpl->m_fs; } const DownloadManager& VcpkgPaths::get_download_manager() const { return *m_pimpl->m_download_manager; } const ToolCache& VcpkgPaths::get_tool_cache() const { return *m_pimpl->m_tool_cache; } const Path& VcpkgPaths::get_tool_exe(StringView tool, MessageSink& status_messages) const @@ -911,7 +899,8 @@ namespace vcpkg auto cmd = git_cmd_builder(this->root / ".git", this->root); cmd.string_arg("rev-parse").string_arg("HEAD"); return flatten_out(cmd_execute_and_capture_output(cmd), Tools::GIT).map([](std::string&& output) { - return Strings::trim(std::move(output)); + Strings::inplace_trim(output); + return std::move(output); }); } @@ -943,81 +932,23 @@ namespace vcpkg * Since we are checking a git tree object, all files will be checked out to the root of `work-tree`. * Because of that, it makes sense to use the git hash as the name for the directory. */ - Filesystem& fs = get_filesystem(); + const Filesystem& fs = get_filesystem(); auto destination = this->versions_output() / port_name / git_tree; if (fs.exists(destination, IgnoreErrors{})) { return destination; } - const auto destination_tmp = this->versions_output() / port_name / Strings::concat(git_tree, ".tmp"); - const auto destination_tar = this->versions_output() / port_name / Strings::concat(git_tree, ".tar"); - std::error_code ec; - Path failure_point; - fs.remove_all(destination_tmp, ec, failure_point); - if (ec) - { - return msg::format(msg::msgErrorMessage) - .append(format_filesystem_call_error(ec, "remove_all", {destination_tmp})) - .append_raw('\n') - .append(msg::msgNoteMessage) - .append(msgWhileCheckingOutPortTreeIsh, msg::package_name = port_name, msg::commit_sha = git_tree); - } - fs.create_directories(destination_tmp, ec); - if (ec) - { - return msg::format(msg::msgErrorMessage) - .append(format_filesystem_call_error(ec, "create_directories", {destination_tmp})) - .append_raw('\n') - .append(msg::msgNoteMessage) - .append(msgWhileCheckingOutPortTreeIsh, msg::package_name = port_name, msg::commit_sha = git_tree); - } - - auto tar_cmd_builder = git_cmd_builder(dot_git_dir, dot_git_dir) - .string_arg("archive") - .string_arg(git_tree) - .string_arg("-o") - .string_arg(destination_tar); - auto maybe_tar_output = flatten(cmd_execute_and_capture_output(tar_cmd_builder), Tools::TAR); - if (!maybe_tar_output) - { - auto message = msg::format_error(msgGitCommandFailed, msg::command_line = tar_cmd_builder.command_line()); - const auto& git_config = git_builtin_config(); - if (is_shallow_clone(git_config).value_or(false)) - { - message.append_raw('\n').append(msgShallowRepositoryDetected, msg::path = git_config.git_dir); - } - - message.append_raw('\n') - .append(msg::msgNoteMessage) - .append(msgWhileCheckingOutPortTreeIsh, msg::package_name = port_name, msg::commit_sha = git_tree) - .append_raw('\n') - .append(maybe_tar_output.error()); - - return message; - } - - extract_tar_cmake(this->get_tool_exe(Tools::CMAKE, stdout_sink), destination_tar, destination_tmp); - fs.remove(destination_tar, ec); - if (ec) + auto maybe_tree = git_read_tree(destination, git_tree, dot_git_dir); + if (maybe_tree) { - return msg::format(msg::msgErrorMessage) - .append(format_filesystem_call_error(ec, "remove", {destination_tar})) - .append_raw('\n') - .append(msg::msgNoteMessage) - .append(msgWhileCheckingOutPortTreeIsh, msg::package_name = port_name, msg::commit_sha = git_tree); - } - fs.rename_with_retry(destination_tmp, destination, ec); - if (ec) - { - return msg::format(msg::msgErrorMessage) - .append(format_filesystem_call_error(ec, "rename_with_retry", {destination_tmp, destination})) - .append_raw('\n') - .append(msg::msgNoteMessage) - .append(msgWhileCheckingOutPortTreeIsh, msg::package_name = port_name, msg::commit_sha = git_tree); + return destination; } - return destination; + return std::move(maybe_tree) + .error() + .append(msgNoteMessage) + .append(msgWhileCheckingOutPortTreeIsh, msg::package_name = port_name, msg::commit_sha = git_tree); } ExpectedL VcpkgPaths::git_show(StringView treeish, const Path& dot_git_dir) const @@ -1078,7 +1009,7 @@ namespace vcpkg .append_raw('\n') .append(std::move(maybe_output).error()) .append_raw('\n') - .append(msg::msgNoteMessage) + .append(msgNoteMessage) .append(msgWhileGettingLocalTreeIshObjectsForPorts); } @@ -1194,56 +1125,98 @@ namespace vcpkg .string_arg(revision); return flatten_out(cmd_execute_and_capture_output(git_rev_parse), Tools::GIT).map([](std::string&& output) { - return Strings::trim(std::move(output)); + Strings::inplace_trim(output); + return std::move(output); }); } - ExpectedL VcpkgPaths::git_checkout_object_from_remote_registry(StringView object) const + + ExpectedL VcpkgPaths::git_read_tree(const Path& destination, StringView tree, const Path& dot_git_dir) const { auto& fs = get_filesystem(); - fs.create_directories(m_pimpl->m_registries_git_trees, VCPKG_LINE_INFO); - - auto git_tree_final = m_pimpl->m_registries_git_trees / object; - if (fs.exists(git_tree_final, IgnoreErrors{})) + std::error_code ec; + auto pid = get_process_id(); + Path git_tree_temp = fmt::format("{}_{}.tmp", destination, pid); + Path git_tree_index = fmt::format("{}_{}.index", destination, pid); + auto parent = destination.parent_path(); + if (!parent.empty()) { - return git_tree_final; + fs.create_directories(parent, ec); + if (ec) + { + return format_filesystem_call_error(ec, "create_directories", {parent}); + } } - auto pid = get_process_id(); + fs.remove_all(git_tree_temp, ec); + if (ec) + { + return format_filesystem_call_error(ec, "remove_all", {git_tree_temp}); + } - Path git_tree_temp = fmt::format("{}.tmp{}", git_tree_final, pid); - Path git_tree_temp_tar = git_tree_temp.native() + ".tar"; - fs.remove_all(git_tree_temp, VCPKG_LINE_INFO); - fs.create_directory(git_tree_temp, VCPKG_LINE_INFO); + fs.create_directory(git_tree_temp, ec); + if (ec) + { + return format_filesystem_call_error(ec, "create_directory", {git_tree_temp}); + } - const auto& dot_git_dir = m_pimpl->m_registries_dot_git_dir; - Command git_archive = git_cmd_builder(dot_git_dir, m_pimpl->m_registries_work_tree_dir) - .string_arg("archive") - .string_arg("--format") - .string_arg("tar") - .string_arg(object) - .string_arg("--output") - .string_arg(git_tree_temp_tar); - auto maybe_git_archive_output = flatten(cmd_execute_and_capture_output(git_archive), Tools::GIT); - if (!maybe_git_archive_output) - { - return msg::format_error(msgGitCommandFailed, msg::command_line = git_archive.command_line()) - .append_raw('\n') - .append(std::move(maybe_git_archive_output).error()); + fs.remove_all(destination, ec); + if (ec) + { + return format_filesystem_call_error(ec, "remove_all", {destination}); } - extract_tar_cmake(get_tool_exe(Tools::CMAKE, stdout_sink), git_tree_temp_tar, git_tree_temp); - // Attempt to remove temporary files, though non-critical. - fs.remove(git_tree_temp_tar, IgnoreErrors{}); + Command git_archive = git_cmd_builder(dot_git_dir, git_tree_temp) + .string_arg("read-tree") + .string_arg("-m") + .string_arg("-u") + .string_arg(tree); - std::error_code ec; - fs.rename_with_retry(git_tree_temp, git_tree_final, ec); + auto env = default_environment; + env.add_entry("GIT_INDEX_FILE", git_tree_index.native()); + + auto maybe_git_read_tree_output = + flatten(cmd_execute_and_capture_output(git_archive, default_working_directory, env), Tools::GIT); + if (!maybe_git_read_tree_output) + { + auto error = msg::format_error(msgGitCommandFailed, msg::command_line = git_archive.command_line()); + const auto& git_config = git_builtin_config(); + if (is_shallow_clone(GitConfig{get_tool_exe(Tools::GIT, stdout_sink), dot_git_dir, git_tree_temp}) + .value_or(false)) + { + error = std::move(error).append_raw('\n').append(msgShallowRepositoryDetected, + msg::path = git_config.git_dir); + } + + error.append_raw('\n').append(std::move(maybe_git_read_tree_output).error()); + return error; + } + + fs.rename_with_retry(git_tree_temp, destination, ec); if (ec) { - return msg::format(msg::msgErrorMessage) - .append(format_filesystem_call_error(ec, "rename_with_retry", {git_tree_temp, git_tree_final})); + return msg::format(msgErrorMessage) + .append(format_filesystem_call_error(ec, "rename_with_retry", {git_tree_temp, destination})); + } + + fs.remove(git_tree_index, IgnoreErrors{}); + return Unit{}; + } + + ExpectedL VcpkgPaths::git_extract_tree_from_remote_registry(StringView tree) const + { + auto git_tree_final = m_pimpl->m_registries_git_trees / tree; + if (get_filesystem().exists(git_tree_final, IgnoreErrors{})) + { + return git_tree_final; + } + + auto maybe_extraction = git_read_tree(git_tree_final, tree, m_pimpl->m_registries_dot_git_dir); + if (maybe_extraction) + { + return git_tree_final; } - return git_tree_final; + return std::move(maybe_extraction).error(); } Optional VcpkgPaths::get_manifest() const @@ -1291,7 +1264,7 @@ namespace vcpkg } #if defined(_WIN32) - static const ToolsetsInformation& get_all_toolsets(VcpkgPathsImpl& impl, const Filesystem& fs) + static const ToolsetsInformation& get_all_toolsets(VcpkgPathsImpl& impl, const ReadOnlyFilesystem& fs) { return impl.toolsets.get_lazy( [&fs]() -> ToolsetsInformation { return VisualStudio::find_toolset_instances_preferred_first(fs); }); @@ -1365,19 +1338,19 @@ namespace vcpkg #endif } - const Environment& VcpkgPaths::get_action_env(const AbiInfo& abi_info) const + const Environment& VcpkgPaths::get_action_env(const PreBuildInfo& pre_build_info, const Toolset& toolset) const { - return m_pimpl->m_env_cache.get_action_env(*this, abi_info); + return m_pimpl->m_env_cache.get_action_env(*this, pre_build_info, toolset); } - const std::string& VcpkgPaths::get_triplet_info(const AbiInfo& abi_info) const + const std::string& VcpkgPaths::get_triplet_info(const PreBuildInfo& pre_build_info, const Toolset& toolset) const { - return m_pimpl->m_env_cache.get_triplet_info(*this, abi_info); + return m_pimpl->m_env_cache.get_triplet_info(*this, pre_build_info, toolset); } - const CompilerInfo& VcpkgPaths::get_compiler_info(const AbiInfo& abi_info) const + const CompilerInfo& VcpkgPaths::get_compiler_info(const PreBuildInfo& pre_build_info, const Toolset& toolset) const { - return m_pimpl->m_env_cache.get_compiler_info(*this, abi_info); + return m_pimpl->m_env_cache.get_compiler_info(*this, pre_build_info, toolset); } const FeatureFlagSettings& VcpkgPaths::get_feature_flags() const { return m_pimpl->m_ff_settings; } diff --git a/src/vcpkg/versions.cpp b/src/vcpkg/versions.cpp index 98a2346fe6..7b09d4df50 100644 --- a/src/vcpkg/versions.cpp +++ b/src/vcpkg/versions.cpp @@ -61,13 +61,11 @@ namespace vcpkg Optional as_numeric(StringView str) { uint64_t res = 0; - size_t digits = 0; for (auto&& ch : str) { uint64_t digit_value = static_cast(ch) - static_cast('0'); if (digit_value > 9) return nullopt; if (res > std::numeric_limits::max() / 10 - digit_value) return nullopt; - ++digits; res = res * 10 + digit_value; } return res; @@ -305,7 +303,7 @@ namespace vcpkg static LocalizedString format_invalid_date_version(StringView version) { - return msg::format(msg::msgErrorMessage).append(msg::format(msgVersionInvalidDate, msg::version = version)); + return msg::format(msgErrorMessage).append(msg::format(msgVersionInvalidDate, msg::version = version)); } ExpectedL DateVersion::try_parse(StringView version) @@ -323,8 +321,7 @@ namespace vcpkg // (\.(0|[1-9][0-9]*))* while (*cur == '.') { - ret.identifiers.push_back(0); - cur = parse_skip_number(cur + 1, &ret.identifiers.back()); + cur = parse_skip_number(cur + 1, &ret.identifiers.emplace_back(0)); if (!cur) { return format_invalid_date_version(version); @@ -339,6 +336,11 @@ namespace vcpkg return ret; } + bool operator==(const SchemedVersion& lhs, const SchemedVersion& rhs) + { + return lhs.scheme == rhs.scheme && lhs.version == rhs.version; + } + StringLiteral to_string_literal(VersionScheme scheme) { static constexpr StringLiteral MISSING = "missing"; @@ -403,6 +405,11 @@ namespace vcpkg return base == VerComp::eq ? integer_vercomp(a, b) : base; } + VerComp compare_versions(const SchemedVersion& a, const SchemedVersion& b) + { + return compare_versions(a.scheme, a.version, b.scheme, b.version); + } + VerComp compare_versions(VersionScheme sa, const Version& a, VersionScheme sb, const Version& b) { return portversion_vercomp(compare_version_texts(sa, a, sb, b), a.port_version(), b.port_version()); diff --git a/src/vcpkg/visualstudio.cpp b/src/vcpkg/visualstudio.cpp index c5a3093249..0fd06cbd91 100644 --- a/src/vcpkg/visualstudio.cpp +++ b/src/vcpkg/visualstudio.cpp @@ -83,7 +83,7 @@ namespace vcpkg::VisualStudio std::string major_version() const { return version.substr(0, 2); } }; - static std::vector get_visual_studio_instances_internal(const Filesystem& fs) + static std::vector get_visual_studio_instances_internal(const ReadOnlyFilesystem& fs) { std::vector instances; @@ -176,14 +176,14 @@ namespace vcpkg::VisualStudio return instances; } - std::vector get_visual_studio_instances(const Filesystem& fs) + std::vector get_visual_studio_instances(const ReadOnlyFilesystem& fs) { std::vector sorted{get_visual_studio_instances_internal(fs)}; std::sort(sorted.begin(), sorted.end(), VisualStudioInstance::preferred_first_comparator); return Util::fmap(sorted, [](const VisualStudioInstance& instance) { return instance.to_string(); }); } - ToolsetsInformation find_toolset_instances_preferred_first(const Filesystem& fs) + ToolsetsInformation find_toolset_instances_preferred_first(const ReadOnlyFilesystem& fs) { ToolsetsInformation ret; diff --git a/src/vcpkg/xunitwriter.cpp b/src/vcpkg/xunitwriter.cpp index ee4f83b64d..c95643f156 100644 --- a/src/vcpkg/xunitwriter.cpp +++ b/src/vcpkg/xunitwriter.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include using namespace vcpkg; diff --git a/ce/ce/.eslintignore b/vcpkg-artifacts/.eslintignore similarity index 100% rename from ce/ce/.eslintignore rename to vcpkg-artifacts/.eslintignore diff --git a/ce/common/.default-eslintrc.yaml b/vcpkg-artifacts/.eslintrc.yaml similarity index 94% rename from ce/common/.default-eslintrc.yaml rename to vcpkg-artifacts/.eslintrc.yaml index 929a09d4f9..e029d4563b 100644 --- a/ce/common/.default-eslintrc.yaml +++ b/vcpkg-artifacts/.eslintrc.yaml @@ -23,10 +23,10 @@ rules: "no-trailing-spaces" : "error" "space-in-parens": "error" "no-cond-assign" : 'off' - "keyword-spacing": + "keyword-spacing": - 'error' - overrides: - this: + this: before: false "@typescript-eslint/explicit-module-boundary-types" : 'off' "@typescript-eslint/no-non-null-assertion": 'off' @@ -54,8 +54,8 @@ rules: - 2 - SwitchCase : 1 ObjectExpression: first - - + + "@typescript-eslint/indent": - 0 - 2 @@ -70,15 +70,15 @@ rules: semi: - error - always - no-multiple-empty-lines: + no-multiple-empty-lines: - error - max: 2 maxBOF: 0 maxEOF: 1 - - "notice/notice": + + "notice/notice": - "error" - - { "templateFile": "../common/header.txt" } + - { "templateFile": "./header.txt" } ## BEGIN SECTION ## The rules in this section cover security compliance item "Verify banned APIs are not used". @@ -97,4 +97,4 @@ rules: message: "setInnerHTMLUnsafe is banned" - selector: "CallExpression[callee.property.name='setInnerHTMLUnsafe']" message: "setInnerHTMLUnsafe is banned" - ## END SECTION \ No newline at end of file + ## END SECTION diff --git a/vcpkg-artifacts/.gitignore b/vcpkg-artifacts/.gitignore new file mode 100644 index 0000000000..3659f1ad7d --- /dev/null +++ b/vcpkg-artifacts/.gitignore @@ -0,0 +1,2 @@ +node_modules/* +dist/* diff --git a/ce/assets/.npmrc b/vcpkg-artifacts/.npmrc similarity index 100% rename from ce/assets/.npmrc rename to vcpkg-artifacts/.npmrc diff --git a/ce/ce/LICENSE b/vcpkg-artifacts/LICENSE similarity index 100% rename from ce/ce/LICENSE rename to vcpkg-artifacts/LICENSE diff --git a/ce/ce/amf/Requires.ts b/vcpkg-artifacts/amf/Requires.ts similarity index 100% rename from ce/ce/amf/Requires.ts rename to vcpkg-artifacts/amf/Requires.ts diff --git a/ce/ce/amf/contact.ts b/vcpkg-artifacts/amf/contact.ts similarity index 100% rename from ce/ce/amf/contact.ts rename to vcpkg-artifacts/amf/contact.ts diff --git a/ce/ce/amf/demands.ts b/vcpkg-artifacts/amf/demands.ts similarity index 100% rename from ce/ce/amf/demands.ts rename to vcpkg-artifacts/amf/demands.ts diff --git a/ce/ce/amf/exports.ts b/vcpkg-artifacts/amf/exports.ts similarity index 100% rename from ce/ce/amf/exports.ts rename to vcpkg-artifacts/amf/exports.ts diff --git a/ce/ce/amf/info.ts b/vcpkg-artifacts/amf/info.ts similarity index 100% rename from ce/ce/amf/info.ts rename to vcpkg-artifacts/amf/info.ts diff --git a/ce/ce/amf/installer.ts b/vcpkg-artifacts/amf/installer.ts similarity index 99% rename from ce/ce/amf/installer.ts rename to vcpkg-artifacts/amf/installer.ts index 48a71c8809..96a8055d28 100644 --- a/ce/ce/amf/installer.ts +++ b/vcpkg-artifacts/amf/installer.ts @@ -25,7 +25,7 @@ export class Installs extends EntitySequence { } if (isSeq(this.node)) { for (const item of this.node.items) { - yield this.createInstance(item); + yield this.createInstance(item); } } } diff --git a/ce/ce/amf/metadata-file.ts b/vcpkg-artifacts/amf/metadata-file.ts similarity index 100% rename from ce/ce/amf/metadata-file.ts rename to vcpkg-artifacts/amf/metadata-file.ts diff --git a/ce/ce/amf/registries.ts b/vcpkg-artifacts/amf/registries.ts similarity index 100% rename from ce/ce/amf/registries.ts rename to vcpkg-artifacts/amf/registries.ts diff --git a/ce/ce/amf/version-reference.ts b/vcpkg-artifacts/amf/version-reference.ts similarity index 100% rename from ce/ce/amf/version-reference.ts rename to vcpkg-artifacts/amf/version-reference.ts diff --git a/ce/ce/archivers/git.ts b/vcpkg-artifacts/archivers/git.ts similarity index 100% rename from ce/ce/archivers/git.ts rename to vcpkg-artifacts/archivers/git.ts diff --git a/ce/ce/artifacts/SetOfDemands.ts b/vcpkg-artifacts/artifacts/SetOfDemands.ts similarity index 100% rename from ce/ce/artifacts/SetOfDemands.ts rename to vcpkg-artifacts/artifacts/SetOfDemands.ts diff --git a/ce/ce/artifacts/activation.ts b/vcpkg-artifacts/artifacts/activation.ts similarity index 98% rename from ce/ce/artifacts/activation.ts rename to vcpkg-artifacts/artifacts/activation.ts index 8a3f3a86cf..df60cf7155 100644 --- a/ce/ce/artifacts/activation.ts +++ b/vcpkg-artifacts/artifacts/activation.ts @@ -596,11 +596,11 @@ export class Activation { return [env, undo]; } - async activate(thisStackEntries: Array, msbuildFile: Uri | undefined, json: Uri | undefined) { + async activate(thisStackEntries: Array, msbuildFile: Uri | undefined, json: Uri | undefined) : Promise { const postscriptFile = this.postscriptFile; if (!postscriptFile && !msbuildFile && !json) { displayNoPostScriptError(this.channels); - return; + return false; } async function transformtoRecord ( @@ -635,6 +635,10 @@ export class Activation { await json.writeUTF8(contents); } + const newUndoStack = this.undoFile?.stack ?? []; + Array.prototype.push.apply(newUndoStack, thisStackEntries); + this.channels.message(i`Activating: ${newUndoStack.join(' + ')}`); + if (postscriptFile) { // preserve undo environment variables for anything this particular activation did not touch const oldEnvironment = this.undoFile?.environment; @@ -661,10 +665,6 @@ export class Activation { } } - const newUndoStack = this.undoFile?.stack ?? []; - Array.prototype.push.apply(newUndoStack, thisStackEntries); - this.channels.message(i`Activating: ${newUndoStack.join(' + ')}`); - // generate shell script await writePostscript(this.channels, postscriptFile, variables, aliases); @@ -685,8 +685,9 @@ export class Activation { this.channels.debug(`--------[START UNDO FILE]--------\n${undoStringified}\n--------[END UNDO FILE]---------`); await this.nextUndoEnvironmentFile.writeUTF8(undoStringified); } - } + return true; + } } function generateCmdScript(variables: Record, aliases: Record): string { @@ -751,7 +752,7 @@ function printDeactivatingMessage(channels: Channels, stack: Array) { } -export async function deactivate(session: Session, warnIfNoActivation: boolean) { +export async function deactivate(session: Session, warnIfNoActivation: boolean) : Promise { const undoVariableValue = process.env[undoVariableName]; if (!undoVariableValue) { if (warnIfNoActivation) { diff --git a/ce/ce/artifacts/artifact.ts b/vcpkg-artifacts/artifacts/artifact.ts similarity index 100% rename from ce/ce/artifacts/artifact.ts rename to vcpkg-artifacts/artifacts/artifact.ts diff --git a/ce/ce/cli/argument.ts b/vcpkg-artifacts/cli/argument.ts similarity index 66% rename from ce/ce/cli/argument.ts rename to vcpkg-artifacts/cli/argument.ts index 970022fc97..d9f64c99d8 100644 --- a/ce/ce/cli/argument.ts +++ b/vcpkg-artifacts/cli/argument.ts @@ -2,12 +2,10 @@ // Licensed under the MIT License. import { Command } from './command'; -import { Help } from './command-line'; -export abstract class Argument implements Help { +export abstract class Argument { readonly abstract argument: string; readonly title = ''; - readonly abstract help: Array; constructor(protected command: Command) { command.arguments.push(this); diff --git a/ce/ce/cli/artifacts.ts b/vcpkg-artifacts/cli/artifacts.ts similarity index 92% rename from ce/ce/cli/artifacts.ts rename to vcpkg-artifacts/cli/artifacts.ts index 1b45c74339..1a5a4f3236 100644 --- a/ce/ce/cli/artifacts.ts +++ b/vcpkg-artifacts/cli/artifacts.ts @@ -2,10 +2,10 @@ // Licensed under the MIT License. import { MultiBar, SingleBar } from 'cli-progress'; -import { Artifact, ArtifactBase, InstallStatus, ResolvedArtifact, resolveDependencies, Selections } from '../artifacts/artifact'; +import { Artifact, ArtifactBase, InstallStatus, ResolvedArtifact, Selections, resolveDependencies } from '../artifacts/artifact'; import { i } from '../i18n'; -import { FileEntry, InstallEvents } from '../interfaces/events'; -import { getArtifact, RegistryDisplayContext, RegistryResolver } from '../registries/registries'; +import { InstallEvents } from '../interfaces/events'; +import { RegistryDisplayContext, RegistryResolver, getArtifact } from '../registries/registries'; import { Session } from '../session'; import { Channels } from '../util/channels'; import { Uri } from '../util/uri'; @@ -159,19 +159,8 @@ class TtyProgressRenderer implements Partial { this.#individualProgress.startOrUpdate(TaggedProgressKind.Downloading, 100, percent, i`downloading ${uri.toString()} -> ${destination}`); } - unpackFileProgress(entry: Readonly) { - let suffix = entry.extractPath; - if (suffix) { - suffix = ' ' + suffix; - } else { - suffix = ''; - } - - this.#individualProgress.startOrUpdate(TaggedProgressKind.GenericProgress, 100, this.#individualProgress.lastCurrentValue, i`unpacking` + suffix); - } - - unpackArchiveProgress(archiveUri: Uri, percent: number) { - this.#individualProgress.startOrUpdate(TaggedProgressKind.GenericProgress, 100, percent, i`unpacking ${archiveUri.fsPath}`); + unpackArchiveStart(archiveUri: Uri) { + this.#individualProgress.heartbeat(i`unpacking ${archiveUri.fsPath}`); } unpackArchiveHeartbeat(text: string) { @@ -230,7 +219,13 @@ class NoTtyProgressRenderer implements Partial { } } - unpackArchiveStart(archiveUri: Uri, outputUri: Uri) { + stop(): void { + if (this.#downloadTimeoutId) { + clearTimeout(this.#downloadTimeoutId); + } + } + + unpackArchiveStart(archiveUri: Uri) { this.channels.message(i`Unpacking ${archiveUri.fsPath}...`); } } diff --git a/ce/ce/cli/command-line.ts b/vcpkg-artifacts/cli/command-line.ts similarity index 89% rename from ce/ce/cli/command-line.ts rename to vcpkg-artifacts/cli/command-line.ts index 4a3daafdb4..638739ca82 100644 --- a/ce/ce/cli/command-line.ts +++ b/vcpkg-artifacts/cli/command-line.ts @@ -1,23 +1,15 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { strict } from 'assert'; import { tmpdir } from 'os'; import { join, resolve } from 'path'; -import { i } from '../i18n'; import { intersect } from '../util/intersect'; import { Command } from './command'; -import { cmdSwitch } from './format'; export type switches = { [key: string]: Array; } -export interface Help { - readonly help: Array; - readonly title: string; -} - class Ctx { constructor(cmdline: CommandLine) { this.os = @@ -129,13 +121,11 @@ export class CommandLine { get language() { const l = this.switches['language'] || []; - strict.ok((l?.length || 0) < 2, i`Expected a single value for ${cmdSwitch('language')} - found multiple`); return l[0]; } get allLanguages(): boolean { const l = this.switches['all-languages'] || []; - strict.ok((l?.length || 0) < 2, i`Expected a single value for ${cmdSwitch('all-languages')} - found multiple`); return !!l[0]; } @@ -159,7 +149,7 @@ export class CommandLine { /** parses the command line and returns the command that has been requested */ get command() { - return this.commands.find(cmd => cmd.command === this.inputs[0] || !!cmd.aliases.find(alias => alias === this.inputs[0])); + return this.commands.find(cmd => cmd.command === this.inputs[0]); } constructor(args: Array) { diff --git a/vcpkg-artifacts/cli/command.ts b/vcpkg-artifacts/cli/command.ts new file mode 100644 index 0000000000..949dbf4d93 --- /dev/null +++ b/vcpkg-artifacts/cli/command.ts @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Argument } from './argument'; +import { CommandLine } from './command-line'; +import { Switch } from './switch'; +import { Debug } from './switches/debug'; +import { Force } from './switches/force'; + +/** @internal */ + +export abstract class Command { + readonly abstract command: string; + + readonly switches = new Array(); + readonly arguments = new Array(); + + readonly force = new Force(this); + readonly debug = new Debug(this); + + constructor(public commandLine: CommandLine) { + commandLine.addCommand(this); + } + + get inputs() { + return this.commandLine.inputs.slice(1); + } + + async run() { + // do something + return true; + } +} diff --git a/ce/ce/cli/commands/acquire-project.ts b/vcpkg-artifacts/cli/commands/acquire-project.ts similarity index 83% rename from ce/ce/cli/commands/acquire-project.ts rename to vcpkg-artifacts/cli/commands/acquire-project.ts index e5e112bff7..334893eb13 100644 --- a/ce/ce/cli/commands/acquire-project.ts +++ b/vcpkg-artifacts/cli/commands/acquire-project.ts @@ -11,21 +11,8 @@ import { Project } from '../switches/project'; export class AcquireProjectCommand extends Command { readonly command = 'acquire-project'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; project: Project = new Project(this); - get summary() { - return i`Acquires everything referenced by a project, without activating`; - } - - get description() { - return [ - i`This allows the consumer to pre-download tools required for a project.`, - ]; - } - override async run() { const projectManifest = await this.project.manifest; if (!projectManifest) { diff --git a/ce/ce/cli/commands/acquire.ts b/vcpkg-artifacts/cli/commands/acquire.ts similarity index 84% rename from ce/ce/cli/commands/acquire.ts rename to vcpkg-artifacts/cli/commands/acquire.ts index a8005e4495..46a33a8048 100644 --- a/ce/ce/cli/commands/acquire.ts +++ b/vcpkg-artifacts/cli/commands/acquire.ts @@ -14,22 +14,9 @@ import { Version } from '../switches/version'; export class AcquireCommand extends Command { readonly command = 'acquire'; - readonly aliases = ['install']; - seeAlso = []; - argumentsHelp = []; version: Version = new Version(this); project: Project = new Project(this); - get summary() { - return i`Acquire artifacts in the registry`; - } - - get description() { - return [ - i`This allows the consumer to acquire (download and unpack) artifacts. Artifacts must be activated to be used`, - ]; - } - override async run() { if (this.inputs.length === 0) { error(i`No artifacts specified`); @@ -38,7 +25,7 @@ export class AcquireCommand extends Command { const versions = this.version.values; if (versions.length && this.inputs.length !== versions.length) { - error(i`Multiple packages specified, but not an equal number of ${cmdSwitch('version')} switches`); + error(`Multiple packages specified, but not an equal number of ${cmdSwitch('version')} switches`); return false; } diff --git a/ce/ce/cli/commands/activate.ts b/vcpkg-artifacts/cli/commands/activate.ts similarity index 84% rename from ce/ce/cli/commands/activate.ts rename to vcpkg-artifacts/cli/commands/activate.ts index 04d8103930..4a59bb18b9 100644 --- a/ce/ce/cli/commands/activate.ts +++ b/vcpkg-artifacts/cli/commands/activate.ts @@ -16,23 +16,10 @@ import { Project } from '../switches/project'; export class ActivateCommand extends Command { readonly command = 'activate'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; project: Project = new Project(this); msbuildProps: MSBuildProps = new MSBuildProps(this); json : Json = new Json(this); - get summary() { - return i`Activates the tools required for a project`; - } - - get description() { - return [ - i`This allows the consumer to Activate the tools required for a project. If the tools are not already installed, this will force them to be downloaded and installed before activation.`, - ]; - } - override async run() { const projectManifest = await this.project.manifest; diff --git a/ce/ce/cli/commands/add.ts b/vcpkg-artifacts/cli/commands/add.ts similarity index 92% rename from ce/ce/cli/commands/add.ts rename to vcpkg-artifacts/cli/commands/add.ts index e298e96f0d..c5ae4f0411 100644 --- a/ce/ce/cli/commands/add.ts +++ b/vcpkg-artifacts/cli/commands/add.ts @@ -13,23 +13,10 @@ import { Version } from '../switches/version'; export class AddCommand extends Command { readonly command = 'add'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; version = new Version(this); project: Project = new Project(this); - get summary() { - return i`Adds an artifact to the project`; - } - - get description() { - return [ - i`This allows the consumer to add an artifact to the project. This will activate the project as well.`, - ]; - } - override async run() { const projectManifest = await this.project.manifest; diff --git a/ce/ce/cli/commands/cache.ts b/vcpkg-artifacts/cli/commands/cache.ts similarity index 86% rename from ce/ce/cli/commands/cache.ts rename to vcpkg-artifacts/cli/commands/cache.ts index cf0edbaa88..a08c56f654 100644 --- a/ce/ce/cli/commands/cache.ts +++ b/vcpkg-artifacts/cli/commands/cache.ts @@ -13,21 +13,8 @@ import { Clear } from '../switches/clear'; export class CacheCommand extends Command { readonly command = 'cache'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; clear = new Clear(this); - get summary() { - return i`Manages the download cache`; - } - - get description() { - return [ - i`Manages the download cache`, - ]; - } - override async run() { if (this.clear.active) { await session.downloads.delete({ recursive: true }); diff --git a/ce/ce/cli/commands/clean.ts b/vcpkg-artifacts/cli/commands/clean.ts similarity index 71% rename from ce/ce/cli/commands/clean.ts rename to vcpkg-artifacts/cli/commands/clean.ts index 0fead18649..edebcf502d 100644 --- a/ce/ce/cli/commands/clean.ts +++ b/vcpkg-artifacts/cli/commands/clean.ts @@ -10,50 +10,22 @@ import { Switch } from '../switch'; export class All extends Switch { switch = 'all'; - get help() { - return [ - i`cleans out everything (cache, installed artifacts)` - ]; - } } export class Downloads extends Switch { switch = 'downloads'; - get help() { - return [ - i`cleans out the downloads cache` - ]; - } } export class Artifacts extends Switch { switch = 'artifacts'; - get help() { - return [ - i`removes all the artifacts that are installed` - ]; - } } export class CleanCommand extends Command { readonly command = 'clean'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; all = new All(this); artifacts = new Artifacts(this); downloads = new Downloads(this); - get summary() { - return i`cleans up`; - } - - get description() { - return [ - i`Allows the user to clean out the cache, installed artifacts, etc.`, - ]; - } - override async run() { if (this.all.active || this.artifacts.active) { diff --git a/ce/ce/cli/commands/deactivate.ts b/vcpkg-artifacts/cli/commands/deactivate.ts similarity index 58% rename from ce/ce/cli/commands/deactivate.ts rename to vcpkg-artifacts/cli/commands/deactivate.ts index 82c74261ed..62439cb2b4 100644 --- a/ce/ce/cli/commands/deactivate.ts +++ b/vcpkg-artifacts/cli/commands/deactivate.ts @@ -8,19 +8,6 @@ import { Command } from '../command'; export class DeactivateCommand extends Command { readonly command = 'deactivate'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; - - get summary() { - return i`Deactivates the current session`; - } - - get description() { - return [ - i`This allows the consumer to remove environment settings for the currently active session.`, - ]; - } override run() { return deactivate(session, true); diff --git a/ce/ce/cli/commands/delete.ts b/vcpkg-artifacts/cli/commands/delete.ts similarity index 73% rename from ce/ce/cli/commands/delete.ts rename to vcpkg-artifacts/cli/commands/delete.ts index 13566cca2d..aa76e3e912 100644 --- a/ce/ce/cli/commands/delete.ts +++ b/vcpkg-artifacts/cli/commands/delete.ts @@ -8,21 +8,7 @@ import { Version } from '../switches/version'; export class DeleteCommand extends Command { readonly command = 'delete'; - readonly aliases = ['uninstall']; - seeAlso = []; - argumentsHelp = []; version = new Version(this); - - get summary() { - return i`Deletes an artifact from the artifact folder`; - } - - get description() { - return [ - i`This allows the consumer to remove an artifact from disk.`, - ]; - } - override async run() { const artifacts = await session.getInstalledArtifacts(); for (const input of this.inputs) { diff --git a/ce/ce/cli/commands/find.ts b/vcpkg-artifacts/cli/commands/find.ts similarity index 88% rename from ce/ce/cli/commands/find.ts rename to vcpkg-artifacts/cli/commands/find.ts index 2a4228bc5b..0348536356 100644 --- a/ce/ce/cli/commands/find.ts +++ b/vcpkg-artifacts/cli/commands/find.ts @@ -14,22 +14,10 @@ import { Version } from '../switches/version'; export class FindCommand extends Command { readonly command = 'find'; - readonly aliases = ['search']; - seeAlso = []; - argumentsHelp = []; + version = new Version(this); project = new Project(this); - get summary() { - return i`Find artifacts in the registry`; - } - - get description() { - return [ - i`This allows the user to find artifacts based on some criteria.`, - ]; - } - override async run() { // load registries (from the current project too if available) const resolver = session.globalRegistryResolver.with( diff --git a/ce/ce/cli/commands/generate-msbuild-props.ts b/vcpkg-artifacts/cli/commands/generate-msbuild-props.ts similarity index 86% rename from ce/ce/cli/commands/generate-msbuild-props.ts rename to vcpkg-artifacts/cli/commands/generate-msbuild-props.ts index 331d39af4e..90637d0983 100644 --- a/ce/ce/cli/commands/generate-msbuild-props.ts +++ b/vcpkg-artifacts/cli/commands/generate-msbuild-props.ts @@ -13,21 +13,13 @@ import { Project } from '../switches/project'; export class GenerateMSBuildPropsCommand extends Command { readonly command = 'generate-msbuild-props'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; + project: Project = new Project(this); msbuildProps: MSBuildProps = new MSBuildProps(this, 'out'); - get summary() { - return i`Generates MSBuild properties for an activation without downloading anything for a project`; - } - - get description() { return ['']; } - override async run() { if (!this.msbuildProps.active) { - error(i`generate-msbuild-props requires --msbuild-props`); + error('generate-msbuild-props requires --msbuild-props'); return false; } diff --git a/ce/ce/cli/commands/list.ts b/vcpkg-artifacts/cli/commands/list.ts similarity index 81% rename from ce/ce/cli/commands/list.ts rename to vcpkg-artifacts/cli/commands/list.ts index 9fea357cb0..239be5dd04 100644 --- a/ce/ce/cli/commands/list.ts +++ b/vcpkg-artifacts/cli/commands/list.ts @@ -11,21 +11,8 @@ import { Installed } from '../switches/installed'; export class ListCommand extends Command { readonly command = 'list'; - readonly aliases = ['show']; - seeAlso = []; - argumentsHelp = []; installed = new Installed(this); - get summary() { - return i`Lists the artifacts`; - } - - get description() { - return [ - i`This allows the consumer to list artifacts.`, - ]; - } - override async run() { if (this.installed.active) { const artifacts = await session.getInstalledArtifacts(); diff --git a/ce/ce/cli/commands/regenerate-index.ts b/vcpkg-artifacts/cli/commands/regenerate-index.ts similarity index 83% rename from ce/ce/cli/commands/regenerate-index.ts rename to vcpkg-artifacts/cli/commands/regenerate-index.ts index 3cd918c0d0..99e6381db3 100644 --- a/ce/ce/cli/commands/regenerate-index.ts +++ b/vcpkg-artifacts/cli/commands/regenerate-index.ts @@ -13,20 +13,7 @@ import { Normalize } from '../switches/normalize'; export class RegenerateCommand extends Command { readonly command = 'regenerate'; - readonly aliases = ['regen']; readonly normalize = new Normalize(this); - seeAlso = []; - argumentsHelp = []; - - get summary() { - return i`regenerate the index for a registry`; - } - - get description() { - return [ - i`This allows the user to regenerate the ${registryIndexFile} files for a ${cli} registry.`, - ]; - } override async run() { for (const input of this.inputs) { diff --git a/ce/ce/cli/commands/remove.ts b/vcpkg-artifacts/cli/commands/remove.ts similarity index 80% rename from ce/ce/cli/commands/remove.ts rename to vcpkg-artifacts/cli/commands/remove.ts index 33ba686017..b034dfe2b4 100644 --- a/ce/ce/cli/commands/remove.ts +++ b/vcpkg-artifacts/cli/commands/remove.ts @@ -9,21 +9,8 @@ import { Project } from '../switches/project'; export class RemoveCommand extends Command { readonly command = 'remove'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; project: Project = new Project(this); - get summary() { - return i`Removes an artifact from a project`; - } - - get description() { - return [ - i`This allows the consumer to remove an artifact from the project. Forces reactivation in this window.`, - ]; - } - override async run() { const projectManifest = await this.project.manifest; diff --git a/vcpkg-artifacts/cli/commands/update.ts b/vcpkg-artifacts/cli/commands/update.ts new file mode 100644 index 0000000000..0044708ea3 --- /dev/null +++ b/vcpkg-artifacts/cli/commands/update.ts @@ -0,0 +1,94 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { buildRegistryResolver } from '../../artifacts/artifact'; +import { schemeOf } from '../../fs/unified-filesystem'; +import { i } from '../../i18n'; +import { session } from '../../main'; +import { RemoteRegistry } from '../../registries/RemoteRegistry'; +import { Registry } from '../../registries/registries'; +import { RemoteFileUnavailable } from '../../util/exceptions'; +import { Command } from '../command'; +import { count } from '../format'; +import { error, log, writeException } from '../styling'; +import { All } from '../switches/all'; +import { Project } from '../switches/project'; + +async function updateRegistry(registry: Registry, displayName: string) : Promise { + try { + await registry.update(displayName); + await registry.load(); + log(i`Updated ${displayName}. It contains ${count(registry.count)} metadata files.`); + } catch (e) { + if (e instanceof RemoteFileUnavailable) { + log(i`Unable to download ${displayName}.`); + } else { + log(i`${displayName} could not be updated; it could be malformed.`); + writeException(e); + } + + return false; + } + + return true; +} + +export class UpdateCommand extends Command { + readonly command = 'update'; + + project: Project = new Project(this); + all = new All(this); + + override async run() { + const resolver = session.globalRegistryResolver.with( + await buildRegistryResolver(session, (await this.project.manifest)?.metadata.registries)); + + if (this.all.active) { + for (const registryUri of session.registryDatabase.getAllUris()) { + if (schemeOf(registryUri) != 'https') { continue; } + const parsed = session.fileSystem.parseUri(registryUri); + const displayName = resolver.getRegistryDisplayName(parsed); + const loaded = resolver.getRegistryByUri(parsed); + if (loaded) { + if (!await updateRegistry(loaded, displayName)) { + return false; + } + } + } + } + + for (const registryInput of this.inputs) { + const registryByName = resolver.getRegistryByName(registryInput); + if (registryByName) { + // if it matched a name, it's a name + if (!await updateRegistry(registryByName, registryInput)) { + return false; + } + + continue; + } + + const scheme = schemeOf(registryInput); + switch (scheme) { + case 'https': + const registryInputAsUri = session.fileSystem.parseUri(registryInput); + const registryByUri = resolver.getRegistryByUri(registryInputAsUri) + ?? new RemoteRegistry(session, registryInputAsUri); + if (!await updateRegistry(registryByUri, resolver.getRegistryDisplayName(registryInputAsUri))) { + return false; + } + + continue; + + case 'file': + error(i`The x-update-registry command downloads new registry information and thus cannot be used with local registries. Did you mean x-regenerate ${registryInput}?`); + return false; + } + + error(i`Unable to find registry ${registryInput}.`); + return false; + } + + return true; + } +} diff --git a/ce/ce/cli/commands/use.ts b/vcpkg-artifacts/cli/commands/use.ts similarity index 82% rename from ce/ce/cli/commands/use.ts rename to vcpkg-artifacts/cli/commands/use.ts index 127f4a8624..c2ef509286 100644 --- a/ce/ce/cli/commands/use.ts +++ b/vcpkg-artifacts/cli/commands/use.ts @@ -15,23 +15,10 @@ import { Version } from '../switches/version'; export class UseCommand extends Command { readonly command = 'use'; - readonly aliases = []; - seeAlso = []; - argumentsHelp = []; version = new Version(this); project = new Project(this); msbuildProps = new MSBuildProps(this); - get summary() { - return i`Instantly activates an artifact outside of the project`; - } - - get description() { - return [ - i`This will instantly activate an artifact .`, - ]; - } - override async run() : Promise { if (this.inputs.length === 0) { error(i`No artifacts specified`); @@ -42,7 +29,7 @@ export class UseCommand extends Command { await buildRegistryResolver(session, (await this.project.manifest)?.metadata.registries)); const versions = this.version.values; if (versions.length && this.inputs.length !== versions.length) { - error(i`Multiple packages specified, but not an equal number of ${cmdSwitch('version')} switches`); + error(`Multiple packages specified, but not an equal number of ${cmdSwitch('version')} switches`); return false; } diff --git a/ce/ce/cli/console-table.ts b/vcpkg-artifacts/cli/console-table.ts similarity index 100% rename from ce/ce/cli/console-table.ts rename to vcpkg-artifacts/cli/console-table.ts diff --git a/ce/ce/cli/constants.ts b/vcpkg-artifacts/cli/constants.ts similarity index 100% rename from ce/ce/cli/constants.ts rename to vcpkg-artifacts/cli/constants.ts diff --git a/ce/ce/cli/format.ts b/vcpkg-artifacts/cli/format.ts similarity index 100% rename from ce/ce/cli/format.ts rename to vcpkg-artifacts/cli/format.ts diff --git a/ce/ce/cli/project.ts b/vcpkg-artifacts/cli/project.ts similarity index 73% rename from ce/ce/cli/project.ts rename to vcpkg-artifacts/cli/project.ts index 52b42defcf..3594bf9982 100644 --- a/ce/ce/cli/project.ts +++ b/vcpkg-artifacts/cli/project.ts @@ -28,17 +28,16 @@ function trackActivationPlan(session: Session, resolved: Array export async function activate(session: Session, allowStacking: boolean, stackEntries: Array, artifacts: Array, registries: RegistryDisplayContext, options?: ActivationOptions): Promise { trackActivationPlan(session, artifacts); // install the items in the project - const success = await acquireArtifacts(session, artifacts, registries, options); - if (success) { - const activation = await Activation.start(session, allowStacking); - for (const artifact of artifacts) { - if (!await artifact.artifact.loadActivationSettings(activation)) { - return false; - } - } + if (!await acquireArtifacts(session, artifacts, registries, options)) { + return false; + } - await activation.activate(stackEntries, options?.msbuildProps, options?.json); + const activation = await Activation.start(session, allowStacking); + for (const artifact of artifacts) { + if (!await artifact.artifact.loadActivationSettings(activation)) { + return false; + } } - return success; + return await activation.activate(stackEntries, options?.msbuildProps, options?.json); } diff --git a/ce/ce/cli/styling.ts b/vcpkg-artifacts/cli/styling.ts similarity index 100% rename from ce/ce/cli/styling.ts rename to vcpkg-artifacts/cli/styling.ts diff --git a/ce/ce/cli/switch.ts b/vcpkg-artifacts/cli/switch.ts similarity index 77% rename from ce/ce/cli/switch.ts rename to vcpkg-artifacts/cli/switch.ts index f98f6b144b..0be431b717 100644 --- a/ce/ce/cli/switch.ts +++ b/vcpkg-artifacts/cli/switch.ts @@ -4,20 +4,16 @@ import { strict } from 'assert'; import { i } from '../i18n'; import { Command } from './command'; -import { Help } from './command-line'; import { cmdSwitch } from './format'; -export abstract class Switch implements Help { +export abstract class Switch { readonly abstract switch: string; readonly title = ''; - readonly abstract help: Array; readonly required: boolean; - readonly multipleAllowed: boolean; - constructor(protected command: Command, options?: { multipleAllowed?: boolean, required?: boolean }) { + constructor(protected command: Command, options?: { required?: boolean }) { command.switches.push(this); - this.multipleAllowed = options?.multipleAllowed || false; this.required = options?.required || false; } diff --git a/vcpkg-artifacts/cli/switches/all.ts b/vcpkg-artifacts/cli/switches/all.ts new file mode 100644 index 0000000000..c50877799f --- /dev/null +++ b/vcpkg-artifacts/cli/switches/all.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Switch } from '../switch'; + +export class All extends Switch { + switch = 'all'; +} diff --git a/ce/ce/cli/switches/clear.ts b/vcpkg-artifacts/cli/switches/clear.ts similarity index 59% rename from ce/ce/cli/switches/clear.ts rename to vcpkg-artifacts/cli/switches/clear.ts index 3bb39ad0c7..690613404d 100644 --- a/ce/ce/cli/switches/clear.ts +++ b/vcpkg-artifacts/cli/switches/clear.ts @@ -1,14 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { i } from '../../i18n'; import { Switch } from '../switch'; export class Clear extends Switch { switch = 'clear'; - get help() { - return [ - i`removes all files in the local cache` - ]; - } } diff --git a/vcpkg-artifacts/cli/switches/debug.ts b/vcpkg-artifacts/cli/switches/debug.ts new file mode 100644 index 0000000000..cb898370e1 --- /dev/null +++ b/vcpkg-artifacts/cli/switches/debug.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Switch } from '../switch'; + +export class Debug extends Switch { + switch = 'debug'; +} diff --git a/ce/ce/cli/switches/force.ts b/vcpkg-artifacts/cli/switches/force.ts similarity index 53% rename from ce/ce/cli/switches/force.ts rename to vcpkg-artifacts/cli/switches/force.ts index 4c22d2cccb..474bbfcf20 100644 --- a/ce/ce/cli/switches/force.ts +++ b/vcpkg-artifacts/cli/switches/force.ts @@ -1,14 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { i } from '../../i18n'; import { Switch } from '../switch'; export class Force extends Switch { switch = 'force'; - get help() { - return [ - i`proceeds with the (potentially dangerous) action without confirmation` - ]; - } } diff --git a/ce/ce/cli/switches/installed.ts b/vcpkg-artifacts/cli/switches/installed.ts similarity index 61% rename from ce/ce/cli/switches/installed.ts rename to vcpkg-artifacts/cli/switches/installed.ts index aa56fe8763..d2b1c8a2cc 100644 --- a/ce/ce/cli/switches/installed.ts +++ b/vcpkg-artifacts/cli/switches/installed.ts @@ -1,14 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { i } from '../../i18n'; import { Switch } from '../switch'; export class Installed extends Switch { switch = 'installed'; - get help() { - return [ - i`shows the _installed_ artifacts` - ]; - } } diff --git a/ce/ce/cli/switches/json.ts b/vcpkg-artifacts/cli/switches/json.ts similarity index 67% rename from ce/ce/cli/switches/json.ts rename to vcpkg-artifacts/cli/switches/json.ts index b29db7436c..00487d7840 100644 --- a/ce/ce/cli/switches/json.ts +++ b/vcpkg-artifacts/cli/switches/json.ts @@ -2,19 +2,12 @@ // Licensed under the MIT License. import { resolve } from 'path'; -import { i } from '../../i18n'; import { session } from '../../main'; import { Uri } from '../../util/uri'; import { Switch } from '../switch'; export class Json extends Switch { switch = 'json'; - override multipleAllowed = false; - get help() { - return [ - i`Dump environment variables and other properties to a json file with the path provided by the user.` - ]; - } get resolvedValue(): Uri | undefined { const v = this.value; diff --git a/ce/ce/cli/switches/msbuild-props.ts b/vcpkg-artifacts/cli/switches/msbuild-props.ts similarity index 76% rename from ce/ce/cli/switches/msbuild-props.ts rename to vcpkg-artifacts/cli/switches/msbuild-props.ts index 546bde6a17..37b50016ce 100644 --- a/ce/ce/cli/switches/msbuild-props.ts +++ b/vcpkg-artifacts/cli/switches/msbuild-props.ts @@ -2,7 +2,6 @@ // Licensed under the MIT License. import { resolve } from 'path'; -import { i } from '../../i18n'; import { session } from '../../main'; import { Uri } from '../../util/uri'; import { Command } from '../command'; @@ -10,18 +9,11 @@ import { Switch } from '../switch'; export class MSBuildProps extends Switch { public readonly switch: string; - override multipleAllowed = false; constructor(command: Command, swName = 'msbuild-props') { super(command); this.switch = swName; } - get help() { - return [ - i`Full path to the file in which MSBuild properties will be written.` - ]; - } - get resolvedValue(): Uri | undefined { const v = this.value; if (v) { diff --git a/ce/ce/cli/switches/normalize.ts b/vcpkg-artifacts/cli/switches/normalize.ts similarity index 55% rename from ce/ce/cli/switches/normalize.ts rename to vcpkg-artifacts/cli/switches/normalize.ts index 2343806d5c..47a65460fd 100644 --- a/ce/ce/cli/switches/normalize.ts +++ b/vcpkg-artifacts/cli/switches/normalize.ts @@ -1,15 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { i } from '../../i18n'; import { Switch } from '../switch'; export class Normalize extends Switch { switch = 'normalize'; - override multipleAllowed = false; - get help() { - return [ - i`Apply any deprecation fixups.` - ]; - } } diff --git a/ce/ce/cli/switches/project.ts b/vcpkg-artifacts/cli/switches/project.ts similarity index 95% rename from ce/ce/cli/switches/project.ts rename to vcpkg-artifacts/cli/switches/project.ts index 3680b78106..24ad5a409a 100644 --- a/ce/ce/cli/switches/project.ts +++ b/vcpkg-artifacts/cli/switches/project.ts @@ -19,11 +19,6 @@ interface ResolvedProjectUri { export class Project extends Switch { switch = 'project'; - get help() { - return [ - i`override the path to the project folder` - ]; - } async resolveProjectUri() : Promise { const v = this.value; diff --git a/ce/ce/cli/switches/version.ts b/vcpkg-artifacts/cli/switches/version.ts similarity index 59% rename from ce/ce/cli/switches/version.ts rename to vcpkg-artifacts/cli/switches/version.ts index e697b91a7c..daf37dc62c 100644 --- a/ce/ce/cli/switches/version.ts +++ b/vcpkg-artifacts/cli/switches/version.ts @@ -1,14 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { i } from '../../i18n'; import { Switch } from '../switch'; export class Version extends Switch { switch = 'version'; - get help() { - return [ - i`a version or version range to match` - ]; - } -} \ No newline at end of file +} diff --git a/ce/ce/constants.ts b/vcpkg-artifacts/constants.ts similarity index 74% rename from ce/ce/constants.ts rename to vcpkg-artifacts/constants.ts index 3735330bec..582496b76b 100644 --- a/ce/ce/constants.ts +++ b/vcpkg-artifacts/constants.ts @@ -15,12 +15,12 @@ export const defaultConfig = { "kind": "artifact", "name": "microsoft", - "location": "https://aka.ms/vcpkg-ce-default" + "location": "https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip" }, { "kind": "artifact", - "name": "cmsis", - "location": "https://aka.ms/vcpkg-artifacts-cmsis" + "name": "arm", + "location": "https://artifacts.keil.arm.com/vcpkg-ce-registry/registry.zip" } ] } diff --git a/ce/ce/exports.ts b/vcpkg-artifacts/exports.ts similarity index 100% rename from ce/ce/exports.ts rename to vcpkg-artifacts/exports.ts diff --git a/ce/ce/fs/acquire.ts b/vcpkg-artifacts/fs/acquire.ts similarity index 100% rename from ce/ce/fs/acquire.ts rename to vcpkg-artifacts/fs/acquire.ts diff --git a/ce/ce/fs/filesystem.ts b/vcpkg-artifacts/fs/filesystem.ts similarity index 100% rename from ce/ce/fs/filesystem.ts rename to vcpkg-artifacts/fs/filesystem.ts diff --git a/ce/ce/fs/http-filesystem.ts b/vcpkg-artifacts/fs/http-filesystem.ts similarity index 100% rename from ce/ce/fs/http-filesystem.ts rename to vcpkg-artifacts/fs/http-filesystem.ts diff --git a/ce/ce/fs/local-filesystem.ts b/vcpkg-artifacts/fs/local-filesystem.ts similarity index 100% rename from ce/ce/fs/local-filesystem.ts rename to vcpkg-artifacts/fs/local-filesystem.ts diff --git a/ce/ce/fs/streams.ts b/vcpkg-artifacts/fs/streams.ts similarity index 93% rename from ce/ce/fs/streams.ts rename to vcpkg-artifacts/fs/streams.ts index 16da8cb92a..e02f307760 100644 --- a/ce/ce/fs/streams.ts +++ b/vcpkg-artifacts/fs/streams.ts @@ -1,8 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import EventEmitter = require('events'); -import { Transform, TransformCallback } from 'stream'; +import { EventEmitter, Transform, TransformCallback } from 'stream'; import { Stopwatch } from '../util/channels'; import { PercentageScaler } from '../util/percentage-scaler'; diff --git a/ce/ce/fs/unified-filesystem.ts b/vcpkg-artifacts/fs/unified-filesystem.ts similarity index 100% rename from ce/ce/fs/unified-filesystem.ts rename to vcpkg-artifacts/fs/unified-filesystem.ts diff --git a/ce/ce/fs/vsix-local-filesystem.ts b/vcpkg-artifacts/fs/vsix-local-filesystem.ts similarity index 100% rename from ce/ce/fs/vsix-local-filesystem.ts rename to vcpkg-artifacts/fs/vsix-local-filesystem.ts diff --git a/ce/common/header.txt b/vcpkg-artifacts/header.txt similarity index 100% rename from ce/common/header.txt rename to vcpkg-artifacts/header.txt diff --git a/ce/ce/i18n.ts b/vcpkg-artifacts/i18n.ts similarity index 97% rename from ce/ce/i18n.ts rename to vcpkg-artifacts/i18n.ts index 5dd244c58c..2c3e2d07e7 100644 --- a/ce/ce/i18n.ts +++ b/vcpkg-artifacts/i18n.ts @@ -27,7 +27,7 @@ export function createSandbox(): (code: string, context?: any) => T { export const safeEval = createSandbox(); type PrimitiveValue = string | number | boolean | undefined | Date; -let currentLocale = require('../locales/messages.json'); +let currentLocale = require('./locales/messages.json'); export function setLocale(newLocale: string | undefined) { if (newLocale) { diff --git a/ce/ce/installers/espidf.ts b/vcpkg-artifacts/installers/espidf.ts similarity index 100% rename from ce/ce/installers/espidf.ts rename to vcpkg-artifacts/installers/espidf.ts diff --git a/ce/ce/installers/git.ts b/vcpkg-artifacts/installers/git.ts similarity index 98% rename from ce/ce/installers/git.ts rename to vcpkg-artifacts/installers/git.ts index 1cbf2cee7d..c34bedb404 100644 --- a/ce/ce/installers/git.ts +++ b/vcpkg-artifacts/installers/git.ts @@ -20,7 +20,7 @@ export async function installGit(session: Session, name: string, version: string const targetDirectory = targetLocation.join(options.subdirectory ?? ''); const gitTool = new Git(gitPath, targetDirectory); - events.unpackArchiveStart?.(repo, targetDirectory); + events.unpackArchiveStart?.(repo); // changing the clone process to do an init/add remote/fetch/checkout because // it's far faster to clone a specific commit and this allows us to support diff --git a/ce/ce/installers/nuget.ts b/vcpkg-artifacts/installers/nuget.ts similarity index 78% rename from ce/ce/installers/nuget.ts rename to vcpkg-artifacts/installers/nuget.ts index b4434c56d2..c6d5d8a94c 100644 --- a/ce/ce/installers/nuget.ts +++ b/vcpkg-artifacts/installers/nuget.ts @@ -1,23 +1,19 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { unpackZip } from '../archivers/ZipUnpacker'; import { acquireNugetFile } from '../fs/acquire'; import { InstallEvents, InstallOptions } from '../interfaces/events'; import { NupkgInstaller } from '../interfaces/metadata/installers/nupkg'; import { Session } from '../session'; import { Uri } from '../util/uri'; +import { vcpkgExtract } from '../vcpkg'; import { applyAcquireOptions } from './util'; - export async function installNuGet(session: Session, name: string, version: string, targetLocation: Uri, install: NupkgInstaller, events: Partial, options: Partial): Promise { const file = await acquireNugetFile(session, install.location, `${name}.zip`, events, applyAcquireOptions(options, install)); - return unpackZip( + events.unpackArchiveStart?.(file); + await vcpkgExtract( session, - file, - targetLocation, - events, - { - strip: install.strip, - transform: [...install.transform], - }); + file.fsPath, + targetLocation.fsPath, + install.strip); } diff --git a/ce/ce/installers/untar.ts b/vcpkg-artifacts/installers/untar.ts similarity index 62% rename from ce/ce/installers/untar.ts rename to vcpkg-artifacts/installers/untar.ts index 9a3d40c2f4..0a457ca9f5 100644 --- a/ce/ce/installers/untar.ts +++ b/vcpkg-artifacts/installers/untar.ts @@ -1,27 +1,20 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { unpackTar, unpackTarBz, unpackTarGz } from '../archivers/tar'; -import { Unpacker } from '../archivers/unpacker'; import { acquireArtifactFile } from '../fs/acquire'; import { InstallEvents, InstallOptions } from '../interfaces/events'; import { UnTarInstaller } from '../interfaces/metadata/installers/tar'; import { Session } from '../session'; import { Uri } from '../util/uri'; +import { vcpkgExtract } from '../vcpkg'; import { applyAcquireOptions, artifactFileName } from './util'; - export async function installUnTar(session: Session, name: string, version: string, targetLocation: Uri, install: UnTarInstaller, events: Partial, options: Partial): Promise { const file = await acquireArtifactFile(session, [...install.location].map(each => session.parseLocation(each)), artifactFileName(name, version, install, '.tar'), events, applyAcquireOptions(options, install)); - const x = await file.readBlock(0, 128); - let unpacker: Unpacker; - if (x[0] === 0x1f && x[1] === 0x8b) { - unpacker = unpackTarGz; - } else if (x[0] === 66 && x[1] === 90) { - unpacker = unpackTarBz; - } else { - unpacker = unpackTar; - } - - return unpacker(session, file, targetLocation, events, { strip: install.strip, transform: [...install.transform] }); + events.unpackArchiveStart?.(file); + await vcpkgExtract( + session, + file.fsPath, + targetLocation.fsPath, + install.strip); } diff --git a/ce/ce/installers/unzip.ts b/vcpkg-artifacts/installers/unzip.ts similarity index 81% rename from ce/ce/installers/unzip.ts rename to vcpkg-artifacts/installers/unzip.ts index b06f5e5b3b..bf1da1f5b0 100644 --- a/ce/ce/installers/unzip.ts +++ b/vcpkg-artifacts/installers/unzip.ts @@ -1,23 +1,20 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { unpackZip } from '../archivers/ZipUnpacker'; import { acquireArtifactFile } from '../fs/acquire'; import { InstallEvents, InstallOptions } from '../interfaces/events'; import { UnZipInstaller } from '../interfaces/metadata/installers/zip'; import { Session } from '../session'; import { Uri } from '../util/uri'; +import { vcpkgExtract } from '../vcpkg'; import { applyAcquireOptions, artifactFileName } from './util'; export async function installUnZip(session: Session, name: string, version: string, targetLocation: Uri, install: UnZipInstaller, events: Partial, options: Partial): Promise { const file = await acquireArtifactFile(session, [...install.location].map(each => session.parseLocation(each)), artifactFileName(name, version, install, '.zip'), events, applyAcquireOptions(options, install)); - await unpackZip( + events.unpackArchiveStart?.(file); + await vcpkgExtract( session, - file, - targetLocation, - events, - { - strip: install.strip, - transform: [...install.transform], - }); + file.fsPath, + targetLocation.fsPath, + install.strip); } diff --git a/ce/ce/installers/util.ts b/vcpkg-artifacts/installers/util.ts similarity index 100% rename from ce/ce/installers/util.ts rename to vcpkg-artifacts/installers/util.ts diff --git a/ce/ce/interfaces/collections.ts b/vcpkg-artifacts/interfaces/collections.ts similarity index 100% rename from ce/ce/interfaces/collections.ts rename to vcpkg-artifacts/interfaces/collections.ts diff --git a/ce/ce/interfaces/error-kind.ts b/vcpkg-artifacts/interfaces/error-kind.ts similarity index 100% rename from ce/ce/interfaces/error-kind.ts rename to vcpkg-artifacts/interfaces/error-kind.ts diff --git a/ce/ce/interfaces/events.ts b/vcpkg-artifacts/interfaces/events.ts similarity index 75% rename from ce/ce/interfaces/events.ts rename to vcpkg-artifacts/interfaces/events.ts index 4e1bb4f078..a642970380 100644 --- a/ce/ce/interfaces/events.ts +++ b/vcpkg-artifacts/interfaces/events.ts @@ -23,12 +23,8 @@ export interface FileEntry { } export interface UnpackEvents { - unpackArchiveStart(archiveUri: Uri, outputUri: Uri): void; - unpackArchiveProgress(archiveUri: Uri, archivePercentage: number): void; - // message when we have no ability to give a linear progress + unpackArchiveStart(archiveUri: Uri): void; unpackArchiveHeartbeat(text: string): void; - unpackFileProgress(entry: Readonly, filePercentage: number): void; - unpackFileComplete(entry: Readonly): void; } export interface InstallEvents extends DownloadEvents, UnpackEvents { diff --git a/ce/ce/interfaces/metadata/contact.ts b/vcpkg-artifacts/interfaces/metadata/contact.ts similarity index 100% rename from ce/ce/interfaces/metadata/contact.ts rename to vcpkg-artifacts/interfaces/metadata/contact.ts diff --git a/ce/ce/interfaces/metadata/demands.ts b/vcpkg-artifacts/interfaces/metadata/demands.ts similarity index 100% rename from ce/ce/interfaces/metadata/demands.ts rename to vcpkg-artifacts/interfaces/metadata/demands.ts diff --git a/ce/ce/interfaces/metadata/exports.ts b/vcpkg-artifacts/interfaces/metadata/exports.ts similarity index 100% rename from ce/ce/interfaces/metadata/exports.ts rename to vcpkg-artifacts/interfaces/metadata/exports.ts diff --git a/ce/ce/interfaces/metadata/installers/Installer.ts b/vcpkg-artifacts/interfaces/metadata/installers/Installer.ts similarity index 100% rename from ce/ce/interfaces/metadata/installers/Installer.ts rename to vcpkg-artifacts/interfaces/metadata/installers/Installer.ts diff --git a/ce/ce/interfaces/metadata/installers/git.ts b/vcpkg-artifacts/interfaces/metadata/installers/git.ts similarity index 100% rename from ce/ce/interfaces/metadata/installers/git.ts rename to vcpkg-artifacts/interfaces/metadata/installers/git.ts diff --git a/ce/ce/interfaces/metadata/installers/nupkg.ts b/vcpkg-artifacts/interfaces/metadata/installers/nupkg.ts similarity index 100% rename from ce/ce/interfaces/metadata/installers/nupkg.ts rename to vcpkg-artifacts/interfaces/metadata/installers/nupkg.ts diff --git a/ce/ce/interfaces/metadata/installers/tar.ts b/vcpkg-artifacts/interfaces/metadata/installers/tar.ts similarity index 100% rename from ce/ce/interfaces/metadata/installers/tar.ts rename to vcpkg-artifacts/interfaces/metadata/installers/tar.ts diff --git a/ce/ce/interfaces/metadata/installers/unpack-settings.ts b/vcpkg-artifacts/interfaces/metadata/installers/unpack-settings.ts similarity index 100% rename from ce/ce/interfaces/metadata/installers/unpack-settings.ts rename to vcpkg-artifacts/interfaces/metadata/installers/unpack-settings.ts diff --git a/ce/ce/interfaces/metadata/installers/verifiable.ts b/vcpkg-artifacts/interfaces/metadata/installers/verifiable.ts similarity index 100% rename from ce/ce/interfaces/metadata/installers/verifiable.ts rename to vcpkg-artifacts/interfaces/metadata/installers/verifiable.ts diff --git a/ce/ce/interfaces/metadata/installers/zip.ts b/vcpkg-artifacts/interfaces/metadata/installers/zip.ts similarity index 100% rename from ce/ce/interfaces/metadata/installers/zip.ts rename to vcpkg-artifacts/interfaces/metadata/installers/zip.ts diff --git a/ce/ce/interfaces/metadata/version-reference.ts b/vcpkg-artifacts/interfaces/metadata/version-reference.ts similarity index 100% rename from ce/ce/interfaces/metadata/version-reference.ts rename to vcpkg-artifacts/interfaces/metadata/version-reference.ts diff --git a/ce/ce/interfaces/validation-message.ts b/vcpkg-artifacts/interfaces/validation-message.ts similarity index 100% rename from ce/ce/interfaces/validation-message.ts rename to vcpkg-artifacts/interfaces/validation-message.ts diff --git a/ce/ce/interfaces/validation.ts b/vcpkg-artifacts/interfaces/validation.ts similarity index 100% rename from ce/ce/interfaces/validation.ts rename to vcpkg-artifacts/interfaces/validation.ts diff --git a/ce/ce/locales/messages.json b/vcpkg-artifacts/locales/messages.json similarity index 73% rename from ce/ce/locales/messages.json rename to vcpkg-artifacts/locales/messages.json index 0a06df400f..744263abb2 100644 --- a/ce/ce/locales/messages.json +++ b/vcpkg-artifacts/locales/messages.json @@ -1,12 +1,8 @@ { - "UnrecognizedCommand$": "Unrecognized command '${p0}'", - "_UnrecognizedCommand$.comment": "\n'${p0}' (aka 'commandline.inputs[0]') is a parameter of type 'string'\n", - "Use$ToGetHelp": "Use ${p0} to get help", - "_Use$ToGetHelp.comment": "\n'${p0}' is a parameter of type 'string'\n", - "FatalTheRootFolder$CanNotBeCreated": "Fatal: The root folder '${p0}' can not be created", - "_FatalTheRootFolder$CanNotBeCreated.comment": "\n'${p0}' (aka 'this.homeFolder.fsPath') is a parameter of type 'string'\n", - "FatalTheGlobalConfigurationFile$CanNotBeCreated": "Fatal: The global configuration file '${p0}' can not be created", - "_FatalTheGlobalConfigurationFile$CanNotBeCreated.comment": "\n'${p0}' (aka 'this.globalConfig.fsPath') is a parameter of type 'string'\n", + "FatalTheRootFolder$CannotBeCreated": "Fatal: The root folder '${p0}' cannot be created", + "_FatalTheRootFolder$CannotBeCreated.comment": "\n'${p0}' (aka 'this.homeFolder.fsPath') is a parameter of type 'string'\n", + "FatalTheGlobalConfigurationFile$CannotBeCreated": "Fatal: The global configuration file '${p0}' cannot be created", + "_FatalTheGlobalConfigurationFile$CannotBeCreated.comment": "\n'${p0}' (aka 'this.globalConfig.fsPath') is a parameter of type 'string'\n", "VCPKGCOMMANDWasNotSet": "VCPKG_COMMAND was not set", "RunningVcpkgInternallyReturnedANonzeroExitCode$": "Running vcpkg internally returned a nonzero exit code: ${p0}", "_RunningVcpkgInternallyReturnedANonzeroExitCode$.comment": "\n'${p0}' is a parameter of type 'number'\n", @@ -43,8 +39,6 @@ "_optionsShouldBeASequenceFound$.comment": "\n'${p0}' is a parameter of type 'string'\n", "DuplicateKeysDetectedInManifest$": "Duplicate keys detected in manifest: '${p0}'", "_DuplicateKeysDetectedInManifest$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "in$Skipping$BecauseItIsA$": "in ${p0} skipping ${p1} because it is a ${p2}", - "_in$Skipping$BecauseItIsA$.comment": "\n'${p0}' (aka 'archiveUri.fsPath') is a parameter of type 'string'\n\n'${p1}' (aka 'header.name') is a parameter of type 'string'\n\n'${p2}' (aka 'header?.type || ''') is a parameter of type 'string'\n", "noPostscriptFileRerunWithTheVcpkgShellFunctionRatherThanExecutable": "no postscript file: rerun with the vcpkg shell function rather than executable", "DuplicateDefine$DuringActivationNewValueWillReplaceOld": "Duplicate define ${p0} during activation. New value will replace old.", "_DuplicateDefine$DuringActivationNewValueWillReplaceOld.comment": "\n'${p0}' is a parameter of type 'string'\n", @@ -88,7 +82,6 @@ "verifying": "verifying", "downloading$$": "downloading ${p0} -> ${p1}", "_downloading$$.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'string'\n", - "unpacking": "unpacking", "unpacking$": "unpacking ${p0}", "_unpacking$.comment": "\n'${p0}' (aka 'archiveUri.fsPath') is a parameter of type 'string'\n", "Installing$": "Installing ${p0}...", @@ -101,14 +94,10 @@ "_Unpacking$.comment": "\n'${p0}' (aka 'archiveUri.fsPath') is a parameter of type 'string'\n", "ErrorInstalling$$": "Error installing ${p0} - ${p1}", "_ErrorInstalling$$.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'any'\n", - "ExpectedASingleValueFor$FoundMultiple": "Expected a single value for ${p0} - found multiple", - "_ExpectedASingleValueFor$FoundMultiple.comment": "\n'${p0}' is a parameter of type 'string'\n", - "Synopsis": "Synopsis", - "Description": "Description", - "Switches": "Switches", - "SeeAlso": "See Also", "error": "error:", "warning": "warning:", + "ExpectedASingleValueFor$FoundMultiple": "Expected a single value for ${p0} - found multiple", + "_ExpectedASingleValueFor$FoundMultiple.comment": "\n'${p0}' is a parameter of type 'string'\n", "ExpectedASingleValueFor$": "Expected a single value for '--${p0}'.", "_ExpectedASingleValueFor$.comment": "\n'${p0}' (aka 'this.switch') is a parameter of type 'string'\n", "Assuming$IsCorrectSupplyAHashInTheArtifactMetadataToSuppressThisMessage": "Assuming '${p0}' is correct; supply a hash in the artifact metadata to suppress this message.", @@ -191,25 +180,15 @@ "_CouldNotFindAValueFor$In$ToWriteTheLiteralValueUse$Instead.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'string'\n\n'${p2}' is a parameter of type 'string'\n", "MatchedMoreThanOneInstallBlock$": "Matched more than one install block [${p0}]", "_MatchedMoreThanOneInstallBlock$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "AcquiresEverythingReferencedByAProjectWithoutActivating": "Acquires everything referenced by a project, without activating", - "ThisAllowsTheConsumerToPredownloadToolsRequiredForAProject": "This allows the consumer to pre-download tools required for a project.", "UnableToFindProjectInFolderorParentFoldersFor$": "Unable to find project in folder (or parent folders) for ${p0}", "_UnableToFindProjectInFolderorParentFoldersFor$.comment": "\n'${p0}' (aka 'session.currentDirectory.fsPath') is a parameter of type 'string'\n", "UnableToAcquireProject": "Unable to acquire project", - "AcquireArtifactsInTheRegistry": "Acquire artifacts in the registry", - "ThisAllowsTheConsumerToAcquiredownloadAndUnpackArtifactsArtifactsMustBeActivatedToBeUsed": "This allows the consumer to acquire (download and unpack) artifacts. Artifacts must be activated to be used", "NoArtifactsSpecified": "No artifacts specified", - "MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches": "Multiple packages specified, but not an equal number of ${p0} switches", - "_MultiplePackagesSpecifiedButNotAnEqualNumberOf$Switches.comment": "\n'${p0}' is a parameter of type 'string'\n", "NoArtifactsAreAcquired": "No artifacts are acquired", "AllArtifactsAreAlreadyInstalled": "All artifacts are already installed", "$ArtifactsInstalledSuccessfully": "${p0} artifacts installed successfully", "_$ArtifactsInstalledSuccessfully.comment": "\n'${p0}' is a parameter of type 'number'\n", "InstallationFailedStopping": "Installation failed -- stopping", - "ActivatesTheToolsRequiredForAProject": "Activates the tools required for a project", - "ThisAllowsTheConsumerToActivateTheToolsRequiredForAProjectIfTheToolsAreNotAlreadyInstalledThisWillForceThemToBeDownloadedAndInstalledBeforeActivation": "This allows the consumer to Activate the tools required for a project. If the tools are not already installed, this will force them to be downloaded and installed before activation.", - "AddsAnArtifactToTheProject": "Adds an artifact to the project", - "ThisAllowsTheConsumerToAddAnArtifactToTheProjectThisWillActivateTheProjectAsWell": "This allows the consumer to add an artifact to the project. This will activate the project as well.", "MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches": "Multiple artifacts specified, but not an equal number of ${p0} switches", "_MultipleArtifactsSpecifiedButNotAnEqualNumberOf$Switches.comment": "\n'${p0}' is a parameter of type 'string'\n", "TriedToAddAnArtifact$$ButCouldNotDetermineTheRegistryToUse": "Tried to add an artifact [${p0}]:${p1} but could not determine the registry to use.", @@ -217,49 +196,17 @@ "TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt": "Tried to add registry ${p0} as ${p1}, but it was already ${p2}. Please add ${p3} to this project manually and reattempt.", "_TriedToAddRegistry$As$ButItWasAlready$PleaseAdd$ToThisProjectManuallyAndReattempt.comment": "\n'${p0}' is a parameter of type 'string | undefined'\n\n'${p1}' is a parameter of type 'string'\n\n'${p2}' is a parameter of type 'string'\n\n'${p3}' is a parameter of type 'string'\n", "RunvcpkgActivateToApplyToTheCurrentTerminal": "Run \\`vcpkg activate\\` to apply to the current terminal", - "ManagesTheDownloadCache": "Manages the download cache", "DownloadsFolderCleared$": "Downloads folder cleared (${p0}) ", "_DownloadsFolderCleared$.comment": "\n'${p0}' (aka 'session.downloads.fsPath') is a parameter of type 'string'\n", - "cleansOutEverythingcacheInstalledArtifacts": "cleans out everything (cache, installed artifacts)", - "cleansOutTheDownloadsCache": "cleans out the downloads cache", - "removesAllTheArtifactsThatAreInstalled": "removes all the artifacts that are installed", - "cleansUp": "cleans up", - "AllowsTheUserToCleanOutTheCacheInstalledArtifactsEtc": "Allows the user to clean out the cache, installed artifacts, etc.", "InstalledArtifactFolderCleared$": "Installed Artifact folder cleared (${p0}) ", "_InstalledArtifactFolderCleared$.comment": "\n'${p0}' (aka 'session.installFolder.fsPath') is a parameter of type 'string'\n", "CacheFolderCleared$": "Cache folder cleared (${p0}) ", "_CacheFolderCleared$.comment": "\n'${p0}' (aka 'session.downloads.fsPath') is a parameter of type 'string'\n", - "DeactivatesTheCurrentSession": "Deactivates the current session", - "ThisAllowsTheConsumerToRemoveEnvironmentSettingsForTheCurrentlyActiveSession": "This allows the consumer to remove environment settings for the currently active session.", - "DeletesAnArtifactFromTheArtifactFolder": "Deletes an artifact from the artifact folder", - "ThisAllowsTheConsumerToRemoveAnArtifactFromDisk": "This allows the consumer to remove an artifact from disk.", "DeletingArtifact$From$": "Deleting artifact ${p0} from ${p1}", "_DeletingArtifact$From$.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' (aka 'folder.fsPath') is a parameter of type 'string'\n", - "FindArtifactsInTheRegistry": "Find artifacts in the registry", - "ThisAllowsTheUserToFindArtifactsBasedOnSomeCriteria": "This allows the user to find artifacts based on some criteria.", "NoArtifactsFoundMatchingCriteria$": "No artifacts found matching criteria: ${p0}", "_NoArtifactsFoundMatchingCriteria$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "GeneratesMSBuildPropertiesForAnActivationWithoutDownloadingAnythingForAProject": "Generates MSBuild properties for an activation without downloading anything for a project", - "generatemsbuildpropsRequiresmsbuildprops": "generate-msbuild-props requires --msbuild-props", "UnableToActivateProject": "Unable to activate project", - "theNameOfTheCommandForWhichYouWantHelp": "the name of the command for which you want help", - "getHelpOn$OrOneOfTheCommands": "get help on ${p0} or one of the commands", - "_getHelpOn$OrOneOfTheCommands.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "GetsDetailedHelpOn$OrOneOfTheCommands": "Gets detailed help on ${p0}, or one of the commands", - "_GetsDetailedHelpOn$OrOneOfTheCommands.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "Arguments": "Arguments:", - "Use$ToGetTheListOfAvailableCommands": "Use ${p0} to get the list of available commands", - "_Use$ToGetTheListOfAvailableCommands.comment": "\n'${p0}' is a parameter of type 'string'\n", - "Usage": "Usage", - "$COMMANDargumentsswitches": "${p0} COMMAND [--switches]", - "_$COMMANDargumentsswitches.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "Available$Commands": "Available ${p0} commands:", - "_Available$Commands.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "ListsTheArtifacts": "Lists the artifacts", - "ThisAllowsTheConsumerToListArtifacts": "This allows the consumer to list artifacts.", - "regenerateTheIndexForARegistry": "regenerate the index for a registry", - "ThisAllowsTheUserToRegenerateThe$FilesForA$Registry": "This allows the user to regenerate the ${p0} files for a ${p1} registry.", - "_ThisAllowsTheUserToRegenerateThe$FilesForA$Registry.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"index.yaml\"\n'${p1}' is a parameter - it is expecting a value like: \"vcpkg\"", "RegeneratingIndexFor$": "Regenerating index for ${p0}", "_RegeneratingIndexFor$.comment": "\n'${p0}' is a parameter of type 'string'\n", "RegenerationCompleteIndexContains$MetadataFiles": "Regeneration complete. Index contains ${p0} metadata files", @@ -268,37 +215,21 @@ "_Registry$ContainsNoArtifacts.comment": "\n'${p0}' is a parameter of type 'string'\n", "error$": "error ${p0}: ", "_error$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "RemovesAnArtifactFromAProject": "Removes an artifact from a project", - "ThisAllowsTheConsumerToRemoveAnArtifactFromTheProjectForcesReactivationInThisWindow": "This allows the consumer to remove an artifact from the project. Forces reactivation in this window.", "Removing$FromProjectManifest": "Removing ${p0} from project manifest", "_Removing$FromProjectManifest.comment": "\n'${p0}' is a parameter of type 'string'\n", "unableToFindArtifact$InTheProjectManifest": "unable to find artifact ${p0} in the project manifest", "_unableToFindArtifact$InTheProjectManifest.comment": "\n'${p0}' is a parameter of type 'string'\n", - "updateTheRegistryFromTheRemote": "update the registry from the remote", - "ThisDownloadsTheLatestContentsOfTheRegistryFromTheRemoteService": "This downloads the latest contents of the registry from the remote service.", - "DownloadingRegistryData": "Downloading registry data", - "Updated$RegistryContains$MetadataFiles": "Updated ${p0}. registry contains ${p1} metadata files", - "_Updated$RegistryContains$MetadataFiles.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'string'\n", - "UnableToDownloadRegistrySnapshot": "Unable to download registry snapshot", - "UnableToFindRegistry$": "Unable to find registry ${p0}", + "Updated$ItContains$MetadataFiles": "Updated ${p0}. It contains ${p1} metadata files.", + "_Updated$ItContains$MetadataFiles.comment": "\n'${p0}' is a parameter of type 'string'\n\n'${p1}' is a parameter of type 'string'\n", + "UnableToDownload$": "Unable to download ${p0}.", + "_UnableToDownload$.comment": "\n'${p0}' is a parameter of type 'string'\n", + "$CouldNotBeUpdatedItCouldBeMalformed": "${p0} could not be updated; it could be malformed.", + "_$CouldNotBeUpdatedItCouldBeMalformed.comment": "\n'${p0}' is a parameter of type 'string'\n", + "TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$": "The x-update-registry command downloads new registry information and thus cannot be used with local registries. Did you mean x-regenerate ${p0}?", + "_TheXupdateregistryCommandDownloadsNewRegistryInformationAndThusCannotBeUsedWithLocalRegistriesDidYouMeanXregenerate$.comment": "\n'${p0}' is a parameter of type 'string'\n", + "UnableToFindRegistry$": "Unable to find registry ${p0}.", "_UnableToFindRegistry$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "ArtifactRegistryDataIsNotLoaded": "Artifact registry data is not loaded", - "AttemptingToUpdateArtifactRegistry": "Attempting to update artifact registry", - "UnableToLoadRegistryIndex": "Unable to load registry index", - "InstantlyActivatesAnArtifactOutsideOfTheProject": "Instantly activates an artifact outside of the project", - "ThisWillInstantlyActivateAnArtifact": "This will instantly activate an artifact .", "NoArtifactsAreBeingAcquired": "No artifacts are being acquired", - "removesAllFilesInTheLocalCache": "removes all files in the local cache", - "enablesDebugModeDisplaysInternalMesssagesAboutHow$Works": "enables debug mode, displays internal messsages about how ${p0} works", - "_enablesDebugModeDisplaysInternalMesssagesAboutHow$Works.comment": "\n'${p0}' is a parameter - it is expecting a value like: \"vcpkg\"", - "proceedsWithThepotentiallyDangerousActionWithoutConfirmation": "proceeds with the (potentially dangerous) action without confirmation", - "showsTheinstalledArtifacts": "shows the _installed_ artifacts", - "DumpEnvironmentVariablesAndOtherPropertiesToAJsonFileWithThePathProvidedByTheUser": "Dump environment variables and other properties to a json file with the path provided by the user.", - "FullPathToTheFileInWhichMSBuildPropertiesWillBeWritten": "Full path to the file in which MSBuild properties will be written.", - "ApplyAnyDeprecationFixups": "Apply any deprecation fixups.", - "overrideThePathToTheProjectFolder": "override the path to the project folder", "UnableToFindProjectEnvironment$": "Unable to find project environment ${p0}", - "_UnableToFindProjectEnvironment$.comment": "\n'${p0}' is a parameter of type 'string'\n", - "enablesVerboseModeDisplaysVerboseMesssagesAboutTheProcess": "enables verbose mode, displays verbose messsages about the process", - "aVersionOrVersionRangeToMatch": "a version or version range to match" + "_UnableToFindProjectEnvironment$.comment": "\n'${p0}' is a parameter of type 'string'\n" } \ No newline at end of file diff --git a/ce/ce/main.ts b/vcpkg-artifacts/main.ts similarity index 80% rename from ce/ce/main.ts rename to vcpkg-artifacts/main.ts index 2a2ece42cc..ea317387ba 100644 --- a/ce/ce/main.ts +++ b/vcpkg-artifacts/main.ts @@ -16,16 +16,13 @@ import { DeactivateCommand } from './cli/commands/deactivate'; import { DeleteCommand } from './cli/commands/delete'; import { FindCommand } from './cli/commands/find'; import { GenerateMSBuildPropsCommand } from './cli/commands/generate-msbuild-props'; -import { HelpCommand } from './cli/commands/help'; import { ListCommand } from './cli/commands/list'; import { RegenerateCommand } from './cli/commands/regenerate-index'; import { RemoveCommand } from './cli/commands/remove'; import { UpdateCommand } from './cli/commands/update'; import { UseCommand } from './cli/commands/use'; -import { cli } from './cli/constants'; -import { command as formatCommand, hint } from './cli/format'; import { error, initStyling, log } from './cli/styling'; -import { i, setLocale } from './i18n'; +import { setLocale } from './i18n'; import { Session } from './session'; // parse the command line @@ -52,8 +49,6 @@ async function main() { // start up the session and init the channel listeners. await session.init(); - const help = new HelpCommand(commandline); - const find = new FindCommand(commandline); const list = new ListCommand(commandline); @@ -75,14 +70,6 @@ async function main() { const cache = new CacheCommand(commandline); const clean = new CleanCommand(commandline); - const needsHelp = !!(commandline.switches['help'] || commandline.switches['?'] || (['-h', '-help', '-?', '/?'].find(each => argv.includes(each)))); - // check if --help -h -? --? /? are asked for - if (needsHelp) { - // let's just run general help - await help.run(); - return process.exit(0); - } - const command = commandline.command; if (!command) { // no command recognized. @@ -90,13 +77,10 @@ async function main() { // did they specify inputs? if (commandline.inputs.length > 0) { // unrecognized command - error(i`Unrecognized command '${commandline.inputs[0]}'`); - log(hint(i`Use ${formatCommand(`${cli} ${help.command}`)} to get help`)); + error(`Unrecognized command '${commandline.inputs[0]}'`); return process.exitCode = 1; } - log(hint(i`Use ${formatCommand(`${cli} ${help.command}`)} to get help`)); - return process.exitCode = 0; } let result = true; @@ -114,7 +98,7 @@ async function main() { error(e); await session.writeTelemetry(); - return process.exit(result ? 0 : 1); + return process.exit(1); } finally { await session.writeTelemetry(); } diff --git a/ce/ce/mediaquery/character-codes.ts b/vcpkg-artifacts/mediaquery/character-codes.ts similarity index 100% rename from ce/ce/mediaquery/character-codes.ts rename to vcpkg-artifacts/mediaquery/character-codes.ts diff --git a/ce/ce/mediaquery/media-query.ts b/vcpkg-artifacts/mediaquery/media-query.ts similarity index 100% rename from ce/ce/mediaquery/media-query.ts rename to vcpkg-artifacts/mediaquery/media-query.ts diff --git a/ce/ce/mediaquery/scanner.ts b/vcpkg-artifacts/mediaquery/scanner.ts similarity index 99% rename from ce/ce/mediaquery/scanner.ts rename to vcpkg-artifacts/mediaquery/scanner.ts index e686d4dc49..a4a520f2d1 100644 --- a/ce/ce/mediaquery/scanner.ts +++ b/vcpkg-artifacts/mediaquery/scanner.ts @@ -55,7 +55,7 @@ const mergeConflictMarkerLength = 7; * is 1 and the character offset of b is 3 since `𐐀` is represented using two code * units in UTF-16. * - * Positions are line end character agnostic. So you can not specify a position that + * Positions are line end character agnostic. So you cannot specify a position that * denotes `\r|\n` or `\n|` where `|` represents the character offset. */ export interface Position { diff --git a/vcpkg-artifacts/mocha-config.yaml b/vcpkg-artifacts/mocha-config.yaml new file mode 100644 index 0000000000..cffbeb8019 --- /dev/null +++ b/vcpkg-artifacts/mocha-config.yaml @@ -0,0 +1,9 @@ +color: true +monkeyPatch: true +spec: ./test/**/*.js +ignore: + - "./test/**/*.d.ts" + +# this section enables npm watch-test to work right +watch-files: ./**/*.js + diff --git a/vcpkg-artifacts/package-lock.json b/vcpkg-artifacts/package-lock.json new file mode 100644 index 0000000000..deaa50aede --- /dev/null +++ b/vcpkg-artifacts/package-lock.json @@ -0,0 +1,4979 @@ +{ + "name": "@microsoft/vcpkg-ce", + "version": "0.8.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@microsoft/vcpkg-ce", + "version": "0.8.0", + "bundleDependencies": [ + "@snyk/nuget-semver", + "chalk", + "cli-progress", + "semver", + "sorted-btree", + "strip-ansi", + "vscode-uri", + "xml-writer", + "yaml" + ], + "license": "MIT", + "dependencies": { + "@snyk/nuget-semver": "1.3.0", + "chalk": "4.1.2", + "cli-progress": "3.11.1", + "semver": "7.5.2", + "sorted-btree": "1.6.0", + "strip-ansi": "5.2", + "vscode-uri": "3.0.3", + "xml-writer": "1.7.0", + "yaml": "^2.2.2" + }, + "devDependencies": { + "@types/cli-progress": "3.11.0", + "@types/mocha": "9.1.0", + "@types/node": "^18.15.11", + "@types/semver": "7.3.9", + "@types/tar-stream": "^2.2.2", + "@typescript-eslint/eslint-plugin": "5.10.2", + "@typescript-eslint/parser": "5.10.2", + "eslint": "8.8.0", + "eslint-plugin-notice": "0.9.10", + "mocha": "9.2", + "source-map-support": "0.5.21", + "translate-strings": "1.1.15", + "typescript": "^5.0.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha1-eI7nhFelWvihrTQqyxgjg9IRkkk=", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/abort-controller/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha1-Qr/thvV4eutB0DGGbI9AJCng/d8=", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/cognitiveservices-translatortext": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/cognitiveservices-translatortext/-/cognitiveservices-translatortext-1.0.1.tgz", + "integrity": "sha1-iIRCw+KXZ33jaIf7MlEAonFS0CU=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/ms-rest-js": "^2.0.4", + "tslib": "^1.10.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/core-auth/-/core-auth-1.4.0.tgz", + "integrity": "sha1-b6lmHBcFhXgg28IW31ulZlrDap4=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-auth/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha1-Qr/thvV4eutB0DGGbI9AJCng/d8=", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/ms-rest-azure-js": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/ms-rest-azure-js/-/ms-rest-azure-js-2.1.0.tgz", + "integrity": "sha1-jJCzFGiuyjFGsGxxRLOG/Ugn9kw=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "@azure/ms-rest-js": "^2.2.0", + "tslib": "^1.10.0" + } + }, + "node_modules/@azure/ms-rest-js": { + "version": "2.7.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/ms-rest-js/-/ms-rest-js-2.7.0.tgz", + "integrity": "sha1-hjkGVXf/30lGlR4dJGM06/1y1Tc=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.7", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^8.3.2", + "xml2js": "^0.5.0" + } + }, + "node_modules/@dsherret/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha1-r1h3IBmi0nG34tTCP/Tdy6PM+z4=", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha1-LLr5qJRg2iS1ymUxuLv8I+HfUMc=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@snyk/nuget-semver": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@snyk/nuget-semver/-/nuget-semver-1.3.0.tgz", + "integrity": "sha1-p071NA3K2jvEs6AZt5UHON9RGZw=", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.7.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@ts-morph/common/-/common-0.7.5.tgz", + "integrity": "sha1-2BYDq9S4bQCZ1pI5y7zfmQpd+yU=", + "dev": true, + "license": "MIT", + "dependencies": { + "@dsherret/to-absolute-glob": "^2.0.2", + "fast-glob": "^3.2.5", + "is-negated-glob": "^1.0.0", + "mkdirp": "^1.0.4", + "multimatch": "^5.0.0", + "typescript": "~4.1.3" + } + }, + "node_modules/@ts-morph/common/node_modules/typescript": { + "version": "4.1.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/typescript/-/typescript-4.1.6.tgz", + "integrity": "sha1-G+zYXXdWfDx0EXIznpPOLmmTITg=", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@types/cli-progress": { + "version": "3.11.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/cli-progress/-/cli-progress-3.11.0.tgz", + "integrity": "sha1-7HnfmbJnV8PRxxcK+EIuD8le734=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha1-1CG2xSejA398hEM/0sQingFoY9M=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha1-EAHMXmo3BLg8I2An538vWOoBD0A=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "9.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha1-uvF6ssyj/M4tMi68MEVL/0h++tU=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.15.11", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/node/-/node-18.15.11.tgz", + "integrity": "sha1-s7eQ8JyxaWz/zsYF3gJbCI+kIl8=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.3.9", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/semver/-/semver-7.3.9.tgz", + "integrity": "sha1-FSxsIKdojDC5Z+wYQdMazlaYY/w=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tar-stream": { + "version": "2.2.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/tar-stream/-/tar-stream-2.2.2.tgz", + "integrity": "sha1-vp0L6UBBZuSxFBUfk+hELmq2+x0=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz", + "integrity": "sha1-+MHVn8N71tnRHJcmf9/nIsR3cVI=", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/type-utils": "5.10.2", + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/parser/-/parser-5.10.2.tgz", + "integrity": "sha1-tgdtJ8xUmc4/LGJfXM3pRuy325o=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz", + "integrity": "sha1-ksC8k17ADz2GOM3/s9DnDJuHljk=", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz", + "integrity": "sha1-rVrN+Yp9KrAwvqgfF9pFdRkQHOs=", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/types/-/types-5.10.2.tgz", + "integrity": "sha1-YE0V15XEYB//um7LRYf/n97GjOg=", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz", + "integrity": "sha1-gQkGBWzT3cs1qjM/277zcTsP5Kc=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/utils/-/utils-5.10.2.tgz", + "integrity": "sha1-H803VHwyxkirEa6nFz7DAGDuh6g=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz", + "integrity": "sha1-/b8nLY5hwEXYZb1si0G+pz0iLz0=", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.10.2", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha1-qlgEJxHW4ydd033Fl+XTHowpCkQ=", + "dev": true, + "license": "ISC" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha1-6vVNU7YrrkE46AnKIlyEOabvs5I=", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha1-Gy8l2wKvllOZuXdrDCw5EnbTfEo=", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha1-Fk2qyHqy1vbbOimHXi0XZlgtq+0=", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha1-eQxYsZuhcgqEIFtXxhjVrYUklz4=", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha1-PLs9DzFoEOr8xHYkc0I31q7krms=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha1-yWVekzHgq81YjSp8rX6ZVvZnAfo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/braces/-/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "dev": true, + "license": "ISC" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha1-HPN8hwe5Mr0a8a4iwEMuKs0ZA70=", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cli-progress": { + "version": "3.11.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/cli-progress/-/cli-progress-3.11.1.tgz", + "integrity": "sha1-Aq+xG+mhI/KjApMb6wh+r+Og2XE=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/code-block-writer": { + "version": "10.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha1-rVaE7Uv7KweDyLExKBroTuZApC8=", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/debug/-/debug-4.3.4.tgz", + "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha1-qkcte/Zg6xXzSU79UxyrfypwmDc=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/diff/-/diff-5.0.0.tgz", + "integrity": "sha1-ftatdthZ0DB4fsNYVfWx2vMdhSs=", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.8.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha1-l2K0mrrQy0lSU5/9sKBGOS5XGi0=", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-notice": { + "version": "0.9.10", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-plugin-notice/-/eslint-plugin-notice-0.9.10.tgz", + "integrity": "sha1-ic9jd78cAEohnE5UEyHqkSW0CMg=", + "dev": true, + "license": "MIT", + "dependencies": { + "find-root": "^1.1.0", + "lodash": "^4.17.15", + "metric-lcs": "^0.1.2" + }, + "peerDependencies": { + "eslint": ">=3.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha1-9kgPprHzDv4tGWiqisdFuGJGmCY=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha1-//NIlML2XlIm0wQaxIC0UToWNkI=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/espree/-/espree-9.5.0.tgz", + "integrity": "sha1-NkbU4/WJB0ZO26hS+gR+aie98RM=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha1-bOF3ON6Fd2lO3XNhxXGCrIyw2ws=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha1-XU0+vflYPWOlMzzi3rdICrKwV4k=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha1-fznsmcLmqwMDNxQtqeDBjzevroA=", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha1-0E0HxqKmj+RZn+qNLhA6k3+uazo=", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/flat/-/flat-5.0.2.tgz", + "integrity": "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE=", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha1-YJ85IHy2FLidB2W0d8stQ3+/l4c=", + "dev": true, + "license": "ISC" + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha1-8svsV7XlniNxbhKP5E1OXdI4lfQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "license": "ISC" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true, + "license": "MIT" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/glob/-/glob-7.2.0.tgz", + "integrity": "sha1-0VU1r3cy4C6Uj0xBYovZECk/YCM=", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/globals/-/globals-13.20.0.tgz", + "integrity": "sha1-6idqHlCP/U8WEoiPnRutHicXv4I=", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/globby/-/globby-11.1.0.tgz", + "integrity": "sha1-vUvpi7BC+D15b344EZkfvoKg00s=", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/growl/-/growl-1.10.5.tgz", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/he/-/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha1-opHAxheP8blgvv5H/N7DAWdKYyQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true, + "license": "ISC" + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/levn/-/levn-0.4.1.tgz", + "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha1-VTIeswn+u8WcSAHZMackUqaB0oY=", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha1-P727lbRoOsn8eFER55LlWNSr1QM=", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/metric-lcs": { + "version": "0.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/metric-lcs/-/metric-lcs-0.1.2.tgz", + "integrity": "sha1-h5E/FJQQ45x8WhkDdRKBTq8VXhE=", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha1-vImZp8u/d83InxMvbkZwUbSQkMY=", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha1-1w20a9uTyldALICTM+WoSXeoj7k=", + "dev": true, + "license": "MIT", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/debug/-/debug-4.3.3.tgz", + "integrity": "sha1-BCZuC3CpjURi5uKI44JZITMytmQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha1-QNnVEaRr3E5WPCLDCAzenA2CmbQ=", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ms/-/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true, + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha1-kyuACWPOp6MaAzMo+h4MOhh02+Y=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha1-Y0ehjKyIr4j1ivCzWUtyPV6ZuzU=", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha1-fH90S1zG61/UBODHqf7GMKVWV+Y=", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha1-O6ODNzNkbZ0+SZWUbBNlpn+wekI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha1-9n+mfJTaj00M//mBruQRgGQZm48=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true, + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.5.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/semver/-/semver-7.5.2.tgz", + "integrity": "sha1-W4UeZtG+B8HNrzffyFb1QzJaK+s=", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha1-765diPRdeSQUHai1w6en5mP+/rg=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/slash/-/slash-3.0.0.tgz", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sorted-btree": { + "version": "1.6.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/sorted-btree/-/sorted-btree-1.6.0.tgz", + "integrity": "sha1-s3mUIR7VjkAUznyh4/a2yrqVT3o=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha1-BP58f54e0tZiIzwoyys1ufY/bk8=", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true, + "license": "MIT" + }, + "node_modules/translate-strings": { + "version": "1.1.15", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/translate-strings/-/translate-strings-1.1.15.tgz", + "integrity": "sha1-PoTack2jIs6+u2+KDpVm6hMo6p4=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/cognitiveservices-translatortext": "1.0.1", + "@azure/ms-rest-azure-js": "2.1.0", + "chalk": "4.1.0", + "ts-morph": "9.1.0" + }, + "bin": { + "translate-strings": "dist/main.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/translate-strings/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-morph": { + "version": "9.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ts-morph/-/ts-morph-9.1.0.tgz", + "integrity": "sha1-ENIIg4fHHzxnT4JJKjzsHjU48N0=", + "dev": true, + "license": "MIT", + "dependencies": { + "@dsherret/to-absolute-glob": "^2.0.2", + "@ts-morph/common": "~0.7.0", + "code-block-writer": "^10.1.1" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha1-iR4akMUYnYUGr2S575Kfypm6HuU=", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/vscode-uri/-/vscode-uri-3.0.3.tgz", + "integrity": "sha1-qVwc4ub0G3VJ+GJ50Z9HlR5PTYQ=", + "inBundle": true, + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/which/-/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha1-y0tQ7JrKVwq9H1LzPNRbbGFzmp8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha1-gn2Tyboj7iAZw/+v9cJ/zOoonos=", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "license": "ISC" + }, + "node_modules/xml-writer": { + "version": "1.7.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/xml-writer/-/xml-writer-1.7.0.tgz", + "integrity": "sha1-t28dWRwWomNOvbcDx729D9aBkGU=", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "inBundle": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha1-7FUe83Mm5tQoctrRlwMA+OuDoHM=", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha1-tCiQ8UVmeW+Fro46JSkNIF8VSlQ=", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha1-8TH5ImkRrl2a04xDL+gJNmwjJes=", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha1-eI7nhFelWvihrTQqyxgjg9IRkkk=", + "dev": true, + "requires": { + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha1-Qr/thvV4eutB0DGGbI9AJCng/d8=", + "dev": true + } + } + }, + "@azure/cognitiveservices-translatortext": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/cognitiveservices-translatortext/-/cognitiveservices-translatortext-1.0.1.tgz", + "integrity": "sha1-iIRCw+KXZ33jaIf7MlEAonFS0CU=", + "dev": true, + "requires": { + "@azure/ms-rest-js": "^2.0.4", + "tslib": "^1.10.0" + } + }, + "@azure/core-auth": { + "version": "1.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/core-auth/-/core-auth-1.4.0.tgz", + "integrity": "sha1-b6lmHBcFhXgg28IW31ulZlrDap4=", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha1-Qr/thvV4eutB0DGGbI9AJCng/d8=", + "dev": true + } + } + }, + "@azure/ms-rest-azure-js": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/ms-rest-azure-js/-/ms-rest-azure-js-2.1.0.tgz", + "integrity": "sha1-jJCzFGiuyjFGsGxxRLOG/Ugn9kw=", + "dev": true, + "requires": { + "@azure/core-auth": "^1.1.4", + "@azure/ms-rest-js": "^2.2.0", + "tslib": "^1.10.0" + } + }, + "@azure/ms-rest-js": { + "version": "2.7.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@azure/ms-rest-js/-/ms-rest-js-2.7.0.tgz", + "integrity": "sha1-hjkGVXf/30lGlR4dJGM06/1y1Tc=", + "dev": true, + "requires": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.7", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^8.3.2", + "xml2js": "^0.5.0" + } + }, + "@dsherret/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-H2R13IvZdM6gei2vOGSzF7HdMyw=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha1-r1h3IBmi0nG34tTCP/Tdy6PM+z4=", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha1-LLr5qJRg2iS1ymUxuLv8I+HfUMc=", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U=", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@snyk/nuget-semver": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@snyk/nuget-semver/-/nuget-semver-1.3.0.tgz", + "integrity": "sha1-p071NA3K2jvEs6AZt5UHON9RGZw=" + }, + "@ts-morph/common": { + "version": "0.7.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@ts-morph/common/-/common-0.7.5.tgz", + "integrity": "sha1-2BYDq9S4bQCZ1pI5y7zfmQpd+yU=", + "dev": true, + "requires": { + "@dsherret/to-absolute-glob": "^2.0.2", + "fast-glob": "^3.2.5", + "is-negated-glob": "^1.0.0", + "mkdirp": "^1.0.4", + "multimatch": "^5.0.0", + "typescript": "~4.1.3" + }, + "dependencies": { + "typescript": { + "version": "4.1.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/typescript/-/typescript-4.1.6.tgz", + "integrity": "sha1-G+zYXXdWfDx0EXIznpPOLmmTITg=", + "dev": true + } + } + }, + "@types/cli-progress": { + "version": "3.11.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/cli-progress/-/cli-progress-3.11.0.tgz", + "integrity": "sha1-7HnfmbJnV8PRxxcK+EIuD8le734=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha1-1CG2xSejA398hEM/0sQingFoY9M=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha1-EAHMXmo3BLg8I2An538vWOoBD0A=", + "dev": true + }, + "@types/mocha": { + "version": "9.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha1-uvF6ssyj/M4tMi68MEVL/0h++tU=", + "dev": true + }, + "@types/node": { + "version": "18.15.11", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/node/-/node-18.15.11.tgz", + "integrity": "sha1-s7eQ8JyxaWz/zsYF3gJbCI+kIl8=", + "dev": true + }, + "@types/semver": { + "version": "7.3.9", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/semver/-/semver-7.3.9.tgz", + "integrity": "sha1-FSxsIKdojDC5Z+wYQdMazlaYY/w=", + "dev": true + }, + "@types/tar-stream": { + "version": "2.2.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@types/tar-stream/-/tar-stream-2.2.2.tgz", + "integrity": "sha1-vp0L6UBBZuSxFBUfk+hELmq2+x0=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz", + "integrity": "sha1-+MHVn8N71tnRHJcmf9/nIsR3cVI=", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/type-utils": "5.10.2", + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/parser/-/parser-5.10.2.tgz", + "integrity": "sha1-tgdtJ8xUmc4/LGJfXM3pRuy325o=", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz", + "integrity": "sha1-ksC8k17ADz2GOM3/s9DnDJuHljk=", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz", + "integrity": "sha1-rVrN+Yp9KrAwvqgfF9pFdRkQHOs=", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/types/-/types-5.10.2.tgz", + "integrity": "sha1-YE0V15XEYB//um7LRYf/n97GjOg=", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz", + "integrity": "sha1-gQkGBWzT3cs1qjM/277zcTsP5Kc=", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/utils/-/utils-5.10.2.tgz", + "integrity": "sha1-H803VHwyxkirEa6nFz7DAGDuh6g=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.10.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz", + "integrity": "sha1-/b8nLY5hwEXYZb1si0G+pz0iLz0=", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.10.2", + "eslint-visitor-keys": "^3.0.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha1-qlgEJxHW4ydd033Fl+XTHowpCkQ=", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha1-6vVNU7YrrkE46AnKIlyEOabvs5I=", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha1-Gy8l2wKvllOZuXdrDCw5EnbTfEo=", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha1-ftW7VZCLOy8bxVxq8WU7rafweTc=", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=", + "dev": true + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha1-Fk2qyHqy1vbbOimHXi0XZlgtq+0=" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha1-eQxYsZuhcgqEIFtXxhjVrYUklz4=", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=", + "dev": true + }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha1-PLs9DzFoEOr8xHYkc0I31q7krms=", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha1-yWVekzHgq81YjSp8rX6ZVvZnAfo=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/braces/-/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo=", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha1-HPN8hwe5Mr0a8a4iwEMuKs0ZA70=", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "cli-progress": { + "version": "3.11.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/cli-progress/-/cli-progress-3.11.1.tgz", + "integrity": "sha1-Aq+xG+mhI/KjApMb6wh+r+Og2XE=", + "requires": { + "string-width": "^4.2.3" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "code-block-writer": { + "version": "10.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha1-rVaE7Uv7KweDyLExKBroTuZApC8=", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/debug/-/debug-4.3.4.tgz", + "integrity": "sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU=", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha1-qkcte/Zg6xXzSU79UxyrfypwmDc=", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/diff/-/diff-5.0.0.tgz", + "integrity": "sha1-ftatdthZ0DB4fsNYVfWx2vMdhSs=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=", + "dev": true + }, + "eslint": { + "version": "8.8.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha1-l2K0mrrQy0lSU5/9sKBGOS5XGi0=", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha1-//NIlML2XlIm0wQaxIC0UToWNkI=", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "eslint-plugin-notice": { + "version": "0.9.10", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-plugin-notice/-/eslint-plugin-notice-0.9.10.tgz", + "integrity": "sha1-ic9jd78cAEohnE5UEyHqkSW0CMg=", + "dev": true, + "requires": { + "find-root": "^1.1.0", + "lodash": "^4.17.15", + "metric-lcs": "^0.1.2" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha1-9kgPprHzDv4tGWiqisdFuGJGmCY=", + "dev": true + }, + "espree": { + "version": "9.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/espree/-/espree-9.5.0.tgz", + "integrity": "sha1-NkbU4/WJB0ZO26hS+gR+aie98RM=", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha1-bOF3ON6Fd2lO3XNhxXGCrIyw2ws=", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha1-LupSkHAvJquP5TcDcP+GyWXSESM=", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha1-XU0+vflYPWOlMzzi3rdICrKwV4k=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha1-fznsmcLmqwMDNxQtqeDBjzevroA=", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha1-0E0HxqKmj+RZn+qNLhA6k3+uazo=", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha1-TJKBnstwg1YeT0okCoa+UZj1Nvw=", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/flat/-/flat-5.0.2.tgz", + "integrity": "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE=", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha1-YJ85IHy2FLidB2W0d8stQ3+/l4c=", + "dev": true + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha1-8svsV7XlniNxbhKP5E1OXdI4lfQ=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/glob/-/glob-7.2.0.tgz", + "integrity": "sha1-0VU1r3cy4C6Uj0xBYovZECk/YCM=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha1-bSN9mQg5UMeSkPJMdkKj3poo+eM=", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/globals/-/globals-13.20.0.tgz", + "integrity": "sha1-6idqHlCP/U8WEoiPnRutHicXv4I=", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/globby/-/globby-11.1.0.tgz", + "integrity": "sha1-vUvpi7BC+D15b344EZkfvoKg00s=", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/growl/-/growl-1.10.5.tgz", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=" + }, + "he": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/he/-/he-1.2.0.tgz", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha1-opHAxheP8blgvv5H/N7DAWdKYyQ=", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=", + "dev": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/levn/-/levn-0.4.1.tgz", + "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha1-VTIeswn+u8WcSAHZMackUqaB0oY=", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha1-P727lbRoOsn8eFER55LlWNSr1QM=", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "requires": { + "yallist": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "dev": true + }, + "metric-lcs": { + "version": "0.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/metric-lcs/-/metric-lcs-0.1.2.tgz", + "integrity": "sha1-h5E/FJQQ45x8WhkDdRKBTq8VXhE=", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha1-vImZp8u/d83InxMvbkZwUbSQkMY=", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", + "dev": true + }, + "mocha": { + "version": "9.2.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha1-1w20a9uTyldALICTM+WoSXeoj7k=", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/debug/-/debug-4.3.3.tgz", + "integrity": "sha1-BCZuC3CpjURi5uKI44JZITMytmQ=", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + } + } + }, + "minimatch": { + "version": "4.2.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha1-QNnVEaRr3E5WPCLDCAzenA2CmbQ=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ms/-/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "multimatch": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha1-kyuACWPOp6MaAzMo+h4MOhh02+Y=", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha1-Y0ehjKyIr4j1ivCzWUtyPV6ZuzU=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-fetch": { + "version": "2.6.9", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha1-fH90S1zG61/UBODHqf7GMKVWV+Y=", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs=", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha1-g8gxXGeFAF470CGDlBHJ4RDm2DQ=", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha1-O6ODNzNkbZ0+SZWUbBNlpn+wekI=", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha1-9n+mfJTaj00M//mBruQRgGQZm48=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + }, + "semver": { + "version": "7.5.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/semver/-/semver-7.5.2.tgz", + "integrity": "sha1-W4UeZtG+B8HNrzffyFb1QzJaK+s=", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha1-765diPRdeSQUHai1w6en5mP+/rg=", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/slash/-/slash-3.0.0.tgz", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", + "dev": true + }, + "sorted-btree": { + "version": "1.6.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/sorted-btree/-/sorted-btree-1.6.0.tgz", + "integrity": "sha1-s3mUIR7VjkAUznyh4/a2yrqVT3o=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha1-BP58f54e0tZiIzwoyys1ufY/bk8=", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "requires": { + "has-flag": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "translate-strings": { + "version": "1.1.15", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/translate-strings/-/translate-strings-1.1.15.tgz", + "integrity": "sha1-PoTack2jIs6+u2+KDpVm6hMo6p4=", + "dev": true, + "requires": { + "@azure/cognitiveservices-translatortext": "1.0.1", + "@azure/ms-rest-azure-js": "2.1.0", + "chalk": "4.1.0", + "ts-morph": "9.1.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "ts-morph": { + "version": "9.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ts-morph/-/ts-morph-9.1.0.tgz", + "integrity": "sha1-ENIIg4fHHzxnT4JJKjzsHjU48N0=", + "dev": true, + "requires": { + "@dsherret/to-absolute-glob": "^2.0.2", + "@ts-morph/common": "~0.7.0", + "code-block-writer": "^10.1.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=", + "dev": true + }, + "typescript": { + "version": "5.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha1-iR4akMUYnYUGr2S575Kfypm6HuU=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=", + "dev": true + }, + "vscode-uri": { + "version": "3.0.3", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/vscode-uri/-/vscode-uri-3.0.3.tgz", + "integrity": "sha1-qVwc4ub0G3VJ+GJ50Z9HlR5PTYQ=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/which/-/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha1-y0tQ7JrKVwq9H1LzPNRbbGFzmp8=", + "dev": true + }, + "workerpool": { + "version": "6.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha1-gn2Tyboj7iAZw/+v9cJ/zOoonos=", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xml-writer": { + "version": "1.7.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/xml-writer/-/xml-writer-1.7.0.tgz", + "integrity": "sha1-t28dWRwWomNOvbcDx729D9aBkGU=" + }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=" + }, + "yaml": { + "version": "2.2.2", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha1-7FUe83Mm5tQoctrRlwMA+OuDoHM=" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha1-tCiQ8UVmeW+Fro46JSkNIF8VSlQ=", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha1-8TH5ImkRrl2a04xDL+gJNmwjJes=", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://pkgs.dev.azure.com/vcpkg/public/_packaging/vcpkg-ecmascript-dependencies/npm/registry/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha1-ApTrPe4FAo0x7hpfosVWpqrxChs=", + "dev": true + } + } +} diff --git a/ce/ce/package.json b/vcpkg-artifacts/package.json similarity index 67% rename from ce/ce/package.json rename to vcpkg-artifacts/package.json index 760ee6fafd..a92143c681 100644 --- a/ce/ce/package.json +++ b/vcpkg-artifacts/package.json @@ -4,19 +4,14 @@ "description": "vcpkg-artifacts", "main": "dist/main.js", "typings": "dist/exports.d.ts", - "directories": { - "doc": "docs" - }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "scripts": { "eslint-fix": "eslint . --fix --ext .ts", "eslint": "eslint . --ext .ts", "build": "tsc -p .", - "watch": "tsc -p . --watch", - "prepare": "npm run build", - "watch-test": "mocha dist/test --timeout 200000 --watch" + "test": "mocha --config ./mocha-config.yaml" }, "repository": { "type": "git", @@ -28,37 +23,51 @@ ], "author": "Microsoft", "license": "MIT", + "bundledDependencies": true, "bugs": { "url": "https://github.com/Microsoft/vcpkg/issues" }, + "files": [ + "dist", + "locales" + ], "homepage": "https://github.com/Microsoft/vcpkg#readme", "readme": "https://github.com/Microsoft/vcpkg/blob/master/readme.md", "devDependencies": { - "@types/node": "17.0.15", + "@types/cli-progress": "3.11.0", + "@types/mocha": "9.1.0", + "@types/node": "^18.15.11", + "@types/semver": "7.3.9", + "@types/tar-stream": "^2.2.2", "@typescript-eslint/eslint-plugin": "5.10.2", "@typescript-eslint/parser": "5.10.2", - "eslint-plugin-notice": "0.9.10", "eslint": "8.8.0", - "@types/semver": "7.3.9", - "@types/tar-stream": "~2.2.0", - "typescript": "4.5.5", - "chalk": "4.1.2", + "eslint-plugin-notice": "0.9.10", + "mocha": "9.2", + "source-map-support": "0.5.21", "translate-strings": "1.1.15", - "@types/cli-progress": "3.11.0", - "source-map-support": "0.5.21" + "typescript": "^5.0.2" }, "dependencies": { "@snyk/nuget-semver": "1.3.0", - "vscode-uri": "3.0.3", - "yaml": "2.0.0-10", - "semver": "7.3.5", - "tar-stream": "~2.3.0", - "sorted-btree": "1.6.0", - "sed-lite": "0.8.4", - "unbzip2-stream": "1.4.3", "chalk": "4.1.2", "cli-progress": "3.11.1", + "semver": "7.5.2", + "sorted-btree": "1.6.0", + "strip-ansi": "5.2", + "vscode-uri": "3.0.3", "xml-writer": "1.7.0", - "strip-ansi": "5.2" - } + "yaml": "^2.2.2" + }, + "bundleDependencies": [ + "@snyk/nuget-semver", + "chalk", + "cli-progress", + "semver", + "sorted-btree", + "strip-ansi", + "vscode-uri", + "xml-writer", + "yaml" + ] } diff --git a/ce/ce/registries/ArtifactRegistry.ts b/vcpkg-artifacts/registries/ArtifactRegistry.ts similarity index 98% rename from ce/ce/registries/ArtifactRegistry.ts rename to vcpkg-artifacts/registries/ArtifactRegistry.ts index 16cbcbf9c7..f2e84d1a73 100644 --- a/ce/ce/registries/ArtifactRegistry.ts +++ b/vcpkg-artifacts/registries/ArtifactRegistry.ts @@ -38,7 +38,7 @@ export abstract class ArtifactRegistry implements Registry { this.#loaded = loaded; } - abstract update(): Promise; + abstract update(displayName?: string): Promise; async regenerate(normalize?: boolean): Promise { // reset the index to blank. diff --git a/ce/ce/registries/LocalRegistry.ts b/vcpkg-artifacts/registries/LocalRegistry.ts similarity index 97% rename from ce/ce/registries/LocalRegistry.ts rename to vcpkg-artifacts/registries/LocalRegistry.ts index 05fc59f3fe..b361e7db31 100644 --- a/ce/ce/registries/LocalRegistry.ts +++ b/vcpkg-artifacts/registries/LocalRegistry.ts @@ -24,7 +24,7 @@ export class LocalRegistry extends ArtifactRegistry { this.installationFolder = session.installFolder.join(this.localName); } - update(): Promise { + update(displayName?: string): Promise { return this.regenerate(); } diff --git a/ce/ce/registries/RemoteRegistry.ts b/vcpkg-artifacts/registries/RemoteRegistry.ts similarity index 90% rename from ce/ce/registries/RemoteRegistry.ts rename to vcpkg-artifacts/registries/RemoteRegistry.ts index bba6fca892..57e7f0e528 100644 --- a/ce/ce/registries/RemoteRegistry.ts +++ b/vcpkg-artifacts/registries/RemoteRegistry.ts @@ -4,15 +4,15 @@ import { strict } from 'assert'; import { createHash } from 'crypto'; import { parse } from 'yaml'; -import { unpackZip } from '../archivers/ZipUnpacker'; import { registryIndexFile } from '../constants'; import { acquireArtifactFile } from '../fs/acquire'; import { i } from '../i18n'; import { Session } from '../session'; import { isGithubRepo } from '../util/checks'; import { Uri } from '../util/uri'; -import { ArtifactIndex } from './artifact-index'; +import { vcpkgExtract } from '../vcpkg'; import { ArtifactRegistry } from './ArtifactRegistry'; +import { ArtifactIndex } from './artifact-index'; import { Index } from './indexer'; export class RemoteRegistry extends ArtifactRegistry { @@ -76,8 +76,10 @@ export class RemoteRegistry extends ArtifactRegistry { } } - async update() { - this.session.channels.message(i`Updating registry data from ${this.location.toString()}`); + async update(displayName?: string) { + const displayNameStr = displayName ?? this.location.toString(); + + this.session.channels.message(i`Updating registry data from ${displayNameStr}`); let locations = [this.location]; @@ -86,9 +88,10 @@ export class RemoteRegistry extends ArtifactRegistry { locations = [this.location.join('archive/refs/heads/main.zip'), this.location.join('archive/refs/heads/master.zip')]; } - const file = await acquireArtifactFile(this.session, locations, `${this.safeName}-registry.zip`, {}); + const file = await acquireArtifactFile(this.session, locations, `${this.safeName}-registry.zip`, {}, {force: true}); if (await file.exists()) { - await unpackZip(this.session, file, this.cacheFolder, {}, { strip: -1 }); + const targetLocation = this.cacheFolder.fsPath; + await vcpkgExtract(this.session, file.fsPath, targetLocation, 'AUTO'); await file.delete(); } } diff --git a/ce/ce/registries/artifact-index.ts b/vcpkg-artifacts/registries/artifact-index.ts similarity index 100% rename from ce/ce/registries/artifact-index.ts rename to vcpkg-artifacts/registries/artifact-index.ts diff --git a/ce/ce/registries/indexer.ts b/vcpkg-artifacts/registries/indexer.ts similarity index 99% rename from ce/ce/registries/indexer.ts rename to vcpkg-artifacts/registries/indexer.ts index 1ef4a64ae0..830352656e 100644 --- a/ce/ce/registries/indexer.ts +++ b/vcpkg-artifacts/registries/indexer.ts @@ -481,7 +481,7 @@ export class SemverKey> { +export abstract class IndexSchema> { /** the collection of keys in this IndexSchema */ readonly mapOfKeyObjects = new Map>(); diff --git a/ce/ce/registries/registries.ts b/vcpkg-artifacts/registries/registries.ts similarity index 98% rename from ce/ce/registries/registries.ts rename to vcpkg-artifacts/registries/registries.ts index 1d96fe5cdc..38220024b4 100644 --- a/ce/ce/registries/registries.ts +++ b/vcpkg-artifacts/registries/registries.ts @@ -28,7 +28,7 @@ export interface Registry extends ArtifactSearchable { load(force?: boolean): Promise; save(): Promise; - update(): Promise; + update(displayName?: string): Promise; regenerate(normalize?: boolean): Promise; } @@ -103,6 +103,10 @@ export class RegistryDatabase { await loaded.load(); return loaded; } + + getAllUris() { + return Array.from(this.#uriToRegistry.keys()); + } } // When a registry resolver is used to map a URI back to some form of for-display-purposes-only name. diff --git a/ce/ce/session.ts b/vcpkg-artifacts/session.ts similarity index 98% rename from ce/ce/session.ts rename to vcpkg-artifacts/session.ts index fba1ac8f2c..ec28cb593b 100644 --- a/ce/ce/session.ts +++ b/vcpkg-artifacts/session.ts @@ -22,7 +22,6 @@ import { RegistryDatabase, RegistryResolver } from './registries/registries'; import { Channels, Stopwatch } from './util/channels'; import { Uri } from './util/uri'; - /** The definition for an installer tool function */ type InstallerTool = ( session: Session, @@ -162,7 +161,7 @@ export class Session { this.channels.debug(error?.message); } // check if it got made, because at an absolute minimum, we need a folder, so failing this is catastrophic. - strict.ok(await this.fileSystem.isDirectory(this.homeFolder), i`Fatal: The root folder '${this.homeFolder.fsPath}' can not be created`); + strict.ok(await this.fileSystem.isDirectory(this.homeFolder), i`Fatal: The root folder '${this.homeFolder.fsPath}' cannot be created`); } if (!await this.fileSystem.isFile(this.globalConfig)) { @@ -172,7 +171,7 @@ export class Session { // if this throws, let it } // check if it got made, because at an absolute minimum, we need the config file, so failing this is catastrophic. - strict.ok(await this.fileSystem.isFile(this.globalConfig), i`Fatal: The global configuration file '${this.globalConfig.fsPath}' can not be created`); + strict.ok(await this.fileSystem.isFile(this.globalConfig), i`Fatal: The global configuration file '${this.globalConfig.fsPath}' cannot be created`); } // got past the checks, let's load the configuration. diff --git a/ce/test/resources/cmake.json b/vcpkg-artifacts/test-resources/cmake.json similarity index 100% rename from ce/test/resources/cmake.json rename to vcpkg-artifacts/test-resources/cmake.json diff --git a/ce/test/resources/empty.json b/vcpkg-artifacts/test-resources/empty.json similarity index 100% rename from ce/test/resources/empty.json rename to vcpkg-artifacts/test-resources/empty.json diff --git a/ce/test/resources/errors.json b/vcpkg-artifacts/test-resources/errors.json similarity index 100% rename from ce/test/resources/errors.json rename to vcpkg-artifacts/test-resources/errors.json diff --git a/ce/test/resources/example-artifact.json b/vcpkg-artifacts/test-resources/example-artifact.json similarity index 100% rename from ce/test/resources/example-artifact.json rename to vcpkg-artifacts/test-resources/example-artifact.json diff --git a/ce/test/resources/example-before-2022-06-17-artifact.json b/vcpkg-artifacts/test-resources/example-before-2022-06-17-artifact.json similarity index 100% rename from ce/test/resources/example-before-2022-06-17-artifact.json rename to vcpkg-artifacts/test-resources/example-before-2022-06-17-artifact.json diff --git a/ce/test/resources/large-file.txt b/vcpkg-artifacts/test-resources/large-file.txt similarity index 100% rename from ce/test/resources/large-file.txt rename to vcpkg-artifacts/test-resources/large-file.txt diff --git a/ce/test/resources/repo/compilers/gnu/gcc-arm-none-eabi-2019.04.0.json b/vcpkg-artifacts/test-resources/repo/compilers/gnu/gcc-arm-none-eabi-2019.04.0.json similarity index 100% rename from ce/test/resources/repo/compilers/gnu/gcc-arm-none-eabi-2019.04.0.json rename to vcpkg-artifacts/test-resources/repo/compilers/gnu/gcc-arm-none-eabi-2019.04.0.json diff --git a/ce/test/resources/repo/compilers/gnu/gcc-arm-none-eabi-2019.10.0.json b/vcpkg-artifacts/test-resources/repo/compilers/gnu/gcc-arm-none-eabi-2019.10.0.json similarity index 100% rename from ce/test/resources/repo/compilers/gnu/gcc-arm-none-eabi-2019.10.0.json rename to vcpkg-artifacts/test-resources/repo/compilers/gnu/gcc-arm-none-eabi-2019.10.0.json diff --git a/ce/test/resources/repo/compilers/gnu/gcc-arm-none-eabi-2020-10.0.json b/vcpkg-artifacts/test-resources/repo/compilers/gnu/gcc-arm-none-eabi-2020-10.0.json similarity index 100% rename from ce/test/resources/repo/compilers/gnu/gcc-arm-none-eabi-2020-10.0.json rename to vcpkg-artifacts/test-resources/repo/compilers/gnu/gcc-arm-none-eabi-2020-10.0.json diff --git a/ce/test/resources/repo/sdks/microsoft/windows.arm.json b/vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.arm.json similarity index 100% rename from ce/test/resources/repo/sdks/microsoft/windows.arm.json rename to vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.arm.json diff --git a/ce/test/resources/repo/sdks/microsoft/windows.arm64.json b/vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.arm64.json similarity index 100% rename from ce/test/resources/repo/sdks/microsoft/windows.arm64.json rename to vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.arm64.json diff --git a/ce/test/resources/repo/sdks/microsoft/windows.json b/vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.json similarity index 100% rename from ce/test/resources/repo/sdks/microsoft/windows.json rename to vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.json diff --git a/ce/test/resources/repo/sdks/microsoft/windows.x64.json b/vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.x64.json similarity index 100% rename from ce/test/resources/repo/sdks/microsoft/windows.x64.json rename to vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.x64.json diff --git a/ce/test/resources/repo/sdks/microsoft/windows.x86.json b/vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.x86.json similarity index 100% rename from ce/test/resources/repo/sdks/microsoft/windows.x86.json rename to vcpkg-artifacts/test-resources/repo/sdks/microsoft/windows.x86.json diff --git a/ce/test/resources/repo/tools/kitware/cmake-3.15.0.json b/vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.15.0.json similarity index 100% rename from ce/test/resources/repo/tools/kitware/cmake-3.15.0.json rename to vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.15.0.json diff --git a/ce/test/resources/repo/tools/kitware/cmake-3.15.1.json b/vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.15.1.json similarity index 100% rename from ce/test/resources/repo/tools/kitware/cmake-3.15.1.json rename to vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.15.1.json diff --git a/ce/test/resources/repo/tools/kitware/cmake-3.17.0.json b/vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.17.0.json similarity index 100% rename from ce/test/resources/repo/tools/kitware/cmake-3.17.0.json rename to vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.17.0.json diff --git a/ce/test/resources/repo/tools/kitware/cmake-3.19.0.json b/vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.19.0.json similarity index 100% rename from ce/test/resources/repo/tools/kitware/cmake-3.19.0.json rename to vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.19.0.json diff --git a/ce/test/resources/repo/tools/kitware/cmake-3.20.0.json b/vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.20.0.json similarity index 100% rename from ce/test/resources/repo/tools/kitware/cmake-3.20.0.json rename to vcpkg-artifacts/test-resources/repo/tools/kitware/cmake-3.20.0.json diff --git a/ce/test/resources/sample1.json b/vcpkg-artifacts/test-resources/sample1.json similarity index 100% rename from ce/test/resources/sample1.json rename to vcpkg-artifacts/test-resources/sample1.json diff --git a/ce/test/resources/small-file.txt b/vcpkg-artifacts/test-resources/small-file.txt similarity index 100% rename from ce/test/resources/small-file.txt rename to vcpkg-artifacts/test-resources/small-file.txt diff --git a/ce/test/resources/topo-sort-registry/alpha.json b/vcpkg-artifacts/test-resources/topo-sort-registry/alpha.json similarity index 100% rename from ce/test/resources/topo-sort-registry/alpha.json rename to vcpkg-artifacts/test-resources/topo-sort-registry/alpha.json diff --git a/ce/test/resources/topo-sort-registry/bravo.json b/vcpkg-artifacts/test-resources/topo-sort-registry/bravo.json similarity index 100% rename from ce/test/resources/topo-sort-registry/bravo.json rename to vcpkg-artifacts/test-resources/topo-sort-registry/bravo.json diff --git a/ce/test/resources/topo-sort-registry/charlie.json b/vcpkg-artifacts/test-resources/topo-sort-registry/charlie.json similarity index 100% rename from ce/test/resources/topo-sort-registry/charlie.json rename to vcpkg-artifacts/test-resources/topo-sort-registry/charlie.json diff --git a/ce/test/resources/topo-sort-registry/delta.json b/vcpkg-artifacts/test-resources/topo-sort-registry/delta.json similarity index 100% rename from ce/test/resources/topo-sort-registry/delta.json rename to vcpkg-artifacts/test-resources/topo-sort-registry/delta.json diff --git a/ce/test/resources/topo-sort-registry/echo.json b/vcpkg-artifacts/test-resources/topo-sort-registry/echo.json similarity index 100% rename from ce/test/resources/topo-sort-registry/echo.json rename to vcpkg-artifacts/test-resources/topo-sort-registry/echo.json diff --git a/ce/test/resources/topo-sort-registry/foxtrot.json b/vcpkg-artifacts/test-resources/topo-sort-registry/foxtrot.json similarity index 100% rename from ce/test/resources/topo-sort-registry/foxtrot.json rename to vcpkg-artifacts/test-resources/topo-sort-registry/foxtrot.json diff --git a/ce/test/resources/validation-errors.json b/vcpkg-artifacts/test-resources/validation-errors.json similarity index 100% rename from ce/test/resources/validation-errors.json rename to vcpkg-artifacts/test-resources/validation-errors.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/compilers/arm/gcc/gcc-2020.10.0.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/compilers/arm/gcc/gcc-2020.10.0.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/compilers/arm/gcc/gcc-2020.10.0.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/compilers/arm/gcc/gcc-2020.10.0.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/index.yaml b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/index.yaml similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/index.yaml rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/index.yaml diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-cli-0.18.3.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-cli-0.18.3.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-cli-0.18.3.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-cli-0.18.3.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-ide-1.18.15.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-ide-1.18.15.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-ide-1.18.15.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/arduino/arduino-ide-1.18.15.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/compuphase/termite-3.4.0.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/compuphase/termite-3.4.0.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/compuphase/termite-3.4.0.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/compuphase/termite-3.4.0.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/kitware/cmake-3.20.1.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/kitware/cmake-3.20.1.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/kitware/cmake-3.20.1.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/kitware/cmake-3.20.1.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0-ms1.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0-ms1.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0-ms1.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0-ms1.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/microsoft/openocd-0.11.0.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/ninja-build/ninja-1.10.2.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/ninja-build/ninja-1.10.2.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/ninja-build/ninja-1.10.2.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/ninja-build/ninja-1.10.2.json diff --git a/ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/raspberrypi/pico-sdk-1.3.0.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/raspberrypi/pico-sdk-1.3.0.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/raspberrypi/pico-sdk-1.3.0.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855/tools/raspberrypi/pico-sdk-1.3.0.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/compilers/arm/gcc/gcc-2020.10.0.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/compilers/arm/gcc/gcc-2020.10.0.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/compilers/arm/gcc/gcc-2020.10.0.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/compilers/arm/gcc/gcc-2020.10.0.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/index.yaml b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/index.yaml similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/index.yaml rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/index.yaml diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-cli-0.18.3.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-cli-0.18.3.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-cli-0.18.3.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-cli-0.18.3.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-ide-1.18.15.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-ide-1.18.15.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-ide-1.18.15.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/arduino/arduino-ide-1.18.15.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/compuphase/termite-3.4.0.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/compuphase/termite-3.4.0.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/compuphase/termite-3.4.0.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/compuphase/termite-3.4.0.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/kitware/cmake-3.20.1.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/kitware/cmake-3.20.1.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/kitware/cmake-3.20.1.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/kitware/cmake-3.20.1.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0-ms1.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0-ms1.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0-ms1.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0-ms1.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/microsoft/openocd-0.11.0.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/ninja-build/ninja-1.10.2.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/ninja-build/ninja-1.10.2.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/ninja-build/ninja-1.10.2.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/ninja-build/ninja-1.10.2.json diff --git a/ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/raspberrypi/pico-sdk-1.3.0.json b/vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/raspberrypi/pico-sdk-1.3.0.json similarity index 100% rename from ce/test/resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/raspberrypi/pico-sdk-1.3.0.json rename to vcpkg-artifacts/test-resources/vcpkg-ce-catalog-d471612be63b2fb506ab5f47122da460f5aa4d30/tools/raspberrypi/pico-sdk-1.3.0.json diff --git a/ce/test/core/SuiteLocal.ts b/vcpkg-artifacts/test/core/SuiteLocal.ts similarity index 65% rename from ce/test/core/SuiteLocal.ts rename to vcpkg-artifacts/test/core/SuiteLocal.ts index 0a783bbf0b..683feb9625 100644 --- a/ce/test/core/SuiteLocal.ts +++ b/vcpkg-artifacts/test/core/SuiteLocal.ts @@ -1,40 +1,41 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { LocalFileSystem } from '@microsoft/vcpkg-ce/dist/fs/local-filesystem'; -import { Session } from '@microsoft/vcpkg-ce/dist/session'; -import { Uri } from '@microsoft/vcpkg-ce/dist/util/uri'; import { strict } from 'assert'; import { statSync } from 'fs'; import { rm } from 'fs/promises'; import { join, resolve } from 'path'; +import { LocalFileSystem } from '../../fs/local-filesystem'; +import { Session } from '../../session'; +import { Uri } from '../../util/uri'; import { uniqueTempFolder } from './uniqueTempFolder'; -require('@microsoft/vcpkg-ce/dist/exports'); +require('../../exports'); -export function rootFolder(from = __dirname): string { - try { - const resources = join(from, 'resources'); - const s = statSync(resources); - s.isDirectory(); - return from; - } - catch { - // shh! +function resourcesFolder(from = __dirname): string { + for (;;) { + try { + const resources = join(from, 'test-resources'); + const s = statSync(resources); + s.isDirectory(); + return resources; + } + catch { + // shh! + } + + const up = resolve(from, '..'); + strict.notEqual(up, from, 'O_o unable to find root folder'); + from = up; } - const up = resolve(from, '..'); - strict.notEqual(up, from, 'O_o unable to find root folder'); - return rootFolder(up); } export class SuiteLocal { readonly tempFolder = uniqueTempFolder(); readonly session: Session; readonly fs: LocalFileSystem; - readonly rootFolder: string = rootFolder(); - readonly resourcesFolder = this.rootFolder + '/resources'; - readonly rootFolderUri: Uri; + readonly resourcesFolder = resourcesFolder(); readonly tempFolderUri: Uri; readonly resourcesFolderUri: Uri; @@ -49,7 +50,6 @@ export class SuiteLocal { }); this.fs = new LocalFileSystem(this.session); - this.rootFolderUri = this.fs.file(this.rootFolder); this.tempFolderUri = this.fs.file(this.tempFolder); this.resourcesFolderUri = this.fs.file(this.resourcesFolder); // set the debug=1 in the environment to have the debug messages dumped during testing diff --git a/ce/test/core/amf-tests.ts b/vcpkg-artifacts/test/core/amf-tests.ts similarity index 87% rename from ce/test/core/amf-tests.ts rename to vcpkg-artifacts/test/core/amf-tests.ts index ba674c8a13..c2e6066e33 100644 --- a/ce/test/core/amf-tests.ts +++ b/vcpkg-artifacts/test/core/amf-tests.ts @@ -1,12 +1,12 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { MetadataFile } from '@microsoft/vcpkg-ce/dist/amf/metadata-file'; +import { MetadataFile } from '../../amf/metadata-file'; import { strict } from 'assert'; import { readFile } from 'fs/promises'; import { join } from 'path'; import * as s from '../sequence-equal'; -import { rootFolder, SuiteLocal } from './SuiteLocal'; +import { SuiteLocal } from './SuiteLocal'; // forces the global function for sequence equal to be added to strict before this exectues: s; @@ -18,7 +18,7 @@ describe('Amf', () => { after(local.after.bind(local)); it('readProfile', async () => { - const content = await (await readFile(join(rootFolder(), 'resources', 'sample1.json'))).toString('utf-8'); + const content = await (await readFile(join(local.resourcesFolder, 'sample1.json'))).toString('utf-8'); const doc = await MetadataFile.parseConfiguration('./sample1.json', content, local.session); strict.ok(doc.isFormatValid); @@ -29,7 +29,7 @@ describe('Amf', () => { }); it('reads file with nupkg', async () => { - const content = await (await readFile(join(rootFolder(), 'resources', 'repo', 'sdks', 'microsoft', 'windows.json'))).toString('utf-8'); + const content = await (await readFile(join(local.resourcesFolder, 'repo', 'sdks', 'microsoft', 'windows.json'))).toString('utf-8'); const doc = await MetadataFile.parseConfiguration('./windows.json', content, local.session); strict.ok(doc.isFormatValid); @@ -37,7 +37,7 @@ describe('Amf', () => { }); it('load/persist an artifact', async () => { - const content = await (await readFile(join(rootFolder(), 'resources', 'example-artifact.json'))).toString('utf-8'); + const content = await (await readFile(join(local.resourcesFolder, 'example-artifact.json'))).toString('utf-8'); const doc = await MetadataFile.parseConfiguration('./example-artifact.json', content, local.session); strict.ok(doc.isFormatValid); @@ -45,7 +45,7 @@ describe('Amf', () => { }); it('profile checks', async () => { - const content = await (await readFile(join(rootFolder(), 'resources', 'sample1.json'))).toString('utf-8'); + const content = await (await readFile(join(local.resourcesFolder, 'sample1.json'))).toString('utf-8'); const doc = await MetadataFile.parseConfiguration('./sample1.json', content, local.session); strict.ok(doc.isFormatValid, 'Ensure that it is valid json'); @@ -112,7 +112,7 @@ describe('Amf', () => { }); it('read invalid json file', async () => { - const content = await (await readFile(join(rootFolder(), 'resources', 'errors.json'))).toString('utf-8'); + const content = await (await readFile(join(local.resourcesFolder, 'errors.json'))).toString('utf-8'); const doc = await MetadataFile.parseConfiguration('./errors.json', content, local.session); strict.equal(doc.isFormatValid, false, 'this document should have errors'); @@ -123,7 +123,7 @@ describe('Amf', () => { }); it('read empty json file', async () => { - const content = await (await readFile(join(rootFolder(), 'resources', 'empty.json'))).toString('utf-8'); + const content = await (await readFile(join(local.resourcesFolder, 'empty.json'))).toString('utf-8'); const doc = await MetadataFile.parseConfiguration('./empty.json', content, local.session); strict.ok(doc.isFormatValid); @@ -138,7 +138,7 @@ describe('Amf', () => { }); it('validation errors', async () => { - const content = await (await readFile(join(rootFolder(), 'resources', 'validation-errors.json'))).toString('utf-8'); + const content = await (await readFile(join(local.resourcesFolder, 'validation-errors.json'))).toString('utf-8'); const doc = await MetadataFile.parseConfiguration('./validation-errors.json', content, local.session); strict.ok(doc.isFormatValid); diff --git a/ce/test/core/dependency-resolver-tests.ts b/vcpkg-artifacts/test/core/dependency-resolver-tests.ts similarity index 89% rename from ce/test/core/dependency-resolver-tests.ts rename to vcpkg-artifacts/test/core/dependency-resolver-tests.ts index b5783170ae..281163c20f 100644 --- a/ce/test/core/dependency-resolver-tests.ts +++ b/vcpkg-artifacts/test/core/dependency-resolver-tests.ts @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { selectArtifacts } from '@microsoft/vcpkg-ce/dist/cli/artifacts'; -import { RegistryDatabase, RegistryResolver } from '@microsoft/vcpkg-ce/dist/registries/registries'; +import { selectArtifacts } from '../../cli/artifacts'; +import { RegistryDatabase, RegistryResolver } from '../../registries/registries'; import { strict } from 'assert'; import { SuiteLocal } from './SuiteLocal'; diff --git a/ce/test/core/index-tests.ts b/vcpkg-artifacts/test/core/index-tests.ts similarity index 94% rename from ce/test/core/index-tests.ts rename to vcpkg-artifacts/test/core/index-tests.ts index 5508e9929a..558f4d44eb 100644 --- a/ce/test/core/index-tests.ts +++ b/vcpkg-artifacts/test/core/index-tests.ts @@ -2,7 +2,7 @@ // Licensed under the MIT License. -import { Index, IndexSchema, SemverKey, StringKey } from '@microsoft/vcpkg-ce/dist/registries/indexer'; +import { Index, IndexSchema, SemverKey, StringKey } from '../../registries/indexer'; import { strict } from 'assert'; import { describe, it } from 'mocha'; import { SemVer } from 'semver'; diff --git a/ce/test/core/linq-tests.ts b/vcpkg-artifacts/test/core/linq-tests.ts similarity index 92% rename from ce/test/core/linq-tests.ts rename to vcpkg-artifacts/test/core/linq-tests.ts index f4c498bb44..7718e23e40 100644 --- a/ce/test/core/linq-tests.ts +++ b/vcpkg-artifacts/test/core/linq-tests.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { length, linq } from '@microsoft/vcpkg-ce/dist/util/linq'; +import { length, linq } from '../../util/linq'; import * as assert from 'assert'; const anArray = ['A', 'B', 'C', 'D', 'E']; diff --git a/ce/test/core/local-file-system-tests.ts b/vcpkg-artifacts/test/core/local-file-system-tests.ts similarity index 92% rename from ce/test/core/local-file-system-tests.ts rename to vcpkg-artifacts/test/core/local-file-system-tests.ts index b51e586cbb..dc8fa00b0b 100644 --- a/ce/test/core/local-file-system-tests.ts +++ b/vcpkg-artifacts/test/core/local-file-system-tests.ts @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { FileType } from '@microsoft/vcpkg-ce/dist/fs/filesystem'; -import { hash } from '@microsoft/vcpkg-ce/dist/util/hash'; +import { FileType } from '../../fs/filesystem'; +import { hash } from '../../util/hash'; import { strict } from 'assert'; import { pipeline as origPipeline, Writable } from 'stream'; import { promisify } from 'util'; @@ -119,7 +119,7 @@ describe('LocalFileSystemTests', () => { it('calculate hashes', async () => { const tmp = local.tempFolderUri; - const path = local.rootFolderUri.join('resources', 'small-file.txt'); + const path = local.resourcesFolderUri.join('small-file.txt'); strict.equal(await hash(await fs.readStream(path), path, 0, 'sha256', {}), '9cfed8b9e45f47e735098c399fb523755e4e993ac64d81171c93efbb523a57e6', 'hash should match'); strict.equal(await hash(await fs.readStream(path), path, 0, 'sha384', {}), '8168d029154548a4e1dd5212b722b03d6220f212f8974f6bd45e71715b13945e343c9d1097f8e393db22c8a07d8cf6f6', 'hash should match'); @@ -127,7 +127,7 @@ describe('LocalFileSystemTests', () => { }); it('reads blocks via open', async () => { - const file = local.rootFolderUri.join('resources', 'small-file.txt'); + const file = local.resourcesFolderUri.join('small-file.txt'); const handle = await file.openFile(); let bytesRead = 0; for await (const chunk of handle.readStream(0, 3)) { @@ -159,7 +159,7 @@ describe('LocalFileSystemTests', () => { }); it('reads blocks via open in a large file', async () => { - const file = local.rootFolderUri.join('resources', 'large-file.txt'); + const file = local.resourcesFolderUri.join('large-file.txt'); const handle = await file.openFile(); let bytesRead = 0; for await (const chunk of handle.readStream()) { @@ -201,7 +201,7 @@ describe('LocalFileSystemTests', () => { it('can copy files', async () => { // now copy the files from the test folder - const files = await local.fs.copy(local.rootFolderUri, local.session.homeFolder.join('junk')); - strict.ok(files > 3000, `There should be at least 3000 files copied. Only copied ${files}`); + const files = await local.fs.copy(local.resourcesFolderUri.join('vcpkg-ce-catalog-2ffbc04d6856a1d03c5de0ab94404f90636f7855'), local.tempFolderUri.join('copy-test-target')); + strict.ok(files == 10, `There should be at exactly 10 files copied. Copied ${files}`); }); }); diff --git a/ce/test/core/media-query-tests.ts b/vcpkg-artifacts/test/core/media-query-tests.ts similarity index 98% rename from ce/test/core/media-query-tests.ts rename to vcpkg-artifacts/test/core/media-query-tests.ts index 39eb9fc31c..e8bde7d445 100644 --- a/ce/test/core/media-query-tests.ts +++ b/vcpkg-artifacts/test/core/media-query-tests.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { parseQuery } from '@microsoft/vcpkg-ce/dist/mediaquery/media-query'; +import { parseQuery } from '../../mediaquery/media-query'; import { strict } from 'assert'; import * as s from '../sequence-equal'; diff --git a/ce/test/core/msbuild-tests.ts b/vcpkg-artifacts/test/core/msbuild-tests.ts similarity index 97% rename from ce/test/core/msbuild-tests.ts rename to vcpkg-artifacts/test/core/msbuild-tests.ts index 72d6d485e3..ecdee712af 100644 --- a/ce/test/core/msbuild-tests.ts +++ b/vcpkg-artifacts/test/core/msbuild-tests.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { Activation } from '@microsoft/vcpkg-ce/dist/artifacts/activation'; +import { Activation } from '../../artifacts/activation'; import { strict } from 'assert'; import { platform } from 'os'; import { SuiteLocal } from './SuiteLocal'; diff --git a/ce/test/core/registry-resolver-tests.ts b/vcpkg-artifacts/test/core/registry-resolver-tests.ts similarity index 94% rename from ce/test/core/registry-resolver-tests.ts rename to vcpkg-artifacts/test/core/registry-resolver-tests.ts index f538786225..7906aa6dae 100644 --- a/ce/test/core/registry-resolver-tests.ts +++ b/vcpkg-artifacts/test/core/registry-resolver-tests.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { Artifact } from '@microsoft/vcpkg-ce/dist/artifacts/artifact'; -import { Registry, RegistryDatabase, RegistryResolver, SearchCriteria } from '@microsoft/vcpkg-ce/dist/registries/registries'; -import { Uri } from '@microsoft/vcpkg-ce/dist/util/uri'; import { strict } from 'assert'; +import { Artifact } from '../../artifacts/artifact'; +import { Registry, RegistryDatabase, RegistryResolver, SearchCriteria } from '../../registries/registries'; +import { Uri } from '../../util/uri'; import { SuiteLocal } from './SuiteLocal'; class FakeRegistry implements Registry { @@ -19,7 +19,7 @@ class FakeRegistry implements Registry { load(force?: boolean): Promise { return Promise.resolve(); } save(): Promise { return Promise.resolve(); } - update(): Promise { return Promise.resolve(); } + update(displayName?: string): Promise { return Promise.resolve(); } regenerate(normalize?: boolean): Promise { return Promise.resolve(); } } diff --git a/ce/test/core/regression-tests.ts b/vcpkg-artifacts/test/core/regression-tests.ts similarity index 100% rename from ce/test/core/regression-tests.ts rename to vcpkg-artifacts/test/core/regression-tests.ts diff --git a/ce/test/core/sample-tests.ts b/vcpkg-artifacts/test/core/sample-tests.ts similarity index 91% rename from ce/test/core/sample-tests.ts rename to vcpkg-artifacts/test/core/sample-tests.ts index a536222cad..72002e851f 100644 --- a/ce/test/core/sample-tests.ts +++ b/vcpkg-artifacts/test/core/sample-tests.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { sanitizePath } from '@microsoft/vcpkg-ce/dist/artifacts/artifact'; +import { sanitizePath } from '../../artifacts/artifact'; import { strict } from 'assert'; import { describe, it } from 'mocha'; diff --git a/ce/test/core/stream-tests.ts b/vcpkg-artifacts/test/core/stream-tests.ts similarity index 92% rename from ce/test/core/stream-tests.ts rename to vcpkg-artifacts/test/core/stream-tests.ts index ca83b9fc17..56b8c25390 100644 --- a/ce/test/core/stream-tests.ts +++ b/vcpkg-artifacts/test/core/stream-tests.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { Channels } from '@microsoft/vcpkg-ce/dist/util/channels'; +import { Channels } from '../../util/channels'; import { strictEqual } from 'assert'; import { SuiteLocal } from './SuiteLocal'; diff --git a/ce/test/core/uniqueTempFolder.ts b/vcpkg-artifacts/test/core/uniqueTempFolder.ts similarity index 100% rename from ce/test/core/uniqueTempFolder.ts rename to vcpkg-artifacts/test/core/uniqueTempFolder.ts diff --git a/ce/test/core/uri-tests.ts b/vcpkg-artifacts/test/core/uri-tests.ts similarity index 100% rename from ce/test/core/uri-tests.ts rename to vcpkg-artifacts/test/core/uri-tests.ts diff --git a/ce/test/core/util/curly-replacements-tests.ts b/vcpkg-artifacts/test/core/util/curly-replacements-tests.ts similarity index 97% rename from ce/test/core/util/curly-replacements-tests.ts rename to vcpkg-artifacts/test/core/util/curly-replacements-tests.ts index 44cc3ee6cc..6835931032 100644 --- a/ce/test/core/util/curly-replacements-tests.ts +++ b/vcpkg-artifacts/test/core/util/curly-replacements-tests.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { replaceCurlyBraces } from '@microsoft/vcpkg-ce/dist/util/curly-replacements'; +import { replaceCurlyBraces } from '../../../util/curly-replacements'; import { strict } from 'assert'; describe('replaceCurlyBraces', () => { diff --git a/ce/test/core/util/percentage-scaler-tests.ts b/vcpkg-artifacts/test/core/util/percentage-scaler-tests.ts similarity index 95% rename from ce/test/core/util/percentage-scaler-tests.ts rename to vcpkg-artifacts/test/core/util/percentage-scaler-tests.ts index 16d75b092d..2fa40be4fb 100644 --- a/ce/test/core/util/percentage-scaler-tests.ts +++ b/vcpkg-artifacts/test/core/util/percentage-scaler-tests.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { PercentageScaler } from '@microsoft/vcpkg-ce/dist/util/percentage-scaler'; +import { PercentageScaler } from '../../../util/percentage-scaler'; import { strict, throws } from 'assert'; describe('PercentageScaler', () => { diff --git a/ce/test/sequence-equal.ts b/vcpkg-artifacts/test/sequence-equal.ts similarity index 100% rename from ce/test/sequence-equal.ts rename to vcpkg-artifacts/test/sequence-equal.ts diff --git a/ce/common/tsconfig.json b/vcpkg-artifacts/tsconfig.json similarity index 76% rename from ce/common/tsconfig.json rename to vcpkg-artifacts/tsconfig.json index 18082cf9d0..20609bbe59 100644 --- a/ce/common/tsconfig.json +++ b/vcpkg-artifacts/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "rootDir": ".", "alwaysStrict": true, "forceConsistentCasingInFileNames": true, "module": "CommonJS", @@ -9,6 +10,7 @@ "noPropertyAccessFromIndexSignature": true, "noImplicitThis": true, "inlineSourceMap": true, + "sourceRoot": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/vcpkg-artifacts", "declarationMap": true, "strict": true, "declaration": true, @@ -24,12 +26,12 @@ ], "experimentalDecorators": true, "emitDecoratorMetadata": true, - "newLine": "LF", - "incremental": true + "newLine": "LF" }, + "include": [ + "./**/*.ts" + ], "exclude": [ - "../**/dist/**", - "../node_modules/**", - "../**/*.d.ts" + "node_modules/**" ] } \ No newline at end of file diff --git a/ce/ce/util/channels.ts b/vcpkg-artifacts/util/channels.ts similarity index 97% rename from ce/ce/util/channels.ts rename to vcpkg-artifacts/util/channels.ts index f06d0f84d8..0e98ade051 100644 --- a/ce/ce/util/channels.ts +++ b/vcpkg-artifacts/util/channels.ts @@ -10,7 +10,6 @@ export interface ChannelEvents { error(text: string, msec: number): void; message(text: string, msec: number): void; debug(text: string, msec: number): void; - verbose(text: string, msec: number): void; } /** diff --git a/ce/ce/util/checks.ts b/vcpkg-artifacts/util/checks.ts similarity index 100% rename from ce/ce/util/checks.ts rename to vcpkg-artifacts/util/checks.ts diff --git a/ce/ce/util/curly-replacements.ts b/vcpkg-artifacts/util/curly-replacements.ts similarity index 100% rename from ce/ce/util/curly-replacements.ts rename to vcpkg-artifacts/util/curly-replacements.ts diff --git a/ce/ce/util/exceptions.ts b/vcpkg-artifacts/util/exceptions.ts similarity index 100% rename from ce/ce/util/exceptions.ts rename to vcpkg-artifacts/util/exceptions.ts diff --git a/ce/ce/util/exec-cmd.ts b/vcpkg-artifacts/util/exec-cmd.ts similarity index 100% rename from ce/ce/util/exec-cmd.ts rename to vcpkg-artifacts/util/exec-cmd.ts diff --git a/ce/ce/util/hash.ts b/vcpkg-artifacts/util/hash.ts similarity index 100% rename from ce/ce/util/hash.ts rename to vcpkg-artifacts/util/hash.ts diff --git a/ce/ce/util/intersect.ts b/vcpkg-artifacts/util/intersect.ts similarity index 100% rename from ce/ce/util/intersect.ts rename to vcpkg-artifacts/util/intersect.ts diff --git a/ce/ce/util/linq.ts b/vcpkg-artifacts/util/linq.ts similarity index 100% rename from ce/ce/util/linq.ts rename to vcpkg-artifacts/util/linq.ts diff --git a/ce/ce/util/manual-promise.ts b/vcpkg-artifacts/util/manual-promise.ts similarity index 98% rename from ce/ce/util/manual-promise.ts rename to vcpkg-artifacts/util/manual-promise.ts index c52b2daab0..e41cfa881b 100644 --- a/ce/ce/util/manual-promise.ts +++ b/vcpkg-artifacts/util/manual-promise.ts @@ -26,7 +26,7 @@ export class ManualPromise implements Promise { return this.p.finally(onfinally); } - readonly [Symbol.toStringTag]: 'Promise'; + readonly [Symbol.toStringTag] = 'Promise'; private p: Promise; /** diff --git a/ce/ce/util/percentage-scaler.ts b/vcpkg-artifacts/util/percentage-scaler.ts similarity index 100% rename from ce/ce/util/percentage-scaler.ts rename to vcpkg-artifacts/util/percentage-scaler.ts diff --git a/ce/ce/util/promise.ts b/vcpkg-artifacts/util/promise.ts similarity index 100% rename from ce/ce/util/promise.ts rename to vcpkg-artifacts/util/promise.ts diff --git a/ce/ce/util/text.ts b/vcpkg-artifacts/util/text.ts similarity index 100% rename from ce/ce/util/text.ts rename to vcpkg-artifacts/util/text.ts diff --git a/ce/ce/util/uri.ts b/vcpkg-artifacts/util/uri.ts similarity index 100% rename from ce/ce/util/uri.ts rename to vcpkg-artifacts/util/uri.ts diff --git a/ce/ce/vcpkg.ts b/vcpkg-artifacts/vcpkg.ts similarity index 90% rename from ce/ce/vcpkg.ts rename to vcpkg-artifacts/vcpkg.ts index 0b45a76dad..4b0f7a69d8 100644 --- a/ce/ce/vcpkg.ts +++ b/vcpkg-artifacts/vcpkg.ts @@ -44,6 +44,14 @@ export function vcpkgFetch(session: Session, fetchKey: string): Promise }); } +export async function vcpkgExtract(session: Session, archive: string, target:string, strip?:number|string): Promise { + const args: Array = ['z-extract', archive, target]; + if (strip) + { + args.push(`--strip=${strip}`); + } + return runVcpkg(session.vcpkgCommand, args);} + export async function vcpkgDownload(session: Session, destination: string, sha512: string | undefined, uris: Array, events: Partial) : Promise { const args = ['x-download', destination, '--z-machine-readable-progress']; if (sha512) { diff --git a/ce/ce/version.ts b/vcpkg-artifacts/version.ts similarity index 100% rename from ce/ce/version.ts rename to vcpkg-artifacts/version.ts diff --git a/ce/ce/yaml/BaseMap.ts b/vcpkg-artifacts/yaml/BaseMap.ts similarity index 100% rename from ce/ce/yaml/BaseMap.ts rename to vcpkg-artifacts/yaml/BaseMap.ts diff --git a/ce/ce/yaml/Coerce.ts b/vcpkg-artifacts/yaml/Coerce.ts similarity index 100% rename from ce/ce/yaml/Coerce.ts rename to vcpkg-artifacts/yaml/Coerce.ts diff --git a/ce/ce/yaml/CustomScalarMap.ts b/vcpkg-artifacts/yaml/CustomScalarMap.ts similarity index 100% rename from ce/ce/yaml/CustomScalarMap.ts rename to vcpkg-artifacts/yaml/CustomScalarMap.ts diff --git a/ce/ce/yaml/Entity.ts b/vcpkg-artifacts/yaml/Entity.ts similarity index 100% rename from ce/ce/yaml/Entity.ts rename to vcpkg-artifacts/yaml/Entity.ts diff --git a/ce/ce/yaml/EntityMap.ts b/vcpkg-artifacts/yaml/EntityMap.ts similarity index 100% rename from ce/ce/yaml/EntityMap.ts rename to vcpkg-artifacts/yaml/EntityMap.ts diff --git a/ce/ce/yaml/EntitySequence.ts b/vcpkg-artifacts/yaml/EntitySequence.ts similarity index 98% rename from ce/ce/yaml/EntitySequence.ts rename to vcpkg-artifacts/yaml/EntitySequence.ts index 72cdb643f2..f04164529b 100644 --- a/ce/ce/yaml/EntitySequence.ts +++ b/vcpkg-artifacts/yaml/EntitySequence.ts @@ -90,7 +90,7 @@ export /** @internal */ class EntitySequence>(sequence: EntitySequence) { if (isSeq(sequence.node)) { for (const item of sequence.node.items) { - yield new sequence.factory(item); + yield new sequence.factory(item); } } } diff --git a/ce/ce/yaml/Options.ts b/vcpkg-artifacts/yaml/Options.ts similarity index 100% rename from ce/ce/yaml/Options.ts rename to vcpkg-artifacts/yaml/Options.ts diff --git a/ce/ce/yaml/ScalarMap.ts b/vcpkg-artifacts/yaml/ScalarMap.ts similarity index 100% rename from ce/ce/yaml/ScalarMap.ts rename to vcpkg-artifacts/yaml/ScalarMap.ts diff --git a/ce/ce/yaml/ScalarSequence.ts b/vcpkg-artifacts/yaml/ScalarSequence.ts similarity index 100% rename from ce/ce/yaml/ScalarSequence.ts rename to vcpkg-artifacts/yaml/ScalarSequence.ts diff --git a/ce/ce/yaml/strings.ts b/vcpkg-artifacts/yaml/strings.ts similarity index 100% rename from ce/ce/yaml/strings.ts rename to vcpkg-artifacts/yaml/strings.ts diff --git a/ce/ce/yaml/yaml-types.ts b/vcpkg-artifacts/yaml/yaml-types.ts similarity index 95% rename from ce/ce/yaml/yaml-types.ts rename to vcpkg-artifacts/yaml/yaml-types.ts index 02f3ffa68e..5d441cfb4f 100644 --- a/ce/ce/yaml/yaml-types.ts +++ b/vcpkg-artifacts/yaml/yaml-types.ts @@ -175,10 +175,13 @@ export /** @internal */ abstract class Yaml { /** if this node has any data, this should return false */ get empty(): boolean { - if (isCollection(this.node)) { - return !(this.node?.items.length); - } - return !isNullish(this.node?.value); + if (isCollection(this.node)) { + return !(this.node?.items.length); + } else if (isScalar(this.node)) { + return !isNullish(this.node.value); + } + + return false; } /** @internal */ exists(): this is Yaml & { node: ThisType } { @@ -239,21 +242,23 @@ export /** @internal */ abstract class Yaml { this.assert(); - if (isMap(this.node)) { + const node = this.node; + if (isMap(node)) { if (child.key) { - this.node.delete(child.key); + node.delete(child.key); child.dispose(true, false); this.dispose(); // clean up if this is empty return; } } - if (isCollection(this.node)) { + if (isSeq(node)) { // child is in some kind of collection. // we should be able to find the child's index and remove it. - for (let i = 0; i < this.node.items.length; i++) { - if (this.node.items[i].value === child.node) { - this.node.delete(this.node.items[i].key); + const items = node.items; + for (let i = 0; i < items.length; i++) { + if (items[i] === child.node) { + node.delete(i); child.dispose(true, false); this.dispose(); // clean up if this is empty return; diff --git a/ce/ce/yaml/yaml.ts b/vcpkg-artifacts/yaml/yaml.ts similarity index 100% rename from ce/ce/yaml/yaml.ts rename to vcpkg-artifacts/yaml/yaml.ts diff --git a/vcpkg-init/mint-standalone-bundle.ps1 b/vcpkg-init/mint-standalone-bundle.ps1 index 195fe1e185..a01e2394d2 100644 --- a/vcpkg-init/mint-standalone-bundle.ps1 +++ b/vcpkg-init/mint-standalone-bundle.ps1 @@ -47,8 +47,6 @@ $scripts_dependencies = @( 'vcpkg_completion.bash', 'vcpkg_completion.fish', 'vcpkg_completion.zsh', - 'vcpkg_get_dep_info.cmake', - 'vcpkg_get_tags.cmake', 'vcpkgTools.xml' ) @@ -90,9 +88,9 @@ try { Copy-Item -Path "$SignedFilesRoot/vcpkg-init" -Destination 'out/vcpkg-init' Copy-Item -Path "$SignedFilesRoot/vcpkg-init.ps1" -Destination 'out/vcpkg-init.ps1' Copy-Item -Path "$SignedFilesRoot/vcpkg-init.cmd" -Destination 'out/vcpkg-init.cmd' - Copy-Item -Path "$SignedFilesRoot/addPoshVcpkgToPowershellProfile.ps1" -Destination 'out/scripts/addPoshVcpkgToPowershellProfile.ps1' + Copy-Item -Path "$SignedFilesRoot/scripts/addPoshVcpkgToPowershellProfile.ps1" -Destination 'out/scripts/addPoshVcpkgToPowershellProfile.ps1' New-Item -Path 'out/scripts/buildsystems/msbuild' -ItemType 'Directory' -Force - Copy-Item -Path "$SignedFilesRoot/applocal.ps1" -Destination 'out/scripts/buildsystems/msbuild/applocal.ps1' + Copy-Item -Path "$SignedFilesRoot/scripts/applocal.ps1" -Destination 'out/scripts/buildsystems/msbuild/applocal.ps1' # None of the standalone bundles support classic mode, so turn that off in the bundled copy of the props $propsContent = Get-Content "$PSScriptRoot/vcpkg.props" -Raw -Encoding Ascii @@ -103,7 +101,9 @@ try { Copy-Item -Path "$PSScriptRoot/vcpkg.targets" -Destination 'out/scripts/buildsystems/msbuild/vcpkg.targets' New-Item -Path 'out/scripts/posh-vcpkg/0.0.1' -ItemType 'Directory' -Force - Copy-Item -Path "$SignedFilesRoot/posh-vcpkg.psm1" -Destination 'out/scripts/posh-vcpkg/0.0.1/posh-vcpkg.psm1' + Copy-Item -Path "$SignedFilesRoot/scripts/posh-vcpkg.psm1" -Destination 'out/scripts/posh-vcpkg/0.0.1/posh-vcpkg.psm1' + + Copy-Item -Path "$SignedFilesRoot/vcpkg-artifacts" -Destination 'out/vcpkg-artifacts' -Recurse New-Item -Path "out/.vcpkg-root" -ItemType "File" Set-Content -Path "out/vcpkg-bundle.json" ` diff --git a/vcpkg-init/vcpkg-scripts-sha.txt b/vcpkg-init/vcpkg-scripts-sha.txt index 2a72736d02..2c6e2a3948 100644 --- a/vcpkg-init/vcpkg-scripts-sha.txt +++ b/vcpkg-init/vcpkg-scripts-sha.txt @@ -1 +1 @@ -84df5613f71eda8a73ab08dc3041f3af7103a5b2 +2c401863dd54a640aeb26ed736c55489c079323b From 6c940e5018684471011de627c661a9c78fa8380a Mon Sep 17 00:00:00 2001 From: autoantwort Date: Thu, 2 Jan 2025 21:32:19 +0100 Subject: [PATCH 14/14] Only use the cache for change detection. Never use cached compiler info values when building a port --- include/vcpkg/base/cache.h | 13 ++ include/vcpkg/commands.build.h | 11 +- include/vcpkg/fwd/build.h | 6 + include/vcpkg/vcpkgpaths.h | 8 +- src/vcpkg/commands.build.cpp | 173 +++++++++++++-------------- src/vcpkg/commands.set-installed.cpp | 53 +++++++- src/vcpkg/vcpkgpaths.cpp | 12 +- 7 files changed, 174 insertions(+), 102 deletions(-) diff --git a/include/vcpkg/base/cache.h b/include/vcpkg/base/cache.h index b61d080a25..edefe182be 100644 --- a/include/vcpkg/base/cache.h +++ b/include/vcpkg/base/cache.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include #include @@ -46,6 +48,17 @@ namespace vcpkg return m_cache.emplace_hint(it, k, static_cast(f)())->second; } + template + Optional get(const KeyIsh& k) const + { + auto iter = m_cache.find(k); + if (iter != m_cache.end()) + { + return iter->second; + } + return nullopt; + } + private: mutable std::map m_cache; }; diff --git a/include/vcpkg/commands.build.h b/include/vcpkg/commands.build.h index 0141889fd8..01daffc1a5 100644 --- a/include/vcpkg/commands.build.h +++ b/include/vcpkg/commands.build.h @@ -232,6 +232,7 @@ namespace vcpkg std::string hash; Path c_compiler_path; Path cxx_compiler_path; + bool from_cache = false; }; struct AbiInfo @@ -252,7 +253,8 @@ namespace vcpkg void compute_all_abis(const VcpkgPaths& paths, ActionPlan& action_plan, const CMakeVars::CMakeVarProvider& var_provider, - const StatusParagraphs& status_db); + const StatusParagraphs& status_db, + UseCompilerInfoCache use_compiler_info_cache = UseCompilerInfoCache::No); struct EnvCache { @@ -263,10 +265,12 @@ namespace vcpkg const Toolset& toolset); const std::string& get_triplet_info(const VcpkgPaths& paths, const PreBuildInfo& pre_build_info, - const Toolset& toolset); + const Toolset& toolset, + UseCompilerInfoCache use_compiler_info_cache); const CompilerInfo& get_compiler_info(const VcpkgPaths& paths, const PreBuildInfo& pre_build_info, - const Toolset& toolset); + const Toolset& toolset, + UseCompilerInfoCache use_compiler_info_cache); private: struct TripletMapEntry @@ -275,6 +279,7 @@ namespace vcpkg Cache triplet_infos; Cache triplet_infos_without_compiler; Cache compiler_info; + Cache> cached_compiler_info; }; Cache m_triplet_cache; Cache m_toolchain_cache; diff --git a/include/vcpkg/fwd/build.h b/include/vcpkg/fwd/build.h index ee0fe89f08..80d881df7a 100644 --- a/include/vcpkg/fwd/build.h +++ b/include/vcpkg/fwd/build.h @@ -93,6 +93,12 @@ namespace vcpkg Yes }; + enum class UseCompilerInfoCache + { + No = 0, + Yes + }; + // These names are intended to match VCPKG_POLICY_Xxx constants settable in portfile.cmake enum class BuildPolicy { diff --git a/include/vcpkg/vcpkgpaths.h b/include/vcpkg/vcpkgpaths.h index 0639a5b8cc..38cddb6974 100644 --- a/include/vcpkg/vcpkgpaths.h +++ b/include/vcpkg/vcpkgpaths.h @@ -143,8 +143,12 @@ namespace vcpkg const Toolset& get_toolset(const PreBuildInfo& prebuildinfo) const; const Environment& get_action_env(const PreBuildInfo& pre_build_info, const Toolset& toolset) const; - const std::string& get_triplet_info(const PreBuildInfo& pre_build_info, const Toolset& toolset) const; - const CompilerInfo& get_compiler_info(const PreBuildInfo& pre_build_info, const Toolset& toolset) const; + const std::string& get_triplet_info(const PreBuildInfo& pre_build_info, + const Toolset& toolset, + UseCompilerInfoCache use_compiler_info_cache) const; + const CompilerInfo& get_compiler_info(const PreBuildInfo& pre_build_info, + const Toolset& toolset, + UseCompilerInfoCache use_compiler_info_cache) const; const FeatureFlagSettings& get_feature_flags() const; diff --git a/src/vcpkg/commands.build.cpp b/src/vcpkg/commands.build.cpp index 3294acff71..9e8114770e 100644 --- a/src/vcpkg/commands.build.cpp +++ b/src/vcpkg/commands.build.cpp @@ -592,6 +592,7 @@ namespace vcpkg CXX_COMPILER_PATH_LAST_WRITE_TIME, cache.cxx_compiler_last_write_time, Json::Int64Deserializer::instance); + cache.compiler_info.from_cache = true; return cache; } static CompilerInfoCacheDeserializer instance; @@ -613,7 +614,8 @@ namespace vcpkg const CompilerInfo& EnvCache::get_compiler_info(const VcpkgPaths& paths, const PreBuildInfo& pre_build_info, - const Toolset& toolset) + const Toolset& toolset, + UseCompilerInfoCache use_compiler_info_cache) { if (!m_compiler_tracking || pre_build_info.disable_compiler_tracking) { @@ -629,9 +631,14 @@ namespace vcpkg auto&& triplet_entry = get_triplet_cache(fs, triplet_file_path); - return triplet_entry.compiler_info.get_lazy(toolchain_hash, [&]() -> CompilerInfo { - if (m_compiler_tracking) + if (use_compiler_info_cache == UseCompilerInfoCache::Yes) + { + auto maybe_entry = triplet_entry.compiler_info.get(toolchain_hash); + if (maybe_entry) { + return *maybe_entry.get(); + } + maybe_entry = triplet_entry.cached_compiler_info.get_lazy(toolchain_hash, [&]() -> Optional { auto cache_file = paths.installed().compiler_info_cache_file(pre_build_info.triplet); auto& fs = paths.get_filesystem(); if (fs.exists(cache_file, VCPKG_LINE_INFO)) @@ -651,26 +658,32 @@ namespace vcpkg return cache.compiler_info; } } - auto compiler_info = load_compiler_info(paths, pre_build_info, toolset); - CompilerInfoCache cache; - cache.compiler_info = compiler_info; - cache.c_compiler_last_write_time = fs.last_write_time(compiler_info.c_compiler_path, VCPKG_LINE_INFO); - cache.cxx_compiler_last_write_time = - fs.last_write_time(compiler_info.cxx_compiler_path, VCPKG_LINE_INFO); - fs.write_contents_and_dirs( - cache_file, Json::stringify(CompilerInfoCacheDeserializer::serialize(cache)), VCPKG_LINE_INFO); - return compiler_info; - } - else + return nullopt; + }); + if (maybe_entry) { - return CompilerInfo{}; + return *maybe_entry.get(); } + } + + return triplet_entry.compiler_info.get_lazy(toolchain_hash, [&]() -> CompilerInfo { + auto cache_file = paths.installed().compiler_info_cache_file(pre_build_info.triplet); + auto& fs = paths.get_filesystem(); + auto compiler_info = load_compiler_info(paths, pre_build_info, toolset); + CompilerInfoCache cache; + cache.compiler_info = compiler_info; + cache.c_compiler_last_write_time = fs.last_write_time(compiler_info.c_compiler_path, VCPKG_LINE_INFO); + cache.cxx_compiler_last_write_time = fs.last_write_time(compiler_info.cxx_compiler_path, VCPKG_LINE_INFO); + fs.write_contents_and_dirs( + cache_file, Json::stringify(CompilerInfoCacheDeserializer::serialize(cache)), VCPKG_LINE_INFO); + return compiler_info; }); } const std::string& EnvCache::get_triplet_info(const VcpkgPaths& paths, const PreBuildInfo& pre_build_info, - const Toolset& toolset) + const Toolset& toolset, + UseCompilerInfoCache use_compiler_info_cache) { const auto& fs = paths.get_filesystem(); const auto& triplet_file_path = paths.get_triplet_db().get_triplet_file_path(pre_build_info.triplet); @@ -682,7 +695,7 @@ namespace vcpkg if (m_compiler_tracking && !pre_build_info.disable_compiler_tracking) { return triplet_entry.triplet_infos.get_lazy(toolchain_hash, [&]() -> std::string { - auto& compiler_info = get_compiler_info(paths, pre_build_info, toolset); + auto& compiler_info = get_compiler_info(paths, pre_build_info, toolset, use_compiler_info_cache); return Strings::concat(triplet_entry.hash, '-', toolchain_hash, '-', compiler_info.hash); }); } @@ -799,60 +812,15 @@ namespace vcpkg const PreBuildInfo& pre_build_info, const Toolset& toolset) { - static constexpr auto vcpkg_json = R"--( -{ - "name": "detect-compiler", - "version": "0", - "description": "None" -} -)--"; - static constexpr auto portfile_cmake = R"--( -set(VCPKG_BUILD_TYPE release) -vcpkg_configure_cmake( - SOURCE_PATH "${CMAKE_CURRENT_LIST_DIR}" - PREFER_NINJA - OPTIONS - "-DPACKAGES_DIR=${CURRENT_PACKAGES_DIR}" -) -)--"; - static constexpr auto cmakelists_txt = R"--( -cmake_minimum_required(VERSION 3.20) -project(detect_compiler NONE) - -if(CMAKE_GENERATOR STREQUAL "Ninja" AND CMAKE_SYSTEM_NAME STREQUAL "Windows") - set(CMAKE_C_COMPILER_WORKS 1) - set(CMAKE_C_COMPILER_FORCED 1) - set(CMAKE_CXX_COMPILER_WORKS 1) - set(CMAKE_CXX_COMPILER_FORCED 1) -endif() - -enable_language(C) -enable_language(CXX) - -file(SHA1 "${CMAKE_CXX_COMPILER}" CXX_HASH) -file(SHA1 "${CMAKE_C_COMPILER}" C_HASH) -string(SHA1 COMPILER_HASH "${C_HASH}${CXX_HASH}") - -file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} -${CMAKE_CXX_COMPILER_VERSION} -${CMAKE_CXX_COMPILER_ID} -${CMAKE_C_COMPILER} -${CMAKE_CXX_COMPILER}") -)--"; auto& triplet = pre_build_info.triplet; msg::println(msgDetectCompilerHash, msg::triplet = triplet); auto buildpath = paths.buildtrees() / FileDetectCompiler; - auto portpath = paths.buildtrees() / "detect_compiler-port"; - auto packagespath = paths.packages() / ("detect_compiler_" + triplet.canonical_name()); - auto& fs = paths.get_filesystem(); - fs.write_contents_and_dirs(portpath / "vcpkg.json", vcpkg_json, VCPKG_LINE_INFO); - fs.write_contents_and_dirs(portpath / "portfile.cmake", portfile_cmake, VCPKG_LINE_INFO); - fs.write_contents_and_dirs(portpath / "CMakeLists.txt", cmakelists_txt, VCPKG_LINE_INFO); std::vector cmake_args{ - {CMakeVariableCurrentPortDir, portpath}, + {CMakeVariableCurrentPortDir, paths.scripts / FileDetectCompiler}, {CMakeVariableCurrentBuildtreesDir, buildpath}, - {CMakeVariableCurrentPackagesDir, packagespath}, + {CMakeVariableCurrentPackagesDir, + paths.packages() / fmt::format("{}_{}", FileDetectCompiler, triplet.canonical_name())}, // The detect_compiler "port" doesn't depend on the host triplet, so always natively compile {CMakeVariableHostTriplet, triplet.canonical_name()}, }; @@ -861,25 +829,51 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} auto cmd = vcpkg::make_cmake_cmd(paths, paths.ports_cmake, std::move(cmake_args)); RedirectedProcessLaunchSettings settings; settings.environment.emplace(paths.get_action_env(pre_build_info, toolset)); + auto& fs = paths.get_filesystem(); fs.create_directory(buildpath, VCPKG_LINE_INFO); auto stdoutlog = buildpath / ("stdout-" + triplet.canonical_name() + ".log"); - - auto result = flatten_out(cmd_execute_and_capture_output(cmd, settings), cmd.command_line()); CompilerInfo compiler_info; - if (result.has_value()) - { - auto lines = fs.read_lines(packagespath / "abi_info").value_or_exit(VCPKG_LINE_INFO); - if (lines.size() == 5) + std::string buf; + + Optional out_file_storage = fs.open_for_write(stdoutlog, VCPKG_LINE_INFO); + auto& out_file = out_file_storage.value_or_exit(VCPKG_LINE_INFO); + auto rc = cmd_execute_and_stream_lines(cmd, settings, [&](StringView s) { + if (Strings::starts_with(s, MarkerCompilerHash)) { - compiler_info.hash = lines[0]; - compiler_info.version = lines[1]; - compiler_info.id = lines[2]; - compiler_info.c_compiler_path = lines[3]; - compiler_info.cxx_compiler_path = lines[4]; + compiler_info.hash = s.substr(MarkerCompilerHash.size()).to_string(); } - } + if (Strings::starts_with(s, MarkerCompilerCxxVersion)) + { + compiler_info.version = s.substr(MarkerCompilerCxxVersion.size()).to_string(); + } + if (Strings::starts_with(s, MarkerCompilerCxxId)) + { + compiler_info.id = s.substr(MarkerCompilerCxxId.size()).to_string(); + } + static constexpr StringLiteral cxx_path_marker = "#COMPILER_CXX_PATH#"; + if (Strings::starts_with(s, cxx_path_marker)) + { + const auto compiler_cxx_path = s.substr(cxx_path_marker.size()); + compiler_info.cxx_compiler_path = compiler_cxx_path; + } + static constexpr StringLiteral c_path_marker = "#COMPILER_C_PATH#"; + if (Strings::starts_with(s, c_path_marker)) + { + const auto compiler_c_path = s.substr(c_path_marker.size()); + compiler_info.c_compiler_path = compiler_c_path; + } + Debug::println(s); + const auto old_buf_size = buf.size(); + Strings::append(buf, s, '\n'); + const auto write_size = buf.size() - old_buf_size; + Checks::msg_check_exit(VCPKG_LINE_INFO, + out_file.write(buf.c_str() + old_buf_size, 1, write_size) == write_size, + msgErrorWhileWriting, + msg::path = stdoutlog); + }); - if (compiler_info.hash.empty() || !result.has_value()) + out_file_storage.clear(); + if (compiler_info.hash.empty() || !succeeded(rc)) { Debug::println("Compiler information tracking can be disabled by passing --", SwitchFeatureFlags, @@ -887,15 +881,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} FeatureFlagCompilertracking); msg::println_error(msgErrorDetectingCompilerInfo, msg::path = stdoutlog); - if (result.has_value()) - { - msg::write_unlocalized_text(Color::none, *result.get()); - msg::write_unlocalized_text(Color::none, fs.read_contents(packagespath / "abi_info", VCPKG_LINE_INFO)); - } - else - { - msg::println(result.error()); - } + msg::write_unlocalized_text(Color::none, buf); Checks::msg_exit_with_error(VCPKG_LINE_INFO, msgErrorUnableToDetectCompilerInfo); } @@ -1309,7 +1295,8 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} InstallPlanAction& action, std::unique_ptr&& proto_pre_build_info, Span dependency_abis, - Cache>& grdk_cache) + Cache>& grdk_cache, + UseCompilerInfoCache use_compiler_info_cache) { Checks::check_exit(VCPKG_LINE_INFO, static_cast(proto_pre_build_info)); const auto& pre_build_info = *proto_pre_build_info; @@ -1329,7 +1316,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} return; } - abi_info.compiler_info = paths.get_compiler_info(*abi_info.pre_build_info, toolset); + abi_info.compiler_info = paths.get_compiler_info(*abi_info.pre_build_info, toolset, use_compiler_info_cache); for (auto&& dep_abi : dependency_abis) { if (dep_abi.value.empty()) @@ -1345,7 +1332,7 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} std::vector abi_tag_entries(dependency_abis.begin(), dependency_abis.end()); - const auto& triplet_abi = paths.get_triplet_info(pre_build_info, toolset); + const auto& triplet_abi = paths.get_triplet_info(pre_build_info, toolset, use_compiler_info_cache); abi_info.triplet_abi.emplace(triplet_abi); const auto& triplet_canonical_name = action.spec.triplet().canonical_name(); abi_tag_entries.emplace_back(AbiTagTriplet, triplet_canonical_name); @@ -1496,7 +1483,8 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} void compute_all_abis(const VcpkgPaths& paths, ActionPlan& action_plan, const CMakeVars::CMakeVarProvider& var_provider, - const StatusParagraphs& status_db) + const StatusParagraphs& status_db, + UseCompilerInfoCache use_compiler_info_cache) { Cache> grdk_cache; for (auto it = action_plan.install_actions.begin(); it != action_plan.install_actions.end(); ++it) @@ -1537,7 +1525,8 @@ file(WRITE "${PACKAGES_DIR}/abi_info" "${COMPILER_HASH} action.spec.triplet(), var_provider.get_tag_vars(action.spec).value_or_exit(VCPKG_LINE_INFO)), dependency_abis, - grdk_cache); + grdk_cache, + use_compiler_info_cache); } } diff --git a/src/vcpkg/commands.set-installed.cpp b/src/vcpkg/commands.set-installed.cpp index 9fbbe44ce5..4eb77d29de 100644 --- a/src/vcpkg/commands.set-installed.cpp +++ b/src/vcpkg/commands.set-installed.cpp @@ -165,6 +165,32 @@ namespace vcpkg return specs_installed; } + static bool is_action_plan_fulfilled(const ActionPlan& action_plan, const StatusParagraphs& status_db) + { + std::set all_abis; + for (const auto& action : action_plan.install_actions) + { + all_abis.insert(action.abi_info.value_or_exit(VCPKG_LINE_INFO).package_abi); + } + + for (auto&& status_pgh : status_db) + { + if (!status_pgh->is_installed()) continue; + if (status_pgh->package.is_feature()) continue; + + const auto& abi = status_pgh->package.abi; + if (abi.empty()) + { + return false; + } + if (all_abis.erase(abi) == 0) + { + return false; + } + } + return all_abis.empty(); + } + void command_set_installed_and_exit_ex(const VcpkgCmdArguments& args, const VcpkgPaths& paths, Triplet host_triplet, @@ -179,7 +205,7 @@ namespace vcpkg auto& fs = paths.get_filesystem(); cmake_vars.load_tag_vars(action_plan, host_triplet); - compute_all_abis(paths, action_plan, cmake_vars, {}); + compute_all_abis(paths, action_plan, cmake_vars, {}, UseCompilerInfoCache::Yes); std::vector user_requested_specs; for (const auto& action : action_plan.install_actions) @@ -217,7 +243,32 @@ namespace vcpkg // currently (or once) installed specifications auto status_db = database_load_collapse(fs, paths.installed()); + + bool used_cached_compiler_info = + Util::any_of(action_plan.install_actions, [](const InstallPlanAction& install_action) { + return install_action.abi_info.value_or_exit(VCPKG_LINE_INFO) + .compiler_info.value_or_exit(VCPKG_LINE_INFO) + .from_cache; + }); + + if (used_cached_compiler_info) + { + if (!is_action_plan_fulfilled(action_plan, status_db)) + { + // we have to install something, so get fresh compiler infos + for (auto& install_action : action_plan.install_actions) + { + install_action.abi_info.clear(); + } + compute_all_abis(paths, action_plan, cmake_vars, {}); + used_cached_compiler_info = false; + } + } adjust_action_plan_to_status_db(action_plan, status_db); + if (used_cached_compiler_info) + { + Checks::check_exit(VCPKG_LINE_INFO, action_plan.empty()); + } print_plan(action_plan, paths.builtin_ports_directory()); diff --git a/src/vcpkg/vcpkgpaths.cpp b/src/vcpkg/vcpkgpaths.cpp index fe7748d6ca..c3f7b14358 100644 --- a/src/vcpkg/vcpkgpaths.cpp +++ b/src/vcpkg/vcpkgpaths.cpp @@ -1374,14 +1374,18 @@ namespace vcpkg return m_pimpl->m_env_cache.get_action_env(*this, pre_build_info, toolset); } - const std::string& VcpkgPaths::get_triplet_info(const PreBuildInfo& pre_build_info, const Toolset& toolset) const + const std::string& VcpkgPaths::get_triplet_info(const PreBuildInfo& pre_build_info, + const Toolset& toolset, + UseCompilerInfoCache use_compiler_info_cache) const { - return m_pimpl->m_env_cache.get_triplet_info(*this, pre_build_info, toolset); + return m_pimpl->m_env_cache.get_triplet_info(*this, pre_build_info, toolset, use_compiler_info_cache); } - const CompilerInfo& VcpkgPaths::get_compiler_info(const PreBuildInfo& pre_build_info, const Toolset& toolset) const + const CompilerInfo& VcpkgPaths::get_compiler_info(const PreBuildInfo& pre_build_info, + const Toolset& toolset, + UseCompilerInfoCache use_compiler_info_cache) const { - return m_pimpl->m_env_cache.get_compiler_info(*this, pre_build_info, toolset); + return m_pimpl->m_env_cache.get_compiler_info(*this, pre_build_info, toolset, use_compiler_info_cache); } const FeatureFlagSettings& VcpkgPaths::get_feature_flags() const { return m_pimpl->m_ff_settings; }