Skip to content

Commit b062f61

Browse files
authored
Merge pull request #1716 from github/koesie10/use-shared-types-in-variant-analysis
Remove `gh-api` usage from variant analysis code
2 parents 1fdb1e2 + ae3c088 commit b062f61

File tree

11 files changed

+222
-107
lines changed

11 files changed

+222
-107
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,7 @@ import { NewQueryRunner } from './query-server/query-runner';
109109
import { QueryRunner } from './queryRunner';
110110
import { VariantAnalysisView } from './remote-queries/variant-analysis-view';
111111
import { VariantAnalysisViewSerializer } from './remote-queries/variant-analysis-view-serializer';
112-
import { VariantAnalysis } from './remote-queries/shared/variant-analysis';
113-
import {
114-
VariantAnalysis as VariantAnalysisApiResponse,
115-
VariantAnalysisScannedRepository as ApiVariantAnalysisScannedRepository
116-
} from './remote-queries/gh-api/variant-analysis';
112+
import { VariantAnalysis, VariantAnalysisScannedRepository } from './remote-queries/shared/variant-analysis';
117113
import { VariantAnalysisManager } from './remote-queries/variant-analysis-manager';
118114
import { createVariantAnalysisContentProvider } from './remote-queries/variant-analysis-content-provider';
119115
import { VSCodeMockGitHubApiServer } from './mocks/vscode-mock-gh-api-server';
@@ -949,8 +945,8 @@ async function activateWithInstalledDistribution(
949945

950946
ctx.subscriptions.push(
951947
commandRunner('codeQL.autoDownloadVariantAnalysisResult', async (
952-
scannedRepo: ApiVariantAnalysisScannedRepository,
953-
variantAnalysisSummary: VariantAnalysisApiResponse,
948+
scannedRepo: VariantAnalysisScannedRepository,
949+
variantAnalysisSummary: VariantAnalysis,
954950
token: CancellationToken
955951
) => {
956952
await variantAnalysisManager.enqueueDownload(scannedRepo, variantAnalysisSummary, token);

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,17 @@ export interface VariantAnalysisScannedRepository {
7676
failureMessage?: string
7777
}
7878

79+
export interface VariantAnalysisRepositoryTask {
80+
repository: Repository,
81+
analysisStatus: VariantAnalysisRepoStatus,
82+
resultCount?: number,
83+
artifactSizeInBytes?: number,
84+
failureMessage?: string,
85+
databaseCommitSha?: string,
86+
sourceLocationPrefix?: string,
87+
artifactUrl?: string,
88+
}
89+
7990
export interface VariantAnalysisSkippedRepositories {
8091
accessMismatchRepos?: VariantAnalysisSkippedRepositoryGroup,
8192
notFoundRepos?: VariantAnalysisSkippedRepositoryGroup,

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

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@ import { CancellationToken, commands, EventEmitter, ExtensionContext, window } f
55
import { DisposableObject } from '../pure/disposable-object';
66
import { Credentials } from '../authentication';
77
import { VariantAnalysisMonitor } from './variant-analysis-monitor';
8-
import {
9-
VariantAnalysis as VariantAnalysisApiResponse,
10-
VariantAnalysisRepoTask,
11-
VariantAnalysisScannedRepository as ApiVariantAnalysisScannedRepository
12-
} from './gh-api/variant-analysis';
138
import {
149
isVariantAnalysisComplete,
15-
VariantAnalysis, VariantAnalysisQueryLanguage,
10+
VariantAnalysis,
11+
VariantAnalysisQueryLanguage,
12+
VariantAnalysisRepositoryTask,
1613
VariantAnalysisScannedRepository,
1714
VariantAnalysisScannedRepositoryDownloadStatus,
1815
VariantAnalysisScannedRepositoryResult,
@@ -23,7 +20,7 @@ import { VariantAnalysisView } from './variant-analysis-view';
2320
import { VariantAnalysisViewManager } from './variant-analysis-view-manager';
2421
import { VariantAnalysisResultsManager } from './variant-analysis-results-manager';
2522
import { getControllerRepo } from './run-remote-query';
26-
import { processUpdatedVariantAnalysis } from './variant-analysis-processor';
23+
import { processUpdatedVariantAnalysis, processVariantAnalysisRepositoryTask } from './variant-analysis-processor';
2724
import PQueue from 'p-queue';
2825
import { createTimestampFile, showAndLogErrorMessage } from '../helpers';
2926
import * as fs from 'fs-extra';
@@ -179,57 +176,59 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
179176
}
180177

181178
public async autoDownloadVariantAnalysisResult(
182-
scannedRepo: ApiVariantAnalysisScannedRepository,
183-
variantAnalysisSummary: VariantAnalysisApiResponse,
179+
scannedRepo: VariantAnalysisScannedRepository,
180+
variantAnalysis: VariantAnalysis,
184181
cancellationToken: CancellationToken
185182
): Promise<void> {
186183
const repoState = {
187184
repositoryId: scannedRepo.repository.id,
188185
downloadStatus: VariantAnalysisScannedRepositoryDownloadStatus.Pending,
189186
};
190187

191-
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
188+
await this.onRepoStateUpdated(variantAnalysis.id, repoState);
192189

193190
const credentials = await Credentials.initialize(this.ctx);
194191
if (!credentials) { throw Error('Error authenticating with GitHub'); }
195192

196193
if (cancellationToken && cancellationToken.isCancellationRequested) {
197194
repoState.downloadStatus = VariantAnalysisScannedRepositoryDownloadStatus.Failed;
198-
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
195+
await this.onRepoStateUpdated(variantAnalysis.id, repoState);
199196
return;
200197
}
201198

202-
let repoTask: VariantAnalysisRepoTask;
199+
let repoTask: VariantAnalysisRepositoryTask;
203200
try {
204-
repoTask = await ghApiClient.getVariantAnalysisRepo(
201+
const repoTaskResponse = await ghApiClient.getVariantAnalysisRepo(
205202
credentials,
206-
variantAnalysisSummary.controller_repo.id,
207-
variantAnalysisSummary.id,
203+
variantAnalysis.controllerRepo.id,
204+
variantAnalysis.id,
208205
scannedRepo.repository.id
209206
);
207+
208+
repoTask = processVariantAnalysisRepositoryTask(repoTaskResponse);
210209
} catch (e) {
211210
repoState.downloadStatus = VariantAnalysisScannedRepositoryDownloadStatus.Failed;
212-
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
213-
throw new Error(`Could not download the results for variant analysis with id: ${variantAnalysisSummary.id}. Error: ${getErrorMessage(e)}`);
211+
await this.onRepoStateUpdated(variantAnalysis.id, repoState);
212+
throw new Error(`Could not download the results for variant analysis with id: ${variantAnalysis.id}. Error: ${getErrorMessage(e)}`);
214213
}
215214

216-
if (repoTask.artifact_url) {
215+
if (repoTask.artifactUrl) {
217216
repoState.downloadStatus = VariantAnalysisScannedRepositoryDownloadStatus.InProgress;
218-
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
217+
await this.onRepoStateUpdated(variantAnalysis.id, repoState);
219218

220-
await this.variantAnalysisResultsManager.download(credentials, variantAnalysisSummary.id, repoTask, this.getVariantAnalysisStorageLocation(variantAnalysisSummary.id));
219+
await this.variantAnalysisResultsManager.download(credentials, variantAnalysis.id, repoTask, this.getVariantAnalysisStorageLocation(variantAnalysis.id));
221220
}
222221

223222
repoState.downloadStatus = VariantAnalysisScannedRepositoryDownloadStatus.Succeeded;
224-
await this.onRepoStateUpdated(variantAnalysisSummary.id, repoState);
223+
await this.onRepoStateUpdated(variantAnalysis.id, repoState);
225224
}
226225

227226
public async enqueueDownload(
228-
scannedRepo: ApiVariantAnalysisScannedRepository,
229-
variantAnalysisSummary: VariantAnalysisApiResponse,
227+
scannedRepo: VariantAnalysisScannedRepository,
228+
variantAnalysis: VariantAnalysis,
230229
token: CancellationToken
231230
): Promise<void> {
232-
await this.queue.add(() => this.autoDownloadVariantAnalysisResult(scannedRepo, variantAnalysisSummary, token));
231+
await this.queue.add(() => this.autoDownloadVariantAnalysisResult(scannedRepo, variantAnalysis, token));
233232
}
234233

235234
public downloadsQueueSize(): number {

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import { ExtensionContext, CancellationToken, commands, EventEmitter } from 'vscode';
1+
import { CancellationToken, commands, EventEmitter, ExtensionContext } from 'vscode';
22
import { Credentials } from '../authentication';
33
import * as ghApiClient from './gh-api/gh-api-client';
44

5-
import { isFinalVariantAnalysisStatus, VariantAnalysis } from './shared/variant-analysis';
65
import {
7-
VariantAnalysis as VariantAnalysisApiResponse,
6+
isFinalVariantAnalysisStatus,
7+
VariantAnalysis,
8+
VariantAnalysisRepoStatus,
89
VariantAnalysisScannedRepository
9-
} from './gh-api/variant-analysis';
10+
} from './shared/variant-analysis';
1011
import { VariantAnalysisMonitorResult } from './shared/variant-analysis-monitor-result';
1112
import { processUpdatedVariantAnalysis } from './variant-analysis-processor';
1213
import { DisposableObject } from '../pure/disposable-object';
@@ -57,7 +58,7 @@ export class VariantAnalysisMonitor extends DisposableObject {
5758

5859
this._onVariantAnalysisChange.fire(variantAnalysis);
5960

60-
const downloadedRepos = this.downloadVariantAnalysisResults(variantAnalysisSummary, scannedReposDownloaded);
61+
const downloadedRepos = this.downloadVariantAnalysisResults(variantAnalysis, scannedReposDownloaded);
6162
scannedReposDownloaded.push(...downloadedRepos);
6263

6364
if (isFinalVariantAnalysisStatus(variantAnalysis.status) || variantAnalysis.failureReason) {
@@ -72,7 +73,7 @@ export class VariantAnalysisMonitor extends DisposableObject {
7273

7374
private scheduleForDownload(
7475
scannedRepo: VariantAnalysisScannedRepository,
75-
variantAnalysisSummary: VariantAnalysisApiResponse
76+
variantAnalysisSummary: VariantAnalysis
7677
) {
7778
void commands.executeCommand('codeQL.autoDownloadVariantAnalysisResult', scannedRepo, variantAnalysisSummary);
7879
}
@@ -81,22 +82,22 @@ export class VariantAnalysisMonitor extends DisposableObject {
8182
scannedRepo: VariantAnalysisScannedRepository,
8283
alreadyDownloaded: number[]
8384
): boolean {
84-
return !alreadyDownloaded.includes(scannedRepo.repository.id) && scannedRepo.analysis_status === 'succeeded';
85+
return !alreadyDownloaded.includes(scannedRepo.repository.id) && scannedRepo.analysisStatus === VariantAnalysisRepoStatus.Succeeded;
8586
}
8687

8788
private getReposToDownload(
88-
variantAnalysisSummary: VariantAnalysisApiResponse,
89+
variantAnalysisSummary: VariantAnalysis,
8990
alreadyDownloaded: number[]
9091
): VariantAnalysisScannedRepository[] {
91-
if (variantAnalysisSummary.scanned_repositories) {
92-
return variantAnalysisSummary.scanned_repositories.filter(scannedRepo => this.shouldDownload(scannedRepo, alreadyDownloaded));
92+
if (variantAnalysisSummary.scannedRepos) {
93+
return variantAnalysisSummary.scannedRepos.filter(scannedRepo => this.shouldDownload(scannedRepo, alreadyDownloaded));
9394
} else {
9495
return [];
9596
}
9697
}
9798

9899
private downloadVariantAnalysisResults(
99-
variantAnalysisSummary: VariantAnalysisApiResponse,
100+
variantAnalysisSummary: VariantAnalysis,
100101
scannedReposDownloaded: number[]
101102
): number[] {
102103
const repoResultsToDownload = this.getReposToDownload(variantAnalysisSummary, scannedReposDownloaded);

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

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {
66
VariantAnalysisFailureReason as ApiVariantAnalysisFailureReason,
77
VariantAnalysisStatus as ApiVariantAnalysisStatus,
88
VariantAnalysisSkippedRepositoryGroup as ApiVariantAnalysisSkippedRepositoryGroup,
9-
VariantAnalysisNotFoundRepositoryGroup as ApiVariantAnalysisNotFoundRepositoryGroup
9+
VariantAnalysisNotFoundRepositoryGroup as ApiVariantAnalysisNotFoundRepositoryGroup,
10+
VariantAnalysisRepoTask as ApiVariantAnalysisRepoTask,
1011
} from './gh-api/variant-analysis';
1112
import {
1213
VariantAnalysis,
@@ -16,7 +17,8 @@ import {
1617
VariantAnalysisStatus,
1718
VariantAnalysisRepoStatus,
1819
VariantAnalysisSubmission,
19-
VariantAnalysisSkippedRepositoryGroup
20+
VariantAnalysisSkippedRepositoryGroup,
21+
VariantAnalysisRepositoryTask
2022
} from './shared/variant-analysis';
2123

2224
export function processVariantAnalysis(
@@ -76,24 +78,47 @@ export function processUpdatedVariantAnalysis(
7678
return variantAnalysis;
7779
}
7880

81+
export function processVariantAnalysisRepositoryTask(
82+
response: ApiVariantAnalysisRepoTask
83+
): VariantAnalysisRepositoryTask {
84+
return {
85+
repository: {
86+
id: response.repository.id,
87+
fullName: response.repository.full_name,
88+
private: response.repository.private,
89+
},
90+
analysisStatus: processApiRepoStatus(response.analysis_status),
91+
resultCount: response.result_count,
92+
artifactSizeInBytes: response.artifact_size_in_bytes,
93+
failureMessage: response.failure_message,
94+
databaseCommitSha: response.database_commit_sha,
95+
sourceLocationPrefix: response.source_location_prefix,
96+
artifactUrl: response.artifact_url,
97+
};
98+
}
99+
100+
export function processScannedRepository(
101+
scannedRepo: ApiVariantAnalysisScannedRepository
102+
): VariantAnalysisScannedRepository {
103+
return {
104+
repository: {
105+
id: scannedRepo.repository.id,
106+
fullName: scannedRepo.repository.full_name,
107+
private: scannedRepo.repository.private,
108+
stargazersCount: scannedRepo.repository.stargazers_count,
109+
updatedAt: scannedRepo.repository.updated_at,
110+
},
111+
analysisStatus: processApiRepoStatus(scannedRepo.analysis_status),
112+
resultCount: scannedRepo.result_count,
113+
artifactSizeInBytes: scannedRepo.artifact_size_in_bytes,
114+
failureMessage: scannedRepo.failure_message
115+
};
116+
}
117+
79118
function processScannedRepositories(
80119
scannedRepos: ApiVariantAnalysisScannedRepository[]
81120
): VariantAnalysisScannedRepository[] {
82-
return scannedRepos.map(scannedRepo => {
83-
return {
84-
repository: {
85-
id: scannedRepo.repository.id,
86-
fullName: scannedRepo.repository.full_name,
87-
private: scannedRepo.repository.private,
88-
stargazersCount: scannedRepo.repository.stargazers_count,
89-
updatedAt: scannedRepo.repository.updated_at,
90-
},
91-
analysisStatus: processApiRepoStatus(scannedRepo.analysis_status),
92-
resultCount: scannedRepo.result_count,
93-
artifactSizeInBytes: scannedRepo.artifact_size_in_bytes,
94-
failureMessage: scannedRepo.failure_message
95-
};
96-
});
121+
return scannedRepos.map(scannedRepo => processScannedRepository(scannedRepo));
97122
}
98123

99124
function processSkippedRepositories(

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

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@ import { sarifParser } from '../sarif-parser';
99
import { extractAnalysisAlerts } from './sarif-processing';
1010
import { CodeQLCliServer } from '../cli';
1111
import { extractRawResults } from './bqrs-processing';
12-
import { VariantAnalysis, VariantAnalysisScannedRepositoryResult } from './shared/variant-analysis';
12+
import {
13+
VariantAnalysis,
14+
VariantAnalysisRepositoryTask,
15+
VariantAnalysisScannedRepositoryResult
16+
} from './shared/variant-analysis';
1317
import { DisposableObject, DisposeHandler } from '../pure/disposable-object';
14-
import { VariantAnalysisRepoTask } from './gh-api/variant-analysis';
1518
import * as ghApiClient from './gh-api/gh-api-client';
1619
import { EventEmitter } from 'vscode';
1720
import { unzipFile } from '../pure/zip';
@@ -22,7 +25,7 @@ const createCacheKey = (variantAnalysisId: number, repositoryFullName: string):
2225

2326
export type ResultDownloadedEvent = {
2427
variantAnalysisId: number;
25-
repoTask: VariantAnalysisRepoTask;
28+
repoTask: VariantAnalysisRepositoryTask;
2629
}
2730

2831
export class VariantAnalysisResultsManager extends DisposableObject {
@@ -48,18 +51,18 @@ export class VariantAnalysisResultsManager extends DisposableObject {
4851
public async download(
4952
credentials: Credentials,
5053
variantAnalysisId: number,
51-
repoTask: VariantAnalysisRepoTask,
54+
repoTask: VariantAnalysisRepositoryTask,
5255
variantAnalysisStoragePath: string,
5356
): Promise<void> {
54-
if (!repoTask.artifact_url) {
57+
if (!repoTask.artifactUrl) {
5558
throw new Error('Missing artifact URL');
5659
}
5760

58-
const resultDirectory = this.getRepoStorageDirectory(variantAnalysisStoragePath, repoTask.repository.full_name);
61+
const resultDirectory = this.getRepoStorageDirectory(variantAnalysisStoragePath, repoTask.repository.fullName);
5962

6063
const result = await ghApiClient.getVariantAnalysisRepoResult(
6164
credentials,
62-
repoTask.artifact_url
65+
repoTask.artifactUrl
6366
);
6467

6568
if (!(await fs.pathExists(resultDirectory))) {
@@ -112,13 +115,13 @@ export class VariantAnalysisResultsManager extends DisposableObject {
112115

113116
const storageDirectory = this.getRepoStorageDirectory(variantAnalysisStoragePath, repositoryFullName);
114117

115-
const repoTask: VariantAnalysisRepoTask = await fs.readJson(path.join(storageDirectory, VariantAnalysisResultsManager.REPO_TASK_FILENAME));
118+
const repoTask: VariantAnalysisRepositoryTask = await fs.readJson(path.join(storageDirectory, VariantAnalysisResultsManager.REPO_TASK_FILENAME));
116119

117-
if (!repoTask.database_commit_sha || !repoTask.source_location_prefix) {
120+
if (!repoTask.databaseCommitSha || !repoTask.sourceLocationPrefix) {
118121
throw new Error('Missing database commit SHA');
119122
}
120123

121-
const fileLinkPrefix = this.createGitHubDotcomFileLinkPrefix(repoTask.repository.full_name, repoTask.database_commit_sha);
124+
const fileLinkPrefix = this.createGitHubDotcomFileLinkPrefix(repoTask.repository.fullName, repoTask.databaseCommitSha);
122125

123126
const resultsDirectory = path.join(storageDirectory, VariantAnalysisResultsManager.RESULTS_DIRECTORY);
124127
const sarifPath = path.join(resultsDirectory, 'results.sarif');
@@ -134,7 +137,7 @@ export class VariantAnalysisResultsManager extends DisposableObject {
134137
}
135138

136139
if (await fs.pathExists(bqrsPath)) {
137-
const rawResults = await this.readBqrsResults(bqrsPath, fileLinkPrefix, repoTask.source_location_prefix);
140+
const rawResults = await this.readBqrsResults(bqrsPath, fileLinkPrefix, repoTask.sourceLocationPrefix);
138141

139142
return {
140143
variantAnalysisId,

0 commit comments

Comments
 (0)