Skip to content

Commit 71d4038

Browse files
committed
Use version ranges instead of version constraint for simplicity
1 parent 034d8b7 commit 71d4038

File tree

3 files changed

+25
-39
lines changed

3 files changed

+25
-39
lines changed

extensions/ql-vscode/src/distribution.ts

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,31 +36,28 @@ const DEFAULT_DISTRIBUTION_OWNER_NAME = "github";
3636
const DEFAULT_DISTRIBUTION_REPOSITORY_NAME = "codeql-cli-binaries";
3737

3838
/**
39-
* Version constraint for the CLI.
39+
* Range of versions of the CLI that are compatible with the extension.
4040
*
4141
* This applies to both extension-managed and CLI distributions.
4242
*/
43-
export const DEFAULT_DISTRIBUTION_VERSION_CONSTRAINT: VersionConstraint = {
44-
description: "2.*.*",
45-
isVersionCompatible: (v: semver.SemVer) => semver.satisfies(v, "2.x")
46-
};
43+
export const DEFAULT_DISTRIBUTION_VERSION_RANGE: semver.Range = new semver.Range("2.x");
4744

4845
export interface DistributionProvider {
4946
getCodeQlPathWithoutVersionCheck(): Promise<string | undefined>;
5047
onDidChangeDistribution?: Event<void>;
5148
}
5249

