#This class applies patches to an XML file during do_patch().  The
#patches themselves are specified in XML in a separate file that must
#be in SRC_URI and end in .patch.xml.  The patch XML file must also
#have a <targetFile> element that specifies the base name of the file
#that needs to be patched.
#
#See patchxml.py for details on the XML patch format.
#

inherit pythonnative
inherit obmc-phosphor-utils
do_patch[depends] = "mrw-patch-native:do_populate_sysroot"


def find_patch_files(d):
    all_patches = listvar_to_list(d, 'SRC_URI')
    xml_patches = filter(lambda x: x.endswith('.patch.xml') and
                         x.startswith('file://'), all_patches)

    return [x.lstrip('file://') for x in xml_patches]


def apply_xml_patch(base_patch_name, d):
    import xml.etree.ElementTree as et
    import subprocess

    patch_file = os.path.join(d.getVar("WORKDIR", True), base_patch_name)

    if not os.path.exists(patch_file):
        bb.fatal("Could not find patch file " + patch_file +
                 " specified in SRC_URI")

    patch_tree = et.parse(patch_file)
    patch_root = patch_tree.getroot()
    target_file_element = patch_root.find("targetFile")

    if target_file_element is None:
        bb.fatal("Could not find <targetFile> element in patch file "
                 + patch_file)
    else:
        xml = target_file_element.text

    xml = os.path.join(d.getVar("S", True), xml)

    if not os.path.exists(xml):
        bb.fatal("Could not find XML file to patch: " + xml)

    print("Applying XML fixes found in " + patch_file + " to " + xml)

    cmd = []
    cmd.append(os.path.join(d.getVar("bindir", True), "obmc-mrw/patchxml.py"))
    cmd.append("-x")
    cmd.append(xml)
    cmd.append("-p")
    cmd.append(patch_file)
    cmd.append("-o")
    cmd.append(xml + ".patched")

    try:
        subprocess.check_call(cmd)
    except subprocess.CalledProcessError as e:
        bb.fatal("Failed patching XML:\n%s" % e.output)

    os.rename(xml, xml + ".orig")
    os.rename(xml + ".patched", xml)


python xmlpatch_do_patch() {

    for patch in find_patch_files(d):
        apply_xml_patch(patch, d)
}

do_patch[postfuncs] += "xmlpatch_do_patch"
