Skip to content

Commit 24eb8fd

Browse files
committed
Store QL pack in workspace instead of VSCode storage
We're checking that the skeleton QL pack doesn't exist as a workspace folder, so we should be creating this folder in the workspace as well. Initially this was being created in VSCode's local storage.
1 parent ce3e19a commit 24eb8fd

File tree

3 files changed

+50
-18
lines changed

3 files changed

+50
-18
lines changed

extensions/ql-vscode/src/databases.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,7 @@ export class DatabaseManager extends DisposableObject {
669669
folderName,
670670
databaseItem.language as QueryLanguage,
671671
this.cli,
672+
this.ctx.storageUri?.fsPath,
672673
);
673674
await qlPackGenerator.generate();
674675
} catch (e: unknown) {

extensions/ql-vscode/src/qlpack-generator.ts

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { mkdir, writeFile } from "fs-extra";
1+
import { writeFile } from "fs-extra";
22
import { dump } from "js-yaml";
33
import { join } from "path";
4+
import { Uri, workspace } from "vscode";
45
import { CodeQLCliServer } from "./cli";
56

67
export type QueryLanguage =
@@ -18,21 +19,28 @@ export class QlPackGenerator {
1819
private readonly qlpackVersion: string;
1920
private readonly header: string;
2021
private readonly qlpackFileName: string;
22+
private readonly folderUri: Uri;
2123

2224
constructor(
2325
private readonly folderName: string,
2426
private readonly queryLanguage: QueryLanguage,
2527
private readonly cliServer: CodeQLCliServer,
28+
private readonly storagePath: string | undefined,
2629
) {
30+
if (this.storagePath === undefined) {
31+
throw new Error("Workspace storage path is undefined");
32+
}
2733
this.qlpackName = `getting-started/codeql-extra-queries-${this.queryLanguage}`;
2834
this.qlpackVersion = "1.0.0";
2935
this.header = "# This is an automatically generated file.\n\n";
3036

3137
this.qlpackFileName = "qlpack.yml";
38+
this.folderUri = Uri.parse(join(this.storagePath, this.folderName));
3239
}
3340

3441
public async generate() {
35-
await mkdir(this.folderName);
42+
// create QL pack folder and add to workspace
43+
await this.createWorkspaceFolder();
3644

3745
// create qlpack.yml
3846
await this.createQlPackYaml();
@@ -44,8 +52,19 @@ export class QlPackGenerator {
4452
await this.createCodeqlPackLockYaml();
4553
}
4654

55+
private async createWorkspaceFolder() {
56+
await workspace.fs.createDirectory(this.folderUri);
57+
58+
const end = (workspace.workspaceFolders || []).length;
59+
60+
await workspace.updateWorkspaceFolders(end, 0, {
61+
name: this.folderName,
62+
uri: this.folderUri,
63+
});
64+
}
65+
4766
private async createQlPackYaml() {
48-
const qlPackFile = join(this.folderName, this.qlpackFileName);
67+
const qlPackFilePath = join(this.folderUri.path, this.qlpackFileName);
4968

5069
const qlPackYml = {
5170
name: this.qlpackName,
@@ -55,11 +74,11 @@ export class QlPackGenerator {
5574
},
5675
};
5776

58-
await writeFile(qlPackFile, this.header + dump(qlPackYml), "utf8");
77+
await writeFile(qlPackFilePath, this.header + dump(qlPackYml), "utf8");
5978
}
6079

6180
private async createExampleQlFile() {
62-
const exampleQlFile = join(this.folderName, "example.ql");
81+
const exampleQlFilePath = join(this.folderUri.path, "example.ql");
6382

6483
const exampleQl = `
6584
/**
@@ -75,10 +94,10 @@ import ${this.queryLanguage}
7594
select "Hello, world!"
7695
`.trim();
7796

78-
await writeFile(exampleQlFile, exampleQl, "utf8");
97+
await writeFile(exampleQlFilePath, exampleQl, "utf8");
7998
}
8099

81100
private async createCodeqlPackLockYaml() {
82-
await this.cliServer.packAdd(this.folderName, this.queryLanguage);
101+
await this.cliServer.packAdd(this.folderUri.path, this.queryLanguage);
83102
}
84103
}
Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import { join } from "path";
2-
import { existsSync, rmdirSync } from "fs";
2+
import { existsSync, rmSync } from "fs";
33
import { QlPackGenerator, QueryLanguage } from "../../../src/qlpack-generator";
44
import { CodeQLCliServer } from "../../../src/cli";
5+
import { isFolderAlreadyInWorkspace } from "../../../src/helpers";
6+
import { workspace } from "vscode";
7+
import { getErrorMessage } from "../../../src/pure/helpers-pure";
58

69
describe("QlPackGenerator", () => {
7-
let packfolderName: string;
10+
let packFolderName: string;
11+
let packFolderPath: string;
812
let qlPackYamlFilePath: string;
913
let exampleQlFilePath: string;
1014
let language: string;
@@ -13,41 +17,49 @@ describe("QlPackGenerator", () => {
1317

1418
beforeEach(async () => {
1519
language = "ruby";
16-
packfolderName = `test-ql-pack-${language}`;
17-
qlPackYamlFilePath = join(packfolderName, "qlpack.yml");
18-
exampleQlFilePath = join(packfolderName, "example.ql");
20+
packFolderName = `test-ql-pack-${language}`;
21+
packFolderPath = join(__dirname, packFolderName);
22+
23+
qlPackYamlFilePath = join(packFolderPath, "qlpack.yml");
24+
exampleQlFilePath = join(packFolderPath, "example.ql");
1925

2026
packAddSpy = jest.fn();
2127
const mockCli = {
2228
packAdd: packAddSpy,
2329
} as unknown as CodeQLCliServer;
2430

2531
generator = new QlPackGenerator(
26-
packfolderName,
32+
packFolderName,
2733
language as QueryLanguage,
2834
mockCli,
35+
__dirname,
2936
);
3037
});
3138

3239
afterEach(async () => {
3340
try {
34-
rmdirSync(packfolderName, { recursive: true });
41+
rmSync(packFolderPath, { recursive: true });
42+
43+
const end = (workspace.workspaceFolders || []).length;
44+
workspace.updateWorkspaceFolders(end - 1, 1);
3545
} catch (e) {
36-
// ignore
46+
console.log(
47+
`Could not remove folder from workspace: ${getErrorMessage(e)}`,
48+
);
3749
}
3850
});
3951

4052
it("should generate a QL pack", async () => {
41-
expect(existsSync(packfolderName)).toBe(false);
53+
expect(isFolderAlreadyInWorkspace(packFolderName)).toBe(false);
4254
expect(existsSync(qlPackYamlFilePath)).toBe(false);
4355
expect(existsSync(exampleQlFilePath)).toBe(false);
4456

4557
await generator.generate();
4658

47-
expect(existsSync(packfolderName)).toBe(true);
59+
expect(isFolderAlreadyInWorkspace(packFolderName)).toBe(true);
4860
expect(existsSync(qlPackYamlFilePath)).toBe(true);
4961
expect(existsSync(exampleQlFilePath)).toBe(true);
5062

51-
expect(packAddSpy).toHaveBeenCalledWith(packfolderName, language);
63+
expect(packAddSpy).toHaveBeenCalledWith(packFolderPath, language);
5264
});
5365
});

0 commit comments

Comments
 (0)