Skip to content

Commit 1bb68d6

Browse files
committed
Merge branch 'main' into shati-patel/query-history-get-id
2 parents fd13c35 + fa4766f commit 1bb68d6

File tree

9 files changed

+168
-33
lines changed

9 files changed

+168
-33
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ jobs:
139139
strategy:
140140
matrix:
141141
os: [ubuntu-latest, windows-latest]
142-
version: ['v2.6.3', 'v2.7.6', 'v2.8.5', 'v2.9.4', 'v2.10.5', 'v2.11.1', 'nightly']
142+
version: ['v2.7.6', 'v2.8.5', 'v2.9.4', 'v2.10.5', 'v2.11.1', 'nightly']
143143
env:
144144
CLI_VERSION: ${{ matrix.version }}
145145
NIGHTLY_URL: ${{ needs.find-nightly.outputs.url }}

extensions/ql-vscode/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# CodeQL for Visual Studio Code: Changelog
22

3+
## [UNRELEASED]
4+
35
## 1.7.2 - 14 October 2022
46

57
- Fix a bug where results created in older versions were thought to be unsuccessful. [#1605](https://github.com/github/vscode-codeql/pull/1605)

extensions/ql-vscode/package-lock.json

Lines changed: 38 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extensions/ql-vscode/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "CodeQL for Visual Studio Code",
55
"author": "GitHub",
66
"private": true,
7-
"version": "1.7.2",
7+
"version": "1.7.3",
88
"publisher": "GitHub",
99
"license": "MIT",
1010
"icon": "media/VS-marketplace-CodeQL-icon.png",
@@ -1230,6 +1230,7 @@
12301230
"minimist": "~1.2.6",
12311231
"nanoid": "^3.2.0",
12321232
"node-fetch": "~2.6.7",
1233+
"p-queue": "^6.0.0",
12331234
"path-browserify": "^1.0.1",
12341235
"react": "^17.0.2",
12351236
"react-dom": "^17.0.2",

extensions/ql-vscode/src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,7 @@ async function activateWithInstalledDistribution(
951951
variantAnalysisSummary: VariantAnalysisApiResponse,
952952
token: CancellationToken
953953
) => {
954-
await variantAnalysisManager.autoDownloadVariantAnalysisResult(scannedRepo, variantAnalysisSummary, token);
954+
await variantAnalysisManager.enqueueDownload(scannedRepo, variantAnalysisSummary, token);
955955
})
956956
);
957957

extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { VariantAnalysisResultsManager } from './variant-analysis-results-manage
2222
import { CodeQLCliServer } from '../cli';
2323
import { getControllerRepo } from './run-remote-query';
2424
import { processUpdatedVariantAnalysis } from './variant-analysis-processor';
25+
import PQueue from 'p-queue';
2526

