提交 007d686e 编写于 作者: B Benjamin Pasero

workspaces - allow to same on same path

上级 5ee0133b
......@@ -8,13 +8,13 @@ import { URI } from 'vs/base/common/uri';
import * as nls from 'vs/nls';
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
import { IJSONEditingService, JSONEditingError, JSONEditingErrorCode } from 'vs/workbench/services/configuration/common/jsonEditing';
import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService, rewriteWorkspaceFileForNewLocation, WORKSPACE_FILTER, IEnterWorkspaceResult, hasWorkspaceFileExtension, WORKSPACE_EXTENSION, isUntitledWorkspace } from 'vs/platform/workspaces/common/workspaces';
import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService, rewriteWorkspaceFileForNewLocation, WORKSPACE_FILTER, IEnterWorkspaceResult, hasWorkspaceFileExtension, WORKSPACE_EXTENSION, isUntitledWorkspace, IStoredWorkspace } from 'vs/platform/workspaces/common/workspaces';
import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService';
import { ConfigurationScope, IConfigurationRegistry, Extensions as ConfigurationExtensions, IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry';
import { Registry } from 'vs/platform/registry/common/platform';
import { ICommandService } from 'vs/platform/commands/common/commands';
import { distinct } from 'vs/base/common/arrays';
import { isEqual, getComparisonKey, isEqualAuthority } from 'vs/base/common/resources';
import { isEqual, getComparisonKey, isEqualAuthority, extUri } from 'vs/base/common/resources';
import { INotificationService, Severity } from 'vs/platform/notification/common/notification';
import { IFileService } from 'vs/platform/files/common/files';
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
......@@ -24,6 +24,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IHostService } from 'vs/workbench/services/host/browser/host';
import { Schemas } from 'vs/base/common/network';
import { SaveReason } from 'vs/workbench/common/editor';
export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditingService {
......@@ -31,7 +32,7 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi
constructor(
@IJSONEditingService private readonly jsonEditingService: IJSONEditingService,
@IWorkspaceContextService private readonly contextService: WorkspaceService,
@IWorkspaceContextService protected readonly contextService: WorkspaceService,
@IConfigurationService private readonly configurationService: IConfigurationService,
@INotificationService private readonly notificationService: INotificationService,
@ICommandService private readonly commandService: ICommandService,
......@@ -206,12 +207,18 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi
}
async saveAndEnterWorkspace(path: URI): Promise<void> {
if (!await this.isValidTargetWorkspacePath(path)) {
const workspaceIdentifier = this.getCurrentWorkspaceIdentifier();
if (!workspaceIdentifier) {
return;
}
const workspaceIdentifier = this.getCurrentWorkspaceIdentifier();
if (!workspaceIdentifier) {
// Allow to save the workspace of the current window
if (extUri.isEqual(workspaceIdentifier.configPath, path)) {
return this.saveWorkspace(workspaceIdentifier);
}
// From this moment on we require a valid target that is not opened already
if (!await this.isValidTargetWorkspacePath(path)) {
return;
}
......@@ -224,7 +231,7 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi
return true; // OK
}
protected async saveWorkspaceAs(workspace: IWorkspaceIdentifier, targetConfigPathURI: URI): Promise<any> {
protected async saveWorkspaceAs(workspace: IWorkspaceIdentifier, targetConfigPathURI: URI): Promise<void> {
const configPathURI = workspace.configPath;
// Return early if target is same as source
......@@ -240,6 +247,28 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi
await this.textFileService.create(targetConfigPathURI, newRawWorkspaceContents, { overwrite: true });
}
protected async saveWorkspace(workspace: IWorkspaceIdentifier): Promise<void> {
const configPathURI = workspace.configPath;
// First: try to save any existing model as it could be dirty
const existingModel = this.textFileService.files.get(configPathURI);
if (existingModel) {
await existingModel.save({ force: true, reason: SaveReason.EXPLICIT });
return;
}
// Second: if the file exists on disk, simply return
const workspaceFileExists = await this.fileService.exists(configPathURI);
if (workspaceFileExists) {
return;
}
// Finally, we need to re-create the file as it was deleted
const newWorkspace: IStoredWorkspace = { folders: [] };
const newRawWorkspaceContents = rewriteWorkspaceFileForNewLocation(JSON.stringify(newWorkspace, null, '\t'), configPathURI, false, configPathURI);
await this.textFileService.create(configPathURI, newRawWorkspaceContents);
}
private handleWorkspaceConfigurationEditingError(error: JSONEditingError): void {
switch (error.code) {
case JSONEditingErrorCode.ERROR_INVALID_FILE:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册