#pragma once #include #include #include #include #include #include #include #include #include #include namespace vcpkg::Graphs { struct Randomizer; } namespace vcpkg::Dependencies { enum class RequestType { UNKNOWN, USER_REQUESTED, AUTO_SELECTED }; std::string to_output_string(RequestType request_type, const CStringView s, const Build::BuildPackageOptions& options); std::string to_output_string(RequestType request_type, const CStringView s); enum class InstallPlanType { UNKNOWN, BUILD_AND_INSTALL, ALREADY_INSTALLED, EXCLUDED }; struct InstallPlanAction : Util::MoveOnlyBase { static bool compare_by_name(const InstallPlanAction* left, const InstallPlanAction* right); InstallPlanAction() noexcept; InstallPlanAction(InstalledPackageView&& spghs, const RequestType& request_type); InstallPlanAction(const PackageSpec& spec, const SourceControlFileLocation& scfl, const RequestType& request_type, std::unordered_map>&& dependencies); std::string displayname() const; PackageSpec spec; Optional source_control_file_location; Optional installed_package; InstallPlanType plan_type; RequestType request_type; Build::BuildPackageOptions build_options; std::unordered_map> feature_dependencies; std::vector package_dependencies; std::vector feature_list; }; enum class RemovePlanType { UNKNOWN, NOT_INSTALLED, REMOVE }; struct RemovePlanAction : Util::MoveOnlyBase { static bool compare_by_name(const RemovePlanAction* left, const RemovePlanAction* right); RemovePlanAction() noexcept; RemovePlanAction(const PackageSpec& spec, const RemovePlanType& plan_type, const RequestType& request_type); PackageSpec spec; RemovePlanType plan_type; RequestType request_type; }; struct ActionPlan { bool empty() const { return remove_actions.empty() && already_installed.empty() && install_actions.empty(); } size_t size() const { return remove_actions.size() + already_installed.size() + install_actions.size(); } std::vector remove_actions; std::vector already_installed; std::vector install_actions; }; enum class ExportPlanType { UNKNOWN, NOT_BUILT, ALREADY_BUILT }; struct ExportPlanAction : Util::MoveOnlyBase { static bool compare_by_name(const ExportPlanAction* left, const ExportPlanAction* right); ExportPlanAction() noexcept; ExportPlanAction(const PackageSpec& spec, InstalledPackageView&& installed_package, const RequestType& request_type); ExportPlanAction(const PackageSpec& spec, const RequestType& request_type); PackageSpec spec; ExportPlanType plan_type; RequestType request_type; Optional core_paragraph() const; std::vector dependencies(Triplet triplet) const; private: Optional m_installed_package; }; struct ClusterGraph; struct CreateInstallPlanOptions { Graphs::Randomizer* randomizer = nullptr; }; std::vector create_remove_plan(const std::vector& specs, const StatusParagraphs& status_db); std::vector create_export_plan(const std::vector& specs, const StatusParagraphs& status_db); /// Figure out which actions are required to install features specifications in `specs`. /// Contains the ports of the current environment. /// Feature specifications to resolve dependencies for. /// Status of installed packages in the current environment. ActionPlan create_feature_install_plan(const PortFileProvider::PortFileProvider& provider, const CMakeVars::CMakeVarProvider& var_provider, const std::vector& specs, const StatusParagraphs& status_db, const CreateInstallPlanOptions& options = {}); ActionPlan create_upgrade_plan(const PortFileProvider::PortFileProvider& provider, const CMakeVars::CMakeVarProvider& var_provider, const std::vector& specs, const StatusParagraphs& status_db, const CreateInstallPlanOptions& options = {}); void print_plan(const ActionPlan& action_plan, const bool is_recursive = true, const fs::path& default_ports_dir = ""); }