From b562d4a880f21aace51b6bd1e7ac64330d023b3a Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Thu, 6 Oct 2022 20:12:21 +0200 Subject: [PATCH] Allow opening files at a specific line and column (fixes #5619) (#5620) * Allow opening files at a specific line and column (fixes #5619) * Add isDirectory test --- src/node/main.ts | 9 +++++---- src/node/util.ts | 9 +++++++++ test/unit/node/util.test.ts | 27 +++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/node/main.ts b/src/node/main.ts index 00b4bda15..cf5899526 100644 --- a/src/node/main.ts +++ b/src/node/main.ts @@ -9,7 +9,7 @@ import { AuthType, DefaultedArgs, Feature, SpawnCodeCli, toCodeArgs, UserProvide import { coderCloudBind } from "./coder_cloud" import { commit, version } from "./constants" import { register } from "./routes" -import { humanPath, isFile, loadAMDModule, open } from "./util" +import { humanPath, isDirectory, loadAMDModule, open } from "./util" /** * Return true if the user passed an extension-related VS Code flag. @@ -69,14 +69,15 @@ export const openInExistingInstance = async (args: DefaultedArgs, socketPath: st fileURIs: [], forceReuseWindow: args["reuse-window"], forceNewWindow: args["new-window"], + gotoLineMode: true, } const paths = args._ || [] for (let i = 0; i < paths.length; i++) { const fp = path.resolve(paths[i]) - if (await isFile(fp)) { - pipeArgs.fileURIs.push(fp) - } else { + if (await isDirectory(fp)) { pipeArgs.folderURIs.push(fp) + } else { + pipeArgs.fileURIs.push(fp) } } if (pipeArgs.forceNewWindow && pipeArgs.fileURIs.length > 0) { diff --git a/src/node/util.ts b/src/node/util.ts index 140431cc8..698fe6045 100644 --- a/src/node/util.ts +++ b/src/node/util.ts @@ -482,6 +482,15 @@ export const isFile = async (path: string): Promise => { } } +export const isDirectory = async (path: string): Promise => { + try { + const stat = await fs.stat(path) + return stat.isDirectory() + } catch (error) { + return false + } +} + /** * Escapes any HTML string special characters, like &, <, >, ", and '. * diff --git a/test/unit/node/util.test.ts b/test/unit/node/util.test.ts index aea682baa..e38667673 100644 --- a/test/unit/node/util.test.ts +++ b/test/unit/node/util.test.ts @@ -457,17 +457,40 @@ describe("isFile", () => { afterEach(async () => { await fs.rm(testDir, { recursive: true, force: true }) }) - it("should return false if the path doesn't exist", async () => { + it("should return false if is directory", async () => { expect(await util.isFile(testDir)).toBe(false) }) it("should return true if is file", async () => { expect(await util.isFile(pathToFile)).toBe(true) }) - it("should return false if error", async () => { + it("should return false if the path doesn't exist", async () => { expect(await util.isFile("fakefile.txt")).toBe(false) }) }) +describe("isDirectory", () => { + const testDir = path.join(tmpdir, "tests", "isDirectory") + let pathToFile = "" + + beforeEach(async () => { + pathToFile = path.join(testDir, "foo.txt") + await fs.mkdir(testDir, { recursive: true }) + await fs.writeFile(pathToFile, "hello") + }) + afterEach(async () => { + await fs.rm(testDir, { recursive: true, force: true }) + }) + it("should return false if is a file", async () => { + expect(await util.isDirectory(pathToFile)).toBe(false) + }) + it("should return true if is directory", async () => { + expect(await util.isDirectory(testDir)).toBe(true) + }) + it("should return false if the path doesn't exist", async () => { + expect(await util.isDirectory("fakefile.txt")).toBe(false) + }) +}) + describe("humanPath", () => { it("should return an empty string if no path provided", () => { const mockHomedir = "/home/coder"