Skip to content

Commit 115ff83

Browse files
authored
Add model packs to variant analyses (#3472)
1 parent 9777cb1 commit 115ff83

File tree

5 files changed

+39
-13
lines changed

5 files changed

+39
-13
lines changed

extensions/ql-vscode/src/variant-analysis/run-remote-query.ts

+23-12
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,31 @@ import {
3737
import type { QlPackFile } from "../packaging/qlpack-file";
3838
import { expandShortPaths } from "../common/short-paths";
3939
import type { QlPackDetails } from "./ql-pack-details";
40+
import type { ModelPackDetails } from "../common/model-pack-details";
4041

4142
/**
4243
* Well-known names for the query pack used by the server.
4344
*/
4445
const QUERY_PACK_NAME = "codeql-remote/query";
4546

47+
interface GeneratedQlPackDetails {
48+
base64Pack: string;
49+
modelPacks: ModelPackDetails[];
50+
}
51+
4652
/**
4753
* Two possibilities:
4854
* 1. There is no qlpack.yml (or codeql-pack.yml) in this directory. Assume this is a lone query and generate a synthetic qlpack for it.
4955
* 2. There is a qlpack.yml (or codeql-pack.yml) in this directory. Assume this is a query pack and use the yml to pack the query before uploading it.
5056
*
51-
* @returns the entire qlpack as a base64 string.
57+
* @returns details about the generated QL pack.
5258
*/
5359
async function generateQueryPack(
5460
cliServer: CodeQLCliServer,
5561
qlPackDetails: QlPackDetails,
5662
tmpDir: RemoteQueryTempDir,
5763
token: CancellationToken,
58-
): Promise<string> {
64+
): Promise<GeneratedQlPackDetails> {
5965
const workspaceFolders = getOnDiskWorkspaceFolders();
6066
const extensionPacks = await getExtensionPacksToInject(
6167
cliServer,
@@ -129,7 +135,7 @@ async function generateQueryPack(
129135
...queryOpts,
130136
// We need to specify the extension packs as dependencies so that they are included in the MRVA pack.
131137
// The version range doesn't matter, since they'll always be found by source lookup.
132-
...extensionPacks.map((p) => `--extension-pack=${p}@*`),
138+
...extensionPacks.map((p) => `--extension-pack=${p.name}@*`),
133139
];
134140
} else {
135141
precompilationOpts = ["--qlx"];
@@ -152,7 +158,10 @@ async function generateQueryPack(
152158
token,
153159
);
154160
const base64Pack = (await readFile(bundlePath)).toString("base64");
155-
return base64Pack;
161+
return {
162+
base64Pack,
163+
modelPacks: extensionPacks,
164+
};
156165
}
157166

158167
async function createNewQueryPack(
@@ -278,6 +287,7 @@ async function getPackedBundlePath(remoteQueryDir: string): Promise<string> {
278287
interface PreparedRemoteQuery {
279288
actionBranch: string;
280289
base64Pack: string;
290+
modelPacks: ModelPackDetails[];
281291
repoSelection: RepositorySelection;
282292
controllerRepo: Repository;
283293
queryStartTime: number;
@@ -330,10 +340,10 @@ export async function prepareRemoteQueryRun(
330340

331341
const tempDir = await createRemoteQueriesTempDirectory();
332342

333-
let base64Pack: string;
343+
let generatedPack: GeneratedQlPackDetails;
334344

335345
try {
336-
base64Pack = await generateQueryPack(
346+
generatedPack = await generateQueryPack(
337347
cliServer,
338348
qlPackDetails,
339349
tempDir,
@@ -358,7 +368,8 @@ export async function prepareRemoteQueryRun(
358368

359369
return {
360370
actionBranch,
361-
base64Pack,
371+
base64Pack: generatedPack.base64Pack,
372+
modelPacks: generatedPack.modelPacks,
362373
repoSelection,
363374
controllerRepo,
364375
queryStartTime,
@@ -404,8 +415,8 @@ async function fixPackFile(
404415
async function getExtensionPacksToInject(
405416
cliServer: CodeQLCliServer,
406417
workspaceFolders: string[],
407-
): Promise<string[]> {
408-
const result: string[] = [];
418+
): Promise<ModelPackDetails[]> {
419+
const result: ModelPackDetails[] = [];
409420
if (cliServer.useExtensionPacks()) {
410421
const extensionPacks = await cliServer.resolveQlpacks(
411422
workspaceFolders,
@@ -422,7 +433,7 @@ async function getExtensionPacksToInject(
422433
)}`,
423434
);
424435
}
425-
result.push(name);
436+
result.push({ name, path: paths[0] });
426437
});
427438
}
428439

@@ -431,7 +442,7 @@ async function getExtensionPacksToInject(
431442

432443
async function addExtensionPacksAsDependencies(
433444
queryPackDir: string,
434-
extensionPacks: string[],
445+
extensionPacks: ModelPackDetails[],
435446
): Promise<void> {
436447
const qlpackFile = await getQlPackFilePath(queryPackDir);
437448
if (!qlpackFile) {
@@ -447,7 +458,7 @@ async function addExtensionPacksAsDependencies(
447458
) as QlPackFile;
448459

449460
const dependencies = syntheticQueryPack.dependencies ?? {};
450-
extensionPacks.forEach((name) => {
461+
extensionPacks.forEach(({ name }) => {
451462
// Add this extension pack as a dependency. It doesn't matter which
452463
// version we specify, since we are guaranteed that the extension pack
453464
// is resolved from source at the given path.

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

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Repository, RepositoryWithMetadata } from "./repository";
22
import type { AnalysisAlert, AnalysisRawResults } from "./analysis-result";
33
import { QueryLanguage } from "../../common/query-language";
4+
import type { ModelPackDetails } from "../../common/model-pack-details";
45

56
export interface VariantAnalysis {
67
id: number;
@@ -13,6 +14,7 @@ export interface VariantAnalysis {
1314
kind?: string;
1415
};
1516
queries?: VariantAnalysisQueries;
17+
modelPacks?: ModelPackDetails[];
1618
databases: {
1719
repositories?: string[];
1820
repositoryLists?: string[];

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

+2
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ export class VariantAnalysisManager
350350
const {
351351
actionBranch,
352352
base64Pack,
353+
modelPacks,
353354
repoSelection,
354355
controllerRepo,
355356
queryStartTime,
@@ -410,6 +411,7 @@ export class VariantAnalysisManager
410411
const mappedVariantAnalysis = mapVariantAnalysisFromSubmission(
411412
variantAnalysisSubmission,
412413
variantAnalysisResponse,
414+
modelPacks,
413415
);
414416

415417
await this.onVariantAnalysisSubmitted(mappedVariantAnalysis);

extensions/ql-vscode/src/variant-analysis/variant-analysis-mapper.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { ModelPackDetails } from "../common/model-pack-details";
12
import type {
23
VariantAnalysis as ApiVariantAnalysis,
34
VariantAnalysisScannedRepository as ApiVariantAnalysisScannedRepository,
@@ -26,6 +27,7 @@ import {
2627
export function mapVariantAnalysisFromSubmission(
2728
submission: VariantAnalysisSubmission,
2829
apiVariantAnalysis: ApiVariantAnalysis,
30+
modelPacks: ModelPackDetails[],
2931
): VariantAnalysis {
3032
return mapVariantAnalysis(
3133
{
@@ -37,6 +39,7 @@ export function mapVariantAnalysisFromSubmission(
3739
kind: submission.query.kind,
3840
},
3941
queries: submission.queries,
42+
modelPacks,
4043
databases: submission.databases,
4144
executionStartTime: submission.startTime,
4245
},
@@ -59,7 +62,12 @@ export function mapUpdatedVariantAnalysis(
5962
function mapVariantAnalysis(
6063
currentVariantAnalysis: Pick<
6164
VariantAnalysis,
62-
"language" | "query" | "queries" | "databases" | "executionStartTime"
65+
| "language"
66+
| "query"
67+
| "queries"
68+
| "databases"
69+
| "executionStartTime"
70+
| "modelPacks"
6371
>,
6472
currentStatus: VariantAnalysisStatus | undefined,
6573
response: ApiVariantAnalysis,
@@ -96,6 +104,7 @@ function mapVariantAnalysis(
96104
language: currentVariantAnalysis.language,
97105
query: currentVariantAnalysis.query,
98106
queries: currentVariantAnalysis.queries,
107+
modelPacks: currentVariantAnalysis.modelPacks,
99108
databases: currentVariantAnalysis.databases,
100109
executionStartTime: currentVariantAnalysis.executionStartTime,
101110
createdAt: response.created_at,

extensions/ql-vscode/test/unit-tests/variant-analysis/variant-analysis-mapper.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ describe(mapVariantAnalysisFromSubmission.name, () => {
3131
const result = mapVariantAnalysisFromSubmission(
3232
mockSubmission,
3333
mockApiResponse,
34+
[],
3435
);
3536

3637
const {
@@ -54,6 +55,7 @@ describe(mapVariantAnalysisFromSubmission.name, () => {
5455
text: mockSubmission.query.text,
5556
kind: "table",
5657
},
58+
modelPacks: [],
5759
databases: {
5860
repositories: ["1", "2", "3"],
5961
},

0 commit comments

Comments
 (0)