diff options
| author | Albert Ziegenhagel <albert.ziegenhagel@outlook.com> | 2016-09-23 09:44:30 +0200 |
|---|---|---|
| committer | Albert Ziegenhagel <albert.ziegenhagel@outlook.com> | 2016-09-23 09:44:30 +0200 |
| commit | 31935aa0fd142cbb4e0db1a62ba1483294b740f8 (patch) | |
| tree | 41be4e9498a385ecc8796d9158bf871c07ecdbc1 /toolsrc | |
| parent | 4a818b6a3e86514af27381fe16dcf311a5c28ffb (diff) | |
| download | vcpkg-31935aa0fd142cbb4e0db1a62ba1483294b740f8.tar.gz vcpkg-31935aa0fd142cbb4e0db1a62ba1483294b740f8.zip | |
Improved error reporting when user provides invalid triplets
Diffstat (limited to 'toolsrc')
| -rw-r--r-- | toolsrc/include/triplet.h | 4 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg_cmd_arguments.h | 2 | ||||
| -rw-r--r-- | toolsrc/src/commands_create.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/commands_edit.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/commands_installation.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/commands_remove.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/main.cpp | 39 | ||||
| -rw-r--r-- | toolsrc/src/triplet.cpp | 16 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg_cmd_arguments.cpp | 11 |
9 files changed, 49 insertions, 31 deletions
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<std::string> check_and_get_optional_command_arguments(const std::vector<std::string>& valid_options) const; void check_max_args(size_t arg_count, const char* example_text = nullptr) const; - std::vector<package_spec> parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text = nullptr) const; + std::vector<package_spec> parse_all_arguments_as_package_specs(const vcpkg_paths& paths, const triplet& default_target_triplet, const char* example_text = nullptr) const; std::vector<package_spec> 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<package_spec> specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::vector<package_spec> 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<std::string> options = args.check_and_get_optional_command_arguments({OPTION_PURGE}); auto status_db = database_load_check(paths); - std::vector<package_spec> specs = args.parse_all_arguments_as_package_specs(default_target_triplet); + std::vector<package_spec> 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<package_spec> 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<package_spec> specs = parse_all_arguments_as_package_specs(default_target_triplet); + std::vector<package_spec> specs = parse_all_arguments_as_package_specs(paths, default_target_triplet); std::unordered_set<package_spec> had_its_immediate_dependencies_added; Graphs::Graph<package_spec> graph; graph.add_vertices(specs); @@ -220,7 +220,7 @@ namespace vcpkg return graph.find_topological_sort(); } - std::vector<package_spec> vcpkg_cmd_arguments::parse_all_arguments_as_package_specs(const triplet& default_target_triplet, const char* example_text) const + std::vector<package_spec> 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<package_spec> 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 |
