about summary refs log tree commit diff
path: root/tools
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2022-08-16 18:24:19 +0200
committerMichael Biebl <biebl@debian.org>2022-08-16 18:24:19 +0200
commit0018d1f3cf71d680d7b6bceda55a5717244d8b26 (patch)
treea058f1d106d172d3354179437ef034c9355cdf9c /tools
parent6accbd3ec0e42d8633bbde4d47ed7bfe854e7e0b (diff)
New upstream version 1.39.90 upstream/1.39.90
Diffstat (limited to 'tools')
-rwxr-xr-xtools/generate-docs-nm-settings-docs-gir.py259
-rwxr-xr-xtools/generate-docs-nm-settings-docs-merge.py16
-rwxr-xr-xtools/generate-docs-settings-docs.py74
-rwxr-xr-xtools/meson-post-install.sh15
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 "&#34;">
-]>
-<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