Skip to content

Commit 8bc8ffe

Browse files
authored
Merge pull request #2820 from github/koesie10/cleanup-temp-directories
Cleanup temporary directories in model editor
2 parents d970b51 + 69f5d2c commit 8bc8ffe

3 files changed

Lines changed: 41 additions & 13 deletions

File tree

extensions/ql-vscode/src/model-editor/auto-model-codeml-queries.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,8 @@ export async function runAutoModelQueries({
6363
);
6464

6565
// Generate a pack containing the candidate filters
66-
const filterPackDir = await generateCandidateFilterPack(
67-
databaseItem.language,
68-
candidateMethods,
69-
);
66+
const { packDir: filterPackDir, cleanup: cleanupFilterPack } =
67+
await generateCandidateFilterPack(databaseItem.language, candidateMethods);
7068

7169
const additionalPacks = [...getOnDiskWorkspaceFolders(), filterPackDir];
7270
const extensionPacks = Object.keys(
@@ -85,6 +83,8 @@ export async function runAutoModelQueries({
8583
token: cancellationTokenSource.token,
8684
});
8785

86+
await cleanupFilterPack();
87+
8888
if (!completedQuery) {
8989
return undefined;
9090
}
@@ -155,6 +155,11 @@ async function resolveAutomodelQuery(
155155
return queries[0];
156156
}
157157

158+
type CandidateFilterPackResult = {
159+
packDir: string;
160+
cleanup: () => Promise<void>;
161+
};
162+
158163
/**
159164
* generateCandidateFilterPack will create a temporary extension pack.
160165
* This pack will contain a filter that will restrict the automodel queries
@@ -167,9 +172,9 @@ async function resolveAutomodelQuery(
167172
export async function generateCandidateFilterPack(
168173
language: string,
169174
candidateMethods: MethodSignature[],
170-
): Promise<string> {
175+
): Promise<CandidateFilterPackResult> {
171176
// Pack resides in a temporary directory, to not pollute the workspace.
172-
const packDir = (await dir({ unsafeCleanup: true })).path;
177+
const { path: packDir, cleanup } = await dir({ unsafeCleanup: true });
173178

174179
const syntheticConfigPack = {
175180
name: "codeql/automodel-filter",
@@ -208,7 +213,10 @@ export async function generateCandidateFilterPack(
208213
const filterFile = join(packDir, "filter.yml");
209214
await writeFile(filterFile, dumpYaml(filter), "utf8");
210215

211-
return packDir;
216+
return {
217+
packDir,
218+
cleanup,
219+
};
212220
}
213221

214222
async function interpretAutomodelResults(

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,12 @@ export class ModelEditorModule extends DisposableObject {
136136
});
137137

138138
// Create new temporary directory for query files and pack dependencies
139-
const queryDir = (await dir({ unsafeCleanup: true })).path;
139+
const { path: queryDir, cleanup: cleanupQueryDir } = await dir({
140+
unsafeCleanup: true,
141+
});
140142
const success = await setUpPack(this.cliServer, queryDir, language);
141143
if (!success) {
144+
await cleanupQueryDir();
142145
return;
143146
}
144147

@@ -161,9 +164,20 @@ export class ModelEditorModule extends DisposableObject {
161164
this.methodsUsagePanel.setState.bind(this.methodsUsagePanel),
162165
this.showMethod.bind(this),
163166
this.handleViewBecameActive.bind(this),
164-
this.handleViewWasDisposed.bind(this),
167+
(view) => {
168+
this.handleViewWasDisposed(view);
169+
void cleanupQueryDir();
170+
},
165171
this.isMostRecentlyActiveView.bind(this),
166172
);
173+
174+
this.push(view);
175+
this.push({
176+
dispose(): void {
177+
void cleanupQueryDir();
178+
},
179+
});
180+
167181
await view.openView();
168182
},
169183
{

extensions/ql-vscode/test/vscode-tests/no-workspace/model-editor/auto-model-codeml-queries.test.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { QueryRunner } from "../../../../src/query-server";
1616
import * as queryResolver from "../../../../src/local-queries/query-resolver";
1717
import { MethodSignature } from "../../../../src/model-editor/method";
1818
import { join } from "path";
19-
import { exists, readFile } from "fs-extra";
19+
import { pathExists, readFile } from "fs-extra";
2020
import { load as loadYaml } from "js-yaml";
2121
import { CancellationTokenSource } from "vscode-jsonrpc";
2222
import { QueryOutputDir } from "../../../../src/run-queries-shared";
@@ -176,12 +176,15 @@ describe("generateCandidateFilterPack", () => {
176176
methodParameters: "()",
177177
},
178178
];
179-
const packDir = await generateCandidateFilterPack("java", candidateMethods);
179+
const { packDir, cleanup } = await generateCandidateFilterPack(
180+
"java",
181+
candidateMethods,
182+
);
180183
expect(packDir).not.toBeUndefined();
181184
const qlpackFile = join(packDir, "codeql-pack.yml");
182-
expect(await exists(qlpackFile)).toBe(true);
185+
expect(await pathExists(qlpackFile)).toBe(true);
183186
const filterFile = join(packDir, "filter.yml");
184-
expect(await exists(filterFile)).toBe(true);
187+
expect(await pathExists(filterFile)).toBe(true);
185188
// Read the contents of filterFile and parse as yaml
186189
const yaml = await loadYaml(await readFile(filterFile, "utf8"));
187190
const extensions = yaml.extensions;
@@ -193,5 +196,8 @@ describe("generateCandidateFilterPack", () => {
193196
expect(extension.data).toBeInstanceOf(Array);
194197
expect(extension.data).toHaveLength(1);
195198
expect(extension.data[0]).toEqual(["org.my", "A", "x", "()"]);
199+
200+
await cleanup();
201+
expect(await pathExists(packDir)).toBe(false);
196202
});
197203
});

0 commit comments

Comments
 (0)