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

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