diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 59bfccd1142..8f012a9315c 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -1075,7 +1075,7 @@ export class WindowsManager implements IWindowsMainService { if (!options.forceOpenWorkspaceAsFile) { const workspace = this.workspacesMainService.resolveLocalWorkspaceSync(URI.file(candidate)); if (workspace) { - return { workspace: { id: workspace.id, configPath: workspace.configPath }, remoteAuthority }; + return { workspace: { id: workspace.id, configPath: workspace.configPath }, remoteAuthority: workspace.remoteAuthority }; } } diff --git a/src/vs/platform/workspaces/common/workspaces.ts b/src/vs/platform/workspaces/common/workspaces.ts index dab9dd39404..890e9f55f13 100644 --- a/src/vs/platform/workspaces/common/workspaces.ts +++ b/src/vs/platform/workspaces/common/workspaces.ts @@ -70,6 +70,7 @@ export type IStoredWorkspaceFolder = IRawFileWorkspaceFolder | IRawUriWorkspaceF export interface IResolvedWorkspace extends IWorkspaceIdentifier { folders: IWorkspaceFolder[]; + remoteAuthority?: string; } export interface IStoredWorkspace { @@ -114,7 +115,7 @@ export interface IWorkspacesMainService extends IWorkspacesService { export interface IWorkspacesService { _serviceBrand: any; - createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[]): Promise; + createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): Promise; } export function isSingleFolderWorkspaceIdentifier(obj: any): obj is ISingleFolderWorkspaceIdentifier { diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index d61031e0e9d..70bb98c8626 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -20,10 +20,10 @@ import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { Disposable } from 'vs/base/common/lifecycle'; import { originalFSPath, dirname as resourcesDirname, isEqualOrParent, joinPath } from 'vs/base/common/resources'; -import { getRemoteAuthority } from 'vs/platform/remote/common/remoteHosts'; export interface IStoredWorkspace { folders: IStoredWorkspaceFolder[]; + remoteAuthority?: string; } export class WorkspacesMainService extends Disposable implements IWorkspacesMainService { @@ -73,7 +73,8 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain return { id: workspaceIdentifier.id, configPath: workspaceIdentifier.configPath, - folders: toWorkspaceFolders(workspace.folders, resourcesDirname(path)) + folders: toWorkspaceFolders(workspace.folders, resourcesDirname(path)), + remoteAuthority: workspace.remoteAuthority }; } catch (error) { this.logService.warn(error.toString()); @@ -104,8 +105,8 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain return isEqualOrParent(path, this.environmentService.untitledWorkspacesHome); } - createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[]): Promise { - const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders); + createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): Promise { + const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders, remoteAuthority); const configPath = workspace.configPath.fsPath; return mkdirp(dirname(configPath)).then(() => { @@ -113,8 +114,8 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain }); } - createUntitledWorkspaceSync(folders?: IWorkspaceFolderCreationData[]): IWorkspaceIdentifier { - const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders); + createUntitledWorkspaceSync(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): IWorkspaceIdentifier { + const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders, remoteAuthority); const configPath = workspace.configPath.fsPath; const configPathDir = dirname(configPath); @@ -131,7 +132,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain return workspace; } - private newUntitledWorkspace(folders: IWorkspaceFolderCreationData[] = []): { workspace: IWorkspaceIdentifier, storedWorkspace: IStoredWorkspace } { + private newUntitledWorkspace(folders: IWorkspaceFolderCreationData[] = [], remoteAuthority?: string): { workspace: IWorkspaceIdentifier, storedWorkspace: IStoredWorkspace } { const randomId = (Date.now() + Math.round(Math.random() * 1000)).toString(); const untitledWorkspaceConfigFolder = joinPath(this.untitledWorkspacesHome, randomId); const untitledWorkspaceConfigPath = joinPath(untitledWorkspaceConfigFolder, UNTITLED_WORKSPACE_NAME); @@ -144,7 +145,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain return { workspace: this.getWorkspaceIdentifier(untitledWorkspaceConfigPath), - storedWorkspace: { folders: storedWorkspaceFolder } + storedWorkspace: { folders: storedWorkspaceFolder, remoteAuthority } }; } @@ -230,8 +231,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain if (!resolvedWorkspace) { this.doDeleteUntitledWorkspaceSync(workspace); } else { - const remoteAuthority = resolvedWorkspace.folders.length ? getRemoteAuthority(resolvedWorkspace.folders[0].uri) : undefined; - untitledWorkspaces.push({ workspace, remoteAuthority }); + untitledWorkspaces.push({ workspace, remoteAuthority: resolvedWorkspace.remoteAuthority }); } } } catch (error) { diff --git a/src/vs/platform/workspaces/node/workspacesIpc.ts b/src/vs/platform/workspaces/node/workspacesIpc.ts index 11ae4da17ec..59caecf0560 100644 --- a/src/vs/platform/workspaces/node/workspacesIpc.ts +++ b/src/vs/platform/workspaces/node/workspacesIpc.ts @@ -19,7 +19,8 @@ export class WorkspacesChannel implements IServerChannel { call(_, command: string, arg?: any): Promise { switch (command) { case 'createUntitledWorkspace': { - const rawFolders: IWorkspaceFolderCreationData[] = arg; + const rawFolders: IWorkspaceFolderCreationData[] = arg[0]; + const remoteAuthority: string = arg[1]; let folders: IWorkspaceFolderCreationData[] | undefined = undefined; if (Array.isArray(rawFolders)) { folders = rawFolders.map(rawFolder => { @@ -30,7 +31,7 @@ export class WorkspacesChannel implements IServerChannel { }); } - return this.service.createUntitledWorkspace(folders); + return this.service.createUntitledWorkspace(folders, remoteAuthority); } } @@ -44,7 +45,7 @@ export class WorkspacesChannelClient implements IWorkspacesService { constructor(private channel: IChannel) { } - createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[]): Promise { - return this.channel.call('createUntitledWorkspace', folders).then(reviveWorkspaceIdentifier); + createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): Promise { + return this.channel.call('createUntitledWorkspace', [folders, remoteAuthority]).then(reviveWorkspaceIdentifier); } } diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts index 95a46d91ff0..31c50d16b58 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts @@ -114,7 +114,7 @@ suite('WorkspacesMainService', () => { const folder1URI = URI.parse('myscheme://server/work/p/f1'); const folder2URI = URI.parse('myscheme://server/work/o/f3'); - return service.createUntitledWorkspace([{ uri: folder1URI }, { uri: folder2URI }]).then(workspace => { + return service.createUntitledWorkspace([{ uri: folder1URI }, { uri: folder2URI }], 'server').then(workspace => { assert.ok(workspace); assert.ok(fs.existsSync(workspace.configPath.fsPath)); assert.ok(service.isUntitledWorkspace(workspace)); @@ -126,6 +126,8 @@ suite('WorkspacesMainService', () => { assert.ok(!(ws.folders[0]).name); assert.ok(!(ws.folders[1]).name); + + assert.equal(ws.remoteAuthority, 'server'); }); }); diff --git a/src/vs/workbench/browser/actions/workspaceActions.ts b/src/vs/workbench/browser/actions/workspaceActions.ts index 4520821cde9..fdff577ff72 100644 --- a/src/vs/workbench/browser/actions/workspaceActions.ts +++ b/src/vs/workbench/browser/actions/workspaceActions.ts @@ -252,8 +252,9 @@ export class DuplicateWorkspaceInNewWindowAction extends Action { run(): Promise { const folders = this.workspaceContextService.getWorkspace().folders; + const remoteAuthority = this.windowService.getConfiguration().remoteAuthority; - return this.workspacesService.createUntitledWorkspace(folders).then(newWorkspace => { + return this.workspacesService.createUntitledWorkspace(folders, remoteAuthority).then(newWorkspace => { return this.workspaceEditingService.copyWorkspaceSettings(newWorkspace).then(() => { return this.windowService.openWindow([{ uri: newWorkspace.configPath, typeHint: 'file' }], { forceNewWindow: true }); });