2627
export class VariantAnalysisManager extends DisposableObject implements VariantAnalysisViewManager<VariantAnalysisView> {
2728
private readonly _onVariantAnalysisAdded = this.push(new EventEmitter<VariantAnalysis>());
@@ -31,6 +32,8 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
3132
private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager;
3233
private readonly variantAnalyses = new Map<number, VariantAnalysis>();
3334
private readonly views = new Map<number, VariantAnalysisView>();
35+
private static readonly maxConcurrentDownloads = 3;
36+
private readonly queue = new PQueue({ concurrency: VariantAnalysisManager.maxConcurrentDownloads });
3437

3538
constructor(
3639
private readonly ctx: ExtensionContext,
@@ -39,7 +42,7 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
3942
logger: Logger,
4043
) {
4144
super();
42-
this.variantAnalysisMonitor = this.push(new VariantAnalysisMonitor(ctx, logger));
45+
this.variantAnalysisMonitor = this.push(new VariantAnalysisMonitor(ctx));
4346
this.variantAnalysisMonitor.onVariantAnalysisChange(this.onVariantAnalysisUpdated.bind(this));
4447

4548
this.variantAnalysisResultsManager = this.push(new VariantAnalysisResultsManager(cliServer, storagePath, logger));
@@ -161,6 +164,18 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
161164
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
162165
}
163166

167+
public async enqueueDownload(
168+
scannedRepo: ApiVariantAnalysisScannedRepository,
169+
variantAnalysisSummary: VariantAnalysisApiResponse,
170+
token: CancellationToken
171+
): Promise<void> {
172+
await this.queue.add(() => this.autoDownloadVariantAnalysisResult(scannedRepo, variantAnalysisSummary, token));
173+
}
174+
175+
public downloadsQueueSize(): number {
176+
return this.queue.pending;
177+
}
178+
164179
public async promptOpenVariantAnalysis() {
165180
const credentials = await Credentials.initialize(this.ctx);
166181
if (!credentials) { throw Error('Error authenticating with GitHub'); }

extensions/ql-vscode/src/remote-queries/variant-analysis-monitor.ts

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { ExtensionContext, CancellationToken, commands, EventEmitter } from 'vscode';
22
import { Credentials } from '../authentication';
3-
import { Logger } from '../logging';
43
import * as ghApiClient from './gh-api/gh-api-client';
54

65
import { VariantAnalysis, VariantAnalysisStatus } from './shared/variant-analysis';
76
import {
8-
VariantAnalysis as VariantAnalysisApiResponse
7+
VariantAnalysis as VariantAnalysisApiResponse,
8+
VariantAnalysisScannedRepository
99
} from './gh-api/variant-analysis';
1010
import { VariantAnalysisMonitorResult } from './shared/variant-analysis-monitor-result';
1111
import { processFailureReason, processUpdatedVariantAnalysis } from './variant-analysis-processor';
@@ -22,7 +22,6 @@ export class VariantAnalysisMonitor extends DisposableObject {
2222

2323
constructor(
2424
private readonly extensionContext: ExtensionContext,
25-
private readonly logger: Logger
2625
) {
2726
super();
2827
}
@@ -73,16 +72,8 @@ export class VariantAnalysisMonitor extends DisposableObject {
7372

7473
this._onVariantAnalysisChange.fire(variantAnalysis);
7574

76-
void this.logger.log('****** Retrieved variant analysis' + JSON.stringify(variantAnalysisSummary));
77-
78-
if (variantAnalysisSummary.scanned_repositories) {
79-
variantAnalysisSummary.scanned_repositories.forEach(scannedRepo => {
80-
if (!scannedReposDownloaded.includes(scannedRepo.repository.id) && scannedRepo.analysis_status === 'succeeded') {
81-
void commands.executeCommand('codeQL.autoDownloadVariantAnalysisResult', scannedRepo, variantAnalysisSummary);
82-
scannedReposDownloaded.push(scannedRepo.repository.id);
83-
}
84-
});
85-
}
75+
const downloadedRepos = this.downloadVariantAnalysisResults(variantAnalysisSummary, scannedReposDownloaded);
76+
scannedReposDownloaded.push(...downloadedRepos);
8677

8778
if (variantAnalysisSummary.status === 'completed') {
8879
break;
@@ -94,6 +85,46 @@ export class VariantAnalysisMonitor extends DisposableObject {
9485
return { status: 'CompletedSuccessfully', scannedReposDownloaded: scannedReposDownloaded };
9586
}
9687

88+
private scheduleForDownload(
89+
scannedRepo: VariantAnalysisScannedRepository,
90+
variantAnalysisSummary: VariantAnalysisApiResponse
91+
) {
92+
void commands.executeCommand('codeQL.autoDownloadVariantAnalysisResult', scannedRepo, variantAnalysisSummary);
93+
}
94+
95+
private shouldDownload(
96+
scannedRepo: VariantAnalysisScannedRepository,
97+
alreadyDownloaded: number[]
98+
): boolean {
99+
return !alreadyDownloaded.includes(scannedRepo.repository.id) && scannedRepo.analysis_status === 'succeeded';
100+
}
101+
102+
private getReposToDownload(
103+
variantAnalysisSummary: VariantAnalysisApiResponse,
104+
alreadyDownloaded: number[]
105+
): VariantAnalysisScannedRepository[] {
106+
if (variantAnalysisSummary.scanned_repositories) {
107+
return variantAnalysisSummary.scanned_repositories.filter(scannedRepo => this.shouldDownload(scannedRepo, alreadyDownloaded));
108+
} else {
109+
return [];
110+
}
111+
}
112+
113+
private downloadVariantAnalysisResults(
114+
variantAnalysisSummary: VariantAnalysisApiResponse,
115+
scannedReposDownloaded: number[]
116+
): number[] {
117+
const repoResultsToDownload = this.getReposToDownload(variantAnalysisSummary, scannedReposDownloaded);
118+
const downloadedRepos: number[] = [];
119+
120+
repoResultsToDownload.forEach(scannedRepo => {
121+
downloadedRepos.push(scannedRepo.repository.id);
122+
this.scheduleForDownload(scannedRepo, variantAnalysisSummary);
123+
});
124+
125+
return downloadedRepos;
126+
}
127+
97128
private async sleep(ms: number) {
98129
return new Promise(resolve => setTimeout(resolve, ms));
99130
}

extensions/ql-vscode/src/vscode-tests/cli-integration/remote-queries/variant-analysis-manager.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,17 @@ describe('Variant Analysis Manager', async function() {
149149

150150
expect(getVariantAnalysisRepoResultStub.calledOnce).to.be.true;
151151
});
152+
153+
it('should pop download tasks off the queue', async () => {
154+
const getResultsSpy = sandbox.spy(variantAnalysisManager, 'autoDownloadVariantAnalysisResult');
155+
156+
await variantAnalysisManager.enqueueDownload(scannedRepos[0], variantAnalysis, cancellationTokenSource.token);
157+
await variantAnalysisManager.enqueueDownload(scannedRepos[1], variantAnalysis, cancellationTokenSource.token);
158+
await variantAnalysisManager.enqueueDownload(scannedRepos[2], variantAnalysis, cancellationTokenSource.token);
159+
160+
expect(variantAnalysisManager.downloadsQueueSize()).to.equal(0);
161+
expect(getResultsSpy).to.have.been.calledThrice;
162+
});
152163
});
153164
});
154165
});

0 commit comments

Comments
 (0)