xref: /aosp_15_r20/prebuilts/sdk/update_prebuilts/maven.py (revision 344a7f5ef16c479e7a7f54ee6567a9d112f9e72b)
1*344a7f5eSAndroid Build Coastguard Worker#!/usr/bin/python3
2*344a7f5eSAndroid Build Coastguard Workerimport os
3*344a7f5eSAndroid Build Coastguard Workerimport xml.etree.ElementTree as ElementTree
4*344a7f5eSAndroid Build Coastguard Worker
5*344a7f5eSAndroid Build Coastguard Workerfrom urllib import request
6*344a7f5eSAndroid Build Coastguard Worker
7*344a7f5eSAndroid Build Coastguard Worker# See (https://developer.android.com/studio/build/dependencies#gmaven-access)
8*344a7f5eSAndroid Build Coastguard WorkerGMAVEN_BASE_URL = 'https://maven.google.com'
9*344a7f5eSAndroid Build Coastguard Worker
10*344a7f5eSAndroid Build Coastguard WorkerURL_SEP = '/'
11*344a7f5eSAndroid Build Coastguard Worker
12*344a7f5eSAndroid Build Coastguard Workerclass GMavenArtifact(object):
13*344a7f5eSAndroid Build Coastguard Worker    # A map from group:library to the latest available version
14*344a7f5eSAndroid Build Coastguard Worker    key_versions_map = {}
15*344a7f5eSAndroid Build Coastguard Worker
16*344a7f5eSAndroid Build Coastguard Worker    def __init__(self, artifact_glob):
17*344a7f5eSAndroid Build Coastguard Worker        try:
18*344a7f5eSAndroid Build Coastguard Worker            (group, library, version, ext) = artifact_glob.split(':')
19*344a7f5eSAndroid Build Coastguard Worker        except ValueError:
20*344a7f5eSAndroid Build Coastguard Worker            raise ValueError(f'Error in {artifact_glob} expected: group:library:version:ext')
21*344a7f5eSAndroid Build Coastguard Worker
22*344a7f5eSAndroid Build Coastguard Worker        if not group or not library or not version or not ext:
23*344a7f5eSAndroid Build Coastguard Worker            raise ValueError(f'Error in {artifact_glob} expected: group:library:version:ext')
24*344a7f5eSAndroid Build Coastguard Worker
25*344a7f5eSAndroid Build Coastguard Worker        self.group = group
26*344a7f5eSAndroid Build Coastguard Worker        self.group_path = group.replace('.', '/')
27*344a7f5eSAndroid Build Coastguard Worker        self.library = library
28*344a7f5eSAndroid Build Coastguard Worker        self.key = f'{group}:{library}'
29*344a7f5eSAndroid Build Coastguard Worker        self.version = version
30*344a7f5eSAndroid Build Coastguard Worker        self.ext = ext
31*344a7f5eSAndroid Build Coastguard Worker
32*344a7f5eSAndroid Build Coastguard Worker    def get_pom_file_url(self):
33*344a7f5eSAndroid Build Coastguard Worker        return maven_path_for_artifact(
34*344a7f5eSAndroid Build Coastguard Worker            GMAVEN_BASE_URL, self.group_path, self.library, self.version, 'pom', URL_SEP)
35*344a7f5eSAndroid Build Coastguard Worker
36*344a7f5eSAndroid Build Coastguard Worker    def get_artifact_url(self):
37*344a7f5eSAndroid Build Coastguard Worker        return maven_path_for_artifact(
38*344a7f5eSAndroid Build Coastguard Worker            GMAVEN_BASE_URL, self.group_path, self.library, self.version, self.ext, URL_SEP)
39*344a7f5eSAndroid Build Coastguard Worker
40*344a7f5eSAndroid Build Coastguard Worker    def get_latest_version(self):
41*344a7f5eSAndroid Build Coastguard Worker        latest_version = GMavenArtifact.key_versions_map[self.key] \
42*344a7f5eSAndroid Build Coastguard Worker            if self.key in GMavenArtifact.key_versions_map else None
43*344a7f5eSAndroid Build Coastguard Worker
44*344a7f5eSAndroid Build Coastguard Worker        if not latest_version:
45*344a7f5eSAndroid Build Coastguard Worker            print(f'Fetching latest version for {self.key}')
46*344a7f5eSAndroid Build Coastguard Worker            group_index_url = f'{GMAVEN_BASE_URL}/{self.group_path}/group-index.xml'
47*344a7f5eSAndroid Build Coastguard Worker            tree = ElementTree.parse(request.urlopen(group_index_url))
48*344a7f5eSAndroid Build Coastguard Worker            root = tree.getroot()
49*344a7f5eSAndroid Build Coastguard Worker            libraries = root.findall('./*[@versions]')
50*344a7f5eSAndroid Build Coastguard Worker            for library in libraries:
51*344a7f5eSAndroid Build Coastguard Worker                key = f'{root.tag}:{library.tag}'
52*344a7f5eSAndroid Build Coastguard Worker                GMavenArtifact.key_versions_map[key] = library.get('versions').split(',')[-1]
53*344a7f5eSAndroid Build Coastguard Worker            latest_version = GMavenArtifact.key_versions_map[self.key]
54*344a7f5eSAndroid Build Coastguard Worker        return latest_version
55*344a7f5eSAndroid Build Coastguard Worker
56*344a7f5eSAndroid Build Coastguard Worker
57*344a7f5eSAndroid Build Coastguard Workerclass MavenLibraryInfo:
58*344a7f5eSAndroid Build Coastguard Worker    def __init__(self, key, group_id, artifact_id, version, artifact_dir, repo_dir, file):
59*344a7f5eSAndroid Build Coastguard Worker        self.key = key
60*344a7f5eSAndroid Build Coastguard Worker        self.group_id = group_id
61*344a7f5eSAndroid Build Coastguard Worker        self.artifact_id = artifact_id
62*344a7f5eSAndroid Build Coastguard Worker        self.version = version
63*344a7f5eSAndroid Build Coastguard Worker        self.dir = artifact_dir
64*344a7f5eSAndroid Build Coastguard Worker        self.repo_dir = repo_dir
65*344a7f5eSAndroid Build Coastguard Worker        self.file = file
66*344a7f5eSAndroid Build Coastguard Worker
67*344a7f5eSAndroid Build Coastguard Worker
68*344a7f5eSAndroid Build Coastguard Workerdef maven_path_for_artifact(base, group, library, version, ext, pathsep=os.pathsep):
69*344a7f5eSAndroid Build Coastguard Worker    return pathsep.join([base, group, library, version, f'{library}-{version}.{ext}'])
70