Skip to content

Commit 88edcaf

Browse files
authored
Merge pull request #1621 from github/norascheuch/variant-analysis-rehydrate-and-remove-event
Implement rehydration for variant analysis
2 parents da63b99 + 1523bab commit 88edcaf

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

extensions/ql-vscode/src/query-history.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,15 @@ export class QueryHistoryManager extends DisposableObject {
611611
await this.refreshTreeView();
612612
});
613613

614+
const variantAnalysisRemovedSubscription = this.variantAnalysisManager.onVariantAnalysisRemoved(async (variantAnalysis) => {
615+
const item = this.treeDataProvider.allHistory.find(i => i.t === 'variant-analysis' && i.variantAnalysis.id === variantAnalysis.id);
616+
if (item) {
617+
await this.removeRemoteQuery(item as RemoteQueryHistoryItem);
618+
}
619+
});
620+
614621
this.push(variantAnalysisAddedSubscription);
622+
this.push(variantAnalysisRemovedSubscription);
615623
}
616624

617625
private registerToRemoteQueriesEvents() {
@@ -663,6 +671,9 @@ export class QueryHistoryManager extends DisposableObject {
663671
if (item.t === 'remote') {
664672
await this.remoteQueriesManager.rehydrateRemoteQuery(item.queryId, item.remoteQuery, item.status);
665673
}
674+
if (item.t === 'variant-analysis') {
675+
await this.variantAnalysisManager.rehydrateVariantAnalysis(item.variantAnalysis, item.status);
676+
}
666677
});
667678
}
668679

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,17 @@ import { getControllerRepo } from './run-remote-query';
2626
import { processUpdatedVariantAnalysis } from './variant-analysis-processor';
2727
import PQueue from 'p-queue';
2828
import { createTimestampFile } from '../helpers';
29+
import { QueryStatus } from '../query-status';
30+
import * as fs from 'fs-extra';
31+
2932

3033
export class VariantAnalysisManager extends DisposableObject implements VariantAnalysisViewManager<VariantAnalysisView> {
3134
private readonly _onVariantAnalysisAdded = this.push(new EventEmitter<VariantAnalysis>());
3235
public readonly onVariantAnalysisAdded = this._onVariantAnalysisAdded.event;
3336

37+
private readonly _onVariantAnalysisRemoved = this.push(new EventEmitter<VariantAnalysis>());
38+
public readonly onVariantAnalysisRemoved = this._onVariantAnalysisRemoved.event;
39+
3440
private readonly variantAnalysisMonitor: VariantAnalysisMonitor;
3541
private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager;
3642
private readonly variantAnalyses = new Map<number, VariantAnalysis>();
@@ -52,6 +58,18 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
5258
this.variantAnalysisResultsManager.onResultLoaded(this.onRepoResultLoaded.bind(this));
5359
}
5460

61+
public async rehydrateVariantAnalysis(variantAnalysis: VariantAnalysis, status: QueryStatus) {
62+
if (!(await this.variantAnalysisRecordExists(variantAnalysis.id))) {
63+
// In this case, the variant analysis was deleted from disk, most likely because
64+
// it was purged by another workspace.
65+
this._onVariantAnalysisRemoved.fire(variantAnalysis);
66+
} else if (status === QueryStatus.InProgress) {
67+
// In this case, last time we checked, the query was still in progress.
68+
// We need to setup the monitor to check for completion.
69+
await commands.executeCommand('codeQL.monitorVariantAnalysis', variantAnalysis);
70+
}
71+
}
72+
5573
public async showView(variantAnalysisId: number): Promise<void> {
5674
if (!this.views.has(variantAnalysisId)) {
5775
// The view will register itself with the manager, so we don't need to do anything here.
@@ -92,6 +110,11 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
92110
await this.variantAnalysisResultsManager.loadResults(variantAnalysisId, this.getVariantAnalysisStorageLocation(variantAnalysisId), repositoryFullName);
93111
}
94112

113+
private async variantAnalysisRecordExists(variantAnalysisId: number): Promise<boolean> {
114+
const filePath = this.getVariantAnalysisStorageLocation(variantAnalysisId);
115+
return await fs.pathExists(filePath);
116+
}
117+
95118
private async onVariantAnalysisUpdated(variantAnalysis: VariantAnalysis | undefined): Promise<void> {
96119
if (!variantAnalysis) {
97120
return;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ describe('query-history', () => {
6767
} as any as RemoteQueriesManager;
6868

6969
variantAnalysisManagerStub = {
70-
onVariantAnalysisAdded: sandbox.stub()
70+
onVariantAnalysisAdded: sandbox.stub(),
71+
onVariantAnalysisRemoved: sandbox.stub()
7172
} as any as VariantAnalysisManager;
7273
});
7374

extensions/ql-vscode/src/vscode-tests/no-workspace/remote-queries/remote-query-history.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ describe('Remote queries and query history manager', function() {
7777
} as any as RemoteQueriesManager;
7878

7979
variantAnalysisManagerStub = {
80-
onVariantAnalysisAdded: sandbox.stub()
80+
onVariantAnalysisAdded: sandbox.stub(),
81+
onVariantAnalysisRemoved: sandbox.stub()
8182
} as any as VariantAnalysisManager;
8283
});
8384

0 commit comments

Comments
 (0)