On Mon, Aug 01, 2016 at 12:40:31 +0200, Ján Tomko wrote:
On Mon, Aug 01, 2016 at 06:30:07AM +0200, Peter Krempa wrote:
>The prettified JSON string already contains a newline so don't print
>another one. This allows to pipe the json output (in conjunction with
>the --quiet option) to files without having to truncate them afterwards.
>---
> tools/virsh-domain.c | 19 +++++++++----------
> 1 file changed, 9 insertions(+), 10 deletions(-)
>
>diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
>index 6c1bc2f..45fce76 100644
>--- a/tools/virsh-domain.c
>+++ b/tools/virsh-domain.c
>@@ -8944,6 +8944,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
> virBuffer buf = VIR_BUFFER_INITIALIZER;
> bool pad = false;
> virJSONValuePtr pretty = NULL;
>+ char *prettystr = NULL;
>
> VSH_EXCLUSIVE_OPTIONS("hmp", "pretty");
>
>@@ -8969,22 +8970,20 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
> if (virDomainQemuMonitorCommand(dom, monitor_cmd, &result, flags) < 0)
> goto cleanup;
>
>- if (vshCommandOptBool(cmd, "pretty")) {
>- char *tmp;
>- pretty = virJSONValueFromString(result);
>- if (pretty && (tmp = virJSONValueToString(pretty, true))) {
>- VIR_FREE(result);
>- result = tmp;
>- } else {
>- vshResetLibvirtError();
>- }
>+ if (vshCommandOptBool(cmd, "pretty") &&
>+ (pretty = virJSONValueFromString(result)) &&
I find naming the variable pretty pretty confusing. virJSONValuePtr is
in machine-friendly format and while it has the potential to be
formatted as pretty, it is not pretty right now.
I did not wan't to question the name choice of the previous autor thus
I'm not changing it either.
>+ (prettystr = virJSONValueToString(pretty, true))) {
>+ vshPrint(ctl, "%s", prettystr);
>+ } else {
>+ vshResetLibvirtError();
Resetting it even when --pretty was not specified feels strange.
But certainly not wrong. In case no error was reported it's a no-op.
Also, grouping the if (--pretty) condition with the virJSONValue
error
checks makes the flow hard to read.
I agree on this point.
Do we need the fallback? AFAIK there are only two issues possible
when
prettifying the string:
* the system is out of memory
possibly impossible, erroring out or even aborting virsh are
acceptable here
* virDomainQemuMonitorCommand did not return a JSON output
For a domain with JSON monitor, the remote side calls virJSONValueToString,
so this could only reasonably happen with a domain that only has HMP.
If we error out on the --hmp --pretty combination, we can error out
here too and do not need to fall back to raw output.
Hmm, that's true. The slight change in semantics should not be an issue.
>+ vshPrint(ctl, "%s\n", result);
> }
>- vshPrint(ctl, "%s\n", result);
>
There is also the option of keeping the \n in vshPrint and calling
virTrimSpaces on the prettyfied output.
I thought you were into optimizing stuff rather than adding a pointless
iteration through the string.