1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
#!/usr/bin/python3
"""
List platforms installed by the debputy manifest.
Also check that they have distinct configurations
and that each symlink has the same configuration than its target.
flake8 debian/rules.py
pylint debian/rules.py
mypy debian/rules.py
python3 debian/rules.py x # command line arguments trigger DEBUG
rm -fr .mypy_cache/
"""
import re
import sys
import yaml
DEBUG = 1 < len(sys.argv)
defconfig_to_platform: dict[str, str] = {}
class Error(Exception):
"""Used to report an issue with defconfigs."""
def defconfig(platform: str) -> str:
"""Return the contents of the defconfig file for platform."""
with open(f'configs/{platform}_defconfig', encoding='utf-8') as stream:
return stream.read()
def install(platform: str) -> None:
"""Check that the defconfig is unique, then print platform."""
config = defconfig(platform)
same = defconfig_to_platform.get(config, None)
if same is not None:
raise Error(f'{platform} and {same} have the same defconfig')
defconfig_to_platform[config] = platform
print(platform)
def symlink(alias: str, binary: str) -> None:
"""Check that alias and binary have the same defconfig."""
config = defconfig(alias)
same = defconfig_to_platform.get(config, None)
if same != binary:
raise Error(f'{alias} and {binary} have distinct defconfigs')
if DEBUG:
print(f'{alias:30} -> {binary}')
def main() -> None:
"""Parse the debputy manifest."""
with open('debian/debputy.manifest', encoding='utf-8') as stream:
manifest = yaml.safe_load(stream)
name = '([a-z](?:[_-]?[a-z0-9]+)*)'
fwdir = 'usr/lib/crust-firmware'
for i in manifest['installations']:
match i:
case {'install': {'sources': sources, 'dest-dir': dest_dir}}:
if dest_dir == fwdir:
for s in sources:
if (p := re.fullmatch(fr'build/{name}/\1[.]bin', s)):
install(platform=p.group(1))
for t in manifest['packages']['crust-firmware']['transformations']:
match t:
case {'create-symlink': {'path': p, 'target': t}}:
if (a := re.fullmatch(f'{fwdir}/{name}[.]bin', p)):
if (b := re.fullmatch(f'/{fwdir}/{name}[.]bin', t)):
symlink(alias=a.group(1), binary=b.group(1))
main()
|