diff options
author | Quentin Schulz <foss@0leil.net> | 2020-10-04 15:12:41 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2020-10-20 11:12:06 +0100 |
commit | d97ad8cf1ac3480928a51a09d65326f910102b85 (patch) | |
tree | dee2b37bbe15fb0f0c2963357f034ae4f68b39a1 /documentation/sphinx | |
parent | c04e9aa806d6d10d958e07e83aa23a505244eb71 (diff) | |
download | poky-d97ad8cf1ac3480928a51a09d65326f910102b85.tar.gz |
docs: sphinx: yocto-vars: rebuild files when poky.yaml has changed
poky.yaml changes aren't detected by Sphinx by default.
In order to detect changes in poky.yaml, its md5sum is stored in the
app.outdir (BUILDDIR/html when building html) and checked against the
md5sum of the poky.yaml under use.
If the md5sum has changed, find all rst files in app.srcdir that have at
least an occurence of `&.*;` and mark them as requiring a rebuild.
(From yocto-docs rev: 59537c7fa49e3ea6918f45b3201ad16d56988b9b)
Signed-off-by: Quentin Schulz <foss@0leil.net>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'documentation/sphinx')
-rw-r--r-- | documentation/sphinx/yocto-vars.py | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/documentation/sphinx/yocto-vars.py b/documentation/sphinx/yocto-vars.py index 8083d7da19..8795eee0a0 100644 --- a/documentation/sphinx/yocto-vars.py +++ b/documentation/sphinx/yocto-vars.py | |||
@@ -1,4 +1,6 @@ | |||
1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python |
2 | from hashlib import md5 | ||
3 | from pathlib import Path | ||
2 | import re | 4 | import re |
3 | import sys | 5 | import sys |
4 | 6 | ||
@@ -20,25 +22,62 @@ __version__ = '1.0' | |||
20 | # Each .rst file is processed after source-read event (subst_vars_replace runs once per file) | 22 | # Each .rst file is processed after source-read event (subst_vars_replace runs once per file) |
21 | subst_vars = {} | 23 | subst_vars = {} |
22 | 24 | ||
25 | poky_hash = "" | ||
26 | |||
23 | def subst_vars_replace(app: Sphinx, docname, source): | 27 | def subst_vars_replace(app: Sphinx, docname, source): |
24 | result = source[0] | 28 | result = source[0] |
25 | for k in subst_vars: | 29 | for k in subst_vars: |
26 | result = result.replace("&"+k+";", subst_vars[k]) | 30 | result = result.replace("&"+k+";", subst_vars[k]) |
27 | source[0] = result | 31 | source[0] = result |
28 | 32 | ||
33 | def yocto_vars_env_get_outdated(app: Sphinx, env, added, changed, removed): | ||
34 | ''' | ||
35 | If poky.yaml changed (BUILDDIR/.poky.yaml.cache does not exist or contains | ||
36 | an md5sum different from poky.yaml's current md5sum), force rebuild of all | ||
37 | *.rst files in SOURCEDIR whose content has at least one occurence of `&.*;` | ||
38 | (see PATTERN global variable). | ||
39 | ''' | ||
40 | try: | ||
41 | poky_cache = Path(app.outdir) / ".poky.yaml.cache" | ||
42 | cache_hash = poky_cache.read_text() | ||
43 | except FileNotFoundError: | ||
44 | cache_hash = None | ||
45 | |||
46 | if poky_hash == cache_hash: | ||
47 | return [] | ||
48 | |||
49 | docs = [] | ||
50 | for p in Path(app.srcdir).rglob("*.rst"): | ||
51 | if PATTERN.search(p.read_text()): | ||
52 | p_rel_no_ext = p.relative_to(app.srcdir).parent / p.stem | ||
53 | docs.append(str(p_rel_no_ext)) | ||
54 | return docs | ||
55 | |||
56 | def yocto_vars_build_finished(app: Sphinx, exception): | ||
57 | poky_cache = Path(app.outdir) / ".poky.yaml.cache" | ||
58 | poky_cache.write_text(poky_hash) | ||
59 | return [] | ||
60 | |||
29 | PATTERN = re.compile(r'&(.*?);') | 61 | PATTERN = re.compile(r'&(.*?);') |
30 | def expand(val, src): | 62 | def expand(val, src): |
31 | return PATTERN.sub(lambda m: expand(src.get(m.group(1), ''), src), val) | 63 | return PATTERN.sub(lambda m: expand(src.get(m.group(1), ''), src), val) |
32 | 64 | ||
33 | def setup(app: Sphinx): | 65 | def setup(app: Sphinx): |
34 | #FIXME: if poky.yaml changes, files are not reprocessed. | 66 | global poky_hash |
67 | |||
35 | with open("poky.yaml") as file: | 68 | with open("poky.yaml") as file: |
36 | subst_vars.update(yaml.load(file, Loader=yaml.FullLoader)) | 69 | hasher = md5() |
70 | buff = file.read() | ||
71 | hasher.update(buff.encode('utf-8')) | ||
72 | poky_hash = hasher.hexdigest() | ||
73 | subst_vars.update(yaml.safe_load(buff)) | ||
37 | 74 | ||
38 | for k in subst_vars: | 75 | for k in subst_vars: |
39 | subst_vars[k] = expand(subst_vars[k], subst_vars) | 76 | subst_vars[k] = expand(subst_vars[k], subst_vars) |
40 | 77 | ||
41 | app.connect('source-read', subst_vars_replace) | 78 | app.connect('source-read', subst_vars_replace) |
79 | app.connect('env-get-outdated', yocto_vars_env_get_outdated) | ||
80 | app.connect('build-finished', yocto_vars_build_finished) | ||
42 | 81 | ||
43 | return dict( | 82 | return dict( |
44 | version = __version__, | 83 | version = __version__, |