aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-10-13 20:58:00 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-10-13 20:58:00 -0700
commitbea4c2ff4936f22b4024c2afef5e403533c7b291 (patch)
tree22e741611a8abf96d1301b52dc89813faf218250 /toolsrc/src
parent0d7381ba408e4d5bcde06ab7a6353ff14e7afc0b (diff)
downloadvcpkg-bea4c2ff4936f22b4024c2afef5e403533c7b291.tar.gz
vcpkg-bea4c2ff4936f22b4024c2afef5e403533c7b291.zip
[vcpkg] Begin refactor to use CommandStructure to represent command parsing
Diffstat (limited to 'toolsrc/src')
-rw-r--r--toolsrc/src/vcpkg/commands.autocomplete.cpp77
-rw-r--r--toolsrc/src/vcpkg/install.cpp38
-rw-r--r--toolsrc/src/vcpkg/remove.cpp37
3 files changed, 112 insertions, 40 deletions
diff --git a/toolsrc/src/vcpkg/commands.autocomplete.cpp b/toolsrc/src/vcpkg/commands.autocomplete.cpp
index b8c633142..2e191b428 100644
--- a/toolsrc/src/vcpkg/commands.autocomplete.cpp
+++ b/toolsrc/src/vcpkg/commands.autocomplete.cpp
@@ -2,8 +2,10 @@
#include <vcpkg/base/system.h>
#include <vcpkg/commands.h>
+#include <vcpkg/install.h>
#include <vcpkg/metrics.h>
#include <vcpkg/paragraphs.h>
+#include <vcpkg/remove.h>
#include <vcpkg/vcpkglib.h>
namespace vcpkg::Commands::Autocomplete
@@ -47,6 +49,7 @@ namespace vcpkg::Commands::Autocomplete
{
const SortedVector<std::string> sorted_results(results);
System::println(Strings::join("\n", sorted_results));
+
Checks::exit_success(line_info);
}
@@ -63,21 +66,23 @@ namespace vcpkg::Commands::Autocomplete
{
const std::string requested_command = match[1].str();
- std::vector<std::string> valid_commands = {"install",
- "search",
- "remove",
- "list",
- "update",
- "hash",
- "help",
- "integrate",
- "export",
- "edit",
- "create",
- "owns",
- "cache",
- "version",
- "contact"};
+ std::vector<std::string> valid_commands = {
+ "install",
+ "search",
+ "remove",
+ "list",
+ "update",
+ "hash",
+ "help",
+ "integrate",
+ "export",
+ "edit",
+ "create",
+ "owns",
+ "cache",
+ "version",
+ "contact",
+ };
Util::unstable_keep_if(valid_commands, [&](const std::string& s) {
return Strings::case_insensitive_ascii_starts_with(s, requested_command);
@@ -86,22 +91,36 @@ namespace vcpkg::Commands::Autocomplete
output_sorted_results_and_exit(VCPKG_LINE_INFO, std::move(valid_commands));
}
- // Handles vcpkg install <package>
- if (std::regex_match(to_autocomplete, match, std::regex{R"###(^install.* (\S*)$)###"}))
+ struct CommandEntry
{
- const std::string start_with = match[1].str();
- auto sources_and_errors = Paragraphs::try_load_all_ports(paths.get_filesystem(), paths.ports);
- auto& source_paragraphs = sources_and_errors.paragraphs;
- output_sorted_results_and_exit(VCPKG_LINE_INFO, autocomplete_install(source_paragraphs, start_with));
- }
-
- // Handles vcpkg remove <package>
- if (std::regex_match(to_autocomplete, match, std::regex{R"###(^remove.* (\S*)$)###"}))
+ CStringView regex;
+ const CommandStructure& structure;
+ };
+ static constexpr CommandEntry commands[] = {
+ {R"###(^install\s(.*\s|)(\S*)$)###", Install::INSTALL_COMMAND_STRUCTURE},
+ {R"###(^remove\s(.*\s|)(\S*)$)###", Remove::REMOVE_COMMAND_STRUCTURE},
+ };
+
+ for (auto&& command : commands)
{
- const std::string start_with = match[1].str();
- const StatusParagraphs status_db = database_load_check(paths);
- const std::vector<StatusParagraph*> installed_packages = get_installed_ports(status_db);
- output_sorted_results_and_exit(VCPKG_LINE_INFO, autocomplete_remove(installed_packages, start_with));
+ if (std::regex_match(to_autocomplete, match, std::regex{command.regex.c_str()}))
+ {
+ auto prefix = match[2].str();
+ std::vector<std::string> v;
+ if (Strings::case_insensitive_ascii_starts_with(prefix, "-"))
+ {
+ v = Util::fmap(command.structure.switches, [](auto&& s) -> std::string { return s; });
+ }
+ else
+ {
+ v = command.structure.valid_arguments(paths);
+ }
+
+ Util::unstable_keep_if(
+ v, [&](const std::string& s) { return Strings::case_insensitive_ascii_starts_with(s, prefix); });
+
+ output_sorted_results_and_exit(VCPKG_LINE_INFO, std::move(v));
+ }
}
Checks::exit_success(VCPKG_LINE_INFO);
diff --git a/toolsrc/src/vcpkg/install.cpp b/toolsrc/src/vcpkg/install.cpp
index 28d6d1cc6..6a564b00c 100644
--- a/toolsrc/src/vcpkg/install.cpp
+++ b/toolsrc/src/vcpkg/install.cpp
@@ -525,14 +525,40 @@ namespace vcpkg::Install
Checks::exit_success(VCPKG_LINE_INFO);
}
- void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet)
+ static const std::string OPTION_DRY_RUN = "--dry-run";
+ static const std::string OPTION_USE_HEAD_VERSION = "--head";
+ static const std::string OPTION_NO_DOWNLOADS = "--no-downloads";
+ static const std::string OPTION_RECURSE = "--recurse";
+ static const std::string OPTION_KEEP_GOING = "--keep-going";
+
+ static const std::array<std::string, 5> INSTALL_SWITCHES = {
+ OPTION_DRY_RUN,
+ OPTION_USE_HEAD_VERSION,
+ OPTION_NO_DOWNLOADS,
+ OPTION_RECURSE,
+ OPTION_KEEP_GOING,
+ };
+ static const std::array<std::string, 0> INSTALL_SETTINGS;
+
+ static std::vector<std::string> valid_arguments(const VcpkgPaths& paths)
{
- static const std::string OPTION_DRY_RUN = "--dry-run";
- static const std::string OPTION_USE_HEAD_VERSION = "--head";
- static const std::string OPTION_NO_DOWNLOADS = "--no-downloads";
- static const std::string OPTION_RECURSE = "--recurse";
- static const std::string OPTION_KEEP_GOING = "--keep-going";
+ auto sources_and_errors = Paragraphs::try_load_all_ports(paths.get_filesystem(), paths.ports);
+
+ return Util::fmap(sources_and_errors.paragraphs,
+ [](auto&& pgh) -> std::string { return pgh->core_paragraph->name; });
+ }
+ const CommandStructure INSTALL_COMMAND_STRUCTURE = {
+ "install zlib zlib:x64-windows curl boost",
+ 1,
+ SIZE_MAX,
+ INSTALL_SWITCHES,
+ INSTALL_SETTINGS,
+ &valid_arguments,
+ };
+
+ void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet)
+ {
// input sanitization
static const std::string EXAMPLE = Help::create_example_string("install zlib zlib:x64-windows curl boost");
args.check_min_arg_count(1, EXAMPLE);
diff --git a/toolsrc/src/vcpkg/remove.cpp b/toolsrc/src/vcpkg/remove.cpp
index 3751566f7..30b3d6cd8 100644
--- a/toolsrc/src/vcpkg/remove.cpp
+++ b/toolsrc/src/vcpkg/remove.cpp
@@ -163,13 +163,40 @@ namespace vcpkg::Remove
}
}
+ static const std::string OPTION_PURGE = "--purge";
+ static const std::string OPTION_NO_PURGE = "--no-purge";
+ static const std::string OPTION_RECURSE = "--recurse";
+ static const std::string OPTION_DRY_RUN = "--dry-run";
+ static const std::string OPTION_OUTDATED = "--outdated";
+
+ static const std::array<std::string, 5> REMOVE_SWITCHES = {
+ OPTION_PURGE,
+ OPTION_NO_PURGE,
+ OPTION_RECURSE,
+ OPTION_DRY_RUN,
+ OPTION_OUTDATED,
+ };
+ static const std::array<std::string, 0> REMOVE_SETTINGS;
+
+ static std::vector<std::string> valid_arguments(const VcpkgPaths& paths)
+ {
+ const StatusParagraphs status_db = database_load_check(paths);
+ const std::vector<StatusParagraph*> installed_packages = get_installed_ports(status_db);
+
+ return Util::fmap(installed_packages, [](auto&& pgh) -> std::string { return pgh->package.spec.to_string(); });
+ }
+
+ const CommandStructure REMOVE_COMMAND_STRUCTURE = {
+ "remove zlib zlib:x64-windows curl boost",
+ 1,
+ SIZE_MAX,
+ REMOVE_SWITCHES,
+ REMOVE_SETTINGS,
+ &valid_arguments,
+ };
+
void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet)
{
- static const std::string OPTION_PURGE = "--purge";
- static const std::string OPTION_NO_PURGE = "--no-purge";
- static const std::string OPTION_RECURSE = "--recurse";
- static const std::string OPTION_DRY_RUN = "--dry-run";
- static const std::string OPTION_OUTDATED = "--outdated";
static const std::string EXAMPLE = Help::create_example_string("remove zlib zlib:x64-windows curl boost");
const std::unordered_set<std::string> options = args.check_and_get_optional_command_arguments(
{OPTION_PURGE, OPTION_NO_PURGE, OPTION_RECURSE, OPTION_DRY_RUN, OPTION_OUTDATED});