From f4ba7dd12b684b144457c6fc6ccc9f4fe71bde3c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 11 Jan 2022 16:34:28 +0100 Subject: [PATCH 1/3] server bin cleanup --- build/gulpfile.reh.js | 19 +++++++++------ .../vscode-test-resolver/src/extension.ts | 7 +++--- product.json | 1 + .../bin-dev/{server.bat => code-server.bat} | 0 .../bin-dev/{server.sh => code-server.sh} | 0 .../server/bin-dev/{ => remote-cli}/code.cmd | 2 +- .../server/bin-dev/{ => remote-cli}/code.sh | 4 ++-- resources/server/bin/code-server.cmd | 24 +++++++++++++++++++ .../server/bin/{server.sh => code-server.sh} | 2 +- resources/server/bin/code.cmd | 4 ---- resources/server/bin/helpers/browser.cmd | 3 ++- resources/server/bin/remote-cli/code.cmd | 5 ++++ resources/server/bin/{ => remote-cli}/code.sh | 2 +- .../server/bin/{server.cmd => server-old.cmd} | 2 +- resources/server/bin/server-old.sh | 12 ++++++++++ src/vs/server/extensionHostConnection.ts | 7 +++--- .../server/remoteExtensionHostAgentServer.ts | 7 ++++-- src/vs/server/serverEnvironmentService.ts | 3 +++ 18 files changed, 78 insertions(+), 26 deletions(-) rename resources/server/bin-dev/{server.bat => code-server.bat} (100%) rename resources/server/bin-dev/{server.sh => code-server.sh} (100%) rename resources/server/bin-dev/{ => remote-cli}/code.cmd (87%) rename resources/server/bin-dev/{ => remote-cli}/code.sh (72%) create mode 100644 resources/server/bin/code-server.cmd rename resources/server/bin/{server.sh => code-server.sh} (85%) delete mode 100644 resources/server/bin/code.cmd create mode 100644 resources/server/bin/remote-cli/code.cmd rename resources/server/bin/{ => remote-cli}/code.sh (86%) rename resources/server/bin/{server.cmd => server-old.cmd} (90%) create mode 100644 resources/server/bin/server-old.sh diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 94f5ca1234d..2c474af58b6 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -300,26 +300,28 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa if (platform === 'win32') { result = es.merge(result, - gulp.src('resources/server/bin/code.cmd', { base: '.' }) + gulp.src('resources/server/bin/remote-cli/code.cmd', { base: '.' }) .pipe(replace('@@VERSION@@', version)) .pipe(replace('@@COMMIT@@', commit)) .pipe(replace('@@APPNAME@@', product.applicationName)) - .pipe(rename(`bin/${product.applicationName}.cmd`)), + .pipe(rename(`bin/remote-cli/${product.applicationName}.cmd`)), gulp.src('resources/server/bin/helpers/browser.cmd', { base: '.' }) .pipe(replace('@@VERSION@@', version)) .pipe(replace('@@COMMIT@@', commit)) .pipe(replace('@@APPNAME@@', product.applicationName)) .pipe(rename(`bin/helpers/browser.cmd`)), - gulp.src('resources/server/bin/server.cmd', { base: '.' }) - .pipe(rename(`server.cmd`)) + gulp.src('resources/server/bin/server-old.cmd', { base: '.' }) + .pipe(rename(`server.cmd`)), + gulp.src('resources/server/bin/code-server.cmd', { base: '.' }) + .pipe(rename(`bin/${product.serverApplicationName}.cmd`)), ); } else if (platform === 'linux' || platform === 'alpine' || platform === 'darwin') { result = es.merge(result, - gulp.src('resources/server/bin/code.sh', { base: '.' }) + gulp.src('resources/server/bin/remote-cli/code.sh', { base: '.' }) .pipe(replace('@@VERSION@@', version)) .pipe(replace('@@COMMIT@@', commit)) .pipe(replace('@@APPNAME@@', product.applicationName)) - .pipe(rename(`bin/${product.applicationName}`)) + .pipe(rename(`bin/remote-cli/${product.applicationName}`)) .pipe(util.setExecutableBit()), gulp.src('resources/server/bin/helpers/browser.sh', { base: '.' }) .pipe(replace('@@VERSION@@', version)) @@ -327,8 +329,11 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa .pipe(replace('@@APPNAME@@', product.applicationName)) .pipe(rename(`bin/helpers/browser.sh`)) .pipe(util.setExecutableBit()), - gulp.src('resources/server/bin/server.sh', { base: '.' }) + gulp.src('resources/server/bin/server-old.sh', { base: '.' }) .pipe(rename(`server.sh`)) + .pipe(util.setExecutableBit()), + gulp.src('resources/server/bin/code-server.sh', { base: '.' }) + .pipe(rename(`bin/${product.serverApplicationName}`)) .pipe(util.setExecutableBit()) ); } diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts index 3084cb6a098..6f916d80ea7 100644 --- a/extensions/vscode-test-resolver/src/extension.ts +++ b/extensions/vscode-test-resolver/src/extension.ts @@ -82,7 +82,7 @@ export function activate(context: vscode.ExtensionContext) { return; } - const { updateUrl, commit, quality, serverDataFolderName, dataFolderName } = getProductConfiguration(); + const { updateUrl, commit, quality, serverDataFolderName, serverApplicationName, dataFolderName } = getProductConfiguration(); const commandArgs = ['--host=127.0.0.1', '--port=0', '--disable-telemetry', '--use-host-proxy', '--accept-server-license-terms']; const env = getNewEnv(); const remoteDataDir = process.env['TESTRESOLVER_DATA_FOLDER'] || path.join(os.homedir(), serverDataFolderName || `${dataFolderName}-testresolver`); @@ -102,7 +102,7 @@ export function activate(context: vscode.ExtensionContext) { commandArgs.push('--connection-token-file', connectionTokenFile); if (!commit) { // dev mode - const serverCommand = process.platform === 'win32' ? 'server.bat' : 'server.sh'; + const serverCommand = process.platform === 'win32' ? 'code-server.bat' : 'code-server.sh'; const vscodePath = path.resolve(path.join(context.extensionPath, '..', '..')); const serverCommandPath = path.join(vscodePath, 'resources', 'server', 'bin-dev', serverCommand); @@ -115,7 +115,7 @@ export function activate(context: vscode.ExtensionContext) { commandArgs.push('--install-builtin-extension', extensionToInstall); commandArgs.push('--start-server'); } - const serverCommand = process.platform === 'win32' ? 'server.cmd' : 'server.sh'; + const serverCommand = `${serverApplicationName}${process.platform === 'win32' ? '.cmd' : ''}`; let serverLocation = env['VSCODE_REMOTE_SERVER_PATH']; // support environment variable to specify location of server on disk if (!serverLocation) { const serverBin = path.join(remoteDataDir, 'bin'); @@ -390,6 +390,7 @@ export interface IProductConfiguration { commit: string; quality: string; dataFolderName: string; + serverApplicationName?: string; serverDataFolderName?: string; } diff --git a/product.json b/product.json index a8573b1e50f..8432c4ba44c 100644 --- a/product.json +++ b/product.json @@ -9,6 +9,7 @@ "serverGreeting": [], "serverLicense": [], "serverLicensePrompt": "", + "serverApplicationName": "code-server-oss", "win32DirName": "Microsoft Code OSS", "win32NameVersion": "Microsoft Code OSS", "win32RegValueName": "CodeOSS", diff --git a/resources/server/bin-dev/server.bat b/resources/server/bin-dev/code-server.bat similarity index 100% rename from resources/server/bin-dev/server.bat rename to resources/server/bin-dev/code-server.bat diff --git a/resources/server/bin-dev/server.sh b/resources/server/bin-dev/code-server.sh similarity index 100% rename from resources/server/bin-dev/server.sh rename to resources/server/bin-dev/code-server.sh diff --git a/resources/server/bin-dev/code.cmd b/resources/server/bin-dev/remote-cli/code.cmd similarity index 87% rename from resources/server/bin-dev/code.cmd rename to resources/server/bin-dev/remote-cli/code.cmd index ac906785045..044a63a14a5 100644 --- a/resources/server/bin-dev/code.cmd +++ b/resources/server/bin-dev/remote-cli/code.cmd @@ -1,6 +1,6 @@ @echo off setlocal -SET VSCODE_PATH=%~dp0..\..\.. +SET VSCODE_PATH=%~dp0..\..\..\.. FOR /F "tokens=* USEBACKQ" %%g IN (`where /r "%VSCODE_PATH%\.build\node" node.exe`) do (SET "NODE=%%g") call "%NODE%" "%VSCODE_PATH%\out\vs\server\cli.js" "Code Server - Dev" "" "" "code.cmd" %* endlocal diff --git a/resources/server/bin-dev/code.sh b/resources/server/bin-dev/remote-cli/code.sh similarity index 72% rename from resources/server/bin-dev/code.sh rename to resources/server/bin-dev/remote-cli/code.sh index 61e57cb7abe..18165bfe3ce 100755 --- a/resources/server/bin-dev/code.sh +++ b/resources/server/bin-dev/remote-cli/code.sh @@ -5,9 +5,9 @@ if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } - VSCODE_PATH=$(dirname $(dirname $(dirname $(dirname $(realpath "$0"))))) + VSCODE_PATH=$(dirname $(dirname $(dirname $(dirname $(dirname $(realpath "$0")))))) else - VSCODE_PATH=$(dirname $(dirname $(dirname $(dirname $(readlink -f $0))))) + VSCODE_PATH=$(dirname $(dirname $(dirname $(dirname $(dirname $(readlink -f $0)))))) fi PROD_NAME="Code Server - Dev" diff --git a/resources/server/bin/code-server.cmd b/resources/server/bin/code-server.cmd new file mode 100644 index 00000000000..57e163af8ce --- /dev/null +++ b/resources/server/bin/code-server.cmd @@ -0,0 +1,24 @@ +@echo off +setlocal + +set ROOT_DIR=%~dp0.. + +set _FIRST_ARG=%1 +if "%_FIRST_ARG:~0,9%"=="--inspect" ( + set INSPECT=%1 + shift +) else ( + set INSPECT= +) + +:loop1 +if "%~1"=="" goto after_loop +set RESTVAR=%RESTVAR% %1 +shift +goto loop1 + +:after_loop + +"%ROOT_DIR%\node.exe" %INSPECT% "%ROOT_DIR%\out\vs\server\main.js" %RESTVAR% + +endlocal diff --git a/resources/server/bin/server.sh b/resources/server/bin/code-server.sh similarity index 85% rename from resources/server/bin/server.sh rename to resources/server/bin/code-server.sh index 66b7ec6381d..982180598ee 100644 --- a/resources/server/bin/server.sh +++ b/resources/server/bin/code-server.sh @@ -7,6 +7,6 @@ case "$1" in --inspect*) INSPECT="$1"; shift;; esac -ROOT="$(dirname "$0")" +ROOT=$(dirname "$(dirname "$0")") "$ROOT/node" ${INSPECT:-} "$ROOT/out/vs/server/main.js" "$@" diff --git a/resources/server/bin/code.cmd b/resources/server/bin/code.cmd deleted file mode 100644 index 0cbff2f7c25..00000000000 --- a/resources/server/bin/code.cmd +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -setlocal -call "%~dp0..\node" "%~dp0..\out\vs\server\cli.js" "@@APPNAME@@" "@@VERSION@@" "@@COMMIT@@" "@@APPNAME@@.cmd" %* -endlocal \ No newline at end of file diff --git a/resources/server/bin/helpers/browser.cmd b/resources/server/bin/helpers/browser.cmd index 33625f17d45..5bf6d0fcb68 100644 --- a/resources/server/bin/helpers/browser.cmd +++ b/resources/server/bin/helpers/browser.cmd @@ -1,4 +1,5 @@ @echo off setlocal -call "%~dp0..\..\node" "%~dp0..\..\out\vs\server\cli.js" "@@APPNAME@@" "@@VERSION@@" "@@COMMIT@@" "@@APPNAME@@.cmd" "--openExternal" %* +set ROOT_DIR=%~dp0..\.. +call "%ROOT_DIR%\node.exe" "%ROOT_DIR%\out\vs\server\cli.js" "@@APPNAME@@" "@@VERSION@@" "@@COMMIT@@" "@@APPNAME@@.cmd" "--openExternal" %* endlocal diff --git a/resources/server/bin/remote-cli/code.cmd b/resources/server/bin/remote-cli/code.cmd new file mode 100644 index 00000000000..a33c6d3cf5c --- /dev/null +++ b/resources/server/bin/remote-cli/code.cmd @@ -0,0 +1,5 @@ +@echo off +setlocal +set ROOT_DIR=%~dp0..\.. +call "%ROOT_DIR%\node.exe" "%ROOT_DIR%\out\vs\server\cli.js" "@@APPNAME@@" "@@VERSION@@" "@@COMMIT@@" "@@APPNAME@@.cmd" %* +endlocal diff --git a/resources/server/bin/code.sh b/resources/server/bin/remote-cli/code.sh similarity index 86% rename from resources/server/bin/code.sh rename to resources/server/bin/remote-cli/code.sh index 2fadda2f2ba..20ed0ff4cfb 100644 --- a/resources/server/bin/code.sh +++ b/resources/server/bin/remote-cli/code.sh @@ -2,7 +2,7 @@ # # Copyright (c) Microsoft Corporation. All rights reserved. # -ROOT=$(dirname "$(dirname "$0")") +ROOT=$(dirname "$(dirname "$(dirname "$0")")") APP_NAME="@@APPNAME@@" VERSION="@@VERSION@@" diff --git a/resources/server/bin/server.cmd b/resources/server/bin/server-old.cmd similarity index 90% rename from resources/server/bin/server.cmd rename to resources/server/bin/server-old.cmd index 3b2c1b7a1e8..cdf9e5a552e 100644 --- a/resources/server/bin/server.cmd +++ b/resources/server/bin/server-old.cmd @@ -19,6 +19,6 @@ goto loop1 :after_loop -"%ROOT_DIR%node.exe" %INSPECT% "%ROOT_DIR%out\vs\server\main.js" %RESTVAR% +"%ROOT_DIR%node.exe" %INSPECT% "%ROOT_DIR%out\vs\server\main.js" --compatibility=1.63 %RESTVAR% endlocal diff --git a/resources/server/bin/server-old.sh b/resources/server/bin/server-old.sh new file mode 100644 index 00000000000..593a00ae6ce --- /dev/null +++ b/resources/server/bin/server-old.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env sh +# +# Copyright (c) Microsoft Corporation. All rights reserved. +# + +case "$1" in + --inspect*) INSPECT="$1"; shift;; +esac + +ROOT="$(dirname "$0")" + +"$ROOT/node" ${INSPECT:-} "$ROOT/out/vs/server/main.js" --compatibility=1.63 "$@" diff --git a/src/vs/server/extensionHostConnection.ts b/src/vs/server/extensionHostConnection.ts index 196d2bf6b8f..864c1fba3db 100644 --- a/src/vs/server/extensionHostConnection.ts +++ b/src/vs/server/extensionHostConnection.ts @@ -34,12 +34,13 @@ export async function buildUserEnvironment(startParamsEnv: { [key: string]: stri } const binFolder = environmentService.isBuilt ? join(environmentService.appRoot, 'bin') : join(environmentService.appRoot, 'resources', 'server', 'bin-dev'); + const remoteCliBinFolder = join(binFolder, 'remote-cli'); // contains the `code` command that can talk to the remote server const processEnv = process.env; let PATH = startParamsEnv['PATH'] || (userShellEnv ? userShellEnv['PATH'] : undefined) || processEnv['PATH']; if (PATH) { - PATH = binFolder + delimiter + PATH; + PATH = remoteCliBinFolder + delimiter + PATH; } else { - PATH = binFolder; + PATH = remoteCliBinFolder; } const env: IProcessEnvironment = { @@ -58,7 +59,7 @@ export async function buildUserEnvironment(startParamsEnv: { [key: string]: stri ...startParamsEnv }; if (!environmentService.args['without-browser-env-var']) { - env.BROWSER = join(binFolder, 'helpers', isWindows ? 'browser.cmd' : 'browser.sh'); + env.BROWSER = join(binFolder, 'helpers', isWindows ? 'browser.cmd' : 'browser.sh'); // a command that opens a browser on the local machine } setCaseInsensitive(env, 'PATH', PATH); diff --git a/src/vs/server/remoteExtensionHostAgentServer.ts b/src/vs/server/remoteExtensionHostAgentServer.ts index 53dfe17a9eb..273e124852d 100644 --- a/src/vs/server/remoteExtensionHostAgentServer.ts +++ b/src/vs/server/remoteExtensionHostAgentServer.ts @@ -925,6 +925,7 @@ function parseConnectionToken(args: ServerParsedArgs): { connectionToken: string let connectionToken = args['connection-token']; const connectionTokenFile = args['connection-token-file']; + const compatibility = args['compatibility'] === '1.63'; if (args['without-connection-token']) { if (connectionToken || connectionTokenFile) { @@ -959,9 +960,11 @@ function parseConnectionToken(args: ServerParsedArgs): { connectionToken: string } else { connectionToken = generateUuid(); console.log(`Connection token: ${connectionToken}`); - console.log(`Connection token or will made mandatory in the next release. To run without connection token, use '--without-connection-token'.`); + if (compatibility) { + console.log(`Connection token or will made mandatory in the next release. To run without connection token, use '--without-connection-token'.`); + } } - return { connectionToken, connectionTokenIsMandatory: false }; + return { connectionToken, connectionTokenIsMandatory: !compatibility }; } } diff --git a/src/vs/server/serverEnvironmentService.ts b/src/vs/server/serverEnvironmentService.ts index 6a0eb85a994..b1320a602f4 100644 --- a/src/vs/server/serverEnvironmentService.ts +++ b/src/vs/server/serverEnvironmentService.ts @@ -76,6 +76,7 @@ export const serverOptions: OptionDescriptions = { 'help': OPTIONS['help'], 'version': OPTIONS['version'], + 'compatibility': { type: 'string' }, _: OPTIONS['_'] }; @@ -175,6 +176,8 @@ export interface ServerParsedArgs { help: boolean; version: boolean; + compatibility: string + _: string[]; } From 0735c7537a7152b1f846b0250213d24ab17153cb Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 11 Jan 2022 21:25:31 +0100 Subject: [PATCH 2/3] server distro: cleaner package.json --- build/gulpfile.reh.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 2c474af58b6..8cacc9687c1 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -250,7 +250,7 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa const name = product.nameShort; const packageJsonStream = gulp.src(['remote/package.json'], { base: 'remote' }) - .pipe(json({ name, version })); + .pipe(json({ name, version, dependencies: undefined, optionalDependencies: undefined })); const date = new Date().toISOString(); From 61b042132eff394d281724de19712b5a27577331 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 11 Jan 2022 21:29:03 +0100 Subject: [PATCH 3/3] server distro: use 127.0.0.1 as default --- src/vs/server/main.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/vs/server/main.js b/src/vs/server/main.js index ba6fb9f9844..d98fedd4048 100644 --- a/src/vs/server/main.js +++ b/src/vs/server/main.js @@ -28,7 +28,7 @@ async function start() { // Do a quick parse to determine if a server or the cli needs to be started const parsedArgs = minimist(process.argv.slice(2), { boolean: ['start-server', 'list-extensions', 'print-ip-address', 'help', 'version', 'accept-server-license-terms'], - string: ['install-extension', 'install-builtin-extension', 'uninstall-extension', 'locate-extension', 'socket-path', 'host', 'port', 'pick-port'] + string: ['install-extension', 'install-builtin-extension', 'uninstall-extension', 'locate-extension', 'socket-path', 'host', 'port', 'pick-port', 'compatibility'] }); const extensionLookupArgs = ['list-extensions', 'locate-extension']; @@ -102,10 +102,11 @@ async function start() { const remoteExtensionHostAgentServer = await getRemoteExtensionHostAgentServer(); return remoteExtensionHostAgentServer.handleServerError(err); }); + const host = parsedArgs['host'] || (parsedArgs['compatibility'] !== '1.63' ? '127.0.0.1' : undefined); const nodeListenOptions = ( parsedArgs['socket-path'] ? { path: parsedArgs['socket-path'] } - : { host: parsedArgs['host'], port: await parsePort(parsedArgs['port'], parsedArgs['pick-port']) } + : { host, port: await parsePort(host, parsedArgs['port'], parsedArgs['pick-port']) } ); server.listen(nodeListenOptions, async () => { const serverGreeting = product.serverGreeting.join('\n'); @@ -156,12 +157,13 @@ async function start() { * If only `--port` is provided then connect to that port. * * In absence of specified ports, connect to port 8000. + * @param {string | undefined} host * @param {string | undefined} strPort * @param {string | undefined} strPickPort * @returns {Promise} * @throws */ -async function parsePort(strPort, strPickPort) { +async function parsePort(host, strPort, strPickPort) { let specificPort; if (strPort) { let range; @@ -171,7 +173,7 @@ async function parsePort(strPort, strPickPort) { return specificPort; } } else if (range = parseRange(strPort)) { - const port = await findFreePort(range.start, range.end); + const port = await findFreePort(host, range.start, range.end); if (port !== undefined) { return port; } @@ -189,7 +191,7 @@ async function parsePort(strPort, strPickPort) { if (range.start <= specificPort && specificPort <= range.end) { return specificPort; } else { - const port = await findFreePort(range.start, range.end); + const port = await findFreePort(host, range.start, range.end); if (port !== undefined) { return port; } @@ -220,16 +222,17 @@ function parseRange(strRange) { * Starting at the `start` port, look for a free port incrementing * by 1 until `end` inclusive. If no free port is found, undefined is returned. * + * @param {string | undefined} host * @param {number} start * @param {number} end * @returns {Promise} * @throws */ -async function findFreePort(start, end) { +async function findFreePort(host, start, end) { const testPort = (port) => { return new Promise((resolve) => { const server = http.createServer(); - server.listen(port, '127.0.0.1', () => { + server.listen(port, host, () => { server.close(); resolve(true); }).on('error', () => {