Exclude workspace folders in the system temp dir

This commit is contained in:
Koen Vlaswinkel
2023-06-21 09:44:39 +02:00
parent 1cc6aa5303
commit f32a240e24
3 changed files with 51 additions and 2 deletions

View File

@@ -1,6 +1,7 @@
import { Uri, window, workspace, WorkspaceFolder } from "vscode";
import { getOnDiskWorkspaceFoldersObjects } from "../common/vscode/workspace-folders";
import { extLogger } from "../common";
import { tmpdir } from "../pure/files";
/**
* Returns the ancestors of this path in order from furthest to closest (i.e. root of filesystem to parent directory)
@@ -26,7 +27,15 @@ function getRootWorkspaceDirectory(): Uri | undefined {
return Uri.joinPath(workspaceFile, "..");
}
const workspaceFolders = getOnDiskWorkspaceFoldersObjects();
const allWorkspaceFolders = getOnDiskWorkspaceFoldersObjects();
// Get the system temp directory and convert it to a URI so it's normalized
const systemTmpdir = Uri.file(tmpdir());
const workspaceFolders = allWorkspaceFolders.filter((folder) => {
// Never use a workspace folder that is in the system temp directory
return !folder.uri.fsPath.startsWith(systemTmpdir.fsPath);
});
// Find the common root directory of all workspace folders by finding the longest common prefix
const commonRoot = workspaceFolders.reduce((commonRoot, folder) => {

View File

@@ -1,5 +1,6 @@
import { pathExists, stat, readdir, opendir } from "fs-extra";
import { isAbsolute, join, relative, resolve } from "path";
import { tmpdir as osTmpdir } from "os";
/**
* Recursively finds all .ql files in this set of Uris.
@@ -121,3 +122,8 @@ export interface IOError {
export function isIOError(e: any): e is IOError {
return e.code !== undefined && typeof e.code === "string";
}
// This function is a wrapper around `os.tmpdir()` to make it easier to mock in tests.
export function tmpdir(): string {
return osTmpdir();
}

View File

@@ -1,6 +1,8 @@
import { Uri, workspace, WorkspaceFolder } from "vscode";
import { dir, DirectoryResult } from "tmp-promise";
import { join } from "path";
import { autoPickExtensionsDirectory } from "../../../../src/data-extensions-editor/extensions-workspace-folder";
import * as files from "../../../../src/pure/files";
describe("autoPickExtensionsDirectory", () => {
let tmpDir: DirectoryResult;
@@ -15,13 +17,14 @@ describe("autoPickExtensionsDirectory", () => {
let updateWorkspaceFoldersSpy: jest.SpiedFunction<
typeof workspace.updateWorkspaceFolders
>;
let mockedTmpDirUri: Uri;
beforeEach(async () => {
tmpDir = await dir({
unsafeCleanup: true,
});
rootDirectory = Uri.file(tmpDir.path);
rootDirectory = Uri.joinPath(Uri.file(tmpDir.path), "root");
extensionsDirectory = Uri.joinPath(
rootDirectory,
".github",
@@ -29,6 +32,9 @@ describe("autoPickExtensionsDirectory", () => {
"extensions",
);
const mockedTmpDir = join(tmpDir.path, ".tmp", "tmp");
mockedTmpDirUri = Uri.file(mockedTmpDir);
workspaceFoldersSpy = jest
.spyOn(workspace, "workspaceFolders", "get")
.mockReturnValue([]);
@@ -38,6 +44,8 @@ describe("autoPickExtensionsDirectory", () => {
updateWorkspaceFoldersSpy = jest
.spyOn(workspace, "updateWorkspaceFolders")
.mockReturnValue(true);
jest.spyOn(files, "tmpdir").mockReturnValue(mockedTmpDir);
});
afterEach(async () => {
@@ -136,6 +144,32 @@ describe("autoPickExtensionsDirectory", () => {
});
});
it("when a workspace file does not exist and there is a temp dir as workspace folder", async () => {
workspaceFoldersSpy.mockReturnValue([
{
uri: Uri.joinPath(rootDirectory, "codeql-custom-queries-java"),
name: "codeql-custom-queries-java",
index: 0,
},
{
uri: Uri.joinPath(rootDirectory, "codeql-custom-queries-python"),
name: "codeql-custom-queries-python",
index: 1,
},
{
uri: Uri.joinPath(mockedTmpDirUri, "quick-queries"),
name: "quick-queries",
index: 2,
},
]);
expect(await autoPickExtensionsDirectory()).toEqual(extensionsDirectory);
expect(updateWorkspaceFoldersSpy).toHaveBeenCalledWith(3, 0, {
name: "CodeQL Extension Packs",
uri: extensionsDirectory,
});
});
it("when a workspace file does not exist and there is no common root directory", async () => {
workspaceFoldersSpy.mockReturnValue([
{