5350
export class DistributionManager implements DistributionProvider {
54-
constructor(extensionContext: ExtensionContext, config: DistributionConfig, versionConstraint: VersionConstraint) {
51+
constructor(extensionContext: ExtensionContext, config: DistributionConfig, versionRange: semver.Range) {
5552
this._config = config;
56-
this._extensionSpecificDistributionManager = new ExtensionSpecificDistributionManager(extensionContext, config, versionConstraint);
53+
this._extensionSpecificDistributionManager = new ExtensionSpecificDistributionManager(extensionContext, config, versionRange);
5754
this._onDidChangeDistribution = config.onDidChangeDistributionConfiguration;
5855
this._updateCheckRateLimiter = new InvocationRateLimiter(
5956
extensionContext,
6057
"extensionSpecificDistributionUpdateCheck",
6158
() => this._extensionSpecificDistributionManager.checkForUpdatesToDistribution()
6259
);
63-
this._versionConstraint = versionConstraint;
60+
this._versionRange = versionRange;
6461
}
6562

6663
/**
@@ -74,17 +71,17 @@ export class DistributionManager implements DistributionProvider {
7471
};
7572
}
7673
const version = await getCodeQlCliVersion(codeQlPath, logger);
77-
if (version !== undefined && !this._versionConstraint.isVersionCompatible(version)) {
74+
if (version === undefined) {
7875
return {
7976
codeQlPath,
80-
kind: FindDistributionResultKind.IncompatibleDistribution,
81-
version,
77+
kind: FindDistributionResultKind.UnknownCompatibilityDistribution,
8278
};
8379
}
84-
if (version === undefined) {
80+
if (!semver.satisfies(version, this._versionRange)) {
8581
return {
8682
codeQlPath,
87-
kind: FindDistributionResultKind.UnknownCompatibilityDistribution,
83+
kind: FindDistributionResultKind.IncompatibleDistribution,
84+
version,
8885
};
8986
}
9087
return {
@@ -197,14 +194,14 @@ export class DistributionManager implements DistributionProvider {
197194
private readonly _extensionSpecificDistributionManager: ExtensionSpecificDistributionManager;
198195
private readonly _updateCheckRateLimiter: InvocationRateLimiter<DistributionUpdateCheckResult>;
199196
private readonly _onDidChangeDistribution: Event<void> | undefined;
200-
private readonly _versionConstraint: VersionConstraint;
197+
private readonly _versionRange: semver.Range;
201198
}
202199

203200
class ExtensionSpecificDistributionManager {
204-
constructor(extensionContext: ExtensionContext, config: DistributionConfig, versionConstraint: VersionConstraint) {
201+
constructor(extensionContext: ExtensionContext, config: DistributionConfig, versionRange: semver.Range) {
205202
this._extensionContext = extensionContext;
206203
this._config = config;
207-
this._versionConstraint = versionConstraint;
204+
this._versionRange = versionRange;
208205
}
209206

210207
public async getCodeQlPathWithoutVersionCheck(): Promise<string | undefined> {
@@ -325,7 +322,7 @@ class ExtensionSpecificDistributionManager {
325322
}
326323

327324
private async getLatestRelease(): Promise<Release> {
328-
const release = await this.createReleasesApiConsumer().getLatestRelease(this._versionConstraint, this._config.includePrerelease);
325+
const release = await this.createReleasesApiConsumer().getLatestRelease(this._versionRange, this._config.includePrerelease);
329326
// FIXME: Look for platform-specific codeql distribution if available
330327
release.assets = release.assets.filter(asset => asset.name === 'codeql.zip');
331328
if (release.assets.length === 0) {
@@ -373,7 +370,7 @@ class ExtensionSpecificDistributionManager {
373370

374371
private readonly _config: DistributionConfig;
375372
private readonly _extensionContext: ExtensionContext;
376-
private readonly _versionConstraint: VersionConstraint;
373+
private readonly _versionRange: semver.Range;
377374

378375
private static readonly _currentDistributionFolderBaseName = "distribution";
379376
private static readonly _currentDistributionFolderIndexStateKey = "distributionFolderIndex";
@@ -394,7 +391,7 @@ export class ReleasesApiConsumer {
394391
this._repoName = repoName;
395392
}
396393

397-
public async getLatestRelease(versionConstraint: VersionConstraint, includePrerelease = false): Promise<Release> {
394+
public async getLatestRelease(versionRange: semver.Range, includePrerelease = false): Promise<Release> {
398395
const apiPath = `/repos/${this._ownerName}/${this._repoName}/releases`;
399396
const allReleases: GithubRelease[] = await (await this.makeApiCall(apiPath)).json();
400397
const compatibleReleases = allReleases.filter(release => {
@@ -403,7 +400,7 @@ export class ReleasesApiConsumer {
403400
}
404401

405402
const version = semver.parse(release.tag_name);
406-
return version !== null && versionConstraint.isVersionCompatible(version);
403+
return version !== null && semver.satisfies(version, versionRange);
407404
});
408405
// Tag names must all be parsable to semvers due to the previous filtering step.
409406
const latestRelease = compatibleReleases.sort((a, b) => {
@@ -739,11 +736,6 @@ export interface GithubReleaseAsset {
739736
size: number;
740737
}
741738

742-
interface VersionConstraint {
743-
description: string;
744-
isVersionCompatible(version: semver.SemVer): boolean;
745-
}
746-
747739
export class GithubApiError extends Error {
748740
constructor(public status: number, public body: string) {
749741
super(`API call failed with status code ${status}, body: ${body}`);

extensions/ql-vscode/src/extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as languageSupport from './languageSupport';
88
import { DatabaseManager } from './databases';
99
import { DatabaseUI } from './databases-ui';
1010
import { TemplateQueryDefinitionProvider, TemplateQueryReferenceProvider } from './definitions';
11-
import { DEFAULT_DISTRIBUTION_VERSION_CONSTRAINT, DistributionManager, DistributionUpdateCheckResultKind, FindDistributionResult, FindDistributionResultKind, GithubApiError, GithubRateLimitedError } from './distribution';
11+
import { DEFAULT_DISTRIBUTION_VERSION_RANGE, DistributionManager, DistributionUpdateCheckResultKind, FindDistributionResult, FindDistributionResultKind, GithubApiError, GithubRateLimitedError } from './distribution';
1212
import * as helpers from './helpers';
1313
import { assertNever } from './helpers-pure';
1414
import { spawnIdeServer } from './ide-server';
@@ -83,7 +83,7 @@ export async function activate(ctx: ExtensionContext): Promise<void> {
8383

8484
const distributionConfigListener = new DistributionConfigListener();
8585
ctx.subscriptions.push(distributionConfigListener);
86-
const distributionManager = new DistributionManager(ctx, distributionConfigListener, DEFAULT_DISTRIBUTION_VERSION_CONSTRAINT);
86+
const distributionManager = new DistributionManager(ctx, distributionConfigListener, DEFAULT_DISTRIBUTION_VERSION_RANGE);
8787

8888
const shouldUpdateOnNextActivationKey = "shouldUpdateOnNextActivation";
8989

extensions/ql-vscode/src/vscode-tests/no-workspace/distribution.test.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,7 @@ describe("Releases API consumer", () => {
5151
"tag_name": "v3.1.2-pre"
5252
},
5353
];
54-
const unconstrainedVersionConstraint = {
55-
description: "*",
56-
isVersionCompatible: () => true
57-
};
54+
const unconstrainedVersionRange = new semver.Range("*");
5855

5956
it("picking latest release: is based on version", async () => {
6057
class MockReleasesApiConsumer extends ReleasesApiConsumer {
@@ -68,11 +65,11 @@ describe("Releases API consumer", () => {
6865

6966
const consumer = new MockReleasesApiConsumer(owner, repo);
7067

71-
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionConstraint);
68+
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange);
7269
expect(latestRelease.id).to.equal(2);
7370
});
7471

75-
it("picking latest release: obeys version constraints", async () => {
72+
it("picking latest release: version satisfies version range", async () => {
7673
class MockReleasesApiConsumer extends ReleasesApiConsumer {
7774
protected async makeApiCall(apiPath: string): Promise<fetch.Response> {
7875
if (apiPath === `/repos/${owner}/${repo}/releases`) {
@@ -84,10 +81,7 @@ describe("Releases API consumer", () => {
8481

8582
const consumer = new MockReleasesApiConsumer(owner, repo);
8683

87-
const latestRelease = await consumer.getLatestRelease({
88-
description: "2.*.*",
89-
isVersionCompatible: version => semver.satisfies(version, "2.x")
90-
});
84+
const latestRelease = await consumer.getLatestRelease(new semver.Range("2.*.*"));
9185
expect(latestRelease.id).to.equal(1);
9286
});
9387

@@ -103,7 +97,7 @@ describe("Releases API consumer", () => {
10397

10498
const consumer = new MockReleasesApiConsumer(owner, repo);
10599

106-
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionConstraint, true);
100+
const latestRelease = await consumer.getLatestRelease(unconstrainedVersionRange, true);
107101
expect(latestRelease.id).to.equal(4);
108102
});
109103

@@ -141,7 +135,7 @@ describe("Releases API consumer", () => {
141135

142136
const consumer = new MockReleasesApiConsumer(owner, repo);
143137

144-
const assets = (await consumer.getLatestRelease(unconstrainedVersionConstraint)).assets;
138+
const assets = (await consumer.getLatestRelease(unconstrainedVersionRange)).assets;
145139

146140
expect(assets.length).to.equal(expectedAssets.length);
147141
expectedAssets.map((expectedAsset, index) => {

0 commit comments

Comments
 (0)