未验证 提交 ceb2265b 编写于 作者: S shayne 提交者: GitHub

Allow opening files, folders, and workspaces in existing code-server from CLI (#1994)

Add initial support for opening files / folders in running code-server instance.

Current limitations:

- unable to open a file in a new window, only folders
- unable to use addMode feature
- others...
上级 221e95ee
此差异已折叠。
......@@ -45,6 +45,9 @@ export interface Args extends VsArgs {
readonly "proxy-domain"?: string[]
readonly locale?: string
readonly _: string[]
readonly "open-in"?: boolean
readonly "reuse-window"?: boolean
readonly "new-window"?: boolean
}
interface Option<T> {
......@@ -139,6 +142,18 @@ const options: Options<Required<Args>> = {
"show-versions": { type: "boolean", description: "Show VS Code extension versions." },
"proxy-domain": { type: "string[]", description: "Domain used for proxying ports." },
"open-in": { type: "boolean", short: "oi", description: "Open file(s) or folder(s) in running instance" },
"new-window": {
type: "boolean",
short: "n",
description: "Force to open a new window. (use with open-in)",
},
"reuse-window": {
type: "boolean",
short: "r",
description: "Force to open a file or folder in an already opened window. (use with open-in)",
},
locale: { type: "string" },
log: { type: LogLevel },
verbose: { type: "boolean", short: "vvv", description: "Enable verbose logging." },
......
import { field, logger } from "@coder/logger"
import * as cp from "child_process"
import { promises as fs } from "fs"
import http from "http"
import * as path from "path"
import { CliMessage } from "../../lib/vscode/src/vs/server/ipc"
import { CliMessage, OpenCommandPipeArgs } from "../../lib/vscode/src/vs/server/ipc"
import { plural } from "../common/util"
import { LoginHttpProvider } from "./app/login"
import { ProxyHttpProvider } from "./app/proxy"
......@@ -162,6 +164,58 @@ async function entry(): Promise<void> {
console.log(version, commit)
}
process.exit(0)
} else if (args["open-in"]) {
if (!process.env["VSCODE_IPC_HOOK_CLI"]) {
logger.error("VSCODE_IPC_HOOK_CLI missing from environment, unable to run")
process.exit(1)
}
const pipeArgs: OpenCommandPipeArgs = { type: "open", folderURIs: [] }
pipeArgs.forceReuseWindow = args["reuse-window"]
pipeArgs.forceNewWindow = args["new-window"]
const isDir = async (path: string): Promise<boolean> => {
try {
const st = await fs.stat(path)
return st.isDirectory()
} catch (error) {
return false
}
}
for (let i = 0; i < args._.length; i++) {
const fp = path.resolve(args._[i])
if (await isDir(fp)) {
pipeArgs.folderURIs.push(fp)
} else {
if (!pipeArgs.fileURIs) {
pipeArgs.fileURIs = []
}
pipeArgs.fileURIs.push(fp)
}
}
if (pipeArgs.forceNewWindow && pipeArgs.fileURIs && pipeArgs.fileURIs.length > 0) {
logger.error("new-window can only be used with folder paths")
process.exit(1)
}
if (pipeArgs.folderURIs.length === 0 && (!pipeArgs.fileURIs || pipeArgs.fileURIs.length === 0)) {
logger.error("open-in expects at least one file or folder argument")
process.exit(1)
}
const vscode = http.request(
{
path: "/",
method: "POST",
socketPath: process.env["VSCODE_IPC_HOOK_CLI"],
},
(res) => {
res.on("data", (message) => {
logger.debug("Got message from VS Code", field("message", message.toString()))
})
},
)
vscode.on("error", (err) => {
logger.debug("Got error from VS Code", field("error", err))
})
vscode.write(JSON.stringify(pipeArgs))
vscode.end()
} else if (args["list-extensions"] || args["install-extension"] || args["uninstall-extension"]) {
logger.debug("forking vs code cli...")
const vscode = cp.fork(path.resolve(__dirname, "../../lib/vscode/out/vs/server/fork"), [], {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册