Skip to content

Commit f18f1b0

Browse files
elenatanasoiucharisknorascheuch
committed
Implement handleRemoveHistoryItem for variant analysis history items
We had previously added a no-op placeholder for when we attempt to remove a variant analysis from our query history. This adds the implementation: - removes the item from the query history - cleans up any existing result files attached to the variant analysis NB: The remote queries would store all their results in a single folder. For variant analysis, we store results per repo. The folder names are build using a cache key and are stored in `cachedResults`. The cache key is built from the variant analysis id and the repo name. In order to delete the results, we've had to pass in the full variant analysis object to the manager and call `cacheResults.delete()` for each of its scanned repos. Co-authored-by: Charis Kyriakou <charisk@github.com> Co-authored-by: Nora Scheuch <norascheuch@github.com>
1 parent 50ec718 commit f18f1b0

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ export class QueryHistoryManager extends DisposableObject {
635635
const variantAnalysisRemovedSubscription = this.variantAnalysisManager.onVariantAnalysisRemoved(async (variantAnalysis) => {
636636
const items = this.treeDataProvider.allHistory.filter(i => i.t === 'variant-analysis' && i.variantAnalysis.id === variantAnalysis.id);
637637
items.forEach(async (item) => {
638-
await this.removeRemoteQuery(item as RemoteQueryHistoryItem);
638+
await this.removeVariantAnalysis(item as VariantAnalysisHistoryItem);
639639
});
640640
});
641641

@@ -786,7 +786,7 @@ export class QueryHistoryManager extends DisposableObject {
786786
} else if (item.t === 'remote') {
787787
await this.removeRemoteQuery(item);
788788
} else if (item.t === 'variant-analysis') {
789-
// TODO
789+
await this.removeVariantAnalysis(item);
790790
} else {
791791
assertNever(item);
792792
}
@@ -812,6 +812,18 @@ export class QueryHistoryManager extends DisposableObject {
812812
await this.remoteQueriesManager.removeRemoteQuery(item.queryId);
813813
}
814814

815+
private async removeVariantAnalysis(item: VariantAnalysisHistoryItem): Promise<void> {
816+
// Remote queries can be removed locally, but not remotely.
817+
// The user must cancel the query on GitHub Actions explicitly.
818+
this.treeDataProvider.remove(item);
819+
void logger.log(`Deleted ${this.labelProvider.getLabel(item)}.`);
820+
if (item.status === QueryStatus.InProgress) {
821+
void logger.log('The variant analysis is still running on GitHub Actions. To cancel there, you must go to the workflow run in your browser.');
822+
}
823+
824+
await this.variantAnalysisManager.removeVariantAnalysis(item.variantAnalysis);
825+
}
826+
815827
async handleSortByName() {
816828
if (this.treeDataProvider.sortOrder === SortOrder.NameAsc) {
817829
this.treeDataProvider.sortOrder = SortOrder.NameDesc;

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,17 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
7272
}
7373
}
7474

75+
public async removeVariantAnalysis(variantAnalysis: VariantAnalysis) {
76+
this.variantAnalysisResultsManager.removeAnalysesResults(variantAnalysis);
77+
await this.removeStorageDirectory(variantAnalysis.id);
78+
this.variantAnalyses.delete(variantAnalysis.id);
79+
}
80+
81+
private async removeStorageDirectory(variantAnalysisId: number) {
82+
const storageLocation = this.getVariantAnalysisStorageLocation(variantAnalysisId);
83+
await fs.remove(storageLocation);
84+
}
85+
7586
public async showView(variantAnalysisId: number): Promise<void> {
7687
if (!this.variantAnalyses.get(variantAnalysisId)) {
7788
void showAndLogErrorMessage(`No variant analysis found with id: ${variantAnalysisId}.`);

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { sarifParser } from '../sarif-parser';
99
import { extractAnalysisAlerts } from './sarif-processing';
1010
import { CodeQLCliServer } from '../cli';
1111
import { extractRawResults } from './bqrs-processing';
12-
import { VariantAnalysisScannedRepositoryResult } from './shared/variant-analysis';
12+
import { VariantAnalysis, VariantAnalysisScannedRepositoryResult } from './shared/variant-analysis';
1313
import { DisposableObject, DisposeHandler } from '../pure/disposable-object';
1414
import { VariantAnalysisRepoTask } from './gh-api/variant-analysis';
1515
import * as ghApiClient from './gh-api/gh-api-client';
@@ -179,6 +179,19 @@ export class VariantAnalysisResultsManager extends DisposableObject {
179179
return `https://github.com/${fullName}/blob/${sha}`;
180180
}
181181

182+
public removeAnalysesResults(variantAnalysis: VariantAnalysis) {
183+
const scannedRepos = variantAnalysis.scannedRepos;
184+
185+
if (scannedRepos) {
186+
scannedRepos.forEach(scannedRepo => {
187+
const cacheKey = createCacheKey(variantAnalysis.id, scannedRepo.repository.fullName);
188+
if (this.cachedResults.get(cacheKey)) {
189+
this.cachedResults.delete(cacheKey);
190+
}
191+
});
192+
}
193+
}
194+
182195
public dispose(disposeHandler?: DisposeHandler) {
183196
super.dispose(disposeHandler);
184197

0 commit comments

Comments
 (0)