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
This commit is contained in:
Daniil Gentili 2022-10-06 20:12:21 +02:00 committed by GitHub
parent 3a9eb312b1
commit b562d4a880
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 6 deletions

View File

@ -9,7 +9,7 @@ import { AuthType, DefaultedArgs, Feature, SpawnCodeCli, toCodeArgs, UserProvide
import { coderCloudBind } from "./coder_cloud" import { coderCloudBind } from "./coder_cloud"
import { commit, version } from "./constants" import { commit, version } from "./constants"
import { register } from "./routes" 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. * 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: [], fileURIs: [],
forceReuseWindow: args["reuse-window"], forceReuseWindow: args["reuse-window"],
forceNewWindow: args["new-window"], forceNewWindow: args["new-window"],
gotoLineMode: true,
} }
const paths = args._ || [] const paths = args._ || []
for (let i = 0; i < paths.length; i++) { for (let i = 0; i < paths.length; i++) {
const fp = path.resolve(paths[i]) const fp = path.resolve(paths[i])
if (await isFile(fp)) { if (await isDirectory(fp)) {
pipeArgs.fileURIs.push(fp)
} else {
pipeArgs.folderURIs.push(fp) pipeArgs.folderURIs.push(fp)
} else {
pipeArgs.fileURIs.push(fp)
} }
} }
if (pipeArgs.forceNewWindow && pipeArgs.fileURIs.length > 0) { if (pipeArgs.forceNewWindow && pipeArgs.fileURIs.length > 0) {

View File

@ -482,6 +482,15 @@ export const isFile = async (path: string): Promise<boolean> => {
} }
} }
export const isDirectory = async (path: string): Promise<boolean> => {
try {
const stat = await fs.stat(path)
return stat.isDirectory()
} catch (error) {
return false
}
}
/** /**
* Escapes any HTML string special characters, like &, <, >, ", and '. * Escapes any HTML string special characters, like &, <, >, ", and '.
* *

View File

@ -457,17 +457,40 @@ describe("isFile", () => {
afterEach(async () => { afterEach(async () => {
await fs.rm(testDir, { recursive: true, force: true }) 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) expect(await util.isFile(testDir)).toBe(false)
}) })
it("should return true if is file", async () => { it("should return true if is file", async () => {
expect(await util.isFile(pathToFile)).toBe(true) 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) 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", () => { describe("humanPath", () => {
it("should return an empty string if no path provided", () => { it("should return an empty string if no path provided", () => {
const mockHomedir = "/home/coder" const mockHomedir = "/home/coder"