mirror of
https://git.yoctoproject.org/poky
synced 2026-02-08 01:36:38 +01:00
The Yocto Project docs was migrated from Docbook to Sphinx in YP 3.2. This 3.1 is an LTS release, and since 3.1 docs are 'close to' the docs in 3.2, we agreed to backport sphinx docs onto 3.1. This first patch brings all changes done in 3.2 until: 7f64574f7 README: include detailed information about sphinx There are other changes after this commit, but they will be selectively backported in individual patches. This patch was generated with the following command: git cherry-pick -n \ $(git log --reverse --oneline \ ac352ad7f95db7eeacb53c2778caa31800bd7c26..7f64574f7 \ | cut -f1 -d' ') The following commits were applies in the dunfell docs, but not in master, so they were first reverted (and squashed into this change). A commit will reintroduce the content from these patches in the Sphinx files in a followup patch. 069c27574 Documenation: Prepared for the 3.1.1 release bd140f0f9 Documentation: Add 3.1.1 version updates missing from previous commit 17cc71a8f Documenation: Prepared for the 3.1.2 release 1a69e2c02 Documenation: Prepared for the 3.1.3 release 8910ac1c7 Documenation: Prepared for the 3.1.4 release (From yocto-docs rev: c25fe058b88b893b0d146f3ed27320b47cdec236) Signed-off-by: Nicolas Dechesne <nicolas.dechesne@linaro.org> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
159 lines
5.4 KiB
Python
159 lines
5.4 KiB
Python
#!/usr/bin/env python
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
# documentation.conf update script
|
|
#
|
|
# Author: Paul Eggleton <paul.eggleton@linux.intel.com>
|
|
#
|
|
# Copyright (C) 2015 Intel Corporation
|
|
#
|
|
|
|
|
|
import sys
|
|
import os
|
|
import argparse
|
|
import re
|
|
from lxml import etree
|
|
import logging
|
|
|
|
def logger_create(name):
|
|
logger = logging.getLogger(name)
|
|
loggerhandler = logging.StreamHandler()
|
|
loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s"))
|
|
logger.addHandler(loggerhandler)
|
|
logger.setLevel(logging.INFO)
|
|
return logger
|
|
logger = logger_create('docconfupdater')
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="documentation.conf updater")
|
|
parser.add_argument('basepath', help='Path to OE-Core base directory')
|
|
parser.add_argument('-q', '--quiet', help='Print only warnings/errors', action='store_true')
|
|
|
|
args = parser.parse_args()
|
|
|
|
if args.quiet:
|
|
logger.setLevel(logging.WARN)
|
|
|
|
if not os.path.isdir(args.basepath):
|
|
logger.error('Specified base path %s not found')
|
|
return 1
|
|
|
|
doc_conf = os.path.join(args.basepath, 'meta', 'conf', 'documentation.conf')
|
|
if not os.path.exists(doc_conf):
|
|
logger.error('Unable to find %s' % doc_conf)
|
|
return 1
|
|
|
|
allowed_flags = ['doc']
|
|
flag_re = re.compile(r'\[(.+?)\]')
|
|
|
|
infos = {}
|
|
tree = etree.parse('ref-manual/ref-variables.xml')
|
|
root = tree.getroot()
|
|
for glossary in root.findall('glossary'):
|
|
for glossdiv in glossary.findall('glossdiv'):
|
|
for glossentry in glossdiv.findall('glossentry'):
|
|
info = glossentry.find('info')
|
|
if info is not None:
|
|
infoline = ' '.join(info.text.split())
|
|
infolinesplit = infoline.split('=', 1)
|
|
if len(infoline) < 2:
|
|
logger.warn('Invalid info line (no = character), ignoring: %s' % infoline)
|
|
continue
|
|
flags = flag_re.findall(infolinesplit[0])
|
|
if not flags:
|
|
logger.warn('Invalid info line (no varflag), ignoring: %s' % infoline)
|
|
continue
|
|
for flag in flags:
|
|
if flag not in allowed_flags:
|
|
logger.warn('Invalid info line (varflag %s not in allowed list), ignoring: %s' % (flag, infoline))
|
|
continue
|
|
infos[infolinesplit[0].rstrip()] = infolinesplit[1].lstrip()
|
|
|
|
if not infos:
|
|
logger.error('ERROR: Unable to find any info tags in the glossary')
|
|
return 1
|
|
|
|
def sortkey(key):
|
|
# Underscores sort undesirably, so replace them
|
|
return key.split('[')[0].replace('_', '-')
|
|
|
|
changed = False
|
|
lines = []
|
|
invars = False
|
|
lastletter = None
|
|
added = []
|
|
with open(doc_conf, 'r') as dcf:
|
|
for line in dcf:
|
|
if not invars:
|
|
if line.startswith('#') and 'DESCRIPTIONS FOR VARIABLES' in line:
|
|
invars = True
|
|
elif not line.startswith('#'):
|
|
linesplit = line.split('=', 1)
|
|
if len(linesplit) > 1:
|
|
key = linesplit[0].rstrip()
|
|
lastletter = key[0]
|
|
# Find anything in the dict that should come before the current key
|
|
for dkey in sorted(infos.keys()):
|
|
if sortkey(dkey) < sortkey(key):
|
|
lines.append('%s = %s\n' % (dkey, infos[dkey]))
|
|
added.append(dkey)
|
|
del infos[dkey]
|
|
changed = True
|
|
newvalue = infos.get(key, None)
|
|
if newvalue:
|
|
del infos[key]
|
|
if newvalue != linesplit[1].strip():
|
|
lines.append('%s = %s\n' % (key, newvalue))
|
|
changed = True
|
|
continue
|
|
elif key in added:
|
|
# We already added a new value for this key, so skip it
|
|
continue
|
|
elif lastletter:
|
|
# Ensure we write out anything anything left over for this letter
|
|
for dkey in sorted(infos.keys()):
|
|
if dkey[0] == lastletter:
|
|
lines.append('%s = %s\n' % (dkey, infos[dkey]))
|
|
del infos[dkey]
|
|
changed = True
|
|
elif dkey[0] > lastletter:
|
|
# List is sorted, so we're done
|
|
break
|
|
lastletter = None
|
|
lines.append(line)
|
|
|
|
if not invars:
|
|
logger.error('ERROR: Unable to find variables section in documentation.conf')
|
|
return 1
|
|
|
|
if infos:
|
|
changed = True
|
|
# Write out anything left over
|
|
lines.append('\n\n')
|
|
for key in sorted(infos.keys()):
|
|
lines.append('%s = %s\n' % (key, infos[key]))
|
|
|
|
if changed:
|
|
logger.info('Updating %s' % doc_conf)
|
|
with open(doc_conf, 'w') as dcf:
|
|
for line in lines:
|
|
dcf.write(line)
|
|
else:
|
|
logger.info('No changes required')
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
ret = main()
|
|
except Exception:
|
|
ret = 1
|
|
import traceback
|
|
traceback.print_exc(5)
|
|
sys.exit(ret)
|
|
|
|
|