diff options
| author | Alexander Karatarakis <alkarata@microsoft.com> | 2016-11-02 20:26:52 -0700 |
|---|---|---|
| committer | Alexander Karatarakis <alkarata@microsoft.com> | 2016-11-02 20:26:52 -0700 |
| commit | 4665b16ab3556235ddcbdac160df261ee87694e4 (patch) | |
| tree | 6bbe535285a808ff457ada4cccc28838a7868400 | |
| parent | 079a027b1e81becd4ba448362579f625dd7bcca4 (diff) | |
| download | vcpkg-4665b16ab3556235ddcbdac160df261ee87694e4.tar.gz vcpkg-4665b16ab3556235ddcbdac160df261ee87694e4.zip | |
Add checks for fields in CONTROL file. Resolves #228
| -rw-r--r-- | toolsrc/include/SourceParagraph.h | 5 | ||||
| -rw-r--r-- | toolsrc/include/vcpkglib_helpers.h | 2 | ||||
| -rw-r--r-- | toolsrc/src/SourceParagraph.cpp | 54 | ||||
| -rw-r--r-- | toolsrc/src/commands_installation.cpp | 15 | ||||
| -rw-r--r-- | toolsrc/src/vcpkglib_helpers.cpp | 29 |
5 files changed, 91 insertions, 14 deletions
diff --git a/toolsrc/include/SourceParagraph.h b/toolsrc/include/SourceParagraph.h index 72dca8324..a8ad13668 100644 --- a/toolsrc/include/SourceParagraph.h +++ b/toolsrc/include/SourceParagraph.h @@ -7,14 +7,17 @@ namespace vcpkg { struct SourceParagraph { + static const std::vector<std::string>& get_list_of_valid_entries(); + SourceParagraph(); - explicit SourceParagraph(const std::unordered_map<std::string, std::string>& fields); + explicit SourceParagraph(std::unordered_map<std::string, std::string> fields); std::string name; std::string version; std::string description; std::string maintainer; std::vector<std::string> depends; + std::unordered_map<std::string, std::string> unparsed_fields; }; } diff --git a/toolsrc/include/vcpkglib_helpers.h b/toolsrc/include/vcpkglib_helpers.h index 72711d63b..05c9e17df 100644 --- a/toolsrc/include/vcpkglib_helpers.h +++ b/toolsrc/include/vcpkglib_helpers.h @@ -5,8 +5,10 @@ namespace vcpkg {namespace details { std::string optional_field(const std::unordered_map<std::string, std::string>& fields, const std::string& fieldname); + std::string remove_optional_field(std::unordered_map<std::string, std::string>* fields, const std::string& fieldname); std::string required_field(const std::unordered_map<std::string, std::string>& fields, const std::string& fieldname); + std::string remove_required_field(std::unordered_map<std::string, std::string>* fields, const std::string& fieldname); std::vector<std::string> parse_depends(const std::string& depends_string); }} diff --git a/toolsrc/src/SourceParagraph.cpp b/toolsrc/src/SourceParagraph.cpp index 75c8ebfef..c870bde21 100644 --- a/toolsrc/src/SourceParagraph.cpp +++ b/toolsrc/src/SourceParagraph.cpp @@ -1,16 +1,50 @@ #include "SourceParagraph.h" #include "vcpkglib_helpers.h" -using namespace vcpkg::details; +namespace vcpkg +{ + // + namespace SourceParagraphRequiredField + { + static const std::string SOURCE = "Source"; + static const std::string VERSION = "Version"; + } -vcpkg::SourceParagraph::SourceParagraph() = default; + namespace SourceParagraphOptionalEntry + { + static const std::string DESCRIPTION = "Description"; + static const std::string MAINTAINER = "Maintainer"; + static const std::string BUILD_DEPENDS = "Build-Depends"; + } -vcpkg::SourceParagraph::SourceParagraph(const std::unordered_map<std::string, std::string>& fields): - name(required_field(fields, "Source")), - version(required_field(fields, "Version")), - description(optional_field(fields, "Description")), - maintainer(optional_field(fields, "Maintainer")) -{ - std::string deps = optional_field(fields, "Build-Depends"); - this->depends = parse_depends(deps); + const std::vector<std::string>& SourceParagraph::get_list_of_valid_entries() + { + static const std::vector<std::string> valid_enties = + { + SourceParagraphRequiredField::SOURCE, + SourceParagraphRequiredField::VERSION, + + SourceParagraphOptionalEntry::DESCRIPTION, + SourceParagraphOptionalEntry::MAINTAINER, + SourceParagraphOptionalEntry::BUILD_DEPENDS + }; + + return valid_enties; + } + + SourceParagraph::SourceParagraph() = default; + + SourceParagraph::SourceParagraph(std::unordered_map<std::string, std::string> fields) + { + using namespace vcpkg::details; + this->name = remove_required_field(&fields, SourceParagraphRequiredField::SOURCE); + this->version = remove_required_field(&fields, SourceParagraphRequiredField::VERSION); + this->description = remove_optional_field(&fields, SourceParagraphOptionalEntry::DESCRIPTION); + this->maintainer = remove_optional_field(&fields, SourceParagraphOptionalEntry::MAINTAINER); + + std::string deps = remove_optional_field(&fields, SourceParagraphOptionalEntry::BUILD_DEPENDS); + this->depends = parse_depends(deps); + + this->unparsed_fields = std::move(fields); + } } diff --git a/toolsrc/src/commands_installation.cpp b/toolsrc/src/commands_installation.cpp index c728c41dc..914168092 100644 --- a/toolsrc/src/commands_installation.cpp +++ b/toolsrc/src/commands_installation.cpp @@ -8,6 +8,7 @@ #include "vcpkg_System.h" #include "vcpkg_Dependencies.h" #include "vcpkg_Input.h" +#include "vcpkg_Maps.h" namespace vcpkg { @@ -24,6 +25,20 @@ namespace vcpkg Checks::check_exit(pghs.size() == 1, "Error: invalid control file"); SourceParagraph source_paragraph(pghs[0]); + if (!source_paragraph.unparsed_fields.empty()) + { + const std::vector<std::string> remaining_keys = Maps::extract_keys(source_paragraph.unparsed_fields); + const std::vector<std::string>& valid_entries = SourceParagraph::get_list_of_valid_entries(); + + const std::string remaining_keys_as_string = Strings::join(remaining_keys, "\n "); + const std::string valid_keys_as_string = Strings::join(valid_entries, "\n "); + + System::println(System::color::error, "Error: There are invalid fields in the port file"); + System::println("The following fields were not expected in the port file:\n\n %s\n\n", remaining_keys_as_string); + System::println("This is the list of valid fields (case-sensitive): \n\n %s\n", valid_keys_as_string); + exit(EXIT_FAILURE); + } + 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")", diff --git a/toolsrc/src/vcpkglib_helpers.cpp b/toolsrc/src/vcpkglib_helpers.cpp index 02182b995..3d14d4b06 100644 --- a/toolsrc/src/vcpkglib_helpers.cpp +++ b/toolsrc/src/vcpkglib_helpers.cpp @@ -13,14 +13,37 @@ namespace vcpkg {namespace details } return it->second; - }; + } + + std::string remove_optional_field(std::unordered_map<std::string, std::string>* fields, const std::string& fieldname) + { + auto it = fields->find(fieldname); + if (it == fields->end()) + { + return std::string(); + } + + const std::string value = std::move(it->second); + fields->erase(it); + return value; + } std::string required_field(const std::unordered_map<std::string, std::string>& fields, const std::string& fieldname) { auto it = fields.find(fieldname); - vcpkg::Checks::check_exit(it != fields.end(), "Required field not present: %s", fieldname); + Checks::check_exit(it != fields.end(), "Required field not present: %s", fieldname); return it->second; - }; + } + + std::string remove_required_field(std::unordered_map<std::string, std::string>* fields, const std::string& fieldname) + { + auto it = fields->find(fieldname); + Checks::check_exit(it != fields->end(), "Required field not present: %s", fieldname); + + const std::string value = std::move(it->second); + fields->erase(it); + return value; + } std::vector<std::string> parse_depends(const std::string& depends_string) { |
