diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index d64fbe9ea32932b119128e001288ec071a956bc4..d1e457511ea5f0eebbb8bd0373a14ecc1461e88c 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -575,16 +575,43 @@ export class CodeApplication extends Disposable { const hasFolderURIs = hasArgs(args['folder-uri']); const hasFileURIs = hasArgs(args['file-uri']); const noRecentEntry = args['skip-add-to-recently-opened'] === true; + const waitMarkerFileURI = args.wait && args.waitMarkerFilePath ? URI.file(args.waitMarkerFilePath) : undefined; if (args['new-window'] && !hasCliArgs && !hasFolderURIs && !hasFileURIs) { - return this.windowsMainService.open({ context, cli: args, forceNewWindow: true, forceEmpty: true, noRecentEntry, initialStartup: true }); // new window if "-n" was used without paths + // new window if "-n" was used without paths + return this.windowsMainService.open({ + context, + cli: args, + forceNewWindow: true, + forceEmpty: true, + noRecentEntry, + waitMarkerFileURI, + initialStartup: true + }); } if (macOpenFiles && macOpenFiles.length && !hasCliArgs && !hasFolderURIs && !hasFileURIs) { - return this.windowsMainService.open({ context: OpenContext.DOCK, cli: args, urisToOpen: macOpenFiles.map(file => ({ uri: URI.file(file) })), noRecentEntry, initialStartup: true }); // mac: open-file event received on startup + // mac: open-file event received on startup + return this.windowsMainService.open({ + context: OpenContext.DOCK, + cli: args, + urisToOpen: macOpenFiles.map(file => ({ uri: URI.file(file) })), + noRecentEntry, + waitMarkerFileURI, + initialStartup: true + }); } - return this.windowsMainService.open({ context, cli: args, forceNewWindow: args['new-window'] || (!hasCliArgs && args['unity-launch']), diffMode: args.diff, noRecentEntry, initialStartup: true }); // default: read paths from cli + // default: read paths from cli + return this.windowsMainService.open({ + context, + cli: args, + forceNewWindow: args['new-window'] || (!hasCliArgs && args['unity-launch']), + diffMode: args.diff, + noRecentEntry, + waitMarkerFileURI, + initialStartup: true + }); } private afterWindowOpen(accessor: ServicesAccessor): void { diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index ad65629c6a0db9e50d575d8280fd3a130a279e51..5118beaa9e5e22e0a9b8d204c3552c1937354d05 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -8,8 +8,8 @@ import { app, dialog } from 'electron'; import { assign } from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; import product from 'vs/platform/product/node/product'; -import { parseMainProcessArgv, createWaitMarkerFile } from 'vs/platform/environment/node/argvHelper'; -import { addArg } from 'vs/platform/environment/node/argv'; +import { parseMainProcessArgv } from 'vs/platform/environment/node/argvHelper'; +import { addArg, createWaitMarkerFile } from 'vs/platform/environment/node/argv'; import { mkdirp } from 'vs/base/node/pfs'; import { validatePaths } from 'vs/code/node/paths'; import { LifecycleService, ILifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; @@ -357,20 +357,13 @@ function main(): void { // Note: we are not doing this if the wait marker has been already // added as argument. This can happen if Code was started from CLI. if (args.wait && !args.waitMarkerFilePath) { - createWaitMarkerFile(args.verbose).then(waitMarkerFilePath => { - if (waitMarkerFilePath) { - addArg(process.argv, '--waitMarkerFilePath', waitMarkerFilePath); - args.waitMarkerFilePath = waitMarkerFilePath; - } - - startup(args); - }); - } - - // Otherwise just startup normally - else { - startup(args); + const waitMarkerFilePath = createWaitMarkerFile(args.verbose); + if (waitMarkerFilePath) { + addArg(process.argv, '--waitMarkerFilePath', waitMarkerFilePath); + args.waitMarkerFilePath = waitMarkerFilePath; + } } + startup(args); } main(); diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 0719a5e71209d995b06b9e47474b1e0ae8e03929..deff3d73bdc719e67606a710df6f75b0a469b02a 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -421,8 +421,8 @@ export class WindowsManager implements IWindowsMainService { } // When run with --wait, make sure we keep the paths to wait for - if (fileInputs && openConfig.cli.wait && openConfig.cli.waitMarkerFilePath) { - fileInputs.filesToWait = { paths: [...fileInputs.filesToDiff, ...fileInputs.filesToOpen, ...fileInputs.filesToCreate], waitMarkerFileUri: URI.file(openConfig.cli.waitMarkerFilePath) }; + if (fileInputs && openConfig.waitMarkerFileURI) { + fileInputs.filesToWait = { paths: [...fileInputs.filesToDiff, ...fileInputs.filesToOpen, ...fileInputs.filesToCreate], waitMarkerFileUri: openConfig.waitMarkerFileURI }; } // @@ -506,8 +506,9 @@ export class WindowsManager implements IWindowsMainService { // If we got started with --wait from the CLI, we need to signal to the outside when the window // used for the edit operation is closed or loaded to a different folder so that the waiting // process can continue. We do this by deleting the waitMarkerFilePath. - if (openConfig.context === OpenContext.CLI && openConfig.cli.wait && openConfig.cli.waitMarkerFilePath && usedWindows.length === 1 && usedWindows[0]) { - this.waitForWindowCloseOrLoad(usedWindows[0].id).then(() => fs.unlink(openConfig.cli.waitMarkerFilePath!, _error => undefined)); + const waitMarkerFileURI = openConfig.waitMarkerFileURI; + if (openConfig.context === OpenContext.CLI && waitMarkerFileURI && usedWindows.length === 1 && usedWindows[0]) { + this.waitForWindowCloseOrLoad(usedWindows[0].id).then(() => fs.unlink(waitMarkerFileURI.fsPath, _error => undefined)); } return usedWindows; @@ -1216,7 +1217,16 @@ export class WindowsManager implements IWindowsMainService { } // Open it - this.open({ context: openConfig.context, cli: openConfig.cli, forceNewWindow: true, forceEmpty: !cliArgs.length && !folderUris.length && !fileUris.length, userEnv: openConfig.userEnv, noRecentEntry: true }); + const openArgs: IOpenConfiguration = { + context: openConfig.context, + cli: openConfig.cli, + forceNewWindow: true, + forceEmpty: !cliArgs.length && !folderUris.length && !fileUris.length, + userEnv: openConfig.userEnv, + noRecentEntry: true, + waitMarkerFileURI: openConfig.waitMarkerFileURI + }; + this.open(openArgs); } private openInBrowserWindow(options: IOpenBrowserWindowOptions): ICodeWindow { diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index 6f558debea568cc66ce153e7697215d516309ba8..1f8b17a33354b01ab315d7880ea0fdbc95c6c4c5 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -5,8 +5,8 @@ import { spawn, ChildProcess } from 'child_process'; import { assign } from 'vs/base/common/objects'; -import { buildHelpMessage, buildVersionMessage, addArg } from 'vs/platform/environment/node/argv'; -import { parseCLIProcessArgv, createWaitMarkerFile } from 'vs/platform/environment/node/argvHelper'; +import { buildHelpMessage, buildVersionMessage, addArg, createWaitMarkerFile } from 'vs/platform/environment/node/argv'; +import { parseCLIProcessArgv } from 'vs/platform/environment/node/argvHelper'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import product from 'vs/platform/product/node/product'; import pkg from 'vs/platform/product/node/package'; @@ -229,7 +229,7 @@ export async function main(argv: string[]): Promise { // is closed and then exit the waiting process. let waitMarkerFilePath: string | undefined; if (args.wait) { - waitMarkerFilePath = await createWaitMarkerFile(verbose); + waitMarkerFilePath = createWaitMarkerFile(verbose); if (waitMarkerFilePath) { addArg(argv, '--waitMarkerFilePath', waitMarkerFilePath); } diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 170944dbe395b05c5ffc6dfdfd0a9c26d930045b..55a87bcc864cee76b8c60d18bc6e317e94b2e261 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -7,6 +7,8 @@ import * as minimist from 'minimist'; import * as os from 'os'; import { localize } from 'vs/nls'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; +import { join } from 'path'; +import { writeFileSync } from 'fs'; /** * This code is also used by standalone cli's. Avoid adding any other dependencies. @@ -253,4 +255,21 @@ export function addArg(argv: string[], ...args: string[]): string[] { } return argv; +} + +export function createWaitMarkerFile(verbose?: boolean): string | undefined { + const randomWaitMarkerPath = join(os.tmpdir(), Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 10)); + + try { + writeFileSync(randomWaitMarkerPath, ''); + if (verbose) { + console.log(`Marker file for --wait created: ${randomWaitMarkerPath}`); + } + return randomWaitMarkerPath; + } catch (err) { + if (verbose) { + console.error(`Failed to create marker file for --wait: ${err}`); + } + return undefined; + } } \ No newline at end of file diff --git a/src/vs/platform/environment/node/argvHelper.ts b/src/vs/platform/environment/node/argvHelper.ts index 7e0819f77ab00c1cd83f122f3dc8fbe7d08bdea7..f2887c6191cddae0a3b0b7985aa9699aa6d45209 100644 --- a/src/vs/platform/environment/node/argvHelper.ts +++ b/src/vs/platform/environment/node/argvHelper.ts @@ -4,14 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { tmpdir } from 'os'; import { firstIndex } from 'vs/base/common/arrays'; import { localize } from 'vs/nls'; import { ParsedArgs } from '../common/environment'; import { MIN_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/common/files'; import { parseArgs } from 'vs/platform/environment/node/argv'; -import { join } from 'vs/base/common/path'; -import { writeFile } from 'vs/base/node/pfs'; function validate(args: ParsedArgs): ParsedArgs { if (args.goto) { @@ -60,21 +57,3 @@ export function parseCLIProcessArgv(processArgv: string[]): ParsedArgs { return validate(parseArgs(args)); } - -export function createWaitMarkerFile(verbose?: boolean): Promise { - const randomWaitMarkerPath = join(tmpdir(), Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 10)); - - return writeFile(randomWaitMarkerPath, '').then(() => { - if (verbose) { - console.log(`Marker file for --wait created: ${randomWaitMarkerPath}`); - } - - return randomWaitMarkerPath; - }, error => { - if (verbose) { - console.error(`Failed to create marker file for --wait: ${error}`); - } - - return Promise.resolve(undefined); - }); -} diff --git a/src/vs/platform/launch/electron-main/launchService.ts b/src/vs/platform/launch/electron-main/launchService.ts index 1b6f0b99215fd0301b390568b6d80d0c6aadca8c..d7690d28c8b954f6c29ec4746733feaa38637dcd 100644 --- a/src/vs/platform/launch/electron-main/launchService.ts +++ b/src/vs/platform/launch/electron-main/launchService.ts @@ -163,9 +163,11 @@ export class LaunchService implements ILaunchService { const context = !!userEnv['VSCODE_CLI'] ? OpenContext.CLI : OpenContext.DESKTOP; let usedWindows: ICodeWindow[] = []; + const waitMarkerFileURI = args.wait && args.waitMarkerFilePath ? URI.file(args.waitMarkerFilePath) : undefined; + // Special case extension development if (!!args.extensionDevelopmentPath) { - this.windowsMainService.openExtensionDevelopmentHostWindow(args.extensionDevelopmentPath, { context, cli: args, userEnv }); + this.windowsMainService.openExtensionDevelopmentHostWindow(args.extensionDevelopmentPath, { context, cli: args, userEnv, waitMarkerFileURI }); } // Start without file/folder arguments @@ -199,7 +201,14 @@ export class LaunchService implements ILaunchService { } if (openNewWindow) { - usedWindows = this.windowsMainService.open({ context, cli: args, userEnv, forceNewWindow: true, forceEmpty: true }); + usedWindows = this.windowsMainService.open({ + context, + cli: args, + userEnv, + forceNewWindow: true, + forceEmpty: true, + waitMarkerFileURI + }); } else { usedWindows = [this.windowsMainService.focusLastActive(args, context)]; } @@ -216,17 +225,18 @@ export class LaunchService implements ILaunchService { forceReuseWindow: args['reuse-window'], diffMode: args.diff, addMode: args.add, - noRecentEntry: !!args['skip-add-to-recently-opened'] + noRecentEntry: !!args['skip-add-to-recently-opened'], + waitMarkerFileURI }); } // If the other instance is waiting to be killed, we hook up a window listener if one window // is being used and only then resolve the startup promise which will kill this second instance. // In addition, we poll for the wait marker file to be deleted to return. - if (args.wait && args.waitMarkerFilePath && usedWindows.length === 1 && usedWindows[0]) { + if (waitMarkerFileURI && usedWindows.length === 1 && usedWindows[0]) { return Promise.race([ this.windowsMainService.waitForWindowCloseOrLoad(usedWindows[0].id), - whenDeleted(args.waitMarkerFilePath) + whenDeleted(waitMarkerFileURI.fsPath) ]).then(() => undefined, () => undefined); } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index e604d94d5293928bf96007e646fbed0fc34b51ab..0c2d72ce6c06fbd899c82d33b6cd38891a7bff38 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -149,7 +149,7 @@ export interface IWindowsService { toggleSharedProcess(): Promise; // Global methods - openWindow(windowId: number, uris: IURIToOpen[], options?: IOpenSettings): Promise; + openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise; openNewWindow(options?: INewWindowOptions): Promise; showWindow(windowId: number): Promise; getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]>; @@ -183,6 +183,7 @@ export interface IOpenSettings { diffMode?: boolean; addMode?: boolean; noRecentEntry?: boolean; + waitMarkerFileURI?: URI; args?: ParsedArgs; } diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index 5ba6a4e345f228009e189b5556548b8b09fd8228..8630ea767248b8e80db741ea5f724ef831cc6e80 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -98,7 +98,7 @@ export class WindowService extends Disposable implements IWindowService { return this.windowsService.enterWorkspace(this.windowId, path); } - openWindow(uris: IURIToOpen[], options?: IOpenSettings): Promise { + openWindow(uris: IURIToOpen[], options: IOpenSettings = {}): Promise { if (!!this.configuration.remoteAuthority) { uris.forEach(u => u.label = u.label || this.getRecentLabel(u, !!(options && options.forceOpenWorkspaceAsFile))); } diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index e455a54ce8818cfa966f08ddc9d888cfb81797b1..15338fd6063337efd64e2abc57fdb5a3b9369ba8 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, CrashReporterStartOptions, IMessageBoxResult, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions, IDevToolsOptions, INewWindowOptions, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, CrashReporterStartOptions, IMessageBoxResult, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions, IDevToolsOptions, INewWindowOptions, IURIToOpen, IOpenSettings } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IRecentlyOpened, IRecent, isRecentWorkspace } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; @@ -186,7 +186,7 @@ export class WindowsService implements IWindowsService { return this.channel.call('toggleSharedProcess'); } - openWindow(windowId: number, uris: IURIToOpen[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean, args?: ParsedArgs }): Promise { + openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise { return this.channel.call('openWindow', [windowId, uris, options]); } diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index 392a44d318a31560299fe4387f4285204e19fa75..8a83fc27bd8981429a3c444f8b6f420314f117cb 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -125,6 +125,7 @@ export interface IOpenConfiguration { readonly cli: ParsedArgs; readonly userEnv?: IProcessEnvironment; readonly urisToOpen?: IURIToOpen[]; + readonly waitMarkerFileURI?: URI; readonly preferNewWindow?: boolean; readonly forceNewWindow?: boolean; readonly forceNewTabbedWindow?: boolean; diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 100a9e2533ae9b5afa804eebced75ed439236bf1..2ca580585f7ececc038272b2a956812ec88b3836 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -273,7 +273,7 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable }); } - async openWindow(windowId: number, urisToOpen: IURIToOpen[], options: IOpenSettings = {}): Promise { + async openWindow(windowId: number, urisToOpen: IURIToOpen[], options: IOpenSettings): Promise { this.logService.trace('windowsService#openWindow'); if (!urisToOpen || !urisToOpen.length) { return undefined; @@ -289,7 +289,8 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable forceOpenWorkspaceAsFile: options.forceOpenWorkspaceAsFile, diffMode: options.diffMode, addMode: options.addMode, - noRecentEntry: options.noRecentEntry + noRecentEntry: options.noRecentEntry, + waitMarkerFileURI: options.waitMarkerFileURI }); } diff --git a/src/vs/platform/windows/node/windowsIpc.ts b/src/vs/platform/windows/node/windowsIpc.ts index 3633600dd3e8e636fe25926afb4bf146e9340a88..3a162d5dfb43b882dbe544bbc1d48b52444b7b8f 100644 --- a/src/vs/platform/windows/node/windowsIpc.ts +++ b/src/vs/platform/windows/node/windowsIpc.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IServerChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IWindowsService, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { IWindowsService, IURIToOpen, IOpenSettings } from 'vs/platform/windows/common/windows'; import { reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { URI } from 'vs/base/common/uri'; import { IRecent, isRecentFile, isRecentFolder } from 'vs/platform/history/common/history'; @@ -86,7 +86,13 @@ export class WindowsChannel implements IServerChannel { case 'minimizeWindow': return this.service.minimizeWindow(arg); case 'onWindowTitleDoubleClick': return this.service.onWindowTitleDoubleClick(arg); case 'setDocumentEdited': return this.service.setDocumentEdited(arg[0], arg[1]); - case 'openWindow': return this.service.openWindow(arg[0], arg[1] ? (arg[1]).map(r => { r.uri = URI.revive(r.uri); return r; }) : arg[1], arg[2]); + case 'openWindow': { + const urisToOpen: IURIToOpen[] = arg[1]; + const options: IOpenSettings = arg[2]; + urisToOpen.forEach(r => { r.uri = URI.revive(r.uri); return r; }); + options.waitMarkerFileURI = options.waitMarkerFileURI && URI.revive(options.waitMarkerFileURI); + return this.service.openWindow(arg[0], urisToOpen, options); + } case 'openNewWindow': return this.service.openNewWindow(arg); case 'showWindow': return this.service.showWindow(arg); case 'getWindows': return this.service.getWindows(); diff --git a/src/vs/workbench/api/node/extHostCLIServer.ts b/src/vs/workbench/api/node/extHostCLIServer.ts index fa7a9b70747db08373d6505c05e1583b5ae00ba6..b19e1b498bc4bcdd5bcb6547aec998896df159b9 100644 --- a/src/vs/workbench/api/node/extHostCLIServer.ts +++ b/src/vs/workbench/api/node/extHostCLIServer.ts @@ -7,10 +7,20 @@ import { generateRandomPipeName } from 'vs/base/parts/ipc/node/ipc.net'; import * as http from 'http'; import * as fs from 'fs'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; -import { IURIToOpen, URIType } from 'vs/platform/windows/common/windows'; +import { IURIToOpen, URIType, IOpenSettings } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; import { hasWorkspaceFileExtension } from 'vs/platform/workspaces/common/workspaces'; +export interface OpenCommandPipeArgs { + type: 'open'; + fileURIs?: string[]; + folderURIs: string[]; + forceNewWindow?: boolean; + diffMode?: boolean; + addMode?: boolean; + forceReuseWindow?: boolean; + waitMarkerFilePath?: string; +} export class CLIServer { @@ -41,7 +51,7 @@ export class CLIServer { return this._ipcHandlePath; } - private collectURIToOpen(strs: string[], typeHint: URIType, result: IURIToOpen[]): void { + private collectURIToOpen(strs: string[] | undefined, typeHint: URIType, result: IURIToOpen[]): void { if (Array.isArray(strs)) { for (const s of strs) { try { @@ -58,7 +68,7 @@ export class CLIServer { req.setEncoding('utf8'); req.on('data', (d: string) => chunks.push(d)); req.on('end', () => { - const data = JSON.parse(chunks.join('')); + const data: OpenCommandPipeArgs | any = JSON.parse(chunks.join('')); switch (data.type) { case 'open': this.open(data, res); @@ -76,8 +86,8 @@ export class CLIServer { }); } - private open(data: any, res: http.ServerResponse) { - let { fileURIs, folderURIs, forceNewWindow, diffMode, addMode, forceReuseWindow } = data; + private open(data: OpenCommandPipeArgs, res: http.ServerResponse) { + let { fileURIs, folderURIs, forceNewWindow, diffMode, addMode, forceReuseWindow, waitMarkerFilePath } = data; if (folderURIs && folderURIs.length || fileURIs && fileURIs.length) { const urisToOpen: IURIToOpen[] = []; this.collectURIToOpen(folderURIs, 'folder', urisToOpen); @@ -85,7 +95,9 @@ export class CLIServer { if (!forceReuseWindow && urisToOpen.some(o => o.typeHint === 'folder' || (o.typeHint === 'file' && hasWorkspaceFileExtension(o.uri.path)))) { forceNewWindow = true; } - this._commands.executeCommand('_files.windowOpen', urisToOpen, { forceNewWindow, diffMode, addMode, forceReuseWindow }); + const waitMarkerFileURI = waitMarkerFilePath ? URI.file(waitMarkerFilePath) : undefined; + const windowOpenArgs: IOpenSettings = { forceNewWindow, diffMode, addMode, forceReuseWindow, waitMarkerFileURI }; + this._commands.executeCommand('_files.windowOpen', urisToOpen, windowOpenArgs); } res.writeHead(200); res.end(); diff --git a/src/vs/workbench/browser/nodeless.simpleservices.ts b/src/vs/workbench/browser/nodeless.simpleservices.ts index 297d4d64554209a7d9332d5929968317fedcd0b5..347b292640f5822167b24f5c4f2fb6d3265259c2 100644 --- a/src/vs/workbench/browser/nodeless.simpleservices.ts +++ b/src/vs/workbench/browser/nodeless.simpleservices.ts @@ -48,7 +48,7 @@ import { InMemoryStorageService, IStorageService } from 'vs/platform/storage/com import { ITextMateService, IGrammar as ITextMategrammar } from 'vs/workbench/services/textMate/common/textMateService'; import { LanguageId, TokenizationRegistry } from 'vs/editor/common/modes'; import { IUpdateService, State } from 'vs/platform/update/common/update'; -import { IWindowConfiguration, IPath, IPathsToWaitFor, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService } from 'vs/platform/windows/common/windows'; +import { IWindowConfiguration, IPath, IPathsToWaitFor, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService, IOpenSettings } from 'vs/platform/windows/common/windows'; import { IProcessEnvironment, isWindows } from 'vs/base/common/platform'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceFolderCreationData, isSingleFolderWorkspaceIdentifier, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { ExportData } from 'vs/base/common/performance'; @@ -1431,7 +1431,7 @@ export class SimpleWindowService implements IWindowService { return Promise.resolve(); } - openWindow(_uris: IURIToOpen[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): Promise { + openWindow(_uris: IURIToOpen[], _options?: IOpenSettings): Promise { return Promise.resolve(); } @@ -1606,7 +1606,7 @@ export class SimpleWindowsService implements IWindowsService { } // Global methods - openWindow(_windowId: number, _uris: IURIToOpen[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): Promise { + openWindow(_windowId: number, _uris: IURIToOpen[], _options: IOpenSettings): Promise { return Promise.resolve(); } diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 3e4ba78b7b13c80d366a00fe633f0bdbde6abf7a..9a321aec745974c756d0e492a6512cb7f99142bf 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -37,7 +37,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService, ServicesAccessor, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration, MenuBarVisibility, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration, MenuBarVisibility, IURIToOpen, IOpenSettings } from 'vs/platform/windows/common/windows'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -1222,7 +1222,7 @@ export class TestWindowService implements IWindowService { return Promise.resolve(); } - openWindow(_uris: IURIToOpen[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): Promise { + openWindow(_uris: IURIToOpen[], _options?: IOpenSettings): Promise { return Promise.resolve(); } @@ -1431,7 +1431,7 @@ export class TestWindowsService implements IWindowsService { } // Global methods - openWindow(_windowId: number, _uris: IURIToOpen[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): Promise { + openWindow(_windowId: number, _uris: IURIToOpen[], _options: IOpenSettings): Promise { return Promise.resolve(); }