aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2017-05-10 18:46:42 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2017-05-11 17:56:04 +0300
commitdd1d5472bf28beba971d2b507fab53dec43939f7 (patch)
tree10d0f60e34012b339d1fb740d56a15487ccb1cf1
parentb8232e40e605b60234dae7ef92f257bab5c47723 (diff)
Allow multi-line machine manifest options value
-rw-r--r--bbot/machine-manifest.cxx35
-rw-r--r--unit-tests/machine-manifest/testscript45
2 files changed, 74 insertions, 6 deletions
diff --git a/bbot/machine-manifest.cxx b/bbot/machine-manifest.cxx
index 7f9a030..b7baf7e 100644
--- a/bbot/machine-manifest.cxx
+++ b/bbot/machine-manifest.cxx
@@ -4,10 +4,14 @@
#include <bbot/machine-manifest.hxx>
+#include <sstream>
+
+#include <libbutl/tab-parser.hxx>
#include <libbutl/string-parser.hxx>
#include <libbutl/manifest-parser.hxx>
#include <libbutl/manifest-serializer.hxx>
+using namespace std;
using namespace butl;
namespace bbot
@@ -64,9 +68,16 @@ namespace bbot
throw parsing (p.name (), nv.name_line, nv.name_column, d);
};
- auto bad_value = [&p, &nv] (const string& d, size_t offset = 0)
+ // Offsets are used to tie an error to the specific position inside a
+ // manifest value (possibly a multiline one).
+ //
+ auto bad_value = [&p, &nv] (
+ const string& d, uint64_t column_offset = 0, uint64_t line_offset = 0)
{
- throw parsing (p.name (), nv.value_line, nv.value_column + offset, d);
+ throw parsing (p.name (),
+ nv.value_line + line_offset,
+ (line_offset == 0 ? nv.value_column : 1) + column_offset,
+ d);
};
optional<machine_type> type;
@@ -106,14 +117,26 @@ namespace bbot
strings op;
+ // Note that when reporting errors we combine the manifest value
+ // position with the respective error position.
+ //
try
{
- op = string_parser::parse_quoted (v, false);
+ istringstream is (v);
+ tab_parser parser (is, "");
+
+ tab_fields tl;
+ while (!(tl = parser.next ()).empty ())
+ {
+ for (auto& tf: tl)
+ op.emplace_back (move (tf.value));
+ }
}
- catch (const invalid_string& e)
+ catch (const tab_parsing& e)
{
- bad_value (string ("invalid machine options: ") + e.what (),
- e.position);
+ bad_value ("invalid machine options: " + e.description,
+ e.column - 1,
+ e.line - 1);
}
if (op.empty ())
diff --git a/unit-tests/machine-manifest/testscript b/unit-tests/machine-manifest/testscript
index 66dedc6..e264b41 100644
--- a/unit-tests/machine-manifest/testscript
+++ b/unit-tests/machine-manifest/testscript
@@ -22,6 +22,38 @@
options: -device "virtio-scsi-pci,id=scsi" -device "scsi-hd,drive=disk0"
EOF
+ : multi-line-options
+ :
+ $* <<EOI >>EOO
+ : 1
+ id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ name: windows_10-msvc_14
+ summary: Windows 10 build 1607 with VC 14 update 3
+ type: kvm
+ options: \
+ -device "virtio-scsi-pci,id=scsi"
+ -device "scsi-hd,drive=disk0"
+ \
+ EOI
+ : 1
+ id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ name: windows_10-msvc_14
+ summary: Windows 10 build 1607 with VC 14 update 3
+ type: kvm
+ options: -device "virtio-scsi-pci,id=scsi" -device "scsi-hd,drive=disk0"
+ EOO
+
+ : no-mac
+ :
+ $* <<EOF >>EOF
+ : 1
+ id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ name: windows_10-msvc_14
+ summary: Windows 10 build 1607 with VC 14 update 3
+ type: nspawn
+ options: -device "virtio-scsi-pci,id=scsi" -device "scsi-hd,drive=disk0"
+ EOF
+
: no-options
:
$* <<EOF >>EOF
@@ -106,6 +138,19 @@
summary: Windows 10 build 1607 with VC 14 update 3
options: -device "virtio-scsi-pci,id=scsi
EOI
+
+ : unquoted-multi-line
+ :
+ $* <<EOI 2>'stdin:7:29: error: invalid machine options: unterminated quoted string' == 1
+ : 1
+ id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ name: windows_10-msvc_14
+ summary: Windows 10 build 1607 with VC 14 update 3
+ options: \
+ -device "virtio-scsi-pci,id=scsi"
+ -device "scsi-hd,drive=disk0
+ \
+ EOI
}
}