2022-11-11 16:30:04 +08:00
|
|
|
#
|
|
|
|
# Copyright 2006, 2013 Red Hat, Inc.
|
|
|
|
#
|
|
|
|
# This work is licensed under the GNU GPLv2 or later.
|
|
|
|
# See the COPYING file in the top-level directory.
|
|
|
|
#
|
|
|
|
|
2024-05-17 13:37:53 +08:00
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
|
|
class DevError(RuntimeError):
|
|
|
|
def __init__(self, msg):
|
|
|
|
RuntimeError.__init__(self, "programming error: %s" % msg)
|
|
|
|
|
2022-11-11 16:30:04 +08:00
|
|
|
|
|
|
|
def listify(l):
|
|
|
|
if l is None:
|
|
|
|
return []
|
|
|
|
elif not isinstance(l, list):
|
|
|
|
return [l]
|
|
|
|
else:
|
|
|
|
return l
|
|
|
|
|
|
|
|
|
|
|
|
def xml_escape(xml):
|
|
|
|
"""
|
|
|
|
Replaces chars ' " < > & with xml safe counterparts
|
|
|
|
"""
|
|
|
|
if xml:
|
|
|
|
xml = xml.replace("&", "&")
|
|
|
|
xml = xml.replace("'", "'")
|
|
|
|
xml = xml.replace("\"", """)
|
|
|
|
xml = xml.replace("<", "<")
|
|
|
|
xml = xml.replace(">", ">")
|
|
|
|
return xml
|
|
|
|
|
|
|
|
|
|
|
|
def get_prop_path(obj, prop_path):
|
|
|
|
"""Return value of attribute identified by `prop_path`
|
|
|
|
|
|
|
|
Look up the attribute of `obj` identified by `prop_path`
|
|
|
|
(separated by "."). If any component along the path is missing an
|
|
|
|
`AttributeError` is raised.
|
|
|
|
|
|
|
|
"""
|
|
|
|
parent = obj
|
|
|
|
pieces = prop_path.split(".")
|
|
|
|
for piece in pieces[:-1]:
|
|
|
|
parent = getattr(parent, piece)
|
|
|
|
|
|
|
|
return getattr(parent, pieces[-1])
|
|
|
|
|
|
|
|
|
|
|
|
def set_prop_path(obj, prop_path, value):
|
|
|
|
"""Set value of attribute identified by `prop_path`
|
|
|
|
|
|
|
|
Set the attribute of `obj` identified by `prop_path` (separated by
|
|
|
|
".") to `value`. If any component along the path is missing an
|
|
|
|
`AttributeError` is raised.
|
|
|
|
"""
|
|
|
|
parent = obj
|
|
|
|
pieces = prop_path.split(".")
|
|
|
|
for piece in pieces[:-1]:
|
|
|
|
parent = getattr(parent, piece)
|
|
|
|
|
|
|
|
return setattr(parent, pieces[-1], value)
|
|
|
|
|
|
|
|
|
2024-05-17 13:37:53 +08:00
|
|
|
def in_testsuite():
|
|
|
|
return "VIRTINST_TEST_SUITE" in os.environ
|
|
|
|
|
|
|
|
|
|
|
|
def diff(origstr, newstr, fromfile="Original", tofile="New"):
|
|
|
|
import difflib
|
|
|
|
dlist = difflib.unified_diff(
|
|
|
|
origstr.splitlines(1), newstr.splitlines(1),
|
|
|
|
fromfile=fromfile, tofile=tofile)
|
|
|
|
return "".join(dlist)
|
|
|
|
|
|
|
|
|
|
|
|
def unindent_device_xml(xml):
|
|
|
|
import re
|
|
|
|
lines = xml.splitlines()
|
|
|
|
if not lines:
|
|
|
|
return xml # pragma: no cover
|
|
|
|
|
|
|
|
ret = ""
|
|
|
|
unindent = 0
|
|
|
|
for c in lines[0]:
|
|
|
|
if c != " ":
|
|
|
|
break
|
|
|
|
unindent += 1
|
|
|
|
|
|
|
|
for line in lines:
|
|
|
|
if re.match(r"^%s *<.*$" % (unindent * " "), line):
|
|
|
|
line = line[unindent:]
|
|
|
|
ret += line + "\n"
|
|
|
|
return ret
|