提交 bb2d2a0b 编写于 作者: B Benjamin Pasero

enter workspace: update backup path properly

上级 26d2e951
......@@ -19,7 +19,7 @@ import { IPathWithLineAndColumn, parseLineAndColumnAware } from 'vs/code/node/pa
import { ILifecycleService, UnloadReason, IWindowUnloadEvent } from 'vs/platform/lifecycle/electron-main/lifecycleMain';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ILogService } from 'vs/platform/log/common/log';
import { IWindowSettings, OpenContext, IPath, IWindowConfiguration, INativeOpenDialogOptions, ReadyState, IPathsToWaitFor } from 'vs/platform/windows/common/windows';
import { IWindowSettings, OpenContext, IPath, IWindowConfiguration, INativeOpenDialogOptions, ReadyState, IPathsToWaitFor, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows';
import { getLastActiveWindow, findBestWindowOrFolderForFile, findWindowOnWorkspace, findWindowOnExtensionDevelopmentPath, findWindowOnWorkspaceOrFolderPath } from 'vs/code/node/windowsFinder';
import CommonEvent, { Emitter } from 'vs/base/common/event';
import product from 'vs/platform/node/product';
......@@ -1294,23 +1294,23 @@ export class WindowsManager implements IWindowsMainService {
});
}
public saveAndEnterWorkspace(win: CodeWindow, path: string): TPromise<IWorkspaceIdentifier> {
return this.workspacesManager.saveAndEnterWorkspace(win, path).then(workspace => this.doEnterWorkspace(win, workspace));
public saveAndEnterWorkspace(win: CodeWindow, path: string): TPromise<IEnterWorkspaceResult> {
return this.workspacesManager.saveAndEnterWorkspace(win, path).then(result => this.doEnterWorkspace(win, result));
}
public createAndEnterWorkspace(win: CodeWindow, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
return this.workspacesManager.createAndEnterWorkspace(win, folders, path).then(workspace => this.doEnterWorkspace(win, workspace));
public createAndEnterWorkspace(win: CodeWindow, folders?: string[], path?: string): TPromise<IEnterWorkspaceResult> {
return this.workspacesManager.createAndEnterWorkspace(win, folders, path).then(result => this.doEnterWorkspace(win, result));
}
private doEnterWorkspace(win: CodeWindow, workspace: IWorkspaceIdentifier): IWorkspaceIdentifier {
private doEnterWorkspace(win: CodeWindow, result: IEnterWorkspaceResult): IEnterWorkspaceResult {
// Mark as recently opened
this.historyService.addRecentlyOpened([workspace], []);
this.historyService.addRecentlyOpened([result.workspace], []);
// Trigger Eevent to indicate load of workspace into window
this._onWindowReady.fire(win);
return workspace;
return result;
}
public openWorkspace(win?: CodeWindow): void {
......@@ -1648,7 +1648,7 @@ class WorkspacesManager {
) {
}
public saveAndEnterWorkspace(window: CodeWindow, path: string): TPromise<IWorkspaceIdentifier> {
public saveAndEnterWorkspace(window: CodeWindow, path: string): TPromise<IEnterWorkspaceResult> {
if (!window || !window.win || window.readyState !== ReadyState.READY || !window.openedWorkspace || !path || !this.isValidTargetWorkspacePath(window, path)) {
return TPromise.as(null); // return early if the window is not ready or disposed or does not have a workspace
}
......@@ -1656,7 +1656,7 @@ class WorkspacesManager {
return this.doSaveAndOpenWorkspace(window, window.openedWorkspace, path);
}
public createAndEnterWorkspace(window: CodeWindow, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
public createAndEnterWorkspace(window: CodeWindow, folders?: string[], path?: string): TPromise<IEnterWorkspaceResult> {
if (!window || !window.win || window.readyState !== ReadyState.READY || !this.isValidTargetWorkspacePath(window, path)) {
return TPromise.as(null); // return early if the window is not ready or disposed
}
......@@ -1699,7 +1699,7 @@ class WorkspacesManager {
return true; // OK
}
private doSaveAndOpenWorkspace(window: CodeWindow, workspace: IWorkspaceIdentifier, path?: string): TPromise<IWorkspaceIdentifier> {
private doSaveAndOpenWorkspace(window: CodeWindow, workspace: IWorkspaceIdentifier, path?: string): TPromise<IEnterWorkspaceResult> {
let savePromise: TPromise<IWorkspaceIdentifier>;
if (path) {
savePromise = this.workspacesService.saveWorkspace(workspace, path);
......@@ -1721,7 +1721,7 @@ class WorkspacesManager {
window.config.workspace = workspace;
window.config.backupPath = backupPath;
return workspace;
return { workspace, backupPath };
});
}
......
......@@ -27,6 +27,11 @@ export interface INativeOpenDialogOptions {
telemetryExtraData?: ITelemetryData;
}
export interface IEnterWorkspaceResult {
workspace: IWorkspaceIdentifier;
backupPath: string;
}
export interface IWindowsService {
_serviceBrand: any;
......@@ -43,8 +48,8 @@ export interface IWindowsService {
toggleDevTools(windowId: number): TPromise<void>;
closeWorkspace(windowId: number): TPromise<void>;
openWorkspace(windowId: number): TPromise<void>;
createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier>;
saveAndEnterWorkspace(windowId: number, path: string): TPromise<IWorkspaceIdentifier>;
createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IEnterWorkspaceResult>;
saveAndEnterWorkspace(windowId: number, path: string): TPromise<IEnterWorkspaceResult>;
toggleFullScreen(windowId: number): TPromise<void>;
setRepresentedFilename(windowId: number, fileName: string): TPromise<void>;
addRecentlyOpened(files: string[]): TPromise<void>;
......@@ -111,8 +116,8 @@ export interface IWindowService {
closeWorkspace(): TPromise<void>;
openWorkspace(): TPromise<void>;
updateTouchBar(items: ICommandAction[][]): TPromise<void>;
createAndEnterWorkspace(folders?: string[], path?: string): TPromise<IWorkspaceIdentifier>;
saveAndEnterWorkspace(path: string): TPromise<IWorkspaceIdentifier>;
createAndEnterWorkspace(folders?: string[], path?: string): TPromise<IEnterWorkspaceResult>;
saveAndEnterWorkspace(path: string): TPromise<IEnterWorkspaceResult>;
toggleFullScreen(): TPromise<void>;
setRepresentedFilename(fileName: string): TPromise<void>;
getRecentlyOpened(): TPromise<IRecentlyOpened>;
......
......@@ -8,7 +8,7 @@
import { TPromise } from 'vs/base/common/winjs.base';
import Event, { buffer } from 'vs/base/common/event';
import { IChannel, eventToCall, eventFromCall } from 'vs/base/parts/ipc/common/ipc';
import { IWindowsService, INativeOpenDialogOptions } from './windows';
import { IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult } from './windows';
import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
import { IRecentlyOpened } from 'vs/platform/history/common/history';
import { ICommandAction } from 'vs/platform/actions/common/actions';
......@@ -24,8 +24,8 @@ export interface IWindowsChannel extends IChannel {
call(command: 'toggleDevTools', arg: number): TPromise<void>;
call(command: 'closeWorkspace', arg: number): TPromise<void>;
call(command: 'openWorkspace', arg: number): TPromise<void>;
call(command: 'createAndEnterWorkspace', arg: [number, string[], string]): TPromise<IWorkspaceIdentifier>;
call(command: 'saveAndEnterWorkspace', arg: [number, string]): TPromise<IWorkspaceIdentifier>;
call(command: 'createAndEnterWorkspace', arg: [number, string[], string]): TPromise<IEnterWorkspaceResult>;
call(command: 'saveAndEnterWorkspace', arg: [number, string]): TPromise<IEnterWorkspaceResult>;
call(command: 'toggleFullScreen', arg: number): TPromise<void>;
call(command: 'setRepresentedFilename', arg: [number, string]): TPromise<void>;
call(command: 'addRecentlyOpened', arg: string[]): TPromise<void>;
......@@ -174,11 +174,11 @@ export class WindowsChannelClient implements IWindowsService {
return this.channel.call('openWorkspace', windowId);
}
createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IEnterWorkspaceResult> {
return this.channel.call('createAndEnterWorkspace', [windowId, folders, path]);
}
saveAndEnterWorkspace(windowId: number, path: string): TPromise<IWorkspaceIdentifier> {
saveAndEnterWorkspace(windowId: number, path: string): TPromise<IEnterWorkspaceResult> {
return this.channel.call('saveAndEnterWorkspace', [windowId, path]);
}
......
......@@ -7,11 +7,10 @@
import Event, { filterEvent, mapEvent, any } from 'vs/base/common/event';
import { TPromise } from 'vs/base/common/winjs.base';
import { IWindowService, IWindowsService, INativeOpenDialogOptions } from 'vs/platform/windows/common/windows';
import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows';
import { remote } from 'electron';
import { IRecentlyOpened } from 'vs/platform/history/common/history';
import { ICommandAction } from 'vs/platform/actions/common/actions';
import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
export class WindowService implements IWindowService {
......@@ -70,11 +69,11 @@ export class WindowService implements IWindowService {
return this.windowsService.openWorkspace(this.windowId);
}
createAndEnterWorkspace(folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
createAndEnterWorkspace(folders?: string[], path?: string): TPromise<IEnterWorkspaceResult> {
return this.windowsService.createAndEnterWorkspace(this.windowId, folders, path);
}
saveAndEnterWorkspace(path: string): TPromise<IWorkspaceIdentifier> {
saveAndEnterWorkspace(path: string): TPromise<IEnterWorkspaceResult> {
return this.windowsService.saveAndEnterWorkspace(this.windowId, path);
}
......
......@@ -6,7 +6,7 @@
'use strict';
import { TPromise } from 'vs/base/common/winjs.base';
import { OpenContext, IWindowConfiguration, ReadyState, INativeOpenDialogOptions } from 'vs/platform/windows/common/windows';
import { OpenContext, IWindowConfiguration, ReadyState, INativeOpenDialogOptions, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows';
import { ParsedArgs } from 'vs/platform/environment/common/environment';
import Event from 'vs/base/common/event';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
......@@ -61,8 +61,8 @@ export interface IWindowsMainService {
ready(initialUserEnv: IProcessEnvironment): void;
reload(win: ICodeWindow, cli?: ParsedArgs): void;
openWorkspace(win?: ICodeWindow): void;
createAndEnterWorkspace(win: ICodeWindow, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier>;
saveAndEnterWorkspace(win: ICodeWindow, path: string): TPromise<IWorkspaceIdentifier>;
createAndEnterWorkspace(win: ICodeWindow, folders?: string[], path?: string): TPromise<IEnterWorkspaceResult>;
saveAndEnterWorkspace(win: ICodeWindow, path: string): TPromise<IEnterWorkspaceResult>;
closeWorkspace(win: ICodeWindow): void;
open(openConfig: IOpenConfiguration): ICodeWindow[];
openExtensionDevelopmentHostWindow(openConfig: IOpenConfiguration): void;
......
......@@ -9,7 +9,7 @@ import { TPromise } from 'vs/base/common/winjs.base';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { assign } from 'vs/base/common/objects';
import URI from 'vs/base/common/uri';
import { IWindowsService, OpenContext, INativeOpenDialogOptions } from 'vs/platform/windows/common/windows';
import { IWindowsService, OpenContext, INativeOpenDialogOptions, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { shell, crashReporter, app, Menu } from 'electron';
import Event, { chain } from 'vs/base/common/event';
......@@ -135,7 +135,7 @@ export class WindowsService implements IWindowsService, IDisposable {
return TPromise.as(null);
}
createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IEnterWorkspaceResult> {
const codeWindow = this.windowsMainService.getWindowById(windowId);
if (codeWindow) {
......@@ -145,7 +145,7 @@ export class WindowsService implements IWindowsService, IDisposable {
return TPromise.as(null);
}
saveAndEnterWorkspace(windowId: number, path: string): TPromise<IWorkspaceIdentifier> {
saveAndEnterWorkspace(windowId: number, path: string): TPromise<IEnterWorkspaceResult> {
const codeWindow = this.windowsMainService.getWindowById(windowId);
if (codeWindow) {
......
......@@ -87,20 +87,29 @@ export class BackupFilesModel implements IBackupFilesModel {
export class BackupFileService implements IBackupFileService {
private static readonly META_MARKER = '\n';
public _serviceBrand: any;
private static readonly META_MARKER = '\n';
private backupWorkspacePath: string;
private isShuttingDown: boolean;
private ready: TPromise<IBackupFilesModel>;
private ioOperationQueues: ResourceQueue<void>; // queue IO operations to ensure write order
constructor(
private backupWorkspacePath: string,
backupWorkspacePath: string,
@IFileService private fileService: IFileService
) {
this.isShuttingDown = false;
this.ioOperationQueues = new ResourceQueue<void>();
this.initialize(backupWorkspacePath);
}
public initialize(backupWorkspacePath: string): void {
this.backupWorkspacePath = backupWorkspacePath;
this.ready = this.init();
}
......
......@@ -9,7 +9,7 @@ import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common
import URI from 'vs/base/common/uri';
import { TPromise } from 'vs/base/common/winjs.base';
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows';
import { IWindowsService, IWindowService, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing';
import { IWorkspacesService, IStoredWorkspaceFolder, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
......@@ -24,6 +24,8 @@ 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';
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
import { BackupFileService } from 'vs/workbench/services/backup/node/backupFileService';
export class WorkspaceEditingService implements IWorkspaceEditingService {
......@@ -38,7 +40,8 @@ export class WorkspaceEditingService implements IWorkspaceEditingService {
@IWorkspacesService private workspacesService: IWorkspacesService,
@IWorkspaceConfigurationService private workspaceConfigurationService: IWorkspaceConfigurationService,
@IStorageService private storageService: IStorageService,
@IExtensionService private extensionService: IExtensionService
@IExtensionService private extensionService: IExtensionService,
@IBackupFileService private backupFileService: IBackupFileService
) {
}
......@@ -133,21 +136,25 @@ export class WorkspaceEditingService implements IWorkspaceEditingService {
return this.doEnterWorkspace(() => this.windowService.saveAndEnterWorkspace(path));
}
private doEnterWorkspace(mainSidePromise: () => TPromise<IWorkspaceIdentifier>): TPromise<void> {
private doEnterWorkspace(mainSidePromise: () => TPromise<IEnterWorkspaceResult>): TPromise<void> {
// Stop the extension host first to give extensions most time to shutdown
this.extensionService.stopExtensionHost();
return mainSidePromise().then(workspace => {
return mainSidePromise().then(result => {
let enterWorkspacePromise: TPromise<void> = TPromise.as(void 0);
if (workspace) {
if (result) {
// Migrate storage and settings
enterWorkspacePromise = this.migrate(workspace).then(() => {
enterWorkspacePromise = this.migrate(result.workspace).then(() => {
// Initialize configuration service
// Reinitialize backup service
const backupFileService = this.backupFileService as BackupFileService; // TODO@Ben ugly cast
backupFileService.initialize(result.backupPath);
// Reinitialize configuration service
const workspaceImpl = this.contextService as WorkspaceService; // TODO@Ben TODO@Sandeep ugly cast
return workspaceImpl.initialize(workspace);
return workspaceImpl.initialize(result.workspace);
});
}
......
......@@ -46,7 +46,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi
import { IHistoryService } from 'vs/workbench/services/history/common/history';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService';
import { IWindowsService, IWindowService, INativeOpenDialogOptions } from 'vs/platform/windows/common/windows';
import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows';
import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace';
import { RawTextSource, IRawTextSource } from 'vs/editor/common/model/textSource';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
......@@ -903,11 +903,11 @@ export class TestWindowService implements IWindowService {
return TPromise.as(void 0);
}
createAndEnterWorkspace(folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
createAndEnterWorkspace(folders?: string[], path?: string): TPromise<IEnterWorkspaceResult> {
return TPromise.as(void 0);
}
saveAndEnterWorkspace(path: string): TPromise<IWorkspaceIdentifier> {
saveAndEnterWorkspace(path: string): TPromise<IEnterWorkspaceResult> {
return TPromise.as(void 0);
}
......@@ -1051,11 +1051,11 @@ export class TestWindowsService implements IWindowsService {
return TPromise.as(void 0);
}
createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IEnterWorkspaceResult> {
return TPromise.as(void 0);
}
saveAndEnterWorkspace(windowId: number, path: string): TPromise<IWorkspaceIdentifier> {
saveAndEnterWorkspace(windowId: number, path: string): TPromise<IEnterWorkspaceResult> {
return TPromise.as(void 0);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册