#pragma once #include "PackageSpec.h" #include "StatusParagraphs.h" #include "VcpkgPaths.h" #include "vcpkg_Graphs.h" #include "vcpkg_optional.h" #include namespace vcpkg::Dependencies { enum class RequestType { UNKNOWN, USER_REQUESTED, AUTO_SELECTED }; std::string to_output_string(RequestType request_type, const CStringView s); struct AnyParagraph { std::vector dependencies(const Triplet& triplet) const; Optional status_paragraph; Optional binary_paragraph; Optional source_paragraph; Optional source_control_file; }; } namespace vcpkg::Dependencies { struct FeatureSpec { PackageSpec spec; std::string feature_name; }; struct FeatureNodeEdges { std::vector remove_edges; std::vector build_edges; bool plus = false; }; std::vector to_feature_specs(const std::vector& depends, const Triplet& t); struct Cluster { std::vector status_paragraphs; Optional source_control_file; PackageSpec spec; std::unordered_map edges; std::unordered_set to_install_features; std::unordered_set original_features; bool will_remove = false; bool transient_uninstalled = true; Cluster() = default; private: Cluster(const Cluster&) = delete; Cluster& operator=(const Cluster&) = delete; }; struct ClusterPtr { Cluster* ptr; }; bool operator==(const ClusterPtr& l, const ClusterPtr& r); enum class InstallPlanType { UNKNOWN, BUILD_AND_INSTALL, INSTALL, ALREADY_INSTALLED }; struct InstallPlanAction { static bool compare_by_name(const InstallPlanAction* left, const InstallPlanAction* right); InstallPlanAction(); InstallPlanAction(const PackageSpec& spec, const AnyParagraph& any_paragraph, const RequestType& request_type); InstallPlanAction(const PackageSpec& spec, const SourceControlFile& any_paragraph, const std::unordered_set& features, const RequestType& request_type); InstallPlanAction(const InstallPlanAction&) = delete; InstallPlanAction(InstallPlanAction&&) = default; InstallPlanAction& operator=(const InstallPlanAction&) = delete; InstallPlanAction& operator=(InstallPlanAction&&) = default; PackageSpec spec; AnyParagraph any_paragraph; InstallPlanType plan_type; RequestType request_type; std::unordered_set feature_list; }; enum class RemovePlanType { UNKNOWN, NOT_INSTALLED, REMOVE }; struct RemovePlanAction { static bool compare_by_name(const RemovePlanAction* left, const RemovePlanAction* right); RemovePlanAction(); RemovePlanAction(const PackageSpec& spec, const RemovePlanType& plan_type, const RequestType& request_type); RemovePlanAction(const RemovePlanAction&) = delete; RemovePlanAction(RemovePlanAction&&) = default; RemovePlanAction& operator=(const RemovePlanAction&) = delete; RemovePlanAction& operator=(RemovePlanAction&&) = default; PackageSpec spec; RemovePlanType plan_type; RequestType request_type; }; struct AnyAction { Optional install_plan; Optional remove_plan; }; enum class ExportPlanType { UNKNOWN, PORT_AVAILABLE_BUT_NOT_BUILT, ALREADY_BUILT }; struct ExportPlanAction { static bool compare_by_name(const ExportPlanAction* left, const ExportPlanAction* right); ExportPlanAction(); ExportPlanAction(const PackageSpec& spec, const AnyParagraph& any_paragraph, const RequestType& request_type); ExportPlanAction(const ExportPlanAction&) = delete; ExportPlanAction(ExportPlanAction&&) = default; ExportPlanAction& operator=(const ExportPlanAction&) = delete; ExportPlanAction& operator=(ExportPlanAction&&) = default; PackageSpec spec; AnyParagraph any_paragraph; ExportPlanType plan_type; RequestType request_type; }; __interface PortFileProvider { virtual const SourceControlFile& get_control_file(const PackageSpec& spec) const; }; struct MapPortFile : PortFileProvider { const std::unordered_map& ports; explicit MapPortFile(const std::unordered_map& map); const SourceControlFile& get_control_file(const PackageSpec& spec) const override; }; struct PathsPortFile : PortFileProvider { const VcpkgPaths& ports; mutable std::unordered_map cache; explicit PathsPortFile(const VcpkgPaths& paths); const SourceControlFile& get_control_file(const PackageSpec& spec) const override; private: PathsPortFile(const PathsPortFile&) = delete; PathsPortFile& operator=(const PathsPortFile&) = delete; }; std::vector create_install_plan(const PortFileProvider& port_file_provider, const std::vector& specs, const StatusParagraphs& status_db); std::vector create_remove_plan(const std::vector& specs, const StatusParagraphs& status_db); std::vector create_export_plan(const VcpkgPaths& paths, const std::vector& specs, const StatusParagraphs& status_db); } template<> struct std::hash { size_t operator()(const vcpkg::Dependencies::ClusterPtr& value) const { return std::hash()(value.ptr->spec); } }; namespace vcpkg::Dependencies { struct GraphPlan { Graphs::Graph remove_graph; Graphs::Graph install_graph; }; bool mark_plus(const std::string& feature, Cluster& cluster, std::unordered_map& pkg_to_cluster, GraphPlan& graph_plan); void mark_minus(Cluster& cluster, std::unordered_map& pkg_to_cluster, GraphPlan& graph_plan); std::vector create_feature_install_plan(const std::unordered_map& map, const std::vector& specs, const StatusParagraphs& status_db); }