Skip to content

Commit 60ebcd1

Browse files
committed
duplicate workspace forgets window authority
1 parent 2015bca commit 60ebcd1

6 files changed

Lines changed: 23 additions & 18 deletions

File tree

src/vs/code/electron-main/windows.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,7 @@ export class WindowsManager implements IWindowsMainService {
10751075
if (!options.forceOpenWorkspaceAsFile) {
10761076
const workspace = this.workspacesMainService.resolveLocalWorkspaceSync(URI.file(candidate));
10771077
if (workspace) {
1078-
return { workspace: { id: workspace.id, configPath: workspace.configPath }, remoteAuthority };
1078+
return { workspace: { id: workspace.id, configPath: workspace.configPath }, remoteAuthority: workspace.remoteAuthority };
10791079
}
10801080
}
10811081

src/vs/platform/workspaces/common/workspaces.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export type IStoredWorkspaceFolder = IRawFileWorkspaceFolder | IRawUriWorkspaceF
7070

7171
export interface IResolvedWorkspace extends IWorkspaceIdentifier {
7272
folders: IWorkspaceFolder[];
73+
remoteAuthority?: string;
7374
}
7475

7576
export interface IStoredWorkspace {
@@ -114,7 +115,7 @@ export interface IWorkspacesMainService extends IWorkspacesService {
114115
export interface IWorkspacesService {
115116
_serviceBrand: any;
116117

117-
createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[]): Promise<IWorkspaceIdentifier>;
118+
createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): Promise<IWorkspaceIdentifier>;
118119
}
119120

120121
export function isSingleFolderWorkspaceIdentifier(obj: any): obj is ISingleFolderWorkspaceIdentifier {

src/vs/platform/workspaces/electron-main/workspacesMainService.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ import { URI } from 'vs/base/common/uri';
2020
import { Schemas } from 'vs/base/common/network';
2121
import { Disposable } from 'vs/base/common/lifecycle';
2222
import { originalFSPath, dirname as resourcesDirname, isEqualOrParent, joinPath } from 'vs/base/common/resources';
23-
import { getRemoteAuthority } from 'vs/platform/remote/common/remoteHosts';
2423

2524
export interface IStoredWorkspace {
2625
folders: IStoredWorkspaceFolder[];
26+
remoteAuthority?: string;
2727
}
2828

2929
export class WorkspacesMainService extends Disposable implements IWorkspacesMainService {
@@ -73,7 +73,8 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain
7373
return {
7474
id: workspaceIdentifier.id,
7575
configPath: workspaceIdentifier.configPath,
76-
folders: toWorkspaceFolders(workspace.folders, resourcesDirname(path))
76+
folders: toWorkspaceFolders(workspace.folders, resourcesDirname(path)),
77+
remoteAuthority: workspace.remoteAuthority
7778
};
7879
} catch (error) {
7980
this.logService.warn(error.toString());
@@ -104,17 +105,17 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain
104105
return isEqualOrParent(path, this.environmentService.untitledWorkspacesHome);
105106
}
106107

107-
createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[]): Promise<IWorkspaceIdentifier> {
108-
const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders);
108+
createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): Promise<IWorkspaceIdentifier> {
109+
const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders, remoteAuthority);
109110
const configPath = workspace.configPath.fsPath;
110111

111112
return mkdirp(dirname(configPath)).then(() => {
112113
return writeFile(configPath, JSON.stringify(storedWorkspace, null, '\t')).then(() => workspace);
113114
});
114115
}
115116

116-
createUntitledWorkspaceSync(folders?: IWorkspaceFolderCreationData[]): IWorkspaceIdentifier {
117-
const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders);
117+
createUntitledWorkspaceSync(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): IWorkspaceIdentifier {
118+
const { workspace, storedWorkspace } = this.newUntitledWorkspace(folders, remoteAuthority);
118119
const configPath = workspace.configPath.fsPath;
119120

120121
const configPathDir = dirname(configPath);
@@ -131,7 +132,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain
131132
return workspace;
132133
}
133134

