Skip to content

Commit c29f4d4

Browse files
committed
Download platform-specific releases if they are available.
1 parent 71f74cb commit c29f4d4

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

extensions/ql-vscode/src/distribution.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)