#! /usr/bin/env python3
#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: GPL-2.0-only
#

import sys
try:
    import xml.etree.cElementTree as etree
except:
    import xml.etree.ElementTree as etree

def child (elem, name):
    for e in elem.getchildren():
        if e.tag == name:
            return e
    return None

def children (elem, name=None):
    l = elem.getchildren()
    if name:
        l = [e for e in l if e.tag == name]
    return l

if len(sys.argv) < 2 or sys.argv[1] in ('-h', '--help'):
    print('oe-trim-schemas: error: the following arguments are required: schema\n'
          'Usage: oe-trim-schemas schema\n\n'
          'OpenEmbedded trim schemas - remove unneeded schema locale translations\n'
          '                            from gconf schema files\n\n'
          'arguments:\n'
          '  schema                gconf schema file to trim\n')
    sys.exit(2)

xml = etree.parse(sys.argv[1])

for schema in child(xml.getroot(), "schemalist").getchildren():
    e = child(schema, "short")
    if e is not None:
        schema.remove(e)

    e = child(schema, "long")
    if e is not None:
        schema.remove(e)

    for locale in children(schema, "locale"):
        # One locale must exist so leave C locale...
        a = locale.attrib.get("name")
        if a == 'C':
            continue
        e = child(locale, "default")
        if e is None:
            schema.remove(locale)
        else:
            e = child(locale, "short")
            if e is not None:
                locale.remove(e)
            e = child(locale, "long")
            if e is not None:
                locale.remove(e)

xml.write(sys.stdout, "UTF-8")

