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>
5.4 KiB
#!/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)