Post setRepoStates message when downloading

This commit is contained in:
Koen Vlaswinkel
2022-10-04 16:17:20 +02:00
parent 4138ca1085
commit 339fc9a755
4 changed files with 67 additions and 10 deletions

View File

@@ -2,7 +2,11 @@ import * as sarif from 'sarif';
import { AnalysisResults } from '../remote-queries/shared/analysis-result';
import { AnalysisSummary, RemoteQueryResult } from '../remote-queries/shared/remote-query-result';
import { RawResultSet, ResultRow, ResultSetSchema, Column, ResolvableLocationValue } from './bqrs-cli-types';
import { VariantAnalysis, VariantAnalysisScannedRepositoryResult } from '../remote-queries/shared/variant-analysis';
import {
VariantAnalysis,
VariantAnalysisScannedRepositoryResult,
VariantAnalysisScannedRepositoryState,
} from '../remote-queries/shared/variant-analysis';
/**
* This module contains types and code that are shared between
@@ -441,9 +445,15 @@ export interface SetRepoResultsMessage {
repoResults: VariantAnalysisScannedRepositoryResult[];
}
export interface SetRepoStatesMessage {
t: 'setRepoStates';
repoStates: VariantAnalysisScannedRepositoryState[];
}
export type ToVariantAnalysisMessage =
| SetVariantAnalysisMessage
| SetRepoResultsMessage;
| SetRepoResultsMessage
| SetRepoStatesMessage;
export type FromVariantAnalysisMessage =
| ViewLoadedMsg;

View File

@@ -82,6 +82,18 @@ export interface VariantAnalysisSkippedRepository {
private?: boolean,
}
export enum VariantAnalysisScannedRepositoryDownloadStatus {
Pending = 'pending',
InProgress = 'inProgress',
Succeeded = 'succeeded',
Failed = 'failed',
}
export interface VariantAnalysisScannedRepositoryState {
repositoryId: number;
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus;
}
export interface VariantAnalysisScannedRepositoryResult {
repositoryId: number;
interpretedResults?: AnalysisAlert[];

View File

@@ -11,7 +11,11 @@ import {
VariantAnalysisRepoTask,
VariantAnalysisScannedRepository as ApiVariantAnalysisScannedRepository
} from './gh-api/variant-analysis';
import { VariantAnalysis } from './shared/variant-analysis';
import {
VariantAnalysis,
VariantAnalysisScannedRepositoryDownloadStatus,
VariantAnalysisScannedRepositoryState
} from './shared/variant-analysis';
import { getErrorMessage } from '../pure/helpers-pure';
import { VariantAnalysisView } from './variant-analysis-view';
import { VariantAnalysisViewManager } from './variant-analysis-view-manager';
@@ -52,17 +56,20 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
this.views.delete(view.variantAnalysisId);
}
public getView(variantAnalysisId: number): VariantAnalysisView | undefined {
return this.views.get(variantAnalysisId);
}
private async onVariantAnalysisUpdated(variantAnalysis: VariantAnalysis | undefined): Promise<void> {
if (!variantAnalysis) {
return;
}
const view = this.views.get(variantAnalysis.id);
if (!view) {
return;
}
await this.getView(variantAnalysis.id)?.updateView(variantAnalysis);
}
await view.updateView(variantAnalysis);
private async onRepoStateUpdated(variantAnalysisId: number, repoState: VariantAnalysisScannedRepositoryState): Promise<void> {
await this.getView(variantAnalysisId)?.updateRepoState(repoState);
}
public async monitorVariantAnalysis(
@@ -77,11 +84,19 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
variantAnalysisSummary: VariantAnalysisApiResponse,
cancellationToken: CancellationToken
): Promise<void> {
const repoState = {
repositoryId: scannedRepo.repository.id,
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus.Pending,
};
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
const credentials = await Credentials.initialize(this.ctx);
if (!credentials) { throw Error('Error authenticating with GitHub'); }
if (cancellationToken && cancellationToken.isCancellationRequested) {
repoState.downloadStatus = VariantAnalysisScannedRepositoryDownloadStatus.Failed;
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
return;
}
@@ -93,10 +108,16 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
variantAnalysisSummary.id,
scannedRepo.repository.id
);
} catch (e) {
repoState.downloadStatus = VariantAnalysisScannedRepositoryDownloadStatus.Failed;
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
throw new Error(`Could not download the results for variant analysis with id: ${variantAnalysisSummary.id}. Error: ${getErrorMessage(e)}`);
}
catch (e) { throw new Error(`Could not download the results for variant analysis with id: ${variantAnalysisSummary.id}. Error: ${getErrorMessage(e)}`); }
if (repoTask.artifact_url) {
repoState.downloadStatus = VariantAnalysisScannedRepositoryDownloadStatus.InProgress;
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
const resultDirectory = path.join(
this.ctx.globalStorageUri.fsPath,
'variant-analyses',
@@ -117,5 +138,8 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
fs.mkdirSync(resultDirectory, { recursive: true });
await fs.writeFile(storagePath, JSON.stringify(result, null, 2), 'utf8');
}
repoState.downloadStatus = VariantAnalysisScannedRepositoryDownloadStatus.Succeeded;
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
}
}

View File

@@ -3,7 +3,7 @@ import { AbstractWebview, WebviewPanelConfig } from '../abstract-webview';
import { WebviewMessage } from '../interface-utils';
import { logger } from '../logging';
import { VariantAnalysisViewInterface, VariantAnalysisViewManager } from './variant-analysis-view-manager';
import { VariantAnalysis } from './shared/variant-analysis';
import { VariantAnalysis, VariantAnalysisScannedRepositoryState } from './shared/variant-analysis';
import { FromVariantAnalysisMessage, ToVariantAnalysisMessage } from '../pure/interface-types';
export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessage, FromVariantAnalysisMessage> implements VariantAnalysisViewInterface {
@@ -32,6 +32,17 @@ export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessag
});
}
public async updateRepoState(repoState: VariantAnalysisScannedRepositoryState): Promise<void> {
if (!this.isShowingPanel) {
return;
}
await this.postMessage({
t: 'setRepoStates',
repoStates: [repoState],
});
}
protected getPanelConfig(): WebviewPanelConfig {
return {
viewId: 'variantAnalysisView',