aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2017-04-20 18:35:48 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2017-04-20 21:38:07 +0300
commit250d64faada1a9d0212be07cab6d54a112689b1b (patch)
tree395a4ea3c8a71d2ad853955ec98391a2783ad8ee
parent22e086d8ea6ac2a4978eada0fa9ffb3a13a96ce3 (diff)
Add support for machine manifest options value
-rw-r--r--bbot/machine-manifest.cxx44
-rw-r--r--unit-tests/bootstrap-manifest/testscript71
2 files changed, 98 insertions, 17 deletions
diff --git a/bbot/machine-manifest.cxx b/bbot/machine-manifest.cxx
index 5cef054..2edf3dc 100644
--- a/bbot/machine-manifest.cxx
+++ b/bbot/machine-manifest.cxx
@@ -4,6 +4,7 @@
#include <bbot/machine-manifest>
+#include <butl/string-parser>
#include <butl/manifest-parser>
#include <butl/manifest-serializer>
@@ -62,9 +63,9 @@ namespace bbot
throw parsing (p.name (), nv.name_line, nv.name_column, d);
};
- auto bad_value = [&p, &nv] (const string& d)
+ auto bad_value = [&p, &nv] (const string& d, size_t offset = 0)
{
- throw parsing (p.name (), nv.value_line, nv.value_column, d);
+ throw parsing (p.name (), nv.value_line, nv.value_column + offset, d);
};
// Make sure this is the start and we support the version.
@@ -133,6 +134,28 @@ namespace bbot
mac = move (v);
}
+ else if (n == "options")
+ {
+ if (options)
+ bad_name ("machine options redefinition");
+
+ strings op;
+
+ try
+ {
+ op = string_parser::parse_quoted (v, false);
+ }
+ catch (const invalid_string& e)
+ {
+ bad_value (string ("invalid machine options: ") + e.what (),
+ e.position);
+ }
+
+ if (op.empty ())
+ bad_value ("empty machine options");
+
+ options = move (op);
+ }
else if (!iu)
bad_name ("unknown name '" + n + "' in machine manifest");
}
@@ -169,6 +192,23 @@ namespace bbot
if (mac)
s.next ("mac", *mac);
+ // Recompose options string as a space-separated option list,
+ //
+ if (options)
+ {
+ string v;
+ for (auto b (options->cbegin ()), i (b), e (options->cend ()); i != e;
+ ++i)
+ {
+ if (i != b)
+ v += ' ';
+
+ v += *i;
+ }
+
+ s.next ("options", v);
+ }
+
s.next ("", ""); // End of manifest.
}
diff --git a/unit-tests/bootstrap-manifest/testscript b/unit-tests/bootstrap-manifest/testscript
index 8e1fbcf..0632317 100644
--- a/unit-tests/bootstrap-manifest/testscript
+++ b/unit-tests/bootstrap-manifest/testscript
@@ -77,20 +77,42 @@
: valid
:
- $* <<EOF >>EOF
- : 1
- :
- id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- name: windows_10-msvc_14
- summary: Windows 10 build 1607 with VC 14 update 3
- type: kvm
- mac: de:ad:be:ef:de:ad
- :
- id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- :
- bbot-version: 1010200
- libbbot-version: 1010100
- EOF
+ {
+ : all-values
+ :
+ $* <<EOF >>EOF
+ : 1
+ :
+ id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ name: windows_10-msvc_14
+ summary: Windows 10 build 1607 with VC 14 update 3
+ type: kvm
+ mac: de:ad:be:ef:de:ad
+ options: -device "virtio-scsi-pci,id=scsi" -device "scsi-hd,drive=disk0"
+ :
+ id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ :
+ bbot-version: 1010200
+ libbbot-version: 1010100
+ EOF
+
+ : no-options
+ :
+ $* <<EOF >>EOF
+ : 1
+ :
+ id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ name: windows_10-msvc_14
+ summary: Windows 10 build 1607 with VC 14 update 3
+ type: kvm
+ mac: de:ad:be:ef:de:ad
+ :
+ id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ :
+ bbot-version: 1010200
+ libbbot-version: 1010100
+ EOF
+ }
: unknown
:
@@ -114,9 +136,28 @@
name: windows_10-msvc_14
summary: Windows 10 build 1607 with VC 14 update 3
type: kvm
-
EOI
+ : invalid-options
+ :
+ {
+ : unquoted
+ :
+ $* <<EOI 2>'stdin:3:42: error: invalid machine options: unterminated quoted string' == 1
+ : 1
+ :
+ options: -device "virtio-scsi-pci,id=scsi
+ EOI
+
+ : empty
+ :
+ $* <<EOI 2>'stdin:3:9: error: empty machine options' == 1
+ : 1
+ :
+ options:
+ EOI
+ }
+
: no-toolchain
:
$* <<EOI 2>'stdin:8:1: error: toolchain manifest expected' == 1