
Paolo Bonzini <pbonzini@redhat.com> writes:
On 22/02/21 16:24, Daniel P. Berrangé wrote:
This problem isn't unique to QEMU. Any app using JSON from the shell will have the tedium of quote escaping. JSON is incredibly widespread and no other apps felt it neccessary to introduce single quoting support, because the benefit doesn't outweigh the interop problem it introduces.
The quotes were introduced for C code (and especially qtest), not for the shell. We have something like
response = qmp("{ 'execute': 'qom-get', 'arguments': { 'path': %s, " "'property': 'temperature' } }", id);
These are sent to QEMU as double-quoted strings (the single-quoted JSON is parsed to get interpolation and printed back; commit 563890c7c7, "libqtest: escape strings in QMP commands, fix leak", 2014-07-01). However, doing the interpolation requires a parser that recognizes the single-quoted strings.
Doing interpolation requires a parser that recognizes %-sequences. Single quote support isn't *required*, but quite desirable to let us avoid leaning toothpick syndrome (LTS). Example: compare the above to response = qmp("{ \"execute\": \"qom-get\", \"arguments\": { \"path\": %s, " "\"property\": \"temperature\" } }", id); We kept the interpolation extension out of the external interfaces, but not the single quotes.
Markus, did you rebuild the qtests after disabling single-quoted strings? "make check-qtest-x86_64" would have rebuilt them, but I'm confused by the results.
I ran "make check" and looked at the failures: * check-qjson.c - escaped_string() covers \'. Naturally, this fails. - escaped_string() and utf8_string() try every string twice, first in double quotes, then in single quotes. Naturally, the latter fails. - string_with_quotes() tests unquoted single quote in double-quoted string, and unquoted double quote in single-quoted string. Naturally, the latter fails. - large_dict() and simple_whitespace() use single quotes to avoid LTS. This is the test my "The unit test testing the JSON parser is of course excused" referred to. * test-qobject-input-visitor.c * qtest/qmp-test.c More LTS avoidance. This is "The remaining qtest and the unit test could perhaps be dismissed as atypical use of QEMU from C." * tests/qemu-iotests/ Unlike the tests above, these use *external* interfaces. In shell, we need to use double quotes to get parameter expansion. We then use single quotes to avoid LTS. The Python code has less excuse, I think. Still confused?