Files
poky/documentation/tools/update-documentation-conf
Nicolas Dechesne fa0cb4d34b sphinx: import docs
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>
2021-01-04 10:55:00 +00:00

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)