Blame tools/generate-docs-nm-settings-docs-merge.py

Packit 5756e2
#!/usr/bin/env python
Packit Service 87a54e
# SPDX-License-Identifier: LGPL-2.1-or-later
Packit 5756e2
Packit 5756e2
from __future__ import print_function
Packit 5756e2
Packit 5756e2
import os
Packit 5756e2
import sys
Packit 5756e2
import collections
Packit 5756e2
import xml.etree.ElementTree as ET
Packit 5756e2
Packit 5756e2
###############################################################################
Packit 5756e2
Packit 5756e2
_setting_name_order = [
Packit 5756e2
    "connection",
Packit 5756e2
    "6lowpan",
Packit 5756e2
    "802-1x",
Packit 5756e2
    "adsl",
Packit 5756e2
    "bluetooth",
Packit 5756e2
    "bond",
Packit 5756e2
    "bridge",
Packit 5756e2
    "bridge-port",
Packit 5756e2
    "cdma",
Packit 5756e2
    "dcb",
Packit 5756e2
    "dummy",
Packit 5756e2
    "ethtool",
Packit 5756e2
    "generic",
Packit 5756e2
    "gsm",
Packit 5756e2
    "infiniband",
Packit 5756e2
    "ipv4",
Packit 5756e2
    "ipv6",
Packit 5756e2
    "ip-tunnel",
Packit 5756e2
    "macsec",
Packit 5756e2
    "macvlan",
Packit 5756e2
    "match",
Packit 5756e2
    "802-11-olpc-mesh",
Packit 5756e2
    "ovs-bridge",
Packit 5756e2
    "ovs-dpdk",
Packit 5756e2
    "ovs-interface",
Packit 5756e2
    "ovs-patch",
Packit 5756e2
    "ovs-port",
Packit 5756e2
    "ppp",
Packit 5756e2
    "pppoe",
Packit 5756e2
    "proxy",
Packit 5756e2
    "serial",
Packit 5756e2
    "sriov",
Packit 5756e2
    "tc",
Packit 5756e2
    "team",
Packit 5756e2
    "team-port",
Packit 5756e2
    "tun",
Packit 5756e2
    "user",
Packit 5756e2
    "vlan",
Packit 5756e2
    "vpn",
Packit 5756e2
    "vrf",
Packit 5756e2
    "vxlan",
Packit 5756e2
    "wifi-p2p",
Packit 5756e2
    "wimax",
Packit 5756e2
    "802-3-ethernet",
Packit 5756e2
    "wireguard",
Packit 5756e2
    "802-11-wireless",
Packit 5756e2
    "802-11-wireless-security",
Packit 5756e2
    "wpan",
Packit 5756e2
]
Packit 5756e2
Packit 5756e2
Packit 5756e2
def _setting_name_order_idx(name):
Packit 5756e2
    try:
Packit 5756e2
        return _setting_name_order.index(name)
Packit 5756e2
    except ValueError:
Packit 5756e2
        return len(_setting_name_order)
Packit 5756e2
Packit 5756e2
Packit 5756e2
def key_fcn_setting_name(n1):
Packit 5756e2
    return (_setting_name_order_idx(n1), n1)
Packit 5756e2
Packit 5756e2
Packit 5756e2
def iter_keys_of_dicts(dicts, key=None):
Packit 5756e2
    keys = set([k for d in dicts for k in d.keys()])
Packit 5756e2
    return sorted(keys, key=key)
Packit 5756e2
Packit 5756e2
Packit 5756e2
def node_to_dict(node, tag, key_attr):
Packit 5756e2
    dictionary = collections.OrderedDict()
Packit 5756e2
    if node is not None:
Packit 5756e2
        for n in node.iter(tag):
Packit 5756e2
            k = n.get(key_attr)
Packit 5756e2
            assert k is not None
Packit 5756e2
            dictionary[k] = n
Packit 5756e2
    return dictionary
Packit 5756e2
Packit 5756e2
Packit 5756e2
def node_get_attr(nodes, name):
Packit 5756e2
    for n in nodes:
Packit 5756e2
        if n is None:
Packit 5756e2
            continue