134-
private newUntitledWorkspace(folders: IWorkspaceFolderCreationData[] = []): { workspace: IWorkspaceIdentifier, storedWorkspace: IStoredWorkspace } {
135+
private newUntitledWorkspace(folders: IWorkspaceFolderCreationData[] = [], remoteAuthority?: string): { workspace: IWorkspaceIdentifier, storedWorkspace: IStoredWorkspace } {
135136
const randomId = (Date.now() + Math.round(Math.random() * 1000)).toString();
136137
const untitledWorkspaceConfigFolder = joinPath(this.untitledWorkspacesHome, randomId);
137138
const untitledWorkspaceConfigPath = joinPath(untitledWorkspaceConfigFolder, UNTITLED_WORKSPACE_NAME);
@@ -144,7 +145,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain
144145

145146
return {
146147
workspace: this.getWorkspaceIdentifier(untitledWorkspaceConfigPath),
147-
storedWorkspace: { folders: storedWorkspaceFolder }
148+
storedWorkspace: { folders: storedWorkspaceFolder, remoteAuthority }
148149
};
149150
}
150151

@@ -230,8 +231,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain
230231
if (!resolvedWorkspace) {
231232
this.doDeleteUntitledWorkspaceSync(workspace);
232233
} else {
233-
const remoteAuthority = resolvedWorkspace.folders.length ? getRemoteAuthority(resolvedWorkspace.folders[0].uri) : undefined;
234-
untitledWorkspaces.push({ workspace, remoteAuthority });
234+
untitledWorkspaces.push({ workspace, remoteAuthority: resolvedWorkspace.remoteAuthority });
235235
}
236236
}
237237
} catch (error) {

src/vs/platform/workspaces/node/workspacesIpc.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export class WorkspacesChannel implements IServerChannel {
1919
call(_, command: string, arg?: any): Promise<any> {
2020
switch (command) {
2121
case 'createUntitledWorkspace': {
22-
const rawFolders: IWorkspaceFolderCreationData[] = arg;
22+
const rawFolders: IWorkspaceFolderCreationData[] = arg[0];
23+
const remoteAuthority: string = arg[1];
2324
let folders: IWorkspaceFolderCreationData[] | undefined = undefined;
2425
if (Array.isArray(rawFolders)) {
2526
folders = rawFolders.map(rawFolder => {
@@ -30,7 +31,7 @@ export class WorkspacesChannel implements IServerChannel {
3031
});
3132
}
3233

33-
return this.service.createUntitledWorkspace(folders);
34+
return this.service.createUntitledWorkspace(folders, remoteAuthority);
3435
}
3536
}
3637

@@ -44,7 +45,7 @@ export class WorkspacesChannelClient implements IWorkspacesService {
4445

4546
constructor(private channel: IChannel) { }
4647

47-
createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[]): Promise<IWorkspaceIdentifier> {
48-
return this.channel.call('createUntitledWorkspace', folders).then(reviveWorkspaceIdentifier);
48+
createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): Promise<IWorkspaceIdentifier> {
49+
return this.channel.call('createUntitledWorkspace', [folders, remoteAuthority]).then(reviveWorkspaceIdentifier);
4950
}
5051
}

src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ suite('WorkspacesMainService', () => {
114114
const folder1URI = URI.parse('myscheme://server/work/p/f1');
115115
const folder2URI = URI.parse('myscheme://server/work/o/f3');
116116

117-
return service.createUntitledWorkspace([{ uri: folder1URI }, { uri: folder2URI }]).then(workspace => {
117+
return service.createUntitledWorkspace([{ uri: folder1URI }, { uri: folder2URI }], 'server').then(workspace => {
118118
assert.ok(workspace);
119119
assert.ok(fs.existsSync(workspace.configPath.fsPath));
120120
assert.ok(service.isUntitledWorkspace(workspace));
@@ -126,6 +126,8 @@ suite('WorkspacesMainService', () => {
126126

127127
assert.ok(!(<IRawFileWorkspaceFolder>ws.folders[0]).name);
128128
assert.ok(!(<IRawFileWorkspaceFolder>ws.folders[1]).name);
129+
130+
assert.equal(ws.remoteAuthority, 'server');
129131
});
130132
});
131133

src/vs/workbench/browser/actions/workspaceActions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,9 @@ export class DuplicateWorkspaceInNewWindowAction extends Action {
252252

253253
run(): Promise<any> {
254254
const folders = this.workspaceContextService.getWorkspace().folders;
255+
const remoteAuthority = this.windowService.getConfiguration().remoteAuthority;
255256

256-
return this.workspacesService.createUntitledWorkspace(folders).then(newWorkspace => {
257+
return this.workspacesService.createUntitledWorkspace(folders, remoteAuthority).then(newWorkspace => {
257258
return this.workspaceEditingService.copyWorkspaceSettings(newWorkspace).then(() => {
258259
return this.windowService.openWindow([{ uri: newWorkspace.configPath, typeHint: 'file' }], { forceNewWindow: true });
259260
});

0 commit comments

Comments
 (0)