From 247a6cec90004b8666d155eacc0f27d3a6c8fcf9 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Thu, 8 Jun 2017 00:36:17 -0700 Subject: [vcpkg] Improve diagnostics upon port load failure --- toolsrc/include/Paragraphs.h | 8 ++++++++ toolsrc/include/SourceParagraph.h | 9 ++++++--- toolsrc/include/Span.h | 38 ++++++++++++++++++++++++++++++++++++++ toolsrc/include/pch.h | 1 + toolsrc/include/vcpkg_Strings.h | 15 ++++++++------- 5 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 toolsrc/include/Span.h (limited to 'toolsrc/include') diff --git a/toolsrc/include/Paragraphs.h b/toolsrc/include/Paragraphs.h index 59f0eefc8..04f9fb879 100644 --- a/toolsrc/include/Paragraphs.h +++ b/toolsrc/include/Paragraphs.h @@ -21,6 +21,14 @@ namespace vcpkg::Paragraphs Expected try_load_cached_package(const VcpkgPaths& paths, const PackageSpec& spec); + struct LoadResults + { + std::vector paragraphs; + std::vector errors; + }; + + LoadResults try_load_all_ports(const Files::Filesystem& fs, const fs::path& ports_dir); + std::vector load_all_ports(const Files::Filesystem& fs, const fs::path& ports_dir); std::map extract_port_names_and_versions( diff --git a/toolsrc/include/SourceParagraph.h b/toolsrc/include/SourceParagraph.h index a53158f3f..47ad5b830 100644 --- a/toolsrc/include/SourceParagraph.h +++ b/toolsrc/include/SourceParagraph.h @@ -1,5 +1,6 @@ #pragma once +#include "Span.h" #include "vcpkg_System.h" #include "vcpkg_expected.h" @@ -23,7 +24,6 @@ namespace vcpkg { std::string name; std::string remaining_fields_as_string; - std::string valid_fields_as_string; std::error_code error; }; @@ -45,8 +45,11 @@ namespace vcpkg std::vector depends; }; - void print_error_message(const ParseControlErrorInfo& info); - void print_error_message(std::vector error_info_list); + void print_error_message(span error_info_list); + inline void print_error_message(const ParseControlErrorInfo& error_info_list) + { + return print_error_message({&error_info_list, 1}); + } std::vector filter_dependencies(const std::vector& deps, const Triplet& t); diff --git a/toolsrc/include/Span.h b/toolsrc/include/Span.h new file mode 100644 index 000000000..b16af2cef --- /dev/null +++ b/toolsrc/include/Span.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include + +template +struct span +{ +public: + using element_type = T; + using pointer = T*; + using reference = T&; + using iterator = T*; + + constexpr span() noexcept : m_ptr(nullptr), m_count(0) {} + constexpr span(std::nullptr_t) noexcept : span() {} + constexpr span(T* ptr, size_t count) noexcept : m_ptr(ptr), m_count(count) {} + constexpr span(T* ptr_begin, T* ptr_end) noexcept : m_ptr(ptr_begin), m_count(ptr_end - ptr_begin) {} + + template + constexpr span(T (&arr)[N]) noexcept : span(arr, N) + { + } + + span(std::vector& v) noexcept : span(v.data(), v.size()) {} + span(const std::vector>& v) noexcept : span(v.data(), v.size()) {} + + constexpr iterator begin() const { return m_ptr; } + constexpr iterator end() const { return m_ptr + m_count; } + + constexpr reference operator[](size_t i) const { return m_ptr[i]; } + constexpr size_t size() const { return m_count; } + +private: + pointer m_ptr; + size_t m_count; +}; diff --git a/toolsrc/include/pch.h b/toolsrc/include/pch.h index c58c30ea3..406d0741e 100644 --- a/toolsrc/include/pch.h +++ b/toolsrc/include/pch.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include diff --git a/toolsrc/include/vcpkg_Strings.h b/toolsrc/include/vcpkg_Strings.h index 3f8f4562e..cab8071aa 100644 --- a/toolsrc/include/vcpkg_Strings.h +++ b/toolsrc/include/vcpkg_Strings.h @@ -58,8 +58,8 @@ namespace vcpkg::Strings std::string ascii_to_lowercase(const std::string& input); - template - std::basic_string join(const CharType* delimiter, const std::vector& v, Transformer transformer) + template + std::basic_string join(const CharType* delimiter, const Container& v, Transformer transformer) { if (v.empty()) { @@ -69,20 +69,21 @@ namespace vcpkg::Strings std::basic_string output; size_t size = v.size(); - output.append(transformer(v.at(0))); + output.append(transformer(v[0])); for (size_t i = 1; i < size; ++i) { output.append(delimiter); - output.append(transformer(v.at(i))); + output.append(transformer(v[i])); } return output; } - template - std::basic_string join(const CharType* delimiter, const std::vector& v) + template + std::basic_string join(const CharType* delimiter, const Container& v) { - return join(delimiter, v, [](const T& x) -> const T& { return x; }); + using Element = decltype(v[0]); + return join(delimiter, v, [](const Element& x) -> const Element& { return x; }); } void trim(std::string* s); -- cgit v1.2.3