From dfef4b8dd71630b5c3b971a4f2ee372c6c5efc64 Mon Sep 17 00:00:00 2001 From: martin-s Date: Wed, 6 Jun 2018 21:57:43 +0200 Subject: - Moved graph switches from search command to depend-info command. - Added option to generate dgml graph. --- toolsrc/src/vcpkg/commands.dependinfo.cpp | 117 +++++++++++++++++++++++++++++- toolsrc/src/vcpkg/commands.search.cpp | 49 +------------ 2 files changed, 115 insertions(+), 51 deletions(-) diff --git a/toolsrc/src/vcpkg/commands.dependinfo.cpp b/toolsrc/src/vcpkg/commands.dependinfo.cpp index 1ca658216..1ec3f1b05 100644 --- a/toolsrc/src/vcpkg/commands.dependinfo.cpp +++ b/toolsrc/src/vcpkg/commands.dependinfo.cpp @@ -9,20 +9,122 @@ namespace vcpkg::Commands::DependInfo { + constexpr StringLiteral OPTION_DOT = "--dot"; + constexpr StringLiteral OPTION_DGML = "--dgml"; + + constexpr std::array DEPEND_SWITCHES = { { + { OPTION_DOT, "Creates graph on basis of dot" }, + { OPTION_DGML, "Creates graph on basis of dgml" }, + } }; + const CommandStructure COMMAND_STRUCTURE = { Help::create_example_string(R"###(depend-info [pat])###"), 0, 1, - {}, + { DEPEND_SWITCHES,{} }, nullptr, }; + std::string replace_dashes_with_underscore(const std::string& input) + { + std::string output = input; + std::replace(output.begin(), output.end(), '-', '_'); + return output; + } + + std::string create_dot_as_string( + const std::vector>& source_control_files) + { + int empty_node_count = 0; + + std::string s; + s.append("digraph G{ rankdir=LR; edge [minlen=3]; overlap=false;"); + + for (const auto& source_control_file : source_control_files) + { + const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; + if (source_paragraph.depends.empty()) + { + empty_node_count++; + continue; + } + + const std::string name = replace_dashes_with_underscore(source_paragraph.name); + s.append(Strings::format("%s;", name)); + for (const Dependency& d : source_paragraph.depends) + { + const std::string dependency_name = replace_dashes_with_underscore(d.name()); + s.append(Strings::format("%s -> %s;", name, dependency_name)); + } + } + + s.append(Strings::format("empty [label=\"%d singletons...\"]; }", empty_node_count)); + return s; + } + + std::string create_dgml_as_string( + const std::vector>& source_control_files) + { + std::string s; + s.append(""); + s.append(""); + + std::string nodes, links; + for (const auto& source_control_file : source_control_files) + { + const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; + const std::string name = source_paragraph.name; + nodes.append(Strings::format("", name)); + + // Iterate over dependencies. + for (const Dependency& d : source_paragraph.depends) + { + links.append(Strings::format("", name, d.name())); + } + + // Iterate over feature dependencies. + const std::vector>& feature_paragraphs = source_control_file->feature_paragraphs; + for (const auto& feature_paragraph : feature_paragraphs) + { + for (const Dependency& d : feature_paragraph->depends) + { + links.append(Strings::format("", name, d.name())); + } + } + } + + s.append(""); + s.append(nodes); + s.append(""); + + s.append(""); + s.append(links); + s.append(""); + + s.append(""); + return s; + } + + std::string create_graph_as_string( + const std::unordered_set& switches, + const std::vector>& source_control_files) + { + if (Util::Sets::contains(switches, OPTION_DOT)) + { + return create_dot_as_string(source_control_files); + } + else if (Util::Sets::contains(switches, OPTION_DGML)) + { + return create_dgml_as_string(source_control_files); + } + return ""; + } + void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - Util::unused(args.parse_arguments(COMMAND_STRUCTURE)); + const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); - std::vector> source_control_files = - Paragraphs::load_all_ports(paths.get_filesystem(), paths.ports); + auto source_control_files = Paragraphs::load_all_ports(paths.get_filesystem(), paths.ports); if (args.command_arguments.size() == 1) { @@ -49,6 +151,13 @@ namespace vcpkg::Commands::DependInfo }); } + if (!options.switches.empty()) + { + const std::string graph_as_string = create_graph_as_string(options.switches, source_control_files); + System::println(graph_as_string); + Checks::exit_success(VCPKG_LINE_INFO); + } + for (auto&& source_control_file : source_control_files) { const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; diff --git a/toolsrc/src/vcpkg/commands.search.cpp b/toolsrc/src/vcpkg/commands.search.cpp index 33a642e40..263c86698 100644 --- a/toolsrc/src/vcpkg/commands.search.cpp +++ b/toolsrc/src/vcpkg/commands.search.cpp @@ -10,46 +10,9 @@ namespace vcpkg::Commands::Search { - static constexpr StringLiteral OPTION_GRAPH = "--graph"; // TODO: This should find a better home, eventually static constexpr StringLiteral OPTION_FULLDESC = "--x-full-desc"; // TODO: This should find a better home, eventually - - static std::string replace_dashes_with_underscore(const std::string& input) - { - std::string output = input; - std::replace(output.begin(), output.end(), '-', '_'); - return output; - } - - static std::string create_graph_as_string( - const std::vector>& source_control_files) - { - int empty_node_count = 0; - - std::string s; - s.append("digraph G{ rankdir=LR; edge [minlen=3]; overlap=false;"); - - for (const auto& source_control_file : source_control_files) - { - const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; - if (source_paragraph.depends.empty()) - { - empty_node_count++; - continue; - } - - const std::string name = replace_dashes_with_underscore(source_paragraph.name); - s.append(Strings::format("%s;", name)); - for (const Dependency& d : source_paragraph.depends) - { - const std::string dependency_name = replace_dashes_with_underscore(d.name()); - s.append(Strings::format("%s -> %s;", name, dependency_name)); - } - } - - s.append(Strings::format("empty [label=\"%d singletons...\"]; }", empty_node_count)); - return s; - } + static void do_print(const SourceParagraph& source_paragraph, bool full_desc) { if (full_desc) @@ -80,8 +43,7 @@ namespace vcpkg::Commands::Search } } - static constexpr std::array SEARCH_SWITCHES = {{ - {OPTION_GRAPH, "Open editor into the port-specific buildtree subfolder"}, + static constexpr std::array SEARCH_SWITCHES = {{ {OPTION_FULLDESC, "Do not truncate long text"}, }}; @@ -102,13 +64,6 @@ namespace vcpkg::Commands::Search auto source_paragraphs = Paragraphs::load_all_ports(paths.get_filesystem(), paths.ports); - if (Util::Sets::contains(options.switches, OPTION_GRAPH)) - { - const std::string graph_as_string = create_graph_as_string(source_paragraphs); - System::println(graph_as_string); - Checks::exit_success(VCPKG_LINE_INFO); - } - if (args.command_arguments.empty()) { for (const auto& source_control_file : source_paragraphs) -- cgit v1.2.3 From 0f6953e385c87965c7288821592f199bb6189dbc Mon Sep 17 00:00:00 2001 From: martin-s Date: Fri, 8 Jun 2018 18:29:44 +0000 Subject: Update commands.dependinfo.cpp --- toolsrc/src/vcpkg/commands.dependinfo.cpp | 334 +++++++++++++++--------------- 1 file changed, 165 insertions(+), 169 deletions(-) diff --git a/toolsrc/src/vcpkg/commands.dependinfo.cpp b/toolsrc/src/vcpkg/commands.dependinfo.cpp index 1ec3f1b05..5f72e965b 100644 --- a/toolsrc/src/vcpkg/commands.dependinfo.cpp +++ b/toolsrc/src/vcpkg/commands.dependinfo.cpp @@ -1,170 +1,166 @@ -#include "pch.h" - -#include -#include -#include -#include -#include -#include - -namespace vcpkg::Commands::DependInfo -{ +#include "pch.h" + +#include +#include +#include +#include +#include +#include + +namespace vcpkg::Commands::DependInfo +{ constexpr StringLiteral OPTION_DOT = "--dot"; - constexpr StringLiteral OPTION_DGML = "--dgml"; - - constexpr std::array DEPEND_SWITCHES = { { - { OPTION_DOT, "Creates graph on basis of dot" }, - { OPTION_DGML, "Creates graph on basis of dgml" }, - } }; - - const CommandStructure COMMAND_STRUCTURE = { - Help::create_example_string(R"###(depend-info [pat])###"), - 0, - 1, - { DEPEND_SWITCHES,{} }, - nullptr, - }; - - std::string replace_dashes_with_underscore(const std::string& input) - { - std::string output = input; - std::replace(output.begin(), output.end(), '-', '_'); - return output; - } - - std::string create_dot_as_string( - const std::vector>& source_control_files) - { - int empty_node_count = 0; - - std::string s; - s.append("digraph G{ rankdir=LR; edge [minlen=3]; overlap=false;"); - - for (const auto& source_control_file : source_control_files) - { - const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; - if (source_paragraph.depends.empty()) - { - empty_node_count++; - continue; - } - - const std::string name = replace_dashes_with_underscore(source_paragraph.name); - s.append(Strings::format("%s;", name)); - for (const Dependency& d : source_paragraph.depends) - { - const std::string dependency_name = replace_dashes_with_underscore(d.name()); - s.append(Strings::format("%s -> %s;", name, dependency_name)); - } - } - - s.append(Strings::format("empty [label=\"%d singletons...\"]; }", empty_node_count)); - return s; - } - - std::string create_dgml_as_string( - const std::vector>& source_control_files) - { - std::string s; - s.append(""); - s.append(""); - - std::string nodes, links; - for (const auto& source_control_file : source_control_files) - { - const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; - const std::string name = source_paragraph.name; - nodes.append(Strings::format("", name)); - - // Iterate over dependencies. - for (const Dependency& d : source_paragraph.depends) - { - links.append(Strings::format("", name, d.name())); - } - - // Iterate over feature dependencies. - const std::vector>& feature_paragraphs = source_control_file->feature_paragraphs; - for (const auto& feature_paragraph : feature_paragraphs) - { - for (const Dependency& d : feature_paragraph->depends) - { - links.append(Strings::format("", name, d.name())); - } - } - } - - s.append(""); - s.append(nodes); - s.append(""); - - s.append(""); - s.append(links); - s.append(""); - - s.append(""); - return s; - } - - std::string create_graph_as_string( - const std::unordered_set& switches, - const std::vector>& source_control_files) - { - if (Util::Sets::contains(switches, OPTION_DOT)) - { - return create_dot_as_string(source_control_files); - } - else if (Util::Sets::contains(switches, OPTION_DGML)) - { - return create_dgml_as_string(source_control_files); - } - return ""; - } - - void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) - { - const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); - - auto source_control_files = Paragraphs::load_all_ports(paths.get_filesystem(), paths.ports); - - if (args.command_arguments.size() == 1) - { - const std::string filter = args.command_arguments.at(0); - - Util::erase_remove_if(source_control_files, - [&](const std::unique_ptr& source_control_file) { - const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; - - if (Strings::case_insensitive_ascii_contains(source_paragraph.name, filter)) - { - return false; - } - - for (const Dependency& dependency : source_paragraph.depends) - { - if (Strings::case_insensitive_ascii_contains(dependency.name(), filter)) - { - return false; - } - } - - return true; - }); - } - - if (!options.switches.empty()) - { - const std::string graph_as_string = create_graph_as_string(options.switches, source_control_files); - System::println(graph_as_string); - Checks::exit_success(VCPKG_LINE_INFO); - } - - for (auto&& source_control_file : source_control_files) - { - const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; - const auto s = Strings::join(", ", source_paragraph.depends, [](const Dependency& d) { return d.name(); }); - System::println("%s: %s", source_paragraph.name, s); - } - - Checks::exit_success(VCPKG_LINE_INFO); - } -} + constexpr StringLiteral OPTION_DGML = "--dgml"; + + constexpr std::array DEPEND_SWITCHES = { { + { OPTION_DOT, "Creates graph on basis of dot" }, + { OPTION_DGML, "Creates graph on basis of dgml" }, + } }; + + const CommandStructure COMMAND_STRUCTURE = { + Help::create_example_string(R"###(depend-info [pat])###"), + 0, + 1, + { DEPEND_SWITCHES,{} }, + nullptr, + }; + + std::string replace_dashes_with_underscore(const std::string& input) + { + std::string output = input; + std::replace(output.begin(), output.end(), '-', '_'); + return output; + } + + std::string create_dot_as_string( + const std::vector>& source_control_files) + { + int empty_node_count = 0; + + std::string s; + s.append("digraph G{ rankdir=LR; edge [minlen=3]; overlap=false;"); + + for (const auto& source_control_file : source_control_files) + { + const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; + if (source_paragraph.depends.empty()) + { + empty_node_count++; + continue; + } + + const std::string name = replace_dashes_with_underscore(source_paragraph.name); + s.append(Strings::format("%s;", name)); + for (const Dependency& d : source_paragraph.depends) + { + const std::string dependency_name = replace_dashes_with_underscore(d.name()); + s.append(Strings::format("%s -> %s;", name, dependency_name)); + } + } + + s.append(Strings::format("empty [label=\"%d singletons...\"]; }", empty_node_count)); + return s; + } + + std::string create_dgml_as_string( + const std::vector>& source_control_files) + { + std::string s; + s.append(""); + s.append(""); + + std::string nodes, links; + for (const auto& source_control_file : source_control_files) + { + const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; + const std::string name = source_paragraph.name; + nodes.append(Strings::format("", name)); + + // Iterate over dependencies. + for (const Dependency& d : source_paragraph.depends) + { + links.append(Strings::format("", name, d.name())); + } + + // Iterate over feature dependencies. + const std::vector>& feature_paragraphs = source_control_file->feature_paragraphs; + for (const auto& feature_paragraph : feature_paragraphs) + { + for (const Dependency& d : feature_paragraph->depends) + { + links.append(Strings::format("", name, d.name())); + } + } + } + + s.append(Strings::format("%s", nodes)); + + s.append(Strings::format("%s", links)); + + s.append(""); + return s; + } + + std::string create_graph_as_string( + const std::unordered_set& switches, + const std::vector>& source_control_files) + { + if (Util::Sets::contains(switches, OPTION_DOT)) + { + return create_dot_as_string(source_control_files); + } + else if (Util::Sets::contains(switches, OPTION_DGML)) + { + return create_dgml_as_string(source_control_files); + } + return ""; + } + + void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) + { + const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); + + auto source_control_files = Paragraphs::load_all_ports(paths.get_filesystem(), paths.ports); + + if (args.command_arguments.size() == 1) + { + const std::string filter = args.command_arguments.at(0); + + Util::erase_remove_if(source_control_files, + [&](const std::unique_ptr& source_control_file) { + const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; + + if (Strings::case_insensitive_ascii_contains(source_paragraph.name, filter)) + { + return false; + } + + for (const Dependency& dependency : source_paragraph.depends) + { + if (Strings::case_insensitive_ascii_contains(dependency.name(), filter)) + { + return false; + } + } + + return true; + }); + } + + if (!options.switches.empty()) + { + const std::string graph_as_string = create_graph_as_string(options.switches, source_control_files); + System::println(graph_as_string); + Checks::exit_success(VCPKG_LINE_INFO); + } + + for (auto&& source_control_file : source_control_files) + { + const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; + const auto s = Strings::join(", ", source_paragraph.depends, [](const Dependency& d) { return d.name(); }); + System::println("%s: %s", source_paragraph.name, s); + } + + Checks::exit_success(VCPKG_LINE_INFO); + } +} -- cgit v1.2.3