diff --git a/packages/server/src/cli.ts b/packages/server/src/cli.ts index e57a6af0d469..7486ebad9c78 100644 --- a/packages/server/src/cli.ts +++ b/packages/server/src/cli.ts @@ -8,6 +8,7 @@ import * as os from "os"; import * as path from "path"; import * as WebSocket from "ws"; import { buildDir, cacheHome, dataHome, isCli, serveStatic } from "./constants"; +import { getRecentRelease } from "./updater"; import { createApp } from "./server"; import { forkModule, requireModule } from "./vscode/bootstrapFork"; import { SharedProcess, SharedProcessState } from "./vscode/sharedProcess"; @@ -165,8 +166,6 @@ const bold = (text: string | number): string | number => { } } - logger.info(`\u001B[1mcode-server ${process.env.VERSION ? `v${process.env.VERSION}` : "development"}`); - if (options.dataDir) { logger.warn('"--data-dir" is deprecated. Use "--user-data-dir" instead.'); } @@ -191,7 +190,19 @@ const bold = (text: string | number): string | number => { return; } - // TODO: fill in appropriate doc url + if (isCli) { + const currentVersion = process.env.VERSION; + try { + const recentRelease = await getRecentRelease(); + if (recentRelease !== currentVersion) { + logger.warn(`New version available! (\u001B[1m${recentRelease}\u001B[0m) https://github.com/codercom/code-server/releases/latest`); + } + } catch (err) { + logger.error(`Failed to check latest release: ${err}`); + } + } + + logger.info(`\u001B[1mcode-server ${process.env.VERSION ? `v${process.env.VERSION}` : "development"}`); logger.info("Additional documentation: http://github.com/codercom/code-server"); logger.info("Initializing", field("data-dir", dataDir), field("extensions-dir", extensionsDir), field("working-dir", workingDir), field("log-dir", logDir)); const sharedProcess = new SharedProcess(dataDir, extensionsDir, builtInExtensionsDir); @@ -286,7 +297,6 @@ const bold = (text: string | number): string | number => { }); if (!options.certKey && !options.cert) { logger.warn("No certificate specified. \u001B[1mThis could be insecure."); - // TODO: fill in appropriate doc url logger.warn("Documentation on securing your setup: https://github.com/codercom/code-server/blob/master/doc/security/ssl.md"); } diff --git a/packages/server/src/updater.ts b/packages/server/src/updater.ts new file mode 100644 index 000000000000..c2490b349e20 --- /dev/null +++ b/packages/server/src/updater.ts @@ -0,0 +1,32 @@ +import * as https from "https"; + +export const getRecentRelease = (): Promise => { + return new Promise((resolve, reject):void => { + https.get({ + host: "api.github.com", + path: "/repos/cdr/code-server/releases/latest", + method: "GET", + agent: false, + headers: { + "User-Agent": "code-server", + }, + }, (res) => { + if (res.statusCode !== 200) { + reject(Error("Failed to acquire release information")); + } + let body = ""; + res.on("data", (chunk) => { + body += chunk; + }); + + res.on("end", () => { + try { + const release = JSON.parse(body); + resolve(release.name); + } catch (err) { + reject(err); + } + }); + }); + }); +};