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