Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion extensions/ql-vscode/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ import {
import { VariantAnalysisManager } from './remote-queries/variant-analysis-manager';
import { createVariantAnalysisContentProvider } from './remote-queries/variant-analysis-content-provider';
import { MockGitHubApiServer } from './mocks/mock-gh-api-server';
import { VariantAnalysisResultsManager } from './remote-queries/variant-analysis-results-manager';

/**
* extension.ts
Expand Down Expand Up @@ -490,8 +491,10 @@ async function activateWithInstalledDistribution(
void logger.log('Initializing variant analysis manager.');
const variantAnalysisStorageDir = path.join(ctx.globalStorageUri.fsPath, 'variant-analyses');
await fs.ensureDir(variantAnalysisStorageDir);
const variantAnalysisManager = new VariantAnalysisManager(ctx, cliServer, variantAnalysisStorageDir, logger);
const variantAnalysisResultsManager = new VariantAnalysisResultsManager(cliServer, logger);
const variantAnalysisManager = new VariantAnalysisManager(ctx, variantAnalysisStorageDir, variantAnalysisResultsManager);
ctx.subscriptions.push(variantAnalysisManager);
ctx.subscriptions.push(variantAnalysisResultsManager);
ctx.subscriptions.push(workspace.registerTextDocumentContentProvider('codeql-variant-analysis', createVariantAnalysisContentProvider(variantAnalysisManager)));

void logger.log('Initializing remote queries manager.');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import * as path from 'path';
import * as ghApiClient from './gh-api/gh-api-client';
import { CancellationToken, commands, EventEmitter, ExtensionContext, window } from 'vscode';
import { DisposableObject } from '../pure/disposable-object';
import { Logger } from '../logging';
import { Credentials } from '../authentication';
import { VariantAnalysisMonitor } from './variant-analysis-monitor';
import {
Expand All @@ -21,7 +20,6 @@ import { getErrorMessage } from '../pure/helpers-pure';
import { VariantAnalysisView } from './variant-analysis-view';
import { VariantAnalysisViewManager } from './variant-analysis-view-manager';
import { VariantAnalysisResultsManager } from './variant-analysis-results-manager';
import { CodeQLCliServer } from '../cli';
import { getControllerRepo } from './run-remote-query';
import { processUpdatedVariantAnalysis } from './variant-analysis-processor';
import PQueue from 'p-queue';
Expand All @@ -40,29 +38,27 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
public readonly onVariantAnalysisRemoved = this._onVariantAnalysisRemoved.event;

private readonly variantAnalysisMonitor: VariantAnalysisMonitor;
private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager;
private readonly variantAnalyses = new Map<number, VariantAnalysis>();
private readonly views = new Map<number, VariantAnalysisView>();
private static readonly maxConcurrentDownloads = 3;
private readonly queue = new PQueue({ concurrency: VariantAnalysisManager.maxConcurrentDownloads });

constructor(
private readonly ctx: ExtensionContext,
cliServer: CodeQLCliServer,
private readonly storagePath: string,
logger: Logger,
private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager
) {
super();
this.variantAnalysisMonitor = this.push(new VariantAnalysisMonitor(ctx));
this.variantAnalysisMonitor.onVariantAnalysisChange(this.onVariantAnalysisUpdated.bind(this));

this.variantAnalysisResultsManager = this.push(new VariantAnalysisResultsManager(cliServer, logger));
this.variantAnalysisResultsManager = variantAnalysisResultsManager;
this.variantAnalysisResultsManager.onResultLoaded(this.onRepoResultLoaded.bind(this));
}

public async rehydrateVariantAnalysis(variantAnalysis: VariantAnalysis, status: QueryStatus) {
if (!(await this.variantAnalysisRecordExists(variantAnalysis.id))) {
// In this case, the variant analysis was deleted from disk, most likely because
// In this case, the variant analysis was deleted from disk, most likely because
// it was purged by another workspace.
this._onVariantAnalysisRemoved.fire(variantAnalysis);
} else if (status === QueryStatus.InProgress) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { createMockApiResponse } from '../../factories/remote-queries/gh-api/var
import { createMockExtensionContext } from '../../no-workspace';
import { VariantAnalysisManager } from '../../../remote-queries/variant-analysis-manager';
import { OutputChannelLogger } from '../../../logging';
import { VariantAnalysisResultsManager } from '../../../remote-queries/variant-analysis-results-manager';

describe('Remote queries', function() {
const baseDir = path.join(__dirname, '../../../../src/vscode-tests/cli-integration');
Expand All @@ -43,6 +44,7 @@ describe('Remote queries', function() {
let ctx: ExtensionContext;
let logger: any;
let variantAnalysisManager: VariantAnalysisManager;
let variantAnalysisResultsManager: VariantAnalysisResultsManager;

// use `function` so we have access to `this`
beforeEach(async function() {
Expand All @@ -57,7 +59,8 @@ describe('Remote queries', function() {

ctx = createMockExtensionContext();
logger = new OutputChannelLogger('test-logger');
variantAnalysisManager = new VariantAnalysisManager(ctx, cli, 'fake-storage-dir', logger);
variantAnalysisResultsManager = new VariantAnalysisResultsManager(cli, logger);
variantAnalysisManager = new VariantAnalysisManager(ctx, 'fake-storage-dir', variantAnalysisResultsManager);

if (!(await cli.cliConstraints.supportsRemoteQueries())) {
console.log(`Remote queries are not supported on CodeQL CLI v${CliVersionConstraint.CLI_VERSION_REMOTE_QUERIES
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { createMockScannedRepos } from '../../factories/remote-queries/gh-api/sc
import { createMockVariantAnalysisRepoTask } from '../../factories/remote-queries/gh-api/variant-analysis-repo-task';
import { CodeQLCliServer } from '../../../cli';
import { storagePath } from '../global.helper';
import { VariantAnalysisResultsManager } from '../../../remote-queries/variant-analysis-results-manager';

describe('Variant Analysis Manager', async function() {
let sandbox: sinon.SinonSandbox;
Expand All @@ -30,6 +31,7 @@ describe('Variant Analysis Manager', async function() {
let scannedRepos: ApiVariantAnalysisScannedRepository[];
let getVariantAnalysisRepoStub: sinon.SinonStub;
let getVariantAnalysisRepoResultStub: sinon.SinonStub;
let variantAnalysisResultsManager: VariantAnalysisResultsManager;

beforeEach(async () => {
sandbox = sinon.createSandbox();
Expand All @@ -46,7 +48,8 @@ describe('Variant Analysis Manager', async function() {
try {
const extension = await extensions.getExtension<CodeQLExtensionInterface | Record<string, never>>('GitHub.vscode-codeql')!.activate();
cli = extension.cliServer;
variantAnalysisManager = new VariantAnalysisManager(extension.ctx, cli, storagePath, logger);
variantAnalysisResultsManager = new VariantAnalysisResultsManager(cli, logger);
variantAnalysisManager = new VariantAnalysisManager(extension.ctx, storagePath, variantAnalysisResultsManager);
} catch (e) {
fail(e as Error);
}
Expand Down