Exclude workspace folders in the system temp dir
This commit is contained in:
@@ -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) => {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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([
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user