diff options
Diffstat (limited to 'toolsrc/include')
| -rw-r--r-- | toolsrc/include/pch.h | 1 | ||||
| -rw-r--r-- | toolsrc/include/tests.pch.h | 1 | ||||
| -rw-r--r-- | toolsrc/include/tests.utils.h | 16 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/base/chrono.h | 50 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/base/graphs.h | 155 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/base/optional.h | 6 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/build.h | 23 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/commands.h | 7 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/dependencies.h | 55 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/globalstate.h | 6 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/install.h | 4 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/packagespec.h | 11 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/paragraphs.h | 3 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/update.h | 6 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/userconfig.h | 20 |
15 files changed, 214 insertions, 150 deletions
diff --git a/toolsrc/include/pch.h b/toolsrc/include/pch.h index 5c31fbbd1..683bef171 100644 --- a/toolsrc/include/pch.h +++ b/toolsrc/include/pch.h @@ -41,6 +41,7 @@ #include <map> #include <memory> #include <mutex> +#include <random> #include <regex> #include <set> #include <stdexcept> diff --git a/toolsrc/include/tests.pch.h b/toolsrc/include/tests.pch.h index 0037af585..5c00fca4a 100644 --- a/toolsrc/include/tests.pch.h +++ b/toolsrc/include/tests.pch.h @@ -2,6 +2,7 @@ #include <CppUnitTest.h> +#include <vcpkg/base/chrono.h> #include <vcpkg/base/sortedvector.h> #include <vcpkg/base/strings.h> #include <vcpkg/base/util.h> diff --git a/toolsrc/include/tests.utils.h b/toolsrc/include/tests.utils.h index 485b8c294..0c0add7ab 100644 --- a/toolsrc/include/tests.utils.h +++ b/toolsrc/include/tests.utils.h @@ -23,4 +23,18 @@ std::unique_ptr<vcpkg::StatusParagraph> make_status_pgh(const char* name, std::unique_ptr<vcpkg::StatusParagraph> make_status_feature_pgh(const char* name, const char* feature, const char* depends = "", - const char* triplet = "x86-windows");
\ No newline at end of file + const char* triplet = "x86-windows"); + +template<class T, class S> +T&& unwrap(vcpkg::ExpectedT<T, S>&& p) +{ + Assert::IsTrue(p.has_value()); + return std::move(*p.get()); +} + +template<class T> +T&& unwrap(vcpkg::Optional<T>&& opt) +{ + Assert::IsTrue(opt.has_value()); + return std::move(*opt.get()); +} diff --git a/toolsrc/include/vcpkg/base/chrono.h b/toolsrc/include/vcpkg/base/chrono.h index b525852f2..4291115f7 100644 --- a/toolsrc/include/vcpkg/base/chrono.h +++ b/toolsrc/include/vcpkg/base/chrono.h @@ -2,27 +2,65 @@ #include <chrono> #include <string> +#include <time.h> +#include <vcpkg/base/optional.h> namespace vcpkg::Chrono { class ElapsedTime { - public: - static ElapsedTime create_started(); + using duration = std::chrono::high_resolution_clock::time_point::duration; - constexpr ElapsedTime() : m_start_tick() {} + public: + constexpr ElapsedTime() : m_duration() {} + constexpr ElapsedTime(duration d) : m_duration(d) {} template<class TimeUnit> - TimeUnit elapsed() const + TimeUnit as() const + { + return std::chrono::duration_cast<TimeUnit>(m_duration); + } + + std::string to_string() const; + + private: + std::chrono::high_resolution_clock::time_point::duration m_duration; + }; + + class ElapsedTimer + { + public: + static ElapsedTimer create_started(); + + constexpr ElapsedTimer() : m_start_tick() {} + + ElapsedTime elapsed() const { - return std::chrono::duration_cast<TimeUnit>(std::chrono::high_resolution_clock::now() - this->m_start_tick); + return ElapsedTime(std::chrono::high_resolution_clock::now() - this->m_start_tick); } - double microseconds() const { return elapsed<std::chrono::duration<double, std::micro>>().count(); } + double microseconds() const { return elapsed().as<std::chrono::duration<double, std::micro>>().count(); } std::string to_string() const; private: std::chrono::high_resolution_clock::time_point m_start_tick; }; + + class CTime + { + public: + static Optional<CTime> get_current_date_time(); + static Optional<CTime> parse(CStringView str); + + constexpr CTime() : m_tm{0} {} + explicit constexpr CTime(tm t) : m_tm{t} {} + + std::string to_string() const; + + std::chrono::system_clock::time_point to_time_point() const; + + private: + mutable tm m_tm; + }; } diff --git a/toolsrc/include/vcpkg/base/graphs.h b/toolsrc/include/vcpkg/base/graphs.h index b585d2bb9..bd22bbcb0 100644 --- a/toolsrc/include/vcpkg/base/graphs.h +++ b/toolsrc/include/vcpkg/base/graphs.h @@ -4,6 +4,7 @@ #include <unordered_set> #include <vcpkg/base/checks.h> +#include <vcpkg/base/span.h> namespace vcpkg::Graphs { @@ -23,139 +24,97 @@ namespace vcpkg::Graphs struct AdjacencyProvider { virtual std::vector<V> adjacency_list(const U& vertex) const = 0; - + virtual std::string to_string(const V& vertex) const = 0; virtual U load_vertex_data(const V& vertex) const = 0; }; - template<class V, class U> - static void topological_sort_internal(const V& vertex, - const AdjacencyProvider<V, U>& f, - std::unordered_map<V, ExplorationStatus>& exploration_status, - std::vector<U>& sorted) + namespace details { - ExplorationStatus& status = exploration_status[vertex]; - switch (status) + template<class V, class U> + void topological_sort_internal(const V& vertex, + const AdjacencyProvider<V, U>& f, + std::unordered_map<V, ExplorationStatus>& exploration_status, + std::vector<U>& sorted) { - case ExplorationStatus::FULLY_EXPLORED: return; - case ExplorationStatus::PARTIALLY_EXPLORED: Checks::exit_with_message(VCPKG_LINE_INFO, "cycle in graph"); - case ExplorationStatus::NOT_EXPLORED: + ExplorationStatus& status = exploration_status[vertex]; + switch (status) { - status = ExplorationStatus::PARTIALLY_EXPLORED; - U vertex_data = f.load_vertex_data(vertex); - for (const V& neighbour : f.adjacency_list(vertex_data)) - topological_sort_internal(neighbour, f, exploration_status, sorted); - - sorted.push_back(std::move(vertex_data)); - status = ExplorationStatus::FULLY_EXPLORED; - return; + case ExplorationStatus::FULLY_EXPLORED: return; + case ExplorationStatus::PARTIALLY_EXPLORED: + { + System::println("Cycle detected within graph:"); + for (auto&& node : exploration_status) + { + if (node.second == ExplorationStatus::PARTIALLY_EXPLORED) + { + System::println(" %s", f.to_string(node.first)); + } + } + Checks::exit_fail(VCPKG_LINE_INFO); + } + case ExplorationStatus::NOT_EXPLORED: + { + status = ExplorationStatus::PARTIALLY_EXPLORED; + U vertex_data = f.load_vertex_data(vertex); + for (const V& neighbour : f.adjacency_list(vertex_data)) + topological_sort_internal(neighbour, f, exploration_status, sorted); + + sorted.push_back(std::move(vertex_data)); + status = ExplorationStatus::FULLY_EXPLORED; + return; + } + default: Checks::unreachable(VCPKG_LINE_INFO); } - default: Checks::unreachable(VCPKG_LINE_INFO); } } - template<class V, class U> - std::vector<U> topological_sort(const std::vector<V>& starting_vertices, const AdjacencyProvider<V, U>& f) + template<class VertexRange, class V, class U> + std::vector<U> topological_sort(const VertexRange& starting_vertices, const AdjacencyProvider<V, U>& f) { std::vector<U> sorted; std::unordered_map<V, ExplorationStatus> exploration_status; - for (auto& vertex : starting_vertices) + for (auto&& vertex : starting_vertices) { - topological_sort_internal(vertex, f, exploration_status, sorted); + details::topological_sort_internal(vertex, f, exploration_status, sorted); } return sorted; } template<class V> - struct GraphAdjacencyProvider final : AdjacencyProvider<V, V> - { - const std::unordered_map<V, std::unordered_set<V>>& vertices; - - GraphAdjacencyProvider(const std::unordered_map<V, std::unordered_set<V>>& vertices) : vertices(vertices) {} - - std::vector<V> adjacency_list(const V& vertex) const override - { - const std::unordered_set<V>& as_set = this->vertices.at(vertex); - return std::vector<V>(as_set.cbegin(), as_set.cend()); // TODO: Avoid redundant copy - } - - V load_vertex_data(const V& vertex) const override { return vertex; } - }; - - template<class V> - struct Graph + struct Graph final : AdjacencyProvider<V, V> { public: - void add_vertex(V v) { this->vertices[v]; } + void add_vertex(const V& v) { this->m_edges[v]; } - // TODO: Change with iterators - void add_vertices(const std::vector<V>& vs) + void add_edge(const V& u, const V& v) { - for (const V& v : vs) - { - this->vertices[v]; - } + this->m_edges[v]; + this->m_edges[u].insert(v); } - void add_edge(V u, V v) + std::vector<V> vertex_list() const { - this->vertices[v]; - this->vertices[u].insert(v); + std::vector<V> vertex_list; + for (auto&& vertex : this->m_edges) + vertex_list.emplace_back(vertex.first); + return vertex_list; } - std::vector<V> topological_sort() const + std::vector<V> adjacency_list(const V& vertex) const override { - GraphAdjacencyProvider<V> adjacency_provider{this->vertices}; - std::unordered_map<V, int> indegrees = count_indegrees(); - - std::vector<V> sorted; - sorted.reserve(indegrees.size()); - - std::unordered_map<V, ExplorationStatus> exploration_status; - exploration_status.reserve(indegrees.size()); - - for (auto& pair : indegrees) - { - if (pair.second == 0) // Starting from vertices with indegree == 0. Not required. - { - V vertex = pair.first; - topological_sort_internal(vertex, adjacency_provider, exploration_status, sorted); - } - } - - return sorted; + const std::unordered_set<V>& as_set = this->m_edges.at(vertex); + return std::vector<V>(as_set.cbegin(), as_set.cend()); // TODO: Avoid redundant copy } - std::unordered_map<V, int> count_indegrees() const - { - std::unordered_map<V, int> indegrees; - - for (auto& pair : this->vertices) - { - indegrees[pair.first]; - for (V neighbour : pair.second) - { - ++indegrees[neighbour]; - } - } - - return indegrees; - } + V load_vertex_data(const V& vertex) const override { return vertex; } - const std::unordered_map<V, std::unordered_set<V>>& adjacency_list() const { return this->vertices; } - std::vector<V> vertex_list() const - { - // why no &? it returns 0 - std::vector<V> vertex_list; - for (const auto& vertex : this->vertices) - { - vertex_list.emplace_back(vertex.first); - } - return vertex_list; - } + // Note: this function indicates how tied this template is to the exact type it will be templated upon. + // Possible fix: This type shouldn't implement to_string() and should instead be derived from? + std::string to_string(const V& spec) const override { return spec->spec.to_string(); } private: - std::unordered_map<V, std::unordered_set<V>> vertices; + std::unordered_map<V, std::unordered_set<V>> m_edges; }; } diff --git a/toolsrc/include/vcpkg/base/optional.h b/toolsrc/include/vcpkg/base/optional.h index aa9e480fd..af2d297a6 100644 --- a/toolsrc/include/vcpkg/base/optional.h +++ b/toolsrc/include/vcpkg/base/optional.h @@ -53,10 +53,8 @@ namespace vcpkg // Constructors are intentionally implicit constexpr Optional(NullOpt) {} - Optional(const T& t) : m_base(t) {} - - template<class = std::enable_if_t<!std::is_reference<T>::value>> - Optional(T&& t) : m_base(std::move(t)) + template<class U> + Optional(U&& t) : m_base(std::forward<U>(t)) { } diff --git a/toolsrc/include/vcpkg/build.h b/toolsrc/include/vcpkg/build.h index 18408e207..e3f8bf79e 100644 --- a/toolsrc/include/vcpkg/build.h +++ b/toolsrc/include/vcpkg/build.h @@ -114,39 +114,24 @@ namespace vcpkg::Build struct BuildPackageConfig { - BuildPackageConfig(const SourceParagraph& src, - const Triplet& triplet, - fs::path&& port_dir, - const BuildPackageOptions& build_package_options) - : src(src) - , scf(nullptr) - , triplet(triplet) - , port_dir(std::move(port_dir)) - , build_package_options(build_package_options) - , feature_list(nullptr) - { - } - BuildPackageConfig(const SourceControlFile& src, const Triplet& triplet, fs::path&& port_dir, const BuildPackageOptions& build_package_options, const std::unordered_set<std::string>& feature_list) - : src(*src.core_paragraph) - , scf(&src) + : scf(src) , triplet(triplet) , port_dir(std::move(port_dir)) , build_package_options(build_package_options) - , feature_list(&feature_list) + , feature_list(feature_list) { } - const SourceParagraph& src; - const SourceControlFile* scf; + const SourceControlFile& scf; const Triplet& triplet; fs::path port_dir; const BuildPackageOptions& build_package_options; - const std::unordered_set<std::string>* feature_list; + const std::unordered_set<std::string>& feature_list; }; ExtendedBuildResult build_package(const VcpkgPaths& paths, diff --git a/toolsrc/include/vcpkg/commands.h b/toolsrc/include/vcpkg/commands.h index 74fd80c03..c82f504e0 100644 --- a/toolsrc/include/vcpkg/commands.h +++ b/toolsrc/include/vcpkg/commands.h @@ -39,6 +39,12 @@ namespace vcpkg::Commands void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } + namespace Upgrade + { + extern const CommandStructure COMMAND_STRUCTURE; + void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet); + } + namespace Edit { extern const CommandStructure COMMAND_STRUCTURE; @@ -98,6 +104,7 @@ namespace vcpkg::Commands namespace Version { + const char* base_version(); const std::string& version(); void warn_if_vcpkg_version_mismatch(const VcpkgPaths& paths); void perform_and_exit(const VcpkgCmdArguments& args); diff --git a/toolsrc/include/vcpkg/dependencies.h b/toolsrc/include/vcpkg/dependencies.h index 5411ee166..8902a7b08 100644 --- a/toolsrc/include/vcpkg/dependencies.h +++ b/toolsrc/include/vcpkg/dependencies.h @@ -1,6 +1,5 @@ #pragma once -#include <vcpkg/base/graphs.h> #include <vcpkg/base/optional.h> #include <vcpkg/base/util.h> #include <vcpkg/build.h> @@ -30,7 +29,6 @@ namespace vcpkg::Dependencies Optional<StatusParagraph> status_paragraph; Optional<BinaryControlFile> binary_control_file; - Optional<SourceParagraph> source_paragraph; Optional<const SourceControlFile*> source_control_file; }; } @@ -92,11 +90,11 @@ namespace vcpkg::Dependencies struct AnyAction { - AnyAction(InstallPlanAction&& iplan) : install_plan(std::move(iplan)) {} - AnyAction(RemovePlanAction&& rplan) : remove_plan(std::move(rplan)) {} + AnyAction(InstallPlanAction&& iplan) : install_action(std::move(iplan)) {} + AnyAction(RemovePlanAction&& rplan) : remove_action(std::move(rplan)) {} - Optional<InstallPlanAction> install_plan; - Optional<RemovePlanAction> remove_plan; + Optional<InstallPlanAction> install_action; + Optional<RemovePlanAction> remove_action; const PackageSpec& spec() const; }; @@ -123,22 +121,44 @@ namespace vcpkg::Dependencies struct PortFileProvider { - virtual const SourceControlFile& get_control_file(const std::string& spec) const = 0; + virtual Optional<const SourceControlFile&> get_control_file(const std::string& src_name) const = 0; }; - struct MapPortFile : Util::ResourceBase, PortFileProvider + struct MapPortFileProvider : Util::ResourceBase, PortFileProvider { + explicit MapPortFileProvider(const std::unordered_map<std::string, SourceControlFile>& map); + Optional<const SourceControlFile&> get_control_file(const std::string& src_name) const override; + + private: const std::unordered_map<std::string, SourceControlFile>& ports; - explicit MapPortFile(const std::unordered_map<std::string, SourceControlFile>& map); - const SourceControlFile& get_control_file(const std::string& spec) const override; }; - struct PathsPortFile : Util::ResourceBase, PortFileProvider + struct PathsPortFileProvider : Util::ResourceBase, PortFileProvider { + explicit PathsPortFileProvider(const VcpkgPaths& paths); + Optional<const SourceControlFile&> get_control_file(const std::string& src_name) const override; + + private: const VcpkgPaths& ports; mutable std::unordered_map<std::string, SourceControlFile> cache; - explicit PathsPortFile(const VcpkgPaths& paths); - const SourceControlFile& get_control_file(const std::string& spec) const override; + }; + + struct ClusterGraph; + struct GraphPlan; + + struct PackageGraph + { + PackageGraph(const PortFileProvider& provider, const StatusParagraphs& status_db); + ~PackageGraph(); + + void install(const FeatureSpec& spec); + void upgrade(const PackageSpec& spec); + + std::vector<AnyAction> serialize() const; + + private: + std::unique_ptr<GraphPlan> m_graph_plan; + std::unique_ptr<ClusterGraph> m_graph; }; std::vector<InstallPlanAction> create_install_plan(const PortFileProvider& port_file_provider, @@ -148,11 +168,18 @@ namespace vcpkg::Dependencies std::vector<RemovePlanAction> create_remove_plan(const std::vector<PackageSpec>& specs, const StatusParagraphs& status_db); - std::vector<ExportPlanAction> create_export_plan(const VcpkgPaths& paths, + std::vector<ExportPlanAction> create_export_plan(const PortFileProvider& port_file_provider, + const VcpkgPaths& paths, const std::vector<PackageSpec>& specs, const StatusParagraphs& status_db); std::vector<AnyAction> create_feature_install_plan(const std::unordered_map<std::string, SourceControlFile>& map, const std::vector<FeatureSpec>& specs, const StatusParagraphs& status_db); + + std::vector<AnyAction> create_feature_install_plan(const PortFileProvider& port_file_provider, + const std::vector<FeatureSpec>& specs, + const StatusParagraphs& status_db); + + void print_plan(const std::vector<AnyAction>& action_plan, const bool is_recursive = true); } diff --git a/toolsrc/include/vcpkg/globalstate.h b/toolsrc/include/vcpkg/globalstate.h index 7cea361cf..360d3f43e 100644 --- a/toolsrc/include/vcpkg/globalstate.h +++ b/toolsrc/include/vcpkg/globalstate.h @@ -9,11 +9,13 @@ namespace vcpkg { struct GlobalState { - static Util::LockGuarded<Chrono::ElapsedTime> timer; + static Util::LockGuarded<Chrono::ElapsedTimer> timer; + static Util::LockGuarded<std::string> g_surveydate; + static std::atomic<bool> debugging; static std::atomic<bool> feature_packages; static std::atomic<int> g_init_console_cp; static std::atomic<int> g_init_console_output_cp; }; -}
\ No newline at end of file +} diff --git a/toolsrc/include/vcpkg/install.h b/toolsrc/include/vcpkg/install.h index 28896adee..2e92764dc 100644 --- a/toolsrc/include/vcpkg/install.h +++ b/toolsrc/include/vcpkg/install.h @@ -1,5 +1,6 @@ #pragma once +#include <vcpkg/base/chrono.h> #include <vcpkg/build.h> #include <vcpkg/dependencies.h> #include <vcpkg/vcpkgcmdarguments.h> @@ -25,7 +26,7 @@ namespace vcpkg::Install PackageSpec spec; Build::ExtendedBuildResult build_result; - std::string timing; + vcpkg::Chrono::ElapsedTime timing; const Dependencies::AnyAction* action; }; @@ -36,6 +37,7 @@ namespace vcpkg::Install std::string total_elapsed_time; void print() const; + std::string xunit_results() const; }; struct InstallDir diff --git a/toolsrc/include/vcpkg/packagespec.h b/toolsrc/include/vcpkg/packagespec.h index 0487ae6b8..f1119e2f3 100644 --- a/toolsrc/include/vcpkg/packagespec.h +++ b/toolsrc/include/vcpkg/packagespec.h @@ -22,6 +22,10 @@ namespace vcpkg static std::vector<PackageSpec> to_package_specs(const std::vector<std::string>& ports, const Triplet& triplet); + static std::vector<PackageSpec> from_dependencies_of_port(const std::string& port, + const std::vector<std::string>& dependencies, + const Triplet& triplet); + const std::string& name() const; const Triplet& triplet() const; @@ -30,6 +34,13 @@ namespace vcpkg std::string to_string() const; + bool operator<(const PackageSpec& other) const + { + if (name() < other.name()) return true; + if (name() > other.name()) return false; + return triplet() < other.triplet(); + } + private: std::string m_name; Triplet m_triplet; diff --git a/toolsrc/include/vcpkg/paragraphs.h b/toolsrc/include/vcpkg/paragraphs.h index c8dbea646..e2c7f2d99 100644 --- a/toolsrc/include/vcpkg/paragraphs.h +++ b/toolsrc/include/vcpkg/paragraphs.h @@ -32,7 +32,4 @@ namespace vcpkg::Paragraphs std::vector<std::unique_ptr<SourceControlFile>> load_all_ports(const Files::Filesystem& fs, const fs::path& ports_dir); - - std::map<std::string, VersionT> load_all_port_names_and_versions(const Files::Filesystem& fs, - const fs::path& ports_dir); } diff --git a/toolsrc/include/vcpkg/update.h b/toolsrc/include/vcpkg/update.h index 7587b9eb2..b85f7b2b3 100644 --- a/toolsrc/include/vcpkg/update.h +++ b/toolsrc/include/vcpkg/update.h @@ -1,5 +1,6 @@ #pragma once +#include <vcpkg/dependencies.h> #include <vcpkg/packagespec.h> #include <vcpkg/statusparagraphs.h> #include <vcpkg/vcpkgcmdarguments.h> @@ -16,7 +17,8 @@ namespace vcpkg::Update VersionDiff version_diff; }; - std::vector<OutdatedPackage> find_outdated_packages(const std::map<std::string, VersionT>& src_names_to_versions, + std::vector<OutdatedPackage> find_outdated_packages(const Dependencies::PortFileProvider& provider, 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/userconfig.h b/toolsrc/include/vcpkg/userconfig.h new file mode 100644 index 000000000..63b8e5481 --- /dev/null +++ b/toolsrc/include/vcpkg/userconfig.h @@ -0,0 +1,20 @@ +#pragma once + +#include <string> +#include <vcpkg/base/files.h> + +namespace vcpkg +{ + struct UserConfig + { + std::string user_id; + std::string user_time; + std::string user_mac; + + std::string last_completed_survey; + + static UserConfig try_read_data(const Files::Filesystem& fs); + + void try_write_data(Files::Filesystem& fs) const; + }; +} |
