aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Karatarakis <alkarata@microsoft.com>2016-10-04 14:47:42 -0700
committerAlexander Karatarakis <alkarata@microsoft.com>2016-10-04 14:47:42 -0700
commitbf323e8cc6f3edd245e3f5661cab6c8b7f335da9 (patch)
treed7907dd47b9c1a71bba891a66c0829bb1df5319d
parent04539816b5e793afdcff991a28c298f199e709db (diff)
downloadvcpkg-bf323e8cc6f3edd245e3f5661cab6c8b7f335da9.tar.gz
vcpkg-bf323e8cc6f3edd245e3f5661cab6c8b7f335da9.zip
[package_spec]User input gets lowercased; other input is checked
-rw-r--r--toolsrc/include/package_spec.h2
-rw-r--r--toolsrc/src/commands_installation.cpp7
-rw-r--r--toolsrc/src/lib.cpp2
-rw-r--r--toolsrc/src/package_spec.cpp28
-rw-r--r--toolsrc/src/vcpkg_Dependencies.cpp24
-rw-r--r--toolsrc/src/vcpkg_Input.cpp3
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;