53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
# MIT licensed
|
|
# Copyright (c) 2020 lilydjwg <lilydjwg@gmail.com>, et al.
|
|
# Copyright (c) 2017 Yen Chi Hsuan <yan12125 at gmail dot com>
|
|
|
|
import os
|
|
import re
|
|
from xml.etree import ElementTree
|
|
|
|
from nvchecker.api import session
|
|
|
|
_ANDROID_REPO_MANIFESTS = {
|
|
'addon': 'https://dl.google.com/android/repository/addon2-1.xml',
|
|
'package': 'https://dl.google.com/android/repository/repository2-1.xml',
|
|
}
|
|
|
|
async def _get_repo_manifest(repo):
|
|
repo_xml_url = _ANDROID_REPO_MANIFESTS[repo]
|
|
|
|
res = await session.get(repo_xml_url)
|
|
data = res.body.decode('utf-8')
|
|
|
|
repo_manifest = ElementTree.fromstring(data)
|
|
return repo_manifest
|
|
|
|
async def get_version(name, conf, *, cache, **kwargs):
|
|
repo = conf['repo']
|
|
pkg_path_prefix = conf['android_sdk']
|
|
|
|
repo_manifest = await cache.get(repo, _get_repo_manifest)
|
|
|
|
for pkg in repo_manifest.findall('.//remotePackage'):
|
|
if not pkg.attrib['path'].startswith(pkg_path_prefix):
|
|
continue
|
|
for archive in pkg.findall('./archives/archive'):
|
|
host_os = archive.find('./host-os')
|
|
if host_os is not None and host_os.text != 'linux':
|
|
continue
|
|
archive_url = archive.find('./complete/url').text
|
|
# revision
|
|
rev = pkg.find('./revision')
|
|
rev_strs = []
|
|
for part in ('major', 'minor', 'micro'):
|
|
part_node = rev.find('./' + part)
|
|
if part_node is not None:
|
|
rev_strs.append(part_node.text)
|
|
# release number
|
|
filename, ext = os.path.splitext(archive_url)
|
|
rel_str = filename.rsplit('-')[-1]
|
|
mobj = re.match(r'r\d+', rel_str)
|
|
if mobj:
|
|
rev_strs.append(rel_str)
|
|
return '.'.join(rev_strs)
|