diff options
| author | Alexander Karatarakis <alkarata@microsoft.com> | 2016-10-04 14:47:42 -0700 |
|---|---|---|
| committer | Alexander Karatarakis <alkarata@microsoft.com> | 2016-10-04 14:47:42 -0700 |
| commit | bf323e8cc6f3edd245e3f5661cab6c8b7f335da9 (patch) | |
| tree | d7907dd47b9c1a71bba891a66c0829bb1df5319d | |
| parent | 04539816b5e793afdcff991a28c298f199e709db (diff) | |
| download | vcpkg-bf323e8cc6f3edd245e3f5661cab6c8b7f335da9.tar.gz vcpkg-bf323e8cc6f3edd245e3f5661cab6c8b7f335da9.zip | |
[package_spec]User input gets lowercased; other input is checked
| -rw-r--r-- | toolsrc/include/package_spec.h | 2 | ||||
| -rw-r--r-- | toolsrc/src/commands_installation.cpp | 7 | ||||
| -rw-r--r-- | toolsrc/src/lib.cpp | 2 | ||||
| -rw-r--r-- | toolsrc/src/package_spec.cpp | 28 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg_Dependencies.cpp | 24 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg_Input.cpp | 3 |
6 files changed, 40 insertions, 26 deletions
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<package_spec> 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<package_spec> 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> 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> 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> 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<package_spec> 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<package_spec> 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<package_spec> expected_spec = package_spec::from_string(as_lowercase, default_target_triplet); if (auto spec = expected_spec.get()) { return *spec; |
