shipper: Initial commit
Change-Id: Iac259c98d31e14fa59ec166f2291bd463b101955
This commit is contained in:
1
shipper/requirements.txt
Normal file
1
shipper/requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
PyYAML==6.0.1
|
||||||
97
shipper/shipper.py
Executable file
97
shipper/shipper.py
Executable file
@@ -0,0 +1,97 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import argparse
|
||||||
|
import collections
|
||||||
|
import dataclasses
|
||||||
|
import glob
|
||||||
|
import pathlib
|
||||||
|
import subprocess
|
||||||
|
import textwrap
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
CROOT = str(pathlib.Path(__file__).parents[3])
|
||||||
|
|
||||||
|
|
||||||
|
@dataclasses.dataclass
|
||||||
|
class WikiData:
|
||||||
|
codename: str
|
||||||
|
device_names: list
|
||||||
|
maintainers: set
|
||||||
|
versions: list
|
||||||
|
|
||||||
|
def to_jekyll_table(self) -> str:
|
||||||
|
return '| {} |'.format(' | '.join([
|
||||||
|
' / '.join(self.device_names),
|
||||||
|
f'[{self.codename}](https://wiki.lineageos.org/devices/{self.codename})',
|
||||||
|
', '.join(self.maintainers),
|
||||||
|
str(self.versions[-2]) if len(self.versions) > 1 else ''
|
||||||
|
]))
|
||||||
|
|
||||||
|
|
||||||
|
def get_build_targets(git_head: str) -> dict:
|
||||||
|
build_targets = {}
|
||||||
|
|
||||||
|
for line in subprocess.run(['git', 'show', f'{git_head}:lineage-build-targets'],
|
||||||
|
cwd=f'{CROOT}/lineage/hudson',
|
||||||
|
stdout=subprocess.PIPE).stdout.decode().splitlines():
|
||||||
|
if line and not line.startswith('#'):
|
||||||
|
device, build_type, version, cadence = line.split()
|
||||||
|
build_targets[device] = version
|
||||||
|
|
||||||
|
return build_targets
|
||||||
|
|
||||||
|
|
||||||
|
def get_wiki_data(codename: str) -> WikiData:
|
||||||
|
device_names = []
|
||||||
|
maintainers = []
|
||||||
|
versions = []
|
||||||
|
|
||||||
|
for path in glob.glob(f'{CROOT}/lineage/wiki/_data/devices/{codename}.yml') + glob.glob(
|
||||||
|
f'{CROOT}/lineage/wiki/_data/devices/{codename}_variant*.yml'):
|
||||||
|
doc = yaml.load(open(path, 'r').read(), Loader=yaml.SafeLoader)
|
||||||
|
device_names.append(f'{doc["vendor"]} {doc["name"]}')
|
||||||
|
maintainers = doc['maintainers']
|
||||||
|
versions = doc['versions']
|
||||||
|
|
||||||
|
return WikiData(codename, device_names, maintainers, versions)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_cmdline() -> argparse.Namespace:
|
||||||
|
parser = argparse.ArgumentParser(description='Generate device table for the blog post')
|
||||||
|
parser.add_argument('hudson_git_head',
|
||||||
|
help='Hudson Git HEAD as of the previous changelog post')
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
args = parse_cmdline()
|
||||||
|
|
||||||
|
build_targets_before = get_build_targets(args.hudson_git_head)
|
||||||
|
build_targets_after = get_build_targets('HEAD')
|
||||||
|
|
||||||
|
new_devices = collections.defaultdict(list)
|
||||||
|
|
||||||
|
for codename, branch in build_targets_after.items():
|
||||||
|
if build_targets_before.get(codename, None) != branch:
|
||||||
|
new_devices[branch].append(codename)
|
||||||
|
|
||||||
|
for branch, codenames in new_devices.items():
|
||||||
|
_, version = branch.split('-')
|
||||||
|
|
||||||
|
if version.endswith('.0'):
|
||||||
|
version = version[:-2]
|
||||||
|
|
||||||
|
print(textwrap.dedent(f'''\
|
||||||
|
#### Added {version} devices
|
||||||
|
|
||||||
|
{{: .table }}
|
||||||
|
| Device name | Wiki | Maintainers | Moved from |
|
||||||
|
|-------------|------|-------------|------------|'''))
|
||||||
|
print('\n'.join(
|
||||||
|
sorted([get_wiki_data(x).to_jekyll_table() for x in codenames])
|
||||||
|
))
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user