diff options
Diffstat (limited to 'bbot')
-rw-r--r-- | bbot/build-config | 4 | ||||
-rw-r--r-- | bbot/build-config.cxx | 18 | ||||
-rw-r--r-- | bbot/buildfile | 1 | ||||
-rw-r--r-- | bbot/manifest | 17 | ||||
-rw-r--r-- | bbot/manifest.cxx | 38 | ||||
-rw-r--r-- | bbot/variable | 46 | ||||
-rw-r--r-- | bbot/variable.cxx | 94 |
7 files changed, 60 insertions, 158 deletions
diff --git a/bbot/build-config b/bbot/build-config index 0a3ecb3..0f92eb8 100644 --- a/bbot/build-config +++ b/bbot/build-config @@ -16,8 +16,6 @@ #include <bbot/export> -#include <bbot/variable> - namespace bbot { // Build configuration matching specific machine names. Used by bbot @@ -30,7 +28,7 @@ namespace bbot butl::optional<butl::target_triplet> target; - variables vars; + std::vector<std::string> vars; }; using build_configs = std::vector<build_config>; diff --git a/bbot/build-config.cxx b/bbot/build-config.cxx index 226ead3..0ee00e9 100644 --- a/bbot/build-config.cxx +++ b/bbot/build-config.cxx @@ -13,6 +13,8 @@ #include <butl/fdstream> #include <butl/tab-parser> +#include <bbot/manifest> // task_manifest::check_config() + using namespace std; using namespace butl; @@ -34,17 +36,17 @@ namespace bbot // then we refer to the end-of-line column (presumably reporting a missed // field). // - auto bad_line = [&name, &tl, &i, n] (const string& d, size_t offset = 0) + auto bad_line = [&name, &tl, &i, n] (const string& d) { // Offset beyond the end-of-line is meaningless. // - assert (i < n || (i == n && offset == 0)); + assert (i <= n); throw tab_parsing (name, tl.line, i == n ? tl.end_column - : tl[i].column + offset, + : tl[i].column, d); }; @@ -93,12 +95,14 @@ namespace bbot try { for (; i < n; ++i) - config.vars.emplace_back (variable (move (tl[i].value))); + { + task_manifest::check_config (tl[i].value); + config.vars.emplace_back (move (tl[i].value)); + } } - catch (const invalid_variable& e) + catch (const invalid_argument& e) { - bad_line (e.what (), e.pos); // Note that tl[i].value is moved from, - // but happily we don't use it + bad_line (e.what ()); } // Save the configuration. diff --git a/bbot/buildfile b/bbot/buildfile index 1bb608f..27bde1a 100644 --- a/bbot/buildfile +++ b/bbot/buildfile @@ -8,7 +8,6 @@ lib{bbot}: \ {hxx cxx}{ build-config } \ {hxx }{ export } \ {hxx cxx}{ manifest } \ -{hxx cxx}{ variable } \ {hxx }{ version } \ $int_libs diff --git a/bbot/manifest b/bbot/manifest index 3022535..087fd25 100644 --- a/bbot/manifest +++ b/bbot/manifest @@ -17,8 +17,6 @@ #include <bbot/export> -#include <bbot/variable> - namespace bbot { using strings = std::vector<std::string>; @@ -105,8 +103,12 @@ namespace bbot // Build system configuration variables (in addition to build environment // configuration variables). + // Note: could be quoted. // - variables config; + strings config; + + strings + unquoted_config (); task_manifest (std::string nm, bpkg::version vr, @@ -114,7 +116,7 @@ namespace bbot strings tr, std::string mn, butl::optional<butl::target_triplet> tg, - variables cf) + strings cf) : name (std::move (nm)), version (std::move (vr)), repository (std::move (rl)), @@ -132,6 +134,13 @@ namespace bbot void serialize (butl::manifest_serializer&) const; + + // Check that a string has the name=value format. The name must not + // contain spaces. Throw invalid_argument if the string doesn't conform to + // these rules. + // + static void + check_config (const std::string&); }; class LIBBBOT_EXPORT task_response_manifest diff --git a/bbot/manifest.cxx b/bbot/manifest.cxx index 0f7a053..1d164db 100644 --- a/bbot/manifest.cxx +++ b/bbot/manifest.cxx @@ -16,6 +16,7 @@ #include <butl/utility> // digit() #include <butl/tab-parser> +#include <butl/string-parser> #include <butl/manifest-parser> #include <butl/manifest-serializer> @@ -442,14 +443,16 @@ namespace bbot { try { - config.emplace_back (variable (move (tf.value))); + check_config (tf.value); } - catch (const invalid_variable& e) + catch (const invalid_argument& e) { bad_value (string ("invalid task configuration: ") + e.what (), - tf.column - 1 + e.pos, + tf.column - 1, tl.line - 1); } + + config.emplace_back (move (tf.value)); } } } @@ -520,6 +523,35 @@ namespace bbot s.next ("", ""); // End of manifest. } + strings task_manifest:: + unquoted_config () + { + return string_parser::unquote (config); + } + + void task_manifest:: + check_config (const string& s) + { + auto i (s.begin ()); + auto e (s.end ()); + + // Iterate until the variable name end and check that it contains no + // whitespaces. + // + for (; i != e; ++i) + { + char c (*i); + + if (c == ' ' || c == '\t') // Whitespace in name. + throw invalid_argument ("expected variable assignment"); + else if (c == '=') + break; + } + + if (i == e) + throw invalid_argument ("no variable value"); + } + // task_response_manifest // task_response_manifest:: diff --git a/bbot/variable b/bbot/variable deleted file mode 100644 index 11e84ec..0000000 --- a/bbot/variable +++ /dev/null @@ -1,46 +0,0 @@ -// file : bbot/variable -*- C++ -*- -// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd -// license : MIT; see accompanying LICENSE file - -#ifndef BBOT_VARIABLE -#define BBOT_VARIABLE - -#include <string> -#include <vector> -#include <cstdint> // uint64_t -#include <stdexcept> // invalid_argument - -#include <bbot/export> - -namespace bbot -{ - class LIBBBOT_EXPORT invalid_variable: public std::invalid_argument - { - public: - invalid_variable (std::uint64_t p, const std::string& d) - : invalid_argument (d), pos (p) {} - - std::uint64_t pos; // Zero-based. - }; - - // String in the name=value format. Can contain single or double quoted - // substrings. No escaping is supported. The name must not contain spaces. - // Throw variable_error if the string doesn't conform to these rules. - // - struct LIBBBOT_EXPORT variable: std::string - { - variable (std::string); - - // Remove a single level of quotes. Don't validate the format or the - // correctness of the quotation. Note that the variable can potentially be - // modified through the std::string interface in a way that breaks - // format/quoting. - // - std::string - unquoted () const; - }; - - using variables = std::vector<variable>; -} - -#endif // BBOT_VARIABLE diff --git a/bbot/variable.cxx b/bbot/variable.cxx deleted file mode 100644 index a25b007..0000000 --- a/bbot/variable.cxx +++ /dev/null @@ -1,94 +0,0 @@ -// file : bbot/variable.cxx -*- C++ -*- -// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd -// license : MIT; see accompanying LICENSE file - -#include <bbot/variable> - -#include <utility> // move() - -using namespace std; - -namespace bbot -{ - variable:: - variable (string v): string (move (v)) - { - // Scan the string untill the end to check that the quoting is terminated. - // We will also make sure that the name doesn't contain spaces and the - // value is provided. - // - char quoting ('\0'); // Current quoting mode, can be used as bool. - bool name (true); // True while we are parsing the variable name. - - auto b (cbegin ()); - auto i (b); - - auto bad_variable = [&b, &i] (const string& d) - { - throw invalid_variable (i - b, d); - }; - - for (auto e (cend ()); i != e; ++i) - { - char c (*i); - - if (!quoting) - { - if (c == '"' || c == '\'') // Begin of quoted string, - { - quoting = c; - continue; - } - } - else if (c == quoting) // End of quoted string, - { - quoting = '\0'; - continue; - } - - if (name) - { - if (c == ' ' || c == '\t') - bad_variable ("expected variable assignment"); - else if (c == '=') - name = false; - } - } - - if (quoting) - bad_variable ("unterminated quoted string"); - - if (name) - bad_variable ("no variable value"); - } - - string variable:: - unquoted () const - { - string r; - char quoting ('\0'); // Current quoting mode, can be used as bool. - - for (auto i (cbegin ()), e (cend ()); i != e; ++i) - { - char c (*i); - - if (!quoting) - { - if (c == '"' || c == '\'') // Begin of quoted string. - { - quoting = c; - continue; - } - } - else if (c == quoting) // End of quoted string. - { - quoting = '\0'; - continue; - } - - r += c; - } - - return r; - } -} |