Skip to content

Commit c26d786

Browse files
Emit variantAnalysisAdded event
When we first submit the variant analysis for processing, we'd like to update the query history panel. At the moment we're just adding the setup for triggering the event. In a future PR we'll consume this event and change the query history panel accordingly. In order for this to happen we will need to introduce a new `VariantAnalysisHistoryItem` type which will massage the data we get from the API into a type which the Query History panel can consume. Co-authored-by: Shati Patel <shati-patel@github.com>
1 parent b4fbfb6 commit c26d786

File tree

5 files changed

+42
-16
lines changed

5 files changed

+42
-16
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -467,16 +467,16 @@ async function activateWithInstalledDistribution(
467467
const localQueryResultsView = new ResultsView(ctx, dbm, cliServer, queryServerLogger, labelProvider);
468468
ctx.subscriptions.push(localQueryResultsView);
469469

470-
void logger.log('Initializing remote queries manager.');
471-
const rqm = new RemoteQueriesManager(ctx, cliServer, queryStorageDir, logger);
472-
ctx.subscriptions.push(rqm);
473-
474470
void logger.log('Initializing variant analysis manager.');
475471
const variantAnalysisStorageDir = path.join(ctx.globalStorageUri.fsPath, 'variant-analyses');
476472
await fs.ensureDir(variantAnalysisStorageDir);
477473
const variantAnalysisManager = new VariantAnalysisManager(ctx, cliServer, variantAnalysisStorageDir, logger);
478474
ctx.subscriptions.push(variantAnalysisManager);
479475

476+
void logger.log('Initializing remote queries manager.');
477+
const rqm = new RemoteQueriesManager(ctx, cliServer, queryStorageDir, logger, variantAnalysisManager);
478+
ctx.subscriptions.push(rqm);
479+
480480
void logger.log('Initializing query history.');
481481
const qhm = new QueryHistoryManager(
482482
qs,

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { assertNever } from '../pure/helpers-pure';
2222
import { QueryStatus } from '../query-status';
2323
import { DisposableObject } from '../pure/disposable-object';
2424
import { AnalysisResults } from './shared/analysis-result';
25+
import { VariantAnalysisManager } from './variant-analysis-manager';
2526

2627
const autoDownloadMaxSize = 300 * 1024;
2728
const autoDownloadMaxCount = 100;
@@ -56,18 +57,21 @@ export class RemoteQueriesManager extends DisposableObject {
5657

5758
private readonly remoteQueriesMonitor: RemoteQueriesMonitor;
5859
private readonly analysesResultsManager: AnalysesResultsManager;
60+
private readonly variantAnalysisManager: VariantAnalysisManager;
5961
private readonly view: RemoteQueriesView;
6062

6163
constructor(
6264
private readonly ctx: ExtensionContext,
6365
private readonly cliServer: CodeQLCliServer,
6466
private readonly storagePath: string,
6567
logger: Logger,
68+
variantAnalysisManager: VariantAnalysisManager,
6669
) {
6770
super();
6871
this.analysesResultsManager = new AnalysesResultsManager(ctx, cliServer, storagePath, logger);
6972
this.view = new RemoteQueriesView(ctx, logger, this.analysesResultsManager);
7073
this.remoteQueriesMonitor = new RemoteQueriesMonitor(ctx, logger);
74+
this.variantAnalysisManager = variantAnalysisManager;
7175

7276
this.remoteQueryAddedEventEmitter = this.push(new EventEmitter<NewQueryEvent>());
7377
this.remoteQueryRemovedEventEmitter = this.push(new EventEmitter<RemovedQueryEvent>());
@@ -123,7 +127,8 @@ export class RemoteQueriesManager extends DisposableObject {
123127
credentials, uri || window.activeTextEditor?.document.uri,
124128
false,
125129
progress,
126-
token);
130+
token,
131+
this.variantAnalysisManager);
127132

128133
if (querySubmission?.query) {
129134
const query = querySubmission.query;

extensions/ql-vscode/src/remote-queries/run-remote-query.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { getRepositorySelection, isValidSelection, RepositorySelection } from '.
2929
import { parseVariantAnalysisQueryLanguage, VariantAnalysisSubmission } from './shared/variant-analysis';
3030
import { Repository } from './shared/repository';
3131
import { processVariantAnalysis } from './variant-analysis-processor';
32+
import { VariantAnalysisManager } from './variant-analysis-manager';
3233

3334
export interface QlPack {
3435
name: string;
@@ -182,7 +183,8 @@ export async function runRemoteQuery(
182183
uri: Uri | undefined,
183184
dryRun: boolean,
184185
progress: ProgressCallback,
185-
token: CancellationToken
186+
token: CancellationToken,
187+
variantAnalysisManager: VariantAnalysisManager
186188
): Promise<void | RemoteQuerySubmissionResult> {
187189
if (!(await cliServer.cliConstraints.supportsRemoteQueries())) {
188190
throw new Error(`Variant analysis is not supported by this version of CodeQL. Please upgrade to v${cli.CliVersionConstraint.CLI_VERSION_REMOTE_QUERIES
@@ -273,6 +275,8 @@ export async function runRemoteQuery(
273275

274276
const processedVariantAnalysis = processVariantAnalysis(variantAnalysisSubmission, variantAnalysisResponse);
275277

278+
variantAnalysisManager.onVariantAnalysisSubmitted(processedVariantAnalysis);
279+
276280
void logger.log(`Variant analysis:\n${JSON.stringify(processedVariantAnalysis, null, 2)}`);
277281

278282
void showAndLogInformationMessage(`Variant analysis ${processedVariantAnalysis.query.name} submitted for processing`);

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as ghApiClient from './gh-api/gh-api-client';
2-
import { CancellationToken, ExtensionContext } from 'vscode';
2+
import { CancellationToken, EventEmitter, ExtensionContext } from 'vscode';
33
import { DisposableObject } from '../pure/disposable-object';
44
import { Logger } from '../logging';
55
import { Credentials } from '../authentication';
@@ -21,6 +21,9 @@ import { VariantAnalysisResultsManager } from './variant-analysis-results-manage
2121
import { CodeQLCliServer } from '../cli';
2222

2323
export class VariantAnalysisManager extends DisposableObject implements VariantAnalysisViewManager<VariantAnalysisView> {
24+
private readonly _onVariantAnalysisAdded = this.push(new EventEmitter<VariantAnalysis | undefined>());
25+
readonly onVariantAnalysisAdded = this._onVariantAnalysisAdded.event;
26+
2427
private readonly variantAnalysisMonitor: VariantAnalysisMonitor;
2528
private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager;
2629
private readonly views = new Map<number, VariantAnalysisView>();
@@ -73,6 +76,10 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
7376
await this.getView(variantAnalysis.id)?.updateView(variantAnalysis);
7477
}
7578

79+
public onVariantAnalysisSubmitted(variantAnalysis: VariantAnalysis): void {
80+
this._onVariantAnalysisAdded.fire(variantAnalysis);
81+
}
82+
7683
private async onRepoStateUpdated(variantAnalysisId: number, repoState: VariantAnalysisScannedRepositoryState): Promise<void> {
7784
await this.getView(variantAnalysisId)?.updateRepoState(repoState);
7885
}

extensions/ql-vscode/src/vscode-tests/cli-integration/remote-queries/run-remote-query.test.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { assert, expect } from 'chai';
22
import * as path from 'path';
33
import * as sinon from 'sinon';
4-
import { CancellationTokenSource, extensions, QuickPickItem, Uri, window } from 'vscode';
4+
import { CancellationTokenSource, ExtensionContext, extensions, QuickPickItem, Uri, window } from 'vscode';
55
import * as fs from 'fs-extra';
66
import * as os from 'os';
77
import * as yaml from 'js-yaml';
@@ -21,6 +21,9 @@ import {
2121
import { Repository } from '../../../remote-queries/gh-api/repository';
2222
import { VariantAnalysisStatus } from '../../../remote-queries/shared/variant-analysis';
2323
import { createMockApiResponse } from '../../factories/remote-queries/gh-api/variant-analysis-api-response';
24+
import { createMockExtensionContext } from '../../no-workspace';
25+
import { VariantAnalysisManager } from '../../../remote-queries/variant-analysis-manager';
26+
import { OutputChannelLogger } from '../../../logging';
2427

2528
describe('Remote queries', function() {
2629
const baseDir = path.join(__dirname, '../../../../src/vscode-tests/cli-integration');
@@ -37,6 +40,9 @@ describe('Remote queries', function() {
3740
let showQuickPickSpy: sinon.SinonStub;
3841
let getRepositoryFromNwoStub: sinon.SinonStub;
3942
let liveResultsStub: sinon.SinonStub;
43+
let ctx: ExtensionContext;
44+
let logger: any;
45+
let variantAnalysisManager: VariantAnalysisManager;
4046

4147
// use `function` so we have access to `this`
4248
beforeEach(async function() {
@@ -49,6 +55,10 @@ describe('Remote queries', function() {
4955
throw new Error('Extension not initialized. Make sure cli is downloaded and installed properly.');
5056
}
5157

58+
ctx = createMockExtensionContext();
59+
logger = new OutputChannelLogger('test-logger');
60+
variantAnalysisManager = new VariantAnalysisManager(ctx, cli, 'fake-storage-dir', logger);
61+
5262
if (!(await cli.cliConstraints.supportsRemoteQueries())) {
5363
console.log(`Remote queries are not supported on CodeQL CLI v${CliVersionConstraint.CLI_VERSION_REMOTE_QUERIES
5464
}. Skipping this test.`);
@@ -94,7 +104,7 @@ describe('Remote queries', function() {
94104
it('should run a remote query that is part of a qlpack', async () => {
95105
const fileUri = getFile('data-remote-qlpack/in-pack.ql');
96106

97-
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token);
107+
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token, variantAnalysisManager);
98108
expect(querySubmissionResult).to.be.ok;
99109
const queryPackRootDir = querySubmissionResult!.queryDirPath!;
100110
printDirectoryContents(queryPackRootDir);
@@ -155,7 +165,7 @@ describe('Remote queries', function() {
155165
it('should run a remote query that is not part of a qlpack', async () => {
156166
const fileUri = getFile('data-remote-no-qlpack/in-pack.ql');
157167

158-
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token);
168+
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token, variantAnalysisManager);
159169
expect(querySubmissionResult).to.be.ok;
160170
const queryPackRootDir = querySubmissionResult!.queryDirPath!;
161171

@@ -218,7 +228,7 @@ describe('Remote queries', function() {
218228
it('should run a remote query that is nested inside a qlpack', async () => {
219229
const fileUri = getFile('data-remote-qlpack-nested/subfolder/in-pack.ql');
220230

221-
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token);
231+
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token, variantAnalysisManager);
222232
expect(querySubmissionResult).to.be.ok;
223233
const queryPackRootDir = querySubmissionResult!.queryDirPath!;
224234

@@ -280,7 +290,7 @@ describe('Remote queries', function() {
280290
it('should cancel a run before uploading', async () => {
281291
const fileUri = getFile('data-remote-no-qlpack/in-pack.ql');
282292

283-
const promise = runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token);
293+
const promise = runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token, variantAnalysisManager);
284294

285295
cancellationTokenSource.token.isCancellationRequested = true;
286296

@@ -306,7 +316,7 @@ describe('Remote queries', function() {
306316
it('should run a variant analysis that is part of a qlpack', async () => {
307317
const fileUri = getFile('data-remote-qlpack/in-pack.ql');
308318

309-
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token);
319+
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token, variantAnalysisManager);
310320
expect(querySubmissionResult).to.be.ok;
311321
const variantAnalysis = querySubmissionResult!.variantAnalysis!;
312322
expect(variantAnalysis.id).to.be.equal(mockApiResponse.id);
@@ -319,7 +329,7 @@ describe('Remote queries', function() {
319329
it('should run a remote query that is not part of a qlpack', async () => {
320330
const fileUri = getFile('data-remote-no-qlpack/in-pack.ql');
321331

322-
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token);
332+
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token, variantAnalysisManager);
323333
expect(querySubmissionResult).to.be.ok;
324334
const variantAnalysis = querySubmissionResult!.variantAnalysis!;
325335
expect(variantAnalysis.id).to.be.equal(mockApiResponse.id);
@@ -332,7 +342,7 @@ describe('Remote queries', function() {
332342
it('should run a remote query that is nested inside a qlpack', async () => {
333343
const fileUri = getFile('data-remote-qlpack-nested/subfolder/in-pack.ql');
334344

335-
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token);
345+
const querySubmissionResult = await runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token, variantAnalysisManager);
336346
expect(querySubmissionResult).to.be.ok;
337347
const variantAnalysis = querySubmissionResult!.variantAnalysis!;
338348
expect(variantAnalysis.id).to.be.equal(mockApiResponse.id);
@@ -345,7 +355,7 @@ describe('Remote queries', function() {
345355
it('should cancel a run before uploading', async () => {
346356
const fileUri = getFile('data-remote-no-qlpack/in-pack.ql');
347357

348-
const promise = runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token);
358+
const promise = runRemoteQuery(cli, credentials, fileUri, true, progress, cancellationTokenSource.token, variantAnalysisManager);
349359

350360
cancellationTokenSource.token.isCancellationRequested = true;
351361

0 commit comments

Comments
 (0)