diff options
-rw-r--r-- | documentation/ref-manual/variables.rst | 6 | ||||
-rwxr-xr-x | documentation/tools/check-glossaries | 90 |
2 files changed, 96 insertions, 0 deletions
diff --git a/documentation/ref-manual/variables.rst b/documentation/ref-manual/variables.rst index e4d5a9c97a..6c2344950b 100644 --- a/documentation/ref-manual/variables.rst +++ b/documentation/ref-manual/variables.rst | |||
@@ -7,6 +7,9 @@ Variables Glossary | |||
7 | This chapter lists common variables used in the OpenEmbedded build | 7 | This chapter lists common variables used in the OpenEmbedded build |
8 | system and gives an overview of their function and contents. | 8 | system and gives an overview of their function and contents. |
9 | 9 | ||
10 | .. | ||
11 | check_glossary_begin | ||
12 | |||
10 | :term:`A <ABIEXTENSION>` :term:`B` :term:`C <CACHE>` | 13 | :term:`A <ABIEXTENSION>` :term:`B` :term:`C <CACHE>` |
11 | :term:`D` :term:`E <EFI_PROVIDER>` :term:`F <FAKEROOT>` | 14 | :term:`D` :term:`E <EFI_PROVIDER>` :term:`F <FAKEROOT>` |
12 | :term:`G <GCCPIE>` :term:`H <HGDIR>` :term:`I <IMAGE_BASENAME>` | 15 | :term:`G <GCCPIE>` :term:`H <HGDIR>` :term:`I <IMAGE_BASENAME>` |
@@ -16,6 +19,9 @@ system and gives an overview of their function and contents. | |||
16 | :term:`U <UBOOT_BINARY>` :term:`V <VIRTUAL-RUNTIME>` | 19 | :term:`U <UBOOT_BINARY>` :term:`V <VIRTUAL-RUNTIME>` |
17 | :term:`W <WARN_QA>` :term:`X <XSERVER>` :term:`Z <ZSTD_THREADS>` | 20 | :term:`W <WARN_QA>` :term:`X <XSERVER>` :term:`Z <ZSTD_THREADS>` |
18 | 21 | ||
22 | .. | ||
23 | check_glossary_end | ||
24 | |||
19 | .. glossary:: | 25 | .. glossary:: |
20 | :sorted: | 26 | :sorted: |
21 | 27 | ||
diff --git a/documentation/tools/check-glossaries b/documentation/tools/check-glossaries new file mode 100755 index 0000000000..b5dfe834e5 --- /dev/null +++ b/documentation/tools/check-glossaries | |||
@@ -0,0 +1,90 @@ | |||
1 | #!/usr/bin/env python3 | ||
2 | |||
3 | import argparse | ||
4 | import difflib | ||
5 | import os | ||
6 | import re | ||
7 | |||
8 | from pathlib import Path | ||
9 | |||
10 | |||
11 | def parse_arguments() -> argparse.Namespace: | ||
12 | parser = argparse.ArgumentParser(description="Print supported distributions") | ||
13 | |||
14 | parser.add_argument("-d", "--docs-dir", | ||
15 | type=Path, | ||
16 | default=Path(os.path.dirname(os.path.realpath(__file__))) / "documentation", | ||
17 | help="Path to documentation/ directory in yocto-docs") | ||
18 | |||
19 | return parser.parse_args() | ||
20 | |||
21 | |||
22 | glossaries = ( | ||
23 | 'ref-manual/variables.rst', | ||
24 | 'ref-manual/terms.rst', | ||
25 | ) | ||
26 | |||
27 | |||
28 | def main(): | ||
29 | |||
30 | args = parse_arguments() | ||
31 | in_glossary = False | ||
32 | # Pattern to match: | ||
33 | # :term:`A <ABIEXTENSION>` :term:`B` :term:`C <CACHE>` | ||
34 | glossary_re = re.compile(r":term:`(?P<letter>[A-Z]{1})( <(?P<varname>[A-Z_]+)>)?`") | ||
35 | entry_re = re.compile(r"^ :term:`(?P<entry>.+)`\s*$") | ||
36 | |||
37 | for rst in glossaries: | ||
38 | |||
39 | glossary = {} | ||
40 | rst_path = Path(args.docs_dir) / rst | ||
41 | |||
42 | with open(rst_path, "r") as f: | ||
43 | for line in f.readlines(): | ||
44 | if "check_glossary_begin" in line: | ||
45 | in_glossary = True | ||
46 | continue | ||
47 | if in_glossary: | ||
48 | for m in re.finditer(glossary_re, line.strip()): | ||
49 | letter = m.group("letter") | ||
50 | varname = m.group("varname") | ||
51 | if varname is None: | ||
52 | varname = letter | ||
53 | glossary[letter] = varname | ||
54 | if "check_glossary_end" in line: | ||
55 | in_glossary = False | ||
56 | break | ||
57 | |||
58 | entries = [] | ||
59 | |||
60 | with open(rst_path, "r") as f: | ||
61 | for line in f.readlines(): | ||
62 | m = re.match(entry_re, line) | ||
63 | if m: | ||
64 | entries.append(m.group("entry")) | ||
65 | |||
66 | # We lower here because underscore (_) come before lowercase letters | ||
67 | # (the natural way) but after uppercase letters (which is not natural) | ||
68 | sorted_entries = sorted(entries, key=lambda t: t.lower()) | ||
69 | diffs = list(difflib.unified_diff(entries, | ||
70 | sorted_entries, | ||
71 | fromfile="original_list", | ||
72 | tofile="sorted_list")) | ||
73 | |||
74 | if diffs: | ||
75 | print(f"WARNING: {rst}: entries are not properly sorted:") | ||
76 | print('\n'.join(diffs)) | ||
77 | |||
78 | for letter in glossary: | ||
79 | try: | ||
80 | index = entries.index(glossary[letter]) | ||
81 | except ValueError: | ||
82 | print(f"WARNING: {rst}: variable " | ||
83 | f"{glossary[letter]} in glossary does not exist") | ||
84 | if index > 0 and entries[index - 1].startswith(letter[0]): | ||
85 | print(f"WARNING: {rst}: The variable {glossary[letter]} shouldn't be in " | ||
86 | "the glossary.") | ||
87 | |||
88 | |||
89 | if __name__ == "__main__": | ||
90 | main() | ||