tools: sort the settings in "generate-docs-nm-property-infos.py" by name

"nm-setting-ip-config.c" is a base class for IPv4 and IPv6 settings. So
far, any tags there were ignored, which was not obvious. It can be
useful to document common properties there. Well, maybe every property
better has a IPv4/IPv6 specific text, but that should not be a technical
limitation of the tool. So also honor the base file for "ipv4" and
"ipv6" settings.

When doing that, the settings are no longer processed in the order as
they are provided on the command line. Because, one file would be parsed
twice, it wouldn't make much sense. Instead, sort the my setting name.
The advantage is that the generated XML is independent from the order
that make/meson passes to the tool.
This commit is contained in:
Thomas Haller 2022-10-04 10:15:17 +02:00
parent c1bebdfaa6
commit 77e0041b27
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728

View file

@ -60,7 +60,7 @@ def get_setting_names(source_file):
if file_base == "nm-setting-ip-config":
# Special case ip-config, which is a base class.
return None
return 0, ("ipv4", "ipv6")
header_file = "%s/libnm-core-public/%s.h" % (path_prefix, file_base)
@ -75,7 +75,7 @@ def get_setting_names(source_file):
for line in f:
m = re.search(r"^#define +NM_SETTING_.+SETTING_NAME\s+\"(\S+)\"$", line)
if m:
return m.group(1)
return 1, (m.group(1),)
raise Exception(
'Can\'t find setting name in header file "%s" for "%s"'
@ -84,10 +84,35 @@ def get_setting_names(source_file):
def get_file_infos(source_files):
# This function parses the source files and detects the
# used setting name. The returned sections are sorted by setting
# name.
#
# The file "nm-setting-ip-config.c" can contain information
# for "ipv4" and "ipv6" settings. Thus, to sort the files
# is a bit more involved.
# First, get a list of priority and setting-names that belong
# to the source file. Sort by priority,setting-names. It's
# important that "nm-setting-ip-config.c" gets parsed before
# "nm-setting-ip[46]-config.c".
file_infos = []
for source_file in source_files:
setting_name = get_setting_names(source_file)
if setting_name:
yield setting_name, source_file
priority, setting_names = get_setting_names(source_file)
file_infos.append((priority, setting_names, source_file))
file_infos.sort()
d = {}
for priority, setting_names, source_file in file_infos:
for setting_name in setting_names:
l = d.get(setting_name, None)
if l is None:
l = list()
d[setting_name] = l
l.append(source_file)
for key in sorted(d.keys()):
for f in d[key]:
yield key, f
KEYWORD_XML_TYPE_NESTED = "nested"
@ -368,13 +393,13 @@ def test_file_location():
def test_get_setting_names():
assert "connection" == get_setting_names(
assert (1, ("connection",)) == get_setting_names(
t_srcdir() + "/src/libnm-core-impl/nm-setting-connection.c"
)
assert "ipv4" == get_setting_names(
assert (1, ("ipv4",)) == get_setting_names(
t_srcdir() + "/src/libnm-core-impl/nm-setting-ip4-config.c"
)
assert None == get_setting_names(
assert (0, ("ipv4", "ipv6")) == get_setting_names(
t_srcdir() + "/src/libnm-core-impl/nm-setting-ip-config.c"
)
@ -384,19 +409,27 @@ def test_get_file_infos():
t = ["connection", "ip-config", "ip4-config", "proxy", "wired"]
assert [
(
"802-3-ethernet",
t_setting_c("wired"),
),
(
"connection",
t_setting_c("connection"),
),
(
"ipv4",
t_setting_c("ip-config"),
),
(
"ipv4",
t_setting_c("ip4-config"),
),
("proxy", t_setting_c("proxy")),
(
"802-3-ethernet",
t_setting_c("wired"),
"ipv6",
t_setting_c("ip-config"),
),
("proxy", t_setting_c("proxy")),
] == list(get_file_infos([t_setting_c(x) for x in t]))