@@ -247,17 +247,22 @@ async def order_sources(self, identifiers: List[str]) -> None:
247247 self ._settings .manifests = ordered_manifests
248248 self ._manager .save ()
249249
250- async def fetch_extension (self , identifier : str ) -> Optional [RepositoryEntry ]:
251- # Only fetch enabled sources already sorted by priority
252- manifest = await self .fetch_consolidated ()
253- return next ((ext for ext in manifest if ext .identifier == identifier ), None )
254-
255- async def fetch_latest_extension_version (self , identifier : str , stable : bool ) -> Optional [ExtensionVersion ]:
256- manifest = await self .fetch_consolidated ()
257- ext = next ((ext for ext in manifest if ext .identifier == identifier ), None )
258-
250+ async def fetch_extension (self , extension_id : str , manifest_id : Optional [str ] = None ) -> Optional [RepositoryEntry ]:
251+ manifest = []
252+ if manifest_id is None :
253+ # Only fetch enabled sources already sorted by priority
254+ manifest = await self .fetch_consolidated ()
255+ else :
256+ manifest = (await self .fetch_by_identifier (manifest_id , fetch_data = True )).data or []
257+
258+ return next ((ext for ext in manifest if ext .identifier == extension_id ), None )
259+
260+ async def fetch_extension_versions (
261+ self , extension_id : str , stable : bool , manifest_id : Optional [str ] = None
262+ ) -> List [semver .VersionInfo ]:
263+ ext = await self .fetch_extension (extension_id , manifest_id )
259264 if not ext or not ext .versions :
260- return None
265+ return []
261266
262267 def valid_semver (string : str ) -> Optional [semver .VersionInfo ]:
263268 # We want to allow versions to be prefixed with a 'v'.
@@ -266,17 +271,27 @@ def valid_semver(string: str) -> Optional[semver.VersionInfo]:
266271 try :
267272 return semver .VersionInfo .parse (string )
268273 except ValueError :
269- return None
274+ return []
270275
271276 versions : List [semver .VersionInfo ] = sorted ([valid_semver (tag ) for tag in ext .versions ], reverse = True )
272-
273277 if stable :
274278 versions = [v for v in versions if not v .prerelease and not v .patch ]
275279
280+ return versions
281+
282+ async def fetch_latest_extension_version (
283+ self , extension_id : str , stable : bool , manifest_id : Optional [str ] = None
284+ ) -> Optional [ExtensionVersion ]:
285+ ext = await self .fetch_extension (extension_id , manifest_id )
286+ if not ext or not ext .versions :
287+ return None
288+
289+ versions = await self .fetch_extension_versions (extension_id , stable , manifest_id )
290+
276291 return ext .versions .get (str (versions [0 ])) if versions else None
277292
278- async def fetch_extension_version (self , identifier : str , tag : str ) -> Optional [ExtensionVersion ]:
279- ext = await self .fetch_extension (identifier )
293+ async def fetch_extension_version (self , extension_id : str , tag : str ) -> Optional [ExtensionVersion ]:
294+ ext = await self .fetch_extension (extension_id )
280295 if not ext :
281296 return None
282297
0 commit comments