2017-05-01 00:26:56 +00:00
|
|
|
#!/usr/bin/env python3
|
2020-11-09 04:23:58 +00:00
|
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
2013-02-03 03:47:47 +00:00
|
|
|
|
|
|
|
import collections
|
2022-03-22 20:51:33 +00:00
|
|
|
import glob
|
2023-07-17 20:39:37 +00:00
|
|
|
import pprint
|
2013-02-03 03:47:47 +00:00
|
|
|
import sys
|
2022-03-22 20:51:33 +00:00
|
|
|
from pathlib import Path
|
2023-07-17 20:39:37 +00:00
|
|
|
|
2017-07-03 00:26:32 +00:00
|
|
|
from xml_helper import xml_parse
|
2013-02-03 03:47:47 +00:00
|
|
|
|
2023-07-17 20:39:37 +00:00
|
|
|
|
2013-02-03 03:47:47 +00:00
|
|
|
def man(page, number):
|
2023-07-17 20:39:37 +00:00
|
|
|
return f'{page}.{number}'
|
2013-02-03 03:47:47 +00:00
|
|
|
|
|
|
|
def add_rules(rules, name):
|
2013-03-29 18:22:27 +00:00
|
|
|
xml = xml_parse(name)
|
2013-02-03 03:47:47 +00:00
|
|
|
# print('parsing {}'.format(name), file=sys.stderr)
|
2014-02-19 21:06:10 +00:00
|
|
|
if xml.getroot().tag != 'refentry':
|
|
|
|
return
|
2013-02-03 03:47:47 +00:00
|
|
|
conditional = xml.getroot().get('conditional') or ''
|
|
|
|
rulegroup = rules[conditional]
|
|
|
|
refmeta = xml.find('./refmeta')
|
|
|
|
title = refmeta.find('./refentrytitle').text
|
|
|
|
number = refmeta.find('./manvolnum').text
|
|
|
|
refnames = xml.findall('./refnamediv/refname')
|
|
|
|
target = man(refnames[0].text, number)
|
|
|
|
if title != refnames[0].text:
|
|
|
|
raise ValueError('refmeta and refnamediv disagree: ' + name)
|
|
|
|
for refname in refnames:
|
|
|
|
assert all(refname not in group
|
|
|
|
for group in rules.values()), "duplicate page name"
|
|
|
|
alias = man(refname.text, number)
|
|
|
|
rulegroup[alias] = target
|
|
|
|
# print('{} => {} [{}]'.format(alias, target, conditional), file=sys.stderr)
|
|
|
|
|
2013-12-21 23:11:35 +00:00
|
|
|
def create_rules(xml_files):
|
2013-02-03 03:47:47 +00:00
|
|
|
" {conditional => {alias-name => source-name}} "
|
|
|
|
rules = collections.defaultdict(dict)
|
|
|
|
for name in xml_files:
|
2014-02-19 21:06:10 +00:00
|
|
|
try:
|
|
|
|
add_rules(rules, name)
|
|
|
|
except Exception:
|
|
|
|
print("Failed to process", name, file=sys.stderr)
|
|
|
|
raise
|
2013-02-03 03:47:47 +00:00
|
|
|
return rules
|
|
|
|
|
|
|
|
def mjoin(files):
|
|
|
|
return ' \\\n\t'.join(sorted(files) or '#')
|
|
|
|
|
2017-04-05 03:21:04 +00:00
|
|
|
MESON_HEADER = '''\
|
2021-01-05 03:55:10 +00:00
|
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
|
2020-05-07 12:01:09 +00:00
|
|
|
# Do not edit. Generated by update-man-rules.py.
|
2019-07-18 20:27:45 +00:00
|
|
|
# Update with:
|
2021-01-27 08:10:25 +00:00
|
|
|
# ninja -C build update-man-rules
|
2017-04-05 03:21:04 +00:00
|
|
|
manpages = ['''
|
|
|
|
|
|
|
|
MESON_FOOTER = '''\
|
|
|
|
]
|
2022-03-22 20:51:33 +00:00
|
|
|
# Really, do not edit.
|
|
|
|
'''
|
2017-04-05 03:21:04 +00:00
|
|
|
|
2023-07-17 20:39:37 +00:00
|
|
|
def make_mesonfile(rules, _dist_files):
|
2017-04-05 03:21:04 +00:00
|
|
|
# reformat rules as
|
|
|
|
# grouped = [ [name, section, [alias...], condition], ...]
|
|
|
|
#
|
|
|
|
# but first create a dictionary like
|
|
|
|
# lists = { (name, condition) => [alias...]
|
|
|
|
grouped = collections.defaultdict(list)
|
|
|
|
for condition, items in rules.items():
|
|
|
|
for alias, name in items.items():
|
|
|
|
group = grouped[(name, condition)]
|
|
|
|
if name != alias:
|
|
|
|
group.append(alias)
|
|
|
|
|
|
|
|
lines = [ [p[0][:-2], p[0][-1], sorted(a[:-2] for a in aliases), p[1]]
|
|
|
|
for p, aliases in sorted(grouped.items()) ]
|
|
|
|
return '\n'.join((MESON_HEADER, pprint.pformat(lines)[1:-1], MESON_FOOTER))
|
|
|
|
|
2023-07-17 20:39:37 +00:00
|
|
|
def main():
|
2022-03-22 20:51:33 +00:00
|
|
|
source_glob = sys.argv[1]
|
|
|
|
target = Path(sys.argv[2])
|
|
|
|
|
|
|
|
pages = glob.glob(source_glob)
|
2020-06-13 14:29:43 +00:00
|
|
|
pages = (p for p in pages
|
2022-03-22 20:51:33 +00:00
|
|
|
if Path(p).name not in {
|
2024-01-04 10:31:11 +00:00
|
|
|
'standard-conf.xml',
|
2020-06-13 14:29:43 +00:00
|
|
|
'systemd.directives.xml',
|
|
|
|
'systemd.index.xml',
|
|
|
|
'directives-template.xml'})
|
2017-04-05 03:21:04 +00:00
|
|
|
|
|
|
|
rules = create_rules(pages)
|
2022-03-22 20:51:33 +00:00
|
|
|
dist_files = (Path(p).name for p in pages)
|
|
|
|
text = make_mesonfile(rules, dist_files)
|
|
|
|
|
|
|
|
tmp = target.with_suffix('.tmp')
|
|
|
|
tmp.write_text(text)
|
|
|
|
tmp.rename(target)
|
2023-07-17 20:39:37 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|