@@ -322,16 +322,22 @@ class ExtensionSpecificDistributionManager {
322322 }
323323
324324 private async getLatestRelease ( ) : Promise < Release > {
325- const release = await this . createReleasesApiConsumer ( ) . getLatestRelease ( this . _versionRange , this . _config . includePrerelease ) ;
326- // FIXME: Look for platform-specific codeql distribution if available
327- release . assets = release . assets . filter ( asset => asset . name === 'codeql.zip' ) ;
328- if ( release . assets . length === 0 ) {
329- throw new Error ( "Release had no asset named codeql.zip" ) ;
330- }
331- else if ( release . assets . length > 1 ) {
332- throw new Error ( "Release had more than one asset named codeql.zip" ) ;
333- }
334- return release ;
325+ return await this . createReleasesApiConsumer ( ) . getLatestRelease (
326+ this . _versionRange ,
327+ this . _config . includePrerelease ,
328+ release => {
329+ // FIXME: Look for platform-specific codeql distribution if available
330+ // https://github.com/github/vscode-codeql/issues/417
331+ const matchingAssets = release . assets . filter ( asset => asset . name === 'codeql.zip' ) ;
332+ if ( matchingAssets . length !== 1 ) {
333+ if ( matchingAssets . length > 1 ) {
334+ logger . log ( "WARNING: Ignoring a release with more than one asset named codeql.zip" ) ;
335+ }
336+ return false ;
337+ }
338+ return true ;
339+ }
340+ ) ;
335341 }
336342
337343 private createReleasesApiConsumer ( ) : ReleasesApiConsumer {
@@ -391,7 +397,7 @@ export class ReleasesApiConsumer {
391397 this . _repoName = repoName ;
392398 }
393399
394- public async getLatestRelease ( versionRange : semver . Range , includePrerelease = false ) : Promise < Release > {
400+ public async getLatestRelease ( versionRange : semver . Range , includePrerelease = false , additionalCompatibilityCheck ?: ( release : GithubRelease ) => boolean ) : Promise < Release > {
395401 const apiPath = `/repos/${ this . _ownerName } /${ this . _repoName } /releases` ;
396402 const allReleases : GithubRelease [ ] = await ( await this . makeApiCall ( apiPath ) ) . json ( ) ;
397403 const compatibleReleases = allReleases . filter ( release => {
@@ -400,7 +406,11 @@ export class ReleasesApiConsumer {
400406 }
401407
402408 const version = semver . parse ( release . tag_name ) ;
403- return version !== null && semver . satisfies ( version , versionRange ) ;
409+ if ( version === null || ! semver . satisfies ( version , versionRange ) ) {
410+ return false ;
411+ }
412+
413+ return ! additionalCompatibilityCheck || additionalCompatibilityCheck ( release ) ;
404414 } ) ;
405415 // Tag names must all be parsable to semvers due to the previous filtering step.
406416 const latestRelease = compatibleReleases . sort ( ( a , b ) => {
0 commit comments