From 4faf11f206791a3bddf437314efe0ad45d2e2b0c Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 11:21:51 -0700 Subject: Add size_t overload to to_printf_arg() --- toolsrc/include/vcpkg_Strings.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/toolsrc/include/vcpkg_Strings.h b/toolsrc/include/vcpkg_Strings.h index 93e1389f8..dc17f35d2 100644 --- a/toolsrc/include/vcpkg_Strings.h +++ b/toolsrc/include/vcpkg_Strings.h @@ -19,6 +19,11 @@ namespace vcpkg {namespace Strings {namespace details return s; } + inline size_t to_printf_arg(const size_t s) + { + return s; + } + std::string format_internal(const char* fmtstr, ...); inline const wchar_t* to_wprintf_arg(const std::wstring& s) -- cgit v1.2.3 From 3419a7f9ca7640a976e8a332c5f74d222b150c6c Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 11:22:24 -0700 Subject: Change error_count to size_t --- toolsrc/src/post_build_lint.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp index 8bd9838c6..29710bd14 100644 --- a/toolsrc/src/post_build_lint.cpp +++ b/toolsrc/src/post_build_lint.cpp @@ -309,7 +309,7 @@ namespace vcpkg return lint_status::SUCCESS; } - static void operator +=(unsigned int& left, const lint_status& right) + static void operator +=(size_t& left, const lint_status& right) { left += static_cast(right); } @@ -317,7 +317,7 @@ namespace vcpkg void perform_all_checks(const package_spec& spec, const vcpkg_paths& paths) { System::println("-- Performing post-build validation"); - unsigned int error_count = 0; + size_t error_count = 0; error_count += check_for_files_in_include_directory(spec, paths); error_count += check_for_files_in_debug_include_directory(spec, paths); error_count += check_for_files_in_debug_share_directory(spec, paths); @@ -345,7 +345,7 @@ namespace vcpkg if (error_count != 0) { const fs::path portfile = paths.ports / spec.name / "portfile.cmake"; - System::println(System::color::error, "Found %d error(s). Please correct the portfile:\n %s", error_count, portfile.string()); + System::println(System::color::error, "Found %u error(s). Please correct the portfile:\n %s", error_count, portfile.string()); exit(EXIT_FAILURE); } -- cgit v1.2.3 From 0fdd57983a6ea25324df861d96c1c45136160338 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 11:23:05 -0700 Subject: Introduce create_example_string() --- toolsrc/include/vcpkg_Commands.h | 1 + toolsrc/src/commands_other.cpp | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/toolsrc/include/vcpkg_Commands.h b/toolsrc/include/vcpkg_Commands.h index c706c131c..c3da552f2 100644 --- a/toolsrc/include/vcpkg_Commands.h +++ b/toolsrc/include/vcpkg_Commands.h @@ -9,6 +9,7 @@ namespace vcpkg void print_usage(); void print_example(const char* command_and_arguments); + std::string create_example_string(const char* command_and_arguments); void update_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths); void build_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet); diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index f4fad6690..63f7c52b2 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -41,10 +41,15 @@ namespace vcpkg , INTEGRATE_COMMAND_HELPSTRING); } + std::string create_example_string(const char* command_and_arguments) + { + return Strings::format("Example:\n" + " vcpkg %s", command_and_arguments); + } + void print_example(const char* command_and_arguments) { - System::println("Example:\n" - " vcpkg %s", command_and_arguments); + System::println(create_example_string(command_and_arguments).c_str()); } void internal_test_command(const vcpkg_cmd_arguments& /*args*/, const vcpkg_paths& /*paths*/) -- cgit v1.2.3 From fc1e55173b23afeb46142e6d656043a4b6f4b21c Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 11:24:04 -0700 Subject: Rename check_max_args to check_max_arg_count and introduce min/exact variants --- toolsrc/include/vcpkg_cmd_arguments.h | 8 +++++- toolsrc/src/commands_cache.cpp | 2 +- toolsrc/src/commands_create.cpp | 2 +- toolsrc/src/commands_edit.cpp | 4 +-- toolsrc/src/commands_help.cpp | 4 +-- toolsrc/src/commands_installation.cpp | 2 +- toolsrc/src/commands_list.cpp | 2 +- toolsrc/src/commands_owns.cpp | 2 +- toolsrc/src/commands_search.cpp | 2 +- toolsrc/src/vcpkg_cmd_arguments.cpp | 49 ++++++++++++++++++++++++++++++----- 10 files changed, 59 insertions(+), 18 deletions(-) diff --git a/toolsrc/include/vcpkg_cmd_arguments.h b/toolsrc/include/vcpkg_cmd_arguments.h index 7df3d64b1..fdb3b1045 100644 --- a/toolsrc/include/vcpkg_cmd_arguments.h +++ b/toolsrc/include/vcpkg_cmd_arguments.h @@ -26,7 +26,13 @@ namespace vcpkg std::vector command_arguments; std::unordered_set check_and_get_optional_command_arguments(const std::vector& valid_options) const; - void check_max_args(size_t arg_count, const char* example_text = nullptr) const; + void check_max_arg_count(const size_t expected_arg_count) const; + void check_max_arg_count(const size_t expected_arg_count, const char* example_text) const; + void check_min_arg_count(const size_t expected_arg_count) const; + void check_min_arg_count(const size_t expected_arg_count, const char* example_text) const; + void check_exact_arg_count(const size_t expected_arg_count) const; + void check_exact_arg_count(const size_t expected_arg_count, const char* example_text) const; + std::vector parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text = nullptr) const; private: diff --git a/toolsrc/src/commands_cache.cpp b/toolsrc/src/commands_cache.cpp index 3a08c4a64..0d70f0f29 100644 --- a/toolsrc/src/commands_cache.cpp +++ b/toolsrc/src/commands_cache.cpp @@ -7,7 +7,7 @@ namespace vcpkg { void cache_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - args.check_max_args(0); + args.check_exact_arg_count(0); auto begin_it = fs::directory_iterator(paths.packages); auto end_it = fs::directory_iterator(); diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index 85b98d667..2292581ee 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -7,7 +7,7 @@ namespace vcpkg { void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { - args.check_max_args(3); + args.check_max_arg_count(3); if (args.command_arguments.size() < 2) { System::println(System::color::error, "Error: create requires the archive's URL as the second argument."); diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index fe02bfa26..09de37545 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -5,8 +5,8 @@ namespace vcpkg { void edit_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { - static auto example = "edit zlib"; - args.check_max_args(1, example); + static auto example = create_example_string("edit zlib").c_str(); + args.check_max_arg_count(1, example); package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example).at(0); // Find editor diff --git a/toolsrc/src/commands_help.cpp b/toolsrc/src/commands_help.cpp index 4e1ae9c49..69aabd9cc 100644 --- a/toolsrc/src/commands_help.cpp +++ b/toolsrc/src/commands_help.cpp @@ -6,7 +6,7 @@ namespace vcpkg { void version_command(const vcpkg_cmd_arguments& args) { - args.check_max_args(0); + args.check_max_arg_count(0); System::println("Vcpkg package management program version %s\n" "\n" "Vcpkg is provided \"as-is\" without warranty of any kind, express or implied.\n" @@ -17,7 +17,7 @@ namespace vcpkg void help_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - args.check_max_args(1); + args.check_max_arg_count(1); if (args.command_arguments.empty()) { print_usage(); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 2890184fb..6604685c0 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -122,7 +122,7 @@ namespace vcpkg { // Installing multiple packages leads to unintuitive behavior if one of them depends on another. // Allowing only 1 package for now. - args.check_max_args(1); + args.check_max_arg_count(1); StatusParagraphs status_db = database_load_check(paths); diff --git a/toolsrc/src/commands_list.cpp b/toolsrc/src/commands_list.cpp index 2969ea953..ad34e76bf 100644 --- a/toolsrc/src/commands_list.cpp +++ b/toolsrc/src/commands_list.cpp @@ -6,7 +6,7 @@ namespace vcpkg { void list_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - args.check_max_args(0); + args.check_max_arg_count(0); std::vector packages_output; for (auto&& pgh : database_load_check(paths)) diff --git a/toolsrc/src/commands_owns.cpp b/toolsrc/src/commands_owns.cpp index 19c0a8dc6..36e853a58 100644 --- a/toolsrc/src/commands_owns.cpp +++ b/toolsrc/src/commands_owns.cpp @@ -6,7 +6,7 @@ namespace vcpkg { void owns_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - args.check_max_args(1); + args.check_max_arg_count(1); if (args.command_arguments.size() == 0) { System::println(System::color::error, "Error: owns requires a pattern to search for as the first argument."); diff --git a/toolsrc/src/commands_search.cpp b/toolsrc/src/commands_search.cpp index ce02e9c3b..3cd6d2ff7 100644 --- a/toolsrc/src/commands_search.cpp +++ b/toolsrc/src/commands_search.cpp @@ -38,7 +38,7 @@ namespace vcpkg void search_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - args.check_max_args(1); + args.check_max_arg_count(1); if (args.command_arguments.size() == 0) { do_print(paths, [](std::string&) -> bool diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index ec6946b98..dd8b41a72 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -166,15 +166,50 @@ namespace vcpkg return output; } - void vcpkg_cmd_arguments::check_max_args(size_t arg_count, const char* example_text) const + void vcpkg_cmd_arguments::check_max_arg_count(const size_t expected_arg_count) const { - if (command_arguments.size() > arg_count) + 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 char* 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: too many arguments to command %s", command); - if (example_text != nullptr) - print_example(example_text); - else - print_usage(); + 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); + exit(EXIT_FAILURE); + } + } + + void vcpkg_cmd_arguments::check_min_arg_count(const size_t expected_arg_count, const char* 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); + exit(EXIT_FAILURE); + } + } + + void vcpkg_cmd_arguments::check_exact_arg_count(const size_t expected_arg_count, const char* 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); exit(EXIT_FAILURE); } } -- cgit v1.2.3 From 82d145c9bcce22bf9b5b2a88fdab5b3eb2f5f377 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 11:24:04 -0700 Subject: Add quotes around command name --- toolsrc/src/vcpkg_cmd_arguments.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index dd8b41a72..062da4b02 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -186,7 +186,7 @@ namespace vcpkg 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::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); exit(EXIT_FAILURE); } @@ -197,7 +197,7 @@ namespace vcpkg 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::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); exit(EXIT_FAILURE); } @@ -208,7 +208,7 @@ namespace vcpkg 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::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); exit(EXIT_FAILURE); } -- cgit v1.2.3 From b2c1076aef280e7ebfd38845dfcb4d4b66cd45e3 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 11:24:04 -0700 Subject: All commands now use the new functions for argument checking --- toolsrc/src/commands_create.cpp | 10 +++------- toolsrc/src/commands_edit.cpp | 6 +++--- toolsrc/src/commands_help.cpp | 5 +++-- toolsrc/src/commands_import.cpp | 9 ++------- toolsrc/src/commands_installation.cpp | 16 ++++++++-------- toolsrc/src/commands_integration.cpp | 10 +++------- toolsrc/src/commands_list.cpp | 2 +- toolsrc/src/commands_other.cpp | 5 +++-- toolsrc/src/commands_owns.cpp | 10 +++------- toolsrc/src/commands_remove.cpp | 3 +++ toolsrc/src/commands_search.cpp | 4 +++- toolsrc/src/commands_update.cpp | 3 ++- 12 files changed, 37 insertions(+), 46 deletions(-) diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index 2292581ee..d365dac70 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -7,13 +7,9 @@ namespace vcpkg { void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { - args.check_max_arg_count(3); - if (args.command_arguments.size() < 2) - { - System::println(System::color::error, "Error: create requires the archive's URL as the second argument."); - print_usage(); - exit(EXIT_FAILURE); - } + static const std::string example = create_example_string(R"###(create zlib2 http://zlib.net/zlib128.zip "zlib128-2.zip")###"); + args.check_max_arg_count(3, example.c_str()); + args.check_min_arg_count(2, example.c_str()); expected current_spec = package_spec::from_string(args.command_arguments[0], default_target_triplet); if (const package_spec* spec = current_spec.get()) diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index 09de37545..d29d55a58 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -5,9 +5,9 @@ namespace vcpkg { void edit_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { - static auto example = create_example_string("edit zlib").c_str(); - args.check_max_arg_count(1, example); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example).at(0); + static const std::string example = create_example_string("edit zlib"); + args.check_exact_arg_count(1, example.c_str()); + package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example.c_str()).at(0); // Find editor std::wstring env_EDITOR = System::wdupenv_str(L"EDITOR"); diff --git a/toolsrc/src/commands_help.cpp b/toolsrc/src/commands_help.cpp index 69aabd9cc..27dc168a4 100644 --- a/toolsrc/src/commands_help.cpp +++ b/toolsrc/src/commands_help.cpp @@ -6,7 +6,7 @@ namespace vcpkg { void version_command(const vcpkg_cmd_arguments& args) { - args.check_max_arg_count(0); + args.check_exact_arg_count(0); System::println("Vcpkg package management program version %s\n" "\n" "Vcpkg is provided \"as-is\" without warranty of any kind, express or implied.\n" @@ -37,8 +37,9 @@ namespace vcpkg exit(EXIT_SUCCESS); } - void contact_command(const vcpkg_cmd_arguments& /*args*/) + void contact_command(const vcpkg_cmd_arguments& args) { + args.check_exact_arg_count(0); System::println("Send an email to vcpkg@microsoft.com with any feedback."); exit(EXIT_SUCCESS); } diff --git a/toolsrc/src/commands_import.cpp b/toolsrc/src/commands_import.cpp index b1eae277c..9cfc53d6c 100644 --- a/toolsrc/src/commands_import.cpp +++ b/toolsrc/src/commands_import.cpp @@ -1,17 +1,12 @@ #include "vcpkg_Commands.h" #include "vcpkg.h" -#include "vcpkg_System.h" namespace vcpkg { void import_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - if (args.command_arguments.size() != 3) - { - System::println(System::color::error, "Error: %s requires 3 parameters", args.command); - print_example(Strings::format(R"(%s C:\path\to\CONTROLfile C:\path\to\includedir C:\path\to\projectdir)", args.command).c_str()); - exit(EXIT_FAILURE); - } + static const std::string example = create_example_string(R"(import C:\path\to\CONTROLfile C:\path\to\includedir C:\path\to\projectdir)"); + args.check_exact_arg_count(3, example.c_str()); const fs::path control_file_path(args.command_arguments[0]); const fs::path include_directory(args.command_arguments[1]); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 6604685c0..baa0e6951 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -65,6 +65,8 @@ namespace vcpkg void install_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { + static const std::string example = create_example_string("install zlib zlib:x64-windows curl boost"); + args.check_min_arg_count(1, example.c_str()); StatusParagraphs status_db = database_load_check(paths); std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); @@ -120,10 +122,12 @@ namespace vcpkg void build_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { + static const std::string example = create_example_string("build zlib:x64-windows"); + // Installing multiple packages leads to unintuitive behavior if one of them depends on another. - // Allowing only 1 package for now. - args.check_max_arg_count(1); + // Allowing only 1 package for now. + args.check_exact_arg_count(1, example.c_str()); StatusParagraphs status_db = database_load_check(paths); const package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); @@ -148,12 +152,8 @@ namespace vcpkg void build_external_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { - if (args.command_arguments.size() != 2) - { - System::println(System::color::error, "Error: buildexternal requires the package name and the directory containing the CONTROL file"); - print_example(R"(buildexternal mylib C:\path\to\mylib\)"); - exit(EXIT_FAILURE); - } + static const std::string example = create_example_string(R"(build_external zlib2 C:\path\to\dir\with\controlfile\)"); + args.check_exact_arg_count(2, example.c_str()); expected current_spec = package_spec::from_string(args.command_arguments[0], default_target_triplet); if (auto spec = current_spec.get()) diff --git a/toolsrc/src/commands_integration.cpp b/toolsrc/src/commands_integration.cpp index 743a57a70..6a11d6ec4 100644 --- a/toolsrc/src/commands_integration.cpp +++ b/toolsrc/src/commands_integration.cpp @@ -297,13 +297,9 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console void integrate_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - if (args.command_arguments.size() != 1) - { - std::cout << "Commands:\n" << - INTEGRATE_COMMAND_HELPSTRING << - "\n"; - exit(EXIT_FAILURE); - } + static const std::string example = Strings::format("Commands:\n" + "%s", INTEGRATE_COMMAND_HELPSTRING); + args.check_exact_arg_count(1, example.c_str()); if (args.command_arguments[0] == "install") { diff --git a/toolsrc/src/commands_list.cpp b/toolsrc/src/commands_list.cpp index ad34e76bf..194e4b435 100644 --- a/toolsrc/src/commands_list.cpp +++ b/toolsrc/src/commands_list.cpp @@ -6,7 +6,7 @@ namespace vcpkg { void list_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - args.check_max_arg_count(0); + args.check_exact_arg_count(0); std::vector packages_output; for (auto&& pgh : database_load_check(paths)) diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index 63f7c52b2..4ba4112d4 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -43,8 +43,9 @@ namespace vcpkg std::string create_example_string(const char* command_and_arguments) { - return Strings::format("Example:\n" - " vcpkg %s", command_and_arguments); + std::string cs = Strings::format("Example:\n" + " vcpkg %s", command_and_arguments); + return cs; } void print_example(const char* command_and_arguments) diff --git a/toolsrc/src/commands_owns.cpp b/toolsrc/src/commands_owns.cpp index 36e853a58..b3dab2e44 100644 --- a/toolsrc/src/commands_owns.cpp +++ b/toolsrc/src/commands_owns.cpp @@ -6,13 +6,9 @@ namespace vcpkg { void owns_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - args.check_max_arg_count(1); - if (args.command_arguments.size() == 0) - { - System::println(System::color::error, "Error: owns requires a pattern to search for as the first argument."); - print_example("owns .dll"); - exit(EXIT_FAILURE); - } + static const std::string example = Strings::format("The argument should be a pattern to search for. %s", create_example_string("owns zlib.dll")); + args.check_exact_arg_count(1, example.c_str()); + StatusParagraphs status_db = database_load_check(paths); search_file(paths, args.command_arguments[0], status_db); exit(EXIT_SUCCESS); diff --git a/toolsrc/src/commands_remove.cpp b/toolsrc/src/commands_remove.cpp index f5315ccb1..c2d6cced3 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -22,6 +22,9 @@ namespace vcpkg void remove_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { + static const std::string example = create_example_string("remove zlib zlib:x64-windows curl boost"); + args.check_min_arg_count(1, example.c_str()); + const std::unordered_set options = args.check_and_get_optional_command_arguments({OPTION_PURGE}); auto status_db = database_load_check(paths); diff --git a/toolsrc/src/commands_search.cpp b/toolsrc/src/commands_search.cpp index 3cd6d2ff7..36926764b 100644 --- a/toolsrc/src/commands_search.cpp +++ b/toolsrc/src/commands_search.cpp @@ -38,7 +38,9 @@ namespace vcpkg void search_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { - args.check_max_arg_count(1); + 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", create_example_string("search png")); + args.check_max_arg_count(1, example.c_str()); + if (args.command_arguments.size() == 0) { do_print(paths, [](std::string&) -> bool diff --git a/toolsrc/src/commands_update.cpp b/toolsrc/src/commands_update.cpp index 3cd7af027..b34530f40 100644 --- a/toolsrc/src/commands_update.cpp +++ b/toolsrc/src/commands_update.cpp @@ -5,8 +5,9 @@ namespace vcpkg { - void update_command(const vcpkg_cmd_arguments& /*args*/, const vcpkg_paths& paths) + void update_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { + args.check_exact_arg_count(0); System::println("Using local portfile versions. To update the local portfiles, use `git pull`."); auto status_db = database_load_check(paths); -- cgit v1.2.3 From 3f5275ed9f2d6af085c0921aaa4ac58d10b0a23a Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 16:29:12 -0700 Subject: Add function check_and_get_package_spec() and variant for multiple specs --- toolsrc/include/vcpkg_cmd_arguments.h | 4 +++- toolsrc/src/vcpkg_cmd_arguments.cpp | 33 ++++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/toolsrc/include/vcpkg_cmd_arguments.h b/toolsrc/include/vcpkg_cmd_arguments.h index fdb3b1045..74db5e21e 100644 --- a/toolsrc/include/vcpkg_cmd_arguments.h +++ b/toolsrc/include/vcpkg_cmd_arguments.h @@ -13,9 +13,11 @@ namespace vcpkg struct vcpkg_cmd_arguments { static vcpkg_cmd_arguments create_from_command_line(const int argc, const wchar_t* const* const argv); - static vcpkg_cmd_arguments create_from_arg_sequence(const std::string* arg_begin, const std::string* arg_end); + static package_spec check_and_get_package_spec(const std::string& package_spec_as_string, const triplet& default_target_triplet, const char* example_text); + static std::vector check_and_get_package_specs(const std::vector& package_specs_as_strings, const triplet& default_target_triplet, const char* example_text); + std::unique_ptr vcpkg_root_dir; std::unique_ptr target_triplet; opt_bool debug = opt_bool::unspecified; diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index 062da4b02..302ff4a7e 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -50,6 +50,30 @@ namespace vcpkg option_field = new_setting; } + package_spec vcpkg_cmd_arguments::check_and_get_package_spec(const std::string& package_spec_as_string, const triplet& default_target_triplet, const char* example_text) + { + expected expected_spec = package_spec::from_string(package_spec_as_string, default_target_triplet); + if (auto spec = expected_spec.get()) + { + return *spec; + } + + System::println(System::color::error, "Error: %s: %s", expected_spec.error_code().message(), package_spec_as_string); + System::print(example_text); + exit(EXIT_FAILURE); + } + + std::vector vcpkg_cmd_arguments::check_and_get_package_specs(const std::vector& package_specs_as_strings, const triplet& default_target_triplet, const char* example_text) + { + std::vector specs; + for (const std::string& spec : package_specs_as_strings) + { + specs.push_back(check_and_get_package_spec(spec, default_target_triplet, example_text)); + } + + return specs; + } + vcpkg_cmd_arguments vcpkg_cmd_arguments::create_from_command_line(const int argc, const wchar_t* const* const argv) { std::vector v; @@ -217,15 +241,6 @@ namespace vcpkg std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text) const { size_t arg_count = command_arguments.size(); - if (arg_count < 1) - { - System::println(System::color::error, "Error: %s requires one or more package specifiers", this->command); - if (example_text == nullptr) - print_example(Strings::format("%s zlib zlib:x64-windows curl boost", this->command).c_str()); - else - print_example(example_text); - exit(EXIT_FAILURE); - } std::vector specs; specs.reserve(arg_count); -- cgit v1.2.3 From df55e93b18e609b75d15cdb985bbd04cb9436d81 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 16:34:55 -0700 Subject: [vcpkg_paths] Use fs alias in all places within the header --- toolsrc/include/vcpkg_paths.h | 30 +++++++++++++++--------------- toolsrc/src/vcpkg_paths.cpp | 2 -- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/toolsrc/include/vcpkg_paths.h b/toolsrc/include/vcpkg_paths.h index d13c73b0b..046b6836c 100644 --- a/toolsrc/include/vcpkg_paths.h +++ b/toolsrc/include/vcpkg_paths.h @@ -9,28 +9,28 @@ namespace vcpkg struct vcpkg_paths { - static expected create(const std::tr2::sys::path& vcpkg_root_dir); + static expected create(const fs::path& vcpkg_root_dir); fs::path package_dir(const package_spec& spec) const; fs::path port_dir(const package_spec& spec) const; bool is_valid_triplet(const triplet& t) const; - std::tr2::sys::path root; - std::tr2::sys::path packages; - std::tr2::sys::path buildtrees; - std::tr2::sys::path downloads; - std::tr2::sys::path ports; - std::tr2::sys::path installed; - std::tr2::sys::path triplets; + fs::path root; + fs::path packages; + fs::path buildtrees; + fs::path downloads; + fs::path ports; + fs::path installed; + fs::path triplets; - std::tr2::sys::path buildsystems; - std::tr2::sys::path buildsystems_msbuild_targets; + fs::path buildsystems; + fs::path buildsystems_msbuild_targets; - std::tr2::sys::path vcpkg_dir; - std::tr2::sys::path vcpkg_dir_status_file; - std::tr2::sys::path vcpkg_dir_info; - std::tr2::sys::path vcpkg_dir_updates; + fs::path vcpkg_dir; + fs::path vcpkg_dir_status_file; + fs::path vcpkg_dir_info; + fs::path vcpkg_dir_updates; - std::tr2::sys::path ports_cmake; + fs::path ports_cmake; }; } diff --git a/toolsrc/src/vcpkg_paths.cpp b/toolsrc/src/vcpkg_paths.cpp index 463f62c80..982eb9970 100644 --- a/toolsrc/src/vcpkg_paths.cpp +++ b/toolsrc/src/vcpkg_paths.cpp @@ -5,8 +5,6 @@ #include "vcpkg_System.h" #include "package_spec.h" -namespace fs = std::tr2::sys; - namespace vcpkg { expected vcpkg_paths::create(const fs::path& vcpkg_root_dir) -- cgit v1.2.3 From d7c357db2e3b6c15c422f5b631dcb089c245d3bf Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 16:38:29 -0700 Subject: Replace usage of parse_all_args_as_package_specs with the new functions --- toolsrc/src/commands_edit.cpp | 4 ++-- toolsrc/src/commands_installation.cpp | 4 ++-- toolsrc/src/commands_remove.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index d29d55a58..4973d6ef2 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -7,14 +7,14 @@ namespace vcpkg { static const std::string example = create_example_string("edit zlib"); args.check_exact_arg_count(1, example.c_str()); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example.c_str()).at(0); + const package_spec spec = vcpkg_cmd_arguments::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); // Find editor std::wstring env_EDITOR = System::wdupenv_str(L"EDITOR"); if (env_EDITOR.empty()) env_EDITOR = LR"(C:\Program Files (x86)\Microsoft VS Code\Code.exe)"; - auto portpath = paths.ports / spec.name; + const fs::path portpath = paths.ports / spec.name; std::wstring cmdLine = Strings::wformat(LR"("%s" "%s" "%s")", env_EDITOR, portpath.native(), (portpath / "portfile.cmake").native()); exit(System::cmd_execute(cmdLine)); } diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index baa0e6951..9eacfedcc 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -69,7 +69,7 @@ namespace vcpkg args.check_min_arg_count(1, example.c_str()); StatusParagraphs status_db = database_load_check(paths); - std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::vector specs = vcpkg_cmd_arguments::check_and_get_package_specs(args.command_arguments, default_target_triplet, example.c_str()); std::vector install_plan = Dependencies::create_dependency_ordered_install_plan(paths, specs, status_db); Checks::check_exit(!install_plan.empty(), "Install plan cannot be empty"); std::string specs_string = to_string(install_plan[0]); @@ -130,7 +130,7 @@ namespace vcpkg args.check_exact_arg_count(1, example.c_str()); StatusParagraphs status_db = database_load_check(paths); - const package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); + const package_spec spec = vcpkg_cmd_arguments::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); std::unordered_set unmet_dependencies = Dependencies::find_unmet_dependencies(paths, spec, status_db); if (!unmet_dependencies.empty()) { diff --git a/toolsrc/src/commands_remove.cpp b/toolsrc/src/commands_remove.cpp index c2d6cced3..fd0c43de5 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -28,7 +28,7 @@ namespace vcpkg const std::unordered_set options = args.check_and_get_optional_command_arguments({OPTION_PURGE}); auto status_db = database_load_check(paths); - std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::vector specs = vcpkg_cmd_arguments::check_and_get_package_specs(args.command_arguments, default_target_triplet, example.c_str()); bool alsoRemoveFolderFromPackages = options.find(OPTION_PURGE) != options.end(); for (const package_spec& spec : specs) -- cgit v1.2.3 From bcb2be360a3ce577fc09fe1ffb6b7e0335ebb889 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 16:39:23 -0700 Subject: Remove parse_all_arguments_as_package_specs() --- toolsrc/include/vcpkg_cmd_arguments.h | 2 -- toolsrc/src/vcpkg_cmd_arguments.cpp | 24 ------------------------ 2 files changed, 26 deletions(-) diff --git a/toolsrc/include/vcpkg_cmd_arguments.h b/toolsrc/include/vcpkg_cmd_arguments.h index 74db5e21e..54b97cde1 100644 --- a/toolsrc/include/vcpkg_cmd_arguments.h +++ b/toolsrc/include/vcpkg_cmd_arguments.h @@ -35,8 +35,6 @@ namespace vcpkg void check_exact_arg_count(const size_t expected_arg_count) const; void check_exact_arg_count(const size_t expected_arg_count, const char* example_text) const; - std::vector parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text = nullptr) const; - private: std::unordered_set optional_command_arguments; }; diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index 302ff4a7e..f1ab4e937 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -237,28 +237,4 @@ namespace vcpkg exit(EXIT_FAILURE); } } - - std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text) const - { - size_t arg_count = command_arguments.size(); - std::vector specs; - specs.reserve(arg_count); - - for (const std::string& command_argument : command_arguments) - { - expected current_spec = package_spec::from_string(command_argument, default_target_triplet); - if (auto spec = current_spec.get()) - { - specs.push_back(std::move(*spec)); - } - else - { - System::println(System::color::error, "Error: %s: %s", current_spec.error_code().message(), command_argument); - print_example(Strings::format("%s zlib:x64-windows", this->command).c_str()); - exit(EXIT_FAILURE); - } - } - - return specs; - } } -- cgit v1.2.3