summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2023-05-18 22:17:55 +0200
committerThomas Haller <thaller@redhat.com>2023-05-19 12:52:01 +0200
commitb7d0218ee1fb22371c32ed1fab3b631fd4d8d7b9 (patch)
tree312753b348b05a11812c87fb63113546fcbd317b
parent42aa2251855fc82935b54a5d52631b85c9b2a161 (diff)
docs: rework selecting properties with "generate-docs-nm-settings-docs-merge.py"
"generate-docs-nm-settings-docs-merge.py" merges properties from multiple XMLs. It supported an argument "--only-from-first", to only select properties that were in the first of the provided XMLs. The idea is that the first XML would be "src/nmcli/gen-metadata-nm-settings-nmcli.xml" which is generated from nmcli meta-data and exactly describes the supported properties. For example, "connection.read-only", "user.data" or "wireless.tx-power" exist as properties somewhere, but not supported by nmcli. Change that, to not tie the selected property to the first XML. "gen-metadata-nm-settings-nmcli.xml" is the XML that contains which properties to select from, but "src/libnm-client-impl/nm-property-infos-nmcli.xml" contains hand crafted descriptions. The latter descriptions are preferred. As the order of the XML is already relevant for which description is preferred, the selection is orthogonal to that. With this, prefer descriptions from "src/libnm-client-impl/nm-property-infos-nmcli.xml" but still select properties from "src/nmcli/gen-metadata-nm-settings-nmcli.xml". Note that the argument is only used to generate "man/nm-settings-docs-nmcli.xml", and with the current input, there is no actual change in behavior.
-rw-r--r--Makefile.am8
-rw-r--r--man/meson.build3
-rwxr-xr-xtools/generate-docs-nm-settings-docs-merge.py94
3 files changed, 78 insertions, 27 deletions
diff --git a/Makefile.am b/Makefile.am
index 72918243da..e5698f04f7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2106,7 +2106,13 @@ src/libnm-client-impl/nm-settings-docs-gir.xml: tools/generate-docs-nm-settings-
--output $@
man/nm-settings-docs-nmcli.xml: src/nmcli/gen-metadata-nm-settings-nmcli.xml src/libnm-client-impl/nm-property-infos-nmcli.xml src/libnm-client-impl/nm-settings-docs-gir.xml tools/generate-docs-nm-settings-docs-merge.py man/common.ent
- $(AM_V_GEN) "$(PYTHON)" $(srcdir)/tools/generate-docs-nm-settings-docs-merge.py --only-from-first $@ $(wordlist 1,3,$^)
+ $(AM_V_GEN) \
+ "$(PYTHON)" \
+ "$(srcdir)/tools/generate-docs-nm-settings-docs-merge.py" \
+ "$@" \
+ --only-properties-from \
+ "$<" \
+ $(wordlist 1,3,$^)
src/libnmc-setting/settings-docs-input.xml: src/libnm-client-impl/nm-property-infos-nmcli.xml src/libnm-client-impl/nm-settings-docs-gir.xml tools/generate-docs-nm-settings-docs-merge.py
$(AM_V_GEN) "$(PYTHON)" $(srcdir)/tools/generate-docs-nm-settings-docs-merge.py $@ $(wordlist 1,2,$^)
diff --git a/man/meson.build b/man/meson.build
index 356759bafb..a2e1de83b4 100644
--- a/man/meson.build
+++ b/man/meson.build
@@ -85,10 +85,11 @@ if enable_introspection
command: [
python.path(),
join_paths(meson.source_root(), 'tools', 'generate-docs-nm-settings-docs-merge.py'),
- '--only-from-first',
'@OUTPUT@',
+ '--only-properties-from',
gen_metadata_nm_settings_nmcli_xml,
nm_property_infos_xml[name],
+ gen_metadata_nm_settings_nmcli_xml,
nm_settings_docs_xml_gir,
],
)
diff --git a/tools/generate-docs-nm-settings-docs-merge.py b/tools/generate-docs-nm-settings-docs-merge.py
index 69a972d65a..22bf9c8430 100755
--- a/tools/generate-docs-nm-settings-docs-merge.py
+++ b/tools/generate-docs-nm-settings-docs-merge.py
@@ -4,15 +4,19 @@
from __future__ import print_function
import collections
+import os
import sys
import xml.etree.ElementTree as ET
###############################################################################
+DEBUG = os.environ.get("NM_GENERATE_DOCS_NM_SETTINGS_DOCS_MERGE_DEBUG", None) == "1"
+
+
def dbg(msg):
- pass
- # print("%s" % (msg,))
+ if DEBUG:
+ print("%s" % (msg,))
###############################################################################
@@ -173,19 +177,36 @@ def find_deprecated(properties_attrs):
gl_only_from_first = False
-argv = list(sys.argv[1:])
-while True:
- if argv[0] == "--only-from-first":
- gl_only_from_first = True
- del argv[0]
- continue
- break
-if len(argv) < 2:
- print("%s [--only-from-first] [OUT_FILE] [SETTING_XML [...]]" % (sys.argv[0]))
- exit(1)
-
-gl_output_xml_file = argv[0]
-gl_input_files = list(argv[1:])
+gl_only_properties_from = None
+gl_output_xml_file = None
+gl_input_files = []
+
+
+def usage_and_quit(exit_code):
+ print(
+ "%s [--only-properties-from SLECTOR_FILE] [OUT_FILE] [SETTING_XML [...]]"
+ % (sys.argv[0])
+ )
+ exit(exit_code)
+
+
+i = 1
+special_args = True
+while i < len(sys.argv):
+ if special_args and sys.argv[i] in ["-h", "--help"]:
+ usage_and_quit(0)
+ elif special_args and sys.argv[i] == "--only-properties-from":
+ i += 1
+ gl_only_properties_from = sys.argv[i]
+ elif special_args and sys.argv[i] == "--":
+ special_args = False
+ elif gl_output_xml_file is None:
+ gl_output_xml_file = sys.argv[i]
+ else:
+ gl_input_files.append(sys.argv[i])
+ i += 1
+if len(gl_input_files) < 2:
+ usage_and_quit(1)
###############################################################################
@@ -196,6 +217,33 @@ xml_roots = [ET.parse(f).getroot() for f in gl_input_files]
assert all([root.tag == "nm-setting-docs" for root in xml_roots])
+
+def skip_property(setting_name, property_name):
+ return False
+
+
+if gl_only_properties_from:
+ xml_root = ET.parse(gl_only_properties_from).getroot()
+ opf_setting_root = node_to_dict(xml_root, "setting", "name")
+ opf_cache = {}
+
+ def skip_property(setting_name, property_name):
+ if setting_name not in opf_cache:
+ s = opf_setting_root.get(setting_name)
+ if s is not None:
+ s = node_to_dict(s, "property", "name")
+ opf_cache[setting_name] = s
+ else:
+ s = opf_cache[setting_name]
+ if not s:
+ return True
+ if property_name is not None:
+ p = s.get(property_name)
+ if p is None:
+ return True
+ return False
+
+
settings_roots = [node_to_dict(root, "setting", "name") for root in xml_roots]
root_node = ET.Element("nm-setting-docs")
@@ -204,17 +252,13 @@ for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name):
dbg("> > setting_name: %s" % (setting_name))
- settings = [d.get(setting_name) for d in settings_roots]
-
- if gl_only_from_first and settings[0] is None:
- dbg("> > > skip (only-from-first")
+ if skip_property(setting_name, None):
+ dbg("> > > skip (only-properties-from)")
continue
- properties = [node_to_dict(s, "property", "name") for s in settings]
+ settings = [d.get(setting_name) for d in settings_roots]
- if gl_only_from_first and not properties[0]:
- dbg("> > > skip (no properties")
- continue
+ properties = [node_to_dict(s, "property", "name") for s in settings]
setting_node = ET.SubElement(root_node, "setting")
@@ -235,8 +279,8 @@ for setting_name in iter_keys_of_dicts(settings_roots, key_fcn_setting_name):
description, description_docbook = find_description(properties_attrs)
deprecated = find_deprecated(properties_attrs)
- if gl_only_from_first and properties_attrs[0] is None:
- dbg("> > > > skip (only-from-first")
+ if skip_property(setting_name, property_name):
+ dbg("> > > > skip (only-properties-from)")
continue
property_node = ET.SubElement(setting_node, "property")