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