Packit 5756e2
        x = n.get(name, None)
Packit 5756e2
        if x:
Packit 5756e2
            return x
Packit 5756e2
    return None
Packit 5756e2
Packit 5756e2
Packit 5756e2
def node_set_attr(dst_node, name, nodes):
Packit 5756e2
    x = node_get_attr(nodes, name)
Packit 5756e2
    if x:
Packit 5756e2
        dst_node.set(name, x)
Packit 5756e2
Packit 5756e2
Packit 5756e2
###############################################################################
Packit 5756e2
Packit 5756e2
gl_only_from_first = False
Packit 5756e2
Packit 5756e2
argv = list(sys.argv[1:])
Packit 5756e2
while True:
Packit 5756e2
    if argv[0] == "--only-from-first":
Packit 5756e2
        gl_only_from_first = True
Packit 5756e2
        del argv[0]
Packit 5756e2
        continue
Packit 5756e2
    break
Packit 5756e2
if len(argv) < 2:
Packit 5756e2
    print("%s [--only-from-first] [OUT_FILE] [SETTING_XML [...]]" % (sys.argv[0]))
Packit 5756e2
    exit(1)
Packit 5756e2
Packit 5756e2
gl_output_xml_file = argv[0]
Packit 5756e2
gl_input_files = list(argv[1:])
Packit 5756e2
Packit 5756e2
###############################################################################
Packit 5756e2
Packit 5756e2
xml_roots = list([ET.parse(f).getroot() for f in gl_input_files])
Packit 5756e2
Packit 5756e2
assert all([root.tag == "nm-setting-docs" for root in xml_roots])
Packit 5756e2
Packit 5756e2
settings_roots = list([node_to_dict(root, "setting", "name") for root in xml_roots])
Packit 5756e2
Packit 5756e2
root_node = ET.Element("nm-setting-docs")
Packit 5756e2
Packit 5756e2
for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name):
Packit 5756e2
Packit 5756e2
    settings = list([d.get(setting_name) for d in settings_roots])
Packit 5756e2
Packit 5756e2
    if gl_only_from_first and settings[0] is None:
Packit 5756e2
        continue
Packit 5756e2
Packit 5756e2
    properties = list([node_to_dict(s, "property", "name") for s in settings])
Packit 5756e2
Packit 5756e2
    if gl_only_from_first and not properties[0]:
Packit 5756e2
        continue
Packit 5756e2
Packit 5756e2
    setting_node = ET.SubElement(root_node, "setting")
Packit 5756e2
Packit 5756e2
    setting_node.set("name", setting_name)
Packit 5756e2
Packit 5756e2
    node_set_attr(setting_node, "description", settings)
Packit 5756e2
    node_set_attr(setting_node, "name_upper", settings)
Packit 5756e2
    node_set_attr(setting_node, "alias", settings)
Packit 5756e2
Packit 5756e2
    for property_name in iter_keys_of_dicts(properties):
Packit 5756e2
Packit 5756e2
        properties_attrs = list([p.get(property_name) for p in properties])
Packit 5756e2
Packit 5756e2
        if gl_only_from_first and properties_attrs[0] is None:
Packit 5756e2
            continue
Packit 5756e2
Packit 5756e2
        property_node = ET.SubElement(setting_node, "property")
Packit 5756e2
        property_node.set("name", property_name)
Packit 5756e2
        property_node.set("name_upper", property_name.upper().replace("-", "_"))
Packit 5756e2
Packit 5756e2
        x = node_get_attr(properties_attrs, "format")
Packit 5756e2
        if x:
Packit 5756e2
            property_node.set("type", x)
Packit 5756e2
        else:
Packit 5756e2
            node_set_attr(property_node, "type", properties_attrs)
Packit 5756e2
Packit 5756e2
        node_set_attr(property_node, "default", properties_attrs)
Packit 5756e2
        node_set_attr(property_node, "description", properties_attrs)
Packit 5756e2
        node_set_attr(property_node, "alias", properties_attrs)
Packit 5756e2
Packit 5756e2
ET.ElementTree(root_node).write(gl_output_xml_file)