diff --git a/crates/uv-python/fetch-download-metadata.py b/crates/uv-python/fetch-download-metadata.py index f12bd012e..9bf88e7df 100755 --- a/crates/uv-python/fetch-download-metadata.py +++ b/crates/uv-python/fetch-download-metadata.py @@ -597,41 +597,41 @@ class PyodideFinder(Finder): releases = release_resp.json() metadata = meta_resp.json()["releases"] - maj_minor_seen = set() - results = [] + results = {} for release in releases: pyodide_version = release["tag_name"] meta = metadata.get(pyodide_version, None) if meta is None: continue - maj_min = pyodide_version.rpartition(".")[0] - # Only keep latest - if maj_min in maj_minor_seen: - continue - maj_minor_seen.add(maj_min) - python_version = Version.from_str(meta["python_version"]) + # Find xbuildenv asset for asset in release["assets"]: if asset["name"].startswith("xbuildenv"): break + else: + # not found: should not happen but just in case + continue url = asset["browser_download_url"] - results.append( - PythonDownload( - release=0, - version=python_version, - triple=self.TRIPLE, - flavor=pyodide_version, - implementation=self.implementation, - filename=asset["name"], - url=url, - build=pyodide_version, - ) + download = PythonDownload( + release=0, + version=python_version, + triple=self.TRIPLE, + flavor=pyodide_version, + implementation=self.implementation, + filename=asset["name"], + url=url, + build=pyodide_version, ) - return results + # Only keep latest Pyodide version of each Python version + # arch/platform are all the same for Pyodide (wasm32, emscripten) + if python_version not in results: + results[python_version] = download + + return list(results.values()) async def _fetch_checksums(self, downloads: list[PythonDownload], n: int) -> None: for idx, batch in enumerate(batched(downloads, n)):