From a1d9468e6d2ac35e6195cf2a111212c4adc865a1 Mon Sep 17 00:00:00 2001 From: Dan Sarginson Date: Wed, 21 Sep 2016 19:31:36 -0700 Subject: Remove use of wildcard in integration installation dest path. This seemed to be used in order to stop XPATH blocking on the file/directory dialog. It was causing odd issues I mentioned in #62. Instead used "echo f" to assure XCOPY that we're dealing with files. Fixes #62. --- toolsrc/src/commands_integration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_integration.cpp b/toolsrc/src/commands_integration.cpp index 178d40e83..4f3fdd20b 100644 --- a/toolsrc/src/commands_integration.cpp +++ b/toolsrc/src/commands_integration.cpp @@ -195,7 +195,7 @@ namespace vcpkg const fs::path sys_src_path = tmp_dir / "vcpkg.system.targets"; std::ofstream(sys_src_path) << create_system_targets_shortcut(); - const std::string param = Strings::format(R"(/c XCOPY "%s" "%s*" /Y > nul)", sys_src_path.string(), system_wide_targets_file.string()); + const std::string param = Strings::format(R"(/c echo f | XCOPY "%s" "%s" /Y > nul)", sys_src_path.string(), system_wide_targets_file.string()); elevation_prompt_user_choice user_choice = elevated_cmd_execute(param); switch (user_choice) { -- cgit v1.2.3 From 54341f745c134d740ddc6a6538483070ad5877ef Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 21 Sep 2016 21:43:59 -0700 Subject: MOve recursive upwards search to Files --- toolsrc/include/vcpkg_Files.h | 2 ++ toolsrc/src/main.cpp | 17 +---------------- toolsrc/src/vcpkg_Files.cpp | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 16 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Files.h b/toolsrc/include/vcpkg_Files.h index d23742f74..2c24f9508 100644 --- a/toolsrc/include/vcpkg_Files.h +++ b/toolsrc/include/vcpkg_Files.h @@ -8,4 +8,6 @@ namespace vcpkg {namespace Files void check_is_directory(const std::tr2::sys::path& dirpath); expected get_contents(const std::tr2::sys::path& file_path) noexcept; + + std::tr2::sys::path find_file_recursively_up(const std::tr2::sys::path& starting_dir, const std::string& filename); }} diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index d3fb855d1..e9ce4702c 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -23,21 +23,6 @@ void invalid_command(const std::string& cmd) exit(EXIT_FAILURE); } -static fs::path find_file_recursively_up(const fs::path& starting_dir, const std::string& filename) -{ - fs::path current_dir = starting_dir; - for (; !current_dir.empty(); current_dir = current_dir.parent_path()) - { - const fs::path candidate = current_dir / filename; - if (fs::exists(candidate)) - { - break; - } - } - - return current_dir; -} - static void inner(const vcpkg_cmd_arguments& args) { TrackProperty("command", args.command); @@ -67,7 +52,7 @@ static void inner(const vcpkg_cmd_arguments& args) } else { - vcpkg_root_dir = find_file_recursively_up(fs::absolute(System::get_exe_path_of_current_process()), ".vcpkg-root"); + vcpkg_root_dir = Files::find_file_recursively_up(fs::absolute(System::get_exe_path_of_current_process()), ".vcpkg-root"); } } diff --git a/toolsrc/src/vcpkg_Files.cpp b/toolsrc/src/vcpkg_Files.cpp index 49a661157..ef330ea27 100644 --- a/toolsrc/src/vcpkg_Files.cpp +++ b/toolsrc/src/vcpkg_Files.cpp @@ -35,4 +35,19 @@ namespace vcpkg {namespace Files return std::move(output); } + + fs::path find_file_recursively_up(const fs::path& starting_dir, const std::string& filename) + { + fs::path current_dir = starting_dir; + for (; !current_dir.empty(); current_dir = current_dir.parent_path()) + { + const fs::path candidate = current_dir / filename; + if (fs::exists(candidate)) + { + break; + } + } + + return current_dir; + } }} -- cgit v1.2.3 From fd7969d325bdbf330f57037d8899d6dcfb4cc07f Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 21 Sep 2016 21:57:27 -0700 Subject: Move search_command to a separate file --- toolsrc/src/commands_installation.cpp | 39 ----------------------------- toolsrc/src/commands_search.cpp | 47 +++++++++++++++++++++++++++++++++++ toolsrc/vcpkg/vcpkg.vcxproj | 1 + toolsrc/vcpkg/vcpkg.vcxproj.filters | 3 +++ 4 files changed, 51 insertions(+), 39 deletions(-) create mode 100644 toolsrc/src/commands_search.cpp (limited to 'toolsrc') diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index b70ab0249..ba24f74e8 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -1,8 +1,6 @@ #include "vcpkg_Commands.h" #include "vcpkg.h" -#include #include -#include #include "vcpkg_Environment.h" #include "metrics.h" #include "vcpkg_Files.h" @@ -111,43 +109,6 @@ namespace vcpkg exit(EXIT_SUCCESS); } - void search_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) - { - args.check_max_args(1); - - if (args.command_arguments.size() == 1) - { - System::println(System::color::warning, "Search strings are not yet implemented; showing full list of packages."); - } - - auto begin_it = fs::directory_iterator(paths.ports); - auto end_it = fs::directory_iterator(); - for (; begin_it != end_it; ++begin_it) - { - const auto& path = begin_it->path(); - - try - { - auto pghs = get_paragraphs(path / "CONTROL"); - if (pghs.empty()) - continue; - auto srcpgh = SourceParagraph(pghs[0]); - std::cout << std::left - << std::setw(20) << srcpgh.name << ' ' - << std::setw(16) << srcpgh.version << ' ' - << shorten_description(srcpgh.description) << '\n'; - } - catch (std::runtime_error const&) - { - } - } - - System::println("\nIf your library is not listed, please open an issue at:\n" - " https://github.com/Microsoft/vcpkg/issues"); - - exit(EXIT_SUCCESS); - } - void cache_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { args.check_max_args(0); diff --git a/toolsrc/src/commands_search.cpp b/toolsrc/src/commands_search.cpp new file mode 100644 index 000000000..718da1045 --- /dev/null +++ b/toolsrc/src/commands_search.cpp @@ -0,0 +1,47 @@ +#include "vcpkg_Commands.h" +#include "vcpkg_System.h" +#include "vcpkg.h" +#include +#include + +namespace fs = std::tr2::sys; + +namespace vcpkg +{ + void search_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + { + args.check_max_args(1); + + if (args.command_arguments.size() == 1) + { + System::println(System::color::warning, "Search strings are not yet implemented; showing full list of packages."); + } + + auto begin_it = fs::directory_iterator(paths.ports); + auto end_it = fs::directory_iterator(); + for (; begin_it != end_it; ++begin_it) + { + const auto& path = begin_it->path(); + + try + { + auto pghs = get_paragraphs(path / "CONTROL"); + if (pghs.empty()) + continue; + auto srcpgh = SourceParagraph(pghs[0]); + std::cout << std::left + << std::setw(20) << srcpgh.name << ' ' + << std::setw(16) << srcpgh.version << ' ' + << shorten_description(srcpgh.description) << '\n'; + } + catch (std::runtime_error const&) + { + } + } + + System::println("\nIf your library is not listed, please open an issue at:\n" + " https://github.com/Microsoft/vcpkg/issues"); + + exit(EXIT_SUCCESS); + } +} diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 15f5064d4..7b518f30f 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -129,6 +129,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index 3ae3bf3a9..e22728d23 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -42,6 +42,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From 63052551eff40b05b58a69b0af43a353500a5d72 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 21 Sep 2016 22:14:02 -0700 Subject: Simplify for-iterator --- toolsrc/src/commands_search.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_search.cpp b/toolsrc/src/commands_search.cpp index 718da1045..e3c51faaf 100644 --- a/toolsrc/src/commands_search.cpp +++ b/toolsrc/src/commands_search.cpp @@ -17,11 +17,9 @@ namespace vcpkg System::println(System::color::warning, "Search strings are not yet implemented; showing full list of packages."); } - auto begin_it = fs::directory_iterator(paths.ports); - auto end_it = fs::directory_iterator(); - for (; begin_it != end_it; ++begin_it) + for (auto it = fs::directory_iterator(paths.ports); it != fs::directory_iterator(); ++it) { - const auto& path = begin_it->path(); + const fs::path& path = it->path(); try { -- cgit v1.2.3 From 869a3b22ad9d13fa29b40751998127270365880b Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 21 Sep 2016 22:47:36 -0700 Subject: vcpkg search now does substring search --- toolsrc/src/commands_search.cpp | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_search.cpp b/toolsrc/src/commands_search.cpp index e3c51faaf..ce02e9c3b 100644 --- a/toolsrc/src/commands_search.cpp +++ b/toolsrc/src/commands_search.cpp @@ -8,15 +8,9 @@ namespace fs = std::tr2::sys; namespace vcpkg { - void search_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + template + static void do_print(const vcpkg_paths& paths, Pred predicate) { - args.check_max_args(1); - - if (args.command_arguments.size() == 1) - { - System::println(System::color::warning, "Search strings are not yet implemented; showing full list of packages."); - } - for (auto it = fs::directory_iterator(paths.ports); it != fs::directory_iterator(); ++it) { const fs::path& path = it->path(); @@ -27,15 +21,38 @@ namespace vcpkg if (pghs.empty()) continue; auto srcpgh = SourceParagraph(pghs[0]); - std::cout << std::left - << std::setw(20) << srcpgh.name << ' ' - << std::setw(16) << srcpgh.version << ' ' - << shorten_description(srcpgh.description) << '\n'; + + if (predicate(srcpgh.name)) + { + std::cout << std::left + << std::setw(20) << srcpgh.name << ' ' + << std::setw(16) << srcpgh.version << ' ' + << shorten_description(srcpgh.description) << '\n'; + } } catch (std::runtime_error const&) { } } + } + + void search_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + { + args.check_max_args(1); + if (args.command_arguments.size() == 0) + { + do_print(paths, [](std::string&) -> bool + { + return true; + }); + exit(EXIT_SUCCESS); + } + + // At this point there is 1 argument + do_print(paths, [&](std::string& port_name) -> bool + { + return Strings::case_insensitive_find(port_name, args.command_arguments[0]) != port_name.end(); + }); System::println("\nIf your library is not listed, please open an issue at:\n" " https://github.com/Microsoft/vcpkg/issues"); -- cgit v1.2.3 From 03b43aad42c8eca03937148cda7afffceeeeca1c Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 21 Sep 2016 23:49:20 -0700 Subject: Place command_cache in a separate cpp file --- toolsrc/src/commands_cache.cpp | 39 +++++++++++++++++++++++++++++++++++ toolsrc/src/commands_installation.cpp | 32 ---------------------------- toolsrc/vcpkg/vcpkg.vcxproj | 1 + toolsrc/vcpkg/vcpkg.vcxproj.filters | 3 +++ 4 files changed, 43 insertions(+), 32 deletions(-) create mode 100644 toolsrc/src/commands_cache.cpp (limited to 'toolsrc') diff --git a/toolsrc/src/commands_cache.cpp b/toolsrc/src/commands_cache.cpp new file mode 100644 index 000000000..3a08c4a64 --- /dev/null +++ b/toolsrc/src/commands_cache.cpp @@ -0,0 +1,39 @@ +#include "vcpkg_Commands.h" +#include "vcpkg_System.h" +#include "vcpkg_Files.h" +#include "vcpkg.h" + +namespace vcpkg +{ + void cache_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + { + args.check_max_args(0); + + auto begin_it = fs::directory_iterator(paths.packages); + auto end_it = fs::directory_iterator(); + + if (begin_it == end_it) + { + System::println("No packages are cached."); + exit(EXIT_SUCCESS); + } + + for (; begin_it != end_it; ++begin_it) + { + const auto& path = begin_it->path(); + + auto file_contents = Files::get_contents(path / "CONTROL"); + if (auto text = file_contents.get()) + { + auto pghs = parse_paragraphs(*text); + if (pghs.size() != 1) + continue; + + auto src = BinaryParagraph(pghs[0]); + System::println(src.displayname().c_str()); + } + } + + exit(EXIT_SUCCESS); + } +} diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index ba24f74e8..36f26fdab 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -109,38 +109,6 @@ namespace vcpkg exit(EXIT_SUCCESS); } - void cache_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) - { - args.check_max_args(0); - - auto begin_it = fs::directory_iterator(paths.packages); - auto end_it = fs::directory_iterator(); - - if (begin_it == end_it) - { - System::println("No packages are cached."); - exit(EXIT_SUCCESS); - } - - for (; begin_it != end_it; ++begin_it) - { - const auto& path = begin_it->path(); - - auto file_contents = Files::get_contents(path / "CONTROL"); - if (auto text = file_contents.get()) - { - auto pghs = parse_paragraphs(*text); - if (pghs.size() != 1) - continue; - - auto src = BinaryParagraph(pghs[0]); - System::println(src.displayname().c_str()); - } - } - - exit(EXIT_SUCCESS); - } - void build_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 7b518f30f..748c4522a 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -128,6 +128,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index e22728d23..88ef1f298 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -45,6 +45,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From aeab2fee872f38189d069cf60da1e45c4dbf13bd Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 21 Sep 2016 23:51:45 -0700 Subject: Place update_command() in a separate cpp file --- toolsrc/src/commands_other.cpp | 85 ---------------------------------- toolsrc/src/commands_update.cpp | 91 +++++++++++++++++++++++++++++++++++++ toolsrc/vcpkg/vcpkg.vcxproj | 1 + toolsrc/vcpkg/vcpkg.vcxproj.filters | 3 ++ 4 files changed, 95 insertions(+), 85 deletions(-) create mode 100644 toolsrc/src/commands_update.cpp (limited to 'toolsrc') diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index c7dcc2586..a8192691d 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -1,6 +1,5 @@ #include "vcpkg_Commands.h" #include -#include #include "vcpkg_Environment.h" #include "vcpkg.h" #include "vcpkg_System.h" @@ -51,90 +50,6 @@ namespace vcpkg " vcpkg " << command_and_arguments << "\n"; } - void update_command(const vcpkg_cmd_arguments& /*args*/, const vcpkg_paths& paths) - { - auto status_db = database_load_check(paths); - - std::unordered_map src_names_to_versions; - - auto begin_it = fs::directory_iterator(paths.ports); - auto end_it = fs::directory_iterator(); - for (; begin_it != end_it; ++begin_it) - { - const auto& path = begin_it->path(); - try - { - auto pghs = get_paragraphs(path / "CONTROL"); - if (pghs.empty()) - continue; - auto srcpgh = SourceParagraph(pghs[0]); - src_names_to_versions.emplace(srcpgh.name, srcpgh.version); - } - catch (std::runtime_error const&) - { - } - } - - std::string packages_list; - - std::vector packages_output; - for (auto&& pgh : database_load_check(paths)) - { - if (pgh->state == install_state_t::not_installed && pgh->want == want_t::purge) - continue; - auto it = src_names_to_versions.find(pgh->package.name); - if (it == src_names_to_versions.end()) - { - // Package was not installed from portfile - continue; - } - if (it->second != pgh->package.version) - { - packages_output.push_back(Strings::format("%-27s %s -> %s", - pgh->package.displayname(), - pgh->package.version, - it->second)); - packages_list.append(" " + pgh->package.displayname()); - } - } - std::sort(packages_output.begin(), packages_output.end()); - if (packages_output.empty()) - { - System::println("No packages need updating."); - } - else - { - System::println("The following packages differ from their port versions:"); - for (auto&& package : packages_output) - { - System::println(" %s", package.c_str()); - } - System::println("\nTo update these packages, run\n vcpkg remove --purge ...\n vcpkg install ..."); - } - - auto version_file = Files::get_contents(paths.root / "toolsrc" / "VERSION.txt"); - if (auto version_contents = version_file.get()) - { - int maj1, min1, rev1; - auto num1 = sscanf_s(version_contents->c_str(), "\"%d.%d.%d\"", &maj1, &min1, &rev1); - - int maj2, min2, rev2; - auto num2 = sscanf_s(version().c_str(), "%d.%d.%d-", &maj2, &min2, &rev2); - - if (num1 == 3 && num2 == 3) - { - if (maj1 != maj2 || min1 != min2 || rev1 != rev2) - { - System::println("Different source is available for vcpkg (%d.%d.%d -> %d.%d.%d). Use scripts\\bootstrap.ps1 to update.", - maj2, min2, rev2, - maj1, min1, rev1); - } - } - } - - exit(EXIT_SUCCESS); - } - void edit_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { static auto example = "edit zlib"; diff --git a/toolsrc/src/commands_update.cpp b/toolsrc/src/commands_update.cpp new file mode 100644 index 000000000..eec3e46a7 --- /dev/null +++ b/toolsrc/src/commands_update.cpp @@ -0,0 +1,91 @@ +#include "vcpkg_Commands.h" +#include "vcpkg.h" +#include "vcpkg_System.h" +#include "vcpkg_Files.h" + +namespace vcpkg +{ + void update_command(const vcpkg_cmd_arguments& /*args*/, const vcpkg_paths& paths) + { + auto status_db = database_load_check(paths); + + std::unordered_map src_names_to_versions; + + auto begin_it = fs::directory_iterator(paths.ports); + auto end_it = fs::directory_iterator(); + for (; begin_it != end_it; ++begin_it) + { + const auto& path = begin_it->path(); + try + { + auto pghs = get_paragraphs(path / "CONTROL"); + if (pghs.empty()) + continue; + auto srcpgh = SourceParagraph(pghs[0]); + src_names_to_versions.emplace(srcpgh.name, srcpgh.version); + } + catch (std::runtime_error const&) + { + } + } + + std::string packages_list; + + std::vector packages_output; + for (auto&& pgh : database_load_check(paths)) + { + if (pgh->state == install_state_t::not_installed && pgh->want == want_t::purge) + continue; + auto it = src_names_to_versions.find(pgh->package.name); + if (it == src_names_to_versions.end()) + { + // Package was not installed from portfile + continue; + } + if (it->second != pgh->package.version) + { + packages_output.push_back(Strings::format("%-27s %s -> %s", + pgh->package.displayname(), + pgh->package.version, + it->second)); + packages_list.append(" " + pgh->package.displayname()); + } + } + std::sort(packages_output.begin(), packages_output.end()); + if (packages_output.empty()) + { + System::println("No packages need updating."); + } + else + { + System::println("The following packages differ from their port versions:"); + for (auto&& package : packages_output) + { + System::println(" %s", package.c_str()); + } + System::println("\nTo update these packages, run\n vcpkg remove --purge ...\n vcpkg install ..."); + } + + auto version_file = Files::get_contents(paths.root / "toolsrc" / "VERSION.txt"); + if (auto version_contents = version_file.get()) + { + int maj1, min1, rev1; + auto num1 = sscanf_s(version_contents->c_str(), "\"%d.%d.%d\"", &maj1, &min1, &rev1); + + int maj2, min2, rev2; + auto num2 = sscanf_s(version().c_str(), "%d.%d.%d-", &maj2, &min2, &rev2); + + if (num1 == 3 && num2 == 3) + { + if (maj1 != maj2 || min1 != min2 || rev1 != rev2) + { + System::println("Different source is available for vcpkg (%d.%d.%d -> %d.%d.%d). Use scripts\\bootstrap.ps1 to update.", + maj2, min2, rev2, + maj1, min1, rev1); + } + } + } + + exit(EXIT_SUCCESS); + } +} diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 748c4522a..70c1a96ef 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -131,6 +131,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index 88ef1f298..4511c989c 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -48,6 +48,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From 97b79e1f0c2c7e0e9ef2346c5b32b98e42a00155 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 21 Sep 2016 23:54:23 -0700 Subject: Place command_list() in a separate cpp file --- toolsrc/src/commands_list.cpp | 32 ++++++++++++++++++++++++++++++++ toolsrc/src/commands_other.cpp | 26 -------------------------- toolsrc/vcpkg/vcpkg.vcxproj | 1 + toolsrc/vcpkg/vcpkg.vcxproj.filters | 3 +++ 4 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 toolsrc/src/commands_list.cpp (limited to 'toolsrc') diff --git a/toolsrc/src/commands_list.cpp b/toolsrc/src/commands_list.cpp new file mode 100644 index 000000000..2969ea953 --- /dev/null +++ b/toolsrc/src/commands_list.cpp @@ -0,0 +1,32 @@ +#include "vcpkg_Commands.h" +#include "vcpkg.h" +#include "vcpkg_System.h" + +namespace vcpkg +{ + void list_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + { + args.check_max_args(0); + + std::vector packages_output; + for (auto&& pgh : database_load_check(paths)) + { + if (pgh->state == install_state_t::not_installed && pgh->want == want_t::purge) + continue; + packages_output.push_back(Strings::format("%-27s %-16s %s", + pgh->package.displayname(), + pgh->package.version, + shorten_description(pgh->package.description))); + } + std::sort(packages_output.begin(), packages_output.end()); + for (auto&& package : packages_output) + { + System::println(package.c_str()); + } + if (packages_output.empty()) + { + System::println("No packages are installed. Did you mean `search`?"); + } + exit(EXIT_SUCCESS); + } +} diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index a8192691d..a4f644c11 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -95,32 +95,6 @@ namespace vcpkg exit(System::cmd_execute(cmdline)); } - void list_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) - { - args.check_max_args(0); - - std::vector packages_output; - for (auto&& pgh : database_load_check(paths)) - { - if (pgh->state == install_state_t::not_installed && pgh->want == want_t::purge) - continue; - packages_output.push_back(Strings::format("%-27s %-16s %s", - pgh->package.displayname(), - pgh->package.version, - shorten_description(pgh->package.description))); - } - std::sort(packages_output.begin(), packages_output.end()); - for (auto&& package : packages_output) - { - System::println(package.c_str()); - } - if (packages_output.empty()) - { - System::println("No packages are installed. Did you mean `search`?"); - } - exit(EXIT_SUCCESS); - } - void import_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { if (args.command_arguments.size() != 3) diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 70c1a96ef..c20d5e7ce 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -129,6 +129,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index 4511c989c..ac0d188a0 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -51,6 +51,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From e3a9d3524b33c75b6a97081fc2b71b3e84e249b5 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 00:00:38 -0700 Subject: Place list_command() in a separate cpp file --- toolsrc/src/commands_edit.cpp | 21 +++++++++++++++++++++ toolsrc/src/commands_other.cpp | 16 ---------------- toolsrc/vcpkg/vcpkg.vcxproj | 1 + toolsrc/vcpkg/vcpkg.vcxproj.filters | 3 +++ 4 files changed, 25 insertions(+), 16 deletions(-) create mode 100644 toolsrc/src/commands_edit.cpp (limited to 'toolsrc') diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp new file mode 100644 index 000000000..71ae8b2c8 --- /dev/null +++ b/toolsrc/src/commands_edit.cpp @@ -0,0 +1,21 @@ +#include "vcpkg_Commands.h" +#include "vcpkg_System.h" + +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); + package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example).at(0); + + // 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; + std::wstring cmdLine = Strings::format(LR"("%s" "%s" "%s")", env_EDITOR, portpath.native(), (portpath / "portfile.cmake").native()); + exit(System::cmd_execute(cmdLine)); + } +} diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index a4f644c11..444eff1c0 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -50,22 +50,6 @@ namespace vcpkg " vcpkg " << command_and_arguments << "\n"; } - 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); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example).at(0); - - // 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; - std::wstring cmdLine = Strings::format(LR"("%s" "%s" "%s")", env_EDITOR, portpath.native(), (portpath / "portfile.cmake").native()); - exit(System::cmd_execute(cmdLine)); - } - void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { args.check_max_args(3); diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index c20d5e7ce..0a69df78f 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -129,6 +129,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index ac0d188a0..6601935da 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -54,6 +54,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From 1339080a90a7a7344ae1da7003a380919d828ff0 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 00:02:09 -0700 Subject: Place command_create() in a separate cpp file --- toolsrc/src/commands_create.cpp | 35 +++++++++++++++++++++++++++++++++++ toolsrc/src/commands_other.cpp | 30 ------------------------------ toolsrc/vcpkg/vcpkg.vcxproj | 1 + toolsrc/vcpkg/vcpkg.vcxproj.filters | 3 +++ 4 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 toolsrc/src/commands_create.cpp (limited to 'toolsrc') diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp new file mode 100644 index 000000000..73d163af8 --- /dev/null +++ b/toolsrc/src/commands_create.cpp @@ -0,0 +1,35 @@ +#include "vcpkg_Commands.h" +#include "vcpkg_System.h" +#include "vcpkg_Environment.h" + +namespace vcpkg +{ + void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) + { + args.check_max_args(3); + package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); + 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); + } + Environment::ensure_utilities_on_path(paths); + + // Space OR define the FILENAME with proper spacing + std::wstring custom_filename = L" "; + if (args.command_arguments.size() >= 3) + { + custom_filename = Strings::format(L" -DFILENAME=%s ", Strings::utf8_to_utf16(args.command_arguments.at(2))); + } + + const std::wstring cmdline = Strings::format(LR"(cmake -DCMD=SCAFFOLD -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", + Strings::utf8_to_utf16(spec.name), + Strings::utf8_to_utf16(spec.target_triplet.value), + Strings::utf8_to_utf16(args.command_arguments.at(1)), + custom_filename, + paths.ports_cmake.generic_wstring()); + + exit(System::cmd_execute(cmdline)); + } +} diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index 444eff1c0..2cafd5453 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -1,6 +1,5 @@ #include "vcpkg_Commands.h" #include -#include "vcpkg_Environment.h" #include "vcpkg.h" #include "vcpkg_System.h" #include "vcpkg_Files.h" @@ -50,35 +49,6 @@ namespace vcpkg " vcpkg " << command_and_arguments << "\n"; } - void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) - { - args.check_max_args(3); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); - 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); - } - Environment::ensure_utilities_on_path(paths); - - // Space OR define the FILENAME with proper spacing - std::wstring custom_filename = L" "; - if (args.command_arguments.size() >= 3) - { - custom_filename = Strings::format(L" -DFILENAME=%s ", Strings::utf8_to_utf16(args.command_arguments.at(2))); - } - - const std::wstring cmdline = Strings::format(LR"(cmake -DCMD=SCAFFOLD -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", - Strings::utf8_to_utf16(spec.name), - Strings::utf8_to_utf16(spec.target_triplet.value), - Strings::utf8_to_utf16(args.command_arguments.at(1)), - custom_filename, - paths.ports_cmake.generic_wstring()); - - exit(System::cmd_execute(cmdline)); - } - void import_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { if (args.command_arguments.size() != 3) diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 0a69df78f..475868b27 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -129,6 +129,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index 6601935da..75ebc38e4 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -57,6 +57,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From 4f80532991f5b9d4d1eae455a91f289e9bea081a Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 00:06:37 -0700 Subject: Place owns_command() in a separate cpp file --- toolsrc/src/commands_other.cpp | 16 ---------------- toolsrc/src/commands_owns.cpp | 23 +++++++++++++++++++++++ toolsrc/vcpkg/vcpkg.vcxproj | 1 + toolsrc/vcpkg/vcpkg.vcxproj.filters | 3 +++ 4 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 toolsrc/src/commands_owns.cpp (limited to 'toolsrc') diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index 2cafd5453..0c56e0f79 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -73,22 +73,6 @@ namespace vcpkg exit(EXIT_SUCCESS); } - void owns_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) - { - args.check_max_args(1); - if (args.command_arguments.size() == 0) - { - System::println(System::color::error, "Error: owns requires a pattern to search for as the first argument."); - std::cout << - "example:\n" - " vcpkg owns .dll\n"; - exit(EXIT_FAILURE); - } - StatusParagraphs status_db = database_load_check(paths); - search_file(paths, args.command_arguments[0], status_db); - exit(EXIT_SUCCESS); - } - void internal_test_command(const vcpkg_cmd_arguments& /*args*/, const vcpkg_paths& /*paths*/) { // auto data = FormatEventData("test"); diff --git a/toolsrc/src/commands_owns.cpp b/toolsrc/src/commands_owns.cpp new file mode 100644 index 000000000..1c54b35f7 --- /dev/null +++ b/toolsrc/src/commands_owns.cpp @@ -0,0 +1,23 @@ +#include "vcpkg_Commands.h" +#include "vcpkg_System.h" +#include "vcpkg.h" +#include + +namespace vcpkg +{ + void owns_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + { + args.check_max_args(1); + if (args.command_arguments.size() == 0) + { + System::println(System::color::error, "Error: owns requires a pattern to search for as the first argument."); + std::cout << + "example:\n" + " vcpkg owns .dll\n"; + exit(EXIT_FAILURE); + } + StatusParagraphs status_db = database_load_check(paths); + search_file(paths, args.command_arguments[0], status_db); + exit(EXIT_SUCCESS); + } +} diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 475868b27..899ea2e5e 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -132,6 +132,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index 75ebc38e4..e31b53d6c 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -60,6 +60,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From 95a44983db361d42c9ae3781acc4345d405cefed Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 00:40:23 -0700 Subject: Use print_example() --- toolsrc/src/commands_owns.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_owns.cpp b/toolsrc/src/commands_owns.cpp index 1c54b35f7..19c0a8dc6 100644 --- a/toolsrc/src/commands_owns.cpp +++ b/toolsrc/src/commands_owns.cpp @@ -1,7 +1,6 @@ #include "vcpkg_Commands.h" #include "vcpkg_System.h" #include "vcpkg.h" -#include namespace vcpkg { @@ -11,9 +10,7 @@ namespace vcpkg if (args.command_arguments.size() == 0) { System::println(System::color::error, "Error: owns requires a pattern to search for as the first argument."); - std::cout << - "example:\n" - " vcpkg owns .dll\n"; + print_example("owns .dll"); exit(EXIT_FAILURE); } StatusParagraphs status_db = database_load_check(paths); -- cgit v1.2.3 From f26c8c8b60217dea25f3d53e3d613ad11bb98216 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 01:15:09 -0700 Subject: Place import_command() in a separate cpp file --- toolsrc/src/commands_import.cpp | 30 ++++++++++++++++++++++++++++++ toolsrc/src/commands_other.cpp | 26 -------------------------- toolsrc/vcpkg/vcpkg.vcxproj | 1 + toolsrc/vcpkg/vcpkg.vcxproj.filters | 3 +++ 4 files changed, 34 insertions(+), 26 deletions(-) create mode 100644 toolsrc/src/commands_import.cpp (limited to 'toolsrc') diff --git a/toolsrc/src/commands_import.cpp b/toolsrc/src/commands_import.cpp new file mode 100644 index 000000000..b1eae277c --- /dev/null +++ b/toolsrc/src/commands_import.cpp @@ -0,0 +1,30 @@ +#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); + } + + const fs::path control_file_path(args.command_arguments[0]); + const fs::path include_directory(args.command_arguments[1]); + const fs::path project_directory(args.command_arguments[2]); + + auto pghs = get_paragraphs(control_file_path); + Checks::check_throw(pghs.size() == 1, "Invalid control file for package"); + + StatusParagraph spgh; + spgh.package = BinaryParagraph(pghs[0]); + auto& control_file_data = spgh.package; + + vcpkg::binary_import(paths, include_directory, project_directory, control_file_data); + exit(EXIT_SUCCESS); + } +} diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index 0c56e0f79..be89d539f 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -1,8 +1,6 @@ #include "vcpkg_Commands.h" #include #include "vcpkg.h" -#include "vcpkg_System.h" -#include "vcpkg_Files.h" namespace vcpkg { @@ -49,30 +47,6 @@ namespace vcpkg " vcpkg " << command_and_arguments << "\n"; } - 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); - } - - const fs::path control_file_path(args.command_arguments[0]); - const fs::path include_directory(args.command_arguments[1]); - const fs::path project_directory(args.command_arguments[2]); - - auto pghs = get_paragraphs(control_file_path); - Checks::check_throw(pghs.size() == 1, "Invalid control file for package"); - - StatusParagraph spgh; - spgh.package = BinaryParagraph(pghs[0]); - auto& control_file_data = spgh.package; - - vcpkg::binary_import(paths, include_directory, project_directory, control_file_data); - exit(EXIT_SUCCESS); - } - void internal_test_command(const vcpkg_cmd_arguments& /*args*/, const vcpkg_paths& /*paths*/) { // auto data = FormatEventData("test"); diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 899ea2e5e..065d1b9c5 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -131,6 +131,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index e31b53d6c..95aa0ceb7 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -63,6 +63,9 @@ Source Files + + Source Files + -- cgit v1.2.3 From 23a45e7db6fe997add43aeb4f3716e3083704e2a Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 01:24:26 -0700 Subject: Use System::println() --- toolsrc/src/commands_other.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index be89d539f..f237d2726 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -1,12 +1,13 @@ #include "vcpkg_Commands.h" -#include +#include "vcpkg_System.h" #include "vcpkg.h" namespace vcpkg { void print_usage() { - std::cout << "Commands:\n" + System::println( + "Commands:\n" " vcpkg search [pat] Search for packages available to be built\n" " vcpkg install Install a package\n" " vcpkg remove Uninstall a package. \n" @@ -14,9 +15,9 @@ namespace vcpkg " vcpkg list List installed packages\n" " vcpkg update Display list of packages for updating\n" "\n" - << INTEGRATE_COMMAND_HELPSTRING << + "%s" // Integration help "\n" - " vcpkg edit Open up a port for editing (uses %EDITOR%, default 'code')\n" + " vcpkg edit Open up a port for editing (uses %%EDITOR%%, default 'code')\n" " vcpkg import Import a pre-built library\n" " vcpkg create \n" " [archivename] Create a new package\n" @@ -34,17 +35,16 @@ namespace vcpkg " (default: x86-windows, see 'vcpkg help triplet')\n" "\n" " --vcpkg-root Specify the vcpkg root directory\n" - " (default: %VCPKG_ROOT%)\n" + " (default: %%VCPKG_ROOT%%)\n" "\n" "For more help (including examples) see the accompanying README.md." - "\n"; + , INTEGRATE_COMMAND_HELPSTRING); } void print_example(const char* command_and_arguments) { - std::cout << - "Example:\n" - " vcpkg " << command_and_arguments << "\n"; + System::println("Example:\n" + " vcpkg %s", command_and_arguments); } void internal_test_command(const vcpkg_cmd_arguments& /*args*/, const vcpkg_paths& /*paths*/) -- cgit v1.2.3 From eba6126d15c393561969870aae7b89bba22163c6 Mon Sep 17 00:00:00 2001 From: Albert Ziegenhagel Date: Thu, 22 Sep 2016 12:00:27 +0200 Subject: Introduced environment variable "VCPKG_DEFAULT_TRIPLET" --- toolsrc/src/commands_other.cpp | 2 +- toolsrc/src/main.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index f237d2726..f4fad6690 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -32,7 +32,7 @@ namespace vcpkg //"\n" "Options:\n" " --triplet Specify the target architecture triplet.\n" - " (default: x86-windows, see 'vcpkg help triplet')\n" + " (default: %%VCPKG_DEFAULT_TRIPLET%%, see 'vcpkg help triplet')\n" "\n" " --vcpkg-root Specify the vcpkg root directory\n" " (default: %%VCPKG_ROOT%%)\n" diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index e9ce4702c..65d3738ec 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -69,7 +69,16 @@ static void inner(const vcpkg_cmd_arguments& args) return command_function(args, paths); } - triplet default_target_triplet = triplet::X86_WINDOWS; + triplet default_target_triplet; + const auto vcpkg_default_triplet_env = System::wdupenv_str(L"VCPKG_DEFAULT_TRIPLET"); + if(!vcpkg_default_triplet_env.empty()) + { + default_target_triplet = {std::string(vcpkg_default_triplet_env.begin(), vcpkg_default_triplet_env.end())}; + } + else + { + default_target_triplet = triplet::X86_WINDOWS; + } if (args.target_triplet != nullptr) { -- cgit v1.2.3 From 4a818b6a3e86514af27381fe16dcf311a5c28ffb Mon Sep 17 00:00:00 2001 From: Albert Ziegenhagel Date: Thu, 22 Sep 2016 13:17:00 +0200 Subject: Fixed encoding of default triplet name --- toolsrc/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index 65d3738ec..2ec2c8fba 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -73,7 +73,7 @@ static void inner(const vcpkg_cmd_arguments& args) const auto vcpkg_default_triplet_env = System::wdupenv_str(L"VCPKG_DEFAULT_TRIPLET"); if(!vcpkg_default_triplet_env.empty()) { - default_target_triplet = {std::string(vcpkg_default_triplet_env.begin(), vcpkg_default_triplet_env.end())}; + default_target_triplet = {Strings::utf16_to_utf8(vcpkg_default_triplet_env)}; } else { -- cgit v1.2.3 From c699d5715b2e768ef2f7742a1894742df982038b Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 23:27:46 -0700 Subject: Introduce vcpkg::Sets utility namespace --- toolsrc/include/vcpkg_Sets.h | 17 +++++++++++++++++ toolsrc/vcpkgcommon/vcpkgcommon.vcxproj | 1 + toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters | 3 +++ 3 files changed, 21 insertions(+) create mode 100644 toolsrc/include/vcpkg_Sets.h (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Sets.h b/toolsrc/include/vcpkg_Sets.h new file mode 100644 index 000000000..7b330f31c --- /dev/null +++ b/toolsrc/include/vcpkg_Sets.h @@ -0,0 +1,17 @@ +#pragma once + +#include "vcpkg_Checks.h" +#include + +namespace vcpkg { namespace Sets +{ + template + void remove_all(std::unordered_set* input_set, Container remove_these) + { + Checks::check_throw(input_set != nullptr, "Input set cannot be null"); + for (const T& r : remove_these) + { + input_set->erase(r); + } + } +}} diff --git a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj index 95cfd5764..e91cf2cf8 100644 --- a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj +++ b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj @@ -131,6 +131,7 @@ + diff --git a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters index a7e98c853..969cf58b4 100644 --- a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters +++ b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters @@ -50,5 +50,8 @@ Header Files + + Header Files + \ No newline at end of file -- cgit v1.2.3 From addecbfdefe9f00214db9af438b0fe255e92a16a Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 23:28:14 -0700 Subject: Introduce vcpkg_Maps utility namespace --- toolsrc/include/vcpkg_Maps.h | 18 ++++++++++++++++++ toolsrc/vcpkgcommon/vcpkgcommon.vcxproj | 1 + toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters | 3 +++ 3 files changed, 22 insertions(+) create mode 100644 toolsrc/include/vcpkg_Maps.h (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Maps.h b/toolsrc/include/vcpkg_Maps.h new file mode 100644 index 000000000..5b7b8ed46 --- /dev/null +++ b/toolsrc/include/vcpkg_Maps.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace vcpkg { namespace Maps +{ + template + std::unordered_set extract_key_set(const std::unordered_map& input_map) + { + std::unordered_set key_set; + for (auto const& element : input_map) + { + key_set.insert(element.first); + } + return key_set; + } +}} diff --git a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj index e91cf2cf8..d5e68fde3 100644 --- a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj +++ b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj @@ -131,6 +131,7 @@ + diff --git a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters index 969cf58b4..ae747d687 100644 --- a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters +++ b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters @@ -50,6 +50,9 @@ Header Files + + Header Files + Header Files -- cgit v1.2.3 From 33a2969b9c80c602a28e0d53560f39915de933fc Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 23:28:50 -0700 Subject: Refactor dependency related code to vcpkg::Dependencies --- toolsrc/include/vcpkg_Dependencies.h | 13 +++++++ toolsrc/include/vcpkg_cmd_arguments.h | 1 - toolsrc/src/commands_installation.cpp | 14 ++++---- toolsrc/src/vcpkg_Dependencies.cpp | 68 +++++++++++++++++++++++++++++++++++ toolsrc/src/vcpkg_cmd_arguments.cpp | 41 --------------------- toolsrc/vcpkg/vcpkg.vcxproj | 2 ++ toolsrc/vcpkg/vcpkg.vcxproj.filters | 6 ++++ 7 files changed, 97 insertions(+), 48 deletions(-) create mode 100644 toolsrc/include/vcpkg_Dependencies.h create mode 100644 toolsrc/src/vcpkg_Dependencies.cpp (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Dependencies.h b/toolsrc/include/vcpkg_Dependencies.h new file mode 100644 index 000000000..94aa51f99 --- /dev/null +++ b/toolsrc/include/vcpkg_Dependencies.h @@ -0,0 +1,13 @@ +#pragma once +#include +#include "package_spec.h" +#include "StatusParagraphs.h" +#include +#include "vcpkg_paths.h" + +namespace vcpkg {namespace Dependencies +{ + std::vector create_dependency_ordered_install_plan(const vcpkg_paths& paths, const std::vector& specs, const StatusParagraphs& status_db); + + std::unordered_set find_unmet_dependencies(const vcpkg_paths& paths, const std::vector& specs, const StatusParagraphs& status_db); +}} diff --git a/toolsrc/include/vcpkg_cmd_arguments.h b/toolsrc/include/vcpkg_cmd_arguments.h index 0df3d1222..7df3d64b1 100644 --- a/toolsrc/include/vcpkg_cmd_arguments.h +++ b/toolsrc/include/vcpkg_cmd_arguments.h @@ -28,7 +28,6 @@ namespace vcpkg void check_max_args(size_t arg_count, const char* example_text = nullptr) const; std::vector parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text = nullptr) const; - std::vector extract_package_specs_with_unmet_dependencies(const vcpkg_paths& paths, const triplet& default_target_triplet, const StatusParagraphs& status_db) const; private: std::unordered_set optional_command_arguments; diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 36f26fdab..7004307b3 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -6,6 +6,7 @@ #include "vcpkg_Files.h" #include "post_build_lint.h" #include "vcpkg_System.h" +#include "vcpkg_Dependencies.h" namespace vcpkg { @@ -59,18 +60,19 @@ namespace vcpkg { StatusParagraphs status_db = database_load_check(paths); - std::vector specs = args.extract_package_specs_with_unmet_dependencies(paths, default_target_triplet, status_db); - Checks::check_exit(!specs.empty(), "Specs cannot be empty"); - std::string specs_string = to_string(specs[0]); - for (size_t i = 1; i < specs.size(); ++i) + std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + 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]); + for (size_t i = 1; i < install_plan.size(); ++i) { specs_string.push_back(','); - specs_string.append(to_string(specs[i])); + specs_string.append(to_string(install_plan[i])); } TrackProperty("installplan", specs_string); Environment::ensure_utilities_on_path(paths); - for (const package_spec& spec : specs) + for (const package_spec& spec : install_plan) { if (status_db.find_installed(spec.name, spec.target_triplet) != status_db.end()) { diff --git a/toolsrc/src/vcpkg_Dependencies.cpp b/toolsrc/src/vcpkg_Dependencies.cpp new file mode 100644 index 000000000..751b503c0 --- /dev/null +++ b/toolsrc/src/vcpkg_Dependencies.cpp @@ -0,0 +1,68 @@ +#include "vcpkg_Dependencies.h" +#include +#include "vcpkg_Graphs.h" +#include "vcpkg_paths.h" +#include "package_spec.h" +#include "StatusParagraphs.h" +#include +#include "vcpkg.h" +#include "vcpkg_Maps.h" +#include "vcpkg_Sets.h" + +namespace vcpkg { namespace Dependencies +{ + static Graphs::Graph build_dependency_graph(const vcpkg_paths& paths, const std::vector& specs, const StatusParagraphs& status_db) + { + std::vector examine_stack(specs); + std::unordered_set was_examined; // Examine = we have checked its immediate (non-recursive) dependencies + Graphs::Graph graph; + graph.add_vertices(examine_stack); + + while (!examine_stack.empty()) + { + package_spec spec = examine_stack.back(); + examine_stack.pop_back(); + + if (was_examined.find(spec) != was_examined.end()) + { + continue; + } + + std::vector dependencies_as_string = get_unmet_package_dependencies(paths, spec, status_db); + + for (const std::string& dep_as_string : dependencies_as_string) + { + package_spec current_dep = {dep_as_string, spec.target_triplet}; + auto it = status_db.find(current_dep.name, current_dep.target_triplet); + if (it != status_db.end() && (*it)->want == want_t::install) + { + continue; + } + + graph.add_edge(spec, current_dep); + if (was_examined.find(current_dep) == was_examined.end()) + { + examine_stack.push_back(std::move(current_dep)); + } + } + + was_examined.insert(spec); + } + + return graph; + } + + std::vector create_dependency_ordered_install_plan(const vcpkg_paths& paths, const std::vector& specs, const StatusParagraphs& status_db) + { + return build_dependency_graph(paths, specs, status_db).find_topological_sort(); + } + + std::unordered_set find_unmet_dependencies(const vcpkg_paths& paths, const std::vector& specs, const StatusParagraphs& status_db) + { + const Graphs::Graph dependency_graph = build_dependency_graph(paths, specs, status_db); + std::unordered_set key_set = Maps::extract_key_set(dependency_graph.adjacency_list()); + Sets::remove_all(&key_set, specs); + + return key_set; + } +}} diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index 4cfc12716..3605503b0 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -179,47 +179,6 @@ namespace vcpkg } } - std::vector vcpkg_cmd_arguments::extract_package_specs_with_unmet_dependencies(const vcpkg_paths& paths, const triplet& default_target_triplet, const StatusParagraphs& status_db) const - { - std::vector specs = parse_all_arguments_as_package_specs(default_target_triplet); - std::unordered_set had_its_immediate_dependencies_added; - Graphs::Graph graph; - graph.add_vertices(specs); - - while (!specs.empty()) - { - package_spec spec = specs.back(); - specs.pop_back(); - - if (had_its_immediate_dependencies_added.find(spec) != had_its_immediate_dependencies_added.end()) - { - continue; - } - - std::vector dependencies_as_string = get_unmet_package_dependencies(paths, spec, status_db); - - for (const std::string& dep_as_string : dependencies_as_string) - { - package_spec current_dep = {dep_as_string, spec.target_triplet}; - auto it = status_db.find(current_dep.name, current_dep.target_triplet); - if (it != status_db.end() && (*it)->want == want_t::install) - { - continue; - } - - graph.add_edge(spec, current_dep); - if (had_its_immediate_dependencies_added.find(current_dep) == had_its_immediate_dependencies_added.end()) - { - specs.push_back(std::move(current_dep)); - } - } - - had_its_immediate_dependencies_added.insert(spec); - } - - return graph.find_topological_sort(); - } - 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(); diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 065d1b9c5..a59683470 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -139,6 +139,7 @@ + @@ -149,6 +150,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index 95aa0ceb7..2e8a343fc 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -66,6 +66,9 @@ Source Files + + Source Files + @@ -80,5 +83,8 @@ Header Files + + Header Files + \ No newline at end of file -- cgit v1.2.3 From a26c88c754c14e2fd059f2ddbd69802b875b77ea Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 22 Sep 2016 23:53:13 -0700 Subject: `vcpkg build` will now show helpful error if dependencies are missing --- toolsrc/src/commands_installation.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 7004307b3..29233c5d9 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -113,7 +113,23 @@ namespace vcpkg void build_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { + StatusParagraphs status_db = database_load_check(paths); + std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::unordered_set unmet_dependencies = Dependencies::find_unmet_dependencies(paths, specs, status_db); + if (!unmet_dependencies.empty()) + { + System::println(System::color::error, "The build command requires all dependencies to be already installed."); + System::println("The following dependencies are missing:"); + System::println(""); + for (const package_spec& p : unmet_dependencies) + { + System::println(" %s", p.name); + } + System::println(""); + exit(EXIT_FAILURE); + } + Environment::ensure_utilities_on_path(paths); for (const package_spec& spec : specs) { -- cgit v1.2.3 From 5b89712df01c96242ced20c38f0fa27631c3f4e3 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 23 Sep 2016 00:02:51 -0700 Subject: Restruct `vcpkg build` to 1 package --- toolsrc/src/commands_installation.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 29233c5d9..35c78db8f 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -113,6 +113,10 @@ namespace vcpkg void build_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { + // Currently the code won't work for multiple packages if one of them depends on another. + // Allowing only 1 package for now. + args.check_max_args(1); + StatusParagraphs status_db = database_load_check(paths); std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); -- cgit v1.2.3 From 31935aa0fd142cbb4e0db1a62ba1483294b740f8 Mon Sep 17 00:00:00 2001 From: Albert Ziegenhagel Date: Fri, 23 Sep 2016 09:44:30 +0200 Subject: Improved error reporting when user provides invalid triplets --- toolsrc/include/triplet.h | 4 ++++ toolsrc/include/vcpkg_cmd_arguments.h | 2 +- toolsrc/src/commands_create.cpp | 2 +- toolsrc/src/commands_edit.cpp | 2 +- toolsrc/src/commands_installation.cpp | 2 +- toolsrc/src/commands_remove.cpp | 2 +- toolsrc/src/main.cpp | 39 ++++++++++++++--------------------- toolsrc/src/triplet.cpp | 16 ++++++++++++++ toolsrc/src/vcpkg_cmd_arguments.cpp | 11 ++++++++-- 9 files changed, 49 insertions(+), 31 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/triplet.h b/toolsrc/include/triplet.h index f9d1e9483..0c42f2ec7 100644 --- a/toolsrc/include/triplet.h +++ b/toolsrc/include/triplet.h @@ -4,6 +4,8 @@ namespace vcpkg { + struct vcpkg_paths; + struct triplet { static const triplet X86_WINDOWS; @@ -17,6 +19,8 @@ namespace vcpkg std::string architecture() const; std::string system() const; + + bool validate(const vcpkg_paths& paths); }; bool operator==(const triplet& left, const triplet& right); diff --git a/toolsrc/include/vcpkg_cmd_arguments.h b/toolsrc/include/vcpkg_cmd_arguments.h index 0df3d1222..5a5075d23 100644 --- a/toolsrc/include/vcpkg_cmd_arguments.h +++ b/toolsrc/include/vcpkg_cmd_arguments.h @@ -27,7 +27,7 @@ namespace vcpkg 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; - std::vector parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text = nullptr) const; + std::vector parse_all_arguments_as_package_specs(const vcpkg_paths& paths, const triplet& default_target_triplet, const char* example_text = nullptr) const; std::vector extract_package_specs_with_unmet_dependencies(const vcpkg_paths& paths, const triplet& default_target_triplet, const StatusParagraphs& status_db) const; private: diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index 73d163af8..8ae67b799 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); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); + package_spec spec = args.parse_all_arguments_as_package_specs(paths, default_target_triplet).at(0); 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 71ae8b2c8..2272c1277 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -7,7 +7,7 @@ namespace vcpkg { static auto example = "edit zlib"; args.check_max_args(1, example); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example).at(0); + package_spec spec = args.parse_all_arguments_as_package_specs(paths, default_target_triplet, example).at(0); // Find editor std::wstring env_EDITOR = System::wdupenv_str(L"EDITOR"); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 36f26fdab..0ca754dfc 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -111,7 +111,7 @@ namespace vcpkg void build_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { - std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::vector specs = args.parse_all_arguments_as_package_specs(paths, default_target_triplet); Environment::ensure_utilities_on_path(paths); for (const package_spec& spec : specs) { diff --git a/toolsrc/src/commands_remove.cpp b/toolsrc/src/commands_remove.cpp index f5315ccb1..0b00e10f6 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -25,7 +25,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 = args.parse_all_arguments_as_package_specs(paths, default_target_triplet); bool alsoRemoveFolderFromPackages = options.find(OPTION_PURGE) != options.end(); for (const package_spec& spec : specs) diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index 2ec2c8fba..a2f6fa10f 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -70,40 +70,31 @@ static void inner(const vcpkg_cmd_arguments& args) } triplet default_target_triplet; - const auto vcpkg_default_triplet_env = System::wdupenv_str(L"VCPKG_DEFAULT_TRIPLET"); - if(!vcpkg_default_triplet_env.empty()) + if(args.target_triplet != nullptr) { - default_target_triplet = {Strings::utf16_to_utf8(vcpkg_default_triplet_env)}; + default_target_triplet = {*args.target_triplet}; } else { - default_target_triplet = triplet::X86_WINDOWS; - } - - if (args.target_triplet != nullptr) - { - const std::string& target_triplet = *args.target_triplet; - - auto it = fs::directory_iterator(paths.triplets); - for (; it != fs::directory_iterator(); ++it) + const auto vcpkg_default_triplet_env = System::wdupenv_str(L"VCPKG_DEFAULT_TRIPLET"); + if(!vcpkg_default_triplet_env.empty()) { - std::string triplet_file_name = it->path().stem().generic_u8string(); - if (target_triplet == triplet_file_name) // TODO: fuzzy compare - { - default_target_triplet = {triplet_file_name}; - break; - } + default_target_triplet = {Strings::utf16_to_utf8(vcpkg_default_triplet_env)}; } - - if (it == fs::directory_iterator()) + else { - System::println(System::color::error, "Error: invalid triplet: %s", target_triplet); - TrackProperty("error", "invalid triplet: " + target_triplet); - help_topic_valid_triplet(paths); - exit(EXIT_FAILURE); + default_target_triplet = triplet::X86_WINDOWS; } } + if(!default_target_triplet.validate(paths)) + { + System::println(System::color::error, "Error: invalid triplet: %s", default_target_triplet.value); + TrackProperty("error", "invalid triplet: " + default_target_triplet.value); + help_topic_valid_triplet(paths); + exit(EXIT_FAILURE); + } + if (auto command_function = find_command(args.command, get_available_commands_type_a())) { return command_function(args, paths, default_target_triplet); diff --git a/toolsrc/src/triplet.cpp b/toolsrc/src/triplet.cpp index 9ad3d8847..14f19d5cd 100644 --- a/toolsrc/src/triplet.cpp +++ b/toolsrc/src/triplet.cpp @@ -1,4 +1,5 @@ #include "triplet.h" +#include "vcpkg.h" #include "vcpkg_System.h" #include "vcpkg_Checks.h" @@ -56,4 +57,19 @@ namespace vcpkg Checks::exit_with_message("Unknown system: %s", value); } + + bool triplet::validate(const vcpkg_paths & paths) + { + auto it = fs::directory_iterator(paths.triplets); + for(; it != fs::directory_iterator(); ++it) + { + std::string triplet_file_name = it->path().stem().generic_u8string(); + if(value == triplet_file_name) // TODO: fuzzy compare + { + //value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare + return true; + } + } + return false; + } } diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index 4cfc12716..d302ee42e 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -181,7 +181,7 @@ namespace vcpkg std::vector vcpkg_cmd_arguments::extract_package_specs_with_unmet_dependencies(const vcpkg_paths& paths, const triplet& default_target_triplet, const StatusParagraphs& status_db) const { - std::vector specs = parse_all_arguments_as_package_specs(default_target_triplet); + std::vector specs = parse_all_arguments_as_package_specs(paths, default_target_triplet); std::unordered_set had_its_immediate_dependencies_added; Graphs::Graph graph; graph.add_vertices(specs); @@ -220,7 +220,7 @@ namespace vcpkg return graph.find_topological_sort(); } - std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text) const + std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const vcpkg_paths& paths, const triplet& default_target_triplet, const char* example_text) const { size_t arg_count = command_arguments.size(); if (arg_count < 1) @@ -240,6 +240,13 @@ namespace vcpkg expected current_spec = vcpkg::parse(command_argument, default_target_triplet); if (auto spec = current_spec.get()) { + if(!spec->target_triplet.validate(paths)) + { + System::println(System::color::error, "Error: invalid triplet %s for package %s", spec->target_triplet.value, spec->name); + TrackProperty("error", "invalid triplet: " + spec->target_triplet.value); + help_topic_valid_triplet(paths); + exit(EXIT_FAILURE); + } specs.push_back(std::move(*spec)); } else -- cgit v1.2.3 From 3495f094bc77e5e493e6fba29e383eb2631746c0 Mon Sep 17 00:00:00 2001 From: Albert Ziegenhagel Date: Fri, 23 Sep 2016 10:06:45 +0200 Subject: Fixed errors introduced during merge --- toolsrc/src/commands_installation.cpp | 2 +- toolsrc/src/vcpkg_cmd_arguments.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 0977dcf37..7c4652f4d 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -60,7 +60,7 @@ namespace vcpkg { StatusParagraphs status_db = database_load_check(paths); - std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::vector specs = args.parse_all_arguments_as_package_specs(paths, default_target_triplet); 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]); diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index e0f3f04ee..aea98dd10 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -179,7 +179,7 @@ namespace vcpkg } } - std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const vcpkg_paths& const triplet& default_target_triplet, const char* example_text) const + std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const vcpkg_paths& paths, const triplet& default_target_triplet, const char* example_text) const { size_t arg_count = command_arguments.size(); if (arg_count < 1) -- cgit v1.2.3 From 082eb3680e4a6ea0cd50001683c2e37c1693cc4b Mon Sep 17 00:00:00 2001 From: Albert Ziegenhagel Date: Fri, 23 Sep 2016 11:49:29 +0200 Subject: Disabled validation of per-package triplet --- toolsrc/src/vcpkg_cmd_arguments.cpp | 7 ------- 1 file changed, 7 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index aea98dd10..9181342d0 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -199,13 +199,6 @@ namespace vcpkg expected current_spec = vcpkg::parse(command_argument, default_target_triplet); if (auto spec = current_spec.get()) { - if(!spec->target_triplet.validate(paths)) - { - System::println(System::color::error, "Error: invalid triplet %s for package %s", spec->target_triplet.value, spec->name); - TrackProperty("error", "invalid triplet: " + spec->target_triplet.value); - help_topic_valid_triplet(paths); - exit(EXIT_FAILURE); - } specs.push_back(std::move(*spec)); } else -- cgit v1.2.3 From 0b59e6c0fb0b1b5f5adae6311553cd2f8fc7c6c8 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 23 Sep 2016 12:01:25 -0700 Subject: [vcpkg build] Print the missing package's arch along with the package name --- toolsrc/src/commands_installation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 35c78db8f..b688b8d5a 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -128,7 +128,7 @@ namespace vcpkg System::println(""); for (const package_spec& p : unmet_dependencies) { - System::println(" %s", p.name); + System::println(" %s", to_string(p)); } System::println(""); exit(EXIT_FAILURE); -- cgit v1.2.3 From b2f6a769ea015f49c7061e36c8c7125dd53ca01e Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 23 Sep 2016 12:06:55 -0700 Subject: find_unment_dependencies() now works for a single package --- toolsrc/include/vcpkg_Dependencies.h | 2 +- toolsrc/src/commands_installation.cpp | 11 ++++------- toolsrc/src/vcpkg_Dependencies.cpp | 7 +++---- 3 files changed, 8 insertions(+), 12 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Dependencies.h b/toolsrc/include/vcpkg_Dependencies.h index 94aa51f99..9dc32fc41 100644 --- a/toolsrc/include/vcpkg_Dependencies.h +++ b/toolsrc/include/vcpkg_Dependencies.h @@ -9,5 +9,5 @@ namespace vcpkg {namespace Dependencies { std::vector create_dependency_ordered_install_plan(const vcpkg_paths& paths, const std::vector& specs, const StatusParagraphs& status_db); - std::unordered_set find_unmet_dependencies(const vcpkg_paths& paths, const std::vector& specs, const StatusParagraphs& status_db); + std::unordered_set find_unmet_dependencies(const vcpkg_paths& paths, const package_spec& spec, const StatusParagraphs& status_db); }} diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index b688b8d5a..0902ba525 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -113,14 +113,14 @@ namespace vcpkg void build_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { - // Currently the code won't work for multiple packages if one of them depends on another. + // 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); StatusParagraphs status_db = database_load_check(paths); - std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); - std::unordered_set unmet_dependencies = Dependencies::find_unmet_dependencies(paths, specs, status_db); + const package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); + std::unordered_set unmet_dependencies = Dependencies::find_unmet_dependencies(paths, spec, status_db); if (!unmet_dependencies.empty()) { System::println(System::color::error, "The build command requires all dependencies to be already installed."); @@ -135,10 +135,7 @@ namespace vcpkg } Environment::ensure_utilities_on_path(paths); - for (const package_spec& spec : specs) - { - build_internal(spec, paths); - } + build_internal(spec, paths); exit(EXIT_SUCCESS); } diff --git a/toolsrc/src/vcpkg_Dependencies.cpp b/toolsrc/src/vcpkg_Dependencies.cpp index 751b503c0..6ffb4959d 100644 --- a/toolsrc/src/vcpkg_Dependencies.cpp +++ b/toolsrc/src/vcpkg_Dependencies.cpp @@ -57,12 +57,11 @@ namespace vcpkg { namespace Dependencies return build_dependency_graph(paths, specs, status_db).find_topological_sort(); } - std::unordered_set find_unmet_dependencies(const vcpkg_paths& paths, const std::vector& specs, const StatusParagraphs& status_db) + std::unordered_set find_unmet_dependencies(const vcpkg_paths& paths, const package_spec& spec, const StatusParagraphs& status_db) { - const Graphs::Graph dependency_graph = build_dependency_graph(paths, specs, status_db); + const Graphs::Graph dependency_graph = build_dependency_graph(paths, {spec}, status_db); std::unordered_set key_set = Maps::extract_key_set(dependency_graph.adjacency_list()); - Sets::remove_all(&key_set, specs); - + key_set.erase(spec); return key_set; } }} -- cgit v1.2.3 From f4196f1638ad41cd640f4a57cefbcdb422724133 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Fri, 23 Sep 2016 14:25:17 -0700 Subject: [vcpkg] Move find_available_package, find_available_port_file into vcpkg_paths. `vcpkg_paths` is responsible for binding the concrete filesystem representation to the abstract `package_spec`. --- toolsrc/include/vcpkg.h | 4 ---- toolsrc/include/vcpkg_paths.h | 6 ++++++ toolsrc/src/commands_installation.cpp | 2 +- toolsrc/src/lib.cpp | 21 +++------------------ toolsrc/src/vcpkg_paths.cpp | 11 +++++++++++ 5 files changed, 21 insertions(+), 23 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg.h b/toolsrc/include/vcpkg.h index 264d61fa9..a4a0682cf 100644 --- a/toolsrc/include/vcpkg.h +++ b/toolsrc/include/vcpkg.h @@ -18,10 +18,6 @@ namespace vcpkg std::vector> parse_paragraphs(const std::string& str); std::string shorten_description(const std::string& desc); - fs::path find_available_package(const vcpkg_paths& paths, const package_spec& spec); - fs::path find_available_port_file(const vcpkg_paths& paths, const package_spec& spec); - fs::path control_file_for_package(const fs::path& package_path); - StatusParagraphs database_load_check(const vcpkg_paths& paths); std::vector get_unmet_package_dependencies(const vcpkg_paths& paths, const package_spec& spec, const StatusParagraphs& status_db); diff --git a/toolsrc/include/vcpkg_paths.h b/toolsrc/include/vcpkg_paths.h index 58ab45bc5..b0064c60d 100644 --- a/toolsrc/include/vcpkg_paths.h +++ b/toolsrc/include/vcpkg_paths.h @@ -1,13 +1,19 @@ #pragma once #include #include "expected.h" +#include "package_spec.h" namespace vcpkg { + namespace fs = std::tr2::sys; + struct vcpkg_paths { static expected create(const std::tr2::sys::path& vcpkg_root_dir); + fs::path find_available_package(const package_spec& spec) const; + fs::path find_available_port_file(const package_spec& spec) const; + std::tr2::sys::path root; std::tr2::sys::path packages; std::tr2::sys::path buildtrees; diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 35e1ba28c..f0e963bb6 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -80,7 +80,7 @@ namespace vcpkg continue; } - fs::path package_path = find_available_package(paths, spec); + fs::path package_path = paths.find_available_package(spec); expected file_contents = Files::get_contents(package_path / "CONTROL"); diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index 2a3b95182..780067870 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -133,24 +133,9 @@ static std::string get_fullpkgname_from_listfile(const fs::path& path) return ret; } -fs::path vcpkg::control_file_for_package(const fs::path& package) -{ - return package / "CONTROL"; -} - -fs::path vcpkg::find_available_package(const vcpkg_paths& paths, const package_spec& spec) -{ - return paths.packages / Strings::format("%s_%s", spec.name, spec.target_triplet); -} - -fs::path vcpkg::find_available_port_file(const vcpkg_paths& paths, const package_spec& spec) -{ - return paths.ports / spec.name; -} - static fs::path prefix_path_for_package(const vcpkg_paths& paths, const BinaryParagraph& pgh) { - return find_available_package(paths, {pgh.name, pgh.target_triplet}); + return paths.find_available_package({pgh.name, pgh.target_triplet}); } static void write_update(const vcpkg_paths& paths, const StatusParagraph& p) @@ -228,7 +213,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar std::vector vcpkg::get_unmet_package_dependencies(const vcpkg_paths& paths, const package_spec& spec, const StatusParagraphs& status_db) { std::vector> pghs; - const fs::path packages_dir_control_file_path = find_available_package(paths, spec) / "CONTROL"; + const fs::path packages_dir_control_file_path = paths.find_available_package(spec) / "CONTROL"; if (fs::exists(packages_dir_control_file_path)) { @@ -245,7 +230,7 @@ std::vector vcpkg::get_unmet_package_dependencies(const vcpkg_paths return BinaryParagraph(pghs[0]).depends; } - const fs::path ports_dir_control_file_path = find_available_port_file(paths, spec) / "CONTROL"; + const fs::path ports_dir_control_file_path = paths.find_available_port_file(spec) / "CONTROL"; try { pghs = get_paragraphs(ports_dir_control_file_path); diff --git a/toolsrc/src/vcpkg_paths.cpp b/toolsrc/src/vcpkg_paths.cpp index 10b6d992a..dfcfd5eca 100644 --- a/toolsrc/src/vcpkg_paths.cpp +++ b/toolsrc/src/vcpkg_paths.cpp @@ -3,6 +3,7 @@ #include "vcpkg_paths.h" #include "metrics.h" #include "vcpkg_System.h" +#include "package_spec.h" namespace fs = std::tr2::sys; @@ -45,4 +46,14 @@ namespace vcpkg paths.ports_cmake = paths.root / "scripts" / "ports.cmake"; return paths; } + + fs::path vcpkg_paths::find_available_package(const package_spec& spec) const + { + return this->packages / Strings::format("%s_%s", spec.name, spec.target_triplet); + } + + fs::path vcpkg_paths::find_available_port_file(const package_spec& spec) const + { + return this->ports / spec.name; + } } -- cgit v1.2.3 From 76149ffac5bf57882b8f7b9827f31e508da73d16 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Fri, 23 Sep 2016 14:32:56 -0700 Subject: [vcpkg] Rename `vcpkg_ports::find_available_x` to be more concise --- toolsrc/include/vcpkg_paths.h | 4 ++-- toolsrc/src/commands_installation.cpp | 2 +- toolsrc/src/lib.cpp | 6 +++--- toolsrc/src/vcpkg_paths.cpp | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_paths.h b/toolsrc/include/vcpkg_paths.h index b0064c60d..72cba01b7 100644 --- a/toolsrc/include/vcpkg_paths.h +++ b/toolsrc/include/vcpkg_paths.h @@ -11,8 +11,8 @@ namespace vcpkg { static expected create(const std::tr2::sys::path& vcpkg_root_dir); - fs::path find_available_package(const package_spec& spec) const; - fs::path find_available_port_file(const package_spec& spec) const; + fs::path package_dir(const package_spec& spec) const; + fs::path port_dir(const package_spec& spec) const; std::tr2::sys::path root; std::tr2::sys::path packages; diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index f0e963bb6..3765a9a23 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -80,7 +80,7 @@ namespace vcpkg continue; } - fs::path package_path = paths.find_available_package(spec); + fs::path package_path = paths.package_dir(spec); expected file_contents = Files::get_contents(package_path / "CONTROL"); diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index 780067870..a717344a4 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -135,7 +135,7 @@ static std::string get_fullpkgname_from_listfile(const fs::path& path) static fs::path prefix_path_for_package(const vcpkg_paths& paths, const BinaryParagraph& pgh) { - return paths.find_available_package({pgh.name, pgh.target_triplet}); + return paths.package_dir({pgh.name, pgh.target_triplet}); } static void write_update(const vcpkg_paths& paths, const StatusParagraph& p) @@ -213,7 +213,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar std::vector vcpkg::get_unmet_package_dependencies(const vcpkg_paths& paths, const package_spec& spec, const StatusParagraphs& status_db) { std::vector> pghs; - const fs::path packages_dir_control_file_path = paths.find_available_package(spec) / "CONTROL"; + const fs::path packages_dir_control_file_path = paths.package_dir(spec) / "CONTROL"; if (fs::exists(packages_dir_control_file_path)) { @@ -230,7 +230,7 @@ std::vector vcpkg::get_unmet_package_dependencies(const vcpkg_paths return BinaryParagraph(pghs[0]).depends; } - const fs::path ports_dir_control_file_path = paths.find_available_port_file(spec) / "CONTROL"; + const fs::path ports_dir_control_file_path = paths.port_dir(spec) / "CONTROL"; try { pghs = get_paragraphs(ports_dir_control_file_path); diff --git a/toolsrc/src/vcpkg_paths.cpp b/toolsrc/src/vcpkg_paths.cpp index dfcfd5eca..30d32a99b 100644 --- a/toolsrc/src/vcpkg_paths.cpp +++ b/toolsrc/src/vcpkg_paths.cpp @@ -47,12 +47,12 @@ namespace vcpkg return paths; } - fs::path vcpkg_paths::find_available_package(const package_spec& spec) const + fs::path vcpkg_paths::package_dir(const package_spec& spec) const { - return this->packages / Strings::format("%s_%s", spec.name, spec.target_triplet); + return this->packages / spec.dir(); } - fs::path vcpkg_paths::find_available_port_file(const package_spec& spec) const + fs::path vcpkg_paths::port_dir(const package_spec& spec) const { return this->ports / spec.name; } -- cgit v1.2.3 From cd30cd4df9b0f9afd7aedbe970df8faab6a45a5c Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 23 Sep 2016 16:26:27 -0700 Subject: parse_all_arguments_as_package_specs: remove unused parameter --- toolsrc/include/vcpkg_cmd_arguments.h | 2 +- toolsrc/src/commands_create.cpp | 2 +- toolsrc/src/commands_edit.cpp | 2 +- toolsrc/src/commands_installation.cpp | 4 ++-- toolsrc/src/commands_remove.cpp | 2 +- toolsrc/src/vcpkg_cmd_arguments.cpp | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_cmd_arguments.h b/toolsrc/include/vcpkg_cmd_arguments.h index 704290589..7df3d64b1 100644 --- a/toolsrc/include/vcpkg_cmd_arguments.h +++ b/toolsrc/include/vcpkg_cmd_arguments.h @@ -27,7 +27,7 @@ namespace vcpkg 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; - std::vector parse_all_arguments_as_package_specs(const vcpkg_paths& paths, const triplet& default_target_triplet, const char* example_text = nullptr) 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/commands_create.cpp b/toolsrc/src/commands_create.cpp index 8ae67b799..73d163af8 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); - package_spec spec = args.parse_all_arguments_as_package_specs(paths, default_target_triplet).at(0); + package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); 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 2272c1277..71ae8b2c8 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -7,7 +7,7 @@ namespace vcpkg { static auto example = "edit zlib"; args.check_max_args(1, example); - package_spec spec = args.parse_all_arguments_as_package_specs(paths, default_target_triplet, example).at(0); + package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet, example).at(0); // Find editor std::wstring env_EDITOR = System::wdupenv_str(L"EDITOR"); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 3765a9a23..49047d074 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -60,7 +60,7 @@ namespace vcpkg { StatusParagraphs status_db = database_load_check(paths); - std::vector specs = args.parse_all_arguments_as_package_specs(paths, default_target_triplet); + std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); 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]); @@ -119,7 +119,7 @@ namespace vcpkg StatusParagraphs status_db = database_load_check(paths); - const package_spec spec = args.parse_all_arguments_as_package_specs(paths, default_target_triplet).at(0); + const package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); 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 0b00e10f6..f5315ccb1 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -25,7 +25,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(paths, default_target_triplet); + std::vector specs = args.parse_all_arguments_as_package_specs(default_target_triplet); bool alsoRemoveFolderFromPackages = options.find(OPTION_PURGE) != options.end(); for (const package_spec& spec : specs) diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index 9181342d0..3605503b0 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -179,7 +179,7 @@ namespace vcpkg } } - std::vector vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const vcpkg_paths& paths, const triplet& default_target_triplet, const char* example_text) const + 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) -- cgit v1.2.3 From 6cc29c1f84ae61fabfd3a60200c2ef1fabb50eac Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 23 Sep 2016 16:39:07 -0700 Subject: Change vcpkg::parse() to vcpkg::package_spec::from_string() --- toolsrc/include/package_spec.h | 4 ++-- toolsrc/src/commands_installation.cpp | 2 +- toolsrc/src/package_spec.cpp | 2 +- toolsrc/src/test.cpp | 6 +++--- toolsrc/src/vcpkg_cmd_arguments.cpp | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/package_spec.h b/toolsrc/include/package_spec.h index b8ed1e088..942b34adc 100644 --- a/toolsrc/include/package_spec.h +++ b/toolsrc/include/package_spec.h @@ -8,14 +8,14 @@ namespace vcpkg { struct package_spec { + static expected from_string(const std::string& spec, const triplet& default_target_triplet); + std::string name; triplet target_triplet; std::string dir() const; }; - expected parse(const std::string& spec, const triplet& default_target_triplet); - std::string to_string(const package_spec& spec); std::string to_printf_arg(const package_spec& spec); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 49047d074..24ea7480b 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -148,7 +148,7 @@ namespace vcpkg exit(EXIT_FAILURE); } - expected current_spec = vcpkg::parse(args.command_arguments[0], default_target_triplet); + expected current_spec = package_spec::from_string(args.command_arguments[0], default_target_triplet); if (auto spec = current_spec.get()) { Environment::ensure_utilities_on_path(paths); diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp index ece5f91e9..efa54734e 100644 --- a/toolsrc/src/package_spec.cpp +++ b/toolsrc/src/package_spec.cpp @@ -2,7 +2,7 @@ namespace vcpkg { - expected parse(const std::string& spec, const triplet& default_target_triplet) + expected package_spec::from_string(const std::string& spec, const triplet& default_target_triplet) { auto pos = spec.find(':'); if (pos == std::string::npos) diff --git a/toolsrc/src/test.cpp b/toolsrc/src/test.cpp index 82113abaa..9c5f1dc87 100644 --- a/toolsrc/src/test.cpp +++ b/toolsrc/src/test.cpp @@ -308,7 +308,7 @@ namespace UnitTest1 TEST_METHOD(package_spec_parse) { - vcpkg::expected spec = vcpkg::parse("zlib", vcpkg::triplet::X86_WINDOWS); + vcpkg::expected spec = vcpkg::package_spec::from_string("zlib", vcpkg::triplet::X86_WINDOWS); Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code())); Assert::AreEqual("zlib", spec.get()->name.c_str()); Assert::AreEqual(vcpkg::triplet::X86_WINDOWS.value, spec.get()->target_triplet.value); @@ -316,7 +316,7 @@ namespace UnitTest1 TEST_METHOD(package_spec_parse_with_arch) { - vcpkg::expected spec = vcpkg::parse("zlib:x64-uwp", vcpkg::triplet::X86_WINDOWS); + vcpkg::expected spec = vcpkg::package_spec::from_string("zlib:x64-uwp", vcpkg::triplet::X86_WINDOWS); Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code())); Assert::AreEqual("zlib", spec.get()->name.c_str()); Assert::AreEqual(vcpkg::triplet::X64_UWP.value, spec.get()->target_triplet.value); @@ -324,7 +324,7 @@ namespace UnitTest1 TEST_METHOD(package_spec_parse_with_multiple_colon) { - auto ec = vcpkg::parse("zlib:x86-uwp:", vcpkg::triplet::X86_WINDOWS).error_code(); + auto ec = vcpkg::package_spec::from_string("zlib:x86-uwp:", vcpkg::triplet::X86_WINDOWS).error_code(); Assert::AreEqual(vcpkg::package_spec_parse_result::too_many_colons, vcpkg::to_package_spec_parse_result(ec)); } diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index 3605503b0..ec6946b98 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -196,7 +196,7 @@ namespace vcpkg for (const std::string& command_argument : command_arguments) { - expected current_spec = vcpkg::parse(command_argument, default_target_triplet); + expected current_spec = package_spec::from_string(command_argument, default_target_triplet); if (auto spec = current_spec.get()) { specs.push_back(std::move(*spec)); -- cgit v1.2.3 From c7a7d062a750bce13a9db3fa8af5018d38554565 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 23 Sep 2016 17:07:01 -0700 Subject: Fix `vcpkg create` to not parse all arguments as package specs --- toolsrc/src/commands_create.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index 73d163af8..c08842d65 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -7,29 +7,39 @@ namespace vcpkg void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { args.check_max_args(3); - package_spec spec = args.parse_all_arguments_as_package_specs(default_target_triplet).at(0); 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); } - Environment::ensure_utilities_on_path(paths); - // Space OR define the FILENAME with proper spacing - std::wstring custom_filename = L" "; - if (args.command_arguments.size() >= 3) + expected current_spec = package_spec::from_string(args.command_arguments[0], default_target_triplet); + if (const package_spec* spec = current_spec.get()) { - custom_filename = Strings::format(L" -DFILENAME=%s ", Strings::utf8_to_utf16(args.command_arguments.at(2))); - } + Environment::ensure_utilities_on_path(paths); + + // Space OR define the FILENAME with proper spacing + std::wstring custom_filename = L" "; + if (args.command_arguments.size() >= 3) + { + custom_filename = Strings::format(LR"( -DFILENAME="%s" )", Strings::utf8_to_utf16(args.command_arguments.at(2))); + } - const std::wstring cmdline = Strings::format(LR"(cmake -DCMD=SCAFFOLD -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", - Strings::utf8_to_utf16(spec.name), - Strings::utf8_to_utf16(spec.target_triplet.value), - Strings::utf8_to_utf16(args.command_arguments.at(1)), - custom_filename, - paths.ports_cmake.generic_wstring()); + const std::wstring cmdline = Strings::format(LR"(cmake -DCMD=SCAFFOLD -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", + Strings::utf8_to_utf16(spec->name), + Strings::utf8_to_utf16(spec->target_triplet.value), + Strings::utf8_to_utf16(args.command_arguments.at(1)), + custom_filename, + paths.ports_cmake.generic_wstring()); - exit(System::cmd_execute(cmdline)); + exit(System::cmd_execute(cmdline)); + } + else + { + System::println(System::color::error, "Error: %s: %s", current_spec.error_code().message(), args.command_arguments[0]); + print_example(Strings::format("%s zlib:x64-windows", args.command).c_str()); + exit(EXIT_FAILURE); + } } } -- cgit v1.2.3 From 1cd1f6a46bdd2eb8a27dabb8e8eb69d36694d6d6 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 23 Sep 2016 17:57:18 -0700 Subject: Add Files::has_invalid_chars_for_filesystem() --- toolsrc/include/vcpkg_Files.h | 4 ++++ toolsrc/src/vcpkg_Files.cpp | 8 ++++++++ 2 files changed, 12 insertions(+) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Files.h b/toolsrc/include/vcpkg_Files.h index 2c24f9508..445713965 100644 --- a/toolsrc/include/vcpkg_Files.h +++ b/toolsrc/include/vcpkg_Files.h @@ -5,8 +5,12 @@ namespace vcpkg {namespace Files { + static const char* FILESYSTEM_INVALID_CHARACTERS = R"(\/:*?"<>|)"; + void check_is_directory(const std::tr2::sys::path& dirpath); + bool has_invalid_chars_for_filesystem(const std::string s); + expected get_contents(const std::tr2::sys::path& file_path) noexcept; std::tr2::sys::path find_file_recursively_up(const std::tr2::sys::path& starting_dir, const std::string& filename); diff --git a/toolsrc/src/vcpkg_Files.cpp b/toolsrc/src/vcpkg_Files.cpp index ef330ea27..611aa7450 100644 --- a/toolsrc/src/vcpkg_Files.cpp +++ b/toolsrc/src/vcpkg_Files.cpp @@ -1,16 +1,24 @@ #include "vcpkg_Files.h" #include #include +#include namespace fs = std::tr2::sys; namespace vcpkg {namespace Files { + static const std::regex FILESYSTEM_INVALID_CHARACTERS_REGEX = std::regex(R"([\/:*?"<>|])"); + void check_is_directory(const fs::path& dirpath) { Checks::check_throw(fs::is_directory(dirpath), "The path %s is not a directory", dirpath.string()); } + bool has_invalid_chars_for_filesystem(const std::string s) + { + return std::regex_search(s, FILESYSTEM_INVALID_CHARACTERS_REGEX); + } + expected get_contents(const fs::path& file_path) noexcept { std::fstream file_stream(file_path, std::ios_base::in | std::ios_base::binary); -- cgit v1.2.3 From a8b0651e50bf217e361789d1d6a59905309a3372 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 23 Sep 2016 17:57:50 -0700 Subject: `vcpkg create` now checks for invalid chars in the zip file --- toolsrc/src/commands_create.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index c08842d65..76ba644e4 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -1,6 +1,7 @@ #include "vcpkg_Commands.h" #include "vcpkg_System.h" #include "vcpkg_Environment.h" +#include "vcpkg_Files.h" namespace vcpkg { @@ -23,7 +24,11 @@ namespace vcpkg std::wstring custom_filename = L" "; if (args.command_arguments.size() >= 3) { - custom_filename = Strings::format(LR"( -DFILENAME="%s" )", Strings::utf8_to_utf16(args.command_arguments.at(2))); + const std::string& zip_file_name = args.command_arguments.at(2); + Checks::check_exit(!Files::has_invalid_chars_for_filesystem(zip_file_name), + R"(Filename cannot contain invalid chars %s, but was %s)", + Files::FILESYSTEM_INVALID_CHARACTERS, zip_file_name); + custom_filename = Strings::format(LR"( -DFILENAME="%s" )", Strings::utf8_to_utf16(zip_file_name)); } const std::wstring cmdline = Strings::format(LR"(cmake -DCMD=SCAFFOLD -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", -- cgit v1.2.3 From a098ecad0316b627a1fd56bfe39119f92702aa5c Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Mon, 26 Sep 2016 21:12:04 -0700 Subject: vcpkglib_helpers: Return output instead of accepting it as arg --- toolsrc/include/vcpkglib_helpers.h | 6 +++--- toolsrc/src/BinaryParagraph.cpp | 23 +++++++++++------------ toolsrc/src/SourceParagraph.cpp | 19 +++++++++---------- toolsrc/src/StatusParagraph.cpp | 3 +-- toolsrc/src/vcpkglib_helpers.cpp | 23 +++++++++++++---------- 5 files changed, 37 insertions(+), 37 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkglib_helpers.h b/toolsrc/include/vcpkglib_helpers.h index e15b59b0b..72711d63b 100644 --- a/toolsrc/include/vcpkglib_helpers.h +++ b/toolsrc/include/vcpkglib_helpers.h @@ -4,9 +4,9 @@ namespace vcpkg {namespace details { - void optional_field(const std::unordered_map& fields, std::string& out, const std::string& fieldname); + std::string optional_field(const std::unordered_map& fields, const std::string& fieldname); - void required_field(const std::unordered_map& fields, std::string& out, const std::string& fieldname); + std::string required_field(const std::unordered_map& fields, const std::string& fieldname); - void parse_depends(const std::string& depends_string, std::vector& out); + std::vector parse_depends(const std::string& depends_string); }} diff --git a/toolsrc/src/BinaryParagraph.cpp b/toolsrc/src/BinaryParagraph.cpp index 274bd879e..da20c725c 100644 --- a/toolsrc/src/BinaryParagraph.cpp +++ b/toolsrc/src/BinaryParagraph.cpp @@ -8,25 +8,24 @@ namespace vcpkg { BinaryParagraph::BinaryParagraph() = default; - BinaryParagraph::BinaryParagraph(const std::unordered_map& fields) + BinaryParagraph::BinaryParagraph(const std::unordered_map& fields) : + name(required_field(fields, "Package")), + version(required_field(fields, "Version")), + description(optional_field(fields, "Description")), + maintainer(optional_field(fields, "Maintainer")) { - details::required_field(fields, name, "Package"); - required_field(fields, version, "Version"); - required_field(fields, target_triplet.value, "Architecture"); + target_triplet.value = required_field(fields, "Architecture"); { - std::string multi_arch; - required_field(fields, multi_arch, "Multi-Arch"); + std::string multi_arch = required_field(fields, "Multi-Arch"); Checks::check_throw(multi_arch == "same", "Multi-Arch must be 'same' but was %s", multi_arch); } - optional_field(fields, description, "Description"); - std::string deps; - optional_field(fields, deps, "Depends"); + + std::string deps = optional_field(fields, "Depends"); if (!deps.empty()) { - depends.clear(); - parse_depends(deps, depends); + this->depends.clear(); + this->depends = parse_depends(deps); } - optional_field(fields, maintainer, "Maintainer"); } BinaryParagraph::BinaryParagraph(const SourceParagraph& spgh, const triplet& target_triplet) diff --git a/toolsrc/src/SourceParagraph.cpp b/toolsrc/src/SourceParagraph.cpp index 7e3b0403e..374121ae9 100644 --- a/toolsrc/src/SourceParagraph.cpp +++ b/toolsrc/src/SourceParagraph.cpp @@ -5,17 +5,16 @@ using namespace vcpkg::details; vcpkg::SourceParagraph::SourceParagraph() = default; -vcpkg::SourceParagraph::SourceParagraph(const std::unordered_map& fields) +vcpkg::SourceParagraph::SourceParagraph(const std::unordered_map& fields): + name(required_field(fields, "Source")), + version(required_field(fields, "Version")), + description(optional_field(fields, "Description")), + maintainer(optional_field(fields, "Maintainer")) { - required_field(fields, name, "Source"); - required_field(fields, version, "Version"); - optional_field(fields, description, "Description"); - std::string deps; - optional_field(fields, deps, "Build-Depends"); + std::string deps = optional_field(fields, "Build-Depends"); if (!deps.empty()) { - depends.clear(); - parse_depends(deps, depends); - } - optional_field(fields, maintainer, "Maintainer"); + this->depends.clear(); + this->depends = parse_depends(deps); + }; } diff --git a/toolsrc/src/StatusParagraph.cpp b/toolsrc/src/StatusParagraph.cpp index 09a3b4d45..5aa425969 100644 --- a/toolsrc/src/StatusParagraph.cpp +++ b/toolsrc/src/StatusParagraph.cpp @@ -19,8 +19,7 @@ namespace vcpkg StatusParagraph::StatusParagraph(const std::unordered_map& fields) : package(fields) { - std::string status_field; - required_field(fields, status_field, "Status"); + std::string status_field = required_field(fields, "Status"); auto b = status_field.begin(); auto mark = b; diff --git a/toolsrc/src/vcpkglib_helpers.cpp b/toolsrc/src/vcpkglib_helpers.cpp index e947dc647..3aa3735b0 100644 --- a/toolsrc/src/vcpkglib_helpers.cpp +++ b/toolsrc/src/vcpkglib_helpers.cpp @@ -4,29 +4,28 @@ namespace vcpkg {namespace details { - void optional_field(const std::unordered_map& fields, std::string& out, const std::string& fieldname) + std::string optional_field(const std::unordered_map& fields, const std::string& fieldname) { auto it = fields.find(fieldname); if (it == fields.end()) { - out.clear(); + return std::string(); } - else - { - out = it->second; - } + return it->second; }; - void required_field(const std::unordered_map& fields, std::string& out, const std::string& fieldname) + std::string required_field(const std::unordered_map& fields, const std::string& fieldname) { auto it = fields.find(fieldname); vcpkg::Checks::check_throw(it != fields.end(), "Required field not present: %s", fieldname); - out = it->second; + return it->second; }; - void parse_depends(const std::string& depends_string, std::vector& out) + std::vector parse_depends(const std::string& depends_string) { + std::vector out; + size_t cur = 0; do { @@ -34,17 +33,21 @@ namespace vcpkg {namespace details if (pos == std::string::npos) { out.push_back(depends_string.substr(cur)); - return; + break; } out.push_back(depends_string.substr(cur, pos - cur)); // skip comma and space ++pos; if (depends_string[pos] == ' ') + { ++pos; + } cur = pos; } while (cur != std::string::npos); + + return out; } }} -- cgit v1.2.3 From 687ac42cdd39fece9ed816836c049607f8d1223b Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 27 Sep 2016 01:48:51 -0700 Subject: Make member function const --- toolsrc/include/triplet.h | 2 +- toolsrc/src/triplet.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/triplet.h b/toolsrc/include/triplet.h index 0c42f2ec7..23c1ea404 100644 --- a/toolsrc/include/triplet.h +++ b/toolsrc/include/triplet.h @@ -20,7 +20,7 @@ namespace vcpkg std::string system() const; - bool validate(const vcpkg_paths& paths); + bool validate(const vcpkg_paths& paths) const; }; bool operator==(const triplet& left, const triplet& right); diff --git a/toolsrc/src/triplet.cpp b/toolsrc/src/triplet.cpp index 14f19d5cd..4270c458d 100644 --- a/toolsrc/src/triplet.cpp +++ b/toolsrc/src/triplet.cpp @@ -58,13 +58,13 @@ namespace vcpkg Checks::exit_with_message("Unknown system: %s", value); } - bool triplet::validate(const vcpkg_paths & paths) + bool triplet::validate(const vcpkg_paths& paths) const { auto it = fs::directory_iterator(paths.triplets); - for(; it != fs::directory_iterator(); ++it) + for (; it != fs::directory_iterator(); ++it) { std::string triplet_file_name = it->path().stem().generic_u8string(); - if(value == triplet_file_name) // TODO: fuzzy compare + if (value == triplet_file_name) // TODO: fuzzy compare { //value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare return true; -- cgit v1.2.3 From 2ed13a583d5c8537680125d2ab5ec77b0f63503c Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Tue, 27 Sep 2016 15:51:00 -0700 Subject: [vcpkg] Provide more error information on installation failures --- toolsrc/src/lib.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index a717344a4..e9f12cd1b 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -176,7 +176,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar auto status = it->status(ec); if (ec) { - System::println(System::color::error, "failed: %s", ec.message()); + System::println(System::color::error, "failed: %s: %s", it->path().u8string(), ec.message()); continue; } if (fs::is_directory(status)) @@ -184,7 +184,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar fs::create_directory(target, ec); if (ec) { - System::println(System::color::error, "failed: %s", ec.message()); + System::println(System::color::error, "failed: %s: %s", target.u8string(), ec.message()); } listfile << bpgh.target_triplet << "/" << suffix << "\n"; @@ -194,16 +194,16 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar fs::copy_file(*it, target, ec); if (ec) { - System::println(System::color::error, "failed: %s", ec.message()); + System::println(System::color::error, "failed: %s: %s", target.u8string(), ec.message()); } listfile << bpgh.target_triplet << "/" << suffix << "\n"; } else if (!fs::status_known(status)) { - std::cout << "unknown status: " << *it << "\n"; + System::println(System::color::error, "failed: %s: unknown status", it->path().u8string()); } else - std::cout << "warning: file does not exist: " << *it << "\n"; + System::println(System::color::error, "failed: %s: cannot handle file type", it->path().u8string()); } listfile.close(); @@ -374,16 +374,16 @@ void vcpkg::deinstall_package(const vcpkg_paths& paths, const package_spec& spec fs::remove(target, ec); if (ec) { - System::println(System::color::error, "failed: %s", ec.message()); + System::println(System::color::error, "failed: %s: %s", target.u8string(), ec.message()); } } else if (!fs::status_known(status)) { - System::println(System::color::warning, "Warning: unknown status: %s", target.string()); + System::println(System::color::warning, "Warning: unknown status: %s", target.u8string()); } else { - System::println(System::color::warning, "Warning: ???: %s", target.string()); + System::println(System::color::warning, "Warning: %s: cannot handle file type", target.u8string()); } } -- cgit v1.2.3 From 1402262962f9f29faa1c611b78b793a389a13843 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Wed, 28 Sep 2016 12:22:12 -0700 Subject: [vcpkg] Fix user wide integration to avoid XCOPY due to locale-specific failures --- toolsrc/src/commands_integration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_integration.cpp b/toolsrc/src/commands_integration.cpp index 4f3fdd20b..aa10e210b 100644 --- a/toolsrc/src/commands_integration.cpp +++ b/toolsrc/src/commands_integration.cpp @@ -195,7 +195,7 @@ namespace vcpkg const fs::path sys_src_path = tmp_dir / "vcpkg.system.targets"; std::ofstream(sys_src_path) << create_system_targets_shortcut(); - const std::string param = Strings::format(R"(/c echo f | XCOPY "%s" "%s" /Y > nul)", sys_src_path.string(), system_wide_targets_file.string()); + const std::string param = Strings::format(R"(/c mkdir "%s" & copy "%s" "%s" /Y > nul)", system_wide_targets_file.parent_path().string(), sys_src_path.string(), system_wide_targets_file.string()); elevation_prompt_user_choice user_choice = elevated_cmd_execute(param); switch (user_choice) { -- cgit v1.2.3 From 48fe5f36b2ae0ee82d11cb7c2c42e4d7bec9873f Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 28 Sep 2016 16:25:32 -0700 Subject: Rename SCAFFOLD to CREATE to match `vcpkg create` --- toolsrc/src/commands_create.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index 76ba644e4..2712d3e6a 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -31,7 +31,7 @@ namespace vcpkg custom_filename = Strings::format(LR"( -DFILENAME="%s" )", Strings::utf8_to_utf16(zip_file_name)); } - const std::wstring cmdline = Strings::format(LR"(cmake -DCMD=SCAFFOLD -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", + const std::wstring cmdline = Strings::format(LR"(cmake -DCMD=CREATE -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", Strings::utf8_to_utf16(spec->name), Strings::utf8_to_utf16(spec->target_triplet.value), Strings::utf8_to_utf16(args.command_arguments.at(1)), -- cgit v1.2.3 From 93f8088a5a48998f3ddc25781c4bdf566a73f24b Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Thu, 29 Sep 2016 11:50:31 -0700 Subject: [vcpkg] Improved help message upon build failure. --- toolsrc/src/commands_installation.cpp | 11 +++++++++-- toolsrc/src/commands_update.cpp | 2 ++ 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 24ea7480b..e94791efa 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -37,9 +37,16 @@ namespace vcpkg if (return_code != 0) { - System::println(System::color::error, "Error: build command failed"); + System::println(System::color::error, "Error: building package %s failed", to_string(spec)); + System::println("Please ensure sure you're using the latest portfiles with `vcpkg update`, then\n" + "submit an issue at https://github.com/Microsoft/vcpkg/issues including:\n" + " Package: %s\n" + " Vcpkg version: %s\n" + "\n" + "Additionally, attach any relevant sections from the log files above." + , to_string(spec), version()); TrackProperty("error", "build failed"); - TrackProperty("build_error", std::to_string(return_code)); + TrackProperty("build_error", to_string(spec)); exit(EXIT_FAILURE); } diff --git a/toolsrc/src/commands_update.cpp b/toolsrc/src/commands_update.cpp index eec3e46a7..3cd7af027 100644 --- a/toolsrc/src/commands_update.cpp +++ b/toolsrc/src/commands_update.cpp @@ -7,6 +7,8 @@ namespace vcpkg { void update_command(const vcpkg_cmd_arguments& /*args*/, const vcpkg_paths& paths) { + System::println("Using local portfile versions. To update the local portfiles, use `git pull`."); + auto status_db = database_load_check(paths); std::unordered_map src_names_to_versions; -- cgit v1.2.3 From 4ab32c520daa821250c6b4669dda7ce91b71d5e7 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Thu, 29 Sep 2016 14:31:28 -0700 Subject: [vcpkg] Improve error message on mistyped package name. --- toolsrc/src/lib.cpp | 43 ++++++++++++++++++++++++------------------- toolsrc/src/vcpkg_Checks.cpp | 3 +-- 2 files changed, 25 insertions(+), 21 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index e9f12cd1b..2a9b06d4a 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -213,35 +213,40 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar std::vector vcpkg::get_unmet_package_dependencies(const vcpkg_paths& paths, const package_spec& spec, const StatusParagraphs& status_db) { std::vector> pghs; - const fs::path packages_dir_control_file_path = paths.package_dir(spec) / "CONTROL"; + { + const fs::path packages_dir_control_file_path = paths.package_dir(spec) / "CONTROL"; + + auto control_contents_maybe = Files::get_contents(packages_dir_control_file_path); + if (auto control_contents = control_contents_maybe.get()) + { + try + { + pghs = parse_paragraphs(*control_contents); + } + catch (std::runtime_error) + { + } + Checks::check_exit(pghs.size() == 1, "Invalid control file at %s", packages_dir_control_file_path.string()); + return BinaryParagraph(pghs[0]).depends; + } + } - if (fs::exists(packages_dir_control_file_path)) + const fs::path ports_dir_control_file_path = paths.port_dir(spec) / "CONTROL"; + auto control_contents_maybe = Files::get_contents(ports_dir_control_file_path); + if (auto control_contents = control_contents_maybe.get()) { try { - pghs = get_paragraphs(packages_dir_control_file_path); + pghs = parse_paragraphs(*control_contents); } catch (std::runtime_error) { - // ?? } - - Checks::check_throw(pghs.size() == 1, "Invalid control file for package"); - return BinaryParagraph(pghs[0]).depends; - } - - const fs::path ports_dir_control_file_path = paths.port_dir(spec) / "CONTROL"; - try - { - pghs = get_paragraphs(ports_dir_control_file_path); - } - catch (std::runtime_error) - { - // ?? + Checks::check_exit(pghs.size() == 1, "Invalid control file at %s", ports_dir_control_file_path.string()); + return SourceParagraph(pghs[0]).depends; } - Checks::check_exit(pghs.size() == 1, "Invalid control file for package %s", spec); - return SourceParagraph(pghs[0]).depends; + Checks::exit_with_message("Could not find package named %s", spec); } void vcpkg::install_package(const vcpkg_paths& paths, const BinaryParagraph& binary_paragraph, StatusParagraphs& status_db) diff --git a/toolsrc/src/vcpkg_Checks.cpp b/toolsrc/src/vcpkg_Checks.cpp index d5433b1f5..db6c03480 100644 --- a/toolsrc/src/vcpkg_Checks.cpp +++ b/toolsrc/src/vcpkg_Checks.cpp @@ -34,8 +34,7 @@ namespace vcpkg {namespace Checks { if (!expression) { - System::println(System::color::error, errorMessage); - exit(EXIT_FAILURE); + exit_with_message(errorMessage); } } }} -- cgit v1.2.3 From 8ea76e833eff904a958348b560a57e12b3fbeb3f Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 27 Sep 2016 15:51:38 -0700 Subject: [triplet] Part before dash is arch. Part after dash is system --- toolsrc/src/triplet.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/triplet.cpp b/toolsrc/src/triplet.cpp index 4270c458d..080198f2b 100644 --- a/toolsrc/src/triplet.cpp +++ b/toolsrc/src/triplet.cpp @@ -38,24 +38,16 @@ namespace vcpkg std::string triplet::architecture() const { - if (*this == X86_WINDOWS || *this == X86_UWP) - return "x86"; - if (*this == X64_WINDOWS || *this == X64_UWP) - return "x64"; - if (*this == ARM_UWP) - return "arm"; - - Checks::exit_with_message("Unknown architecture: %s", value); + auto it = std::find(this->value.cbegin(), this->value.cend(), '-'); + Checks::check_exit(it != this->value.end(), "Invalid triplet: %s", this->value); + return std::string(this->value.cbegin(), it); } std::string triplet::system() const { - if (*this == X86_WINDOWS || *this == X64_WINDOWS) - return "windows"; - if (*this == X86_UWP || *this == X64_UWP || *this == ARM_UWP) - return "uwp"; - - Checks::exit_with_message("Unknown system: %s", value); + auto it = std::find(this->value.cbegin(), this->value.cend(), '-'); + Checks::check_exit(it != this->value.end(), "Invalid triplet: %s", this->value); + return std::string(it + 1, this->value.cend()); } bool triplet::validate(const vcpkg_paths& paths) const @@ -64,9 +56,9 @@ namespace vcpkg for (; it != fs::directory_iterator(); ++it) { std::string triplet_file_name = it->path().stem().generic_u8string(); - if (value == triplet_file_name) // TODO: fuzzy compare + if (this->value == triplet_file_name) // TODO: fuzzy compare { - //value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare + //this->value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare return true; } } -- cgit v1.2.3 From fb1130876f228464254e3e818fae42445405f6ed Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 28 Sep 2016 12:39:05 -0700 Subject: Valiting triplets is now the responsibility of vcpkg_paths --- toolsrc/include/triplet.h | 4 ---- toolsrc/include/vcpkg_paths.h | 1 + toolsrc/src/main.cpp | 6 +++--- toolsrc/src/triplet.cpp | 17 ----------------- toolsrc/src/vcpkg_paths.cpp | 15 +++++++++++++++ 5 files changed, 19 insertions(+), 24 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/triplet.h b/toolsrc/include/triplet.h index 23c1ea404..f9d1e9483 100644 --- a/toolsrc/include/triplet.h +++ b/toolsrc/include/triplet.h @@ -4,8 +4,6 @@ namespace vcpkg { - struct vcpkg_paths; - struct triplet { static const triplet X86_WINDOWS; @@ -19,8 +17,6 @@ namespace vcpkg std::string architecture() const; std::string system() const; - - bool validate(const vcpkg_paths& paths) const; }; bool operator==(const triplet& left, const triplet& right); diff --git a/toolsrc/include/vcpkg_paths.h b/toolsrc/include/vcpkg_paths.h index 72cba01b7..c444d695e 100644 --- a/toolsrc/include/vcpkg_paths.h +++ b/toolsrc/include/vcpkg_paths.h @@ -13,6 +13,7 @@ namespace vcpkg fs::path package_dir(const package_spec& spec) const; fs::path port_dir(const package_spec& spec) const; + bool validate_triplet(const triplet& t) const; std::tr2::sys::path root; std::tr2::sys::path packages; diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index a2f6fa10f..c7162dce0 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -70,14 +70,14 @@ static void inner(const vcpkg_cmd_arguments& args) } triplet default_target_triplet; - if(args.target_triplet != nullptr) + if (args.target_triplet != nullptr) { default_target_triplet = {*args.target_triplet}; } else { const auto vcpkg_default_triplet_env = System::wdupenv_str(L"VCPKG_DEFAULT_TRIPLET"); - if(!vcpkg_default_triplet_env.empty()) + if (!vcpkg_default_triplet_env.empty()) { default_target_triplet = {Strings::utf16_to_utf8(vcpkg_default_triplet_env)}; } @@ -87,7 +87,7 @@ static void inner(const vcpkg_cmd_arguments& args) } } - if(!default_target_triplet.validate(paths)) + if (!paths.validate_triplet(default_target_triplet)) { System::println(System::color::error, "Error: invalid triplet: %s", default_target_triplet.value); TrackProperty("error", "invalid triplet: " + default_target_triplet.value); diff --git a/toolsrc/src/triplet.cpp b/toolsrc/src/triplet.cpp index 080198f2b..e3a935958 100644 --- a/toolsrc/src/triplet.cpp +++ b/toolsrc/src/triplet.cpp @@ -1,6 +1,4 @@ #include "triplet.h" -#include "vcpkg.h" -#include "vcpkg_System.h" #include "vcpkg_Checks.h" namespace vcpkg @@ -49,19 +47,4 @@ namespace vcpkg Checks::check_exit(it != this->value.end(), "Invalid triplet: %s", this->value); return std::string(it + 1, this->value.cend()); } - - bool triplet::validate(const vcpkg_paths& paths) const - { - auto it = fs::directory_iterator(paths.triplets); - for (; it != fs::directory_iterator(); ++it) - { - std::string triplet_file_name = it->path().stem().generic_u8string(); - if (this->value == triplet_file_name) // TODO: fuzzy compare - { - //this->value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare - return true; - } - } - return false; - } } diff --git a/toolsrc/src/vcpkg_paths.cpp b/toolsrc/src/vcpkg_paths.cpp index 30d32a99b..b3bbcbee1 100644 --- a/toolsrc/src/vcpkg_paths.cpp +++ b/toolsrc/src/vcpkg_paths.cpp @@ -56,4 +56,19 @@ namespace vcpkg { return this->ports / spec.name; } + + bool vcpkg_paths::validate_triplet(const triplet& t) const + { + auto it = fs::directory_iterator(this->triplets); + for (; it != fs::directory_iterator(); ++it) + { + std::string triplet_file_name = it->path().stem().generic_u8string(); + if (t.value == triplet_file_name) // TODO: fuzzy compare + { + //t.value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare + return true; + } + } + return false; + } } -- cgit v1.2.3 From 033f577c51c1e830fb27048c561ff76985855b2d Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 28 Sep 2016 15:34:10 -0700 Subject: Fix formatting --- toolsrc/src/post_build_lint.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp index 1d4ca0f67..15e30ed4f 100644 --- a/toolsrc/src/post_build_lint.cpp +++ b/toolsrc/src/post_build_lint.cpp @@ -71,12 +71,10 @@ namespace vcpkg System::println(System::color::warning, "Include files should not be duplicated into the /debug/include directory. If this cannot be disabled in the project cmake, use\n" " file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)" ); - return - lint_status::ERROR; + return lint_status::ERROR; } - return - lint_status::SUCCESS; + return lint_status::SUCCESS; } static lint_status check_for_files_in_debug_share_directory(const package_spec& spec, const vcpkg_paths& paths) -- cgit v1.2.3 From 8e3ee0523072c9330474a13507782cccb2b2be06 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 29 Sep 2016 12:35:27 -0700 Subject: Rename validate_triplet to is_valid_triplet --- toolsrc/include/vcpkg_paths.h | 2 +- toolsrc/src/main.cpp | 2 +- toolsrc/src/vcpkg_paths.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_paths.h b/toolsrc/include/vcpkg_paths.h index c444d695e..d13c73b0b 100644 --- a/toolsrc/include/vcpkg_paths.h +++ b/toolsrc/include/vcpkg_paths.h @@ -13,7 +13,7 @@ namespace vcpkg fs::path package_dir(const package_spec& spec) const; fs::path port_dir(const package_spec& spec) const; - bool validate_triplet(const triplet& t) const; + bool is_valid_triplet(const triplet& t) const; std::tr2::sys::path root; std::tr2::sys::path packages; diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index c7162dce0..a317330ff 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -87,7 +87,7 @@ static void inner(const vcpkg_cmd_arguments& args) } } - if (!paths.validate_triplet(default_target_triplet)) + if (!paths.is_valid_triplet(default_target_triplet)) { System::println(System::color::error, "Error: invalid triplet: %s", default_target_triplet.value); TrackProperty("error", "invalid triplet: " + default_target_triplet.value); diff --git a/toolsrc/src/vcpkg_paths.cpp b/toolsrc/src/vcpkg_paths.cpp index b3bbcbee1..463f62c80 100644 --- a/toolsrc/src/vcpkg_paths.cpp +++ b/toolsrc/src/vcpkg_paths.cpp @@ -57,7 +57,7 @@ namespace vcpkg return this->ports / spec.name; } - bool vcpkg_paths::validate_triplet(const triplet& t) const + bool vcpkg_paths::is_valid_triplet(const triplet& t) const { auto it = fs::directory_iterator(this->triplets); for (; it != fs::directory_iterator(); ++it) -- cgit v1.2.3 From a4ab4fd24150e0c1341aa05192b6cc9c12c57c49 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 29 Sep 2016 19:25:07 -0700 Subject: Rename wchar_t overload of format_internal to wformat_internal --- toolsrc/include/vcpkg_Strings.h | 4 ++-- toolsrc/src/vcpkg_Strings.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Strings.h b/toolsrc/include/vcpkg_Strings.h index f4b989292..6b4896640 100644 --- a/toolsrc/include/vcpkg_Strings.h +++ b/toolsrc/include/vcpkg_Strings.h @@ -31,7 +31,7 @@ namespace vcpkg {namespace Strings {namespace details return s; } - std::wstring format_internal(const wchar_t* fmtstr, ...); + std::wstring wformat_internal(const wchar_t* fmtstr, ...); }}} namespace vcpkg {namespace Strings @@ -47,7 +47,7 @@ namespace vcpkg {namespace Strings std::wstring format(const wchar_t* fmtstr, const Args&...args) { using vcpkg::Strings::details::to_wprintf_arg; - return details::format_internal(fmtstr, to_wprintf_arg(to_wprintf_arg(args))...); + return details::wformat_internal(fmtstr, to_wprintf_arg(to_wprintf_arg(args))...); } std::wstring utf8_to_utf16(const std::string& s); diff --git a/toolsrc/src/vcpkg_Strings.cpp b/toolsrc/src/vcpkg_Strings.cpp index b0312536a..9a81bbbfd 100644 --- a/toolsrc/src/vcpkg_Strings.cpp +++ b/toolsrc/src/vcpkg_Strings.cpp @@ -20,7 +20,7 @@ namespace vcpkg {namespace Strings {namespace details return output; } - std::wstring format_internal(const wchar_t* fmtstr, ...) + std::wstring wformat_internal(const wchar_t* fmtstr, ...) { va_list lst; va_start(lst, fmtstr); -- cgit v1.2.3 From 8ed88af8c9cf2ed2e6fd573b2cd5dc2b41b55625 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 29 Sep 2016 19:28:00 -0700 Subject: Rename wchar_t overload of Strings::format() to wformat() --- toolsrc/include/vcpkg_Strings.h | 2 +- toolsrc/src/commands_create.cpp | 14 +++++++------- toolsrc/src/commands_edit.cpp | 2 +- toolsrc/src/commands_installation.cpp | 24 ++++++++++++------------ toolsrc/src/commands_integration.cpp | 4 ++-- toolsrc/src/metrics.cpp | 2 +- toolsrc/src/post_build_lint.cpp | 6 +++--- toolsrc/src/vcpkg_Environment.cpp | 22 +++++++++++----------- toolsrc/src/vcpkg_System.cpp | 4 ++-- 9 files changed, 40 insertions(+), 40 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Strings.h b/toolsrc/include/vcpkg_Strings.h index 6b4896640..93e1389f8 100644 --- a/toolsrc/include/vcpkg_Strings.h +++ b/toolsrc/include/vcpkg_Strings.h @@ -44,7 +44,7 @@ namespace vcpkg {namespace Strings } template - std::wstring format(const wchar_t* fmtstr, const Args&...args) + std::wstring wformat(const wchar_t* fmtstr, const Args&...args) { using vcpkg::Strings::details::to_wprintf_arg; return details::wformat_internal(fmtstr, to_wprintf_arg(to_wprintf_arg(args))...); diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index 2712d3e6a..85b98d667 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -28,15 +28,15 @@ namespace vcpkg Checks::check_exit(!Files::has_invalid_chars_for_filesystem(zip_file_name), R"(Filename cannot contain invalid chars %s, but was %s)", Files::FILESYSTEM_INVALID_CHARACTERS, zip_file_name); - custom_filename = Strings::format(LR"( -DFILENAME="%s" )", Strings::utf8_to_utf16(zip_file_name)); + custom_filename = Strings::wformat(LR"( -DFILENAME="%s" )", Strings::utf8_to_utf16(zip_file_name)); } - const std::wstring cmdline = Strings::format(LR"(cmake -DCMD=CREATE -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", - Strings::utf8_to_utf16(spec->name), - Strings::utf8_to_utf16(spec->target_triplet.value), - Strings::utf8_to_utf16(args.command_arguments.at(1)), - custom_filename, - paths.ports_cmake.generic_wstring()); + const std::wstring cmdline = Strings::wformat(LR"(cmake -DCMD=CREATE -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", + Strings::utf8_to_utf16(spec->name), + Strings::utf8_to_utf16(spec->target_triplet.value), + Strings::utf8_to_utf16(args.command_arguments.at(1)), + custom_filename, + paths.ports_cmake.generic_wstring()); exit(System::cmd_execute(cmdline)); } diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index 71ae8b2c8..fe02bfa26 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -15,7 +15,7 @@ namespace vcpkg env_EDITOR = LR"(C:\Program Files (x86)\Microsoft VS Code\Code.exe)"; auto portpath = paths.ports / spec.name; - std::wstring cmdLine = Strings::format(LR"("%s" "%s" "%s")", env_EDITOR, portpath.native(), (portpath / "portfile.cmake").native()); + 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 e94791efa..2890184fb 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -22,12 +22,12 @@ namespace vcpkg static void build_internal(const package_spec& spec, const vcpkg_paths& paths, const fs::path& port_dir) { const fs::path ports_cmake_script_path = paths.ports_cmake; - const std::wstring command = Strings::format(LR"("%%VS140COMNTOOLS%%..\..\VC\vcvarsall.bat" %s && cmake -DCMD=BUILD -DPORT=%s -DTARGET_TRIPLET=%s "-DCURRENT_PORT_DIR=%s/." -P "%s")", - Strings::utf8_to_utf16(spec.target_triplet.architecture()), - Strings::utf8_to_utf16(spec.name), - Strings::utf8_to_utf16(spec.target_triplet.value), - port_dir.generic_wstring(), - ports_cmake_script_path.generic_wstring()); + const std::wstring command = Strings::wformat(LR"("%%VS140COMNTOOLS%%..\..\VC\vcvarsall.bat" %s && cmake -DCMD=BUILD -DPORT=%s -DTARGET_TRIPLET=%s "-DCURRENT_PORT_DIR=%s/." -P "%s")", + Strings::utf8_to_utf16(spec.target_triplet.architecture()), + Strings::utf8_to_utf16(spec.name), + Strings::utf8_to_utf16(spec.target_triplet.value), + port_dir.generic_wstring(), + ports_cmake_script_path.generic_wstring()); System::Stopwatch timer; timer.start(); @@ -39,12 +39,12 @@ namespace vcpkg { System::println(System::color::error, "Error: building package %s failed", to_string(spec)); System::println("Please ensure sure you're using the latest portfiles with `vcpkg update`, then\n" - "submit an issue at https://github.com/Microsoft/vcpkg/issues including:\n" - " Package: %s\n" - " Vcpkg version: %s\n" - "\n" - "Additionally, attach any relevant sections from the log files above." - , to_string(spec), version()); + "submit an issue at https://github.com/Microsoft/vcpkg/issues including:\n" + " Package: %s\n" + " Vcpkg version: %s\n" + "\n" + "Additionally, attach any relevant sections from the log files above." + , to_string(spec), version()); TrackProperty("error", "build failed"); TrackProperty("build_error", to_string(spec)); exit(EXIT_FAILURE); diff --git a/toolsrc/src/commands_integration.cpp b/toolsrc/src/commands_integration.cpp index aa10e210b..743a57a70 100644 --- a/toolsrc/src/commands_integration.cpp +++ b/toolsrc/src/commands_integration.cpp @@ -238,7 +238,7 @@ namespace vcpkg exit(EXIT_SUCCESS); } - const std::wstring cmd_line = Strings::format(LR"(DEL "%s")", get_appdata_targets_path().native()); + const std::wstring cmd_line = Strings::wformat(LR"(DEL "%s")", get_appdata_targets_path().native()); const int exit_code = System::cmd_execute(cmd_line); if (exit_code) { @@ -269,7 +269,7 @@ namespace vcpkg std::ofstream(nuspec_file_path) << create_nuspec_file(paths.root, nuget_id, nupkg_version); // Using all forward slashes for the command line - const std::wstring cmd_line = Strings::format(LR"(nuget.exe pack -OutputDirectory "%s" "%s" > nul)", buildsystems_dir.native(), nuspec_file_path.native()); + const std::wstring cmd_line = Strings::wformat(LR"(nuget.exe pack -OutputDirectory "%s" "%s" > nul)", buildsystems_dir.native(), nuspec_file_path.native()); const int exit_code = System::cmd_execute(cmd_line); diff --git a/toolsrc/src/metrics.cpp b/toolsrc/src/metrics.cpp index 610c71ed1..ada065fd6 100644 --- a/toolsrc/src/metrics.cpp +++ b/toolsrc/src/metrics.cpp @@ -419,7 +419,7 @@ true const fs::path vcpkg_metrics_txt_path = temp_folder_path / ("vcpkg" + GenerateRandomUUID() + ".txt"); std::ofstream(vcpkg_metrics_txt_path) << payload; - const std::wstring cmdLine = Strings::format(L"start %s %s", temp_folder_path_exe.native(), vcpkg_metrics_txt_path.native()); + const std::wstring cmdLine = Strings::wformat(L"start %s %s", temp_folder_path_exe.native(), vcpkg_metrics_txt_path.native()); System::cmd_execute(cmdLine); } } diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp index 15e30ed4f..8bd9838c6 100644 --- a/toolsrc/src/post_build_lint.cpp +++ b/toolsrc/src/post_build_lint.cpp @@ -219,7 +219,7 @@ namespace vcpkg std::vector dlls_with_no_exports; for (const fs::path& dll : dlls) { - const std::wstring cmd_line = Strings::format(LR"("%s" /exports "%s")", DUMPBIN_EXE.native(), dll.native()); + const std::wstring cmd_line = Strings::wformat(LR"("%s" /exports "%s")", DUMPBIN_EXE.native(), dll.native()); System::exit_code_and_output ec_data = System::cmd_execute_and_capture_output(cmd_line); Checks::check_exit(ec_data.exit_code == 0, "Running command:\n %s\n failed", Strings::utf16_to_utf8(cmd_line)); @@ -250,7 +250,7 @@ namespace vcpkg std::vector dlls_with_improper_uwp_bit; for (const fs::path& dll : dlls) { - const std::wstring cmd_line = Strings::format(LR"("%s" /headers "%s")", DUMPBIN_EXE.native(), dll.native()); + const std::wstring cmd_line = Strings::wformat(LR"("%s" /headers "%s")", DUMPBIN_EXE.native(), dll.native()); System::exit_code_and_output ec_data = System::cmd_execute_and_capture_output(cmd_line); Checks::check_exit(ec_data.exit_code == 0, "Running command:\n %s\n failed", Strings::utf16_to_utf8(cmd_line)); @@ -282,7 +282,7 @@ namespace vcpkg std::vector binaries_with_invalid_architecture; for (const fs::path& f : files) { - const std::wstring cmd_line = Strings::format(LR"("%s" /headers "%s" | findstr machine)", DUMPBIN_EXE.native(), f.native()); + const std::wstring cmd_line = Strings::wformat(LR"("%s" /headers "%s" | findstr machine)", DUMPBIN_EXE.native(), f.native()); System::exit_code_and_output ec_data = System::cmd_execute_and_capture_output(cmd_line); Checks::check_exit(ec_data.exit_code == 0, "Running command:\n %s\n failed", Strings::utf16_to_utf8(cmd_line)); diff --git a/toolsrc/src/vcpkg_Environment.cpp b/toolsrc/src/vcpkg_Environment.cpp index f70f2b893..d98b0f220 100644 --- a/toolsrc/src/vcpkg_Environment.cpp +++ b/toolsrc/src/vcpkg_Environment.cpp @@ -48,11 +48,11 @@ namespace vcpkg {namespace Environment void ensure_git_on_path(const vcpkg_paths& paths) { const fs::path downloaded_git = paths.downloads / "PortableGit" / "cmd"; - const std::wstring path_buf = Strings::format(L"%s;%s;%s;%s", - downloaded_git.native(), - System::wdupenv_str(L"PATH"), - default_git_installation_dir.native(), - default_git_installation_dir_x86.native()); + const std::wstring path_buf = Strings::wformat(L"%s;%s;%s;%s", + downloaded_git.native(), + System::wdupenv_str(L"PATH"), + default_git_installation_dir.native(), + default_git_installation_dir_x86.native()); _wputenv_s(L"PATH", path_buf.c_str()); static constexpr std::array git_version = {2,0,0}; @@ -63,11 +63,11 @@ namespace vcpkg {namespace Environment void ensure_cmake_on_path(const vcpkg_paths& paths) { const fs::path downloaded_cmake = paths.downloads / "cmake-3.5.2-win32-x86" / "bin"; - const std::wstring path_buf = Strings::format(L"%s;%s;%s;%s", - downloaded_cmake.native(), - System::wdupenv_str(L"PATH"), - default_cmake_installation_dir.native(), - default_cmake_installation_dir_x86.native()); + const std::wstring path_buf = Strings::wformat(L"%s;%s;%s;%s", + downloaded_cmake.native(), + System::wdupenv_str(L"PATH"), + default_cmake_installation_dir.native(), + default_cmake_installation_dir_x86.native()); _wputenv_s(L"PATH", path_buf.c_str()); static constexpr std::array cmake_version = {3,5,0}; @@ -77,7 +77,7 @@ namespace vcpkg {namespace Environment void ensure_nuget_on_path(const vcpkg_paths& paths) { - const std::wstring path_buf = Strings::format(L"%s;%s", paths.downloads.native(), System::wdupenv_str(L"PATH")); + const std::wstring path_buf = Strings::wformat(L"%s;%s", paths.downloads.native(), System::wdupenv_str(L"PATH")); _wputenv_s(L"PATH", path_buf.c_str()); static constexpr std::array nuget_version = {1,0,0}; diff --git a/toolsrc/src/vcpkg_System.cpp b/toolsrc/src/vcpkg_System.cpp index 71b4087d2..4dc37857d 100644 --- a/toolsrc/src/vcpkg_System.cpp +++ b/toolsrc/src/vcpkg_System.cpp @@ -19,14 +19,14 @@ namespace vcpkg {namespace System int cmd_execute(const wchar_t* cmd_line) { // Basically we are wrapping it in quotes - const std::wstring& actual_cmd_line = Strings::format(LR"###("%s")###", cmd_line); + const std::wstring& actual_cmd_line = Strings::wformat(LR"###("%s")###", cmd_line); int exit_code = _wsystem(actual_cmd_line.c_str()); return exit_code; } exit_code_and_output cmd_execute_and_capture_output(const wchar_t* cmd_line) { - const std::wstring& actual_cmd_line = Strings::format(LR"###("%s")###", cmd_line); + const std::wstring& actual_cmd_line = Strings::wformat(LR"###("%s")###", cmd_line); std::string output; char buf[1024]; -- cgit v1.2.3 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(+) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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(-) (limited to 'toolsrc') 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 From 8becbe15a2a7f229041b70d0333ffc96522efb6f Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 16:49:30 -0700 Subject: Place check_and_get_package_spec in a separate file --- toolsrc/include/vcpkg_Input.h | 11 +++++++++++ toolsrc/include/vcpkg_cmd_arguments.h | 5 ----- toolsrc/src/commands_edit.cpp | 3 ++- toolsrc/src/commands_installation.cpp | 5 +++-- toolsrc/src/commands_remove.cpp | 3 ++- toolsrc/src/vcpkg_Input.cpp | 29 +++++++++++++++++++++++++++++ toolsrc/src/vcpkg_cmd_arguments.cpp | 24 ------------------------ toolsrc/vcpkg/vcpkg.vcxproj | 2 ++ toolsrc/vcpkg/vcpkg.vcxproj.filters | 6 ++++++ 9 files changed, 55 insertions(+), 33 deletions(-) create mode 100644 toolsrc/include/vcpkg_Input.h create mode 100644 toolsrc/src/vcpkg_Input.cpp (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Input.h b/toolsrc/include/vcpkg_Input.h new file mode 100644 index 000000000..7041001c8 --- /dev/null +++ b/toolsrc/include/vcpkg_Input.h @@ -0,0 +1,11 @@ +#pragma once +#include +#include +#include "package_spec.h" + +namespace vcpkg {namespace Input +{ + package_spec check_and_get_package_spec(const std::string& package_spec_as_string, const triplet& default_target_triplet, const char* example_text); + + std::vector check_and_get_package_specs(const std::vector& package_specs_as_strings, const triplet& default_target_triplet, const char* example_text); +}} diff --git a/toolsrc/include/vcpkg_cmd_arguments.h b/toolsrc/include/vcpkg_cmd_arguments.h index 54b97cde1..95feb4814 100644 --- a/toolsrc/include/vcpkg_cmd_arguments.h +++ b/toolsrc/include/vcpkg_cmd_arguments.h @@ -4,9 +4,7 @@ #include #include #include "opt_bool.h" -#include "package_spec.h" #include "vcpkg_paths.h" -#include "StatusParagraphs.h" namespace vcpkg { @@ -15,9 +13,6 @@ namespace vcpkg 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/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index 4973d6ef2..b17c02d5a 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -1,5 +1,6 @@ #include "vcpkg_Commands.h" #include "vcpkg_System.h" +#include "vcpkg_Input.h" namespace vcpkg { @@ -7,7 +8,7 @@ namespace vcpkg { static const std::string example = create_example_string("edit zlib"); args.check_exact_arg_count(1, example.c_str()); - const package_spec spec = vcpkg_cmd_arguments::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); + const package_spec spec = Input::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"); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 9eacfedcc..9eedebdbe 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -7,6 +7,7 @@ #include "post_build_lint.h" #include "vcpkg_System.h" #include "vcpkg_Dependencies.h" +#include "vcpkg_Input.h" namespace vcpkg { @@ -69,7 +70,7 @@ namespace vcpkg args.check_min_arg_count(1, example.c_str()); StatusParagraphs status_db = database_load_check(paths); - std::vector specs = vcpkg_cmd_arguments::check_and_get_package_specs(args.command_arguments, default_target_triplet, example.c_str()); + std::vector specs = Input::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 +131,7 @@ namespace vcpkg args.check_exact_arg_count(1, example.c_str()); StatusParagraphs status_db = database_load_check(paths); - const package_spec spec = vcpkg_cmd_arguments::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); + const package_spec spec = Input::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 fd0c43de5..ebc000040 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -1,6 +1,7 @@ #include "vcpkg_Commands.h" #include "vcpkg.h" #include "vcpkg_System.h" +#include "vcpkg_Input.h" namespace vcpkg { @@ -28,7 +29,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 = vcpkg_cmd_arguments::check_and_get_package_specs(args.command_arguments, default_target_triplet, example.c_str()); + std::vector specs = Input::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) diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp new file mode 100644 index 000000000..de5890da1 --- /dev/null +++ b/toolsrc/src/vcpkg_Input.cpp @@ -0,0 +1,29 @@ +#include "vcpkg_Input.h" +#include "vcpkg_System.h" + +namespace vcpkg {namespace Input +{ + package_spec 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 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; + } +}} diff --git a/toolsrc/src/vcpkg_cmd_arguments.cpp b/toolsrc/src/vcpkg_cmd_arguments.cpp index f1ab4e937..a286ba9b7 100644 --- a/toolsrc/src/vcpkg_cmd_arguments.cpp +++ b/toolsrc/src/vcpkg_cmd_arguments.cpp @@ -50,30 +50,6 @@ 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; diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index a59683470..40c6f12cf 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -146,6 +146,7 @@ + @@ -153,6 +154,7 @@ + diff --git a/toolsrc/vcpkg/vcpkg.vcxproj.filters b/toolsrc/vcpkg/vcpkg.vcxproj.filters index 2e8a343fc..3b836ab3c 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj.filters +++ b/toolsrc/vcpkg/vcpkg.vcxproj.filters @@ -69,6 +69,9 @@ Source Files + + Source Files + @@ -86,5 +89,8 @@ Header Files + + Header Files + \ No newline at end of file -- cgit v1.2.3 From 4b0f3d87befb84c819afbf664614281491a784b9 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 16:54:07 -0700 Subject: Introduce Input::check_triplet() --- toolsrc/include/vcpkg_Input.h | 4 +++- toolsrc/src/main.cpp | 9 ++------- toolsrc/src/vcpkg_Input.cpp | 13 +++++++++++++ 3 files changed, 18 insertions(+), 8 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Input.h b/toolsrc/include/vcpkg_Input.h index 7041001c8..311df3bec 100644 --- a/toolsrc/include/vcpkg_Input.h +++ b/toolsrc/include/vcpkg_Input.h @@ -1,11 +1,13 @@ #pragma once #include -#include #include "package_spec.h" +#include "vcpkg_paths.h" namespace vcpkg {namespace Input { package_spec check_and_get_package_spec(const std::string& package_spec_as_string, const triplet& default_target_triplet, const char* example_text); std::vector check_and_get_package_specs(const std::vector& package_specs_as_strings, const triplet& default_target_triplet, const char* example_text); + + void check_triplet(const triplet& t, const vcpkg_paths& paths); }} diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index a317330ff..b49f2bdef 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -11,6 +11,7 @@ #include #include "vcpkg_Files.h" #include "vcpkg_System.h" +#include "vcpkg_Input.h" using namespace vcpkg; @@ -87,13 +88,7 @@ static void inner(const vcpkg_cmd_arguments& args) } } - if (!paths.is_valid_triplet(default_target_triplet)) - { - System::println(System::color::error, "Error: invalid triplet: %s", default_target_triplet.value); - TrackProperty("error", "invalid triplet: " + default_target_triplet.value); - help_topic_valid_triplet(paths); - exit(EXIT_FAILURE); - } + Input::check_triplet(default_target_triplet, paths); if (auto command_function = find_command(args.command, get_available_commands_type_a())) { diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp index de5890da1..09fce7b8c 100644 --- a/toolsrc/src/vcpkg_Input.cpp +++ b/toolsrc/src/vcpkg_Input.cpp @@ -1,5 +1,7 @@ #include "vcpkg_Input.h" #include "vcpkg_System.h" +#include "metrics.h" +#include "vcpkg_Commands.h" namespace vcpkg {namespace Input { @@ -26,4 +28,15 @@ namespace vcpkg {namespace Input return specs; } + + void check_triplet(const triplet& t, const vcpkg_paths& paths) + { + if (!paths.is_valid_triplet(t)) + { + System::println(System::color::error, "Error: invalid triplet: %s", t.value); + TrackProperty("error", "invalid triplet: " + t.value); + help_topic_valid_triplet(paths); + exit(EXIT_FAILURE); + } + } }} -- cgit v1.2.3 From e3455e281bd9a2147259f7ba769211b9709e51da Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 16:55:34 -0700 Subject: Introduce Input::check_all_triplets() --- toolsrc/include/vcpkg_Input.h | 2 ++ toolsrc/src/vcpkg_Input.cpp | 8 ++++++++ 2 files changed, 10 insertions(+) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Input.h b/toolsrc/include/vcpkg_Input.h index 311df3bec..1aa5bcb99 100644 --- a/toolsrc/include/vcpkg_Input.h +++ b/toolsrc/include/vcpkg_Input.h @@ -10,4 +10,6 @@ namespace vcpkg {namespace Input std::vector check_and_get_package_specs(const std::vector& package_specs_as_strings, const triplet& default_target_triplet, const char* example_text); void check_triplet(const triplet& t, const vcpkg_paths& paths); + + void check_all_triplets(std::vector triplets, const vcpkg_paths& paths); }} diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp index 09fce7b8c..c8da089b8 100644 --- a/toolsrc/src/vcpkg_Input.cpp +++ b/toolsrc/src/vcpkg_Input.cpp @@ -39,4 +39,12 @@ namespace vcpkg {namespace Input exit(EXIT_FAILURE); } } + + void check_all_triplets(std::vector triplets, const vcpkg_paths& paths) + { + for (const package_spec& spec : triplets) + { + check_triplet(spec.target_triplet, paths); + } + } }} -- cgit v1.2.3 From 51bc83c70e915892a658795f51bb3bb10360ee8d Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 17:01:41 -0700 Subject: Added triplet check in all commands that obtain package_specs --- toolsrc/src/commands_create.cpp | 2 ++ toolsrc/src/commands_edit.cpp | 1 + toolsrc/src/commands_installation.cpp | 3 +++ toolsrc/src/commands_remove.cpp | 1 + 4 files changed, 7 insertions(+) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index d365dac70..5e88f9c65 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -2,6 +2,7 @@ #include "vcpkg_System.h" #include "vcpkg_Environment.h" #include "vcpkg_Files.h" +#include "vcpkg_Input.h" namespace vcpkg { @@ -14,6 +15,7 @@ namespace vcpkg expected current_spec = package_spec::from_string(args.command_arguments[0], default_target_triplet); if (const package_spec* spec = current_spec.get()) { + Input::check_triplet(spec->target_triplet, paths); Environment::ensure_utilities_on_path(paths); // Space OR define the FILENAME with proper spacing diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index b17c02d5a..a3e2f402d 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -9,6 +9,7 @@ namespace vcpkg static const std::string example = create_example_string("edit zlib"); args.check_exact_arg_count(1, example.c_str()); const package_spec spec = Input::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); + Input::check_triplet(spec.target_triplet, paths); // Find editor std::wstring env_EDITOR = System::wdupenv_str(L"EDITOR"); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 9eedebdbe..8e66f9548 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -71,6 +71,7 @@ namespace vcpkg StatusParagraphs status_db = database_load_check(paths); std::vector specs = Input::check_and_get_package_specs(args.command_arguments, default_target_triplet, example.c_str()); + Input::check_all_triplets(specs, paths); 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]); @@ -132,6 +133,7 @@ namespace vcpkg StatusParagraphs status_db = database_load_check(paths); const package_spec spec = Input::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); + Input::check_triplet(spec.target_triplet, paths); std::unordered_set unmet_dependencies = Dependencies::find_unmet_dependencies(paths, spec, status_db); if (!unmet_dependencies.empty()) { @@ -159,6 +161,7 @@ namespace vcpkg expected current_spec = package_spec::from_string(args.command_arguments[0], default_target_triplet); if (auto spec = current_spec.get()) { + Input::check_triplet(spec->target_triplet, paths); Environment::ensure_utilities_on_path(paths); const fs::path port_dir = args.command_arguments.at(1); build_internal(*spec, paths, port_dir); diff --git a/toolsrc/src/commands_remove.cpp b/toolsrc/src/commands_remove.cpp index ebc000040..c458125dd 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -30,6 +30,7 @@ namespace vcpkg auto status_db = database_load_check(paths); std::vector specs = Input::check_and_get_package_specs(args.command_arguments, default_target_triplet, example.c_str()); + Input::check_all_triplets(specs, paths); bool alsoRemoveFolderFromPackages = options.find(OPTION_PURGE) != options.end(); for (const package_spec& spec : specs) -- cgit v1.2.3 From 188eac680ba930c51943d4af34de58bbd325dcb1 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 17:02:39 -0700 Subject: Rename check_all_triplets() to check_triplets() --- toolsrc/include/vcpkg_Input.h | 2 +- toolsrc/src/commands_installation.cpp | 2 +- toolsrc/src/commands_remove.cpp | 2 +- toolsrc/src/vcpkg_Input.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Input.h b/toolsrc/include/vcpkg_Input.h index 1aa5bcb99..bbf3adfbf 100644 --- a/toolsrc/include/vcpkg_Input.h +++ b/toolsrc/include/vcpkg_Input.h @@ -11,5 +11,5 @@ namespace vcpkg {namespace Input void check_triplet(const triplet& t, const vcpkg_paths& paths); - void check_all_triplets(std::vector triplets, const vcpkg_paths& paths); + void check_triplets(std::vector triplets, const vcpkg_paths& paths); }} diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 8e66f9548..d6590fd0d 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -71,7 +71,7 @@ namespace vcpkg StatusParagraphs status_db = database_load_check(paths); std::vector specs = Input::check_and_get_package_specs(args.command_arguments, default_target_triplet, example.c_str()); - Input::check_all_triplets(specs, paths); + Input::check_triplets(specs, paths); 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]); diff --git a/toolsrc/src/commands_remove.cpp b/toolsrc/src/commands_remove.cpp index c458125dd..5bb9ecc96 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -30,7 +30,7 @@ namespace vcpkg auto status_db = database_load_check(paths); std::vector specs = Input::check_and_get_package_specs(args.command_arguments, default_target_triplet, example.c_str()); - Input::check_all_triplets(specs, paths); + Input::check_triplets(specs, paths); bool alsoRemoveFolderFromPackages = options.find(OPTION_PURGE) != options.end(); for (const package_spec& spec : specs) diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp index c8da089b8..269de13b3 100644 --- a/toolsrc/src/vcpkg_Input.cpp +++ b/toolsrc/src/vcpkg_Input.cpp @@ -40,7 +40,7 @@ namespace vcpkg {namespace Input } } - void check_all_triplets(std::vector triplets, const vcpkg_paths& paths) + void check_triplets(std::vector triplets, const vcpkg_paths& paths) { for (const package_spec& spec : triplets) { -- cgit v1.2.3 From 25145714f7e4474c73a230a56910e01960bada6b Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 17:36:33 -0700 Subject: [vcpkg edit] Now throws an error if it cannot launch an editor --- toolsrc/src/commands_edit.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index a3e2f402d..2007eac10 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -11,12 +11,23 @@ namespace vcpkg const package_spec spec = Input::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); Input::check_triplet(spec.target_triplet, paths); + const fs::path portpath = paths.ports / spec.name; + // 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)"; + { + static const std::wstring CODE_EXE_PATH = LR"(C:\Program Files (x86)\Microsoft VS Code\Code.exe)"; + if (fs::exists(CODE_EXE_PATH)) + { + env_EDITOR = CODE_EXE_PATH; + } + else + { + Checks::exit_with_message("Visual Studio Code was not found and the environmental variable EDITOR is not set"); + } + } - 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)); } -- cgit v1.2.3 From e507c14229e5dd206499eef3ffa4e887131b9678 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 30 Sep 2016 18:21:38 -0700 Subject: create & edit commands now only handle package names --- toolsrc/include/vcpkg_Commands.h | 4 ++-- toolsrc/src/commands_create.cpp | 49 ++++++++++++++++------------------------ toolsrc/src/commands_edit.cpp | 7 +++--- toolsrc/src/commands_other.cpp | 4 ++-- 4 files changed, 26 insertions(+), 38 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Commands.h b/toolsrc/include/vcpkg_Commands.h index c3da552f2..978519820 100644 --- a/toolsrc/include/vcpkg_Commands.h +++ b/toolsrc/include/vcpkg_Commands.h @@ -17,8 +17,8 @@ namespace vcpkg void install_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet); void remove_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet); - void edit_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet); - void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet); + void edit_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths); + void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths); void search_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths); void list_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths); diff --git a/toolsrc/src/commands_create.cpp b/toolsrc/src/commands_create.cpp index 5e88f9c65..d1611eb5c 100644 --- a/toolsrc/src/commands_create.cpp +++ b/toolsrc/src/commands_create.cpp @@ -6,43 +6,32 @@ namespace vcpkg { - void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) + void create_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { 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()) - { - Input::check_triplet(spec->target_triplet, paths); - Environment::ensure_utilities_on_path(paths); - - // Space OR define the FILENAME with proper spacing - std::wstring custom_filename = L" "; - if (args.command_arguments.size() >= 3) - { - const std::string& zip_file_name = args.command_arguments.at(2); - Checks::check_exit(!Files::has_invalid_chars_for_filesystem(zip_file_name), - R"(Filename cannot contain invalid chars %s, but was %s)", - Files::FILESYSTEM_INVALID_CHARACTERS, zip_file_name); - custom_filename = Strings::wformat(LR"( -DFILENAME="%s" )", Strings::utf8_to_utf16(zip_file_name)); - } - - const std::wstring cmdline = Strings::wformat(LR"(cmake -DCMD=CREATE -DPORT=%s -DTARGET_TRIPLET=%s -DURL=%s%s-P "%s")", - Strings::utf8_to_utf16(spec->name), - Strings::utf8_to_utf16(spec->target_triplet.value), - Strings::utf8_to_utf16(args.command_arguments.at(1)), - custom_filename, - paths.ports_cmake.generic_wstring()); + const std::string port_name = args.command_arguments.at(0); + Environment::ensure_utilities_on_path(paths); - exit(System::cmd_execute(cmdline)); - } - else + // Space OR define the FILENAME with proper spacing + std::wstring custom_filename = L" "; + if (args.command_arguments.size() >= 3) { - System::println(System::color::error, "Error: %s: %s", current_spec.error_code().message(), args.command_arguments[0]); - print_example(Strings::format("%s zlib:x64-windows", args.command).c_str()); - exit(EXIT_FAILURE); + const std::string& zip_file_name = args.command_arguments.at(2); + Checks::check_exit(!Files::has_invalid_chars_for_filesystem(zip_file_name), + R"(Filename cannot contain invalid chars %s, but was %s)", + Files::FILESYSTEM_INVALID_CHARACTERS, zip_file_name); + custom_filename = Strings::wformat(LR"( -DFILENAME="%s" )", Strings::utf8_to_utf16(zip_file_name)); } + + const std::wstring cmdline = Strings::wformat(LR"(cmake -DCMD=CREATE -DPORT=%s -DURL=%s%s-P "%s")", + Strings::utf8_to_utf16(port_name), + Strings::utf8_to_utf16(args.command_arguments.at(1)), + custom_filename, + paths.ports_cmake.generic_wstring()); + + exit(System::cmd_execute(cmdline)); } } diff --git a/toolsrc/src/commands_edit.cpp b/toolsrc/src/commands_edit.cpp index 2007eac10..f07a15875 100644 --- a/toolsrc/src/commands_edit.cpp +++ b/toolsrc/src/commands_edit.cpp @@ -4,14 +4,13 @@ namespace vcpkg { - void edit_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) + void edit_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) { static const std::string example = create_example_string("edit zlib"); args.check_exact_arg_count(1, example.c_str()); - const package_spec spec = Input::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); - Input::check_triplet(spec.target_triplet, paths); + const std::string port_name = args.command_arguments.at(0); - const fs::path portpath = paths.ports / spec.name; + const fs::path portpath = paths.ports / port_name; // Find editor std::wstring env_EDITOR = System::wdupenv_str(L"EDITOR"); diff --git a/toolsrc/src/commands_other.cpp b/toolsrc/src/commands_other.cpp index 4ba4112d4..07549a437 100644 --- a/toolsrc/src/commands_other.cpp +++ b/toolsrc/src/commands_other.cpp @@ -66,8 +66,6 @@ namespace vcpkg {"install", install_command}, {"remove", remove_command}, {"build", build_command}, - {"edit", edit_command}, - {"create", create_command}, {"build_external", build_external_command} }; return t; @@ -82,6 +80,8 @@ namespace vcpkg {"integrate", integrate_command}, {"owns", owns_command}, {"update", update_command}, + {"edit", edit_command}, + {"create", create_command}, {"import", import_command}, {"cache", cache_command}, {"internal_test", internal_test_command}, -- cgit v1.2.3 From 98d361de3fbc24e497a0c9f5776c2b4002fd7832 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Mon, 3 Oct 2016 15:15:32 -0700 Subject: [vcpkg] Adjust ersion to point at LICENSE.txt --- toolsrc/src/commands_help.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/commands_help.cpp b/toolsrc/src/commands_help.cpp index 27dc168a4..194e809b1 100644 --- a/toolsrc/src/commands_help.cpp +++ b/toolsrc/src/commands_help.cpp @@ -9,8 +9,7 @@ namespace vcpkg 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" - "All rights reserved.", vcpkg::version() + "See LICENSE.txt for license information.", vcpkg::version() ); exit(EXIT_SUCCESS); } -- cgit v1.2.3 From 330b411cd2f4aa25632b2ae5ea2fef396fb13d12 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Mon, 3 Oct 2016 17:20:52 -0700 Subject: [triplet] Force using the factory that does sanity checks --- toolsrc/include/triplet.h | 9 ++++++-- toolsrc/src/BinaryParagraph.cpp | 4 ++-- toolsrc/src/commands_installation.cpp | 2 +- toolsrc/src/lib.cpp | 4 ++-- toolsrc/src/main.cpp | 4 ++-- toolsrc/src/package_spec.cpp | 2 +- toolsrc/src/test.cpp | 6 ++--- toolsrc/src/triplet.cpp | 43 ++++++++++++++++++++++++----------- toolsrc/src/vcpkg_Input.cpp | 4 ++-- toolsrc/src/vcpkg_paths.cpp | 2 +- 10 files changed, 51 insertions(+), 29 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/triplet.h b/toolsrc/include/triplet.h index f9d1e9483..32ea2e711 100644 --- a/toolsrc/include/triplet.h +++ b/toolsrc/include/triplet.h @@ -6,17 +6,22 @@ namespace vcpkg { struct triplet { + static triplet from_canonical_name(const std::string& triplet_as_string); + static const triplet X86_WINDOWS; static const triplet X64_WINDOWS; static const triplet X86_UWP; static const triplet X64_UWP; static const triplet ARM_UWP; - std::string value; + const std::string& canonical_name() const; std::string architecture() const; std::string system() const; + + private: + std::string m_canonical_name; }; bool operator==(const triplet& left, const triplet& right); @@ -39,7 +44,7 @@ namespace std { std::hash hasher; size_t hash = 17; - hash = hash * 31 + hasher(t.value); + hash = hash * 31 + hasher(t.canonical_name()); return hash; } }; diff --git a/toolsrc/src/BinaryParagraph.cpp b/toolsrc/src/BinaryParagraph.cpp index da20c725c..6d32ff137 100644 --- a/toolsrc/src/BinaryParagraph.cpp +++ b/toolsrc/src/BinaryParagraph.cpp @@ -12,9 +12,9 @@ namespace vcpkg name(required_field(fields, "Package")), version(required_field(fields, "Version")), description(optional_field(fields, "Description")), - maintainer(optional_field(fields, "Maintainer")) + maintainer(optional_field(fields, "Maintainer")), + target_triplet(triplet::from_canonical_name(required_field(fields, "Architecture"))) { - target_triplet.value = required_field(fields, "Architecture"); { std::string multi_arch = required_field(fields, "Multi-Arch"); Checks::check_throw(multi_arch == "same", "Multi-Arch must be 'same' but was %s", multi_arch); diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index d6590fd0d..521d4df71 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -26,7 +26,7 @@ namespace vcpkg const std::wstring command = Strings::wformat(LR"("%%VS140COMNTOOLS%%..\..\VC\vcvarsall.bat" %s && cmake -DCMD=BUILD -DPORT=%s -DTARGET_TRIPLET=%s "-DCURRENT_PORT_DIR=%s/." -P "%s")", Strings::utf8_to_utf16(spec.target_triplet.architecture()), Strings::utf8_to_utf16(spec.name), - Strings::utf8_to_utf16(spec.target_triplet.value), + Strings::utf8_to_utf16(spec.target_triplet.canonical_name()), port_dir.generic_wstring(), ports_cmake_script_path.generic_wstring()); diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index 2a9b06d4a..2127b7850 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -158,7 +158,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar auto prefix_length = package_prefix_path.native().size(); std::error_code ec; - fs::create_directory(paths.installed / bpgh.target_triplet.value, ec); + fs::create_directory(paths.installed / bpgh.target_triplet.canonical_name(), ec); listfile << bpgh.target_triplet << "\n"; for (auto it = fs::recursive_directory_iterator(package_prefix_path); it != fs::recursive_directory_iterator(); ++it) @@ -171,7 +171,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar } auto suffix = it->path().generic_u8string().substr(prefix_length + 1); - auto target = paths.installed / bpgh.target_triplet.value / suffix; + auto target = paths.installed / bpgh.target_triplet.canonical_name() / suffix; auto status = it->status(ec); if (ec) diff --git a/toolsrc/src/main.cpp b/toolsrc/src/main.cpp index b49f2bdef..f3d68f5dd 100644 --- a/toolsrc/src/main.cpp +++ b/toolsrc/src/main.cpp @@ -73,14 +73,14 @@ static void inner(const vcpkg_cmd_arguments& args) triplet default_target_triplet; if (args.target_triplet != nullptr) { - default_target_triplet = {*args.target_triplet}; + default_target_triplet = triplet::from_canonical_name(*args.target_triplet); } else { const auto vcpkg_default_triplet_env = System::wdupenv_str(L"VCPKG_DEFAULT_TRIPLET"); if (!vcpkg_default_triplet_env.empty()) { - default_target_triplet = {Strings::utf16_to_utf8(vcpkg_default_triplet_env)}; + default_target_triplet = triplet::from_canonical_name(Strings::utf16_to_utf8(vcpkg_default_triplet_env)); } else { diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp index efa54734e..444ec8459 100644 --- a/toolsrc/src/package_spec.cpp +++ b/toolsrc/src/package_spec.cpp @@ -16,7 +16,7 @@ namespace vcpkg return std::error_code(package_spec_parse_result::too_many_colons); } - return package_spec{spec.substr(0, pos), spec.substr(pos + 1)}; + return package_spec{spec.substr(0, pos), triplet::from_canonical_name(spec.substr(pos + 1))}; } std::string package_spec::dir() const diff --git a/toolsrc/src/test.cpp b/toolsrc/src/test.cpp index 9c5f1dc87..9bc41fc9e 100644 --- a/toolsrc/src/test.cpp +++ b/toolsrc/src/test.cpp @@ -91,7 +91,7 @@ namespace UnitTest1 Assert::AreEqual("1.2.8", pgh.version.c_str()); Assert::AreEqual("", pgh.maintainer.c_str()); Assert::AreEqual("", pgh.description.c_str()); - Assert::AreEqual("a", pgh.target_triplet.value.c_str()); + Assert::AreEqual("a", pgh.target_triplet.canonical_name().c_str()); Assert::AreEqual(size_t(0), pgh.depends.size()); } @@ -311,7 +311,7 @@ namespace UnitTest1 vcpkg::expected spec = vcpkg::package_spec::from_string("zlib", vcpkg::triplet::X86_WINDOWS); Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code())); Assert::AreEqual("zlib", spec.get()->name.c_str()); - Assert::AreEqual(vcpkg::triplet::X86_WINDOWS.value, spec.get()->target_triplet.value); + Assert::AreEqual(vcpkg::triplet::X86_WINDOWS.canonical_name(), spec.get()->target_triplet.canonical_name()); } TEST_METHOD(package_spec_parse_with_arch) @@ -319,7 +319,7 @@ namespace UnitTest1 vcpkg::expected spec = vcpkg::package_spec::from_string("zlib:x64-uwp", vcpkg::triplet::X86_WINDOWS); Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code())); Assert::AreEqual("zlib", spec.get()->name.c_str()); - Assert::AreEqual(vcpkg::triplet::X64_UWP.value, spec.get()->target_triplet.value); + Assert::AreEqual(vcpkg::triplet::X64_UWP.canonical_name(), spec.get()->target_triplet.canonical_name()); } TEST_METHOD(package_spec_parse_with_multiple_colon) diff --git a/toolsrc/src/triplet.cpp b/toolsrc/src/triplet.cpp index e3a935958..a6816b445 100644 --- a/toolsrc/src/triplet.cpp +++ b/toolsrc/src/triplet.cpp @@ -1,17 +1,18 @@ #include "triplet.h" #include "vcpkg_Checks.h" +#include namespace vcpkg { - const triplet triplet::X86_WINDOWS = {"x86-windows"}; - const triplet triplet::X64_WINDOWS = {"x64-windows"}; - const triplet triplet::X86_UWP = {"x86-uwp"}; - const triplet triplet::X64_UWP = {"x64-uwp"}; - const triplet triplet::ARM_UWP = {"arm-uwp"}; + const triplet triplet::X86_WINDOWS = from_canonical_name("x86-windows"); + const triplet triplet::X64_WINDOWS = from_canonical_name("x64-windows"); + const triplet triplet::X86_UWP = from_canonical_name("x86-uwp"); + const triplet triplet::X64_UWP = from_canonical_name("x64-uwp"); + const triplet triplet::ARM_UWP = from_canonical_name("arm-uwp"); std::string to_string(const triplet& t) { - return t.value; + return t.canonical_name(); } std::string to_printf_arg(const triplet& t) @@ -21,7 +22,7 @@ namespace vcpkg bool operator==(const triplet& left, const triplet& right) { - return left.value == right.value; + return left.canonical_name() == right.canonical_name(); } bool operator!=(const triplet& left, const triplet& right) @@ -34,17 +35,33 @@ namespace vcpkg return os << to_string(t); } + triplet triplet::from_canonical_name(const std::string& triplet_as_string) + { + std::string s(triplet_as_string); + std::transform(s.begin(), s.end(), s.begin(), ::tolower); + + auto it = std::find(s.cbegin(), s.cend(), '-'); + Checks::check_exit(it != s.cend(), "Invalid triplet: %s", triplet_as_string); + + triplet t; + t.m_canonical_name = s; + return t; + } + + const std::string& triplet::canonical_name() const + { + return this->m_canonical_name; + } + std::string triplet::architecture() const { - auto it = std::find(this->value.cbegin(), this->value.cend(), '-'); - Checks::check_exit(it != this->value.end(), "Invalid triplet: %s", this->value); - return std::string(this->value.cbegin(), it); + auto it = std::find(this->m_canonical_name.cbegin(), this->m_canonical_name.cend(), '-'); + return std::string(this->m_canonical_name.cbegin(), it); } std::string triplet::system() const { - auto it = std::find(this->value.cbegin(), this->value.cend(), '-'); - Checks::check_exit(it != this->value.end(), "Invalid triplet: %s", this->value); - return std::string(it + 1, this->value.cend()); + auto it = std::find(this->m_canonical_name.cbegin(), this->m_canonical_name.cend(), '-'); + return std::string(it + 1, this->m_canonical_name.cend()); } } diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp index 269de13b3..435d55576 100644 --- a/toolsrc/src/vcpkg_Input.cpp +++ b/toolsrc/src/vcpkg_Input.cpp @@ -33,8 +33,8 @@ namespace vcpkg {namespace Input { if (!paths.is_valid_triplet(t)) { - System::println(System::color::error, "Error: invalid triplet: %s", t.value); - TrackProperty("error", "invalid triplet: " + t.value); + System::println(System::color::error, "Error: invalid triplet: %s", t.canonical_name()); + TrackProperty("error", "invalid triplet: " + t.canonical_name()); help_topic_valid_triplet(paths); exit(EXIT_FAILURE); } diff --git a/toolsrc/src/vcpkg_paths.cpp b/toolsrc/src/vcpkg_paths.cpp index 982eb9970..559f719af 100644 --- a/toolsrc/src/vcpkg_paths.cpp +++ b/toolsrc/src/vcpkg_paths.cpp @@ -61,7 +61,7 @@ namespace vcpkg for (; it != fs::directory_iterator(); ++it) { std::string triplet_file_name = it->path().stem().generic_u8string(); - if (t.value == triplet_file_name) // TODO: fuzzy compare + if (t.canonical_name() == triplet_file_name) // TODO: fuzzy compare { //t.value = triplet_file_name; // NOTE: uncomment when implementing fuzzy compare return true; -- cgit v1.2.3 From 2f8c115777cb5f1d407d8a9a05c2cd3c4cad918d Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Mon, 3 Oct 2016 17:24:42 -0700 Subject: [package_spec] Static factory now lowercases all chars --- toolsrc/src/package_spec.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp index 444ec8459..3da0757fd 100644 --- a/toolsrc/src/package_spec.cpp +++ b/toolsrc/src/package_spec.cpp @@ -1,22 +1,26 @@ #include "package_spec.h" +#include namespace vcpkg { expected package_spec::from_string(const std::string& spec, const triplet& default_target_triplet) { - auto pos = spec.find(':'); + std::string s(spec); + std::transform(s.begin(), s.end(), s.begin(), ::tolower); + + auto pos = s.find(':'); if (pos == std::string::npos) { - return package_spec{spec, default_target_triplet}; + return package_spec{s, default_target_triplet}; } - auto pos2 = spec.find(':', pos + 1); + auto pos2 = s.find(':', pos + 1); if (pos2 != std::string::npos) { return std::error_code(package_spec_parse_result::too_many_colons); } - return package_spec{spec.substr(0, pos), triplet::from_canonical_name(spec.substr(pos + 1))}; + return package_spec{s.substr(0, pos), triplet::from_canonical_name(s.substr(pos + 1))}; } std::string package_spec::dir() const -- cgit v1.2.3 From 5d58eb29cc9ae584335e3380c2645baf05b21222 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Mon, 3 Oct 2016 17:45:01 -0700 Subject: [package_spec] Force using the factories that do sanity checks --- toolsrc/include/package_spec.h | 17 +++++++++++----- toolsrc/src/commands_installation.cpp | 16 +++++++-------- toolsrc/src/lib.cpp | 4 ++-- toolsrc/src/package_spec.cpp | 37 ++++++++++++++++++++++++++++------- toolsrc/src/post_build_lint.cpp | 20 +++++++++---------- toolsrc/src/test.cpp | 8 ++++---- toolsrc/src/vcpkg_Dependencies.cpp | 6 +++--- toolsrc/src/vcpkg_Input.cpp | 2 +- toolsrc/src/vcpkg_paths.cpp | 2 +- 9 files changed, 71 insertions(+), 41 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/package_spec.h b/toolsrc/include/package_spec.h index 942b34adc..7410145ca 100644 --- a/toolsrc/include/package_spec.h +++ b/toolsrc/include/package_spec.h @@ -8,12 +8,19 @@ namespace vcpkg { struct package_spec { - static expected from_string(const std::string& spec, const triplet& default_target_triplet); + static expected from_string(const std::string& spec_as_string, const triplet& default_target_triplet); - std::string name; - triplet target_triplet; + static package_spec from_name_and_triplet(const std::string& name, const triplet& target_triplet); + + const std::string& name() const; + + const triplet& target_triplet() const; std::string dir() const; + + private: + std::string m_name; + triplet m_target_triplet; }; std::string to_string(const package_spec& spec); @@ -33,8 +40,8 @@ namespace std size_t operator()(const vcpkg::package_spec& value) const { size_t hash = 17; - hash = hash * 31 + std::hash()(value.name); - hash = hash * 31 + std::hash()(value.target_triplet); + hash = hash * 31 + std::hash()(value.name()); + hash = hash * 31 + std::hash()(value.target_triplet()); return hash; } }; diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index 521d4df71..a94fb7e59 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -24,9 +24,9 @@ namespace vcpkg { const fs::path ports_cmake_script_path = paths.ports_cmake; const std::wstring command = Strings::wformat(LR"("%%VS140COMNTOOLS%%..\..\VC\vcvarsall.bat" %s && cmake -DCMD=BUILD -DPORT=%s -DTARGET_TRIPLET=%s "-DCURRENT_PORT_DIR=%s/." -P "%s")", - Strings::utf8_to_utf16(spec.target_triplet.architecture()), - Strings::utf8_to_utf16(spec.name), - Strings::utf8_to_utf16(spec.target_triplet.canonical_name()), + Strings::utf8_to_utf16(spec.target_triplet().architecture()), + Strings::utf8_to_utf16(spec.name()), + Strings::utf8_to_utf16(spec.target_triplet().canonical_name()), port_dir.generic_wstring(), ports_cmake_script_path.generic_wstring()); @@ -53,7 +53,7 @@ namespace vcpkg perform_all_checks(spec, paths); - create_binary_control_file(paths, port_dir, spec.target_triplet); + create_binary_control_file(paths, port_dir, spec.target_triplet()); // const fs::path port_buildtrees_dir = paths.buildtrees / spec.name; // delete_directory(port_buildtrees_dir); @@ -61,7 +61,7 @@ namespace vcpkg static void build_internal(const package_spec& spec, const vcpkg_paths& paths) { - return build_internal(spec, paths, paths.ports / spec.name); + return build_internal(spec, paths, paths.ports / spec.name()); } void install_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) @@ -85,7 +85,7 @@ namespace vcpkg for (const package_spec& spec : install_plan) { - if (status_db.find_installed(spec.name, spec.target_triplet) != status_db.end()) + if (status_db.find_installed(spec.name(), spec.target_triplet()) != status_db.end()) { System::println(System::color::success, "Package %s is already installed", spec); continue; @@ -133,7 +133,7 @@ namespace vcpkg StatusParagraphs status_db = database_load_check(paths); const package_spec spec = Input::check_and_get_package_spec(args.command_arguments.at(0), default_target_triplet, example.c_str()); - Input::check_triplet(spec.target_triplet, paths); + Input::check_triplet(spec.target_triplet(), paths); std::unordered_set unmet_dependencies = Dependencies::find_unmet_dependencies(paths, spec, status_db); if (!unmet_dependencies.empty()) { @@ -161,7 +161,7 @@ namespace vcpkg expected current_spec = package_spec::from_string(args.command_arguments[0], default_target_triplet); if (auto spec = current_spec.get()) { - Input::check_triplet(spec->target_triplet, paths); + Input::check_triplet(spec->target_triplet(), paths); Environment::ensure_utilities_on_path(paths); const fs::path port_dir = args.command_arguments.at(1); build_internal(*spec, paths, port_dir); diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index 2127b7850..92451156a 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -135,7 +135,7 @@ static std::string get_fullpkgname_from_listfile(const fs::path& path) static fs::path prefix_path_for_package(const vcpkg_paths& paths, const BinaryParagraph& pgh) { - return paths.package_dir({pgh.name, pgh.target_triplet}); + return paths.package_dir(package_spec::from_name_and_triplet(pgh.name, pgh.target_triplet)); } static void write_update(const vcpkg_paths& paths, const StatusParagraph& p) @@ -316,7 +316,7 @@ static deinstall_plan deinstall_package_plan( void vcpkg::deinstall_package(const vcpkg_paths& paths, const package_spec& spec, StatusParagraphs& status_db) { - auto package_it = status_db.find(spec.name, spec.target_triplet); + auto package_it = status_db.find(spec.name(), spec.target_triplet()); if (package_it == status_db.end()) { System::println(System::color::success, "Package %s is not installed", spec); diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp index 3da0757fd..57f6179bf 100644 --- a/toolsrc/src/package_spec.cpp +++ b/toolsrc/src/package_spec.cpp @@ -3,15 +3,15 @@ namespace vcpkg { - expected package_spec::from_string(const std::string& spec, const triplet& default_target_triplet) + expected package_spec::from_string(const std::string& spec_as_string, const triplet& default_target_triplet) { - std::string s(spec); + std::string s(spec_as_string); std::transform(s.begin(), s.end(), s.begin(), ::tolower); auto pos = s.find(':'); if (pos == std::string::npos) { - return package_spec{s, default_target_triplet}; + return from_name_and_triplet(s, default_target_triplet); } auto pos2 = s.find(':', pos + 1); @@ -20,17 +20,40 @@ namespace vcpkg return std::error_code(package_spec_parse_result::too_many_colons); } - return package_spec{s.substr(0, pos), triplet::from_canonical_name(s.substr(pos + 1))}; + const std::string name = s.substr(0, pos); + const triplet target_triplet = triplet::from_canonical_name(s.substr(pos + 1)); + return from_name_and_triplet(name, target_triplet); + } + + package_spec package_spec::from_name_and_triplet(const std::string& name, const triplet& target_triplet) + { + std::string n(name); + std::transform(n.begin(), n.end(), n.begin(), ::tolower); + + package_spec p; + p.m_name = n; + p.m_target_triplet = target_triplet; + return p; + } + + const std::string& package_spec::name() const + { + return this->m_name; + } + + const triplet& package_spec::target_triplet() const + { + return this->m_target_triplet; } std::string package_spec::dir() const { - return Strings::format("%s_%s", this->name, this->target_triplet); + return Strings::format("%s_%s", this->m_name, this->m_target_triplet); } std::string to_string(const package_spec& spec) { - return Strings::format("%s:%s", spec.name, spec.target_triplet); + return Strings::format("%s:%s", spec.name(), spec.target_triplet()); } std::string to_printf_arg(const package_spec& spec) @@ -40,7 +63,7 @@ namespace vcpkg bool operator==(const package_spec& left, const package_spec& right) { - return left.name == right.name && left.target_triplet == right.target_triplet; + return left.name() == right.name() && left.target_triplet() == right.target_triplet(); } std::ostream& operator<<(std::ostream& os, const package_spec& spec) diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp index 29710bd14..680f01913 100644 --- a/toolsrc/src/post_build_lint.cpp +++ b/toolsrc/src/post_build_lint.cpp @@ -113,7 +113,7 @@ namespace vcpkg if (!misplaced_cmake_files.empty()) { - System::println(System::color::warning, "The following cmake files were found outside /share/%s. Please place cmake files in /share/%s.", spec.name, spec.name); + System::println(System::color::warning, "The following cmake files were found outside /share/%s. Please place cmake files in /share/%s.", spec.name(), spec.name()); print_vector_of_files(misplaced_cmake_files); return lint_status::ERROR; } @@ -151,12 +151,12 @@ namespace vcpkg static lint_status check_for_copyright_file(const package_spec& spec, const vcpkg_paths& paths) { - const fs::path copyright_file = paths.packages / spec.dir() / "share" / spec.name / "copyright"; + const fs::path copyright_file = paths.packages / spec.dir() / "share" / spec.name() / "copyright"; if (fs::exists(copyright_file)) { return lint_status::SUCCESS; } - const fs::path current_buildtrees_dir = paths.buildtrees / spec.name; + const fs::path current_buildtrees_dir = paths.buildtrees / spec.name(); const fs::path current_buildtrees_dir_src = current_buildtrees_dir / "src"; std::vector potential_copyright_files; @@ -175,14 +175,14 @@ namespace vcpkg } } - System::println(System::color::warning, "The software license must be available at ${CURRENT_PACKAGES_DIR}/share/%s/copyright .", spec.name); + System::println(System::color::warning, "The software license must be available at ${CURRENT_PACKAGES_DIR}/share/%s/copyright .", spec.name()); if (potential_copyright_files.size() == 1) // if there is only one candidate, provide the cmake lines needed to place it in the proper location { const fs::path found_file = potential_copyright_files[0]; const fs::path relative_path = found_file.string().erase(0, current_buildtrees_dir.string().size() + 1); // The +1 is needed to remove the "/" System::println("\n file(COPY ${CURRENT_BUILDTREES_DIR}/%s DESTINATION ${CURRENT_PACKAGES_DIR}/share/%s)\n" " file(RENAME ${CURRENT_PACKAGES_DIR}/share/%s/%s ${CURRENT_PACKAGES_DIR}/share/%s/copyright)", - relative_path.generic_string(), spec.name, spec.name, found_file.filename().generic_string(), spec.name); + relative_path.generic_string(), spec.name(), spec.name(), found_file.filename().generic_string(), spec.name()); return lint_status::ERROR; } @@ -193,7 +193,7 @@ namespace vcpkg } const fs::path current_packages_dir = paths.packages / spec.dir(); - System::println(" %s/share/%s/copyright", current_packages_dir.generic_string(), spec.name); + System::println(" %s/share/%s/copyright", current_packages_dir.generic_string(), spec.name()); return lint_status::ERROR; } @@ -333,18 +333,18 @@ namespace vcpkg recursive_find_files_with_extension_in_dir(paths.packages / spec.dir() / "debug" / "bin", ".dll", dlls); error_count += check_exports_of_dlls(dlls); - error_count += check_uwp_bit_of_dlls(spec.target_triplet.system(), dlls); - error_count += check_architecture(spec.target_triplet.architecture(), dlls); + error_count += check_uwp_bit_of_dlls(spec.target_triplet().system(), dlls); + error_count += check_architecture(spec.target_triplet().architecture(), dlls); std::vector libs; recursive_find_files_with_extension_in_dir(paths.packages / spec.dir() / "lib", ".lib", libs); recursive_find_files_with_extension_in_dir(paths.packages / spec.dir() / "debug" / "lib", ".lib", libs); - error_count += check_architecture(spec.target_triplet.architecture(), libs); + error_count += check_architecture(spec.target_triplet().architecture(), libs); if (error_count != 0) { - const fs::path portfile = paths.ports / spec.name / "portfile.cmake"; + const fs::path portfile = paths.ports / spec.name() / "portfile.cmake"; System::println(System::color::error, "Found %u error(s). Please correct the portfile:\n %s", error_count, portfile.string()); exit(EXIT_FAILURE); } diff --git a/toolsrc/src/test.cpp b/toolsrc/src/test.cpp index 9bc41fc9e..ba35391aa 100644 --- a/toolsrc/src/test.cpp +++ b/toolsrc/src/test.cpp @@ -310,16 +310,16 @@ namespace UnitTest1 { vcpkg::expected spec = vcpkg::package_spec::from_string("zlib", vcpkg::triplet::X86_WINDOWS); Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code())); - Assert::AreEqual("zlib", spec.get()->name.c_str()); - Assert::AreEqual(vcpkg::triplet::X86_WINDOWS.canonical_name(), spec.get()->target_triplet.canonical_name()); + Assert::AreEqual("zlib", spec.get()->name().c_str()); + Assert::AreEqual(vcpkg::triplet::X86_WINDOWS.canonical_name(), spec.get()->target_triplet().canonical_name()); } TEST_METHOD(package_spec_parse_with_arch) { vcpkg::expected spec = vcpkg::package_spec::from_string("zlib:x64-uwp", vcpkg::triplet::X86_WINDOWS); Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code())); - Assert::AreEqual("zlib", spec.get()->name.c_str()); - Assert::AreEqual(vcpkg::triplet::X64_UWP.canonical_name(), spec.get()->target_triplet.canonical_name()); + Assert::AreEqual("zlib", spec.get()->name().c_str()); + Assert::AreEqual(vcpkg::triplet::X64_UWP.canonical_name(), spec.get()->target_triplet().canonical_name()); } TEST_METHOD(package_spec_parse_with_multiple_colon) diff --git a/toolsrc/src/vcpkg_Dependencies.cpp b/toolsrc/src/vcpkg_Dependencies.cpp index 6ffb4959d..9c083a879 100644 --- a/toolsrc/src/vcpkg_Dependencies.cpp +++ b/toolsrc/src/vcpkg_Dependencies.cpp @@ -20,7 +20,7 @@ namespace vcpkg { namespace Dependencies while (!examine_stack.empty()) { - package_spec spec = examine_stack.back(); + const package_spec spec = examine_stack.back(); examine_stack.pop_back(); if (was_examined.find(spec) != was_examined.end()) @@ -32,8 +32,8 @@ namespace vcpkg { namespace Dependencies for (const std::string& dep_as_string : dependencies_as_string) { - package_spec current_dep = {dep_as_string, spec.target_triplet}; - auto it = status_db.find(current_dep.name, current_dep.target_triplet); + const package_spec current_dep = package_spec::from_name_and_triplet(dep_as_string, spec.target_triplet()); + auto it = status_db.find(current_dep.name(), current_dep.target_triplet()); if (it != status_db.end() && (*it)->want == want_t::install) { continue; diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp index 435d55576..0c03faaa8 100644 --- a/toolsrc/src/vcpkg_Input.cpp +++ b/toolsrc/src/vcpkg_Input.cpp @@ -44,7 +44,7 @@ namespace vcpkg {namespace Input { for (const package_spec& spec : triplets) { - check_triplet(spec.target_triplet, paths); + check_triplet(spec.target_triplet(), paths); } } }} diff --git a/toolsrc/src/vcpkg_paths.cpp b/toolsrc/src/vcpkg_paths.cpp index 559f719af..1f9eb0bc5 100644 --- a/toolsrc/src/vcpkg_paths.cpp +++ b/toolsrc/src/vcpkg_paths.cpp @@ -52,7 +52,7 @@ namespace vcpkg fs::path vcpkg_paths::port_dir(const package_spec& spec) const { - return this->ports / spec.name; + return this->ports / spec.name(); } bool vcpkg_paths::is_valid_triplet(const triplet& t) const -- cgit v1.2.3 From 31c9cd8c2d80c373374c7a9746b2e8249ffc16f5 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Mon, 3 Oct 2016 19:48:56 -0700 Subject: Remove redundant parentheses --- toolsrc/src/vcpkg_Strings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/vcpkg_Strings.cpp b/toolsrc/src/vcpkg_Strings.cpp index 9a81bbbfd..5d6dcc7a7 100644 --- a/toolsrc/src/vcpkg_Strings.cpp +++ b/toolsrc/src/vcpkg_Strings.cpp @@ -54,7 +54,7 @@ namespace vcpkg {namespace Strings std::transform(pattern.begin(), pattern.end(), back_inserter(patter_as_lower_case), tolower); return search(s.begin(), s.end(), patter_as_lower_case.begin(), patter_as_lower_case.end(), [](const char a, const char b) { - return (tolower(a) == b); + return tolower(a) == b; }); } }} -- cgit v1.2.3 From ea751d6630cd3eb96308ac55c022b75a5feed56c Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 14:44:19 -0700 Subject: Add Strings::ascii_to_lowercase() --- toolsrc/include/vcpkg_Strings.h | 2 ++ toolsrc/src/vcpkg_Strings.cpp | 13 ++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Strings.h b/toolsrc/include/vcpkg_Strings.h index dc17f35d2..b7eabf234 100644 --- a/toolsrc/include/vcpkg_Strings.h +++ b/toolsrc/include/vcpkg_Strings.h @@ -60,4 +60,6 @@ namespace vcpkg {namespace Strings std::string utf16_to_utf8(const std::wstring& w); std::string::const_iterator case_insensitive_find(const std::string& s, const std::string& pattern); + + std::string ascii_to_lowercase(const std::string& input); }} diff --git a/toolsrc/src/vcpkg_Strings.cpp b/toolsrc/src/vcpkg_Strings.cpp index 5d6dcc7a7..452825e7c 100644 --- a/toolsrc/src/vcpkg_Strings.cpp +++ b/toolsrc/src/vcpkg_Strings.cpp @@ -50,11 +50,18 @@ namespace vcpkg {namespace Strings std::string::const_iterator case_insensitive_find(const std::string& s, const std::string& pattern) { - std::string patter_as_lower_case; - std::transform(pattern.begin(), pattern.end(), back_inserter(patter_as_lower_case), tolower); - return search(s.begin(), s.end(), patter_as_lower_case.begin(), patter_as_lower_case.end(), [](const char a, const char b) + std::string pattern_as_lower_case; + std::transform(pattern.begin(), pattern.end(), back_inserter(pattern_as_lower_case), tolower); + return search(s.begin(), s.end(), pattern_as_lower_case.begin(), pattern_as_lower_case.end(), [](const char a, const char b) { return tolower(a) == b; }); } + + std::string ascii_to_lowercase(const std::string& input) + { + std::string output = input; + std::transform(output.begin(), output.end(), output.begin(), ::tolower); + return output; + } }} -- cgit v1.2.3 From 04539816b5e793afdcff991a28c298f199e709db Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 14:46:40 -0700 Subject: Add another result when parsing package spec: has_invalid_characters --- toolsrc/include/package_spec_parse_result.h | 6 ++++-- toolsrc/src/package_spec_parse_result.cpp | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/package_spec_parse_result.h b/toolsrc/include/package_spec_parse_result.h index e59622951..bfb5e82f7 100644 --- a/toolsrc/include/package_spec_parse_result.h +++ b/toolsrc/include/package_spec_parse_result.h @@ -6,7 +6,8 @@ namespace vcpkg enum class package_spec_parse_result { success = 0, - too_many_colons + too_many_colons, + invalid_characters }; struct package_spec_parse_result_category_impl final : std::error_category @@ -30,5 +31,6 @@ namespace std { template <> struct is_error_code_enum : ::std::true_type - {}; + { + }; } diff --git a/toolsrc/src/package_spec_parse_result.cpp b/toolsrc/src/package_spec_parse_result.cpp index 757b6df53..6c6c28e21 100644 --- a/toolsrc/src/package_spec_parse_result.cpp +++ b/toolsrc/src/package_spec_parse_result.cpp @@ -17,6 +17,8 @@ namespace vcpkg return "OK"; case package_spec_parse_result::too_many_colons: return "Too many colons"; + case package_spec_parse_result::invalid_characters: + return "Contains invalid characters. Only alphanumeric ASCII characters and dashes are allowed"; default: Checks::unreachable(); } -- cgit v1.2.3 From bf323e8cc6f3edd245e3f5661cab6c8b7f335da9 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 14:47:42 -0700 Subject: [package_spec]User input gets lowercased; other input is checked --- toolsrc/include/package_spec.h | 2 +- toolsrc/src/commands_installation.cpp | 7 ++++--- toolsrc/src/lib.cpp | 2 +- toolsrc/src/package_spec.cpp | 28 ++++++++++++++++------------ toolsrc/src/vcpkg_Dependencies.cpp | 24 ++++++++++++++++-------- toolsrc/src/vcpkg_Input.cpp | 3 ++- 6 files changed, 40 insertions(+), 26 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/package_spec.h b/toolsrc/include/package_spec.h index 7410145ca..30dfca5c7 100644 --- a/toolsrc/include/package_spec.h +++ b/toolsrc/include/package_spec.h @@ -10,7 +10,7 @@ namespace vcpkg { static expected from_string(const std::string& spec_as_string, const triplet& default_target_triplet); - static package_spec from_name_and_triplet(const std::string& name, const triplet& target_triplet); + static expected from_name_and_triplet(const std::string& name, const triplet& target_triplet); const std::string& name() const; diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index a94fb7e59..6fe6aa9a1 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -23,10 +23,11 @@ namespace vcpkg static void build_internal(const package_spec& spec, const vcpkg_paths& paths, const fs::path& port_dir) { const fs::path ports_cmake_script_path = paths.ports_cmake; + auto&& target_triplet = spec.target_triplet(); const std::wstring command = Strings::wformat(LR"("%%VS140COMNTOOLS%%..\..\VC\vcvarsall.bat" %s && cmake -DCMD=BUILD -DPORT=%s -DTARGET_TRIPLET=%s "-DCURRENT_PORT_DIR=%s/." -P "%s")", - Strings::utf8_to_utf16(spec.target_triplet().architecture()), + Strings::utf8_to_utf16(target_triplet.architecture()), Strings::utf8_to_utf16(spec.name()), - Strings::utf8_to_utf16(spec.target_triplet().canonical_name()), + Strings::utf8_to_utf16(target_triplet.canonical_name()), port_dir.generic_wstring(), ports_cmake_script_path.generic_wstring()); @@ -53,7 +54,7 @@ namespace vcpkg perform_all_checks(spec, paths); - create_binary_control_file(paths, port_dir, spec.target_triplet()); + create_binary_control_file(paths, port_dir, target_triplet); // const fs::path port_buildtrees_dir = paths.buildtrees / spec.name; // delete_directory(port_buildtrees_dir); diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index 92451156a..c4ebb872b 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -135,7 +135,7 @@ static std::string get_fullpkgname_from_listfile(const fs::path& path) static fs::path prefix_path_for_package(const vcpkg_paths& paths, const BinaryParagraph& pgh) { - return paths.package_dir(package_spec::from_name_and_triplet(pgh.name, pgh.target_triplet)); + return paths.package_dir(*package_spec::from_name_and_triplet(pgh.name, pgh.target_triplet).get()); } static void write_update(const vcpkg_paths& paths, const StatusParagraph& p) diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp index 57f6179bf..a578787c9 100644 --- a/toolsrc/src/package_spec.cpp +++ b/toolsrc/src/package_spec.cpp @@ -3,35 +3,39 @@ namespace vcpkg { - expected package_spec::from_string(const std::string& spec_as_string, const triplet& default_target_triplet) + static bool is_valid_package_spec_char(char c) { - std::string s(spec_as_string); - std::transform(s.begin(), s.end(), s.begin(), ::tolower); + return (c == '-') || (isalnum(c) && islower(c)); + } - auto pos = s.find(':'); + expected package_spec::from_string(const std::string& spec_as_string, const triplet& default_target_triplet) + { + auto pos = spec_as_string.find(':'); if (pos == std::string::npos) { - return from_name_and_triplet(s, default_target_triplet); + return from_name_and_triplet(spec_as_string, default_target_triplet); } - auto pos2 = s.find(':', pos + 1); + auto pos2 = spec_as_string.find(':', pos + 1); if (pos2 != std::string::npos) { return std::error_code(package_spec_parse_result::too_many_colons); } - const std::string name = s.substr(0, pos); - const triplet target_triplet = triplet::from_canonical_name(s.substr(pos + 1)); + const std::string name = spec_as_string.substr(0, pos); + const triplet target_triplet = triplet::from_canonical_name(spec_as_string.substr(pos + 1)); return from_name_and_triplet(name, target_triplet); } - package_spec package_spec::from_name_and_triplet(const std::string& name, const triplet& target_triplet) + expected package_spec::from_name_and_triplet(const std::string& name, const triplet& target_triplet) { - std::string n(name); - std::transform(n.begin(), n.end(), n.begin(), ::tolower); + if (std::find_if_not(name.cbegin(), name.cend(), is_valid_package_spec_char) != name.end()) + { + return std::error_code(package_spec_parse_result::invalid_characters); + } package_spec p; - p.m_name = n; + p.m_name = name; p.m_target_triplet = target_triplet; return p; } diff --git a/toolsrc/src/vcpkg_Dependencies.cpp b/toolsrc/src/vcpkg_Dependencies.cpp index 9c083a879..fef82940d 100644 --- a/toolsrc/src/vcpkg_Dependencies.cpp +++ b/toolsrc/src/vcpkg_Dependencies.cpp @@ -32,17 +32,25 @@ namespace vcpkg { namespace Dependencies for (const std::string& dep_as_string : dependencies_as_string) { - const package_spec current_dep = package_spec::from_name_and_triplet(dep_as_string, spec.target_triplet()); - auto it = status_db.find(current_dep.name(), current_dep.target_triplet()); - if (it != status_db.end() && (*it)->want == want_t::install) + const expected expected_dep = package_spec::from_name_and_triplet(dep_as_string, spec.target_triplet()); + if (auto pdep = expected_dep.get()) { - continue; - } + const package_spec current_dep = *pdep; + auto it = status_db.find(current_dep.name(), current_dep.target_triplet()); + if (it != status_db.end() && (*it)->want == want_t::install) + { + continue; + } - graph.add_edge(spec, current_dep); - if (was_examined.find(current_dep) == was_examined.end()) + graph.add_edge(spec, current_dep); + if (was_examined.find(current_dep) == was_examined.end()) + { + examine_stack.push_back(std::move(current_dep)); + } + } + else { - examine_stack.push_back(std::move(current_dep)); + std::abort(); } } diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp index 0c03faaa8..b92ed27ca 100644 --- a/toolsrc/src/vcpkg_Input.cpp +++ b/toolsrc/src/vcpkg_Input.cpp @@ -7,7 +7,8 @@ namespace vcpkg {namespace Input { package_spec 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); + const std::string as_lowercase = Strings::ascii_to_lowercase(package_spec_as_string); + expected expected_spec = package_spec::from_string(as_lowercase, default_target_triplet); if (auto spec = expected_spec.get()) { return *spec; -- cgit v1.2.3 From 7d13495cf90af06bad4351a91a5d7cb868abd2de Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 14:48:39 -0700 Subject: All-CAPS for enum members --- toolsrc/include/package_spec_parse_result.h | 6 +++--- toolsrc/src/package_spec.cpp | 4 ++-- toolsrc/src/package_spec_parse_result.cpp | 6 +++--- toolsrc/src/test.cpp | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/package_spec_parse_result.h b/toolsrc/include/package_spec_parse_result.h index bfb5e82f7..5735c4f4c 100644 --- a/toolsrc/include/package_spec_parse_result.h +++ b/toolsrc/include/package_spec_parse_result.h @@ -5,9 +5,9 @@ namespace vcpkg { enum class package_spec_parse_result { - success = 0, - too_many_colons, - invalid_characters + SUCCESS = 0, + TOO_MANY_COLONS, + INVALID_CHARACTERS }; struct package_spec_parse_result_category_impl final : std::error_category diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp index a578787c9..b9f6f54fe 100644 --- a/toolsrc/src/package_spec.cpp +++ b/toolsrc/src/package_spec.cpp @@ -19,7 +19,7 @@ namespace vcpkg auto pos2 = spec_as_string.find(':', pos + 1); if (pos2 != std::string::npos) { - return std::error_code(package_spec_parse_result::too_many_colons); + return std::error_code(package_spec_parse_result::TOO_MANY_COLONS); } const std::string name = spec_as_string.substr(0, pos); @@ -31,7 +31,7 @@ namespace vcpkg { if (std::find_if_not(name.cbegin(), name.cend(), is_valid_package_spec_char) != name.end()) { - return std::error_code(package_spec_parse_result::invalid_characters); + return std::error_code(package_spec_parse_result::INVALID_CHARACTERS); } package_spec p; diff --git a/toolsrc/src/package_spec_parse_result.cpp b/toolsrc/src/package_spec_parse_result.cpp index 6c6c28e21..d7600ad5b 100644 --- a/toolsrc/src/package_spec_parse_result.cpp +++ b/toolsrc/src/package_spec_parse_result.cpp @@ -13,11 +13,11 @@ namespace vcpkg { switch (static_cast(ev)) { - case package_spec_parse_result::success: + case package_spec_parse_result::SUCCESS: return "OK"; - case package_spec_parse_result::too_many_colons: + case package_spec_parse_result::TOO_MANY_COLONS: return "Too many colons"; - case package_spec_parse_result::invalid_characters: + case package_spec_parse_result::INVALID_CHARACTERS: return "Contains invalid characters. Only alphanumeric ASCII characters and dashes are allowed"; default: Checks::unreachable(); diff --git a/toolsrc/src/test.cpp b/toolsrc/src/test.cpp index ba35391aa..476efb233 100644 --- a/toolsrc/src/test.cpp +++ b/toolsrc/src/test.cpp @@ -309,7 +309,7 @@ namespace UnitTest1 TEST_METHOD(package_spec_parse) { vcpkg::expected spec = vcpkg::package_spec::from_string("zlib", vcpkg::triplet::X86_WINDOWS); - Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code())); + Assert::AreEqual(vcpkg::package_spec_parse_result::SUCCESS, vcpkg::to_package_spec_parse_result(spec.error_code())); Assert::AreEqual("zlib", spec.get()->name().c_str()); Assert::AreEqual(vcpkg::triplet::X86_WINDOWS.canonical_name(), spec.get()->target_triplet().canonical_name()); } @@ -317,7 +317,7 @@ namespace UnitTest1 TEST_METHOD(package_spec_parse_with_arch) { vcpkg::expected spec = vcpkg::package_spec::from_string("zlib:x64-uwp", vcpkg::triplet::X86_WINDOWS); - Assert::AreEqual(vcpkg::package_spec_parse_result::success, vcpkg::to_package_spec_parse_result(spec.error_code())); + Assert::AreEqual(vcpkg::package_spec_parse_result::SUCCESS, vcpkg::to_package_spec_parse_result(spec.error_code())); Assert::AreEqual("zlib", spec.get()->name().c_str()); Assert::AreEqual(vcpkg::triplet::X64_UWP.canonical_name(), spec.get()->target_triplet().canonical_name()); } @@ -325,7 +325,7 @@ namespace UnitTest1 TEST_METHOD(package_spec_parse_with_multiple_colon) { auto ec = vcpkg::package_spec::from_string("zlib:x86-uwp:", vcpkg::triplet::X86_WINDOWS).error_code(); - Assert::AreEqual(vcpkg::package_spec_parse_result::too_many_colons, vcpkg::to_package_spec_parse_result(ec)); + Assert::AreEqual(vcpkg::package_spec_parse_result::TOO_MANY_COLONS, vcpkg::to_package_spec_parse_result(ec)); } TEST_METHOD(utf8_to_utf16) -- cgit v1.2.3 From 79f823590d1f04634766d3bdf566b23f8570d117 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 14:55:33 -0700 Subject: Temporarily use get_or_throw() --- toolsrc/src/lib.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index c4ebb872b..955aa2c63 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -135,7 +135,7 @@ static std::string get_fullpkgname_from_listfile(const fs::path& path) static fs::path prefix_path_for_package(const vcpkg_paths& paths, const BinaryParagraph& pgh) { - return paths.package_dir(*package_spec::from_name_and_triplet(pgh.name, pgh.target_triplet).get()); + return paths.package_dir(package_spec::from_name_and_triplet(pgh.name, pgh.target_triplet).get_or_throw()); } static void write_update(const vcpkg_paths& paths, const StatusParagraph& p) -- cgit v1.2.3 From e383b39637aa8a7a62b837862a86ca89a996a807 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 15:10:04 -0700 Subject: Replace auto with actual type --- toolsrc/src/StatusParagraphs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/StatusParagraphs.cpp b/toolsrc/src/StatusParagraphs.cpp index 463e3e3b8..fb6383d5f 100644 --- a/toolsrc/src/StatusParagraphs.cpp +++ b/toolsrc/src/StatusParagraphs.cpp @@ -13,7 +13,7 @@ namespace vcpkg StatusParagraphs::const_iterator StatusParagraphs::find(const std::string& name, const triplet& target_triplet) const { - return std::find_if(begin(), end(), [&](const auto& pgh) + return std::find_if(begin(), end(), [&](const std::unique_ptr& pgh) { return pgh->package.name == name && pgh->package.target_triplet == target_triplet; }); @@ -21,7 +21,7 @@ namespace vcpkg StatusParagraphs::iterator StatusParagraphs::find(const std::string& name, const triplet& target_triplet) { - return std::find_if(begin(), end(), [&](const auto& pgh) + return std::find_if(begin(), end(), [&](const std::unique_ptr& pgh) { return pgh->package.name == name && pgh->package.target_triplet == target_triplet; }); -- cgit v1.2.3 From 429e2eca4ab74127b144743b136f0407c0ae4492 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 15:16:07 -0700 Subject: BinaryParagraph now contains a package_spec instead of name+triplet --- toolsrc/include/BinaryParagraph.h | 4 ++-- toolsrc/src/BinaryParagraph.cpp | 21 +++++++++++---------- toolsrc/src/StatusParagraphs.cpp | 19 ++++++++++--------- toolsrc/src/commands_update.cpp | 2 +- toolsrc/src/lib.cpp | 20 +++++++++++--------- toolsrc/src/test.cpp | 6 +++--- 6 files changed, 38 insertions(+), 34 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/BinaryParagraph.h b/toolsrc/include/BinaryParagraph.h index 88d6e84b1..01979c924 100644 --- a/toolsrc/include/BinaryParagraph.h +++ b/toolsrc/include/BinaryParagraph.h @@ -3,6 +3,7 @@ #include #include "SourceParagraph.h" #include "triplet.h" +#include "package_spec.h" namespace vcpkg { @@ -18,11 +19,10 @@ namespace vcpkg std::string dir() const; - std::string name; + package_spec spec; std::string version; std::string description; std::string maintainer; - triplet target_triplet; std::vector depends; }; diff --git a/toolsrc/src/BinaryParagraph.cpp b/toolsrc/src/BinaryParagraph.cpp index 6d32ff137..48d04f686 100644 --- a/toolsrc/src/BinaryParagraph.cpp +++ b/toolsrc/src/BinaryParagraph.cpp @@ -9,12 +9,14 @@ namespace vcpkg BinaryParagraph::BinaryParagraph() = default; BinaryParagraph::BinaryParagraph(const std::unordered_map& fields) : - name(required_field(fields, "Package")), version(required_field(fields, "Version")), description(optional_field(fields, "Description")), - maintainer(optional_field(fields, "Maintainer")), - target_triplet(triplet::from_canonical_name(required_field(fields, "Architecture"))) + maintainer(optional_field(fields, "Maintainer")) { + const std::string name = required_field(fields, "Package"); + const triplet target_triplet = triplet::from_canonical_name(required_field(fields, "Architecture")); + this->spec = package_spec::from_name_and_triplet(name, target_triplet).get_or_throw(); + { std::string multi_arch = required_field(fields, "Multi-Arch"); Checks::check_throw(multi_arch == "same", "Multi-Arch must be 'same' but was %s", multi_arch); @@ -30,32 +32,31 @@ namespace vcpkg BinaryParagraph::BinaryParagraph(const SourceParagraph& spgh, const triplet& target_triplet) { - this->name = spgh.name; + this->spec = package_spec::from_name_and_triplet(spgh.name, target_triplet).get_or_throw(); this->version = spgh.version; this->description = spgh.description; this->maintainer = spgh.maintainer; this->depends = spgh.depends; - this->target_triplet = target_triplet; } std::string BinaryParagraph::displayname() const { - return Strings::format("%s:%s", this->name, this->target_triplet); + return Strings::format("%s:%s", this->spec.name(), this->spec.target_triplet()); } std::string BinaryParagraph::dir() const { - return Strings::format("%s_%s", this->name, this->target_triplet); + return this->spec.dir(); } std::string BinaryParagraph::fullstem() const { - return Strings::format("%s_%s_%s", this->name, this->version, this->target_triplet); + return Strings::format("%s_%s_%s", this->spec.name(), this->version, this->spec.target_triplet()); } std::ostream& operator<<(std::ostream& os, const BinaryParagraph& p) { - os << "Package: " << p.name << "\n"; + os << "Package: " << p.spec.name() << "\n"; os << "Version: " << p.version << "\n"; if (!p.depends.empty()) { @@ -70,7 +71,7 @@ namespace vcpkg os << "\n"; } - os << "Architecture: " << p.target_triplet << "\n"; + os << "Architecture: " << p.spec.target_triplet() << "\n"; os << "Multi-Arch: same\n"; if (!p.maintainer.empty()) os << "Maintainer: " << p.maintainer << "\n"; diff --git a/toolsrc/src/StatusParagraphs.cpp b/toolsrc/src/StatusParagraphs.cpp index fb6383d5f..3e23c519a 100644 --- a/toolsrc/src/StatusParagraphs.cpp +++ b/toolsrc/src/StatusParagraphs.cpp @@ -15,7 +15,8 @@ namespace vcpkg { return std::find_if(begin(), end(), [&](const std::unique_ptr& pgh) { - return pgh->package.name == name && pgh->package.target_triplet == target_triplet; + const package_spec& spec = pgh->package.spec; + return spec.name() == name && spec.target_triplet() == target_triplet; }); } @@ -23,7 +24,8 @@ namespace vcpkg { return std::find_if(begin(), end(), [&](const std::unique_ptr& pgh) { - return pgh->package.name == name && pgh->package.target_triplet == target_triplet; + const package_spec& spec = pgh->package.spec; + return spec.name() == name && spec.target_triplet() == target_triplet; }); } @@ -41,18 +43,17 @@ namespace vcpkg StatusParagraphs::iterator StatusParagraphs::insert(std::unique_ptr pgh) { Checks::check_throw(pgh != nullptr, "Inserted null paragraph"); - auto ptr = find(pgh->package.name, pgh->package.target_triplet); + const package_spec& spec = pgh->package.spec; + auto ptr = find(spec.name(), spec.target_triplet()); if (ptr == end()) { paragraphs.push_back(std::move(pgh)); return paragraphs.rbegin(); } - else - { - // consume data from provided pgh. - **ptr = std::move(*pgh); - return ptr; - } + + // consume data from provided pgh. + **ptr = std::move(*pgh); + return ptr; } std::ostream& vcpkg::operator<<(std::ostream& os, const StatusParagraphs& l) diff --git a/toolsrc/src/commands_update.cpp b/toolsrc/src/commands_update.cpp index b34530f40..5d531ef39 100644 --- a/toolsrc/src/commands_update.cpp +++ b/toolsrc/src/commands_update.cpp @@ -39,7 +39,7 @@ namespace vcpkg { if (pgh->state == install_state_t::not_installed && pgh->want == want_t::purge) continue; - auto it = src_names_to_versions.find(pgh->package.name); + auto it = src_names_to_versions.find(pgh->package.spec.name()); if (it == src_names_to_versions.end()) { // Package was not installed from portfile diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index 955aa2c63..941454a6b 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -135,7 +135,7 @@ static std::string get_fullpkgname_from_listfile(const fs::path& path) static fs::path prefix_path_for_package(const vcpkg_paths& paths, const BinaryParagraph& pgh) { - return paths.package_dir(package_spec::from_name_and_triplet(pgh.name, pgh.target_triplet).get_or_throw()); + return paths.package_dir(pgh.spec); } static void write_update(const vcpkg_paths& paths, const StatusParagraph& p) @@ -157,9 +157,11 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar auto package_prefix_path = prefix_path_for_package(paths, bpgh); auto prefix_length = package_prefix_path.native().size(); + const triplet& target_triplet = bpgh.spec.target_triplet(); + const std::string& target_triplet_as_string = target_triplet.canonical_name(); std::error_code ec; - fs::create_directory(paths.installed / bpgh.target_triplet.canonical_name(), ec); - listfile << bpgh.target_triplet << "\n"; + fs::create_directory(paths.installed / target_triplet_as_string, ec); + listfile << target_triplet << "\n"; for (auto it = fs::recursive_directory_iterator(package_prefix_path); it != fs::recursive_directory_iterator(); ++it) { @@ -171,7 +173,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar } auto suffix = it->path().generic_u8string().substr(prefix_length + 1); - auto target = paths.installed / bpgh.target_triplet.canonical_name() / suffix; + auto target = paths.installed / target_triplet_as_string / suffix; auto status = it->status(ec); if (ec) @@ -187,7 +189,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar System::println(System::color::error, "failed: %s: %s", target.u8string(), ec.message()); } - listfile << bpgh.target_triplet << "/" << suffix << "\n"; + listfile << target_triplet << "/" << suffix << "\n"; } else if (fs::is_regular_file(status)) { @@ -196,7 +198,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar { System::println(System::color::error, "failed: %s: %s", target.u8string(), ec.message()); } - listfile << bpgh.target_triplet << "/" << suffix << "\n"; + listfile << target_triplet << "/" << suffix << "\n"; } else if (!fs::status_known(status)) { @@ -257,7 +259,7 @@ void vcpkg::install_package(const vcpkg_paths& paths, const BinaryParagraph& bin spgh.state = install_state_t::half_installed; for (const std::string& dependency : spgh.package.depends) { - if (status_db.find_installed(dependency, spgh.package.target_triplet) == status_db.end()) + if (status_db.find_installed(dependency, spgh.package.spec.target_triplet()) == status_db.end()) { std::abort(); } @@ -297,12 +299,12 @@ static deinstall_plan deinstall_package_plan( { if (inst_pkg->want != want_t::install) continue; - if (inst_pkg->package.target_triplet != pkg.target_triplet) + if (inst_pkg->package.spec.target_triplet() != pkg.spec.target_triplet()) continue; const auto& deps = inst_pkg->package.depends; - if (std::find(deps.begin(), deps.end(), pkg.name) != deps.end()) + if (std::find(deps.begin(), deps.end(), pkg.spec.name()) != deps.end()) { dependencies_out.push_back(inst_pkg.get()); } diff --git a/toolsrc/src/test.cpp b/toolsrc/src/test.cpp index 476efb233..fc49b362d 100644 --- a/toolsrc/src/test.cpp +++ b/toolsrc/src/test.cpp @@ -87,11 +87,11 @@ namespace UnitTest1 {"Multi-Arch", "same"}, }); - Assert::AreEqual("zlib", pgh.name.c_str()); + Assert::AreEqual("zlib", pgh.spec.name().c_str()); Assert::AreEqual("1.2.8", pgh.version.c_str()); Assert::AreEqual("", pgh.maintainer.c_str()); Assert::AreEqual("", pgh.description.c_str()); - Assert::AreEqual("a", pgh.target_triplet.canonical_name().c_str()); + Assert::AreEqual("a", pgh.spec.target_triplet().canonical_name().c_str()); Assert::AreEqual(size_t(0), pgh.depends.size()); } @@ -106,7 +106,7 @@ namespace UnitTest1 {"Description", "d"}, {"Depends", "bd"} }); - Assert::AreEqual("s", pgh.name.c_str()); + Assert::AreEqual("s", pgh.spec.name().c_str()); Assert::AreEqual("v", pgh.version.c_str()); Assert::AreEqual("m", pgh.maintainer.c_str()); Assert::AreEqual("d", pgh.description.c_str()); -- cgit v1.2.3 From 8400da7f1d7143ff5969a5ae2fea4b0e76315216 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 15:18:44 -0700 Subject: Remove function prefix_path_for_package() --- toolsrc/src/lib.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/lib.cpp b/toolsrc/src/lib.cpp index 941454a6b..45b73ee07 100644 --- a/toolsrc/src/lib.cpp +++ b/toolsrc/src/lib.cpp @@ -133,11 +133,6 @@ static std::string get_fullpkgname_from_listfile(const fs::path& path) return ret; } -static fs::path prefix_path_for_package(const vcpkg_paths& paths, const BinaryParagraph& pgh) -{ - return paths.package_dir(pgh.spec); -} - static void write_update(const vcpkg_paths& paths, const StatusParagraph& p) { static int update_id = 0; @@ -154,7 +149,7 @@ static void install_and_write_listfile(const vcpkg_paths& paths, const BinaryPar { std::fstream listfile(listfile_path(paths, bpgh), std::ios_base::out | std::ios_base::binary | std::ios_base::trunc); - auto package_prefix_path = prefix_path_for_package(paths, bpgh); + auto package_prefix_path = paths.package_dir(bpgh.spec); auto prefix_length = package_prefix_path.native().size(); const triplet& target_triplet = bpgh.spec.target_triplet(); @@ -507,7 +502,7 @@ namespace void vcpkg::binary_import(const vcpkg_paths& paths, const fs::path& include_directory, const fs::path& project_directory, const BinaryParagraph& control_file_data) { - fs::path library_destination_path = prefix_path_for_package(paths, control_file_data); + fs::path library_destination_path = paths.package_dir(control_file_data.spec); fs::create_directory(library_destination_path); place_library_files_in(include_directory, project_directory, library_destination_path); -- cgit v1.2.3 From 0050125443be8b5456e4a8d5ce9964e3db2703cd Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 15:23:44 -0700 Subject: Rename function case_insensitive_find() to case_insensitive_ascii_find() --- toolsrc/include/vcpkg_Strings.h | 2 +- toolsrc/src/commands_search.cpp | 2 +- toolsrc/src/post_build_lint.cpp | 2 +- toolsrc/src/vcpkg_Strings.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg_Strings.h b/toolsrc/include/vcpkg_Strings.h index b7eabf234..2aa99afe0 100644 --- a/toolsrc/include/vcpkg_Strings.h +++ b/toolsrc/include/vcpkg_Strings.h @@ -59,7 +59,7 @@ namespace vcpkg {namespace Strings std::string utf16_to_utf8(const std::wstring& w); - std::string::const_iterator case_insensitive_find(const std::string& s, const std::string& pattern); + std::string::const_iterator case_insensitive_ascii_find(const std::string& s, const std::string& pattern); std::string ascii_to_lowercase(const std::string& input); }} diff --git a/toolsrc/src/commands_search.cpp b/toolsrc/src/commands_search.cpp index 36926764b..c90538e86 100644 --- a/toolsrc/src/commands_search.cpp +++ b/toolsrc/src/commands_search.cpp @@ -53,7 +53,7 @@ namespace vcpkg // At this point there is 1 argument do_print(paths, [&](std::string& port_name) -> bool { - return Strings::case_insensitive_find(port_name, args.command_arguments[0]) != port_name.end(); + return Strings::case_insensitive_ascii_find(port_name, args.command_arguments[0]) != port_name.end(); }); System::println("\nIf your library is not listed, please open an issue at:\n" diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp index 680f01913..ae2e217d8 100644 --- a/toolsrc/src/post_build_lint.cpp +++ b/toolsrc/src/post_build_lint.cpp @@ -286,7 +286,7 @@ namespace vcpkg System::exit_code_and_output ec_data = System::cmd_execute_and_capture_output(cmd_line); Checks::check_exit(ec_data.exit_code == 0, "Running command:\n %s\n failed", Strings::utf16_to_utf8(cmd_line)); - if (Strings::case_insensitive_find(ec_data.output, expected_architecture) == ec_data.output.end()) + if (Strings::case_insensitive_ascii_find(ec_data.output, expected_architecture) == ec_data.output.end()) { binaries_with_invalid_architecture.push_back({f, ec_data.output}); } diff --git a/toolsrc/src/vcpkg_Strings.cpp b/toolsrc/src/vcpkg_Strings.cpp index 452825e7c..56eeae7a0 100644 --- a/toolsrc/src/vcpkg_Strings.cpp +++ b/toolsrc/src/vcpkg_Strings.cpp @@ -48,7 +48,7 @@ namespace vcpkg {namespace Strings return conversion.to_bytes(w); } - std::string::const_iterator case_insensitive_find(const std::string& s, const std::string& pattern) + std::string::const_iterator case_insensitive_ascii_find(const std::string& s, const std::string& pattern) { std::string pattern_as_lower_case; std::transform(pattern.begin(), pattern.end(), back_inserter(pattern_as_lower_case), tolower); -- cgit v1.2.3 From 8c035ea36a64bb48e85d6c9a78cfb5bf050976e0 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 4 Oct 2016 15:25:53 -0700 Subject: Temporarily use get_or_throw() --- toolsrc/src/vcpkg_Dependencies.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/vcpkg_Dependencies.cpp b/toolsrc/src/vcpkg_Dependencies.cpp index fef82940d..54b37cd11 100644 --- a/toolsrc/src/vcpkg_Dependencies.cpp +++ b/toolsrc/src/vcpkg_Dependencies.cpp @@ -32,25 +32,17 @@ namespace vcpkg { namespace Dependencies for (const std::string& dep_as_string : dependencies_as_string) { - const expected expected_dep = package_spec::from_name_and_triplet(dep_as_string, spec.target_triplet()); - if (auto pdep = expected_dep.get()) + const package_spec current_dep = package_spec::from_name_and_triplet(dep_as_string, spec.target_triplet()).get_or_throw(); + auto it = status_db.find(current_dep.name(), current_dep.target_triplet()); + if (it != status_db.end() && (*it)->want == want_t::install) { - const package_spec current_dep = *pdep; - auto it = status_db.find(current_dep.name(), current_dep.target_triplet()); - if (it != status_db.end() && (*it)->want == want_t::install) - { - continue; - } - - graph.add_edge(spec, current_dep); - if (was_examined.find(current_dep) == was_examined.end()) - { - examine_stack.push_back(std::move(current_dep)); - } + continue; } - else + + graph.add_edge(spec, current_dep); + if (was_examined.find(current_dep) == was_examined.end()) { - std::abort(); + examine_stack.push_back(std::move(current_dep)); } } -- cgit v1.2.3 From 7fd71747d7bd8e63080dd2f07d1ba150f0c7cd8a Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 5 Oct 2016 13:19:46 -0700 Subject: Display the lowercased name for errors in package parsing --- toolsrc/src/vcpkg_Input.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp index b92ed27ca..f7aae1929 100644 --- a/toolsrc/src/vcpkg_Input.cpp +++ b/toolsrc/src/vcpkg_Input.cpp @@ -14,7 +14,8 @@ namespace vcpkg {namespace Input return *spec; } - System::println(System::color::error, "Error: %s: %s", expected_spec.error_code().message(), package_spec_as_string); + // Intentionally show the lowercased string + System::println(System::color::error, "Error: %s: %s", expected_spec.error_code().message(), as_lowercase); System::print(example_text); exit(EXIT_FAILURE); } -- cgit v1.2.3 From 5adf575879d60fca0b7824365b030a38145b6c4b Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 5 Oct 2016 13:20:33 -0700 Subject: Fix #119 [regression]: cannot use numbers in library names --- toolsrc/src/package_spec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/package_spec.cpp b/toolsrc/src/package_spec.cpp index b9f6f54fe..86d4393bd 100644 --- a/toolsrc/src/package_spec.cpp +++ b/toolsrc/src/package_spec.cpp @@ -5,7 +5,7 @@ namespace vcpkg { static bool is_valid_package_spec_char(char c) { - return (c == '-') || (isalnum(c) && islower(c)); + return (c == '-') || isdigit(c) || (isalpha(c) && islower(c)); } expected package_spec::from_string(const std::string& spec_as_string, const triplet& default_target_triplet) -- cgit v1.2.3 From 1f9b97d683d65e848c70121a46605a331fe75648 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 5 Oct 2016 13:45:44 -0700 Subject: Add "lowercase" to the message about invalid chars --- toolsrc/src/package_spec_parse_result.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/package_spec_parse_result.cpp b/toolsrc/src/package_spec_parse_result.cpp index d7600ad5b..dc377f656 100644 --- a/toolsrc/src/package_spec_parse_result.cpp +++ b/toolsrc/src/package_spec_parse_result.cpp @@ -18,7 +18,7 @@ namespace vcpkg case package_spec_parse_result::TOO_MANY_COLONS: return "Too many colons"; case package_spec_parse_result::INVALID_CHARACTERS: - return "Contains invalid characters. Only alphanumeric ASCII characters and dashes are allowed"; + return "Contains invalid characters. Only alphanumeric lowercase ASCII characters and dashes are allowed"; default: Checks::unreachable(); } -- cgit v1.2.3 From 12d9cba5d8d4db546a979c1e58cacbc0c79d7953 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 5 Oct 2016 17:00:49 -0700 Subject: Update CHANGELOG and bump version to v0.0.40 --- toolsrc/VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/VERSION.txt b/toolsrc/VERSION.txt index f723d10e0..fe0104ac9 100644 --- a/toolsrc/VERSION.txt +++ b/toolsrc/VERSION.txt @@ -1 +1 @@ -"0.0.30" \ No newline at end of file +"0.0.40" \ No newline at end of file -- cgit v1.2.3 From 8b4f7d4a983e8d9487161cd71d4e519b03c1ed21 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 5 Oct 2016 17:43:46 -0700 Subject: Fix cast to size_t --- toolsrc/src/post_build_lint.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp index ae2e217d8..27f89d86b 100644 --- a/toolsrc/src/post_build_lint.cpp +++ b/toolsrc/src/post_build_lint.cpp @@ -311,7 +311,7 @@ namespace vcpkg static void operator +=(size_t& left, const lint_status& right) { - left += static_cast(right); + left += static_cast(right); } void perform_all_checks(const package_spec& spec, const vcpkg_paths& paths) -- cgit v1.2.3 From 52b7630c86cda1fce144d3bddfc27d434ed3011e Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 28 Sep 2016 12:52:49 -0700 Subject: Add triplet::build_type() --- toolsrc/include/triplet.h | 8 ++++++++ toolsrc/src/triplet.cpp | 10 ++++++++++ 2 files changed, 18 insertions(+) (limited to 'toolsrc') diff --git a/toolsrc/include/triplet.h b/toolsrc/include/triplet.h index 32ea2e711..bc99a17df 100644 --- a/toolsrc/include/triplet.h +++ b/toolsrc/include/triplet.h @@ -8,12 +8,20 @@ namespace vcpkg { static triplet from_canonical_name(const std::string& triplet_as_string); + enum class BuildType + { + DYNAMIC, + STATIC + }; + static const triplet X86_WINDOWS; static const triplet X64_WINDOWS; static const triplet X86_UWP; static const triplet X64_UWP; static const triplet ARM_UWP; + BuildType build_type() const; + const std::string& canonical_name() const; std::string architecture() const; diff --git a/toolsrc/src/triplet.cpp b/toolsrc/src/triplet.cpp index a6816b445..af2ca2a72 100644 --- a/toolsrc/src/triplet.cpp +++ b/toolsrc/src/triplet.cpp @@ -64,4 +64,14 @@ namespace vcpkg auto it = std::find(this->m_canonical_name.cbegin(), this->m_canonical_name.cend(), '-'); return std::string(it + 1, this->m_canonical_name.cend()); } + + triplet::BuildType triplet::build_type() const + { + if (this->m_canonical_name.find("static") != std::string::npos) + { + return BuildType::STATIC; + } + + return BuildType::DYNAMIC; + } } -- cgit v1.2.3 From bf6ddeb01806337309eafb87503c698808fbb853 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 28 Sep 2016 13:15:33 -0700 Subject: Add post build checks for the presence of dlls in static builds --- toolsrc/src/post_build_lint.cpp | 44 ++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/post_build_lint.cpp b/toolsrc/src/post_build_lint.cpp index 27f89d86b..2b2812d73 100644 --- a/toolsrc/src/post_build_lint.cpp +++ b/toolsrc/src/post_build_lint.cpp @@ -309,6 +309,18 @@ namespace vcpkg return lint_status::SUCCESS; } + static lint_status check_no_dlls_present(const std::vector& dlls) + { + if (dlls.empty()) + { + return lint_status::SUCCESS; + } + + System::println(System::color::warning, "DLLs should not be present in a static build, but the following DLLs were found:"); + print_vector_of_files(dlls); + return lint_status::ERROR; + } + static void operator +=(size_t& left, const lint_status& right) { left += static_cast(right); @@ -328,13 +340,31 @@ namespace vcpkg error_count += check_for_copyright_file(spec, paths); error_count += check_for_exes(spec, paths); - std::vector dlls; - recursive_find_files_with_extension_in_dir(paths.packages / spec.dir() / "bin", ".dll", dlls); - recursive_find_files_with_extension_in_dir(paths.packages / spec.dir() / "debug" / "bin", ".dll", dlls); - - error_count += check_exports_of_dlls(dlls); - error_count += check_uwp_bit_of_dlls(spec.target_triplet().system(), dlls); - error_count += check_architecture(spec.target_triplet().architecture(), dlls); + triplet::BuildType build_type = spec.target_triplet().build_type(); + switch (build_type) + { + case triplet::BuildType::DYNAMIC: + { + std::vector dlls; + recursive_find_files_with_extension_in_dir(paths.packages / spec.dir() / "bin", ".dll", dlls); + recursive_find_files_with_extension_in_dir(paths.packages / spec.dir() / "debug" / "bin", ".dll", dlls); + + error_count += check_exports_of_dlls(dlls); + error_count += check_uwp_bit_of_dlls(spec.target_triplet().system(), dlls); + error_count += check_architecture(spec.target_triplet().architecture(), dlls); + break; + } + case triplet::BuildType::STATIC: + { + std::vector dlls; + recursive_find_files_with_extension_in_dir(paths.packages / spec.dir(), ".dll", dlls); + error_count += check_no_dlls_present(dlls); + break; + } + + default: + Checks::unreachable(); + } std::vector libs; recursive_find_files_with_extension_in_dir(paths.packages / spec.dir() / "lib", ".lib", libs); -- cgit v1.2.3