diff --git a/update-poms.py b/update-poms.py index 280c777..cc70600 100755 --- a/update-poms.py +++ b/update-poms.py @@ -249,7 +249,7 @@ class Package: def __init__(self, groupId: str, artifactId: str, version: str | None = None, implicit: bool = False): self.groupId = groupId self.artifactId = artifactId - self.version = version + self.version = version if version and not version.isspace() else None self.implicit = implicit def __str__(self) -> str: @@ -317,34 +317,51 @@ class Package: return q async def _query_maven(self) -> None: - url = f'{baseurl}/solrsearch/select?q={self._urlquery}&rows=1&wt=json' - logger.debug(f'{self}: Querying maven at url {url}') + self._verified = False async with aiohttp.ClientSession() as session: - async with session.get(url) as response: - if response.status == 200: - message = await response.json() - num = message['response']['numFound'] - - if num: - logger.debug(f'{self}: Query successful') - self._verified = True - if self.version is None: - version = message['response']['docs'][0]['latestVersion'] - logger.debug(f'{self}: Using newest version {version}') - self.version = version - else: - if self.implicit: - logger.debug(f'{self}: No matching packages found') - else: - logger.warning(f'{self}: No matching packages found') + for mirror in mirrors: + url = f'{mirror}/{self.groupId.replace(".", "/")}/{self.artifactId}/maven-metadata.xml' + logger.debug(f'{self}: Querying maven at url {url}') - self._verified = False - elif response.status == 429: - raise TooManyRequestsException() + async with session.get(url) as response: + if response.status == 200: + response_text = await response.text() + metadata = ET.fromstring(response_text) + + if metadata is not None: + logger.debug(f'{self}: Metadata found') + + if self.version is None: + release_tag = metadata.find('./versioning/release') + latest_tag = metadata.find('./versioning/latest') + version = release_tag.text if release_tag is not None else latest_tag.text if latest_tag is not None else None + + if version is not None: + logger.debug(f'{self}: Using newest version {version}') + self.version = version + self._verified = True + return + else: + logger.info(f'{self}: Could not find latest version in metadata from mirror {mirror}') + else: + if metadata.find(f'./versioning/versions/version[.="{self.version}"]') is not None: + logger.debug(f'{self}: Version {self.version} is valid') + self._verified = True + return + else: + logger.info(f'{self}: Could not find version {self.version} in metadata from mirror {mirror}') + else: + logger.warning('{self}: Invalid XML for maven metadata: {response_text}') + elif response.status == 429: + raise TooManyRequestsException() + else: + logger.info(f'{self}: HTTP error {response.status} downloading maven metadata from {url}') + else: + if self.implicit: + logger.info(f'{self}: Package not found in any mirror') else: - self._verified = False - logger.warning(f'{self}: HTTP error {response.status} downloading pom') + logger.warning(f'{self}: Package not found in any mirror') async def verify(self) -> bool: if not self._verified: @@ -479,7 +496,6 @@ async def worker(queue: asyncio.Queue) -> None: break except Exception: logger.exception(f'{package}: Unknown error while processing package') - logger.error(global_properties) break