From ecd21d6cb429a91076c0fc1bb3c6d4af447343e8 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Sat, 11 Nov 2017 19:47:56 -0800 Subject: [PATCH] [vcpkg-tests] Use PCH. [vcpkg-update] Fix feature packages with update command. Fixes #2003. --- toolsrc/include/tests.pch.h | 18 ++++ toolsrc/include/tests.utils.h | 26 ++++++ toolsrc/include/vcpkg/base/sortedvector.h | 2 + toolsrc/include/vcpkg/update.h | 3 +- toolsrc/include/vcpkg/versiont.h | 3 +- toolsrc/src/tests.arguments.cpp | 3 +- toolsrc/src/tests.dependencies.cpp | 4 +- toolsrc/src/tests.packagespec.cpp | 24 +----- toolsrc/src/tests.paragraph.cpp | 6 +- toolsrc/src/tests.pch.cpp | 1 + toolsrc/src/tests.plan.cpp | 60 +------------ toolsrc/src/tests.statusparagraphs.cpp | 7 +- toolsrc/src/tests.update.cpp | 96 +++++++++++++++++++++ toolsrc/src/tests.utils.cpp | 62 +++++++++++++ toolsrc/src/vcpkg/remove.cpp | 7 +- toolsrc/src/vcpkg/update.cpp | 17 ++-- toolsrc/src/vcpkg/versiont.cpp | 13 +-- toolsrc/vcpkgtest/vcpkgtest.vcxproj | 28 ++++-- toolsrc/vcpkgtest/vcpkgtest.vcxproj.filters | 17 ++++ 19 files changed, 279 insertions(+), 118 deletions(-) create mode 100644 toolsrc/include/tests.pch.h create mode 100644 toolsrc/include/tests.utils.h create mode 100644 toolsrc/src/tests.pch.cpp create mode 100644 toolsrc/src/tests.update.cpp create mode 100644 toolsrc/src/tests.utils.cpp diff --git a/toolsrc/include/tests.pch.h b/toolsrc/include/tests.pch.h new file mode 100644 index 000000000..0037af585 --- /dev/null +++ b/toolsrc/include/tests.pch.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/toolsrc/include/tests.utils.h b/toolsrc/include/tests.utils.h new file mode 100644 index 000000000..485b8c294 --- /dev/null +++ b/toolsrc/include/tests.utils.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +#include +#include +#include +#include + +#include + +namespace Microsoft::VisualStudio::CppUnitTestFramework +{ + std::wstring ToString(const vcpkg::Dependencies::InstallPlanType& t); + std::wstring ToString(const vcpkg::Dependencies::RequestType& t); + std::wstring ToString(const vcpkg::PackageSpecParseResult& t); + std::wstring ToString(const vcpkg::PackageSpec& t); +} + +std::unique_ptr make_status_pgh(const char* name, + const char* depends = "", + const char* triplet = "x86-windows"); +std::unique_ptr make_status_feature_pgh(const char* name, + const char* feature, + const char* depends = "", + const char* triplet = "x86-windows"); \ No newline at end of file diff --git a/toolsrc/include/vcpkg/base/sortedvector.h b/toolsrc/include/vcpkg/base/sortedvector.h index 62808cc2f..fbb7e5a5a 100644 --- a/toolsrc/include/vcpkg/base/sortedvector.h +++ b/toolsrc/include/vcpkg/base/sortedvector.h @@ -44,6 +44,8 @@ namespace vcpkg size_type size() const { return this->m_data.size(); } + const T& operator[](int i) const { return this->m_data[i]; } + private: std::vector m_data; }; diff --git a/toolsrc/include/vcpkg/update.h b/toolsrc/include/vcpkg/update.h index e7303d1b0..7587b9eb2 100644 --- a/toolsrc/include/vcpkg/update.h +++ b/toolsrc/include/vcpkg/update.h @@ -16,6 +16,7 @@ namespace vcpkg::Update VersionDiff version_diff; }; - std::vector find_outdated_packages(const VcpkgPaths& paths, const StatusParagraphs& status_db); + std::vector find_outdated_packages(const std::map& src_names_to_versions, + const StatusParagraphs& status_db); void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } \ No newline at end of file diff --git a/toolsrc/include/vcpkg/versiont.h b/toolsrc/include/vcpkg/versiont.h index 67efd8da3..6d8332521 100644 --- a/toolsrc/include/vcpkg/versiont.h +++ b/toolsrc/include/vcpkg/versiont.h @@ -8,8 +8,9 @@ namespace vcpkg VersionT(); VersionT(const std::string& value); - std::string to_string() const; + const std::string& to_string() const; + private: std::string value; }; diff --git a/toolsrc/src/tests.arguments.cpp b/toolsrc/src/tests.arguments.cpp index 0f082222d..c87281fa8 100644 --- a/toolsrc/src/tests.arguments.cpp +++ b/toolsrc/src/tests.arguments.cpp @@ -1,5 +1,4 @@ -#include -#include +#include "tests.pch.h" #pragma comment(lib, "version") #pragma comment(lib, "winhttp") diff --git a/toolsrc/src/tests.dependencies.cpp b/toolsrc/src/tests.dependencies.cpp index 3f6e0dd10..f82fad4e4 100644 --- a/toolsrc/src/tests.dependencies.cpp +++ b/toolsrc/src/tests.dependencies.cpp @@ -1,6 +1,4 @@ -#include -#include -#include +#include "tests.pch.h" #pragma comment(lib, "version") #pragma comment(lib, "winhttp") diff --git a/toolsrc/src/tests.packagespec.cpp b/toolsrc/src/tests.packagespec.cpp index 25498a799..32ad81227 100644 --- a/toolsrc/src/tests.packagespec.cpp +++ b/toolsrc/src/tests.packagespec.cpp @@ -1,32 +1,12 @@ -#include -#include -#include +#include "tests.pch.h" -#include -#include +#include #pragma comment(lib, "version") #pragma comment(lib, "winhttp") using namespace Microsoft::VisualStudio::CppUnitTestFramework; -namespace Microsoft::VisualStudio::CppUnitTestFramework -{ - template<> - inline std::wstring ToString(const vcpkg::PackageSpecParseResult& t) - { - return ToString(static_cast(t)); - } - - template<> - inline std::wstring ToString(const vcpkg::PackageSpec& t) - { - return ToString(t.to_string()); - } -} - -namespace Strings = vcpkg::Strings; - namespace UnitTest1 { using namespace vcpkg; diff --git a/toolsrc/src/tests.paragraph.cpp b/toolsrc/src/tests.paragraph.cpp index 13052610f..9cddd7bdb 100644 --- a/toolsrc/src/tests.paragraph.cpp +++ b/toolsrc/src/tests.paragraph.cpp @@ -1,8 +1,4 @@ -#include -#include -#include - -#include +#include "tests.pch.h" #pragma comment(lib, "version") #pragma comment(lib, "winhttp") diff --git a/toolsrc/src/tests.pch.cpp b/toolsrc/src/tests.pch.cpp new file mode 100644 index 000000000..bdddab76a --- /dev/null +++ b/toolsrc/src/tests.pch.cpp @@ -0,0 +1 @@ +#include "tests.pch.h" diff --git a/toolsrc/src/tests.plan.cpp b/toolsrc/src/tests.plan.cpp index 9cf3cfd8e..122a4ffef 100644 --- a/toolsrc/src/tests.plan.cpp +++ b/toolsrc/src/tests.plan.cpp @@ -1,41 +1,11 @@ -#include -#include +#include "tests.pch.h" -#include +#include using namespace Microsoft::VisualStudio::CppUnitTestFramework; using namespace vcpkg; -namespace Microsoft::VisualStudio::CppUnitTestFramework -{ - template<> - inline std::wstring ToString(const vcpkg::Dependencies::InstallPlanType& t) - { - switch (t) - { - case Dependencies::InstallPlanType::ALREADY_INSTALLED: return L"ALREADY_INSTALLED"; - case Dependencies::InstallPlanType::BUILD_AND_INSTALL: return L"BUILD_AND_INSTALL"; - case Dependencies::InstallPlanType::INSTALL: return L"INSTALL"; - case Dependencies::InstallPlanType::EXCLUDED: return L"EXCLUDED"; - case Dependencies::InstallPlanType::UNKNOWN: return L"UNKNOWN"; - default: return ToString(static_cast(t)); - } - } - - template<> - inline std::wstring ToString(const vcpkg::Dependencies::RequestType& t) - { - switch (t) - { - case Dependencies::RequestType::AUTO_SELECTED: return L"AUTO_SELECTED"; - case Dependencies::RequestType::USER_REQUESTED: return L"USER_REQUESTED"; - case Dependencies::RequestType::UNKNOWN: return L"UNKNOWN"; - default: return ToString(static_cast(t)); - } - } -} - namespace UnitTest1 { static std::unique_ptr make_control_file( @@ -96,32 +66,6 @@ namespace UnitTest1 Assert::AreEqual(pkg_name.c_str(), plan.spec.name().c_str()); } - static std::unique_ptr make_status_pgh(const char* name, - const char* depends = "", - const char* triplet = "x86-windows") - { - using Pgh = std::unordered_map; - return std::make_unique(Pgh{{"Package", name}, - {"Version", "1"}, - {"Architecture", triplet}, - {"Multi-Arch", "same"}, - {"Depends", depends}, - {"Status", "install ok installed"}}); - } - static std::unique_ptr make_status_feature_pgh(const char* name, - const char* feature, - const char* depends = "", - const char* triplet = "x86-windows") - { - using Pgh = std::unordered_map; - return std::make_unique(Pgh{{"Package", name}, - {"Version", "1"}, - {"Feature", feature}, - {"Architecture", triplet}, - {"Multi-Arch", "same"}, - {"Depends", depends}, - {"Status", "install ok installed"}}); - } struct PackageSpecMap { std::unordered_map map; diff --git a/toolsrc/src/tests.statusparagraphs.cpp b/toolsrc/src/tests.statusparagraphs.cpp index 4cc1130b1..ed6eaa764 100644 --- a/toolsrc/src/tests.statusparagraphs.cpp +++ b/toolsrc/src/tests.statusparagraphs.cpp @@ -1,9 +1,4 @@ -#include - -#include -#include -#include -#include +#include "tests.pch.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; diff --git a/toolsrc/src/tests.update.cpp b/toolsrc/src/tests.update.cpp new file mode 100644 index 000000000..06ae797f4 --- /dev/null +++ b/toolsrc/src/tests.update.cpp @@ -0,0 +1,96 @@ +#include "tests.pch.h" + +#include + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +using namespace vcpkg; +using namespace vcpkg::Update; + +namespace UnitTest1 +{ + class UpdateTests : public TestClass + { + TEST_METHOD(find_outdated_packages_basic) + { + std::vector> status_paragraphs; + status_paragraphs.push_back(make_status_pgh("a")); + status_paragraphs.back()->package.version = "2"; + + StatusParagraphs status_db(std::move(status_paragraphs)); + + std::map port_versions; + port_versions["a"] = VersionT("0"); + + auto pkgs = SortedVector(Update::find_outdated_packages(port_versions, status_db), + &OutdatedPackage::compare_by_name); + + Assert::AreEqual(size_t(1), pkgs.size()); + Assert::AreEqual("2", pkgs[0].version_diff.left.to_string().c_str()); + Assert::AreEqual("0", pkgs[0].version_diff.right.to_string().c_str()); + } + + TEST_METHOD(find_outdated_packages_features) + { + std::vector> status_paragraphs; + status_paragraphs.push_back(make_status_pgh("a")); + status_paragraphs.back()->package.version = "2"; + + status_paragraphs.push_back(make_status_feature_pgh("a", "b")); + status_paragraphs.back()->package.version = "2"; + + StatusParagraphs status_db(std::move(status_paragraphs)); + + std::map port_versions; + port_versions["a"] = VersionT("0"); + + auto pkgs = SortedVector(Update::find_outdated_packages(port_versions, status_db), + &OutdatedPackage::compare_by_name); + + Assert::AreEqual(size_t(1), pkgs.size()); + Assert::AreEqual("2", pkgs[0].version_diff.left.to_string().c_str()); + Assert::AreEqual("0", pkgs[0].version_diff.right.to_string().c_str()); + } + + TEST_METHOD(find_outdated_packages_features_2) + { + std::vector> status_paragraphs; + status_paragraphs.push_back(make_status_pgh("a")); + status_paragraphs.back()->package.version = "2"; + + status_paragraphs.push_back(make_status_feature_pgh("a", "b")); + status_paragraphs.back()->package.version = "0"; + status_paragraphs.back()->state = InstallState::NOT_INSTALLED; + status_paragraphs.back()->want = Want::PURGE; + + StatusParagraphs status_db(std::move(status_paragraphs)); + + std::map port_versions; + port_versions["a"] = VersionT("0"); + + auto pkgs = SortedVector(Update::find_outdated_packages(port_versions, status_db), + &OutdatedPackage::compare_by_name); + + Assert::AreEqual(size_t(1), pkgs.size()); + Assert::AreEqual("2", pkgs[0].version_diff.left.to_string().c_str()); + Assert::AreEqual("0", pkgs[0].version_diff.right.to_string().c_str()); + } + + TEST_METHOD(find_outdated_packages_none) + { + std::vector> status_paragraphs; + status_paragraphs.push_back(make_status_pgh("a")); + status_paragraphs.back()->package.version = "2"; + + StatusParagraphs status_db(std::move(status_paragraphs)); + + std::map port_versions; + port_versions["a"] = VersionT("2"); + + auto pkgs = SortedVector(Update::find_outdated_packages(port_versions, status_db), + &OutdatedPackage::compare_by_name); + + Assert::AreEqual(size_t(0), pkgs.size()); + } + }; +} diff --git a/toolsrc/src/tests.utils.cpp b/toolsrc/src/tests.utils.cpp new file mode 100644 index 000000000..b9fb51a59 --- /dev/null +++ b/toolsrc/src/tests.utils.cpp @@ -0,0 +1,62 @@ +#include "tests.pch.h" + +#include "tests.utils.h" + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; +using namespace vcpkg; + +namespace Microsoft::VisualStudio::CppUnitTestFramework +{ + std::wstring ToString(const vcpkg::Dependencies::InstallPlanType& t) + { + switch (t) + { + case Dependencies::InstallPlanType::ALREADY_INSTALLED: return L"ALREADY_INSTALLED"; + case Dependencies::InstallPlanType::BUILD_AND_INSTALL: return L"BUILD_AND_INSTALL"; + case Dependencies::InstallPlanType::INSTALL: return L"INSTALL"; + case Dependencies::InstallPlanType::EXCLUDED: return L"EXCLUDED"; + case Dependencies::InstallPlanType::UNKNOWN: return L"UNKNOWN"; + default: return ToString(static_cast(t)); + } + } + + std::wstring ToString(const vcpkg::Dependencies::RequestType& t) + { + switch (t) + { + case Dependencies::RequestType::AUTO_SELECTED: return L"AUTO_SELECTED"; + case Dependencies::RequestType::USER_REQUESTED: return L"USER_REQUESTED"; + case Dependencies::RequestType::UNKNOWN: return L"UNKNOWN"; + default: return ToString(static_cast(t)); + } + } + + std::wstring ToString(const vcpkg::PackageSpecParseResult& t) { return ToString(static_cast(t)); } + + std::wstring ToString(const vcpkg::PackageSpec& t) { return ToString(t.to_string()); } +} + +std::unique_ptr make_status_pgh(const char* name, const char* depends, const char* triplet) +{ + using Pgh = std::unordered_map; + return std::make_unique(Pgh{{"Package", name}, + {"Version", "1"}, + {"Architecture", triplet}, + {"Multi-Arch", "same"}, + {"Depends", depends}, + {"Status", "install ok installed"}}); +} +std::unique_ptr make_status_feature_pgh(const char* name, + const char* feature, + const char* depends, + const char* triplet) +{ + using Pgh = std::unordered_map; + return std::make_unique(Pgh{{"Package", name}, + {"Version", "1"}, + {"Feature", feature}, + {"Architecture", triplet}, + {"Multi-Arch", "same"}, + {"Depends", depends}, + {"Status", "install ok installed"}}); +} diff --git a/toolsrc/src/vcpkg/remove.cpp b/toolsrc/src/vcpkg/remove.cpp index 7f40fb16e..8ae0bc881 100644 --- a/toolsrc/src/vcpkg/remove.cpp +++ b/toolsrc/src/vcpkg/remove.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -206,8 +207,10 @@ namespace vcpkg::Remove System::println(System::Color::error, "Error: 'remove' accepts either libraries or '--outdated'"); Checks::exit_fail(VCPKG_LINE_INFO); } - specs = Util::fmap(Update::find_outdated_packages(paths, status_db), - [](auto&& outdated) { return outdated.spec; }); + specs = Util::fmap( + Update::find_outdated_packages( + Paragraphs::load_all_port_names_and_versions(paths.get_filesystem(), paths.ports), status_db), + [](auto&& outdated) { return outdated.spec; }); if (specs.empty()) { diff --git a/toolsrc/src/vcpkg/update.cpp b/toolsrc/src/vcpkg/update.cpp index 61a3f89c5..29baef91e 100644 --- a/toolsrc/src/vcpkg/update.cpp +++ b/toolsrc/src/vcpkg/update.cpp @@ -14,15 +14,20 @@ namespace vcpkg::Update return left.spec.name() < right.spec.name(); } - std::vector find_outdated_packages(const VcpkgPaths& paths, const StatusParagraphs& status_db) + std::vector find_outdated_packages(const std::map& src_names_to_versions, + const StatusParagraphs& status_db) { - const std::map src_names_to_versions = - Paragraphs::load_all_port_names_and_versions(paths.get_filesystem(), paths.ports); const std::vector installed_packages = get_installed_ports(status_db); std::vector output; for (const StatusParagraph* pgh : installed_packages) { + if (!pgh->package.feature.empty()) + { + // Skip feature packages; only consider master packages for needing updates. + continue; + } + const auto it = src_names_to_versions.find(pgh->package.spec.name()); if (it == src_names_to_versions.end()) { @@ -53,8 +58,10 @@ namespace vcpkg::Update const StatusParagraphs status_db = database_load_check(paths); - const auto outdated_packages = - SortedVector(find_outdated_packages(paths, status_db), &OutdatedPackage::compare_by_name); + const auto outdated_packages = SortedVector( + find_outdated_packages(Paragraphs::load_all_port_names_and_versions(paths.get_filesystem(), paths.ports), + status_db), + &OutdatedPackage::compare_by_name); if (outdated_packages.empty()) { diff --git a/toolsrc/src/vcpkg/versiont.cpp b/toolsrc/src/vcpkg/versiont.cpp index 1c52d674a..91f7e23ef 100644 --- a/toolsrc/src/vcpkg/versiont.cpp +++ b/toolsrc/src/vcpkg/versiont.cpp @@ -7,13 +7,16 @@ namespace vcpkg { VersionT::VersionT() : value("0.0.0") {} VersionT::VersionT(const std::string& value) : value(value) {} - std::string VersionT::to_string() const { return value; } - bool operator==(const VersionT& left, const VersionT& right) { return left.value == right.value; } - bool operator!=(const VersionT& left, const VersionT& right) { return left.value != right.value; } - std::string to_printf_arg(const VersionT& version) { return version.value; } + const std::string& VersionT::to_string() const { return value; } + bool operator==(const VersionT& left, const VersionT& right) { return left.to_string() == right.to_string(); } + bool operator!=(const VersionT& left, const VersionT& right) { return left.to_string() != right.to_string(); } + std::string to_printf_arg(const VersionT& version) { return version.to_string(); } VersionDiff::VersionDiff() : left(), right() {} VersionDiff::VersionDiff(const VersionT& left, const VersionT& right) : left(left), right(right) {} - std::string VersionDiff::to_string() const { return Strings::format("%s -> %s", left.value, right.value); } + std::string VersionDiff::to_string() const + { + return Strings::format("%s -> %s", left.to_string(), right.to_string()); + } } diff --git a/toolsrc/vcpkgtest/vcpkgtest.vcxproj b/toolsrc/vcpkgtest/vcpkgtest.vcxproj index 88dc14a75..9eafc1ada 100644 --- a/toolsrc/vcpkgtest/vcpkgtest.vcxproj +++ b/toolsrc/vcpkgtest/vcpkgtest.vcxproj @@ -23,14 +23,26 @@ + + Create + Create + Create + Create + + + {b98c92b7-2874-4537-9d46-d14e5c237f04} + + + + {F27B8DB0-1279-4AF8-A2E3-1D49C4F0220D} Win32Proj @@ -93,13 +105,13 @@ - NotUsing + Use Level3 Disabled ..\include;$(VCInstallDir)UnitTest\include;$(VsInstallRoot)\VC\Auxiliary\VS\UnitTest\include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;%(PreprocessorDefinitions) true - + tests.pch.h /std:c++latest %(AdditionalOptions) true false @@ -111,13 +123,13 @@ - NotUsing + Use Level4 Disabled ..\include;$(VCInstallDir)UnitTest\include;$(VsInstallRoot)\VC\Auxiliary\VS\UnitTest\include;%(AdditionalIncludeDirectories) _DEBUG;%(PreprocessorDefinitions) true - + tests.pch.h /std:c++latest %(AdditionalOptions) true false @@ -130,14 +142,14 @@ Level3 - NotUsing + Use MaxSpeed true true ..\include;$(VCInstallDir)UnitTest\include;$(VsInstallRoot)\VC\Auxiliary\VS\UnitTest\include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;%(PreprocessorDefinitions) true - + tests.pch.h /std:c++latest %(AdditionalOptions) true @@ -151,14 +163,14 @@ Level3 - NotUsing + Use MaxSpeed true true ..\include;$(VCInstallDir)UnitTest\include;$(VsInstallRoot)\VC\Auxiliary\VS\UnitTest\include;%(AdditionalIncludeDirectories) NDEBUG;%(PreprocessorDefinitions) true - + tests.pch.h /std:c++latest %(AdditionalOptions) true diff --git a/toolsrc/vcpkgtest/vcpkgtest.vcxproj.filters b/toolsrc/vcpkgtest/vcpkgtest.vcxproj.filters index 217c5b608..2121f9782 100644 --- a/toolsrc/vcpkgtest/vcpkgtest.vcxproj.filters +++ b/toolsrc/vcpkgtest/vcpkgtest.vcxproj.filters @@ -33,5 +33,22 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + \ No newline at end of file