diff options
| author | Michael Biebl <biebl@debian.org> | 2022-08-16 18:24:19 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2022-08-16 18:24:19 +0200 |
| commit | 0018d1f3cf71d680d7b6bceda55a5717244d8b26 (patch) | |
| tree | a058f1d106d172d3354179437ef034c9355cdf9c /tools | |
| parent | 6accbd3ec0e42d8633bbde4d47ed7bfe854e7e0b (diff) | |
New upstream version 1.39.90 upstream/1.39.90
Diffstat (limited to 'tools')
| -rwxr-xr-x | tools/generate-docs-nm-settings-docs-gir.py | 259 | ||||
| -rwxr-xr-x | tools/generate-docs-nm-settings-docs-merge.py | 16 | ||||
| -rwxr-xr-x | tools/generate-docs-settings-docs.py | 74 | ||||
| -rwxr-xr-x | tools/meson-post-install.sh | 15 |
4 files changed, 245 insertions, 119 deletions
diff --git a/tools/generate-docs-nm-settings-docs-gir.py b/tools/generate-docs-nm-settings-docs-gir.py index 8fc6db70..f7a20e2b 100755 --- a/tools/generate-docs-nm-settings-docs-gir.py +++ b/tools/generate-docs-nm-settings-docs-gir.py @@ -3,17 +3,15 @@ # # Copyright (C) 2009 - 2017 Red Hat, Inc. # - -from __future__ import print_function - +from __future__ import print_function, unicode_literals +import xml.etree.ElementTree as ET +import argparse import os import gi -import xml.sax.saxutils as saxutils +import re gi.require_version("GIRepository", "2.0") from gi.repository import GIRepository -import argparse, re, sys -import xml.etree.ElementTree as ET try: libs = os.environ["LD_LIBRARY_PATH"].split(":") @@ -118,6 +116,10 @@ def get_prop_type(setting, pspec): return prop_type +def remove_prefix(line, prefix): + return line[len(prefix) :] if line.startswith(prefix) else line + + def get_docs(propxml): doc_xml = propxml.find("gi:doc", ns_map) if doc_xml is None: @@ -127,7 +129,18 @@ def get_docs(propxml): if "deprecated" in propxml.attrib: doc = doc + " Deprecated: " + propxml.attrib["deprecated"] - doc = re.sub(r"\n\s*", r" ", doc) + # split docs into lines + lines = re.split("\n", doc) + # strip leading *char and strip white spaces + lines = [remove_prefix(l, "*").strip() for l in lines] + doc = "" + for l in lines: + if l: + doc += " " + l + else: + doc += "\n\n" + + doc = doc.strip("\n") # Expand constants doc = re.sub(r"%([^%]\w*)", lambda match: constants[match.group(1)], doc) @@ -186,120 +199,152 @@ def settings_sort_key(x): return (x_prefix != "setting_connection", x_prefix) -def xml_quoteattr(val): - return saxutils.quoteattr(str(val)) - - -def usage(): - print("Usage: %s --gir FILE --output FILE" % sys.argv[0]) - exit() +def create_desc_docbook(desc_docbook, description): + lines = re.split("\n", description) + in_par = True + paragraph = ET.SubElement( + desc_docbook, + "para", + ) -parser = argparse.ArgumentParser() -parser.add_argument( - "-l", - "--lib-path", - metavar="PATH", - action="append", - help="path to scan for shared libraries", -) -parser.add_argument("-g", "--gir", metavar="FILE", help="NM-1.0.gir file") -parser.add_argument("-o", "--output", metavar="FILE", help="output file") + for l in lines: + if l and in_par: + paragraph.text = l + else: + paragraph = ET.SubElement(desc_docbook, "para") -args = parser.parse_args() -if args.gir is None or args.output is None: - usage() -if args.lib_path: - for lib in args.lib_path: - GIRepository.Repository.prepend_library_path(lib) +def main(gir_path_str, output_path_str): + girxml = ET.parse(gir_path_str).getroot() -girxml = ET.parse(args.gir).getroot() -outfile = open(args.output, mode="w") - -basexml = girxml.find('./gi:namespace/gi:class[@name="Setting"]', ns_map) -settings = girxml.findall('./gi:namespace/gi:class[@parent="Setting"]', ns_map) -# Hack. Need a better way to do this -ipxml = girxml.find('./gi:namespace/gi:class[@name="SettingIPConfig"]', ns_map) -settings.extend( - girxml.findall('./gi:namespace/gi:class[@parent="SettingIPConfig"]', ns_map) -) -settings = sorted(settings, key=settings_sort_key) - -init_constants(girxml, settings) - -outfile.write( - """<?xml version=\"1.0\"?> -<!DOCTYPE nm-setting-docs [ -<!ENTITY quot """> -]> -<nm-setting-docs> -""" -) - -for settingxml in settings: - if "abstract" in settingxml.attrib: - continue - - new_func = NM.__getattr__(settingxml.attrib["name"]) - setting = new_func() - - class_desc = get_docs(settingxml) - if class_desc is None: - raise Exception( - "%s needs a gtk-doc block with one-line description" % setting.props.name - ) - outfile.write( - ' <setting name="%s" description=%s name_upper="%s" >\n' - % ( - setting.props.name, - xml_quoteattr(class_desc), - get_setting_name_define(settingxml), - ) + basexml = girxml.find('./gi:namespace/gi:class[@name="Setting"]', ns_map) + settings = girxml.findall('./gi:namespace/gi:class[@parent="Setting"]', ns_map) + # Hack. Need a better way to do this + ipxml = girxml.find('./gi:namespace/gi:class[@name="SettingIPConfig"]', ns_map) + settings.extend( + girxml.findall('./gi:namespace/gi:class[@parent="SettingIPConfig"]', ns_map) ) + settings = sorted(settings, key=settings_sort_key) - setting_properties = { - prop.name: prop - for prop in GObject.list_properties(setting) - if prop.name != "name" - } - - for prop in sorted(setting_properties): - pspec = setting_properties[prop] + init_constants(girxml, settings) - propxml = settingxml.find('./gi:property[@name="%s"]' % pspec.name, ns_map) - if propxml is None: - propxml = basexml.find('./gi:property[@name="%s"]' % pspec.name, ns_map) - if propxml is None: - propxml = ipxml.find('./gi:property[@name="%s"]' % pspec.name, ns_map) + nm_settings_docs_element = ET.Element("nm-setting-docs") + docs_gir = ET.ElementTree(nm_settings_docs_element) - value_type = get_prop_type(setting, pspec) - value_desc = get_docs(propxml) - default_value = get_default_value(setting, pspec, propxml) + for settingxml in settings: + if "abstract" in settingxml.attrib: + continue - prop_upper = prop.upper().replace("-", "_") + new_func = NM.__getattr__(settingxml.attrib["name"]) + setting = new_func() - if value_desc is None: + class_desc = get_docs(settingxml) + if class_desc is None: raise Exception( - "%s.%s needs a documentation description" % (setting.props.name, prop) + "%s needs a gtk-doc block with one-line description" + % setting.props.name ) + setting_element = ET.SubElement( + nm_settings_docs_element, + "setting", + attrib={ + "name": setting.props.name, + "description": class_desc, + "name_upper": get_setting_name_define(settingxml), + }, + ) - default_value_as_xml = "" - if default_value is not None: - default_value_as_xml = " default=%s" % (xml_quoteattr(default_value)) - - outfile.write( - ' <property name="%s" name_upper="%s" type="%s"%s description=%s />\n' - % ( - prop, - prop_upper, - value_type, - default_value_as_xml, - xml_quoteattr(value_desc), + setting_properties = { + prop.name: prop + for prop in GObject.list_properties(setting) + if prop.name != "name" + } + + for prop in sorted(setting_properties): + pspec = setting_properties[prop] + + propxml = settingxml.find('./gi:property[@name="%s"]' % pspec.name, ns_map) + if propxml is None: + propxml = basexml.find('./gi:property[@name="%s"]' % pspec.name, ns_map) + if propxml is None: + propxml = ipxml.find('./gi:property[@name="%s"]' % pspec.name, ns_map) + + value_type = get_prop_type(setting, pspec) + value_desc = get_docs(propxml) + default_value = get_default_value(setting, pspec, propxml) + + prop_upper = prop.upper().replace("-", "_") + + if value_desc is None: + raise Exception( + "%s.%s needs a documentation description" + % (setting.props.name, prop) + ) + + property_attributes = { + "name": prop, + "name_upper": prop_upper, + "type": value_type, + } + + if default_value is not None: + property_attributes["default"] = str(default_value) + + property_element = ET.SubElement( + setting_element, + "property", + attrib=property_attributes, ) - ) - outfile.write(" </setting>\n") + ET.SubElement( + property_element, + "description", + ).text = value_desc + + if value_desc: + description_docbook = ET.SubElement( + property_element, + "description-docbook", + ) + + create_desc_docbook(description_docbook, value_desc) + + docs_gir.write( + output_path_str, + xml_declaration=True, + encoding="utf-8", + ) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-l", + "--lib-path", + metavar="PATH", + action="append", + help="path to scan for shared libraries", + ) + parser.add_argument( + "-g", + "--gir", + metavar="FILE", + help="NM-1.0.gir file", + required=True, + ) + parser.add_argument( + "-o", + "--output", + metavar="FILE", + help="output file", + required=True, + ) + + args = parser.parse_args() + + if args.lib_path: + for lib in args.lib_path: + GIRepository.Repository.prepend_library_path(lib) -outfile.write("</nm-setting-docs>\n") -outfile.close() + main(args.gir, args.output) diff --git a/tools/generate-docs-nm-settings-docs-merge.py b/tools/generate-docs-nm-settings-docs-merge.py index 0f0f181b..17c78a24 100755 --- a/tools/generate-docs-nm-settings-docs-merge.py +++ b/tools/generate-docs-nm-settings-docs-merge.py @@ -186,6 +186,12 @@ for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name): if p_attr is not None ) + description = find_first_not_none( + p_attr.find("description") + for p_attr in properties_attrs + if p_attr is not None + ) + if gl_only_from_first and properties_attrs[0] is None: dbg("> > > > skip (only-from-first") continue @@ -203,10 +209,16 @@ for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name): node_set_attr(property_node, "type", properties_attrs) node_set_attr(property_node, "default", properties_attrs) - node_set_attr(property_node, "description", properties_attrs) + desc_value = node_get_attr(properties_attrs, "description") node_set_attr(property_node, "alias", properties_attrs) + if description_docbook is not None: property_node.insert(0, description_docbook) - + if desc_value: + description = ET.Element("description") + description.text = desc_value + property_node.append(description) + elif description is not None: + property_node.append(description) ET.ElementTree(root_node).write(gl_output_xml_file) diff --git a/tools/generate-docs-settings-docs.py b/tools/generate-docs-settings-docs.py new file mode 100755 index 00000000..307be880 --- /dev/null +++ b/tools/generate-docs-settings-docs.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: LGPL-2.1-or-later + +import xml.etree.ElementTree as ET +import argparse +import re + +############################################################################### + + +def strip_new_lines(desc_string): + desc_string = re.sub(r"\n\s*", r" ", desc_string) + return desc_string + + +def escape_quotes(desc_string): + desc_string = re.sub(r"\"", r"\"", desc_string) + return desc_string + + +############################################################################### + + +def main(output_path_str, xml_path_str): + xml = ET.parse(xml_path_str).getroot() + + doc = "" + doc += "/* Generated file. Do not edit. */\n\n" + + for setting in xml: + name_set_upper = setting.attrib["name_upper"] + + for property in setting: + name_prop_upper = property.attrib["name_upper"] + desc_string = "" + desc = property.find("description") + + if desc is not None: + desc_string = desc.text + + desc_string = strip_new_lines(desc_string) + desc_string = escape_quotes(desc_string) + desc_string = desc_string.lstrip(" ") + + doc += "#define DESCRIBE_DOC_NM_SETTING_" + doc += name_set_upper + doc += "_" + doc += name_prop_upper + doc += ' N_("' + doc += desc_string + doc += '")\n' + + file = open(output_path_str, "w") + file.write(doc) + file.close() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--output", + metavar="PATH", + help="specify output file", + required=True, + ) + parser.add_argument( + "--xml", + metavar="PATH", + help="specify input file", + required=True, + ) + + args = parser.parse_args() + main(args.output, args.xml) diff --git a/tools/meson-post-install.sh b/tools/meson-post-install.sh index 897a8c5c..45f3e37c 100755 --- a/tools/meson-post-install.sh +++ b/tools/meson-post-install.sh @@ -14,14 +14,9 @@ install_systemdunitdir="${11}" [ -n "$DESTDIR" ] && DESTDIR="${DESTDIR%%/}/" -if [ -f "${DESTDIR}${nm_datadir}/bash-completion/completions/nmcli-completion" ]; then - mv "${DESTDIR}${nm_datadir}/bash-completion/completions/nmcli-completion" \ - "${DESTDIR}${nm_datadir}/bash-completion/completions/nmcli" -fi - if [ -x "${DESTDIR}${nm_bindir}/nmtui" ]; then for alias in nmtui-connect nmtui-edit nmtui-hostname; do - ln -sf nmtui "${DESTDIR}${nm_bindir}/$alias" + ln -sfn nmtui "${DESTDIR}${nm_bindir}/$alias" done fi @@ -48,11 +43,11 @@ chmod 0700 "${DESTDIR}${nm_pkgstatedir}" if [ "$enable_docs" = 1 ]; then for alias in nmtui-connect nmtui-edit nmtui-hostname; do - ln -f "${DESTDIR}${nm_mandir}/man1/nmtui.1" "${DESTDIR}${nm_mandir}/man1/${alias}.1" + ln -fn "${DESTDIR}${nm_mandir}/man1/nmtui.1" "${DESTDIR}${nm_mandir}/man1/${alias}.1" done - ln -f "${DESTDIR}${nm_mandir}/man5/NetworkManager.conf.5" "${DESTDIR}${nm_mandir}/man5/nm-system-settings.conf.5" - ln -f "${DESTDIR}${nm_mandir}/man5/nm-settings-nmcli.5" "${DESTDIR}${nm_mandir}/man5/nm-settings.5" + ln -fn "${DESTDIR}${nm_mandir}/man5/NetworkManager.conf.5" "${DESTDIR}${nm_mandir}/man5/nm-system-settings.conf.5" + ln -fn "${DESTDIR}${nm_mandir}/man5/nm-settings-nmcli.5" "${DESTDIR}${nm_mandir}/man5/nm-settings.5" fi if [ "$enable_ifcfg_rh" = 1 ]; then @@ -60,6 +55,6 @@ if [ "$enable_ifcfg_rh" = 1 ]; then fi if [ "$enable_nm_cloud_setup" = 1 -a "$install_systemdunitdir" = 1 ]; then - ln -s 'no-wait.d/90-nm-cloud-setup.sh' "${DESTDIR}${nm_pkglibdir}/dispatcher.d/90-nm-cloud-setup.sh" + ln -sfn 'no-wait.d/90-nm-cloud-setup.sh' "${DESTDIR}${nm_pkglibdir}/dispatcher.d/90-nm-cloud-setup.sh" fi |