From e051edfa10a686490168f0e888297afb22a4b905 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Mon, 3 Apr 2017 16:00:17 -0700 Subject: vcpkg_cmd_arguments -> VcpkgCmdArguments --- toolsrc/src/VcpkgCmdArguments.cpp | 211 ++++++++++++++++++++++++++++++++ toolsrc/src/commands_build.cpp | 2 +- toolsrc/src/commands_build_external.cpp | 2 +- toolsrc/src/commands_cache.cpp | 2 +- toolsrc/src/commands_ci.cpp | 2 +- toolsrc/src/commands_contact.cpp | 2 +- toolsrc/src/commands_create.cpp | 2 +- toolsrc/src/commands_edit.cpp | 2 +- toolsrc/src/commands_env.cpp | 2 +- toolsrc/src/commands_hash.cpp | 2 +- toolsrc/src/commands_help.cpp | 2 +- toolsrc/src/commands_import.cpp | 2 +- toolsrc/src/commands_install.cpp | 2 +- toolsrc/src/commands_integrate.cpp | 2 +- toolsrc/src/commands_list.cpp | 2 +- toolsrc/src/commands_owns.cpp | 2 +- toolsrc/src/commands_portsdiff.cpp | 2 +- toolsrc/src/commands_remove.cpp | 2 +- toolsrc/src/commands_search.cpp | 2 +- toolsrc/src/commands_update.cpp | 2 +- toolsrc/src/commands_version.cpp | 2 +- toolsrc/src/vcpkg.cpp | 4 +- toolsrc/src/vcpkg_cmd_arguments.cpp | 211 -------------------------------- 23 files changed, 233 insertions(+), 233 deletions(-) create mode 100644 toolsrc/src/VcpkgCmdArguments.cpp delete mode 100644 toolsrc/src/vcpkg_cmd_arguments.cpp (limited to 'toolsrc/src') diff --git a/toolsrc/src/VcpkgCmdArguments.cpp b/toolsrc/src/VcpkgCmdArguments.cpp new file mode 100644 index 000000000..9ad8e36c9 --- /dev/null +++ b/toolsrc/src/VcpkgCmdArguments.cpp @@ -0,0 +1,211 @@ +#include "pch.h" +#include "VcpkgCmdArguments.h" +#include "vcpkg_Commands.h" +#include "metrics.h" +#include "vcpkg_System.h" + +namespace vcpkg +{ + static void parse_value( + const std::string* arg_begin, + const std::string* arg_end, + const std::string& option_name, + std::unique_ptr& option_field) + { + if (arg_begin == arg_end) + { + System::println(System::color::error, "Error: expected value after %s", option_name); + Metrics::track_property("error", "error option name"); + Commands::Help::print_usage(); + Checks::exit_fail(VCPKG_LINE_INFO); + } + + if (option_field != nullptr) + { + System::println(System::color::error, "Error: %s specified multiple times", option_name); + Metrics::track_property("error", "error option specified multiple times"); + Commands::Help::print_usage(); + Checks::exit_fail(VCPKG_LINE_INFO); + } + + option_field = std::make_unique(*arg_begin); + } + + static void parse_switch( + OptBoolT new_setting, + const std::string& option_name, + OptBoolT& option_field) + { + if (option_field != OptBoolT::UNSPECIFIED && option_field != new_setting) + { + System::println(System::color::error, "Error: conflicting values specified for --%s", option_name); + Metrics::track_property("error", "error conflicting switches"); + Commands::Help::print_usage(); + Checks::exit_fail(VCPKG_LINE_INFO); + } + option_field = new_setting; + } + + VcpkgCmdArguments VcpkgCmdArguments::create_from_command_line(const int argc, const wchar_t* const* const argv) + { + std::vector v; + for (int i = 1; i < argc; ++i) + { + v.push_back(Strings::utf16_to_utf8(argv[i])); + } + + return VcpkgCmdArguments::create_from_arg_sequence(v.data(), v.data() + v.size()); + } + + VcpkgCmdArguments VcpkgCmdArguments::create_from_arg_sequence(const std::string* arg_begin, const std::string* arg_end) + { + VcpkgCmdArguments args; + + for (; arg_begin != arg_end; ++arg_begin) + { + std::string arg = *arg_begin; + + if (arg.empty()) + { + continue; + } + + if (arg[0] == '-' && arg[1] != '-') + { + Metrics::track_property("error", "error short options are not supported"); + Checks::exit_with_message(VCPKG_LINE_INFO, "Error: short options are not supported: %s", arg); + } + + if (arg[0] == '-' && arg[1] == '-') + { + // command switch + if (arg == "--vcpkg-root") + { + ++arg_begin; + parse_value(arg_begin, arg_end, "--vcpkg-root", args.vcpkg_root_dir); + continue; + } + if (arg == "--triplet") + { + ++arg_begin; + parse_value(arg_begin, arg_end, "--triplet", args.target_triplet); + continue; + } + if (arg == "--debug") + { + parse_switch(OptBoolT::ENABLED, "debug", args.debug); + continue; + } + if (arg == "--sendmetrics") + { + parse_switch(OptBoolT::ENABLED, "sendmetrics", args.sendmetrics); + continue; + } + if (arg == "--printmetrics") + { + parse_switch(OptBoolT::ENABLED, "printmetrics", args.printmetrics); + continue; + } + if (arg == "--no-sendmetrics") + { + parse_switch(OptBoolT::DISABLED, "sendmetrics", args.sendmetrics); + continue; + } + if (arg == "--no-printmetrics") + { + parse_switch(OptBoolT::DISABLED, "printmetrics", args.printmetrics); + continue; + } + + args.optional_command_arguments.insert(arg); + continue; + } + + if (args.command.empty()) + { + args.command = arg; + } + else + { + args.command_arguments.push_back(arg); + } + } + + return args; + } + + std::unordered_set VcpkgCmdArguments::check_and_get_optional_command_arguments(const std::vector& valid_options) const + { + std::unordered_set output; + auto options_copy = this->optional_command_arguments; + for (const std::string& option : valid_options) + { + auto it = options_copy.find(option); + if (it != options_copy.end()) + { + output.insert(option); + options_copy.erase(it); + } + } + + if (!options_copy.empty()) + { + System::println(System::color::error, "Unknown option(s) for command '%s':", this->command); + for (const std::string& option : options_copy) + { + System::println(option); + } + Checks::exit_fail(VCPKG_LINE_INFO); + } + + return output; + } + + void VcpkgCmdArguments::check_max_arg_count(const size_t expected_arg_count) const + { + return check_max_arg_count(expected_arg_count, ""); + } + + void VcpkgCmdArguments::check_min_arg_count(const size_t expected_arg_count) const + { + return check_min_arg_count(expected_arg_count, ""); + } + + void VcpkgCmdArguments::check_exact_arg_count(const size_t expected_arg_count) const + { + return check_exact_arg_count(expected_arg_count, ""); + } + + void VcpkgCmdArguments::check_max_arg_count(const size_t expected_arg_count, const std::string& example_text) const + { + const size_t actual_arg_count = command_arguments.size(); + if (actual_arg_count > expected_arg_count) + { + System::println(System::color::error, "Error: `%s` requires at most %u arguments, but %u were provided", this->command, expected_arg_count, actual_arg_count); + System::print(example_text); + Checks::exit_fail(VCPKG_LINE_INFO); + } + } + + void VcpkgCmdArguments::check_min_arg_count(const size_t expected_arg_count, const std::string& example_text) const + { + const size_t actual_arg_count = command_arguments.size(); + if (actual_arg_count < expected_arg_count) + { + System::println(System::color::error, "Error: `%s` requires at least %u arguments, but %u were provided", this->command, expected_arg_count, actual_arg_count); + System::print(example_text); + Checks::exit_fail(VCPKG_LINE_INFO); + } + } + + void VcpkgCmdArguments::check_exact_arg_count(const size_t expected_arg_count, const std::string& example_text) const + { + const size_t actual_arg_count = command_arguments.size(); + if (actual_arg_count != expected_arg_count) + { + System::println(System::color::error, "Error: `%s` requires %u arguments, but %u were provided", this->command, expected_arg_count, actual_arg_count); + System::print(example_text); + Checks::exit_fail(VCPKG_LINE_INFO); + } + } +} diff --git a/toolsrc/src/commands_build.cpp b/toolsrc/src/commands_build.cpp index 5b8e1403d..7376238cd 100644 --- a/toolsrc/src/commands_build.cpp +++ b/toolsrc/src/commands_build.cpp @@ -174,7 +174,7 @@ namespace vcpkg::Commands::Build Checks::exit_success(VCPKG_LINE_INFO); } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) { static const std::string example = Commands::Help::create_example_string("build zlib:x64-windows"); args.check_exact_arg_count(1, example); // Build only takes a single package and all dependencies must already be installed diff --git a/toolsrc/src/commands_build_external.cpp b/toolsrc/src/commands_build_external.cpp index 2cecc48f2..19504d7a8 100644 --- a/toolsrc/src/commands_build_external.cpp +++ b/toolsrc/src/commands_build_external.cpp @@ -5,7 +5,7 @@ namespace vcpkg::Commands::BuildExternal { - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) { static const std::string example = Commands::Help::create_example_string(R"(build_external zlib2 C:\path\to\dir\with\controlfile\)"); args.check_exact_arg_count(2, example); diff --git a/toolsrc/src/commands_cache.cpp b/toolsrc/src/commands_cache.cpp index 6504c8c4d..89e2b4d8d 100644 --- a/toolsrc/src/commands_cache.cpp +++ b/toolsrc/src/commands_cache.cpp @@ -24,7 +24,7 @@ namespace vcpkg::Commands::Cache return output; } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Strings::format( "The argument should be a substring to search for, or no argument to display all cached libraries.\n%s", Commands::Help::create_example_string("cache png")); diff --git a/toolsrc/src/commands_ci.cpp b/toolsrc/src/commands_ci.cpp index 7a818337c..f2a818f12 100644 --- a/toolsrc/src/commands_ci.cpp +++ b/toolsrc/src/commands_ci.cpp @@ -26,7 +26,7 @@ namespace vcpkg::Commands::CI return specs; } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) { static const std::string example = Commands::Help::create_example_string("ci x64-windows"); args.check_max_arg_count(1, example); diff --git a/toolsrc/src/commands_contact.cpp b/toolsrc/src/commands_contact.cpp index fe65a9e33..76734130a 100644 --- a/toolsrc/src/commands_contact.cpp +++ b/toolsrc/src/commands_contact.cpp @@ -10,7 +10,7 @@ namespace vcpkg::Commands::Contact return s_email; } - void perform_and_exit(const vcpkg_cmd_arguments& args) + void perform_and_exit(const VcpkgCmdArguments& args) { args.check_exact_arg_count(0); args.check_and_get_optional_command_arguments({}); diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index a5d3a66bc..2e2b163b1 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -7,7 +7,7 @@ namespace vcpkg::Commands::Create { - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Commands::Help::create_example_string(R"###(create zlib2 http://zlib.net/zlib1211.zip "zlib1211-2.zip")###"); args.check_max_arg_count(3, example); diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index 8ed7e58cc..361e69941 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -5,7 +5,7 @@ namespace vcpkg::Commands::Edit { - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Commands::Help::create_example_string("edit zlib"); args.check_exact_arg_count(1, example); diff --git a/toolsrc/src/commands_env.cpp b/toolsrc/src/commands_env.cpp index 073797305..e89aed41d 100644 --- a/toolsrc/src/commands_env.cpp +++ b/toolsrc/src/commands_env.cpp @@ -4,7 +4,7 @@ namespace vcpkg::Commands::Env { - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const Triplet& default_triplet) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths, const Triplet& default_triplet) { static const std::string example = Commands::Help::create_example_string(R"(env --Triplet x64-windows)"); args.check_exact_arg_count(0, example); diff --git a/toolsrc/src/commands_hash.cpp b/toolsrc/src/commands_hash.cpp index 092b05bd1..2ffa3a9aa 100644 --- a/toolsrc/src/commands_hash.cpp +++ b/toolsrc/src/commands_hash.cpp @@ -24,7 +24,7 @@ namespace vcpkg::Commands::Hash System::println(hash); } - void perform_and_exit(const vcpkg_cmd_arguments& args) + void perform_and_exit(const VcpkgCmdArguments& args) { static const std::string example = Strings::format( "The argument should be a file path\n%s", Commands::Help::create_example_string("hash boost_1_62_0.tar.bz2")); diff --git a/toolsrc/src/commands_help.cpp b/toolsrc/src/commands_help.cpp index f79cb0dce..843b2c0a7 100644 --- a/toolsrc/src/commands_help.cpp +++ b/toolsrc/src/commands_help.cpp @@ -64,7 +64,7 @@ namespace vcpkg::Commands::Help System::println(create_example_string(command_and_arguments)); } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { args.check_max_arg_count(1); args.check_and_get_optional_command_arguments({}); diff --git a/toolsrc/src/commands_import.cpp b/toolsrc/src/commands_import.cpp index 63808654a..f29a62a42 100644 --- a/toolsrc/src/commands_import.cpp +++ b/toolsrc/src/commands_import.cpp @@ -68,7 +68,7 @@ namespace vcpkg::Commands::Import std::ofstream(control_file_path) << control_file_data; } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Commands::Help::create_example_string(R"(import C:\path\to\CONTROLfile C:\path\to\includedir C:\path\to\projectdir)"); args.check_exact_arg_count(3, example); diff --git a/toolsrc/src/commands_install.cpp b/toolsrc/src/commands_install.cpp index 7dccb006e..3ff73e764 100644 --- a/toolsrc/src/commands_install.cpp +++ b/toolsrc/src/commands_install.cpp @@ -183,7 +183,7 @@ namespace vcpkg::Commands::Install status_db->insert(std::make_unique(spgh)); } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) { // input sanitization static const std::string example = Commands::Help::create_example_string("install zlib zlib:x64-windows curl boost"); diff --git a/toolsrc/src/commands_integrate.cpp b/toolsrc/src/commands_integrate.cpp index cb7eeb7da..30b5cc254 100644 --- a/toolsrc/src/commands_integrate.cpp +++ b/toolsrc/src/commands_integrate.cpp @@ -284,7 +284,7 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console " vcpkg integrate remove Remove user-wide integration\n" " vcpkg integrate project Generate a referencing nuget package for individual VS project use\n"; - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Strings::format("Commands:\n" "%s", INTEGRATE_COMMAND_HELPSTRING); diff --git a/toolsrc/src/commands_list.cpp b/toolsrc/src/commands_list.cpp index f7b6bd778..a68dec0d3 100644 --- a/toolsrc/src/commands_list.cpp +++ b/toolsrc/src/commands_list.cpp @@ -14,7 +14,7 @@ namespace vcpkg::Commands::List details::shorten_description(pgh.package.description)); } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Strings::format( "The argument should be a substring to search for, or no argument to display all installed libraries.\n%s", Commands::Help::create_example_string("list png")); diff --git a/toolsrc/src/commands_owns.cpp b/toolsrc/src/commands_owns.cpp index 83c696fa9..23e6d2b5c 100644 --- a/toolsrc/src/commands_owns.cpp +++ b/toolsrc/src/commands_owns.cpp @@ -22,7 +22,7 @@ namespace vcpkg::Commands::Owns } } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Strings::format("The argument should be a pattern to search for. %s", Commands::Help::create_example_string("owns zlib.dll")); args.check_exact_arg_count(1, example); diff --git a/toolsrc/src/commands_portsdiff.cpp b/toolsrc/src/commands_portsdiff.cpp index ce1e6a4c7..8f1b59170 100644 --- a/toolsrc/src/commands_portsdiff.cpp +++ b/toolsrc/src/commands_portsdiff.cpp @@ -100,7 +100,7 @@ namespace vcpkg::Commands::PortsDiff Checks::check_exit(VCPKG_LINE_INFO, output.output == VALID_COMMIT_OUTPUT, "Invalid commit id %s", Strings::utf16_to_utf8(git_commit_id)); } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Strings::format("The argument should be a branch/tag/hash to checkout.\n%s", Commands::Help::create_example_string("portsdiff mybranchname")); args.check_min_arg_count(1, example); diff --git a/toolsrc/src/commands_remove.cpp b/toolsrc/src/commands_remove.cpp index fa8950773..2ea535e99 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -162,7 +162,7 @@ namespace vcpkg::Commands::Remove } } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths, const Triplet& default_target_triplet) { static const std::string OPTION_PURGE = "--purge"; static const std::string OPTION_NO_PURGE = "--no-purge"; diff --git a/toolsrc/src/commands_search.cpp b/toolsrc/src/commands_search.cpp index 3891b8141..1941b074d 100644 --- a/toolsrc/src/commands_search.cpp +++ b/toolsrc/src/commands_search.cpp @@ -52,7 +52,7 @@ namespace vcpkg::Commands::Search details::shorten_description(source_paragraph.description)); } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { static const std::string example = Strings::format("The argument should be a substring to search for, or no argument to display all libraries.\n%s", Commands::Help::create_example_string("search png")); diff --git a/toolsrc/src/commands_update.cpp b/toolsrc/src/commands_update.cpp index 14bfaee98..1059a0da6 100644 --- a/toolsrc/src/commands_update.cpp +++ b/toolsrc/src/commands_update.cpp @@ -36,7 +36,7 @@ namespace vcpkg::Commands::Update return output; } - void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + void perform_and_exit(const VcpkgCmdArguments& args, const vcpkg_paths& paths) { args.check_exact_arg_count(0); args.check_and_get_optional_command_arguments({}); diff --git a/toolsrc/src/commands_version.cpp b/toolsrc/src/commands_version.cpp index 1a86d9120..a7d12a1b1 100644 --- a/toolsrc/src/commands_version.cpp +++ b/toolsrc/src/commands_version.cpp @@ -23,7 +23,7 @@ namespace vcpkg::Commands::Version return s_version; } - void perform_and_exit(const vcpkg_cmd_arguments& args) + void perform_and_exit(const VcpkgCmdArguments& args) { args.check_exact_arg_count(0); args.check_and_get_optional_command_arguments({}); diff --git a/toolsrc/src/vcpkg.cpp b/toolsrc/src/vcpkg.cpp index fe917cdd7..bb4a2926c 100644 --- a/toolsrc/src/vcpkg.cpp +++ b/toolsrc/src/vcpkg.cpp @@ -24,7 +24,7 @@ void invalid_command(const std::string& cmd) Checks::exit_fail(VCPKG_LINE_INFO); } -static void inner(const vcpkg_cmd_arguments& args) +static void inner(const VcpkgCmdArguments& args) { Metrics::track_property("command", args.command); if (args.command.empty()) @@ -194,7 +194,7 @@ int wmain(const int argc, const wchar_t* const* const argv) loadConfig(); Metrics::track_property("sqmuser", Metrics::get_SQM_user()); - const vcpkg_cmd_arguments args = vcpkg_cmd_arguments::create_from_command_line(argc, argv); + const VcpkgCmdArguments args = VcpkgCmdArguments::create_from_command_line(argc, argv); if (args.printmetrics != OptBoolT::UNSPECIFIED) Metrics::set_print_metrics(args.printmetrics == OptBoolT::ENABLED); diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp deleted file mode 100644 index c3e3406ff..000000000 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ /dev/null @@ -1,211 +0,0 @@ -#include "pch.h" -#include "vcpkg_cmd_arguments.h" -#include "vcpkg_Commands.h" -#include "metrics.h" -#include "vcpkg_System.h" - -namespace vcpkg -{ - static void parse_value( - const std::string* arg_begin, - const std::string* arg_end, - const std::string& option_name, - std::unique_ptr& option_field) - { - if (arg_begin == arg_end) - { - System::println(System::color::error, "Error: expected value after %s", option_name); - Metrics::track_property("error", "error option name"); - Commands::Help::print_usage(); - Checks::exit_fail(VCPKG_LINE_INFO); - } - - if (option_field != nullptr) - { - System::println(System::color::error, "Error: %s specified multiple times", option_name); - Metrics::track_property("error", "error option specified multiple times"); - Commands::Help::print_usage(); - Checks::exit_fail(VCPKG_LINE_INFO); - } - - option_field = std::make_unique(*arg_begin); - } - - static void parse_switch( - OptBoolT new_setting, - const std::string& option_name, - OptBoolT& option_field) - { - if (option_field != OptBoolT::UNSPECIFIED && option_field != new_setting) - { - System::println(System::color::error, "Error: conflicting values specified for --%s", option_name); - Metrics::track_property("error", "error conflicting switches"); - Commands::Help::print_usage(); - Checks::exit_fail(VCPKG_LINE_INFO); - } - option_field = new_setting; - } - - vcpkg_cmd_arguments vcpkg_cmd_arguments::create_from_command_line(const int argc, const wchar_t* const* const argv) - { - std::vector v; - for (int i = 1; i < argc; ++i) - { - v.push_back(Strings::utf16_to_utf8(argv[i])); - } - - return vcpkg_cmd_arguments::create_from_arg_sequence(v.data(), v.data() + v.size()); - } - - vcpkg_cmd_arguments vcpkg_cmd_arguments::create_from_arg_sequence(const std::string* arg_begin, const std::string* arg_end) - { - vcpkg_cmd_arguments args; - - for (; arg_begin != arg_end; ++arg_begin) - { - std::string arg = *arg_begin; - - if (arg.empty()) - { - continue; - } - - if (arg[0] == '-' && arg[1] != '-') - { - Metrics::track_property("error", "error short options are not supported"); - Checks::exit_with_message(VCPKG_LINE_INFO, "Error: short options are not supported: %s", arg); - } - - if (arg[0] == '-' && arg[1] == '-') - { - // command switch - if (arg == "--vcpkg-root") - { - ++arg_begin; - parse_value(arg_begin, arg_end, "--vcpkg-root", args.vcpkg_root_dir); - continue; - } - if (arg == "--triplet") - { - ++arg_begin; - parse_value(arg_begin, arg_end, "--triplet", args.target_triplet); - continue; - } - if (arg == "--debug") - { - parse_switch(OptBoolT::ENABLED, "debug", args.debug); - continue; - } - if (arg == "--sendmetrics") - { - parse_switch(OptBoolT::ENABLED, "sendmetrics", args.sendmetrics); - continue; - } - if (arg == "--printmetrics") - { - parse_switch(OptBoolT::ENABLED, "printmetrics", args.printmetrics); - continue; - } - if (arg == "--no-sendmetrics") - { - parse_switch(OptBoolT::DISABLED, "sendmetrics", args.sendmetrics); - continue; - } - if (arg == "--no-printmetrics") - { - parse_switch(OptBoolT::DISABLED, "printmetrics", args.printmetrics); - continue; - } - - args.optional_command_arguments.insert(arg); - continue; - } - - if (args.command.empty()) - { - args.command = arg; - } - else - { - args.command_arguments.push_back(arg); - } - } - - return args; - } - - std::unordered_set vcpkg_cmd_arguments::check_and_get_optional_command_arguments(const std::vector& valid_options) const - { - std::unordered_set output; - auto options_copy = this->optional_command_arguments; - for (const std::string& option : valid_options) - { - auto it = options_copy.find(option); - if (it != options_copy.end()) - { - output.insert(option); - options_copy.erase(it); - } - } - - if (!options_copy.empty()) - { - System::println(System::color::error, "Unknown option(s) for command '%s':", this->command); - for (const std::string& option : options_copy) - { - System::println(option); - } - Checks::exit_fail(VCPKG_LINE_INFO); - } - - return output; - } - - void vcpkg_cmd_arguments::check_max_arg_count(const size_t expected_arg_count) const - { - return check_max_arg_count(expected_arg_count, ""); - } - - void vcpkg_cmd_arguments::check_min_arg_count(const size_t expected_arg_count) const - { - return check_min_arg_count(expected_arg_count, ""); - } - - void vcpkg_cmd_arguments::check_exact_arg_count(const size_t expected_arg_count) const - { - return check_exact_arg_count(expected_arg_count, ""); - } - - void vcpkg_cmd_arguments::check_max_arg_count(const size_t expected_arg_count, const std::string& example_text) const - { - const size_t actual_arg_count = command_arguments.size(); - if (actual_arg_count > expected_arg_count) - { - System::println(System::color::error, "Error: `%s` requires at most %u arguments, but %u were provided", this->command, expected_arg_count, actual_arg_count); - System::print(example_text); - Checks::exit_fail(VCPKG_LINE_INFO); - } - } - - void vcpkg_cmd_arguments::check_min_arg_count(const size_t expected_arg_count, const std::string& example_text) const - { - const size_t actual_arg_count = command_arguments.size(); - if (actual_arg_count < expected_arg_count) - { - System::println(System::color::error, "Error: `%s` requires at least %u arguments, but %u were provided", this->command, expected_arg_count, actual_arg_count); - System::print(example_text); - Checks::exit_fail(VCPKG_LINE_INFO); - } - } - - void vcpkg_cmd_arguments::check_exact_arg_count(const size_t expected_arg_count, const std::string& example_text) const - { - const size_t actual_arg_count = command_arguments.size(); - if (actual_arg_count != expected_arg_count) - { - System::println(System::color::error, "Error: `%s` requires %u arguments, but %u were provided", this->command, expected_arg_count, actual_arg_count); - System::print(example_text); - Checks::exit_fail(VCPKG_LINE_INFO); - } - } -} -- cgit v1.2.3