From 33fe38d1ee5505886921914db35dc16fe3f80042 Mon Sep 17 00:00:00 2001 From: Billy O'Neal Date: Sat, 3 Aug 2024 00:42:35 -0700 Subject: [PATCH] Fix doubled warnings being printed for manifest warnings when loading ports. (#1466) --- .../vcpkg-bad-spdx-license/portfile.cmake | 1 + .../vcpkg-bad-spdx-license/vcpkg.json | 5 + .../end-to-end-tests-dir/build-test-ports.ps1 | 16 +++ include/vcpkg/base/message-data.inc.h | 4 - include/vcpkg/metrics.h | 2 +- include/vcpkg/paragraphs.h | 6 +- include/vcpkg/portfileprovider.h | 6 +- include/vcpkg/registries.h | 2 +- include/vcpkg/sourceparagraph.h | 11 ++ locales/messages.json | 2 - src/vcpkg/commands.build-external.cpp | 2 +- src/vcpkg/commands.build.cpp | 4 +- src/vcpkg/commands.check-support.cpp | 4 +- src/vcpkg/commands.ci.cpp | 4 +- src/vcpkg/commands.depend-info.cpp | 4 +- src/vcpkg/commands.env.cpp | 4 +- src/vcpkg/commands.export.cpp | 4 +- src/vcpkg/commands.find.cpp | 2 +- src/vcpkg/commands.format-manifest.cpp | 3 +- src/vcpkg/commands.install.cpp | 6 +- src/vcpkg/commands.package-info.cpp | 4 +- src/vcpkg/commands.remove.cpp | 4 +- src/vcpkg/commands.set-installed.cpp | 4 +- src/vcpkg/commands.update.cpp | 4 +- src/vcpkg/commands.upgrade.cpp | 4 +- src/vcpkg/paragraphs.cpp | 16 +-- src/vcpkg/portfileprovider.cpp | 78 +++-------- src/vcpkg/registries.cpp | 125 ++++++++++-------- src/vcpkg/sourceparagraph.cpp | 2 + 29 files changed, 164 insertions(+), 169 deletions(-) create mode 100644 azure-pipelines/e2e-ports/vcpkg-bad-spdx-license/portfile.cmake create mode 100644 azure-pipelines/e2e-ports/vcpkg-bad-spdx-license/vcpkg.json diff --git a/azure-pipelines/e2e-ports/vcpkg-bad-spdx-license/portfile.cmake b/azure-pipelines/e2e-ports/vcpkg-bad-spdx-license/portfile.cmake new file mode 100644 index 0000000000..065116c276 --- /dev/null +++ b/azure-pipelines/e2e-ports/vcpkg-bad-spdx-license/portfile.cmake @@ -0,0 +1 @@ +set(VCPKG_POLICY_EMPTY_PACKAGE enabled) diff --git a/azure-pipelines/e2e-ports/vcpkg-bad-spdx-license/vcpkg.json b/azure-pipelines/e2e-ports/vcpkg-bad-spdx-license/vcpkg.json new file mode 100644 index 0000000000..2832f27b74 --- /dev/null +++ b/azure-pipelines/e2e-ports/vcpkg-bad-spdx-license/vcpkg.json @@ -0,0 +1,5 @@ +{ + "name": "vcpkg-bad-spdx-license", + "version": "1", + "license": "BSD-new" +} diff --git a/azure-pipelines/end-to-end-tests-dir/build-test-ports.ps1 b/azure-pipelines/end-to-end-tests-dir/build-test-ports.ps1 index d2dc4f97b3..9854e21678 100644 --- a/azure-pipelines/end-to-end-tests-dir/build-test-ports.ps1 +++ b/azure-pipelines/end-to-end-tests-dir/build-test-ports.ps1 @@ -60,3 +60,19 @@ Throw-IfFailed if ($output -notmatch 'vcpkg-internal-e2e-test-port3:[^ ]+ is already installed -- not building from HEAD') { throw 'Wrong already installed message for --head' } + +Refresh-TestRoot +$output = Run-VcpkgAndCaptureOutput @commonArgs --x-builtin-ports-root="$PSScriptRoot/../e2e-ports" install vcpkg-bad-spdx-license +Throw-IfFailed +$output = $output.Replace("`r`n", "`n") +$expected = @" +vcpkg.json: warning: $.license (an SPDX license expression): warning: Unknown license identifier 'BSD-new'. Known values are listed at https://spdx.org/licenses/ + on expression: BSD-new + ^ +"@ +$firstMatch = $output.IndexOf($expected) +if ($firstMatch -lt 0) { + throw 'Did not detect expected bad license' +} elseif ($output.IndexOf($expected, $firstMatch + 1) -ge 0) { + throw 'Duplicated bad license' +} diff --git a/include/vcpkg/base/message-data.inc.h b/include/vcpkg/base/message-data.inc.h index 142db8ac41..94da29347b 100644 --- a/include/vcpkg/base/message-data.inc.h +++ b/include/vcpkg/base/message-data.inc.h @@ -3033,10 +3033,6 @@ DECLARE_MESSAGE(VersionMissingRequiredFeature, (msg::version_spec, msg::feature, msg::constraint_origin), "", "{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(VersionNotFoundInVersionsFile2, (msg::version_spec), "", diff --git a/include/vcpkg/metrics.h b/include/vcpkg/metrics.h index f93eec83dd..c128099f20 100644 --- a/include/vcpkg/metrics.h +++ b/include/vcpkg/metrics.h @@ -37,7 +37,7 @@ namespace vcpkg VcpkgDefaultBinaryCache, VcpkgNugetRepository, VersioningErrorBaseline, - VersioningErrorVersion, + VersioningErrorVersion, // no longer used X_VcpkgRegistriesCache, X_WriteNugetPackagesConfig, COUNT // always keep COUNT last diff --git a/include/vcpkg/paragraphs.h b/include/vcpkg/paragraphs.h index 71424a046d..efd7b64e3f 100644 --- a/include/vcpkg/paragraphs.h +++ b/include/vcpkg/paragraphs.h @@ -58,10 +58,8 @@ namespace vcpkg::Paragraphs std::vector> errors; }; - LoadResults try_load_all_registry_ports(const ReadOnlyFilesystem& fs, const RegistrySet& registries); - - std::vector load_all_registry_ports(const ReadOnlyFilesystem& fs, - const RegistrySet& registries); + LoadResults try_load_all_registry_ports(const RegistrySet& registries); + std::vector load_all_registry_ports(const RegistrySet& registries); LoadResults try_load_overlay_ports(const ReadOnlyFilesystem& fs, const Path& dir); std::vector load_overlay_ports(const ReadOnlyFilesystem& fs, const Path& dir); diff --git a/include/vcpkg/portfileprovider.h b/include/vcpkg/portfileprovider.h index 1be1b46d58..d8ce691f2e 100644 --- a/include/vcpkg/portfileprovider.h +++ b/include/vcpkg/portfileprovider.h @@ -63,8 +63,7 @@ namespace vcpkg struct PathsPortFileProvider : PortFileProvider { - explicit PathsPortFileProvider(const ReadOnlyFilesystem& fs, - const RegistrySet& registry_set, + explicit PathsPortFileProvider(const RegistrySet& registry_set, std::unique_ptr&& overlay); ExpectedL get_control_file(const std::string& src_name) const override; std::vector load_all_control_files() const override; @@ -76,8 +75,7 @@ namespace vcpkg }; std::unique_ptr make_baseline_provider(const RegistrySet& registry_set); - std::unique_ptr make_versioned_portfile_provider(const ReadOnlyFilesystem& fs, - const RegistrySet& registry_set); + std::unique_ptr make_versioned_portfile_provider(const RegistrySet& registry_set); std::unique_ptr make_overlay_provider(const ReadOnlyFilesystem& fs, const Path& original_cwd, View overlay_ports); diff --git a/include/vcpkg/registries.h b/include/vcpkg/registries.h index 558eb1ef5e..66d8886623 100644 --- a/include/vcpkg/registries.h +++ b/include/vcpkg/registries.h @@ -58,7 +58,7 @@ namespace vcpkg { virtual ExpectedL> get_port_versions() const = 0; - virtual ExpectedL get_version(const Version& version) const = 0; + virtual ExpectedL try_load_port(const Version& version) const = 0; virtual ~RegistryEntry() = default; }; diff --git a/include/vcpkg/sourceparagraph.h b/include/vcpkg/sourceparagraph.h index 05dd520571..d5b200931a 100644 --- a/include/vcpkg/sourceparagraph.h +++ b/include/vcpkg/sourceparagraph.h @@ -210,6 +210,17 @@ namespace vcpkg VersionSpec to_version_spec() const { return source_control_file->to_version_spec(); } Path port_directory() const { return control_path.parent_path(); } + SourceControlFileAndLocation clone() const + { + std::unique_ptr scf; + if (source_control_file) + { + scf = std::make_unique(source_control_file->clone()); + } + + return SourceControlFileAndLocation{std::move(scf), control_path, spdx_location}; + } + std::unique_ptr source_control_file; Path control_path; diff --git a/locales/messages.json b/locales/messages.json index a3d51f7086..3ce795ad03 100644 --- a/locales/messages.json +++ b/locales/messages.json @@ -1613,8 +1613,6 @@ "_VersionMissing.comment": "The names version, version-date, version-semver, and version-string are code and must not be localized", "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", "VersionNotFoundInVersionsFile2": "{version_spec} was not found in versions database", "_VersionNotFoundInVersionsFile2.comment": "An example of {version_spec} is zlib:x64-windows@1.0.0.", "VersionNotFoundInVersionsFile3": "the version should be in this file", diff --git a/src/vcpkg/commands.build-external.cpp b/src/vcpkg/commands.build-external.cpp index 2087ed2fe8..9ef71a66a6 100644 --- a/src/vcpkg/commands.build-external.cpp +++ b/src/vcpkg/commands.build-external.cpp @@ -48,7 +48,7 @@ namespace vcpkg 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)); + PathsPortFileProvider provider(*registry_set, make_overlay_provider(fs, paths.original_cwd, overlays)); command_build_and_exit_ex(args, paths, host_triplet, build_options, spec, provider, null_build_logs_recorder()); } } diff --git a/src/vcpkg/commands.build.cpp b/src/vcpkg/commands.build.cpp index 68b963be13..613b373d11 100644 --- a/src/vcpkg/commands.build.cpp +++ b/src/vcpkg/commands.build.cpp @@ -107,8 +107,8 @@ namespace vcpkg 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)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); Checks::exit_with_code(VCPKG_LINE_INFO, command_build_ex(args, paths, diff --git a/src/vcpkg/commands.check-support.cpp b/src/vcpkg/commands.check-support.cpp index a8e633f919..2d76b6a2f5 100644 --- a/src/vcpkg/commands.check-support.cpp +++ b/src/vcpkg/commands.check-support.cpp @@ -128,8 +128,8 @@ namespace vcpkg 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)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); auto cmake_vars = CMakeVars::make_triplet_cmake_var_provider(paths); // for each spec in the user-requested specs, check all dependencies diff --git a/src/vcpkg/commands.ci.cpp b/src/vcpkg/commands.ci.cpp index 6ae68512c9..115964d7ca 100644 --- a/src/vcpkg/commands.ci.cpp +++ b/src/vcpkg/commands.ci.cpp @@ -376,8 +376,8 @@ namespace vcpkg build_logs_recorder_storage ? *(build_logs_recorder_storage.get()) : null_build_logs_recorder(); auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider( - filesystem, *registry_set, make_overlay_provider(filesystem, paths.original_cwd, paths.overlay_ports)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(filesystem, paths.original_cwd, paths.overlay_ports)); auto var_provider_storage = CMakeVars::make_triplet_cmake_var_provider(paths); auto& var_provider = *var_provider_storage; diff --git a/src/vcpkg/commands.depend-info.cpp b/src/vcpkg/commands.depend-info.cpp index d2cf8102c2..d89fc4bd8c 100644 --- a/src/vcpkg/commands.depend-info.cpp +++ b/src/vcpkg/commands.depend-info.cpp @@ -409,8 +409,8 @@ namespace vcpkg 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)); + PathsPortFileProvider provider(*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; diff --git a/src/vcpkg/commands.env.cpp b/src/vcpkg/commands.env.cpp index d8104d44d3..14d6cec2f4 100644 --- a/src/vcpkg/commands.env.cpp +++ b/src/vcpkg/commands.env.cpp @@ -80,8 +80,8 @@ namespace vcpkg const ParsedArguments options = args.parse_arguments(CommandEnvMetadata); auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider( - fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); + PathsPortFileProvider provider(*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; diff --git a/src/vcpkg/commands.export.cpp b/src/vcpkg/commands.export.cpp index 6e8a70a095..efb28a3455 100644 --- a/src/vcpkg/commands.export.cpp +++ b/src/vcpkg/commands.export.cpp @@ -602,8 +602,8 @@ namespace vcpkg // Load ports from ports dirs 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)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); // create the plan std::vector export_plan = create_export_plan(opts.specs, status_db); diff --git a/src/vcpkg/commands.find.cpp b/src/vcpkg/commands.find.cpp index e6a15328b2..6e286e1ed9 100644 --- a/src/vcpkg/commands.find.cpp +++ b/src/vcpkg/commands.find.cpp @@ -138,7 +138,7 @@ namespace vcpkg Checks::check_exit(VCPKG_LINE_INFO, msg::default_output_stream == OutputStream::StdErr); auto& fs = paths.get_filesystem(); auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider(fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, overlay_ports)); + PathsPortFileProvider provider(*registry_set, make_overlay_provider(fs, paths.original_cwd, overlay_ports)); auto source_paragraphs = Util::fmap(provider.load_all_control_files(), [](auto&& port) -> const SourceControlFile* { return port->source_control_file.get(); }); diff --git a/src/vcpkg/commands.format-manifest.cpp b/src/vcpkg/commands.format-manifest.cpp index d9e37f5eb2..d1199f167f 100644 --- a/src/vcpkg/commands.format-manifest.cpp +++ b/src/vcpkg/commands.format-manifest.cpp @@ -41,7 +41,8 @@ namespace auto res = serialize_manifest(*data.scf); // reparse res to ensure no semantic changes were made - auto maybe_reparsed = SourceControlFile::parse_project_manifest_object(StringView{}, res, null_sink); + auto maybe_reparsed = + SourceControlFile::parse_project_manifest_object(StringLiteral{""}, res, null_sink); bool reparse_matches; if (auto reparsed = maybe_reparsed.get()) { diff --git a/src/vcpkg/commands.install.cpp b/src/vcpkg/commands.install.cpp index c41e0c202f..3c6270b030 100644 --- a/src/vcpkg/commands.install.cpp +++ b/src/vcpkg/commands.install.cpp @@ -1237,7 +1237,7 @@ namespace vcpkg const bool add_builtin_ports_directory_as_overlay = registry_set->is_default_builtin_registry() && !paths.use_git_default_registry(); - auto verprovider = make_versioned_portfile_provider(fs, *registry_set); + auto verprovider = make_versioned_portfile_provider(*registry_set); auto baseprovider = make_baseline_provider(*registry_set); std::vector extended_overlay_ports; @@ -1278,8 +1278,8 @@ namespace vcpkg } auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider( - fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); const std::vector specs = Util::fmap(options.command_arguments, [&](const std::string& arg) { return check_and_get_full_package_spec(arg, default_triplet, paths.get_triplet_db()) diff --git a/src/vcpkg/commands.package-info.cpp b/src/vcpkg/commands.package-info.cpp index 27e618ff2e..70608eb521 100644 --- a/src/vcpkg/commands.package-info.cpp +++ b/src/vcpkg/commands.package-info.cpp @@ -102,8 +102,8 @@ namespace vcpkg Json::Object response; Json::Object results; auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider( - fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); for (auto&& arg : options.command_arguments) { diff --git a/src/vcpkg/commands.remove.cpp b/src/vcpkg/commands.remove.cpp index 625776fb26..9b53b9cd1b 100644 --- a/src/vcpkg/commands.remove.cpp +++ b/src/vcpkg/commands.remove.cpp @@ -196,8 +196,8 @@ namespace vcpkg // Load ports from ports dirs 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)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); specs = Util::fmap(find_outdated_packages(provider, status_db), [](auto&& outdated) { return outdated.spec; }); diff --git a/src/vcpkg/commands.set-installed.cpp b/src/vcpkg/commands.set-installed.cpp index fbd86de8fb..717858d3c4 100644 --- a/src/vcpkg/commands.set-installed.cpp +++ b/src/vcpkg/commands.set-installed.cpp @@ -314,8 +314,8 @@ namespace vcpkg 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)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); auto cmake_vars = CMakeVars::make_triplet_cmake_var_provider(paths); Optional pkgsconfig; diff --git a/src/vcpkg/commands.update.cpp b/src/vcpkg/commands.update.cpp index 7fabfd6ae7..3aec063456 100644 --- a/src/vcpkg/commands.update.cpp +++ b/src/vcpkg/commands.update.cpp @@ -68,8 +68,8 @@ namespace vcpkg const StatusParagraphs status_db = database_load_check(fs, paths.installed()); auto registry_set = paths.make_registry_set(); - PathsPortFileProvider provider( - fs, *registry_set, make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); + PathsPortFileProvider provider(*registry_set, + make_overlay_provider(fs, paths.original_cwd, paths.overlay_ports)); const auto outdated_packages = SortedVector( find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); diff --git a/src/vcpkg/commands.upgrade.cpp b/src/vcpkg/commands.upgrade.cpp index e872134449..4b5c000339 100644 --- a/src/vcpkg/commands.upgrade.cpp +++ b/src/vcpkg/commands.upgrade.cpp @@ -81,8 +81,8 @@ namespace vcpkg // Load ports from ports dirs 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)); + PathsPortFileProvider provider(*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; diff --git a/src/vcpkg/paragraphs.cpp b/src/vcpkg/paragraphs.cpp index d6eb550246..93183c7906 100644 --- a/src/vcpkg/paragraphs.cpp +++ b/src/vcpkg/paragraphs.cpp @@ -508,7 +508,7 @@ namespace vcpkg::Paragraphs return maybe_paragraphs.error(); } - LoadResults try_load_all_registry_ports(const ReadOnlyFilesystem& fs, const RegistrySet& registries) + LoadResults try_load_all_registry_ports(const RegistrySet& registries) { LoadResults ret; std::vector ports = registries.get_all_reachable_port_names().value_or_exit(VCPKG_LINE_INFO); @@ -530,11 +530,8 @@ namespace vcpkg::Paragraphs 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_result = try_load_port_required(fs, port_name, *port_location); - if (const auto scfl = maybe_result.maybe_scfl.get()) + auto maybe_scfl = (*port_entry)->try_load_port(*baseline_version); + if (const auto scfl = maybe_scfl.get()) { ret.paragraphs.push_back(std::move(*scfl)); } @@ -542,7 +539,7 @@ namespace vcpkg::Paragraphs { ret.errors.emplace_back(std::piecewise_construct, std::forward_as_tuple(port_name.data(), port_name.size()), - std::forward_as_tuple(std::move(maybe_result.maybe_scfl).error())); + std::forward_as_tuple(std::move(maybe_scfl).error())); } } @@ -574,10 +571,9 @@ namespace vcpkg::Paragraphs } } - std::vector load_all_registry_ports(const ReadOnlyFilesystem& fs, - const RegistrySet& registries) + std::vector load_all_registry_ports(const RegistrySet& registries) { - auto results = try_load_all_registry_ports(fs, registries); + auto results = try_load_all_registry_ports(registries); load_results_print_error(results); return std::move(results.paragraphs); } diff --git a/src/vcpkg/portfileprovider.cpp b/src/vcpkg/portfileprovider.cpp index 7fe1ce7e55..c2a4dd4401 100644 --- a/src/vcpkg/portfileprovider.cpp +++ b/src/vcpkg/portfileprovider.cpp @@ -12,27 +12,6 @@ using namespace vcpkg; -namespace -{ - struct OverlayRegistryEntry final : RegistryEntry - { - OverlayRegistryEntry(Path&& p, Version&& v) : root(p), version(v) { } - - ExpectedL> get_port_versions() const override { return View{&version, 1}; } - ExpectedL get_version(const Version& v) const override - { - if (v == version) - { - return PortLocation{root}; - } - return msg::format(msgVersionNotFound, msg::expected = v, msg::actual = version); - } - - Path root; - Version version; - }; -} - namespace vcpkg { MapPortFileProvider::MapPortFileProvider(const std::unordered_map& map) @@ -52,11 +31,10 @@ namespace vcpkg return Util::fmap(ports, [](auto&& kvpair) -> const SourceControlFileAndLocation* { return &kvpair.second; }); } - PathsPortFileProvider::PathsPortFileProvider(const ReadOnlyFilesystem& fs, - const RegistrySet& registry_set, + PathsPortFileProvider::PathsPortFileProvider(const RegistrySet& registry_set, std::unique_ptr&& overlay) : m_baseline(make_baseline_provider(registry_set)) - , m_versioned(make_versioned_portfile_provider(fs, registry_set)) + , m_versioned(make_versioned_portfile_provider(registry_set)) , m_overlay(std::move(overlay)) { } @@ -119,10 +97,7 @@ namespace vcpkg struct VersionedPortfileProviderImpl : IFullVersionedPortfileProvider { - VersionedPortfileProviderImpl(const ReadOnlyFilesystem& fs, const RegistrySet& rset) - : m_fs(fs), m_registry_set(rset) - { - } + VersionedPortfileProviderImpl(const RegistrySet& rset) : m_registry_set(rset) { } VersionedPortfileProviderImpl(const VersionedPortfileProviderImpl&) = delete; VersionedPortfileProviderImpl& operator=(const VersionedPortfileProviderImpl&) = delete; @@ -174,40 +149,29 @@ namespace vcpkg return msg::format_error(msgPortDoesNotExist, msg::package_name = version_spec.port_name); } - auto maybe_path = ent->get()->get_version(version_spec.version); - if (auto path = maybe_path.get()) + auto maybe_scfl = ent->get()->try_load_port(version_spec.version); + if (auto scfl = maybe_scfl.get()) { - auto maybe_scfl = - Paragraphs::try_load_port_required(m_fs, version_spec.port_name, *path).maybe_scfl; - if (auto scfl = maybe_scfl.get()) + auto scf_vspec = scfl->to_version_spec(); + if (scf_vspec == version_spec) { - auto scf_vspec = scfl->to_version_spec(); - if (scf_vspec == version_spec) - { - return std::move(*scfl); - } - else - { - return msg::format_error(msgVersionSpecMismatch, - msg::path = path->port_directory, - msg::expected_version = version_spec, - msg::actual_version = scf_vspec); - } + return std::move(*scfl); } else { - return std::move(maybe_scfl) - .error() - .append_raw('\n') - .append_raw(NotePrefix) - .append(msgWhileLoadingPortVersion, msg::version_spec = version_spec) - .append_raw('\n'); + return msg::format_error(msgVersionSpecMismatch, + msg::path = scfl->control_path, + msg::expected_version = version_spec, + msg::actual_version = scf_vspec); } } else { - get_global_metrics_collector().track_define(DefineMetric::VersioningErrorVersion); - return std::move(maybe_path).error(); + return maybe_scfl.error() + .append_raw('\n') + .append_raw(NotePrefix) + .append(msgWhileLoadingPortVersion, msg::version_spec = version_spec) + .append_raw('\n'); } } @@ -230,7 +194,7 @@ namespace vcpkg virtual void load_all_control_files( std::map& out) const override { - auto all_ports = Paragraphs::load_all_registry_ports(m_fs, m_registry_set); + auto all_ports = Paragraphs::load_all_registry_ports(m_registry_set); for (auto&& scfl : all_ports) { auto it = m_control_cache.emplace(scfl.to_version_spec(), std::move(scfl)).first; @@ -239,7 +203,6 @@ namespace vcpkg } private: - const ReadOnlyFilesystem& m_fs; const RegistrySet& m_registry_set; mutable std::unordered_map, VersionSpecHasher> m_control_cache; @@ -439,10 +402,9 @@ namespace vcpkg return std::make_unique(registry_set); } - std::unique_ptr make_versioned_portfile_provider(const ReadOnlyFilesystem& fs, - const RegistrySet& registry_set) + std::unique_ptr make_versioned_portfile_provider(const RegistrySet& registry_set) { - return std::make_unique(fs, registry_set); + return std::make_unique(registry_set); } std::unique_ptr make_overlay_provider(const ReadOnlyFilesystem& fs, diff --git a/src/vcpkg/registries.cpp b/src/vcpkg/registries.cpp index b9321a558e..104e007989 100644 --- a/src/vcpkg/registries.cpp +++ b/src/vcpkg/registries.cpp @@ -246,7 +246,7 @@ namespace std::vector&& version_entries); ExpectedL> get_port_versions() const override; - ExpectedL get_version(const Version& version) const override; + ExpectedL try_load_port(const Version& version) const override; private: ExpectedL ensure_not_stale() const; @@ -282,7 +282,7 @@ namespace ExpectedL> get_baseline_version(StringView) const override; private: - friend struct GitRegistryEntry; + friend GitRegistryEntry; const ExpectedL& get_lock_entry() const { @@ -401,28 +401,27 @@ namespace struct BuiltinPortTreeRegistryEntry final : RegistryEntry { - BuiltinPortTreeRegistryEntry(StringView name_, Path root_, Version version_) - : name(name_.to_string()), root(root_), version(version_) + BuiltinPortTreeRegistryEntry(const SourceControlFileAndLocation& load_result_) : load_result(load_result_) { } + + ExpectedL> get_port_versions() const override { + return View{&load_result.source_control_file->to_version(), 1}; } - - ExpectedL> get_port_versions() const override { return View{&version, 1}; } - ExpectedL get_version(const Version& v) const override + ExpectedL try_load_port(const Version& v) const override { - if (v == version) + auto& core_paragraph = load_result.source_control_file->core_paragraph; + if (v == core_paragraph->version) { - return PortLocation{root, "git+https://github.com/Microsoft/vcpkg#ports/" + name}; + return load_result.clone(); } return msg::format_error(msgVersionBuiltinPortTreeEntryMissing, - msg::package_name = name, + msg::package_name = core_paragraph->name, msg::expected = v.to_string(), - msg::actual = version.to_string()); + msg::actual = core_paragraph->version.to_string()); } - std::string name; - Path root; - Version version; + const SourceControlFileAndLocation& load_result; }; struct BuiltinGitRegistryEntry final : RegistryEntry @@ -433,7 +432,7 @@ namespace { return View{port_versions_soa.port_versions()}; } - ExpectedL get_version(const Version& version) const override; + ExpectedL try_load_port(const Version& version) const override; const VcpkgPaths& m_paths; @@ -444,12 +443,23 @@ namespace struct FilesystemRegistryEntry final : RegistryEntry { - explicit FilesystemRegistryEntry(std::string&& port_name) : port_name(port_name) { } + explicit FilesystemRegistryEntry(const ReadOnlyFilesystem& fs, + StringView port_name, + std::vector&& version_entries) + : fs(fs), port_name(port_name.data(), port_name.size()) + { + for (auto&& version_entry : version_entries) + { + port_versions.push_back(std::move(version_entry.version.version)); + version_paths.push_back(std::move(version_entry.p)); + } + } ExpectedL> get_port_versions() const override { return View{port_versions}; } - ExpectedL get_version(const Version& version) const override; + ExpectedL try_load_port(const Version& version) const override; + const ReadOnlyFilesystem& fs; std::string port_name; // these two map port versions to paths // these shall have the same size, and paths[i] shall be the path for port_versions[i] @@ -481,10 +491,14 @@ namespace DelayedInit m_baseline; private: - const ExpectedL& get_scfl(StringView port_name, const Path& path) const + const ExpectedL& get_scfl(StringView port_name) const { + auto path = m_builtin_ports_directory / port_name; return m_scfls.get_lazy(path, [&, this]() { - return Paragraphs::try_load_port(m_fs, port_name, PortLocation{path}).maybe_scfl; + std::string spdx_location = "git+https://github.com/Microsoft/vcpkg#ports/"; + spdx_location.append(port_name.data(), port_name.size()); + return Paragraphs::try_load_port(m_fs, port_name, PortLocation{path, std::move(spdx_location)}) + .maybe_scfl; }); } @@ -694,9 +708,8 @@ namespace // { BuiltinFilesRegistry::RegistryImplementation ExpectedL> BuiltinFilesRegistry::get_port_entry(StringView port_name) const { - auto port_directory = m_builtin_ports_directory / port_name; - return get_scfl(port_name, port_directory) - .then([&](const SourceControlFileAndLocation& scfl) -> ExpectedL> { + return get_scfl(port_name).then( + [&](const SourceControlFileAndLocation& scfl) -> ExpectedL> { auto scf = scfl.source_control_file.get(); if (!scf) { @@ -705,30 +718,28 @@ namespace if (scf->core_paragraph->name == port_name) { - return std::make_unique( - scf->core_paragraph->name, port_directory, scf->to_version()); + return std::make_unique(scfl); } return msg::format_error(msgUnexpectedPortName, msg::expected = scf->core_paragraph->name, msg::actual = port_name, - msg::path = port_directory); + msg::path = scfl.port_directory()); }); } ExpectedL> BuiltinFilesRegistry::get_baseline_version(StringView port_name) const { // if a baseline is not specified, use the ports directory version - return get_scfl(port_name, m_builtin_ports_directory / port_name) - .then([&](const SourceControlFileAndLocation& scfl) -> ExpectedL> { - auto scf = scfl.source_control_file.get(); - if (!scf) - { - return Optional(); - } + return get_scfl(port_name).then([&](const SourceControlFileAndLocation& scfl) -> ExpectedL> { + auto scf = scfl.source_control_file.get(); + if (!scf) + { + return Optional(); + } - return scf->to_version(); - }); + return scf->to_version(); + }); } ExpectedL BuiltinFilesRegistry::append_all_port_names(std::vector& out) const @@ -851,14 +862,7 @@ namespace return std::unique_ptr{}; } - auto res = std::make_unique(port_name.to_string()); - for (auto&& version_entry : *version_entries) - { - res->port_versions.push_back(std::move(version_entry.version.version)); - res->version_paths.push_back(std::move(version_entry.p)); - } - - return res; + return std::make_unique(m_fs, port_name, std::move(*version_entries)); }); } @@ -1060,7 +1064,7 @@ namespace // { RegistryEntry // { BuiltinRegistryEntry::RegistryEntry - ExpectedL BuiltinGitRegistryEntry::get_version(const Version& version) const + ExpectedL BuiltinGitRegistryEntry::try_load_port(const Version& version) const { auto& port_versions = port_versions_soa.port_versions(); auto it = std::find(port_versions.begin(), port_versions.end(), version); @@ -1082,17 +1086,20 @@ namespace .append(msgSeeURL, msg::url = docs::troubleshoot_versioning_url); }); }) - .map([&git_tree](Path&& p) -> PortLocation { - return { - std::move(p), - "git+https://github.com/Microsoft/vcpkg@" + git_tree, - }; + .then([this, &git_tree](Path&& p) -> ExpectedL { + return Paragraphs::try_load_port_required(m_paths.get_filesystem(), + port_name, + PortLocation{ + std::move(p), + "git+https://github.com/Microsoft/vcpkg@" + git_tree, + }) + .maybe_scfl; }); } // } BuiltinRegistryEntry::RegistryEntry // { FilesystemRegistryEntry::RegistryEntry - ExpectedL FilesystemRegistryEntry::get_version(const Version& version) const + ExpectedL FilesystemRegistryEntry::try_load_port(const Version& version) const { auto it = std::find(port_versions.begin(), port_versions.end(), version); if (it == port_versions.end()) @@ -1101,7 +1108,8 @@ namespace msgVersionDatabaseEntryMissing, msg::package_name = port_name, msg::version = version); } - return PortLocation{version_paths[it - port_versions.begin()]}; + const auto& load_path = version_paths[it - port_versions.begin()]; + return Paragraphs::try_load_port_required(fs, port_name, PortLocation{load_path}).maybe_scfl; } // } FilesystemRegistryEntry::RegistryEntry @@ -1153,7 +1161,7 @@ namespace return std::move(maybe_not_stale).error(); } - ExpectedL GitRegistryEntry::get_version(const Version& version) const + ExpectedL GitRegistryEntry::try_load_port(const Version& version) const { auto it = std::find(last_loaded.port_versions().begin(), last_loaded.port_versions().end(), version); if (it == last_loaded.port_versions().end() && stale) @@ -1174,12 +1182,15 @@ namespace } 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) -> PortLocation { - return { - std::move(p), - Strings::concat("git+", parent.m_repo, "@", git_tree), - }; + return parent.m_paths.git_extract_tree_from_remote_registry(git_tree).then( + [this, &git_tree](Path&& p) -> ExpectedL { + return Paragraphs::try_load_port_required(parent.m_paths.get_filesystem(), + port_name, + PortLocation{ + p, + Strings::concat("git+", parent.m_repo, "@", git_tree), + }) + .maybe_scfl; }); } diff --git a/src/vcpkg/sourceparagraph.cpp b/src/vcpkg/sourceparagraph.cpp index 10ed210821..52ecabaf94 100644 --- a/src/vcpkg/sourceparagraph.cpp +++ b/src/vcpkg/sourceparagraph.cpp @@ -1339,6 +1339,8 @@ namespace vcpkg { ret.feature_paragraphs.push_back(std::make_unique(*feat_ptr)); } + + ret.extra_features_info = extra_features_info; return ret; }