mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-22 22:13:18 +00:00
virsh: Try to keep printed XML pretty with change-media
When adding a new media with change-media and --print-xml, let's try making it more readable and nice. Before: <disk type="file" device="cdrom"> ... <target dev="hdb" bus="ide"/> <address type="drive" controller="0" bus="0" target="0" unit="1"/> <source file="/tmp/a.iso"/></disk> After: <disk type="file" device="cdrom"> ... <source file="/tmp/a.iso"/> <target dev="hdb" bus="ide"/> <address type="drive" controller="0" bus="0" target="0" unit="1"/> </disk> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1219719 Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
parent
7ec235ed09
commit
adac38dbbd
@ -11566,7 +11566,10 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
|
|||||||
const char *target,
|
const char *target,
|
||||||
virshUpdateDiskXMLType type)
|
virshUpdateDiskXMLType type)
|
||||||
{
|
{
|
||||||
|
xmlNodePtr tmp = NULL;
|
||||||
xmlNodePtr source = NULL;
|
xmlNodePtr source = NULL;
|
||||||
|
xmlNodePtr target_node = NULL;
|
||||||
|
xmlNodePtr text_node = NULL;
|
||||||
char *device_type = NULL;
|
char *device_type = NULL;
|
||||||
char *ret = NULL;
|
char *ret = NULL;
|
||||||
char *startupPolicy = NULL;
|
char *startupPolicy = NULL;
|
||||||
@ -11583,9 +11586,31 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* find the current source subelement */
|
/* find the current source subelement */
|
||||||
for (source = disk_node->children; source; source = source->next) {
|
for (tmp = disk_node->children; tmp; tmp = tmp->next) {
|
||||||
if (source->type == XML_ELEMENT_NODE &&
|
/*
|
||||||
xmlStrEqual(source->name, BAD_CAST "source"))
|
* Save the last text node before the <target/>. The
|
||||||
|
* reasoning behind this is that the target node will be
|
||||||
|
* present in this case and also has a proper indentation.
|
||||||
|
*/
|
||||||
|
if (!target_node && tmp->type == XML_TEXT_NODE)
|
||||||
|
text_node = tmp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need only element nodes from now on.
|
||||||
|
*/
|
||||||
|
if (tmp->type != XML_ELEMENT_NODE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (xmlStrEqual(tmp->name, BAD_CAST "source"))
|
||||||
|
source = tmp;
|
||||||
|
|
||||||
|
if (xmlStrEqual(tmp->name, BAD_CAST "target"))
|
||||||
|
target_node = tmp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We've found all we needed.
|
||||||
|
*/
|
||||||
|
if (source && target_node)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11637,7 +11662,22 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
|
|||||||
|
|
||||||
if (startupPolicy)
|
if (startupPolicy)
|
||||||
xmlNewProp(source, BAD_CAST "startupPolicy", BAD_CAST startupPolicy);
|
xmlNewProp(source, BAD_CAST "startupPolicy", BAD_CAST startupPolicy);
|
||||||
xmlAddChild(disk_node, source);
|
|
||||||
|
/*
|
||||||
|
* So that the output XML looks nice in case anyone calls
|
||||||
|
* 'change-media' with '--print-xml', let's attach the source
|
||||||
|
* before target...
|
||||||
|
*/
|
||||||
|
xmlAddPrevSibling(target_node, source);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ... and duplicate the text node doing the indentation just
|
||||||
|
* so it's more easily readable. And don't make it fatal.
|
||||||
|
*/
|
||||||
|
if ((tmp = xmlCopyNode(text_node, 0))) {
|
||||||
|
if (!xmlAddPrevSibling(target_node, tmp))
|
||||||
|
xmlFreeNode(tmp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(ret = virXMLNodeToString(NULL, disk_node))) {
|
if (!(ret = virXMLNodeToString(NULL, disk_node))) {
|
||||||
|
Loading…
Reference in New Issue
Block a user