From 43acbb798b85ac2fdcff482d076e2b81dbfa17d6 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Mon, 8 Feb 2021 23:56:10 +0000 Subject: [PATCH 1/2] [vcpkg] Fix failure to install features for non-string, non-relaxed scheme dependencies --- src/vcpkg-test/dependencies.cpp | 75 +++++++++++++++++++++++++++------ src/vcpkg/dependencies.cpp | 48 ++++++++++++--------- 2 files changed, 88 insertions(+), 35 deletions(-) diff --git a/src/vcpkg-test/dependencies.cpp b/src/vcpkg-test/dependencies.cpp index c6241ebe01..696a3ee142 100644 --- a/src/vcpkg-test/dependencies.cpp +++ b/src/vcpkg-test/dependencies.cpp @@ -1069,9 +1069,23 @@ TEST_CASE ("version install scheme change in port version", "[versionplan]") TEST_CASE ("version install simple feature", "[versionplan]") { MockVersionedPortfileProvider vp; - auto a_x = std::make_unique(); - a_x->name = "x"; - vp.emplace("a", {"1", 0}, Scheme::Relaxed).source_control_file->feature_paragraphs.push_back(std::move(a_x)); + { + auto a_x = std::make_unique(); + a_x->name = "x"; + vp.emplace("a", {"1", 0}, Scheme::Relaxed).source_control_file->feature_paragraphs.push_back(std::move(a_x)); + } + { + auto a_x = std::make_unique(); + a_x->name = "x"; + vp.emplace("semver", {"1.0.0", 0}, Scheme::Semver) + .source_control_file->feature_paragraphs.push_back(std::move(a_x)); + } + { + auto a_x = std::make_unique(); + a_x->name = "x"; + vp.emplace("date", {"2020-01-01", 0}, Scheme::Date) + .source_control_file->feature_paragraphs.push_back(std::move(a_x)); + } MockCMakeVarProvider var_provider; @@ -1079,18 +1093,51 @@ TEST_CASE ("version install simple feature", "[versionplan]") { MockBaselineProvider bp; bp.v["a"] = {"1", 0}; + bp.v["semver"] = {"1.0.0", 0}; + bp.v["date"] = {"2020-01-01", 0}; - auto install_plan = unwrap(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 ("relaxed") + { + auto install_plan = unwrap(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 = unwrap(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"}); + } + SECTION ("date") + { + auto install_plan = unwrap(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"}); + } } SECTION ("without baseline") diff --git a/src/vcpkg/dependencies.cpp b/src/vcpkg/dependencies.cpp index 1c084846f6..0f85282eb1 100644 --- a/src/vcpkg/dependencies.cpp +++ b/src/vcpkg/dependencies.cpp @@ -1231,6 +1231,27 @@ namespace vcpkg::Dependencies VersionSchemeInfo* get_node(const Versions::Version& ver); VersionSchemeInfo& emplace_node(Versions::Scheme scheme, const Versions::Version& ver); + + template + void foreach_vsi(F f) + { + if (auto relaxed = this->relaxed.get()) + { + f(**relaxed); + } + if (auto semver = this->semver.get()) + { + f(**semver); + } + if (auto date = this->date.get()) + { + f(**date); + } + for (auto&& vsi : this->exacts) + { + f(vsi.second); + } + } }; std::vector m_roots; @@ -1432,21 +1453,12 @@ namespace vcpkg::Dependencies if (!ref.second.default_features) { ref.second.default_features = true; - - if (auto relaxed = ref.second.relaxed.get()) - { - for (auto&& f : relaxed->get()->scfl->source_control_file->core_paragraph->default_features) - { - add_feature_to(ref, **relaxed, f); - } - } - for (auto&& vsi : ref.second.exacts) - { - for (auto&& f : vsi.second.scfl->source_control_file->core_paragraph->default_features) + ref.second.foreach_vsi([this, &ref](VersionSchemeInfo& vsi) { + for (auto&& f : vsi.scfl->source_control_file->core_paragraph->default_features) { - add_feature_to(ref, vsi.second, f); + this->add_feature_to(ref, vsi, f); } - } + }); } } @@ -1567,14 +1579,8 @@ namespace vcpkg::Dependencies auto inserted = ref.second.features.emplace(feature).second; if (inserted) { - if (auto relaxed = ref.second.relaxed.get()) - { - add_feature_to(ref, **relaxed, feature); - } - for (auto&& vsi : ref.second.exacts) - { - add_feature_to(ref, vsi.second, feature); - } + ref.second.foreach_vsi( + [this, &ref, &feature](VersionSchemeInfo& vsi) { this->add_feature_to(ref, vsi, feature); }); } (void)origin; } From 49cef416cf92f6dc7455cb977cd1d5b83828a437 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Tue, 9 Feb 2021 02:37:55 +0000 Subject: [PATCH 2/2] [vcpkg] Fix warnings --- src/vcpkg/dependencies.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vcpkg/dependencies.cpp b/src/vcpkg/dependencies.cpp index 0f85282eb1..f52b4b7095 100644 --- a/src/vcpkg/dependencies.cpp +++ b/src/vcpkg/dependencies.cpp @@ -1235,17 +1235,17 @@ namespace vcpkg::Dependencies template void foreach_vsi(F f) { - if (auto relaxed = this->relaxed.get()) + if (auto r = this->relaxed.get()) { - f(**relaxed); + f(**r); } - if (auto semver = this->semver.get()) + if (auto s = this->semver.get()) { - f(**semver); + f(**s); } - if (auto date = this->date.get()) + if (auto d = this->date.get()) { - f(**date); + f(**d); } for (auto&& vsi : this->exacts) {