virt-manager/b08647c2-xmlbuilder-05.patch

64 lines
2.0 KiB
Diff
Raw Normal View History

References: fate#319621
Subject: xmlbuilder: Handle setting conditional xpaths correctly
From: Cole Robinson crobinso@redhat.com Mon Jul 18 14:40:58 2016 -0400
Date: Mon Jul 18 14:46:50 2016 -0400:
Git: b08647c2f277e463971ae1e4430aaed28a4619f3
So if xml=<foo> and xpath=./bar[@baz='foo'] and val=XXX, xmlbuilder
previously would generate XML
<foo>
<bar>XXX</bar>
</foo>
But now generates the expected
<foo>
<bar baz='foo'/>XXX</bar>
</foo>
No users yet, but they are incoming
Index: virt-manager-1.4.0/virtinst/xmlbuilder.py
===================================================================
--- virt-manager-1.4.0.orig/virtinst/xmlbuilder.py
+++ virt-manager-1.4.0/virtinst/xmlbuilder.py
@@ -167,6 +167,16 @@ def _build_xpath_node(ctx, xpath):
And the node pointing to @baz will be returned, for the caller to
do with as they please.
+
+ There's also special handling to ensure that setting
+ xpath=./bar[@baz='foo']/frob will create
+
+ <bar baz='foo'>
+ <frob></frob>
+ </bar>
+
+ Even if <bar> didn't exist before. So we fill in the dependent property
+ expression values
"""
def _handle_node(nodename, parentnode, parentpath):
# If the passed xpath snippet (nodename) exists, return the node
@@ -209,6 +219,19 @@ def _build_xpath_node(ctx, xpath):
for nodename in xpath.split("/"):
parentnode, parentpath = _handle_node(nodename, parentnode, parentpath)
+ # Check if the xpath snippet had an '=' expression in it, example:
+ #
+ # ./foo[@bar='baz']
+ #
+ # If so, we also want to set <foo bar='baz'/>, so that setting
+ # this XML element works as expected in this case.
+ if "[" not in nodename or "=" not in nodename:
+ continue
+
+ propname, val = nodename.split("[")[1].strip("]").split("=")
+ propobj, ignore = _handle_node(propname, parentnode, parentpath)
+ propobj.setContent(val.strip("'"))
+
return parentnode