Skip to content

Commit 9fd6cb8

Browse files
committed
Cleanup and install pack dependencies
1 parent f4da522 commit 9fd6cb8

File tree

4 files changed

+70
-52
lines changed

4 files changed

+70
-52
lines changed

extensions/ql-vscode/src/data-extensions-editor/auto-model-usages-query.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ import { QueryRunner } from "../query-server";
66
import { DatabaseItem } from "../databases/local-databases";
77
import { interpretResultsSarif } from "../query-results";
88
import { ProgressCallback } from "../common/vscode/progress";
9+
import { Mode } from "./shared/mode";
910

1011
type Options = {
1112
cliServer: CodeQLCliServer;
1213
queryRunner: QueryRunner;
1314
databaseItem: DatabaseItem;
1415
queryStorageDir: string;
16+
queryDir: string;
1517

1618
progress: ProgressCallback;
1719
};
@@ -23,6 +25,7 @@ export async function getAutoModelUsages({
2325
queryRunner,
2426
databaseItem,
2527
queryStorageDir,
28+
queryDir,
2629
progress,
2730
}: Options): Promise<UsageSnippetsBySignature> {
2831
const maxStep = 1500;
@@ -32,11 +35,12 @@ export async function getAutoModelUsages({
3235
// This will re-run the query that was already run when opening the data extensions editor. This
3336
// might be unnecessary, but this makes it really easy to get the path to the BQRS file which we
3437
// need to interpret the results.
35-
const queryResult = await runQuery("applicationModeQuery", {
38+
const queryResult = await runQuery(Mode.Application, {
3639
cliServer,
3740
queryRunner,
3841
queryStorageDir,
3942
databaseItem,
43+
queryDir,
4044
progress: (update) =>
4145
progress({
4246
maxStep,

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,23 @@ import { DataExtensionsEditorCommands } from "../common/commands";
44
import { CliVersionConstraint, CodeQLCliServer } from "../codeql-cli/cli";
55
import { QueryRunner } from "../query-server";
66
import { DatabaseManager } from "../databases/local-databases";
7-
import { ensureDir } from "fs-extra";
7+
import { ensureDir, writeFile } from "fs-extra";
88
import { join } from "path";
99
import { App } from "../common/app";
1010
import { withProgress } from "../common/vscode/progress";
1111
import { pickExtensionPack } from "./extension-pack-picker";
12-
import { showAndLogErrorMessage } from "../common/logging";
12+
import {
13+
showAndLogErrorMessage,
14+
showAndLogExceptionWithTelemetry,
15+
} from "../common/logging";
16+
import { dir } from "tmp-promise";
17+
import { dump as dumpYaml } from "js-yaml";
18+
import { fetchExternalApiQueries } from "./queries";
19+
import { telemetryListener } from "../common/vscode/telemetry";
20+
import { redactableError } from "../common/errors";
21+
import { extLogger } from "../common/logging/vscode";
22+
import { isQueryLanguage } from "../common/query-language";
23+
import { Mode } from "./shared/mode";
1324

1425
const SUPPORTED_LANGUAGES: string[] = ["java", "csharp"];
1526

@@ -99,13 +110,37 @@ export class DataExtensionsEditorModule {
99110
return;
100111
}
101112

102-
// TODO: Copy the files to a temporary directory and install pack dependencies
103-
113+
// Create new temporary directory for query files and pack dependencies
104114
const queryDir = (await dir({ unsafeCleanup: true })).path;
105115

106-
// TODO: Write both the application mode and framework mode query
107-
const queryFile = join(queryDir, "FetchExternalApis.ql");
108-
await writeFile(queryFile, query[queryName], "utf8");
116+
if (!isQueryLanguage(db.language)) {
117+
void showAndLogExceptionWithTelemetry(
118+
extLogger,
119+
telemetryListener,
120+
redactableError`Unsupported database language ${db.language}`,
121+
);
122+
return;
123+
}
124+
125+
const query = fetchExternalApiQueries[db.language];
126+
if (!query) {
127+
void showAndLogExceptionWithTelemetry(
128+
extLogger,
129+
telemetryListener,
130+
redactableError`No external API usage query found for language ${db.language}`,
131+
);
132+
return;
133+
}
134+
135+
Object.values(Mode).map(async (mode) => {
136+
const queryFile = join(
137+
queryDir,
138+
`FetchExternalApis${
139+
mode.charAt(0).toUpperCase() + mode.slice(1)
140+
}Mode.ql`,
141+
);
142+
await writeFile(queryFile, query[`${mode}ModeQuery`], "utf8");
143+
});
109144

110145
if (query.dependencies) {
111146
for (const [filename, contents] of Object.entries(
@@ -120,14 +155,15 @@ export class DataExtensionsEditorModule {
120155
name: "codeql/external-api-usage",
121156
version: "0.0.0",
122157
dependencies: {
123-
[`codeql/${databaseItem.language}-all`]: "*",
158+
[`codeql/${db.language}-all`]: "*",
124159
},
125160
};
126161

127162
const qlpackFile = join(queryDir, "codeql-pack.yml");
128163
await writeFile(qlpackFile, dumpYaml(syntheticQueryPack), "utf8");
129164

130-
// TODO: install pack dependencies in temporary file (`codeql pack install`)
165+
// TODO: test dependency installation
166+
await this.cliServer.packInstall(queryDir);
131167

132168
const view = new DataExtensionsEditorView(
133169
this.ctx,

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -249,19 +249,15 @@ export class DataExtensionsEditorView extends AbstractWebview<
249249
async (progress) => {
250250
try {
251251
const cancellationTokenSource = new CancellationTokenSource();
252-
const queryResult = await runQuery(
253-
this.mode === Mode.Framework
254-
? "frameworkModeQuery"
255-
: "applicationModeQuery",
256-
{
257-
cliServer: this.cliServer,
258-
queryRunner: this.queryRunner,
259-
databaseItem: this.databaseItem,
260-
queryStorageDir: this.queryStorageDir,
261-
progress: (update) => progress({ ...update, maxStep: 1500 }),
262-
token: cancellationTokenSource.token,
263-
},
264-
);
252+
const queryResult = await runQuery(this.mode, {
253+
cliServer: this.cliServer,
254+
queryRunner: this.queryRunner,
255+
databaseItem: this.databaseItem,
256+
queryStorageDir: this.queryStorageDir,
257+
queryDir: this.queryDir,
258+
progress: (update) => progress({ ...update, maxStep: 1500 }),
259+
token: cancellationTokenSource.token,
260+
});
265261
if (!queryResult) {
266262
return;
267263
}
@@ -433,6 +429,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
433429
cliServer: this.cliServer,
434430
queryRunner: this.queryRunner,
435431
queryStorageDir: this.queryStorageDir,
432+
queryDir: this.queryDir,
436433
databaseItem: this.databaseItem,
437434
progress: (update) => progress({ ...update, maxStep }),
438435
});
@@ -513,6 +510,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
513510
this.cliServer,
514511
this.queryRunner,
515512
this.queryStorageDir,
513+
this.queryDir,
516514
addedDatabase,
517515
modelFile,
518516
Mode.Framework,

extensions/ql-vscode/src/data-extensions-editor/external-api-usage-query.ts

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,36 @@
11
import { CoreCompletedQuery, QueryRunner } from "../query-server";
2-
import { dir } from "tmp-promise";
3-
import { writeFile } from "fs-extra";
4-
import { dump as dumpYaml } from "js-yaml";
52
import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders";
63
import { extLogger } from "../common/logging/vscode";
74
import { showAndLogExceptionWithTelemetry, TeeLogger } from "../common/logging";
8-
import { isQueryLanguage } from "../common/query-language";
95
import { CancellationToken } from "vscode";
106
import { CodeQLCliServer } from "../codeql-cli/cli";
117
import { DatabaseItem } from "../databases/local-databases";
128
import { ProgressCallback } from "../common/vscode/progress";
13-
import { fetchExternalApiQueries } from "./queries";
149
import { QueryResultType } from "../query-server/new-messages";
15-
import { join } from "path";
1610
import { redactableError } from "../common/errors";
1711
import { telemetryListener } from "../common/vscode/telemetry";
18-
import { Query } from "./queries/query";
12+
import { join } from "path";
1913

2014
type RunQueryOptions = {
2115
cliServer: Pick<CodeQLCliServer, "resolveQlpacks">;
2216
queryRunner: Pick<QueryRunner, "createQueryRun" | "logger">;
2317
databaseItem: Pick<DatabaseItem, "contents" | "databaseUri" | "language">;
2418
queryStorageDir: string;
19+
queryDir: string;
2520

2621
progress: ProgressCallback;
2722
token: CancellationToken;
2823
};
2924

3025
export async function runQuery(
31-
queryName: keyof Omit<Query, "dependencies">,
26+
mode: string,
3227
{
3328
cliServer,
3429
queryRunner,
3530
databaseItem,
3631
queryStorageDir,
37-
progress,
3832
queryDir,
33+
progress,
3934
token,
4035
}: RunQueryOptions,
4136
): Promise<CoreCompletedQuery | undefined> {
@@ -45,36 +40,21 @@ export async function runQuery(
4540
// For a reference of what this should do in the future, see the previous implementation in
4641
// https://github.com/github/vscode-codeql/blob/089d3566ef0bc67d9b7cc66e8fd6740b31c1c0b0/extensions/ql-vscode/src/data-extensions-editor/external-api-usage-query.ts#L33-L72
4742

48-
if (!isQueryLanguage(databaseItem.language)) {
49-
void showAndLogExceptionWithTelemetry(
50-
extLogger,
51-
telemetryListener,
52-
redactableError`Unsupported database language ${databaseItem.language}`,
53-
);
54-
return;
55-
}
56-
57-
const query = fetchExternalApiQueries[databaseItem.language];
58-
if (!query) {
59-
void showAndLogExceptionWithTelemetry(
60-
extLogger,
61-
telemetryListener,
62-
redactableError`No external API usage query found for language ${databaseItem.language}`,
63-
);
64-
return;
65-
}
66-
6743
// TODO: install dependencies
6844

6945
const additionalPacks = getOnDiskWorkspaceFolders();
7046
const extensionPacks = Object.keys(
7147
await cliServer.resolveQlpacks(additionalPacks, true),
7248
);
7349

50+
const queryFile = join(
51+
queryDir,
52+
`FetchExternalApis${mode.charAt(0).toUpperCase() + mode.slice(1)}Mode.ql`,
53+
);
54+
7455
const queryRun = queryRunner.createQueryRun(
7556
databaseItem.databaseUri.fsPath,
7657
{
77-
// TODO: select correct query file based on the `queryName` and `queryDir`
7858
queryPath: queryFile,
7959
quickEvalPosition: undefined,
8060
quickEvalCountOnly: false,

0 commit comments

Comments
 (0)