@@ -297,6 +297,10 @@ class ExtensionSpecificDistributionManager {
297297 `but encountered an error: ${ e } .` ) ;
298298 }
299299
300+ // NOTE: We are tacitly assuming that at this point
301+ // release.assets.length === 1. This is ensured by
302+ // getLatestRelease for now. Reconsider this if a cli release ever
303+ // has more than one asset.
300304 const assetStream = await this . createReleasesApiConsumer ( ) . streamBinaryContentOfAsset ( release . assets [ 0 ] ) ;
301305 const tmpDirectory = await fs . mkdtemp ( path . join ( os . tmpdir ( ) , "vscode-codeql" ) ) ;
302306
@@ -354,26 +358,46 @@ class ExtensionSpecificDistributionManager {
354358 }
355359 }
356360
361+ /**
362+ * Get the name of the codeql cli installation we prefer to install, based on our current platform.
363+ */
364+ private getRequiredAssetName ( ) : string {
365+ if ( os . platform ( ) === 'linux' ) return 'codeql-linux64.zip' ;
366+ if ( os . platform ( ) === 'darwin' ) return 'codeql-osx64.zip' ;
367+ if ( os . platform ( ) === 'win32' ) return 'codeql-win64.zip' ;
368+ return 'codeql.zip' ;
369+ }
370+
357371 private async getLatestRelease ( ) : Promise < Release > {
358- return await this . createReleasesApiConsumer ( ) . getLatestRelease (
372+ const requiredAssetName = this . getRequiredAssetName ( ) ;
373+ logger . log ( `Searching for latest release including ${ requiredAssetName } . ` ) ;
374+ const release = await this . createReleasesApiConsumer ( ) . getLatestRelease (
359375 this . _versionRange ,
360376 this . _config . includePrerelease ,
361377 release => {
362- // FIXME: Look for platform-specific codeql distribution if available
363- // https://github.com/github/vscode-codeql/issues/417
364- const matchingAssets = release . assets . filter ( asset => asset . name === 'codeql.zip' ) ;
378+ const matchingAssets = release . assets . filter ( asset => asset . name === requiredAssetName ) ;
365379 if ( matchingAssets . length === 0 ) {
366380 // For example, this could be a release with only platform-specific assets.
367- logger . log ( " INFO: Ignoring a release with no assets named codeql.zip" ) ;
381+ logger . log ( ` INFO: Ignoring a release with no assets named ${ requiredAssetName } ` ) ;
368382 return false ;
369383 }
370384 if ( matchingAssets . length > 1 ) {
371- logger . log ( " WARNING: Ignoring a release with more than one asset named codeql.zip" ) ;
385+ logger . log ( ` WARNING: Ignoring a release with more than one asset named ${ requiredAssetName } ` ) ;
372386 return false ;
373387 }
374388 return true ;
375389 }
376390 ) ;
391+ // Actually filter assets to the unique one that we require.
392+ release . assets = release . assets . filter ( asset => asset . name === requiredAssetName ) ;
393+ if ( release . assets . length === 0 ) {
394+ throw new Error ( `Invariant violation: chose a release to install that didn't have ${ requiredAssetName } ` ) ;
395+ }
396+ if ( release . assets . length > 1 ) {
397+ logger . log ( 'WARNING: chose a release with more than one asset to install, found ' +
398+ release . assets . map ( asset => asset . name ) . join ( ', ' ) ) ;
399+ }
400+ return release ;
377401 }
378402
379403 private createReleasesApiConsumer ( ) : ReleasesApiConsumer {
0 commit comments