Prepare for release

- Add VS Code icon
- Trim dashboard to just display dedicated VS Code section
- Version was getting unset during build
- Add back nbin shim which I temporarily took out earlier
- Update tests for log level env var changes
This commit is contained in:
Asher 2020-02-18 16:51:55 -06:00
parent 1aaa53622d
commit 46d6e17508
No known key found for this signature in database
GPG Key ID: D63C1EF81242354A
9 changed files with 108 additions and 25 deletions

6
.editorconfig Normal file
View File

@ -0,0 +1,6 @@
root = true
[*]
indent_style = space
trim_trailing_whitespace = true
indent_size = 2

View File

@ -174,7 +174,7 @@ class Builder {
await this.copyDependencies("code-server", this.rootPath, this.buildPath, { await this.copyDependencies("code-server", this.rootPath, this.buildPath, {
commit, commit,
version: process.env.VERSION, version: this.codeServerVersion,
}) })
} }
@ -204,13 +204,17 @@ class Builder {
const vscodeBuildPath = path.join(this.buildPath, "lib/vscode") const vscodeBuildPath = path.join(this.buildPath, "lib/vscode")
await this.task("copying vs code into build directory", async () => { await this.task("copying vs code into build directory", async () => {
await fs.mkdirp(vscodeBuildPath) await fs.mkdirp(path.join(vscodeBuildPath, "resources/linux"))
await Promise.all([ await Promise.all([
fs.move( fs.move(
path.join(this.vscodeSourcePath, `out-vscode${process.env.MINIFY ? "-min" : ""}`), path.join(this.vscodeSourcePath, `out-vscode${process.env.MINIFY ? "-min" : ""}`),
path.join(vscodeBuildPath, "out"), path.join(vscodeBuildPath, "out"),
), ),
fs.copy(path.join(this.vscodeSourcePath, ".build/extensions"), path.join(vscodeBuildPath, "extensions")), fs.copy(path.join(this.vscodeSourcePath, ".build/extensions"), path.join(vscodeBuildPath, "extensions")),
fs.copy(
path.join(this.vscodeSourcePath, "resources/linux/code.png"),
path.join(vscodeBuildPath, "resources/linux/code.png"),
),
]) ])
}) })
@ -256,6 +260,38 @@ class Builder {
* Bundles the built code into a binary. * Bundles the built code into a binary.
*/ */
private async binary(binaryName: string): Promise<void> { private async binary(binaryName: string): Promise<void> {
// Prepend code to the target which enables finding files within the binary.
const prependLoader = async (relativeFilePath: string): Promise<void> => {
const filePath = path.join(this.buildPath, relativeFilePath)
const shim = `
if (!global.NBIN_LOADED) {
try {
const nbin = require("nbin");
nbin.shimNativeFs("${this.buildPath}");
global.NBIN_LOADED = true;
const path = require("path");
const rg = require("vscode-ripgrep");
rg.binaryRgPath = rg.rgPath;
rg.rgPath = path.join(require("os").tmpdir(), "code-server", path.basename(rg.binaryRgPath));
} catch (error) { /* Not in the binary. */ }
}
`
const content = await fs.readFile(filePath, "utf8")
if (!content.startsWith(shim)) {
await fs.writeFile(filePath, shim + content)
}
}
await this.task("Prepending nbin loader", () => {
return Promise.all([
prependLoader("out/node/entry.js"),
prependLoader("lib/vscode/out/vs/server/entry.js"),
prependLoader("lib/vscode/out/vs/server/fork.js"),
prependLoader("lib/vscode/out/bootstrap-fork.js"),
prependLoader("lib/vscode/extensions/node_modules/typescript/lib/tsserver.js"),
])
})
const bin = new Binary({ const bin = new Binary({
mainFile: path.join(this.buildPath, "out/node/entry.js"), mainFile: path.join(this.buildPath, "out/node/entry.js"),
target: await this.target(), target: await this.target(),

View File

@ -46,6 +46,7 @@
.block-row > .item > .icon { .block-row > .item > .icon {
height: 1rem; height: 1rem;
margin-right: 5px; margin-right: 5px;
vertical-align: top;
width: 1rem; width: 1rem;
} }

View File

@ -21,25 +21,36 @@
<body> <body>
<div class="center-container"> <div class="center-container">
<div class="info-blocks"> <div class="info-blocks">
<!-- TEMP: Only VS Code for now. -->
<!-- <div class="info-block"> -->
<!-- <h2 class="header">Running Applications</h2> -->
<!-- {{APP_LIST:RUNNING}} -->
<!-- </div> -->
<div class="info-block"> <div class="info-block">
<h2 class="header">Running Applications</h2> <h2 class="header">Launch</h2>
{{APP_LIST:RUNNING}} <div class="block-row">
<a class="item -link" href="./vscode">
<img class="icon" src="./static-{{COMMIT}}/lib/vscode/resources/linux/code.png" />
VS Code
</a>
</div>
</div> </div>
<div class="info-block"> <div class="info-block">
<h2 class="header">Update</h2> <h2 class="header">Version</h2>
{{UPDATE:NAME}} {{UPDATE:NAME}}
</div> </div>
<div class="info-block"> <!-- <div class="info-block"> -->
<h2 class="header">Editors</h2> <!-- <h2 class="header">Editors</h2> -->
{{APP_LIST:EDITORS}} <!-- {{APP_LIST:EDITORS}} -->
</div> <!-- </div> -->
<div class="info-block"> <!-- <div class="info-block"> -->
<h2 class="header">Other</h2> <!-- <h2 class="header">Other</h2> -->
{{APP_LIST:OTHER}} <!-- {{APP_LIST:OTHER}} -->
</div> <!-- </div> -->
</div> </div>
</div> </div>
</body> </body>

View File

@ -11,6 +11,7 @@ const getVscodeVersion = (): string => {
export const Vscode: Application = { export const Vscode: Application = {
categories: ["Editor"], categories: ["Editor"],
installed: true,
name: "VS Code", name: "VS Code",
path: "/vscode", path: "/vscode",
version: getVscodeVersion(), version: getVscodeVersion(),
@ -23,5 +24,5 @@ export const findApplications = async (): Promise<ReadonlyArray<Application>> =>
} }
export const findWhitelistedApplications = async (): Promise<ReadonlyArray<Application>> => { export const findWhitelistedApplications = async (): Promise<ReadonlyArray<Application>> => {
return [] return [Vscode]
} }

View File

@ -35,10 +35,10 @@ export class VscodeHttpProvider extends HttpProvider {
const id = generateUuid() const id = generateUuid()
const vscode = await this.fork() const vscode = await this.fork()
logger.debug("Setting up VS Code...") logger.debug("setting up vs code...")
return new Promise<WorkbenchOptions>((resolve, reject) => { return new Promise<WorkbenchOptions>((resolve, reject) => {
vscode.once("message", (message: VscodeMessage) => { vscode.once("message", (message: VscodeMessage) => {
logger.debug("Got message from VS Code", field("message", message)) logger.debug("got message from vs code", field("message", message))
return message.type === "options" && message.id === id return message.type === "options" && message.id === id
? resolve(message.options) ? resolve(message.options)
: reject(new Error("Unexpected response during initialization")) : reject(new Error("Unexpected response during initialization"))
@ -51,7 +51,7 @@ export class VscodeHttpProvider extends HttpProvider {
private fork(): Promise<cp.ChildProcess> { private fork(): Promise<cp.ChildProcess> {
if (!this._vscode) { if (!this._vscode) {
logger.debug("Forking VS Code...") logger.debug("forking vs code...")
const vscode = cp.fork(path.join(this.serverRootPath, "fork")) const vscode = cp.fork(path.join(this.serverRootPath, "fork"))
vscode.on("error", (error) => { vscode.on("error", (error) => {
logger.error(error.message) logger.error(error.message)
@ -64,7 +64,7 @@ export class VscodeHttpProvider extends HttpProvider {
this._vscode = new Promise((resolve, reject) => { this._vscode = new Promise((resolve, reject) => {
vscode.once("message", (message: VscodeMessage) => { vscode.once("message", (message: VscodeMessage) => {
logger.debug("Got message from VS Code", field("message", message)) logger.debug("got message from vs code", field("message", message))
return message.type === "ready" return message.type === "ready"
? resolve(vscode) ? resolve(vscode)
: reject(new Error("Unexpected response waiting for ready response")) : reject(new Error("Unexpected response waiting for ready response"))

View File

@ -198,16 +198,17 @@ export const parse = (argv: string[]): Args => {
logger.debug("parsed command line", field("args", args)) logger.debug("parsed command line", field("args", args))
if (process.env.LOG_LEVEL === "trace" || args.verbose) { // Ensure the environment variable and the flag are synced up. The flag takes
// priority over the environment variable.
if (args.log === "trace" || process.env.LOG_LEVEL === "trace" || args.verbose) {
args.log = process.env.LOG_LEVEL = "trace"
args.verbose = true args.verbose = true
args.log = "trace" } else if (!args.log && process.env.LOG_LEVEL) {
} else if (!args.log) {
args.log = process.env.LOG_LEVEL args.log = process.env.LOG_LEVEL
} else if (args.log) {
process.env.LOG_LEVEL = args.log
} }
// Ensure this passes down to forked processes.
process.env.LOG_LEVEL = args.log
switch (args.log) { switch (args.log) {
case "trace": case "trace":
logger.level = Level.Trace logger.level = Level.Trace

View File

@ -110,7 +110,7 @@ if (args.help) {
process.exit(0) process.exit(0)
} else if (args["list-extensions"] || args["install-extension"] || args["uninstall-extension"]) { } else if (args["list-extensions"] || args["install-extension"] || args["uninstall-extension"]) {
process.env.NBIN_BYPASS = "true" process.env.NBIN_BYPASS = "true"
logger.debug("Forking VS Code CLI...") logger.debug("forking vs code cli...")
const vscode = cp.fork(path.resolve(__dirname, "../../lib/vscode/out/vs/server/fork"), [], { const vscode = cp.fork(path.resolve(__dirname, "../../lib/vscode/out/vs/server/fork"), [], {
env: { env: {
...process.env, ...process.env,

View File

@ -4,6 +4,10 @@ import { parse } from "../src/node/cli"
import { xdgLocalDir } from "../src/node/util" import { xdgLocalDir } from "../src/node/util"
describe("cli", () => { describe("cli", () => {
beforeEach(() => {
delete process.env.LOG_LEVEL
})
it("should set defaults", () => { it("should set defaults", () => {
assert.deepEqual(parse([]), { assert.deepEqual(parse([]), {
_: [], _: [],
@ -86,6 +90,29 @@ describe("cli", () => {
verbose: true, verbose: true,
version: true, version: true,
}) })
assert.equal(process.env.LOG_LEVEL, "trace")
})
it("should use log level env var", () => {
process.env.LOG_LEVEL = "debug"
assert.deepEqual(parse([]), {
_: [],
"extensions-dir": path.join(xdgLocalDir, "extensions"),
"user-data-dir": xdgLocalDir,
log: "debug",
})
assert.equal(process.env.LOG_LEVEL, "debug")
})
it("should prefer --log to env var", () => {
process.env.LOG_LEVEL = "debug"
assert.deepEqual(parse(["--log", "info"]), {
_: [],
"extensions-dir": path.join(xdgLocalDir, "extensions"),
"user-data-dir": xdgLocalDir,
log: "info",
})
assert.equal(process.env.LOG_LEVEL, "info")
}) })
it("should error if value isn't provided", () => { it("should error if value isn't provided", () => {