workspaceEditingService.ts 5.2 KB
Newer Older
1 2 3 4 5 6 7
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

'use strict';

B
Benjamin Pasero 已提交
8 9
import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing';
import URI from 'vs/base/common/uri';
10
import { TPromise } from 'vs/base/common/winjs.base';
11
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
S
Sandeep Somavarapu 已提交
12
import { IWindowService, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows';
13
import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing';
S
Sandeep Somavarapu 已提交
14
import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
15
import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
16
import { WorkspaceService } from 'vs/workbench/services/configuration/node/configurationService';
17 18 19 20 21 22
import { migrateStorageToMultiRootWorkspace } from 'vs/platform/storage/common/migration';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { StorageService } from 'vs/platform/storage/common/storageService';
import { ConfigurationScope, IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry';
import { Registry } from 'vs/platform/registry/common/platform';
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
23 24
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
import { BackupFileService } from 'vs/workbench/services/backup/node/backupFileService';
25 26 27 28 29 30

export class WorkspaceEditingService implements IWorkspaceEditingService {

	public _serviceBrand: any;

	constructor(
31
		@IJSONEditingService private jsonEditingService: IJSONEditingService,
32
		@IWorkspaceContextService private contextService: WorkspaceService,
33
		@IWindowService private windowService: IWindowService,
34 35
		@IWorkspaceConfigurationService private workspaceConfigurationService: IWorkspaceConfigurationService,
		@IStorageService private storageService: IStorageService,
36 37
		@IExtensionService private extensionService: IExtensionService,
		@IBackupFileService private backupFileService: IBackupFileService
38 39 40
	) {
	}

B
Benjamin Pasero 已提交
41 42
	public createAndEnterWorkspace(folderPaths?: string[], path?: string): TPromise<void> {
		return this.doEnterWorkspace(() => this.windowService.createAndEnterWorkspace(folderPaths, path));
43 44
	}

45 46
	public saveAndEnterWorkspace(path: string): TPromise<void> {
		return this.doEnterWorkspace(() => this.windowService.saveAndEnterWorkspace(path));
47 48
	}

49
	private doEnterWorkspace(mainSidePromise: () => TPromise<IEnterWorkspaceResult>): TPromise<void> {
50

51
		// Stop the extension host first to give extensions most time to shutdown
52 53
		this.extensionService.stopExtensionHost();

54
		return mainSidePromise().then(result => {
55
			let enterWorkspacePromise: TPromise<void> = TPromise.as(void 0);
56
			if (result) {
57

58
				// Migrate storage and settings
59
				enterWorkspacePromise = this.migrate(result.workspace).then(() => {
60

61 62 63 64 65
					// Reinitialize backup service
					const backupFileService = this.backupFileService as BackupFileService; // TODO@Ben ugly cast
					backupFileService.initialize(result.backupPath);

					// Reinitialize configuration service
66
					const workspaceImpl = this.contextService as WorkspaceService; // TODO@Ben TODO@Sandeep ugly cast
67
					return workspaceImpl.initialize(result.workspace);
68 69 70 71 72
				});
			}

			// Finally bring the extension host back online
			return enterWorkspacePromise.then(() => this.extensionService.startExtensionHost());
73 74 75
		});
	}

B
Benjamin Pasero 已提交
76
	private migrate(toWorkspace: IWorkspaceIdentifier): TPromise<void> {
77 78

		// Storage (UI State) migration
B
Benjamin Pasero 已提交
79
		this.migrateStorage(toWorkspace);
80

81 82 83 84 85 86
		// Settings migration (only if we come from a folder workspace)
		if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) {
			return this.copyWorkspaceSettings(toWorkspace);
		}

		return TPromise.as(void 0);
87 88
	}

B
Benjamin Pasero 已提交
89
	private migrateStorage(toWorkspace: IWorkspaceIdentifier): void {
90 91 92

		// TODO@Ben revisit this when we move away from local storage to a file based approach
		const storageImpl = this.storageService as StorageService;
B
Benjamin Pasero 已提交
93 94
		const newWorkspaceId = migrateStorageToMultiRootWorkspace(storageImpl.workspaceId, toWorkspace, storageImpl.workspaceStorage);
		storageImpl.setWorkspaceId(newWorkspaceId);
95 96
	}

97
	public copyWorkspaceSettings(toWorkspace: IWorkspaceIdentifier): TPromise<void> {
98 99 100
		const configurationProperties = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration).getConfigurationProperties();
		const targetWorkspaceConfiguration = {};
		for (const key of this.workspaceConfigurationService.keys().workspace) {
S
Sandeep Somavarapu 已提交
101
			if (configurationProperties[key] && !configurationProperties[key].isFromExtensions && configurationProperties[key].scope === ConfigurationScope.WINDOW) {
102
				targetWorkspaceConfiguration[key] = this.workspaceConfigurationService.inspect(key).workspace;
103 104 105
			}
		}

B
Benjamin Pasero 已提交
106
		return this.jsonEditingService.write(URI.file(toWorkspace.configPath), { key: 'settings', value: targetWorkspaceConfiguration }, true);
107
	}
J
Johannes Rieken 已提交
108
}