#pragma once #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 std::set& features, const RequestType& request_type); InstallPlanAction(const PackageSpec& spec, const SourceControlFileLocation& scfl, const std::set& features, const RequestType& request_type, std::vector&& 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::set feature_list; std::vector computed_dependencies; }; 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 AnyAction { AnyAction(InstallPlanAction&& iplan) : install_action(std::move(iplan)) {} AnyAction(RemovePlanAction&& rplan) : remove_action(std::move(rplan)) {} Optional install_action; Optional remove_action; const PackageSpec& spec() const; }; 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(const Triplet& triplet) const; private: Optional m_installed_package; }; struct PortFileProvider { virtual Optional get_control_file(const std::string& src_name) const = 0; virtual std::vector load_all_control_files() const = 0; }; struct MapPortFileProvider : Util::ResourceBase, PortFileProvider { explicit MapPortFileProvider(const std::unordered_map& map); Optional get_control_file(const std::string& src_name) const override; std::vector load_all_control_files() const override; private: const std::unordered_map& ports; }; struct PathsPortFileProvider : Util::ResourceBase, PortFileProvider { explicit PathsPortFileProvider(const vcpkg::VcpkgPaths& paths, const std::vector* ports_dirs_paths); Optional get_control_file(const std::string& src_name) const override; std::vector load_all_control_files() const override; private: Files::Filesystem& filesystem; std::vector ports_dirs; mutable std::unordered_map cache; }; struct ClusterGraph; struct GraphPlan; struct CreateInstallPlanOptions { Graphs::Randomizer* randomizer = nullptr; }; struct PackageGraph { PackageGraph(const PortFileProvider& provider, const StatusParagraphs& status_db); ~PackageGraph(); void install(const FeatureSpec& spec, const std::unordered_set& prevent_default_features = {}) const; void upgrade(const PackageSpec& spec) const; std::vector serialize(const CreateInstallPlanOptions& options = {}) const; private: std::unique_ptr m_graph_plan; std::unique_ptr m_graph; }; 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); std::vector create_feature_install_plan( const std::unordered_map& map, 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. std::vector create_feature_install_plan(const PortFileProvider& provider, const std::vector& specs, const StatusParagraphs& status_db, const CreateInstallPlanOptions& options = {}); void print_plan(const std::vector& action_plan, const bool is_recursive = true, const fs::path& default_ports_dir = ""); }